This run took 334 seconds.
From 87d23c48143b961f348344253b8341290e2db7bc Mon Sep 17 00:00:00 2001 From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org> Date: Sun, 23 Mar 2025 13:27:59 +0000 Subject: [PATCH] build: Updating npm dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * eslint-config-wikimedia: 0.28.2 → 0.29.1 The following rules are failing and were disabled: * editcheck/modules: * no-jquery/no-done-fail* modules: * no-jquery/no-done-fail* modules/ve-mw/dm: * no-jquery/no-done-fail* modules/ve-mw/preinit: * no-jquery/no-done-fail* modules/ve-mw/tests: * no-jquery/no-done-fail * @babel/runtime: 7.17.9 → 7.26.10 * https://github.com/advisories/GHSA-968p-4wvh-cqc8 Change-Id: I3b39b7e1012b65f3a7887e45bc888c4630b617d2 --- editcheck/modules/.eslintrc.json | 7 ++- editcheck/modules/BaseEditCheck.js | 2 +- .../modules/EditCheckGutterSidebarDialog.js | 8 +-- editcheck/modules/controller.js | 4 +- modules/.eslintrc.json | 3 +- .../ve.ce.MWExternalLinkAnnotation.js | 2 +- modules/ve-mw/dm/.eslintrc.json | 3 +- .../ve.dm.MWExternalLinkAnnotation.js | 2 +- .../dm/metaitems/ve.dm.MWFlaggedMetaItem.js | 4 +- .../dm/models/ve.dm.MWTransclusionModel.js | 2 +- .../dm/nodes/ve.dm.MWAlienAnnotationNode.js | 2 +- .../ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js | 2 +- modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js | 2 +- .../dm/nodes/ve.dm.MWGalleryCaptionNode.js | 2 +- .../dm/nodes/ve.dm.MWGalleryImageNode.js | 6 +- modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js | 2 +- .../ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js | 10 +-- .../nodes/ve.dm.MWNumberedExternalLinkNode.js | 2 +- modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js | 2 +- .../dm/nodes/ve.dm.MWTransclusionNode.js | 2 +- .../init/ve.init.mw.ArticleTargetEvents.js | 2 +- modules/ve-mw/init/ve.init.mw.Platform.js | 2 +- modules/ve-mw/preinit/.eslintrc.json | 3 +- .../ve.init.mw.DesktopArticleTarget.init.js | 4 +- modules/ve-mw/preinit/ve.utils.parsoid.js | 4 +- modules/ve-mw/tests/.eslintrc.json | 3 +- .../ve.ui.MWAlienAnnotationContextItem.js | 4 +- .../ve.ui.MWWikitextStringTransferHandler.js | 2 +- .../ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js | 2 +- .../ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js | 2 +- ...ve.ui.MWWikitextLinkAnnotationInspector.js | 2 +- ...ve.ui.MWTwoPaneTransclusionDialogLayout.js | 4 +- .../ui/pages/ve.ui.MWAddParameterPage.js | 2 +- .../ve-mw/ui/pages/ve.ui.MWParameterPage.js | 4 +- .../ve-mw/ui/pages/ve.ui.MWTemplatePage.js | 2 +- .../toolgroups/ve.ui.MWHelpListToolGroup.js | 2 +- .../ui/widgets/ve.ui.MWCategoryInputWidget.js | 4 +- .../ui/widgets/ve.ui.MWCategoryWidget.js | 2 +- .../ve.ui.MWInternalLinkAnnotationWidget.js | 2 +- ....ui.MWTransclusionOutlineTemplateWidget.js | 2 +- package-lock.json | 63 ++++++++++++------- package.json | 2 +- 42 files changed, 107 insertions(+), 81 deletions(-) diff --git a/editcheck/modules/.eslintrc.json b/editcheck/modules/.eslintrc.json index 3f51c58..a3e78ae 100644 --- a/editcheck/modules/.eslintrc.json +++ b/editcheck/modules/.eslintrc.json @@ -1,7 +1,12 @@ { "root": true, - "extends": [ "../../modules/.eslintrc" ], + "extends": [ + "../../modules/.eslintrc" + ], "parserOptions": { "sourceType": "commonjs" + }, + "rules": { + "no-jquery/no-done-fail": "warn" } } diff --git a/editcheck/modules/BaseEditCheck.js b/editcheck/modules/BaseEditCheck.js index e5eb6b9..b0dd504 100644 --- a/editcheck/modules/BaseEditCheck.js +++ b/editcheck/modules/BaseEditCheck.js @@ -318,5 +318,5 @@ mw.editcheck.BaseEditCheck.prototype.isDismissedRange = function ( range ) { */ mw.editcheck.BaseEditCheck.prototype.isDismissedId = function ( id ) { const ids = this.controller.dismissedIds[ this.constructor.static.name ]; - return ids && ids.indexOf( id ) !== -1; + return ids && ids.includes( id ); }; diff --git a/editcheck/modules/EditCheckGutterSidebarDialog.js b/editcheck/modules/EditCheckGutterSidebarDialog.js index 810ca13..512827e 100644 --- a/editcheck/modules/EditCheckGutterSidebarDialog.js +++ b/editcheck/modules/EditCheckGutterSidebarDialog.js @@ -101,7 +101,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions let widget; const index = oldWidgets.findIndex( ( owidget ) => owidget.actions.length === section.actions.length && - owidget.actions.every( ( oact ) => section.actions.indexOf( oact ) !== -1 ) + owidget.actions.every( ( oact ) => section.actions.includes( oact ) ) ); if ( index !== -1 ) { widget = oldWidgets.splice( index, 1 )[ 0 ]; @@ -140,7 +140,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions actions: section.actions, footer: section.actions.length !== 1, // just filter out any discarded actions from the allowed set - updateFilter: ( updatedActions, newActions, discardedActions, prevActions ) => prevActions.filter( ( pact ) => discardedActions.indexOf( pact ) === -1 ) + updateFilter: ( updatedActions, newActions, discardedActions, prevActions ) => prevActions.filter( ( pact ) => !discardedActions.includes( pact ) ) } ); } else if ( section.actions.every( ( sact ) => currentWindow.hasAction( sact ) ) ) { @@ -156,7 +156,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions }; this.$body.append( widget.$element ); } - if ( widget.actions.indexOf( this.controller.focused ) !== -1 ) { + if ( widget.actions.includes( this.controller.focused ) ) { widget.icon.setFlags( action.getType() ); } else { widget.icon.clearFlags(); @@ -164,7 +164,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions widget.$element.css( { top: section.rect.top + 2, height: section.rect.height - } ).toggleClass( 've-ui-editCheck-gutter-action-inactive', section.actions.indexOf( this.controller.focused ) === -1 ); + } ).toggleClass( 've-ui-editCheck-gutter-action-inactive', !section.actions.includes( this.controller.focused ) ); this.widgets.push( widget ); } ); diff --git a/editcheck/modules/controller.js b/editcheck/modules/controller.js index 26c0b1d..c953394 100644 --- a/editcheck/modules/controller.js +++ b/editcheck/modules/controller.js @@ -158,7 +158,7 @@ Controller.prototype.onSelect = function ( selection ) { ( check ) => check.getHighlightSelections().some( ( highlight ) => highlight.getCoveringRange().containsRange( selection.getCoveringRange() ) ) ); - if ( actions.length > 0 && actions.indexOf( this.focused ) === -1 ) { + if ( actions.length > 0 && !actions.includes( this.focused ) ) { // If the currently focused action is within the selection, don't jump around this.focusAction( actions[ 0 ] || null, false ); } @@ -202,7 +202,7 @@ Controller.prototype.onDocumentChange = function () { Controller.prototype.onActionsUpdated = function ( listener, actions, newActions, discardedActions ) { // do we need to redraw anything? if ( newActions.length || discardedActions.length ) { - if ( this.focused && discardedActions.indexOf( this.focused ) !== -1 ) { + if ( this.focused && discardedActions.includes( this.focused ) ) { this.focused = undefined; } this.updatePositions(); diff --git a/modules/.eslintrc.json b/modules/.eslintrc.json index c525608..2931d67 100644 --- a/modules/.eslintrc.json +++ b/modules/.eslintrc.json @@ -7,6 +7,7 @@ "./eslint-shared.json" ], "rules": { - "no-jquery/no-append-html": "warn" + "no-jquery/no-append-html": "warn", + "no-jquery/no-done-fail": "warn" } } diff --git a/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js b/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js index 6225d97..33c716c 100644 --- a/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js +++ b/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js @@ -22,7 +22,7 @@ ve.ce.MWExternalLinkAnnotation = function VeCeMWExternalLinkAnnotation( model ) // DOM changes const rel = model.getAttribute( 'rel' ) || ''; const relValues = rel.split( /\s+/ ); - if ( relValues.indexOf( 'mw:WikiLink/Interwiki' ) >= 0 ) { + if ( relValues.includes( 'mw:WikiLink/Interwiki' ) ) { this.$anchor.addClass( 'extiw' ); } else { this.$anchor.addClass( 'external' ); diff --git a/modules/ve-mw/dm/.eslintrc.json b/modules/ve-mw/dm/.eslintrc.json index e115b9f..8820a89 100644 --- a/modules/ve-mw/dm/.eslintrc.json +++ b/modules/ve-mw/dm/.eslintrc.json @@ -10,6 +10,7 @@ "$": "off" }, "rules": { - "no-jquery/no-append-html": "warn" + "no-jquery/no-append-html": "warn", + "no-jquery/no-done-fail": "warn" } } diff --git a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js index 34d6dc9..94b6515 100644 --- a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js +++ b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js @@ -45,7 +45,7 @@ ve.dm.MWExternalLinkAnnotation.static.toDataElement = function ( domElements, co types = type.trim().split( /\s+/ ); // If the link doesn't have a known RDFa type... - if ( types.indexOf( 'mw:ExtLink' ) === -1 && types.indexOf( 'mw:WikiLink/Interwiki' ) === -1 ) { + if ( !types.includes( 'mw:ExtLink' ) && !types.includes( 'mw:WikiLink/Interwiki' ) ) { // ...when pasting: auto-convert it to the correct type (internal/external/span) if ( converter.isFromClipboard() ) { if ( domElement.hasAttribute( 'href' ) ) { diff --git a/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js b/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js index 454962a..ca8be46 100644 --- a/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js +++ b/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js @@ -32,7 +32,7 @@ ve.dm.MWFlaggedMetaItem.static.matchTagNames = [ 'meta' ]; ve.dm.MWFlaggedMetaItem.static.toDataElement = function ( domElements ) { let property = domElements[ 0 ].getAttribute( 'property' ); - if ( !property || this.matchRdfaTypes.indexOf( property ) === -1 ) { + if ( !property || !this.matchRdfaTypes.includes( property ) ) { // Fallback to first match if somehow unset property = this.matchRdfaTypes[ 0 ]; } @@ -44,7 +44,7 @@ ve.dm.MWFlaggedMetaItem.static.toDomElements = function ( dataElement, doc, conv let domElement; let property = OO.getProp( dataElement, 'attributes', 'property' ); - if ( !property || this.matchRdfaTypes.indexOf( property ) === -1 ) { + if ( !property || !this.matchRdfaTypes.includes( property ) ) { // Fallback to first item if somehow unset property = this.matchRdfaTypes[ 0 ]; } diff --git a/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js b/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js index f4a0565..f1d0d0a 100644 --- a/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js +++ b/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js @@ -303,7 +303,7 @@ // Skip already cached data !hasOwn.call( specCache, title ) && // Skip duplicate titles in the same batch - titles.indexOf( title ) === -1 + !titles.includes( title ) ) { titles.push( title ); } diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js index 0fd9c14..4ff9507 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js @@ -45,7 +45,7 @@ ve.dm.MWAlienAnnotationNode.static.toDataElement = function ( domElements ) { ve.dm.MWAlienAnnotationNode.prototype.getWikitextTag = function () { const type = this.getAttribute( 'type' ); - if ( type.indexOf( '/End', type.length - 4 ) !== -1 ) { + if ( type.includes( '/End', type.length - 4 ) ) { return '</UNKNOWN>'; } return '<UNKNOWN>'; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js index cedef84..4dde33a 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js @@ -43,7 +43,7 @@ ve.dm.MWBlockImageNode.static.name = 'mwBlockImage'; ve.dm.MWBlockImageNode.static.preserveHtmlAttributes = function ( attribute ) { const attributes = [ 'typeof', 'class', 'src', 'resource', 'width', 'height', 'href', 'rel', 'data-mw', 'alt' ]; - return attributes.indexOf( attribute ) === -1; + return !attributes.includes( attribute ); }; ve.dm.MWBlockImageNode.static.handlesOwnChildren = true; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js index cb28673..4a10078 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js @@ -40,7 +40,7 @@ ve.dm.MWEntityNode.static.toDataElement = function ( domElements ) { character: domElements[ 0 ].textContent } }; - if ( domElements[ 0 ].getAttribute( 'typeof' ).indexOf( 'mw:DisplaySpace' ) !== -1 ) { + if ( domElements[ 0 ].getAttribute( 'typeof' ).includes( 'mw:DisplaySpace' ) ) { dataElement.attributes.displaySpace = true; } return dataElement; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js index 28d06fc..3820564 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js @@ -29,7 +29,7 @@ ve.dm.MWGalleryCaptionNode.static.matchTagNames = [ 'li' ]; ve.dm.MWGalleryCaptionNode.static.matchFunction = function ( element ) { const parentTypeof = ( element.parentNode && element.parentNode.getAttribute( 'typeof' ) ) || ''; return element.getAttribute( 'class' ) === 'gallerycaption' && - parentTypeof.trim().split( /\s+/ ).indexOf( 'mw:Extension/gallery' ) !== -1; + parentTypeof.trim().split( /\s+/ ).includes( 'mw:Extension/gallery' ); }; ve.dm.MWGalleryCaptionNode.static.parentNodeTypes = [ 'mwGallery' ]; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js index 9615412..45245b5 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js @@ -35,14 +35,14 @@ ve.dm.MWGalleryImageNode.static.childNodeTypes = [ 'mwGalleryImageCaption' ]; ve.dm.MWGalleryImageNode.static.matchFunction = function ( element ) { const parentTypeof = ( element.parentNode && element.parentNode.getAttribute( 'typeof' ) ) || ''; return element.getAttribute( 'class' ) === 'gallerybox' && - parentTypeof.trim().split( /\s+/ ).indexOf( 'mw:Extension/gallery' ) !== -1; + parentTypeof.trim().split( /\s+/ ).includes( 'mw:Extension/gallery' ); }; ve.dm.MWGalleryImageNode.static.parentNodeTypes = [ 'mwGallery' ]; ve.dm.MWGalleryImageNode.static.preserveHtmlAttributes = function ( attribute ) { const attributes = [ 'typeof', 'class', 'src', 'resource', 'width', 'height', 'href', 'rel', 'alt', 'data-mw' ]; - return attributes.indexOf( attribute ) === -1; + return !attributes.includes( attribute ); }; // By handling our own children we ensure that original DOM attributes // are deep copied back by the converter (in renderHtmlAttributeList) @@ -59,7 +59,7 @@ ve.dm.MWGalleryImageNode.static.textContentFromCaption = function textContentFro content += c.nodeValue; } else if ( c instanceof HTMLElement && - ( metaDataTags.indexOf( c.nodeName.toLowerCase() ) === -1 ) && + ( !metaDataTags.includes( c.nodeName.toLowerCase() ) ) && !/\bmw:Extension\/ref\b/.test( c.getAttribute( 'typeOf' ) ) ) { content += textContentFromCaption( c ); diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js index 974865c..cf0fdb0 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js @@ -154,7 +154,7 @@ ve.dm.MWImageNode.static.describeChanges = function ( attributeChanges, attribut ); } for ( const key in attributeChanges ) { - if ( customKeys.indexOf( key ) === -1 ) { + if ( !customKeys.includes( key ) ) { if ( key === 'borderImage' && !attributeChanges.borderImage.from && !attributeChanges.borderImage.to ) { // Skip noise from the data model continue; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js index 6923ae2..49f40ce 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js @@ -40,7 +40,7 @@ ve.dm.MWInlineImageNode.static.name = 'mwInlineImage'; ve.dm.MWInlineImageNode.static.preserveHtmlAttributes = function ( attribute ) { const attributes = [ 'typeof', 'class', 'src', 'resource', 'width', 'height', 'href', 'data-mw' ]; - return attributes.indexOf( attribute ) === -1; + return !attributes.includes( attribute ); }; ve.dm.MWInlineImageNode.static.matchTagNames = [ 'span' ]; @@ -108,7 +108,7 @@ ve.dm.MWInlineImageNode.static.toDataElement = function ( domElements, converter classes = typeof classes === 'string' ? classes.trim().split( /\s+/ ) : []; // Deal with border flag - if ( classes.indexOf( 'mw-image-border' ) !== -1 ) { + if ( classes.includes( 'mw-image-border' ) ) { attributes.borderImage = true; recognizedClasses.push( 'mw-image-border' ); } @@ -117,7 +117,7 @@ ve.dm.MWInlineImageNode.static.toDataElement = function ( domElements, converter attributes.valign = 'default'; [ 'midde', 'baseline', 'sub', 'super', 'top', 'text-top', 'bottom', 'text-bottom' ].some( ( valign ) => { const className = 'mw-valign-' + valign; - if ( classes.indexOf( className ) !== -1 ) { + if ( classes.includes( className ) ) { attributes.valign = valign; recognizedClasses.push( className ); return true; @@ -126,13 +126,13 @@ ve.dm.MWInlineImageNode.static.toDataElement = function ( domElements, converter } ); // Border - if ( classes.indexOf( 'mw-image-border' ) !== -1 ) { + if ( classes.includes( 'mw-image-border' ) ) { attributes.borderImage = true; recognizedClasses.push( 'mw-image-border' ); } // Default-size - if ( classes.indexOf( 'mw-default-size' ) !== -1 ) { + if ( classes.includes( 'mw-default-size' ) ) { attributes.defaultSize = true; recognizedClasses.push( 'mw-default-size' ); } diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js index 06c83e1..d5aa0d5 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js @@ -51,7 +51,7 @@ ve.dm.MWNumberedExternalLinkNode.static.matchFunction = function ( domElement ) // contexts.) // Note that ve:NumberedLink is only used internally by VE for cross-document // pastes and is never sent to Parsoid. - return domElement.childNodes.length === 0 || domElement.getAttribute( 'rel' ).indexOf( 've:NumberedLink' ) !== -1; + return domElement.childNodes.length === 0 || domElement.getAttribute( 'rel' ).includes( 've:NumberedLink' ); }; ve.dm.MWNumberedExternalLinkNode.static.toDataElement = function ( domElements ) { diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js index d5c0d38..2e6cff5 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js @@ -64,7 +64,7 @@ ve.dm.MWTableNode.static.toDataElement = function ( domElements ) { classAttr = domElement.getAttribute( 'class' ); const attributes = { - hasExpandedAttrs: ( domElement.getAttribute( 'typeof' ) || '' ).indexOf( 'mw:ExpandedAttrs' ) !== -1 + hasExpandedAttrs: ( domElement.getAttribute( 'typeof' ) || '' ).includes( 'mw:ExpandedAttrs' ) }; this.setClassAttributes( attributes, classAttr ); diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js index 8c282f3..5a0b174 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js @@ -63,7 +63,7 @@ ve.dm.MWTransclusionNode.static.enableAboutGrouping = true; // We handle rendering ourselves, no need to render attributes from originalDomElements (T207325), // except for data-parsoid/RESTBase ID (T207325) ve.dm.MWTransclusionNode.static.preserveHtmlAttributes = function ( attribute ) { - return [ 'data-parsoid', 'id' ].indexOf( attribute ) !== -1; + return [ 'data-parsoid', 'id' ].includes( attribute ); }; ve.dm.MWTransclusionNode.static.getHashObject = function ( dataElement ) { diff --git a/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js b/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js index 44b70ab..fea9c12 100644 --- a/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js +++ b/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js @@ -150,7 +150,7 @@ ve.init.mw.ArticleTargetEvents.prototype.trackSaveError = function ( code ) { specialTypes = [ 'editconflict' ]; let key = 'performance.user.saveError'; - if ( specialTypes.indexOf( code ) !== -1 ) { + if ( specialTypes.includes( code ) ) { key += '.' + code; } this.trackTiming( key, { diff --git a/modules/ve-mw/init/ve.init.mw.Platform.js b/modules/ve-mw/init/ve.init.mw.Platform.js index 56b88fb..d28ca95 100644 --- a/modules/ve-mw/init/ve.init.mw.Platform.js +++ b/modules/ve-mw/init/ve.init.mw.Platform.js @@ -319,7 +319,7 @@ ve.init.mw.Platform.prototype.fetchSpecialCharList = function () { characters[ groupName ] = { label: mw.msg( 'special-characters-group-' + groupName ), symbols: this.processSpecialCharSymbols( groupObject ), - attributes: { dir: rtlGroups.indexOf( groupName ) !== -1 ? 'rtl' : 'ltr' } + attributes: { dir: rtlGroups.includes( groupName ) ? 'rtl' : 'ltr' } }; } ); diff --git a/modules/ve-mw/preinit/.eslintrc.json b/modules/ve-mw/preinit/.eslintrc.json index 9835fab..99f9238 100644 --- a/modules/ve-mw/preinit/.eslintrc.json +++ b/modules/ve-mw/preinit/.eslintrc.json @@ -5,6 +5,7 @@ "rules": { "no-jquery/no-extend": "off", "no-jquery/no-deferred": "off", - "no-jquery/no-when": "off" + "no-jquery/no-when": "off", + "no-jquery/no-done-fail": "warn" } } diff --git a/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js b/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js index 52ac88e..61615ac 100644 --- a/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js +++ b/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js @@ -1342,7 +1342,7 @@ // If forced by the URL parameter, skip the namespace check (T221892) and preference check ( url.searchParams.get( 'veaction' ) === 'edit' || ( // Only in enabled namespaces - conf.namespaces.indexOf( new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getNamespaceId() ) !== -1 && + conf.namespaces.includes( new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getNamespaceId() ) && // Enabled per user preferences enabledForUser @@ -1428,7 +1428,7 @@ const mode = veactionToMode[ editUrl.searchParams.get( 'veaction' ) ] || // Always load VE visual mode if collabSession is set ( editUrl.searchParams.has( 'collabSession' ) ? 'visual' : null ); - if ( mode && availableModes.indexOf( mode ) !== -1 ) { + if ( mode && availableModes.includes( mode ) ) { return mode; } } diff --git a/modules/ve-mw/preinit/ve.utils.parsoid.js b/modules/ve-mw/preinit/ve.utils.parsoid.js index 9a18d5f..89a1564 100644 --- a/modules/ve-mw/preinit/ve.utils.parsoid.js +++ b/modules/ve-mw/preinit/ve.utils.parsoid.js @@ -147,7 +147,7 @@ mw.libs.ve.deduplicateStyles = function ( element ) { */ function isFosterablePosition( node ) { const fosterablePositions = [ 'table', 'thead', 'tbody', 'tfoot', 'tr' ]; - return node && fosterablePositions.indexOf( node.parentNode.nodeName.toLowerCase() ) !== -1; + return node && fosterablePositions.includes( node.parentNode.nodeName.toLowerCase() ); } const styleTagKeys = {}; @@ -318,7 +318,7 @@ mw.libs.ve.getTargetDataFromHref = function ( href, doc ) { const articleBaseRegex = new RegExp( regexEscape( articleBase ).replace( regexEscape( '$1' ), '(.*)' ) ); const matches = relativeHref.match( articleBaseRegex ); if ( matches ) { - if ( queryLength === 0 && matches && matches[ 1 ].split( '#' )[ 0 ].indexOf( '?' ) === -1 ) { + if ( queryLength === 0 && matches && !matches[ 1 ].split( '#' )[ 0 ].includes( '?' ) ) { // Take the relative path return returnInternalData( matches[ 1 ] ); } diff --git a/modules/ve-mw/tests/.eslintrc.json b/modules/ve-mw/tests/.eslintrc.json index 0f04043..fde9621 100644 --- a/modules/ve-mw/tests/.eslintrc.json +++ b/modules/ve-mw/tests/.eslintrc.json @@ -18,7 +18,8 @@ ], "indent": "off", "no-jquery/no-html": "off", - "no-jquery/no-parse-html-literal": "off" + "no-jquery/no-parse-html-literal": "off", + "no-jquery/no-done-fail": "warn" }, "parserOptions": { "ecmaVersion": 2018 diff --git a/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js b/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js index 5c3a6cb..5aa26ca 100644 --- a/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js +++ b/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js @@ -36,7 +36,7 @@ ve.ui.MWAlienAnnotationContextItem.static.modelClasses = [ ve.ui.MWAlienAnnotationContextItem.prototype.getLabelMessage = function () { const type = this.model.getAttribute( 'type' ); - if ( type.indexOf( '/End', type.length - 4 ) !== -1 ) { + if ( type.includes( '/End', type.length - 4 ) ) { return mw.message( 'visualeditor-annotations-default-end' ).text(); } else { return mw.message( 'visualeditor-annotations-default-start' ).text(); @@ -45,7 +45,7 @@ ve.ui.MWAlienAnnotationContextItem.prototype.getLabelMessage = function () { ve.ui.MWAlienAnnotationContextItem.prototype.getDescriptionMessage = function () { const type = this.model.getAttribute( 'type' ); - if ( type.indexOf( '/End', type.length - 4 ) !== -1 ) { + if ( type.includes( '/End', type.length - 4 ) ) { return ''; } return mw.message( 'visualeditor-annotations-default-description' ).parseDom(); diff --git a/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js b/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js index 2549f04..a411203 100644 --- a/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js +++ b/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js @@ -62,7 +62,7 @@ ve.ui.MWWikitextStringTransferHandler.static.matchFunction = function ( item ) { if ( registry.registry[ i ].test( text ) ) { return true; } - } else if ( text.indexOf( rule ) !== -1 ) { + } else if ( text.includes( rule ) ) { return true; } } diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js b/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js index 234784f..f92aac5 100644 --- a/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js +++ b/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js @@ -227,7 +227,7 @@ ve.ui.MWMetaDialog.prototype.getSetupProcess = function ( data ) { selectWidget.findItemFromData( page ).setDisabled( isSource ); } ); - if ( isSource && visualOnlyPages.indexOf( data.page || 'categories' ) !== -1 ) { + if ( isSource && visualOnlyPages.includes( data.page || 'categories' ) ) { data.page = 'templatesUsed'; } diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js b/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js index 64262f4..a665315 100644 --- a/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js +++ b/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js @@ -284,7 +284,7 @@ ve.ui.MWSaveDialog.prototype.clearDiff = function () { * @throws {Error} Unknown saveDialog panel */ ve.ui.MWSaveDialog.prototype.swapPanel = function ( panel, noFocus ) { - if ( ( [ 'save', 'review', 'preview', 'conflict' ].indexOf( panel ) ) === -1 ) { + if ( ![ 'save', 'review', 'preview', 'conflict' ].includes( panel ) ) { throw new Error( 'Unknown saveDialog panel: ' + panel ); } diff --git a/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js b/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js index d3c4bd5..4857915 100644 --- a/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js +++ b/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js @@ -194,7 +194,7 @@ ve.ui.MWWikitextLinkAnnotationInspector.prototype.getTeardownProcess = function } else { labelText = this.initialLabel; } - if ( labelText.indexOf( ']]' ) !== -1 ) { + if ( labelText.includes( ']]' ) ) { labelText = labelText.replace( /(\]{2,})/g, '<nowiki>$1</nowiki>' ); } const labelTitle = mw.Title.newFromText( labelText ); diff --git a/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js b/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js index f688750..73c1d02 100644 --- a/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js +++ b/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js @@ -278,7 +278,7 @@ ve.ui.MWTwoPaneTransclusionDialogLayout.prototype.removePages = function ( pages this.stackLayout.getItems().forEach( ( page ) => { const pageName = page.getName(); - if ( pagesNamesToRemove.indexOf( pageName ) !== -1 ) { + if ( pagesNamesToRemove.includes( pageName ) ) { pagesToRemove.push( page ); delete this.pages[ pageName ]; if ( this.currentPageName === pageName ) { @@ -289,7 +289,7 @@ ve.ui.MWTwoPaneTransclusionDialogLayout.prototype.removePages = function ( pages } // Move the selection from a removed top-level part to another, but not to a parameter - if ( pageName.indexOf( '/' ) === -1 ) { + if ( !pageName.includes( '/' ) ) { if ( !isCurrentPageRemoved ) { // The last part before the removed one prevSelectionCandidate = pageName; diff --git a/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js b/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js index 289caa1..50a0876 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js @@ -184,7 +184,7 @@ ve.ui.MWAddParameterPage.prototype.getValidationErrors = function ( name ) { const spec = this.template.getSpec(); let key; - if ( spec.getParameterAliases( name ).indexOf( name ) !== -1 ) { + if ( spec.getParameterAliases( name ).includes( name ) ) { key = 'visualeditor-dialog-transclusion-add-param-error-alias'; } else if ( this.template.hasParameter( name ) ) { key = 'visualeditor-dialog-transclusion-add-param-error-exists-selected'; diff --git a/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js b/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js index 487e169..9b0c917 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js @@ -253,7 +253,7 @@ ve.ui.MWParameterPage.prototype.createValueInput = function () { ( suggestedValue ) => typeof suggestedValue === 'string' ).map( ( suggestedValue ) => ( { data: suggestedValue, label: suggestedValue || '\xA0' } ) ); return new OO.ui.ComboBoxInputWidget( valueInputConfig ); - } else if ( type !== 'line' || value.indexOf( '\n' ) !== -1 ) { + } else if ( type !== 'line' || value.includes( '\n' ) ) { // If the type is line, but there are already newlines in the provided // value, don't break the existing content by only providing a single- // line field. (This implies that the TemplateData for the field isn't @@ -277,7 +277,7 @@ ve.ui.MWParameterPage.prototype.createValueInput = function () { * @return {boolean} True if suggested values should be shown */ ve.ui.MWParameterPage.prototype.isSuggestedValueType = function ( type ) { - return [ 'unknown', 'content', 'line', 'string', 'number', 'unbalanced-wikitext' ].indexOf( type ) > -1; + return [ 'unknown', 'content', 'line', 'string', 'number', 'unbalanced-wikitext' ].includes( type ); }; /** diff --git a/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js b/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js index 718e443..a71391a 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js @@ -67,7 +67,7 @@ ve.ui.MWTemplatePage = function VeUiMWTemplatePage( template, name, config ) { } catch ( e ) { } // When {{User:Foo}} can be parsed as "Foo", we know the ":" is not syntax. - key = title && title.getMain().indexOf( ':' ) === -1 ? + key = title && !title.getMain().includes( ':' ) ? 'visualeditor-dialog-transclusion-template-title-nonexistent' : 'visualeditor-dialog-transclusion-template-title-modifier'; } else { diff --git a/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js b/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js index 8403c85..2ec87ff 100644 --- a/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js +++ b/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js @@ -124,7 +124,7 @@ ve.ui.MWUserGuideTool.prototype.onUpdateState = function () {}; ve.ui.MWUserGuideTool.prototype.onSelect = function () { this.setActive( false ); const urlOrTitle = ve.msg( 'visualeditor-help-link' ); - if ( urlOrTitle.indexOf( '//' ) !== -1 ) { + if ( urlOrTitle.includes( '//' ) ) { window.open( urlOrTitle ); } else { // This link used to be internal link to mw:, but that doesn't work diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js index b53d4ce..470a1d4 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js @@ -105,7 +105,7 @@ ve.ui.MWCategoryInputWidget.prototype.getLookupCacheDataFromResponse = function } if ( linkCacheUpdate[ redirect.to ].redirectFrom && - linkCacheUpdate[ redirect.to ].redirectFrom.indexOf( redirect.from ) === -1 + !linkCacheUpdate[ redirect.to ].redirectFrom.includes( redirect.from ) ) { linkCacheUpdate[ redirect.to ].redirectFrom.push( redirect.from ); } else { @@ -157,7 +157,7 @@ ve.ui.MWCategoryInputWidget.prototype.getLookupMenuOptionsFromData = function ( linkCacheUpdate[ suggestedCategoryTitle ] = { missing: false }; } if ( - existingCategories.indexOf( suggestedCategory ) === -1 + !existingCategories.includes( suggestedCategory ) ) { if ( suggestedCacheEntry && suggestedCacheEntry.hidden ) { hiddenCategoryItems.push( suggestedCategory ); diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js index b0058d1..8853d21 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js @@ -39,7 +39,7 @@ ve.ui.MWCategoryWidget = function VeUiMWCategoryWidget( config ) { this.normalizedTitles = {}; this.popup = new ve.ui.MWCategoryPopupWidget(); this.input = new ve.ui.MWCategoryInputWidget( this, { $overlay: config.$overlay } ); - this.forceCapitalization = mw.config.get( 'wgCaseSensitiveNamespaces' ).indexOf( categoryNamespace ) === -1; + this.forceCapitalization = !mw.config.get( 'wgCaseSensitiveNamespaces' ).includes( categoryNamespace ); this.categoryPrefix = mw.config.get( 'wgFormattedNamespaces' )[ categoryNamespace ] + ':'; this.expandedItem = null; diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js index 4e34618..d3706e2 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js @@ -112,7 +112,7 @@ ve.ui.MWInternalLinkAnnotationWidget.prototype.onTextChange = function ( value ) value = targetData.title; this.input.query.setValue( targetData.title ); } - } else if ( namespacesWithSubpages.indexOf( basePageObj.namespace ) !== -1 && value[ 0 ] === '/' ) { + } else if ( namespacesWithSubpages.includes( basePageObj.namespace ) && value[ 0 ] === '/' ) { // This does make it more-difficult to deliberately link to a page in the // default namespace that starts with a / when you're on a subpage-allowing // namespace. However, the exact same trick you need to know to make it work diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js index 670bee0..c46dd3b 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js @@ -431,7 +431,7 @@ ve.ui.MWTransclusionOutlineTemplateWidget.prototype.filterParameters = function const foundSomeMatch = placesToSearch.some( // Aliases missed validation for a long time and aren't guaranteed to be strings - ( term ) => term && typeof term === 'string' && term.toLowerCase().indexOf( query ) !== -1 + ( term ) => term && typeof term === 'string' && term.toLowerCase().includes( query ) ); item.toggle( foundSomeMatch ); diff --git a/package-lock.json b/package-lock.json index b215750..56eafe7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@wdio/mocha-framework": "7.33.0", "@wdio/spec-reporter": "7.16.13", "api-testing": "1.6.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "grunt": "1.6.1", "grunt-banana-checker": "0.13.0", "grunt-contrib-watch": "1.1.0", @@ -161,17 +161,23 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", @@ -4863,9 +4869,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", @@ -4878,13 +4884,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": { @@ -5091,9 +5100,9 @@ } }, "node_modules/eslint-plugin-no-jquery": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz", - "integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", + "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", "dev": true, "peerDependencies": { "eslint": ">=8.0.0" @@ -14220,12 +14229,20 @@ "dev": true }, "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + } } }, "@csstools/css-parser-algorithms": { @@ -17862,9 +17879,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", @@ -17877,7 +17894,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", @@ -18024,9 +18041,9 @@ } }, "eslint-plugin-no-jquery": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz", - "integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", + "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 7313de2..fce88e9 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@wdio/mocha-framework": "7.33.0", "@wdio/spec-reporter": "7.16.13", "api-testing": "1.6.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "grunt": "1.6.1", "grunt-banana-checker": "0.13.0", "grunt-contrib-watch": "1.1.0", -- 2.39.2
$ date --- stdout --- Sun Mar 23 13:22:37 UTC 2025 --- end --- $ git clone file:///srv/git/mediawiki-extensions-VisualEditor.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 --- stderr --- Submodule 'lib/ve' (https://gerrit.wikimedia.org/r/VisualEditor/VisualEditor.git) registered for path 'lib/ve' Cloning into '/src/repo/lib/ve'... --- stdout --- Submodule path 'lib/ve': checked out '29ebd972e4ba90b9198cab157e923684295766d1' --- end --- $ grr init --- stdout --- Installed commit-msg hook. --- end --- $ git show-ref refs/heads/master --- stdout --- cb6d4a4b4eba04be304167499b6303eede6c73fd refs/heads/master --- end --- $ /usr/bin/npm audit --json --- stdout --- { "auditReportVersion": 2, "vulnerabilities": { "@babel/runtime": { "name": "@babel/runtime", "severity": "moderate", "isDirect": false, "via": [ { "source": 1103025, "name": "@babel/runtime", "dependency": "@babel/runtime", "title": "Babel has inefficient RexExp complexity in generated code with .replace when transpiling named capturing groups", "url": "https://github.com/advisories/GHSA-968p-4wvh-cqc8", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 6.2, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<7.26.10" } ], "effects": [], "range": "<7.26.10", "nodes": [ "node_modules/@babel/runtime" ], "fixAvailable": true }, "@jimp/core": { "name": "@jimp/core", "severity": "moderate", "isDirect": false, "via": [ "phin" ], "effects": [ "@jimp/custom" ], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/@jimp/core" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "@jimp/custom": { "name": "@jimp/custom", "severity": "moderate", "isDirect": false, "via": [ "@jimp/core" ], "effects": [ "jimp" ], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/@jimp/custom" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "@wdio/cli": { "name": "@wdio/cli", "severity": "high", "isDirect": true, "via": [ "webdriverio", "yarn-install" ], "effects": [ "@wdio/junit-reporter", "@wdio/local-runner", "@wdio/spec-reporter" ], "range": "5.4.10 - 8.43.0", "nodes": [ "node_modules/@wdio/cli" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/junit-reporter": { "name": "@wdio/junit-reporter", "severity": "high", "isDirect": true, "via": [ "@wdio/cli" ], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": [ "node_modules/@wdio/junit-reporter" ], "fixAvailable": { "name": "@wdio/junit-reporter", "version": "9.11.0", "isSemVerMajor": true } }, "@wdio/local-runner": { "name": "@wdio/local-runner", "severity": "high", "isDirect": true, "via": [ "@wdio/cli", "@wdio/runner" ], "effects": [], "range": "6.0.4 - 8.43.0", "nodes": [ "node_modules/@wdio/local-runner" ], "fixAvailable": { "name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/runner": { "name": "@wdio/runner", "severity": "high", "isDirect": false, "via": [ "webdriverio" ], "effects": [ "@wdio/local-runner" ], "range": "7.16.5 - 8.43.0", "nodes": [ "node_modules/@wdio/runner" ], "fixAvailable": { "name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/spec-reporter": { "name": "@wdio/spec-reporter", "severity": "high", "isDirect": true, "via": [ "@wdio/cli" ], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": [ "node_modules/@wdio/spec-reporter" ], "fixAvailable": { "name": "@wdio/spec-reporter", "version": "9.11.0", "isSemVerMajor": true } }, "bin-build": { "name": "bin-build", "severity": "high", "isDirect": false, "via": [ "download", "execa" ], "effects": [ "gifsicle", "guetzli", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin" ], "range": ">=2.1.2", "nodes": [ "node_modules/bin-build" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-check": { "name": "bin-check", "severity": "high", "isDirect": false, "via": [ "execa" ], "effects": [ "bin-wrapper" ], "range": ">=4.1.0", "nodes": [ "node_modules/bin-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-version": { "name": "bin-version", "severity": "high", "isDirect": false, "via": [ "find-versions" ], "effects": [ "bin-version-check" ], "range": "<=4.0.0", "nodes": [ "node_modules/bin-version" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-version-check": { "name": "bin-version-check", "severity": "high", "isDirect": false, "via": [ "bin-version" ], "effects": [ "bin-wrapper" ], "range": "<=4.0.0", "nodes": [ "node_modules/bin-version-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-wrapper": { "name": "bin-wrapper", "severity": "high", "isDirect": false, "via": [ "bin-check", "bin-version-check", "download" ], "effects": [ "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin" ], "range": ">=0.4.0", "nodes": [ "node_modules/bin-wrapper" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "cacheable-request": { "name": "cacheable-request", "severity": "high", "isDirect": false, "via": [ "http-cache-semantics" ], "effects": [ "got" ], "range": "0.1.0 - 2.1.4", "nodes": [ "node_modules/bin-wrapper/node_modules/cacheable-request" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "cross-spawn": { "name": "cross-spawn", "severity": "high", "isDirect": false, "via": [ { "source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<6.0.6" } ], "effects": [ "execa", "yarn-install" ], "range": "<6.0.6", "nodes": [ "node_modules/execa/node_modules/cross-spawn", "node_modules/yarn-install/node_modules/cross-spawn" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "css-select": { "name": "css-select", "severity": "high", "isDirect": false, "via": [ "nth-check" ], "effects": [ "svgo" ], "range": "<=3.1.0", "nodes": [ "node_modules/css-select" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "devtools": { "name": "devtools", "severity": "high", "isDirect": false, "via": [ "puppeteer-core" ], "effects": [], "range": ">=7.16.5", "nodes": [ "node_modules/devtools" ], "fixAvailable": true }, "download": { "name": "download", "severity": "moderate", "isDirect": false, "via": [ "got" ], "effects": [ "bin-build", "bin-wrapper" ], "range": ">=4.0.0", "nodes": [ "node_modules/bin-wrapper/node_modules/download", "node_modules/download" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "exec-buffer": { "name": "exec-buffer", "severity": "high", "isDirect": false, "via": [ "execa" ], "effects": [ "grunt-image" ], "range": ">=3.1.0", "nodes": [ "node_modules/exec-buffer" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "execa": { "name": "execa", "severity": "high", "isDirect": false, "via": [ "cross-spawn" ], "effects": [ "bin-build", "bin-check", "exec-buffer" ], "range": "0.5.0 - 0.9.0", "nodes": [ "node_modules/execa" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "find-versions": { "name": "find-versions", "severity": "high", "isDirect": false, "via": [ "semver-regex" ], "effects": [ "bin-version" ], "range": "<=3.2.0", "nodes": [ "node_modules/find-versions" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "gifsicle": { "name": "gifsicle", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/gifsicle" ], "fixAvailable": true }, "got": { "name": "got", "severity": "high", "isDirect": false, "via": [ { "source": 1088948, "name": "got", "dependency": "got", "title": "Got allows a redirect to a UNIX socket", "url": "https://github.com/advisories/GHSA-pfrx-2q88-qq97", "severity": "moderate", "cwe": [], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<11.8.5" }, "cacheable-request" ], "effects": [ "download" ], "range": "<=11.8.3", "nodes": [ "node_modules/bin-wrapper/node_modules/got", "node_modules/download/node_modules/got" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "grunt-image": { "name": "grunt-image", "severity": "high", "isDirect": true, "via": [ "exec-buffer", "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "svgo", "zopflipng-bin" ], "effects": [], "range": "0.1.0 || >=1.0.0", "nodes": [ "node_modules/grunt-image" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "guetzli": { "name": "guetzli", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": "*", "nodes": [ "node_modules/guetzli" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "http-cache-semantics": { "name": "http-cache-semantics", "severity": "high", "isDirect": false, "via": [ { "source": 1102456, "name": "http-cache-semantics", "dependency": "http-cache-semantics", "title": "http-cache-semantics vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-rc47-6667-2j5j", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<4.1.1" } ], "effects": [ "cacheable-request" ], "range": "<4.1.1", "nodes": [ "node_modules/bin-wrapper/node_modules/http-cache-semantics" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "jimp": { "name": "jimp", "severity": "moderate", "isDirect": true, "via": [ "@jimp/custom" ], "effects": [], "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/jimp" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "jpeg-recompress-bin": { "name": "jpeg-recompress-bin", "severity": "moderate", "isDirect": false, "via": [ "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.1", "nodes": [ "node_modules/jpeg-recompress-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "meow": { "name": "meow", "severity": "high", "isDirect": false, "via": [ "trim-newlines" ], "effects": [], "range": "3.4.0 - 5.0.0", "nodes": [ "node_modules/meow" ], "fixAvailable": true }, "minimatch": { "name": "minimatch", "severity": "high", "isDirect": false, "via": [ { "source": 1096485, "name": "minimatch", "dependency": "minimatch", "title": "minimatch ReDoS vulnerability", "url": "https://github.com/advisories/GHSA-f8q6-p94x-37v3", "severity": "high", "cwe": [ "CWE-400", "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.0.5" } ], "effects": [ "mocha" ], "range": "<3.0.5", "nodes": [ "node_modules/mocha/node_modules/minimatch" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "minimist": { "name": "minimist", "severity": "critical", "isDirect": false, "via": [ { "source": 1096466, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-vh95-rmgr-6w4m", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 5.6, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L" }, "range": "<0.2.1" }, { "source": 1097677, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-xvch-5gv4-984h", "severity": "critical", "cwe": [ "CWE-1321" ], "cvss": { "score": 9.8, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" }, "range": "<0.2.4" } ], "effects": [ "mkdirp" ], "range": "<=0.2.3", "nodes": [ "node_modules/mocha/node_modules/minimist" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mkdirp": { "name": "mkdirp", "severity": "critical", "isDirect": false, "via": [ "minimist" ], "effects": [ "mocha" ], "range": "0.4.1 - 0.5.1", "nodes": [ "node_modules/mocha/node_modules/mkdirp" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mocha": { "name": "mocha", "severity": "critical", "isDirect": true, "via": [ "minimatch", "mkdirp" ], "effects": [], "range": "1.21.5 - 9.2.1", "nodes": [ "node_modules/mocha" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mozjpeg": { "name": "mozjpeg", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=4.0.0", "nodes": [ "node_modules/mozjpeg" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "mwbot": { "name": "mwbot", "severity": "moderate", "isDirect": false, "via": [ "request" ], "effects": [ "wdio-mediawiki" ], "range": ">=0.1.6", "nodes": [ "node_modules/mwbot" ], "fixAvailable": false }, "nth-check": { "name": "nth-check", "severity": "high", "isDirect": false, "via": [ { "source": 1095141, "name": "nth-check", "dependency": "nth-check", "title": "Inefficient Regular Expression Complexity in nth-check", "url": "https://github.com/advisories/GHSA-rp65-9cf3-cjxr", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<2.0.1" } ], "effects": [ "css-select" ], "range": "<2.0.1", "nodes": [ "node_modules/css-select/node_modules/nth-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "optipng-bin": { "name": "optipng-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/optipng-bin" ], "fixAvailable": true }, "phin": { "name": "phin", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096967, "name": "phin", "dependency": "phin", "title": "phin may include sensitive headers in subsequent requests after redirect", "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf", "severity": "moderate", "cwe": [ "CWE-200" ], "cvss": { "score": 4.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N" }, "range": "<3.7.1" } ], "effects": [ "@jimp/core" ], "range": "<3.7.1", "nodes": [ "node_modules/phin" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "pngquant-bin": { "name": "pngquant-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/pngquant-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "puppeteer-core": { "name": "puppeteer-core", "severity": "high", "isDirect": false, "via": [ "ws" ], "effects": [ "devtools", "webdriverio" ], "range": "11.0.0 - 22.11.1", "nodes": [ "node_modules/puppeteer-core" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "request": { "name": "request", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": [ "CWE-918" ], "cvss": { "score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" }, "range": "<=2.88.2" }, "tough-cookie" ], "effects": [ "mwbot" ], "range": "*", "nodes": [ "node_modules/request" ], "fixAvailable": false }, "selenium-webdriver": { "name": "selenium-webdriver", "severity": "moderate", "isDirect": true, "via": [ "xml2js" ], "effects": [], "range": "2.43.1 - 4.0.0-rc-2", "nodes": [ "node_modules/selenium-webdriver" ], "fixAvailable": { "name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true } }, "semver-regex": { "name": "semver-regex", "severity": "high", "isDirect": false, "via": [ { "source": 1092475, "name": "semver-regex", "dependency": "semver-regex", "title": "semver-regex Regular Expression Denial of Service (ReDOS)", "url": "https://github.com/advisories/GHSA-44c6-4v22-4mhx", "severity": "high", "cwe": [ "CWE-400", "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.1.3" }, { "source": 1092605, "name": "semver-regex", "dependency": "semver-regex", "title": "Regular expression denial of service in semver-regex", "url": "https://github.com/advisories/GHSA-4x5v-gmq8-25ch", "severity": "low", "cwe": [ "CWE-1333" ], "cvss": { "score": 0, "vectorString": null }, "range": "<3.1.4" } ], "effects": [ "find-versions" ], "range": "<=3.1.3", "nodes": [ "node_modules/semver-regex" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "svgo": { "name": "svgo", "severity": "high", "isDirect": false, "via": [ "css-select" ], "effects": [ "grunt-image" ], "range": "1.0.0 - 1.3.2", "nodes": [ "node_modules/svgo" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "tough-cookie": { "name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N" }, "range": "<4.1.3" } ], "effects": [ "request" ], "range": "<4.1.3", "nodes": [ "node_modules/tough-cookie" ], "fixAvailable": false }, "trim-newlines": { "name": "trim-newlines", "severity": "high", "isDirect": false, "via": [ { "source": 1095100, "name": "trim-newlines", "dependency": "trim-newlines", "title": "Uncontrolled Resource Consumption in trim-newlines", "url": "https://github.com/advisories/GHSA-7p7h-4mm5-852v", "severity": "high", "cwe": [ "CWE-400" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.0.1" } ], "effects": [ "meow" ], "range": "<3.0.1", "nodes": [ "node_modules/trim-newlines" ], "fixAvailable": true }, "wdio-mediawiki": { "name": "wdio-mediawiki", "severity": "moderate", "isDirect": true, "via": [ "mwbot" ], "effects": [], "range": "*", "nodes": [ "node_modules/wdio-mediawiki" ], "fixAvailable": false }, "webdriverio": { "name": "webdriverio", "severity": "high", "isDirect": false, "via": [ "devtools", "puppeteer-core" ], "effects": [ "@wdio/cli", "@wdio/runner" ], "range": "7.16.5 - 8.43.0", "nodes": [ "node_modules/webdriverio" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "ws": { "name": "ws", "severity": "high", "isDirect": false, "via": [ { "source": 1098392, "name": "ws", "dependency": "ws", "title": "ws affected by a DoS when handling a request with many HTTP headers", "url": "https://github.com/advisories/GHSA-3h5v-q93c-6h6q", "severity": "high", "cwe": [ "CWE-476" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": ">=8.0.0 <8.17.1" } ], "effects": [ "puppeteer-core" ], "range": "8.0.0 - 8.17.0", "nodes": [ "node_modules/ws" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "xml2js": { "name": "xml2js", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096693, "name": "xml2js", "dependency": "xml2js", "title": "xml2js is vulnerable to prototype pollution", "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<0.5.0" } ], "effects": [ "selenium-webdriver" ], "range": "<0.5.0", "nodes": [ "node_modules/xml2js" ], "fixAvailable": { "name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true } }, "yarn-install": { "name": "yarn-install", "severity": "high", "isDirect": false, "via": [ "cross-spawn" ], "effects": [ "@wdio/cli" ], "range": "*", "nodes": [ "node_modules/yarn-install" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "zopflipng-bin": { "name": "zopflipng-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/zopflipng-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 13, "high": 36, "critical": 3, "total": 52 }, "dependencies": { "prod": 1, "dev": 1213, "optional": 2, "peer": 1, "peerOptional": 0, "total": 1213 } } } --- 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.4) - Locking felixfbecker/advanced-json-rpc (v3.2.1) - Locking mediawiki/mediawiki-codesniffer (v46.0.0) - Locking mediawiki/mediawiki-phan-config (0.15.1) - Locking mediawiki/minus-x (1.1.3) - Locking mediawiki/phan-taint-check-plugin (6.1.0) - Locking microsoft/tolerant-php-parser (v0.1.2) - Locking netresearch/jsonmapper (v4.5.0) - Locking phan/phan (5.4.5) - Locking php-parallel-lint/php-console-color (v1.0.1) - Locking php-parallel-lint/php-console-highlighter (v1.0.0) - Locking php-parallel-lint/php-parallel-lint (v1.4.0) - Locking phpcsstandards/phpcsextra (1.2.1) - Locking phpcsstandards/phpcsutils (1.0.12) - Locking phpdocumentor/reflection-common (2.2.0) - Locking phpdocumentor/reflection-docblock (5.6.1) - Locking phpdocumentor/type-resolver (1.10.0) - Locking phpstan/phpdoc-parser (2.1.0) - Locking psr/container (2.0.2) - Locking psr/log (3.0.2) - Locking sabre/event (5.1.7) - Locking squizlabs/php_codesniffer (3.11.3) - Locking symfony/console (v7.2.1) - Locking symfony/deprecation-contracts (v3.5.1) - Locking symfony/polyfill-ctype (v1.31.0) - Locking symfony/polyfill-intl-grapheme (v1.31.0) - Locking symfony/polyfill-intl-normalizer (v1.31.0) - Locking symfony/polyfill-mbstring (v1.31.0) - Locking symfony/polyfill-php80 (v1.31.0) - Locking symfony/service-contracts (v3.5.1) - Locking symfony/string (v7.2.0) - Locking tysonandre/var_representation_polyfill (0.1.3) - Locking webmozart/assert (1.11.0) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 38 installs, 0 updates, 0 removals 0 [>---------------------------] 0 [->--------------------------] - Installing squizlabs/php_codesniffer (3.11.3): Extracting archive - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive - Installing composer/pcre (3.3.2): Extracting archive - Installing symfony/polyfill-php80 (v1.31.0): Extracting archive - Installing phpcsstandards/phpcsutils (1.0.12): Extracting archive - Installing phpcsstandards/phpcsextra (1.2.1): Extracting archive - Installing symfony/polyfill-mbstring (v1.31.0): Extracting archive - Installing composer/spdx-licenses (1.5.8): Extracting archive - Installing composer/semver (3.4.3): Extracting archive - Installing mediawiki/mediawiki-codesniffer (v46.0.0): Extracting archive - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive - Installing symfony/polyfill-intl-normalizer (v1.31.0): Extracting archive - Installing symfony/polyfill-intl-grapheme (v1.31.0): Extracting archive - Installing symfony/polyfill-ctype (v1.31.0): Extracting archive - Installing symfony/string (v7.2.0): Extracting archive - Installing symfony/deprecation-contracts (v3.5.1): Extracting archive - Installing psr/container (2.0.2): Extracting archive - Installing symfony/service-contracts (v3.5.1): Extracting archive - Installing symfony/console (v7.2.1): Extracting archive - Installing sabre/event (5.1.7): Extracting archive - Installing netresearch/jsonmapper (v4.5.0): Extracting archive - Installing microsoft/tolerant-php-parser (v0.1.2): Extracting archive - Installing webmozart/assert (1.11.0): Extracting archive - Installing phpstan/phpdoc-parser (2.1.0): Extracting archive - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive - Installing doctrine/deprecations (1.1.4): Extracting archive - Installing phpdocumentor/type-resolver (1.10.0): Extracting archive - Installing phpdocumentor/reflection-docblock (5.6.1): Extracting archive - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive - Installing psr/log (3.0.2): Extracting archive - Installing composer/xdebug-handler (3.0.5): Extracting archive - Installing phan/phan (5.4.5): Extracting archive - Installing mediawiki/phan-taint-check-plugin (6.1.0): Extracting archive - Installing mediawiki/mediawiki-phan-config (0.15.1): Extracting archive - Installing mediawiki/minus-x (1.1.3): Extracting archive - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive - Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive 0/36 [>---------------------------] 0% 19/36 [==============>-------------] 52% 35/36 [===========================>] 97% 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 --- stderr --- npm WARN deprecated har-validator@5.1.5: this library is no longer supported npm WARN deprecated glob@8.1.0: Glob versions prior to v9 are no longer supported npm WARN deprecated formidable@1.2.6: Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated superagent@6.1.0: Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at <https://github.com/visionmedia/superagent/releases>. npm WARN deprecated svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x. --- stdout --- added 1212 packages, and audited 1213 packages in 42s 164 packages are looking for funding run `npm fund` for details 52 vulnerabilities (13 moderate, 36 high, 3 critical) To address issues that do not require attention, run: npm audit fix To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact --- stdout --- up to date, audited 1213 packages in 3s 164 packages are looking for funding run `npm fund` for details 52 vulnerabilities (13 moderate, 36 high, 3 critical) To address issues that do not require attention, run: npm audit fix To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ ./node_modules/.bin/eslint . --fix --- stdout --- /src/repo/build/screenshots.js 97:6 warning Found writeFile from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename /src/repo/editcheck/modules/editchecks/AddReferenceEditCheck.js 84:12 error Prefer .then to .done no-jquery/no-done-fail 94:11 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw-collab/ve.init.mw.CollabTarget.init.js 65:3 error Prefer .then to .done no-jquery/no-done-fail 65:3 error Prefer .then to .fail no-jquery/no-done-fail 189:6 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js 79:15 error Prefer .then to .done no-jquery/no-done-fail 79:15 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js 119:14 error Prefer .then to .done no-jquery/no-done-fail 119:14 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js 176:14 error Prefer .then to .done no-jquery/no-done-fail 176:14 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/models/ve.dm.MWImageModel.js 341:4 error Prefer .then to .done no-jquery/no-done-fail 1199:3 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js 329:15 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js 368:3 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/ve.dm.MWWikitextSurfaceFragment.js 139:3 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.LinkCache.js 81:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js 1155:2 error Prefer .then to .done no-jquery/no-done-fail 1155:2 error Prefer .then to .fail no-jquery/no-done-fail 1587:32 error Prefer .then to .done no-jquery/no-done-fail 1587:32 error Prefer .then to .fail no-jquery/no-done-fail 1645:3 error Prefer .then to .done no-jquery/no-done-fail 1645:3 error Prefer .then to .fail no-jquery/no-done-fail 1721:37 error Prefer .then to .done no-jquery/no-done-fail 1721:37 error Prefer .then to .fail no-jquery/no-done-fail 2005:2 error Prefer .then to .done no-jquery/no-done-fail 2005:2 error Prefer .then to .fail no-jquery/no-done-fail 2010:3 error Prefer .then to .done no-jquery/no-done-fail 2482:18 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js 245:3 error Prefer .then to .done no-jquery/no-done-fail 398:3 error Prefer .then to .done no-jquery/no-done-fail 398:3 error Prefer .then to .fail no-jquery/no-done-fail 679:2 error Prefer .then to .done no-jquery/no-done-fail 799:2 error Prefer .then to .done no-jquery/no-done-fail 872:9 error Prefer .then to .fail no-jquery/no-done-fail 1475:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/preinit/ve.init.MWEditingTabDialog.js 82:4 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js 674:6 error Prefer .then to .done no-jquery/no-done-fail 1090:5 error Prefer .then to .done no-jquery/no-done-fail 1520:6 error Prefer .then to .done no-jquery/no-done-fail 1613:4 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js 51:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/tests/ui/dialogs/ve.ui.MWTransclusionDialog.test.js 42:3 error Prefer .then to .done no-jquery/no-done-fail 42:3 error Prefer .then to .fail no-jquery/no-done-fail 82:4 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js 436:26 error Prefer .then to .done no-jquery/no-done-fail 623:9 error Prefer .then to .done no-jquery/no-done-fail 705:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js 720:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js 358:27 error Prefer .then to .done no-jquery/no-done-fail 358:27 error Prefer .then to .fail no-jquery/no-done-fail 493:2 error Prefer .then to .done no-jquery/no-done-fail 509:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js 363:4 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js 103:3 error Prefer .then to .done no-jquery/no-done-fail 429:3 error Prefer .then to .done no-jquery/no-done-fail 528:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js 214:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js 36:2 error Prefer .then to .done no-jquery/no-done-fail 163:2 error Prefer .then to .done no-jquery/no-done-fail 163:2 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js 196:2 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js 76:4 error Prefer .then to .done no-jquery/no-done-fail 76:4 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/ve.ui.MWWikitextTransferRegistry.js 27:1 error Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/widgets/ve.ui.MWAceEditorWidget.js 82:3 error Prefer .then to .done no-jquery/no-done-fail 90:2 error Prefer .then to .done no-jquery/no-done-fail 153:2 error Prefer .then to .done no-jquery/no-done-fail 201:2 error Prefer .then to .done no-jquery/no-done-fail 219:2 error Prefer .then to .done no-jquery/no-done-fail 265:2 error Prefer .then to .done no-jquery/no-done-fail 265:2 error Prefer .then to .fail no-jquery/no-done-fail 323:2 error Prefer .then to .done no-jquery/no-done-fail 339:2 error Prefer .then to .done no-jquery/no-done-fail 353:2 error Prefer .then to .done no-jquery/no-done-fail 367:2 error Prefer .then to .done no-jquery/no-done-fail 385:2 error Prefer .then to .done no-jquery/no-done-fail 385:2 error Prefer .then to .fail no-jquery/no-done-fail 401:3 error Prefer .then to .done no-jquery/no-done-fail 406:2 error Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js 117:3 error Prefer .then to .done no-jquery/no-done-fail ✖ 82 problems (81 errors, 1 warning) --- end --- $ ./node_modules/.bin/eslint . -f json --- stdout --- [{"filePath":"/src/repo/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/.stylelintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/checkModules.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":2,"message":"Don't use process.exit(); throw an error instead.","line":95,"column":3,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":95,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/screenshots-client/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/screenshots-client/diffs.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/build/screenshots-client/userGuide.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":9,"column":4,"nodeType":"CallExpression","endLine":9,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":6,"nodeType":"CallExpression","endLine":13,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/screenshots-client/utils.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-deferred","severity":2,"message":"Prefer Promise to $.Deferred","line":106,"column":63,"nodeType":"CallExpression","endLine":106,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/screenshots.diffs.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/build/screenshots.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found writeFile from package \"fs\" with non literal argument at index 0","line":97,"column":6,"nodeType":"CallExpression","endLine":97,"endColumn":53}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"'use strict';\n\nconst accessKey = process.env.SAUCE_ONDEMAND_ACCESS_KEY,\n\tBuilder = require( 'selenium-webdriver' ).Builder,\n\tfs = require( 'fs' ),\n\tJimp = require( 'jimp' ),\n\tusername = process.env.SAUCE_ONDEMAND_USERNAME,\n\twebdriver = require( 'selenium-webdriver' ),\n\tTIMEOUT = 10 * 1000;\n\nfunction createScreenshotEnvironment( test ) {\n\tlet clientSize, driver;\n\n\ttest.beforeEach( function () {\n\t\tconst lang = this.currentTest.parent.lang || 'en';\n\n\t\t// Use Sauce Labs when running on Jenins\n\t\tif ( process.env.JENKINS_URL ) {\n\t\t\tdriver = new webdriver.Builder().withCapabilities( {\n\t\t\t\tbrowserName: process.env.BROWSER,\n\t\t\t\tplatform: process.env.PLATFORM,\n\t\t\t\tscreenResolution: '1280x1024',\n\t\t\t\tusername: username,\n\t\t\t\taccessKey: accessKey\n\t\t\t} ).usingServer( 'http://' + username + ':' + accessKey +\n\t\t\t\t'@ondemand.saucelabs.com:80/wd/hub' ).build();\n\t\t} else {\n\t\t\t// If not running on Jenkins, use local browser\n\t\t\tdriver = new Builder().forBrowser( 'chrome' ).build();\n\t\t}\n\n\t\tdriver.manage().timeouts().setScriptTimeout( TIMEOUT );\n\t\tdriver.manage().window().setSize( 1200, 1000 );\n\n\t\tdriver.get( 'https://en.wikipedia.org/wiki/Help:Sample_page?veaction=edit&vehidebetadialog=1&uselang=' + lang )\n\t\t\t.then( null, ( e ) => {\n\t\t\t\tconsole.error( e.message );\n\t\t\t} );\n\t\tdriver.wait(\n\t\t\tdriver.executeAsyncScript(\n\t\t\t\trequire( './screenshots-client/utils.js' )\n\t\t\t).then( ( cs ) => {\n\t\t\t\tclientSize = cs;\n\t\t\t}, ( e ) => {\n\t\t\t\t// Log error (timeout)\n\t\t\t\tconsole.error( e.message );\n\t\t\t\t// Setup failed, set clientSize to null so no screenshots are generated\n\t\t\t\tclientSize = null;\n\t\t\t} )\n\t\t);\n\t} );\n\n\ttest.afterEach( () => {\n\t\tdriver.quit()\n\t\t\t.then( null, ( e ) => {\n\t\t\t\tconsole.error( e.message );\n\t\t\t} );\n\t} );\n\n\tfunction cropScreenshot( filename, imageBuffer, rect, padding ) {\n\t\tif ( padding === undefined ) {\n\t\t\tpadding = 5;\n\t\t}\n\n\t\tconst left = Math.max( 0, rect.left - padding );\n\t\tconst top = Math.max( 0, rect.top - padding );\n\t\tconst right = Math.min( clientSize.width, rect.left + rect.width + padding );\n\t\tconst bottom = Math.min( clientSize.height, rect.top + rect.height + padding );\n\n\t\treturn Jimp.read( imageBuffer ).then( ( jimpImage ) => {\n\t\t\ttry {\n\t\t\t\tjimpImage\n\t\t\t\t\t.crop( left, top, right - left, bottom - top )\n\t\t\t\t\t.write( filename );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Log error (memory?)\n\t\t\t\tconsole.error( e );\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction runScreenshotTest( lang, name, clientScript, padding, teardownScript ) {\n\t\tif ( !clientSize ) {\n\t\t\t// Setup failed, don't generated a broken screenshot\n\t\t\treturn;\n\t\t}\n\n\t\tconst filename = './screenshots/' + name + '-' + lang + '.png';\n\n\t\tdriver.manage().timeouts().setScriptTimeout( TIMEOUT );\n\t\tdriver.wait(\n\t\t\tdriver.executeAsyncScript( clientScript ).then( ( rect ) => driver.takeScreenshot().then( ( base64Image ) => {\n\t\t\t\tif ( rect ) {\n\t\t\t\t\tconst imageBuffer = Buffer.from( base64Image, 'base64' );\n\t\t\t\t\treturn cropScreenshot( filename, imageBuffer, rect, padding );\n\t\t\t\t} else {\n\t\t\t\t\tfs.writeFile( filename, base64Image, 'base64' );\n\t\t\t\t}\n\t\t\t} ).then( () => {\n\t\t\t\tif ( teardownScript ) {\n\t\t\t\t\treturn driver.executeAsyncScript( teardownScript );\n\t\t\t\t}\n\t\t\t} ), ( e ) => {\n\t\t\t\t// Log error (timeout)\n\t\t\t\tconsole.error( e );\n\t\t\t} )\n\t\t);\n\t}\n\n\treturn runScreenshotTest;\n}\n\nmodule.exports.createScreenshotEnvironment = createScreenshotEnvironment;\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/build/screenshots.userGuide.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/build/screenshots.yml","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":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/tasks/screenshotLangs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/build/typos.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bundlesize.config.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/i18n/api/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/i18n/api/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/modules/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/modules/BaseEditCheck.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/editcheck/modules/EditCheckAction.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":198,"column":2,"nodeType":"CallExpression","endLine":198,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":200,"column":31,"nodeType":"CallExpression","endLine":200,"endColumn":96,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/modules/EditCheckDialog.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":300,"column":20,"nodeType":"CallExpression","endLine":300,"endColumn":79,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/editcheck/modules/EditCheckFactory.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/editcheck/modules/EditCheckGutterSidebarDialog.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/editcheck/modules/EditCheckInspector.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/editcheck/modules/controller.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/editcheck/modules/editchecks/AddReferenceEditCheck.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":84,"column":12,"nodeType":"CallExpression","endLine":90,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":94,"column":11,"nodeType":"CallExpression","endLine":106,"endColumn":7}],"suppressedMessages":[{"ruleId":"arrow-body-style","severity":2,"message":"Unexpected block statement surrounding arrow body; move the returned value immediately after the `=>`.","line":100,"column":28,"nodeType":"ArrowFunctionExpression","messageId":"unexpectedSingleBlock","endLine":102,"endColumn":5,"fix":{"range":[4103,4138],"text":"instance.closing"},"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"mw.editcheck.AddReferenceEditCheck = function MWAddReferenceEditCheck() {\n\t// Parent constructor\n\tmw.editcheck.AddReferenceEditCheck.super.apply( this, arguments );\n};\n\nOO.inheritClass( mw.editcheck.AddReferenceEditCheck, mw.editcheck.BaseEditCheck );\n\nmw.editcheck.AddReferenceEditCheck.static.name = 'addReference';\n\nmw.editcheck.AddReferenceEditCheck.static.title = ve.msg( 'editcheck-dialog-addref-title' );\n\nmw.editcheck.AddReferenceEditCheck.static.description = ve.msg( 'editcheck-dialog-addref-description' );\n\nmw.editcheck.AddReferenceEditCheck.static.defaultConfig = ve.extendObject( {}, mw.editcheck.BaseEditCheck.static.defaultConfig, {\n\tminimumCharacters: 50,\n\tbeforePunctuation: false\n} );\n\nmw.editcheck.AddReferenceEditCheck.static.onlyCoveredNodes = true;\n\nmw.editcheck.AddReferenceEditCheck.prototype.onBeforeSave = function ( surfaceModel ) {\n\treturn this.findAddedContent( surfaceModel.getDocument() ).filter( ( range ) => !this.isDismissedRange( range ) )\n\t\t.map(\n\t\t\t( range ) => new mw.editcheck.EditCheckAction( {\n\t\t\t\tfragments: [ surfaceModel.getLinearFragment( range ) ],\n\t\t\t\tcheck: this\n\t\t\t} )\n\t\t);\n};\n// Only show these before save (for now)\n// mw.editcheck.AddReferenceEditCheck.prototype.onDocumentChange = mw.editcheck.AddReferenceEditCheck.prototype.onBeforeSave;\n\n/**\n * Find content ranges which have been inserted\n *\n * @param {ve.dm.Document} documentModel\n * @param {boolean} includeReferencedContent Include contents that already contains a reference\n * @return {ve.Range[]}\n */\nmw.editcheck.AddReferenceEditCheck.prototype.findAddedContent = function ( documentModel, includeReferencedContent ) {\n\t// Broken out so a helper for tagging can call it\n\tconst ranges = this.getModifiedContentRanges( documentModel ).filter( ( range ) => {\n\t\tif ( !includeReferencedContent ) {\n\t\t\t// 4. Exclude any ranges that already contain references\n\t\t\tfor ( let i = range.start; i < range.end; i++ ) {\n\t\t\t\tif ( documentModel.data.isElementData( i ) && documentModel.data.getType( i ) === 'mwReference' ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// 5. Exclude any ranges that aren't at the document root (i.e. image captions, table cells)\n\t\tconst branchNode = documentModel.getBranchNodeFromOffset( range.start );\n\t\tif ( branchNode.getParent() !== documentModel.attachedRoot ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t} );\n\n\treturn ranges;\n};\n\nmw.editcheck.AddReferenceEditCheck.prototype.act = function ( choice, action, surface ) {\n\t// The complex citoid workflow means that we can't just count on a single \"windowAction\" here...\n\tconst windowAction = ve.ui.actionFactory.create( 'window', surface, 'check' );\n\tswitch ( choice ) {\n\t\tcase 'accept':\n\t\t\tve.track( 'activity.editCheckReferences', { action: 'edit-check-confirm' } );\n\n\t\t\tthis.adjustForPunctuation( action.fragments[ 0 ].collapseToEnd() ).select();\n\n\t\t\treturn windowAction.open( 'citoid' ).then( ( instance ) => instance.closing ).then( ( citoidData ) => {\n\t\t\t\tconst citoidOrCiteDataDeferred = ve.createDeferred();\n\t\t\t\tif ( citoidData && citoidData.action === 'manual-choose' ) {\n\t\t\t\t\t// The plain reference dialog has been launched. Wait for the data from\n\t\t\t\t\t// the basic Cite closing promise instead.\n\t\t\t\t\tsurface.getDialogs().once( 'closing', ( win, closed, citeData ) => {\n\t\t\t\t\t\tcitoidOrCiteDataDeferred.resolve( citeData );\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\t// \"Auto\"/\"re-use\"/\"close\" means Citoid is finished and we can\n\t\t\t\t\t// use the data form the Citoid closing promise.\n\t\t\t\t\tcitoidOrCiteDataDeferred.resolve( citoidData );\n\t\t\t\t}\n\t\t\t\treturn citoidOrCiteDataDeferred.promise().done( ( data ) => {\n\t\t\t\t\tif ( data ) {\n\t\t\t\t\t\t// Edit check inspector is already closed by this point, but\n\t\t\t\t\t\t// we need to end the workflow.\n\t\t\t\t\t\tmw.notify( ve.msg( 'editcheck-dialog-addref-success-notify' ), { type: 'success' } );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} );\n\t\tcase 'reject':\n\t\t\tve.track( 'activity.editCheckReferences', { action: 'edit-check-reject' } );\n\t\t\treturn windowAction.open(\n\t\t\t\t'editCheckReferencesInspector',\n\t\t\t\t{\n\t\t\t\t\tfragment: action.fragments[ 0 ]\n\t\t\t\t}\n\t\t\t// eslint-disable-next-line arrow-body-style\n\t\t\t).then( ( instance ) => {\n\t\t\t\treturn instance.closing;\n\t\t\t} ).done( ( data ) => {\n\t\t\t\tif ( data && data.action === 'reject' && data.reason ) {\n\t\t\t\t\tthis.dismiss( action );\n\t\t\t\t}\n\t\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nmw.editcheck.AddReferenceEditCheck.prototype.isRangeValid = function ( range, documentModel ) {\n\treturn range.getLength() >= ( this.config.minimumCharacters || 0 ) &&\n\t\tmw.editcheck.AddReferenceEditCheck.super.prototype.isRangeValid.call( this, range, documentModel );\n};\n\n/**\n * Adjust a fragment to include/exclude trailing punctuation\n *\n * @param {ve.dm.SurfaceFragment} insertionPointFragment\n * @return {ve.dm.SurfaceFragment}\n */\nmw.editcheck.AddReferenceEditCheck.prototype.adjustForPunctuation = function ( insertionPointFragment ) {\n\tif ( this.config.beforePunctuation ) {\n\t\t// TODO: Use UnicodeJS properties directly once is https://gerrit.wikimedia.org/r/c/unicodejs/+/893832 merged\n\t\tconst sentenceProperties = {\n\t\t\tATerm: [ 0x002E, 0x2024, 0xFE52, 0xFF0E ],\n\t\t\tSTerm: [ 0x0021, 0x003F, 0x0589, 0x061E, 0x061F, 0x06D4, [ 0x0700, 0x0702 ], 0x07F9, 0x0837, 0x0839, 0x083D, 0x083E, 0x0964, 0x0965, 0x104A, 0x104B, 0x1362, 0x1367, 0x1368, 0x166E, 0x1735, 0x1736, 0x1803, 0x1809, 0x1944, 0x1945, [ 0x1AA8, 0x1AAB ], 0x1B5A, 0x1B5B, 0x1B5E, 0x1B5F, 0x1C3B, 0x1C3C, 0x1C7E, 0x1C7F, 0x203C, 0x203D, [ 0x2047, 0x2049 ], 0x2E2E, 0x2E3C, 0x3002, 0xA4FF, 0xA60E, 0xA60F, 0xA6F3, 0xA6F7, 0xA876, 0xA877, 0xA8CE, 0xA8CF, 0xA92F, 0xA9C8, 0xA9C9, [ 0xAA5D, 0xAA5F ], 0xAAF0, 0xAAF1, 0xABEB, 0xFE56, 0xFE57, 0xFF01, 0xFF1F, 0xFF61, 0x10A56, 0x10A57, [ 0x10F55, 0x10F59 ], 0x11047, 0x11048, [ 0x110BE, 0x110C1 ], [ 0x11141, 0x11143 ], 0x111C5, 0x111C6, 0x111CD, 0x111DE, 0x111DF, 0x11238, 0x11239, 0x1123B, 0x1123C, 0x112A9, 0x1144B, 0x1144C, 0x115C2, 0x115C3, [ 0x115C9, 0x115D7 ], 0x11641, 0x11642, [ 0x1173C, 0x1173E ], 0x11944, 0x11946, 0x11A42, 0x11A43, 0x11A9B, 0x11A9C, 0x11C41, 0x11C42, 0x11EF7, 0x11EF8, 0x16A6E, 0x16A6F, 0x16AF5, 0x16B37, 0x16B38, 0x16B44, 0x16E98, 0x1BC9F, 0x1DA88 ],\n\t\t\tClose: [ 0x0022, [ 0x0027, 0x0029 ], 0x005B, 0x005D, 0x007B, 0x007D, 0x00AB, 0x00BB, [ 0x0F3A, 0x0F3D ], 0x169B, 0x169C, [ 0x2018, 0x201F ], 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E, 0x208D, 0x208E, [ 0x2308, 0x230B ], 0x2329, 0x232A, [ 0x275B, 0x2760 ], [ 0x2768, 0x2775 ], 0x27C5, 0x27C6, [ 0x27E6, 0x27EF ], [ 0x2983, 0x2998 ], [ 0x29D8, 0x29DB ], 0x29FC, 0x29FD, [ 0x2E00, 0x2E0D ], 0x2E1C, 0x2E1D, [ 0x2E20, 0x2E29 ], 0x2E42, [ 0x3008, 0x3011 ], [ 0x3014, 0x301B ], [ 0x301D, 0x301F ], 0xFD3E, 0xFD3F, 0xFE17, 0xFE18, [ 0xFE35, 0xFE44 ], 0xFE47, 0xFE48, [ 0xFE59, 0xFE5E ], 0xFF08, 0xFF09, 0xFF3B, 0xFF3D, 0xFF5B, 0xFF5D, 0xFF5F, 0xFF60, 0xFF62, 0xFF63, [ 0x1F676, 0x1F678 ] ],\n\t\t\tSContinue: [ 0x002C, 0x002D, 0x003A, 0x055D, 0x060C, 0x060D, 0x07F8, 0x1802, 0x1808, 0x2013, 0x2014, 0x3001, 0xFE10, 0xFE11, 0xFE13, 0xFE31, 0xFE32, 0xFE50, 0xFE51, 0xFE55, 0xFE58, 0xFE63, 0xFF0C, 0xFF0D, 0xFF1A, 0xFF64 ]\n\t\t};\n\t\tconst punctuationPattern = new RegExp(\n\t\t\tunicodeJS.charRangeArrayRegexp( [].concat(\n\t\t\t\tsentenceProperties.ATerm,\n\t\t\t\tsentenceProperties.STerm,\n\t\t\t\tsentenceProperties.Close,\n\t\t\t\tsentenceProperties.SContinue\n\t\t\t) )\n\t\t);\n\t\tlet lastCharacter = insertionPointFragment.adjustLinearSelection( -1, 0 ).getText();\n\t\twhile ( punctuationPattern.test( lastCharacter ) ) {\n\t\t\tinsertionPointFragment = insertionPointFragment.adjustLinearSelection( -1, -1 );\n\t\t\tlastCharacter = insertionPointFragment.adjustLinearSelection( -1, 0 ).getText();\n\t\t}\n\t}\n\treturn insertionPointFragment;\n};\n\nmw.editcheck.editCheckFactory.register( mw.editcheck.AddReferenceEditCheck );\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/editcheck/modules/editchecks/experimental/ConvertReferenceEditCheck.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/editcheck/modules/editchecks/experimental/DisambiguationEditCheck.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/editcheck/modules/editchecks/experimental/ExternalLinksEditCheck.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/editcheck/modules/editchecks/experimental/ImportCopyvioEditCheck.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/editcheck/modules/editchecks/experimental/TextMatchEditCheck.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/editcheck/modules/init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-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/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-mw/api/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-mw/api/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-mw/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-mw/mwlanguagevariant/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-mw/mwlanguagevariant/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-mw/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-wmf/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ve-wmf/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/jsdoc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/eslint-shared.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/modules/ve-mw-collab/ve.init.mw.CollabTarget.init.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":65,"column":3,"nodeType":"CallExpression","endLine":200,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":65,"column":3,"nodeType":"CallExpression","endLine":206,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":189,"column":6,"nodeType":"CallExpression","endLine":193,"endColumn":9}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":12,"column":13,"nodeType":"CallExpression","endLine":12,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":13,"column":22,"nodeType":"CallExpression","endLine":13,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":21,"column":31,"nodeType":"CallExpression","endLine":21,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":22,"column":37,"nodeType":"CallExpression","endLine":22,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":23,"column":38,"nodeType":"CallExpression","endLine":23,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":24,"column":31,"nodeType":"CallExpression","endLine":24,"endColumn":74,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":28,"column":32,"nodeType":"CallExpression","endLine":28,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":30,"column":24,"nodeType":"CallExpression","endLine":30,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":42,"column":3,"nodeType":"CallExpression","endLine":42,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":72,"column":4,"nodeType":"CallExpression","endLine":72,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":77,"column":4,"nodeType":"CallExpression","endLine":77,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":217,"column":4,"nodeType":"CallExpression","endLine":217,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":221,"column":4,"nodeType":"CallExpression","endLine":221,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki CollabTarget init.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n\n( function () {\n\tlet target,\n\t\t$padTab = $( '#ca-pad' );\n\tconst $specialTab = $( '#ca-nstab-special' ),\n\t\tconf = mw.config.get( 'wgVisualEditorConfig' ),\n\t\tpageName = mw.config.get( 'collabPadPageName' ) || '',\n\t\tpageTitle = mw.Title.newFromText( pageName ),\n\t\tmodules = [ OO.ui.isMobile() ? 'ext.visualEditor.collabTarget.mobile' : 'ext.visualEditor.collabTarget.desktop' ]\n\t\t\t// Add modules from $wgVisualEditorPluginModules\n\t\t\t.concat( conf.pluginModules.filter( mw.loader.getState ) ),\n\t\tmodulePromise = mw.loader.using( modules ),\n\t\tprogressBar = OO.ui.infuse( $( '.ve-init-mw-collabTarget-loading' ) ),\n\t\tdocumentNameInput = OO.ui.infuse( $( '.ve-init-mw-collabTarget-nameInput' ) ),\n\t\tdocumentNameButton = OO.ui.infuse( $( '.ve-init-mw-collabTarget-nameButton' ) ),\n\t\timportInput = OO.ui.infuse( $( '.ve-init-mw-collabTarget-importInput' ), {\n\t\t\tshowImages: mw.config.get( 'wgVisualEditorConfig' ).usePageImages,\n\t\t\tshowDescriptions: mw.config.get( 'wgVisualEditorConfig' ).usePageDescriptions\n\t\t} ),\n\t\timportButton = OO.ui.infuse( $( '.ve-init-mw-collabTarget-importButton' ) ),\n\t\t// Infuse the form last to avoid recursive infusion with no config\n\t\tform = OO.ui.infuse( $( '.ve-init-mw-collabTarget-form' ) ),\n\t\t$targetContainer = $(\n\t\t\tdocument.querySelector( '[data-mw-ve-target-container]' ) ||\n\t\t\tdocument.getElementById( 'content' )\n\t\t);\n\n\tif ( !VisualEditorSupportCheck() ) {\n\t\t// VE not supported - say something?\n\t\treturn;\n\t}\n\n\tfunction setTitle( title ) {\n\t\t$( '#firstHeading' ).text( title );\n\t\tdocument.title = title;\n\t}\n\n\tfunction showPage( title, importTitle ) {\n\t\tconst specialTitle = mw.Title.newFromText( 'Special:CollabPad/' + title.toString() );\n\n\t\tsetTitle( mw.msg( 'collabpad-doctitle', title.getPrefixedText() ) );\n\n\t\tmw.config.set( 'wgRelevantPageName', specialTitle.getPrefixedText() );\n\t\tmw.config.set( 'wgPageName', specialTitle.getPrefixedText() );\n\t\tif ( !$padTab.length ) {\n\t\t\t$padTab = $( '<li>' ).attr( 'id', 'ca-pad' ).addClass( 'selected' ).append(\n\t\t\t\t$( '<span>' ).append(\n\t\t\t\t\t$( '<a>' ).attr( 'href', '' ).text( title.getPrefixedText() )\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\t$padTab.insertAfter( $specialTab.removeClass( 'selected' ) );\n\n\t\tprogressBar.toggle( true );\n\t\tform.toggle( false );\n\n\t\tmodulePromise.done( () => {\n\t\t\ttarget = ve.init.mw.targetFactory.create( 'collab', title, conf.rebaserUrl, { importTitle: importTitle } );\n\t\t\t// If the target emits a 'close' event (via the toolbar back button on mobile) then go to the landing page.\n\t\t\ttarget.once( 'close', () => {\n\t\t\t\tshowForm( true );\n\t\t\t} );\n\n\t\t\t$( 'html' ).addClass( 've-activated ve-active' );\n\n\t\t\t$targetContainer.prepend( target.$element );\n\n\t\t\ttarget.transformPage();\n\t\t\t$( '#firstHeading' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\n\t\t\t// Add a dummy surface while the doc is loading\n\t\t\tconst dummySurface = target.addSurface( ve.dm.converter.getModelFromDom( ve.createDocumentFromHtml( '' ) ) );\n\t\t\tdummySurface.setReadOnly( true );\n\n\t\t\t// TODO: Create the correct model surface type (ve.ui.Surface#createModel)\n\t\t\tlet surfaceModel = new ve.dm.Surface( ve.dm.converter.getModelFromDom( ve.createDocumentFromHtml( '' ) ) );\n\t\t\tconst username = mw.user.getName();\n\t\t\tsurfaceModel.createSynchronizer(\n\t\t\t\tmw.config.get( 'wgWikiID' ) + '/' + title.toString(),\n\t\t\t\t{\n\t\t\t\t\tserver: conf.rebaserUrl,\n\t\t\t\t\t// TODO: server could communicate with MW (via oauth?) to know the\n\t\t\t\t\t// current-user's name. Disable changing name if logged in?\n\t\t\t\t\t// Communicate an I-am-a-valid-user flag to other clients?\n\t\t\t\t\tdefaultName: username\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tconst progressDeferred = ve.createDeferred();\n\t\t\tdummySurface.createProgress( progressDeferred.promise(), ve.msg( 'visualeditor-rebase-client-connecting' ), true );\n\n\t\t\tsurfaceModel.synchronizer.once( 'initDoc', ( error ) => {\n\t\t\t\tlet initPromise;\n\n\t\t\t\tprogressDeferred.resolve();\n\t\t\t\t// Resolving the progress bar doesn't close the window in this cycle,\n\t\t\t\t// so wait until we call clearSurfaces which destroys the window manager.\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\ttarget.clearSurfaces();\n\t\t\t\t\t// Don't add the surface until the history has been applied\n\t\t\t\t\ttarget.addSurface( surfaceModel );\n\t\t\t\t\tif ( error ) {\n\t\t\t\t\t\tconst $errorMsg = ve.htmlMsg( 'visualeditor-rebase-corrupted-document-error', $( '<pre>' ).text( error.stack ) );\n\t\t\t\t\t\tOO.ui.alert(\n\t\t\t\t\t\t\t$( '<p>' ).append( $errorMsg ),\n\t\t\t\t\t\t\t{ title: ve.msg( 'visualeditor-rebase-corrupted-document-title' ), size: 'large' }\n\t\t\t\t\t\t).then( () => {\n\t\t\t\t\t\t\tshowForm( true );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttarget.once( 'surfaceReady', () => {\n\t\t\t\t\t\tinitPromise.then( () => {\n\t\t\t\t\t\t\ttarget.getSurface().getView().selectFirstSelectableContentOffset();\n\t\t\t\t\t\t\tconst isNewAuthor = !ve.init.platform.sessionStorage.get( 've-collab-author' );\n\t\t\t\t\t\t\t// For new anon users, open the author list so they can set their name\n\t\t\t\t\t\t\tif ( isNewAuthor && !username ) {\n\t\t\t\t\t\t\t\t// Something (an animation?) steals focus during load, so wait a bit\n\t\t\t\t\t\t\t\t// before opening and focusing the authorList.\n\t\t\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\t\t\ttarget.toolbar.tools.authorList.onSelect();\n\t\t\t\t\t\t\t\t}, 500 );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( target.importTitle && !surfaceModel.getDocument().getCompleteHistoryLength() ) {\n\t\t\t\t\t\tinitPromise = mw.libs.ve.targetLoader.requestParsoidData( target.importTitle.toString(), { targetName: 'collabpad' } ).then( ( response ) => {\n\t\t\t\t\t\t\tconst data = response.visualeditor;\n\n\t\t\t\t\t\t\tif ( data && data.content ) {\n\t\t\t\t\t\t\t\tconst doc = target.constructor.static.parseDocument( data.content );\n\t\t\t\t\t\t\t\tconst dmDoc = target.constructor.static.createModelFromDom( doc );\n\t\t\t\t\t\t\t\tconst fragment = surfaceModel.getLinearFragment( new ve.Range( 0, 2 ) );\n\t\t\t\t\t\t\t\tfragment.insertDocument( dmDoc );\n\n\t\t\t\t\t\t\t\ttarget.etag = data.etag;\n\t\t\t\t\t\t\t\ttarget.baseTimeStamp = data.basetimestamp;\n\t\t\t\t\t\t\t\ttarget.startTimeStamp = data.starttimestamp;\n\t\t\t\t\t\t\t\ttarget.revid = data.oldid;\n\n\t\t\t\t\t\t\t\t// Store the document metadata as a hidden meta item\n\t\t\t\t\t\t\t\tfragment.collapseToEnd().insertContent( [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttype: 'alienMeta',\n\t\t\t\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t\t\t\timportedDocument: {\n\t\t\t\t\t\t\t\t\t\t\t\ttitle: target.importTitle.toString(),\n\t\t\t\t\t\t\t\t\t\t\t\tetag: target.etag,\n\t\t\t\t\t\t\t\t\t\t\t\tbaseTimeStamp: target.baseTimeStamp,\n\t\t\t\t\t\t\t\t\t\t\t\tstartTimeStamp: target.startTimeStamp,\n\t\t\t\t\t\t\t\t\t\t\t\trevid: target.revid\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{ type: '/alienMeta' }\n\t\t\t\t\t\t\t\t] );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Import failed\n\t\t\t\t\t\t\t\treturn ve.createDeferred().reject( 'No content for ' + target.importTitle ).promise();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No import, or history already exists\n\t\t\t\t\t\tinitPromise = ve.createDeferred().resolve().promise();\n\n\t\t\t\t\t\t// Look for import metadata in document\n\t\t\t\t\t\tsurfaceModel = target.getSurface().getModel();\n\t\t\t\t\t\tconst importedDocumentItem = surfaceModel.getDocument().getMetaList().getItemsInGroup( 'misc' ).find(\n\t\t\t\t\t\t\t( item ) => item.getAttribute( 'importedDocument' )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( importedDocumentItem ) {\n\t\t\t\t\t\t\tconst importedDocument = importedDocumentItem.getAttribute( 'importedDocument' );\n\t\t\t\t\t\t\ttarget.importTitle = mw.Title.newFromText( importedDocument.title );\n\t\t\t\t\t\t\ttarget.etag = importedDocument.etag;\n\t\t\t\t\t\t\ttarget.baseTimeStamp = importedDocument.baseTimeStamp;\n\t\t\t\t\t\t\ttarget.startTimeStamp = importedDocument.startTimeStamp;\n\t\t\t\t\t\t\ttarget.revid = importedDocument.revid;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tinitPromise.fail( ( err ) => {\n\t\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\t\tthrow new Error( err );\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\t\t\t\t\tinitPromise.always( () => {\n\t\t\t\t\t\tprogressDeferred.resolve();\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t} ).always( () => {\n\t\t\tform.toggle( false );\n\t\t\tprogressBar.toggle( false );\n\t\t} ).fail( ( err ) => {\n\t\t\tmw.log.error( err );\n\t\t\tshowForm( true );\n\t\t} );\n\t}\n\n\tfunction showForm( pushState ) {\n\t\tconst specialTitle = mw.Title.newFromText( 'Special:CollabPad' );\n\n\t\tif ( pushState ) {\n\t\t\thistory.pushState( { tag: 'collabTarget' }, '', specialTitle.getUrl() );\n\t\t}\n\n\t\tif ( target ) {\n\t\t\t$( '#firstHeading' ).removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t\ttarget.restorePage();\n\t\t\ttarget.destroy();\n\n\t\t\t$( 'html' ).removeClass( 've-activated ve-active' );\n\t\t}\n\n\t\tsetTitle( mw.msg( 'collabpad' ) );\n\t\tmw.config.set( 'wgRelevantPageName', specialTitle.getPrefixedText() );\n\t\tmw.config.set( 'wgPageName', specialTitle.getPrefixedText() );\n\t\tif ( $padTab ) {\n\t\t\t$padTab.detach();\n\t\t}\n\t\t$specialTab.addClass( 'selected' );\n\n\t\tprogressBar.toggle( false );\n\t\tform.toggle( true );\n\t}\n\n\tfunction loadTitle( title, importTitle ) {\n\t\tconst specialTitle = mw.Title.newFromText( 'Special:CollabPad/' + title.toString() );\n\t\t// TODO: Handle popstate\n\t\thistory.pushState( { tag: 'collabTarget', title: title.toString() }, '', specialTitle.getUrl() );\n\t\tshowPage( title, importTitle );\n\t}\n\n\tfunction getRandomTitle() {\n\t\treturn ve.init.platform.generateUniqueId();\n\t}\n\n\tfunction onNameChange() {\n\t\tdocumentNameInput.getValidity().then( () => {\n\t\t\tdocumentNameButton.setDisabled( false );\n\t\t}, () => {\n\t\t\tdocumentNameButton.setDisabled( true );\n\t\t} );\n\t}\n\n\tfunction loadFromName() {\n\t\tdocumentNameInput.getValidity().then( () => {\n\t\t\tconst title = mw.Title.newFromText(\n\t\t\t\tdocumentNameInput.getValue().trim() || getRandomTitle()\n\t\t\t);\n\n\t\t\tif ( title ) {\n\t\t\t\tloadTitle( title );\n\t\t\t} else {\n\t\t\t\tdocumentNameInput.focus();\n\t\t\t}\n\t\t} );\n\t}\n\n\t// Empty input will create a random document name, otherwise must be valid\n\tdocumentNameInput.setValidation( ( value ) => value === '' || !!mw.Title.newFromText( value ) );\n\tdocumentNameButton.setDisabled( false );\n\n\tdocumentNameInput.on( 'change', onNameChange );\n\tdocumentNameInput.on( 'enter', loadFromName );\n\tdocumentNameButton.on( 'click', loadFromName );\n\tonNameChange();\n\n\tfunction onImportChange() {\n\t\timportInput.getValidity().then( () => {\n\t\t\timportButton.setDisabled( false );\n\t\t}, () => {\n\t\t\timportButton.setDisabled( true );\n\t\t} );\n\t}\n\n\tfunction onImportSubmit() {\n\t\timportInput.getValidity().then( () => {\n\t\t\tconst title = mw.Title.newFromText( importInput.getValue().trim() );\n\n\t\t\tif ( title ) {\n\t\t\t\tloadTitle( mw.Title.newFromText( getRandomTitle() ), title );\n\t\t\t} else {\n\t\t\t\tdocumentNameInput.focus();\n\t\t\t}\n\t\t} );\n\t}\n\n\t// TODO: Check page exists?\n\timportInput.setValidation( ( value ) => !!mw.Title.newFromText( value ) );\n\timportInput.on( 'change', onImportChange );\n\timportInput.on( 'enter', onImportSubmit );\n\timportButton.on( 'click', onImportSubmit );\n\tonImportChange();\n\n\tif ( pageTitle ) {\n\t\tconst url = new URL( location.href ),\n\t\t\timportTitleText = url.searchParams.get( 'import' ),\n\t\t\timportTitleParam = ( importTitleText ? mw.Title.newFromText( importTitleText ) : null );\n\t\tshowPage( pageTitle, importTitleParam );\n\t} else {\n\t\tshowForm();\n\t}\n\n\t$specialTab.on( 'click', ( e ) => {\n\t\tshowForm( true );\n\t\te.preventDefault();\n\t} );\n\n\t// Tag current state\n\thistory.replaceState( { tag: 'collabTarget', title: pageName }, '', location.href );\n\twindow.addEventListener( 'popstate', ( e ) => {\n\t\tif ( e.state && e.state.tag === 'collabTarget' ) {\n\t\t\tif ( e.state.title ) {\n\t\t\t\tshowPage( mw.Title.newFromText( e.state.title ) );\n\t\t\t} else {\n\t\t\t\tshowForm();\n\t\t\t}\n\t\t}\n\t} );\n}() );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw-collab/ve.init.mw.CollabTarget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":44,"column":26,"nodeType":"CallExpression","endLine":44,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw-collab/ve.init.mw.DesktopCollabTarget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":27,"column":26,"nodeType":"CallExpression","endLine":27,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":48,"column":3,"nodeType":"CallExpression","endLine":48,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":48,"column":3,"nodeType":"CallExpression","endLine":53,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":54,"column":30,"nodeType":"CallExpression","endLine":54,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":56,"column":3,"nodeType":"CallExpression","endLine":56,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":65,"column":2,"nodeType":"CallExpression","endLine":65,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw-collab/ve.init.mw.MobileCollabTarget.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/modules/ve-mw-collab/ve.init.mw.collab.init.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-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/modules/ve-mw-collab/ve.ui.MWExportWikitextDialog.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/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.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/modules/ve-mw/ce/annotations/ve.ce.MWInternalLinkAnnotation.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":59,"column":13,"nodeType":"CallExpression","endLine":59,"endColumn":43,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ce/annotations/ve.ce.MWNowikiAnnotation.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/modules/ve-mw/ce/nodes/ve.ce.MWAlienAnnotationNode.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/modules/ve-mw/ce/nodes/ve.ce.MWAlienBlockExtensionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWAlienExtensionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWAlienInlineExtensionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWAnnotationNode.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/modules/ve-mw/ce/nodes/ve.ce.MWBlockExtensionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWBlockImageNode.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":122,"column":3,"nodeType":"CallExpression","endLine":124,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":122,"column":3,"nodeType":"CallExpression","endLine":123,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":132,"column":2,"nodeType":"CallExpression","endLine":132,"endColumn":38,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":248,"column":5,"nodeType":"CallExpression","endLine":250,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":248,"column":5,"nodeType":"CallExpression","endLine":249,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWEntityNode.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/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":79,"column":15,"nodeType":"CallExpression","endLine":80,"endColumn":55},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":79,"column":15,"nodeType":"CallExpression","endLine":81,"endColumn":53}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWExtensionNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki extension node.\n *\n * Configuration options for .update():\n * - extsrc: override the contents of the tag (string)\n * - attrs: override the attributes of the tag (object)\n *\n * @class\n * @abstract\n * @extends ve.ce.LeafNode\n * @mixes ve.ce.FocusableNode\n * @mixes ve.ce.GeneratedContentNode\n *\n * @constructor\n */\nve.ce.MWExtensionNode = function VeCeMWExtensionNode() {\n\t// Parent constructor\n\tve.ce.MWExtensionNode.super.apply( this, arguments );\n\n\t// Mixin constructors\n\tve.ce.FocusableNode.call( this, this.getFocusableElement() );\n\tve.ce.GeneratedContentNode.call( this );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWExtensionNode, ve.ce.LeafNode );\nOO.mixinClass( ve.ce.MWExtensionNode, ve.ce.FocusableNode );\nOO.mixinClass( ve.ce.MWExtensionNode, ve.ce.GeneratedContentNode );\n\n/* Static properties */\n\n/**\n * Extension renders visible content when empty\n *\n * @static\n * @property {boolean}\n * @inheritable\n */\nve.ce.MWExtensionNode.static.rendersEmpty = false;\n\nve.ce.MWExtensionNode.static.iconWhenInvisible = 'markup';\n\nve.ce.MWExtensionNode.static.getDescription = function ( model ) {\n\tconst body = ve.getProp( model.getAttribute( 'mw' ), 'body', 'extsrc' ) || '';\n\treturn body.slice( 0, 100 ) + ( body.length > 100 ? '…' : '' );\n};\n\n/* Methods */\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWExtensionNode.prototype.generateContents = function ( config ) {\n\tconst deferred = ve.createDeferred(),\n\t\tmwData = ve.copy( this.getModel().getAttribute( 'mw' ) ),\n\t\textsrc = config && config.extsrc !== undefined ? config.extsrc : ( ve.getProp( mwData, 'body', 'extsrc' ) || '' ),\n\t\tattrs = config && config.attrs || mwData.attrs,\n\t\ttagName = this.getModel().getExtensionName();\n\n\t// undefined means omit the attribute, not convert it to string 'undefined'\n\tfor ( const attr in attrs ) {\n\t\tif ( attrs[ attr ] === undefined ) {\n\t\t\tdelete attrs[ attr ];\n\t\t}\n\t}\n\n\t// XML-like tags in wikitext are not actually XML and don't expect their contents to be escaped.\n\tconst wikitext = mw.html.element( tagName, attrs, new mw.html.Raw( extsrc ) );\n\n\tif ( this.constructor.static.rendersEmpty || extsrc.trim() !== '' ) {\n\t\tconst xhr = ve.init.target.parseWikitextFragment( wikitext, false, this.getModel().getDocument() )\n\t\t\t.done( this.onParseSuccess.bind( this, deferred ) )\n\t\t\t.fail( this.onParseError.bind( this, deferred ) );\n\t\treturn deferred.promise( { abort: xhr.abort } );\n\t} else {\n\t\tdeferred.resolve( $( '<span>' ).text( '\\u00a0' ).get() );\n\t\treturn deferred.promise();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWExtensionNode.prototype.getRenderedDomElements = function () {\n\t// Parent method\n\tconst elements = ve.ce.GeneratedContentNode.prototype.getRenderedDomElements.apply( this, arguments );\n\n\tif ( this.getModelHtmlDocument() ) {\n\t\tve.init.platform.linkCache.styleParsoidElements(\n\t\t\t$( elements ),\n\t\t\tthis.getModelHtmlDocument()\n\t\t);\n\t}\n\treturn elements;\n};\n\n/**\n * Handle a successful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The Deferred object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWExtensionNode.prototype.onParseSuccess = function ( deferred, response ) {\n\tconst data = response.visualeditor,\n\t\tcontentNodes = $( data.content ).get();\n\tdeferred.resolve( contentNodes );\n};\n\nve.ce.MWExtensionNode.prototype.afterRender = function () {\n\tconst $images = this.$element\n\t\t.find( 'img:not([width]),img:not([height])' )\n\t\t.addBack( 'img:not([width]),img:not([height])' );\n\n\t// Mixin method\n\tve.ce.GeneratedContentNode.prototype.afterRender.call( this );\n\n\t// Images missing a dimension change size after load\n\t// TODO: Ignore images which have dimensions defined in CSS, if performant\n\tif ( $images.length ) {\n\t\t$images.on( 'load', () => {\n\t\t\t// Mixin method\n\t\t\tve.ce.GeneratedContentNode.prototype.afterRender.call( this );\n\t\t} );\n\t}\n};\n\n/**\n * Handle an unsuccessful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The promise object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWExtensionNode.prototype.onParseError = function ( deferred ) {\n\tdeferred.reject();\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWGalleryCaptionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWGalleryImageCaptionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWGalleryImageNode.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/modules/ve-mw/ce/nodes/ve.ce.MWGalleryNode.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":120,"column":3,"nodeType":"CallExpression","endLine":122,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":120,"column":3,"nodeType":"CallExpression","endLine":121,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWHeadingNode.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/modules/ve-mw/ce/nodes/ve.ce.MWImageCaptionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":119,"column":14,"nodeType":"CallExpression","endLine":128,"endColumn":54},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":119,"column":14,"nodeType":"CallExpression","endLine":129,"endColumn":52}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWImageNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki image node.\n *\n * @class\n * @abstract\n * @extends ve.ce.GeneratedContentNode\n * @mixes ve.ce.FocusableNode\n * @mixes ve.ce.MWResizableNode\n *\n * @constructor\n * @param {jQuery} $focusable Focusable part of the node\n * @param {jQuery} $image Image part of the node\n * @param {Object} [config] Configuration options\n */\nve.ce.MWImageNode = function VeCeMWImageNode( $focusable, $image, config ) {\n\tconfig = ve.extendObject( {\n\t\tenforceMax: false,\n\t\tminDimensions: { width: 1, height: 1 },\n\t\t$bounding: this.$element\n\t}, config );\n\n\t// Properties\n\tthis.$image = $image;\n\t// Parent constructor triggers render so this must precede it\n\tthis.renderedDimensions = null;\n\n\t// Parent constructor\n\tve.ce.GeneratedContentNode.call( this );\n\n\t// Mixin constructors\n\tve.ce.FocusableNode.call( this, $focusable, config );\n\tve.ce.MWResizableNode.call( this, this.$image, config );\n\n\t// Events\n\tthis.model.connect( this, { attributeChange: 'onAttributeChange' } );\n\n\t// Initialization\n\tthis.updateMediaType();\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWImageNode, ve.ce.GeneratedContentNode );\n\nOO.mixinClass( ve.ce.MWImageNode, ve.ce.FocusableNode );\n\n// Need to mixin base class as well (T92540)\nOO.mixinClass( ve.ce.MWImageNode, ve.ce.ResizableNode );\n\nOO.mixinClass( ve.ce.MWImageNode, ve.ce.MWResizableNode );\n\n/* Static Properties */\n\nve.ce.MWImageNode.static.primaryCommandName = 'media';\n\n/* Static Methods */\n\n/**\n * @inheritdoc ve.ce.Node\n */\nve.ce.MWImageNode.static.getDescription = function ( model ) {\n\tconst title = new mw.Title( model.getFilename() );\n\treturn title.getMainText();\n};\n\n/* Methods */\n\n/**\n * Update the rendering of the 'align', src', 'width' and 'height' attributes\n * when they change in the model.\n *\n * @param {string} key Attribute key\n * @param {string} from Old value\n * @param {string} to New value\n */\nve.ce.MWImageNode.prototype.onAttributeChange = function () {\n\tthis.update();\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWImageNode.prototype.onGeneratedContentNodeUpdate = function () {\n\t// Do nothing to avoid re-rendering every time the caption is changed.\n\t// Call update inside onAttributeChange instead.\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWImageNode.prototype.generateContents = function () {\n\tconst model = this.getModel(),\n\t\theight = model.getAttribute( 'height' ),\n\t\tmwData = model.getAttribute( 'mw' ) || {},\n\t\tdeferred = ve.createDeferred();\n\tlet width = model.getAttribute( 'width' );\n\n\t// If the current rendering is larger don't fetch a new image, just let the browser resize\n\tif ( this.renderedDimensions && this.renderedDimensions.width > width ) {\n\t\treturn deferred.reject().promise();\n\t}\n\n\tlet params;\n\tif ( mwData.thumbtime !== undefined ) {\n\t\tparams = 'seek=' + mwData.thumbtime;\n\t} else if ( mwData.page !== undefined ) {\n\t\tparams = 'page' + mwData.page + '-' + width + 'px';\n\t\t// Don't send width twice\n\t\twidth = undefined;\n\t}\n\n\tconst xhr = ve.init.target.getContentApi( this.getModel().getDocument() ).get( {\n\t\taction: 'query',\n\t\tprop: 'imageinfo',\n\t\tiiprop: 'url',\n\t\tiiurlwidth: width,\n\t\tiiurlheight: height,\n\t\tiiurlparam: params,\n\t\ttitles: this.getModel().getFilename()\n\t} )\n\t\t.done( this.onParseSuccess.bind( this, deferred ) )\n\t\t.fail( this.onParseError.bind( this, deferred ) );\n\n\treturn deferred.promise( { abort: xhr.abort } );\n};\n\n/**\n * Handle a successful response from the parser for the image src.\n *\n * @param {jQuery.Deferred} deferred The Deferred object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWImageNode.prototype.onParseSuccess = function ( deferred, response ) {\n\tconst thumburl = ve.getProp( response.query.pages[ 0 ], 'imageinfo', 0, 'thumburl' );\n\tif ( thumburl ) {\n\t\tdeferred.resolve( thumburl );\n\t} else {\n\t\tdeferred.reject();\n\t}\n};\n\n/**\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWImageNode.prototype.render = function ( generatedContents ) {\n\tthis.$image.attr( 'src', generatedContents );\n\t// As we only re-render when the image is larger than last rendered size\n\t// this will always be the largest ever rendering\n\tthis.renderedDimensions = ve.copy( this.model.getScalable().getCurrentDimensions() );\n\tif ( this.live ) {\n\t\tthis.afterRender();\n\t}\n};\n\n/**\n * Handle an unsuccessful response from the parser for the image src.\n *\n * @param {jQuery.Deferred} deferred The promise object created by generateContents\n * @param {Object} response Response data\n */\nve.ce.MWImageNode.prototype.onParseError = function ( deferred ) {\n\tdeferred.reject();\n};\n\n/**\n * Update rendering when media type changes\n */\nve.ce.MWImageNode.prototype.updateMediaType = function () {\n\tthis.$image.toggleClass( 've-ce-mwImageNode-audioPlayer', this.model.getMediaType() === 'AUDIO' );\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ce/nodes/ve.ce.MWIncludesNode.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/modules/ve-mw/ce/nodes/ve.ce.MWInlineExtensionNode.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/modules/ve-mw/ce/nodes/ve.ce.MWInlineImageNode.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/modules/ve-mw/ce/nodes/ve.ce.MWLanguageVariantBlockNode.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/modules/ve-mw/ce/nodes/ve.ce.MWLanguageVariantHiddenNode.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/modules/ve-mw/ce/nodes/ve.ce.MWLanguageVariantInlineNode.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/modules/ve-mw/ce/nodes/ve.ce.MWLanguageVariantNode.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/modules/ve-mw/ce/nodes/ve.ce.MWMagicLinkNode.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/modules/ve-mw/ce/nodes/ve.ce.MWNumberedExternalLinkNode.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/modules/ve-mw/ce/nodes/ve.ce.MWPreNode.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/modules/ve-mw/ce/nodes/ve.ce.MWPreformattedNode.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/modules/ve-mw/ce/nodes/ve.ce.MWSignatureNode.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/modules/ve-mw/ce/nodes/ve.ce.MWTableNode.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/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionBlockNode.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/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionInlineNode.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/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":176,"column":14,"nodeType":"CallExpression","endLine":181,"endColumn":54},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":176,"column":14,"nodeType":"CallExpression","endLine":182,"endColumn":52}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor ContentEditable MWTransclusionNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * ContentEditable MediaWiki transclusion node.\n *\n * @class\n * @abstract\n * @extends ve.ce.LeafNode\n * @mixes ve.ce.GeneratedContentNode\n * @mixes ve.ce.FocusableNode\n *\n * @constructor\n * @param {ve.dm.MWTransclusionNode} model Model to observe\n * @param {Object} [config] Configuration options\n */\nve.ce.MWTransclusionNode = function VeCeMWTransclusionNode( model, config ) {\n\t// Parent constructor\n\tve.ce.MWTransclusionNode.super.call( this, model, config );\n\n\t// Mixin constructors\n\tve.ce.GeneratedContentNode.call( this );\n\tve.ce.FocusableNode.call( this );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ce.MWTransclusionNode, ve.ce.LeafNode );\n\nOO.mixinClass( ve.ce.MWTransclusionNode, ve.ce.GeneratedContentNode );\nOO.mixinClass( ve.ce.MWTransclusionNode, ve.ce.FocusableNode );\n\n/* Static Properties */\n\nve.ce.MWTransclusionNode.static.name = 'mwTransclusion';\n\nve.ce.MWTransclusionNode.static.primaryCommandName = 'transclusion';\n\nve.ce.MWTransclusionNode.static.iconWhenInvisible = 'puzzle';\n\n/* Static Methods */\n\n/**\n * Get a plain text description of the template parts in a transclusion node, excluding raw wikitext\n * snippets.\n *\n * @static\n * @param {ve.dm.MWTransclusionNode} model\n * @return {string} Comma-separated list of template names\n */\nve.ce.MWTransclusionNode.static.getDescription = function ( model ) {\n\treturn model.getPartsList()\n\t\t.map( ( part ) => {\n\t\t\tif ( part.templatePage ) {\n\t\t\t\treturn mw.Title.newFromText( part.templatePage )\n\t\t\t\t\t.getRelativeText( mw.config.get( 'wgNamespaceIds' ).template );\n\t\t\t}\n\t\t\t// Not actually a template, but e.g. a parser function\n\t\t\treturn part.template || '';\n\t\t} )\n\t\t.filter( ( desc ) => desc )\n\t\t.join( ve.msg( 'comma-separator' ) );\n};\n\n/**\n * Get a formatted description of the template parts in a transclusion node, excluding raw wikitext\n * snippets.\n *\n * Like #getDescription, but parts generated from templates are linked to\n * those templates\n *\n * @static\n * @param {ve.dm.MWTransclusionNode} model\n * @return {HTMLElement} DOM node with comma-separated list of template names\n */\nve.ce.MWTransclusionNode.static.getDescriptionDom = function ( model ) {\n\tconst nodes = model.getPartsList()\n\t\t.map( ( part ) => {\n\t\t\tif ( part.templatePage ) {\n\t\t\t\tconst title = mw.Title.newFromText( part.templatePage );\n\t\t\t\tconst link = document.createElement( 'a' );\n\t\t\t\tlink.textContent = title.getRelativeText( mw.config.get( 'wgNamespaceIds' ).template );\n\t\t\t\tlink.setAttribute( 'href', title.getUrl() );\n\t\t\t\treturn link;\n\t\t\t}\n\t\t\t// Not actually a template, but e.g. a parser function\n\t\t\treturn part.template ? document.createTextNode( part.template ) : null;\n\t\t} )\n\t\t.filter( ( desc ) => desc );\n\tconst span = document.createElement( 'span' );\n\tnodes.forEach( ( node, i ) => {\n\t\tif ( i ) {\n\t\t\tspan.appendChild( document.createTextNode( ve.msg( 'comma-separator' ) ) );\n\t\t}\n\t\tspan.appendChild( node );\n\t} );\n\tve.targetLinksToNewWindow( span );\n\treturn span;\n};\n\n/**\n * Filter rendering to remove auto-generated content and wrappers\n *\n * @static\n * @param {Node[]} contentNodes Rendered nodes\n * @return {Node[]} Filtered rendered nodes\n */\nve.ce.MWTransclusionNode.static.filterRendering = function ( contentNodes ) {\n\tif ( !contentNodes.length ) {\n\t\treturn [];\n\t}\n\n\tconst whitespaceRegex = new RegExp( '^[' + ve.dm.Converter.static.whitespaceList + ']+$' );\n\n\t// Filter out auto-generated items, e.g. reference lists\n\tcontentNodes = contentNodes.filter( ( node ) => {\n\t\tconst dataMw = node &&\n\t\t\tnode.nodeType === Node.ELEMENT_NODE &&\n\t\t\tnode.hasAttribute( 'data-mw' ) &&\n\t\t\tJSON.parse( node.getAttribute( 'data-mw' ) );\n\n\t\treturn !dataMw || !dataMw.autoGenerated;\n\t} );\n\n\tcontentNodes.forEach( ( node ) => {\n\t\tif ( node.nodeType === Node.ELEMENT_NODE ) {\n\t\t\tmw.libs.ve.stripParsoidFallbackIds( node );\n\t\t}\n\t} );\n\n\tfunction isWhitespaceNode( node ) {\n\t\treturn node && node.nodeType === Node.TEXT_NODE && whitespaceRegex.test( node.data );\n\t}\n\n\twhile ( isWhitespaceNode( contentNodes[ 0 ] ) ) {\n\t\tcontentNodes.shift();\n\t}\n\twhile ( isWhitespaceNode( contentNodes[ contentNodes.length - 1 ] ) ) {\n\t\tcontentNodes.pop();\n\t}\n\t// HACK: if $content consists of a single paragraph, unwrap it.\n\t// We have to do this because the parser wraps everything in <p>s, and inline templates\n\t// will render strangely when wrapped in <p>s.\n\tif ( contentNodes.length === 1 && contentNodes[ 0 ].nodeName.toLowerCase() === 'p' ) {\n\t\tcontentNodes = Array.prototype.slice.call( contentNodes[ 0 ].childNodes );\n\t}\n\treturn contentNodes;\n};\n\n/* Methods */\n\n/** @inheritDoc */\nve.ce.MWTransclusionNode.prototype.executeCommand = function () {\n\tconst contextItems = this.focusableSurface.getSurface().getContext().items;\n\tconst transclusionContextItem = contextItems.find( ( contextItem ) => contextItem instanceof ve.ui.MWTransclusionContextItem );\n\tif ( transclusionContextItem ) {\n\t\t// Utilize the context item when it's there instead of triggering the command manually.\n\t\t// Required to make the context item show the \"Loading…\" message (see T297773).\n\t\ttransclusionContextItem.onEditButtonClick();\n\t\treturn;\n\t}\n\n\t// Parent method\n\tve.ce.FocusableNode.prototype.executeCommand.apply( this, arguments );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.generateContents = function ( config ) {\n\tconst deferred = ve.createDeferred();\n\tconst xhr = ve.init.target.parseWikitextFragment(\n\t\t( config && config.wikitext ) || this.model.getWikitext(),\n\t\ttrue,\n\t\tthis.getModel().getDocument()\n\t)\n\t\t.done( this.onParseSuccess.bind( this, deferred ) )\n\t\t.fail( this.onParseError.bind( this, deferred ) );\n\n\treturn deferred.promise( { abort: xhr.abort } );\n};\n\n/**\n * Handle a successful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The Deferred object created by #generateContents\n * @param {Object} response Response data\n */\nve.ce.MWTransclusionNode.prototype.onParseSuccess = function ( deferred, response ) {\n\tif ( ve.getProp( response, 'visualeditor', 'result' ) !== 'success' ) {\n\t\tthis.onParseError( deferred );\n\t\treturn;\n\t}\n\n\t// Work around https://github.com/jquery/jquery/issues/1997\n\tconst contentNodes = $.parseHTML( response.visualeditor.content, this.model && this.getModelHtmlDocument() ) || [];\n\tdeferred.resolve( this.constructor.static.filterRendering( contentNodes ) );\n};\n\n/**\n * Extend the ve.ce.GeneratedContentNode render method to check for hidden templates.\n *\n * Check if the final result of the imported template is empty.\n *\n * @inheritdoc ve.ce.GeneratedContentNode\n */\nve.ce.MWTransclusionNode.prototype.render = function ( generatedContents ) {\n\t// Call parent mixin\n\tve.ce.GeneratedContentNode.prototype.render.call( this, generatedContents );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.onSetup = function () {\n\t// Parent method\n\tve.ce.MWTransclusionNode.super.prototype.onSetup.apply( this, arguments );\n\n\t// Render replaces this.$element with a new node so re-add classes\n\tthis.$element.addClass( 've-ce-mwTransclusionNode' );\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.getRenderedDomElements = function () {\n\t// Parent method\n\tconst elements = ve.ce.GeneratedContentNode.prototype.getRenderedDomElements.apply( this, arguments );\n\n\tif ( this.model && this.getModelHtmlDocument() ) {\n\t\tve.init.platform.linkCache.styleParsoidElements(\n\t\t\t$( elements ),\n\t\t\tthis.getModelHtmlDocument()\n\t\t);\n\t}\n\treturn elements;\n};\n\n/**\n * @inheritdoc\n */\nve.ce.MWTransclusionNode.prototype.filterRenderedDomElements = function ( domElements ) {\n\t// We want to remove all styles and links which aren't from TemplateStyles.\n\tconst selector = 'style:not([data-mw-deduplicate^=\"TemplateStyles:\"]), link:not([rel~=\"mw-deduplicated-inline-style\"][href^=\"mw-data:TemplateStyles:\"])';\n\treturn $( domElements ).find( selector ).addBack( selector ).remove().end().end().toArray();\n};\n\n/**\n * Handle an unsuccessful response from the parser for the wikitext fragment.\n *\n * @param {jQuery.Deferred} deferred The promise object created by #generateContents\n * @param {Object} response Response data\n */\nve.ce.MWTransclusionNode.prototype.onParseError = function ( deferred ) {\n\tdeferred.reject();\n};\n\n/* Registration */\n\nve.ce.nodeFactory.register( ve.ce.MWTransclusionNode );\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/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionTableCellNode.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/modules/ve-mw/ce/ve.ce.MWResizableNode.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/modules/ve-mw/ce/ve.ce.MWWikitextClipboardHandler.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/modules/ve-mw/ce/ve.ce.MWWikitextSurface.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/modules/ve-mw/dm/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.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/modules/ve-mw/dm/annotations/ve.dm.MWInternalLinkAnnotation.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/modules/ve-mw/dm/annotations/ve.dm.MWNowikiAnnotation.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/modules/ve-mw/dm/metaitems/ve.dm.MWAlienMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWCategoryMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWDefaultSortMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWDisplayTitleMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWHiddenCategoryMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWIndexMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWLanguageMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWNewSectionEditMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWNoContentConvertMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWNoEditSectionMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWNoGalleryMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWNoTitleConvertMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWRedirectMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWStaticRedirectMetaItem.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/modules/ve-mw/dm/metaitems/ve.dm.MWTOCMetaItem.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/modules/ve-mw/dm/models/ve.dm.MWImageModel.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":341,"column":4,"nodeType":"CallExpression","endLine":358,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1199,"column":3,"nodeType":"CallExpression","endLine":1220,"endColumn":6}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWImageModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki image model.\n *\n * @class\n * @mixes OO.EventEmitter\n *\n * @constructor\n * @param {ve.dm.Document} parentDoc Document that contains or will contain the image\n * @param {Object} [config] Configuration options\n * @param {string} [config.resourceName] The resource name of the given media file\n * @param {Object} [config.currentDimensions={}] Current dimensions, width & height\n * @param {Object} [config.minDimensions={}] Minimum dimensions, width & height\n * @param {boolean} [config.isDefaultSize=false] Object is using its default size dimensions\n */\nve.dm.MWImageModel = function VeDmMWImageModel( parentDoc, config ) {\n\tconfig = config || {};\n\n\t// Mixin constructors\n\tOO.EventEmitter.call( this );\n\n\t// Properties\n\tthis.attributesCache = {};\n\n\t// Image properties\n\tthis.parentDoc = parentDoc;\n\tthis.captionDoc = null;\n\tthis.caption = null;\n\tthis.mediaType = null;\n\tthis.altText = '';\n\tthis.type = null;\n\tthis.alignment = null;\n\tthis.scalable = null;\n\tthis.sizeType = null;\n\tthis.border = false;\n\tthis.borderable = false;\n\tthis.defaultDimensions = null;\n\tthis.changedImageSource = false;\n\n\tthis.imageSrc = '';\n\tthis.imageResourceName = '';\n\tthis.imageHref = '';\n\tthis.imageClassAttr = null;\n\n\t// FIXME: This is blindly being preserved but may not apply if, say,\n\t// a link is no longer pointing to a file description page. When support\n\t// for editing the |link= media option is added, take it into account.\n\tthis.imgWrapperClassAttr = null;\n\n\tthis.boundingBox = null;\n\tthis.initialHash = {};\n\n\t// Get wiki default thumbnail size\n\tthis.defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )\n\t\t.thumbLimits[ mw.user.options.get( 'thumbsize' ) ];\n\n\tif ( config.resourceName ) {\n\t\tthis.setImageResourceName( config.resourceName );\n\t}\n\n\t// Create scalable\n\tconst currentDimensions = config.currentDimensions || {};\n\tconst minDimensions = config.minDimensions || {};\n\n\tconst scalable = new ve.dm.Scalable( {\n\t\tcurrentDimensions: {\n\t\t\twidth: currentDimensions.width,\n\t\t\theight: currentDimensions.height\n\t\t},\n\t\tminDimensions: {\n\t\t\twidth: minDimensions.width || 1,\n\t\t\theight: minDimensions.height || 1\n\t\t},\n\t\tdefaultSize: !!config.isDefaultSize\n\t} );\n\t// Set the initial scalable, connect it to events\n\t// and request an update from the API\n\tthis.attachScalable( scalable );\n};\n\n/* Inheritance */\n\nOO.mixinClass( ve.dm.MWImageModel, OO.EventEmitter );\n\n/* Events */\n\n/**\n * Change of image alignment or of having alignment at all\n *\n * @event ve.dm.MWImageModel#alignmentChange\n * @param {string} Alignment 'left', 'right', 'center' or 'none'\n */\n\n/**\n * Change in size type between default and custom\n *\n * @event ve.dm.MWImageModel#sizeDefaultChange\n * @param {boolean} Image is default size\n */\n\n/**\n * Change in the image type\n *\n * @event ve.dm.MWImageModel#typeChange\n * @param {string} Image type 'thumb', 'frame', 'frameless' or 'none'\n */\n\n/* Static Properties */\n\nve.dm.MWImageModel.static.infoCache = {};\n\n/* Static Methods */\n\n/**\n * Create a new image node based on given parameters.\n *\n * @param {Object} attributes Image attributes\n * @param {string} [imageType] Image node type 'mwInlineImage' or 'mwBlockImage'.\n * Defaults to 'mwBlockImage'\n * @return {ve.dm.MWImageNode} An image node\n */\nve.dm.MWImageModel.static.createImageNode = function ( attributes, imageType ) {\n\tconst defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )\n\t\t.thumbLimits[ mw.user.options.get( 'thumbsize' ) ];\n\n\tconst attrs = ve.extendObject( {\n\t\tmediaClass: 'File',\n\t\tmediaTag: 'img',\n\t\ttype: 'thumb',\n\t\talign: 'default',\n\t\twidth: defaultThumbSize,\n\t\tmediaType: 'BITMAP',\n\t\tdefaultSize: true,\n\t\timageClassAttr: 'mw-file-element'\n\t}, attributes );\n\n\tif ( attrs.defaultSize ) {\n\t\tconst newDimensions = ve.dm.MWImageNode.static.scaleToThumbnailSize( attrs, attrs.mediaType );\n\t\tif ( newDimensions ) {\n\t\t\tattrs.width = newDimensions.width;\n\t\t\tattrs.height = newDimensions.height;\n\t\t}\n\t}\n\n\timageType = imageType || 'mwBlockImage';\n\n\tconst newNode = ve.dm.nodeFactory.createFromElement( {\n\t\ttype: imageType,\n\t\tattributes: attrs\n\t} );\n\n\tve.dm.MWImageNode.static.syncScalableToType( attrs.type, attrs.mediaType, newNode.getScalable() );\n\n\treturn newNode;\n};\n\n/**\n * Load from image data with scalable information.\n *\n * @param {Object} attrs Image node attributes\n * @param {ve.dm.Document} parentDoc Document that contains or will contain the image\n * @return {ve.dm.MWImageModel} Image model\n */\nve.dm.MWImageModel.static.newFromImageAttributes = function ( attrs, parentDoc ) {\n\tconst imgModel = new ve.dm.MWImageModel(\n\t\tparentDoc,\n\t\t{\n\t\t\tresourceName: attrs.resource,\n\t\t\tcurrentDimensions: {\n\t\t\t\twidth: attrs.width,\n\t\t\t\theight: attrs.height\n\t\t\t},\n\t\t\tdefaultSize: !!attrs.defaultSize\n\t\t}\n\t);\n\n\t// Cache the attributes so we can create a new image without\n\t// losing any existing information\n\timgModel.cacheOriginalImageAttributes( attrs );\n\n\timgModel.setImageSource( attrs.src );\n\timgModel.setFilename( new mw.Title( mw.libs.ve.normalizeParsoidResourceName( attrs.resource ) ).getMainText() );\n\timgModel.setImageHref( attrs.href );\n\timgModel.setImageClassAttr( attrs.imageClassAttr );\n\timgModel.setImgWrapperClassAttr( attrs.imgWrapperClassAttr );\n\n\t// Set bounding box\n\timgModel.setBoundingBox( {\n\t\twidth: attrs.width,\n\t\theight: attrs.height\n\t} );\n\n\t// Collect all the information\n\timgModel.toggleBorder( !!attrs.borderImage );\n\timgModel.setAltText( attrs.alt || '' );\n\n\timgModel.setType( attrs.type );\n\n\t// Fix cases where alignment is undefined\n\t// Inline images have no 'align' (they have 'valign' instead)\n\t// But we do want an alignment case for these in case they\n\t// are transformed to block images\n\timgModel.setAlignment( attrs.align || 'default' );\n\n\t// Default size\n\timgModel.toggleDefaultSize( !!attrs.defaultSize );\n\n\t// TODO: When scale/upright is available, set the size\n\t// type accordingly\n\timgModel.setSizeType( imgModel.isDefaultSize() ? 'default' : 'custom' );\n\n\treturn imgModel;\n};\n\n/**\n * Load from existing image node.\n *\n * @param {ve.dm.MWImageNode} node Image node\n * @return {ve.dm.MWImageModel} Image model\n */\nve.dm.MWImageModel.static.newFromImageNode = function ( node ) {\n\treturn ve.dm.MWImageModel.static.newFromImageAttributes( node.getAttributes(), node.getDocument() );\n};\n\n/* Methods */\n\n/**\n * Get the hash object of the current image model state.\n *\n * @return {Object}\n */\nve.dm.MWImageModel.prototype.getHashObject = function () {\n\tconst hash = {\n\t\tfilename: this.getFilename(),\n\t\taltText: this.getAltText(),\n\t\ttype: this.getType(),\n\t\talignment: this.getAlignment(),\n\t\tsizeType: this.getSizeType(),\n\t\tborder: this.hasBorder(),\n\t\tborderable: this.isBorderable()\n\t};\n\n\tif ( this.getScalable() ) {\n\t\thash.scalable = {\n\t\t\tcurrentDimensions: ve.copy( this.getScalable().getCurrentDimensions() ),\n\t\t\tisDefault: this.getScalable().isDefault()\n\t\t};\n\t}\n\treturn hash;\n};\n\n/**\n * Normalize the source url by stripping the protocol off.\n * This is done so when an image is replaced with the same image,\n * the imageModel can recognize that nothing has actually changed.\n *\n * Example:\n * 'http://upload.wikimedia.org/wikipedia/commons/0/Foo.png'\n * to '//upload.wikimedia.org/wikipedia/commons/0/Foo.png'\n *\n * @return {string} Normalized image source\n */\nve.dm.MWImageModel.prototype.getNormalizedImageSource = function () {\n\t// Strip the url prefix 'http' / 'https' etc\n\treturn this.getImageSource().replace( /^https?:\\/\\//, '//' );\n};\n\n/**\n * Adjust the model parameters based on a new image\n *\n * @param {Object} attrs New image source attributes\n * @param {Object} [APIinfo] The image's API info\n * @throws {Error} Image has insufficient details to compute the imageModel details.\n */\nve.dm.MWImageModel.prototype.changeImageSource = function ( attrs, APIinfo ) {\n\tthis.changedImageSource = true;\n\n\tif ( attrs.mediaType ) {\n\t\tthis.setMediaType( attrs.mediaType );\n\t}\n\tif ( attrs.href ) {\n\t\tthis.setImageHref( attrs.href );\n\t}\n\n\t// FIXME: Account for falsey but present values\n\tif ( attrs.imageClassAttr ) {\n\t\tthis.setImageClassAttr( attrs.imageClassAttr );\n\t}\n\n\t// FIXME: Account for falsey but present values\n\tif ( attrs.imgWrapperClassAttr ) {\n\t\tthis.setImgWrapperClassAttr( attrs.imgWrapperClassAttr );\n\t}\n\n\tif ( attrs.resource ) {\n\t\tthis.setImageResourceName( attrs.resource );\n\t\tthis.setFilename( new mw.Title( mw.libs.ve.normalizeParsoidResourceName( attrs.resource ) ).getMainText() );\n\t}\n\n\tif ( attrs.src ) {\n\t\tthis.setImageSource( attrs.src );\n\t}\n\n\t// Remove the scalable default and original dimensions\n\tthis.scalable.clearOriginalDimensions();\n\tthis.scalable.clearDefaultDimensions();\n\tthis.scalable.clearMaxDimensions();\n\tthis.scalable.clearMinDimensions();\n\t// This is a different image so clear the attributes cache\n\tdelete this.attributesCache.originalWidth;\n\tdelete this.attributesCache.originalHeight;\n\n\t// If we already have dimensions from the API, use them\n\tif ( APIinfo ) {\n\t\tthis.scalable.setOriginalDimensions( {\n\t\t\twidth: APIinfo.width,\n\t\t\theight: APIinfo.height\n\t\t} );\n\t\t// Update media type\n\t\tthis.setMediaType( APIinfo.mediatype );\n\t\t// Update defaults\n\t\tve.dm.MWImageNode.static.syncScalableToType(\n\t\t\tthis.getType(),\n\t\t\tAPIinfo.mediatype,\n\t\t\tthis.scalable\n\t\t);\n\t\tthis.updateScalableDetails( {\n\t\t\twidth: APIinfo.width,\n\t\t\theight: APIinfo.height\n\t\t} );\n\t} else {\n\t\t// Call for updated scalable if we don't have dimensions from the API info\n\t\tif ( this.getFilename() ) {\n\t\t\t// Update anyway\n\t\t\tve.dm.MWImageNode.static.getScalablePromise( this.getFilename() ).done( ( info ) => {\n\t\t\t\tthis.scalable.setOriginalDimensions( {\n\t\t\t\t\twidth: info.width,\n\t\t\t\t\theight: info.height\n\t\t\t\t} );\n\t\t\t\t// Update media type\n\t\t\t\tthis.setMediaType( info.mediatype );\n\t\t\t\t// Update defaults\n\t\t\t\tve.dm.MWImageNode.static.syncScalableToType(\n\t\t\t\t\tthis.getType(),\n\t\t\t\t\tinfo.mediatype,\n\t\t\t\t\tthis.scalable\n\t\t\t\t);\n\t\t\t\tthis.updateScalableDetails( {\n\t\t\t\t\twidth: info.width,\n\t\t\t\t\theight: info.height\n\t\t\t\t} );\n\t\t\t} );\n\t\t} else {\n\t\t\tthrow new Error( 'Cannot compute details for an image without remote filename and without sizing info.' );\n\t\t}\n\t}\n};\n\n/**\n * Get the current image node type according to the attributes.\n * If either of the parameters are given, the node type is tested\n * against them, otherwise, it is tested against the current image\n * parameters.\n *\n * @param {string} [imageType] Optional. Image type.\n * @param {string} [align] Optional. Image alignment.\n * @return {string} Node type 'mwInlineImage' or 'mwBlockImage'\n */\nve.dm.MWImageModel.prototype.getImageNodeType = function ( imageType, align ) {\n\timageType = imageType || this.getType();\n\n\tif (\n\t\t( this.getType() === 'frameless' || this.getType() === 'none' ) &&\n\t\t( !this.isAligned( align ) || this.isDefaultAligned( imageType, align ) )\n\t) {\n\t\treturn 'mwInlineImage';\n\t} else {\n\t\treturn 'mwBlockImage';\n\t}\n};\n\n/**\n * Get the original bounding box\n *\n * @return {Object} Bounding box with width and height\n */\nve.dm.MWImageModel.prototype.getBoundingBox = function () {\n\treturn this.boundingBox;\n};\n\n/**\n * Update an existing image node by changing its attributes\n *\n * @param {ve.dm.MWImageNode} node Image node to update\n * @param {ve.dm.Surface} surfaceModel Surface model of main document\n */\nve.dm.MWImageModel.prototype.updateImageNode = function ( node, surfaceModel ) {\n\tconst doc = surfaceModel.getDocument();\n\n\t// Update the caption\n\tif ( node.getType() === 'mwBlockImage' ) {\n\t\tlet captionNode = node.getCaptionNode();\n\t\tif ( !captionNode ) {\n\t\t\t// There was no caption before, so insert one now\n\t\t\tsurfaceModel.getFragment()\n\t\t\t\t.adjustLinearSelection( 1 )\n\t\t\t\t.collapseToStart()\n\t\t\t\t.insertContent( [ { type: 'mwImageCaption' }, { type: '/mwImageCaption' } ] );\n\t\t\t// Update the caption node\n\t\t\tcaptionNode = node.getCaptionNode();\n\t\t}\n\n\t\tconst captionRange = captionNode.getRange();\n\n\t\t// Remove contents of old caption\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromRemoval(\n\t\t\t\tdoc,\n\t\t\t\tcaptionRange,\n\t\t\t\ttrue\n\t\t\t)\n\t\t);\n\n\t\t// Add contents of new caption\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\t\t\tdoc,\n\t\t\t\tcaptionRange.start,\n\t\t\t\tthis.getCaptionDocument()\n\t\t\t)\n\t\t);\n\t}\n\n\t// Update attributes\n\tsurfaceModel.change(\n\t\tve.dm.TransactionBuilder.static.newFromAttributeChanges(\n\t\t\tdoc,\n\t\t\tnode.getOffset(),\n\t\t\tthis.getUpdatedAttributes()\n\t\t)\n\t);\n};\n\n/**\n * Insert image into a surface.\n *\n * Image is inserted at the current fragment position.\n *\n * @param {ve.dm.SurfaceFragment} fragment Fragment covering range to insert at\n * @return {ve.dm.SurfaceFragment} Fragment covering inserted image\n * @throws {Error} Unknown image node type\n */\nve.dm.MWImageModel.prototype.insertImageNode = function ( fragment ) {\n\tconst nodeType = this.getImageNodeType(),\n\t\tsurfaceModel = fragment.getSurface();\n\n\tif ( !( fragment.getSelection() instanceof ve.dm.LinearSelection ) ) {\n\t\treturn fragment;\n\t}\n\n\tconst selectedNode = fragment.getSelectedNode();\n\n\t// If there was a previous node, remove it first\n\tif ( selectedNode ) {\n\t\t// Remove the old image\n\t\tfragment.removeContent();\n\t}\n\n\tconst contentToInsert = this.getData();\n\n\tlet offset;\n\tswitch ( nodeType ) {\n\t\tcase 'mwInlineImage':\n\t\t\tif ( selectedNode && selectedNode.type === 'mwBlockImage' ) {\n\t\t\t\t// If converting from a block image, create a wrapper paragraph for the inline image to go in.\n\t\t\t\tfragment.insertContent( [ { type: 'paragraph', internal: { generated: 'wrapper' } }, { type: '/paragraph' } ] );\n\t\t\t\toffset = fragment.getSelection().getRange().start + 1;\n\t\t\t} else {\n\t\t\t\t// Try to put the image inside the nearest content node\n\t\t\t\toffset = fragment.getDocument().data.getNearestContentOffset( fragment.getSelection().getRange().start );\n\t\t\t}\n\t\t\tif ( offset > -1 ) {\n\t\t\t\tfragment = fragment.clone( new ve.dm.LinearSelection( new ve.Range( offset ) ) );\n\t\t\t}\n\t\t\tfragment.insertContent( contentToInsert );\n\t\t\treturn fragment;\n\n\t\tcase 'mwBlockImage':\n\t\t\t// Try to put the image in front of the structural node\n\t\t\toffset = fragment.getDocument().data.getNearestStructuralOffset( fragment.getSelection().getRange().start, -1 );\n\t\t\tif ( offset > -1 ) {\n\t\t\t\tfragment = fragment.clone( new ve.dm.LinearSelection( new ve.Range( offset ) ) );\n\t\t\t}\n\t\t\tfragment.insertContent( contentToInsert );\n\t\t\t// Add contents of new caption\n\t\t\tsurfaceModel.change(\n\t\t\t\tve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\t\t\t\tsurfaceModel.getDocument(),\n\t\t\t\t\tfragment.getSelection().getRange().start + 2,\n\t\t\t\t\tthis.getCaptionDocument()\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn fragment;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'Unknown image node type ' + nodeType );\n\t}\n};\n\n/**\n * Get linear data representation of the image\n *\n * @return {Array} Linear data\n */\nve.dm.MWImageModel.prototype.getData = function () {\n\tconst originalAttrs = ve.copy( this.getOriginalImageAttributes() ),\n\t\teditAttributes = ve.extendObject( originalAttrs, this.getUpdatedAttributes() ),\n\t\tnodeType = this.getImageNodeType();\n\n\t// Remove old classes\n\tdelete editAttributes.originalClasses;\n\tdelete editAttributes.unrecognizedClasses;\n\t// Newly created images must have valid URLs, so remove the error attribute\n\tif ( this.isChangedImageSource() ) {\n\t\tdelete editAttributes.isError;\n\t}\n\n\tconst data = [\n\t\t{\n\t\t\ttype: nodeType,\n\t\t\tattributes: editAttributes\n\t\t},\n\t\t{ type: '/' + nodeType }\n\t];\n\n\tif ( nodeType === 'mwBlockImage' ) {\n\t\tdata.splice( 1, 0, { type: 'mwImageCaption' }, { type: '/mwImageCaption' } );\n\t}\n\treturn data;\n};\n\n/**\n * Return all updated attributes that belong to the node.\n *\n * @return {Object} Updated attributes\n */\nve.dm.MWImageModel.prototype.getUpdatedAttributes = function () {\n\tconst origAttrs = this.getOriginalImageAttributes();\n\n\tlet currentDimensions;\n\t// Adjust default dimensions if size is set to default\n\tif ( this.scalable.isDefault() && this.scalable.getDefaultDimensions() ) {\n\t\tcurrentDimensions = this.scalable.getDefaultDimensions();\n\t} else {\n\t\tcurrentDimensions = this.getCurrentDimensions();\n\t}\n\n\tconst attrs = {\n\t\tmediaClass: 'File',\n\t\tmediaTag: this.getMediaTag(),\n\t\ttype: this.getType(),\n\t\twidth: currentDimensions.width,\n\t\theight: currentDimensions.height,\n\t\tdefaultSize: this.isDefaultSize(),\n\t\tborderImage: this.hasBorder()\n\t};\n\n\tif ( this.getAltText() || typeof origAttrs.alt === 'string' ) {\n\t\tattrs.alt = this.getAltText();\n\t}\n\n\tif ( this.isDefaultAligned() ) {\n\t\tattrs.align = 'default';\n\t} else if ( !this.isAligned() ) {\n\t\tattrs.align = 'none';\n\t} else {\n\t\tattrs.align = this.getAlignment();\n\t}\n\n\tattrs.src = this.getImageSource();\n\tattrs.href = this.getImageHref();\n\tattrs.imageClassAttr = this.getImageClassAttr();\n\tattrs.imgWrapperClassAttr = this.getImgWrapperClassAttr();\n\tattrs.resource = this.getImageResourceName();\n\n\treturn attrs;\n};\n\n/**\n * Deal with default change on the scalable object\n *\n * @param {boolean} isDefault\n */\nve.dm.MWImageModel.prototype.onScalableDefaultSizeChange = function ( isDefault ) {\n\tthis.toggleDefaultSize( isDefault );\n};\n\n/**\n * Set the image file source\n *\n * @param {string} src The source of the given media file\n */\nve.dm.MWImageModel.prototype.setImageSource = function ( src ) {\n\tthis.imageSrc = src;\n};\n\n/**\n * Set the image file resource name\n *\n * @param {string} resourceName The resource name of the given image file\n */\nve.dm.MWImageModel.prototype.setImageResourceName = function ( resourceName ) {\n\tthis.imageResourceName = resourceName;\n};\n\n/**\n * Set the image href value\n *\n * @param {string} href The destination href of the given media file\n */\nve.dm.MWImageModel.prototype.setImageHref = function ( href ) {\n\tthis.imageHref = href;\n};\n\n/**\n * Set the original bounding box\n *\n * @param {Object} box Bounding box with width and height\n */\nve.dm.MWImageModel.prototype.setBoundingBox = function ( box ) {\n\tthis.boundingBox = box;\n};\n\n/**\n * Set the initial hash object of the image to be compared to when\n * checking if the model is modified.\n *\n * @param {Object} hash The initial hash object\n */\nve.dm.MWImageModel.prototype.storeInitialHash = function ( hash ) {\n\tthis.initialHash = hash;\n};\n\n/**\n * Set symbolic name of media type.\n *\n * Example values: \"BITMAP\" for JPEG or PNG images; \"DRAWING\" for SVG graphics\n *\n * @param {string|undefined} type Symbolic media type name, or undefined if empty\n */\nve.dm.MWImageModel.prototype.setMediaType = function ( type ) {\n\tthis.mediaType = type;\n};\n\n/**\n * Check whether the image is set to default size\n *\n * @return {boolean} Default size flag on or off\n */\nve.dm.MWImageModel.prototype.isDefaultSize = function () {\n\t// An image with 'frame' always ignores the size specification\n\treturn this.scalable.isDefault() || this.getType() === 'frame';\n};\n\n/**\n * Check whether the image has the border flag set\n *\n * @return {boolean} Border flag on or off\n */\nve.dm.MWImageModel.prototype.hasBorder = function () {\n\treturn this.border;\n};\n\n/**\n * Check whether the image source is changed\n *\n * @return {boolean} changedImageSource flag on or off\n */\nve.dm.MWImageModel.prototype.isChangedImageSource = function () {\n\treturn this.changedImageSource;\n};\n\n/**\n * Check whether the image has floating alignment set\n *\n * @param {string} [align] Optional. Alignment value to test against.\n * @return {boolean} hasAlignment flag on or off\n */\nve.dm.MWImageModel.prototype.isAligned = function ( align ) {\n\talign = align || this.alignment;\n\t// The image is aligned if it has alignment (not undefined and not null)\n\t// and if its alignment is not 'none'.\n\t// Inline images initially have null alignment value (and are not aligned)\n\treturn align && align !== 'none';\n};\n\n/**\n * Check whether the image is set to default alignment\n * We explicitly repeat tests so to avoid recursively calling\n * the other methods.\n *\n * @param {string} [imageType] Type of the image.\n * @param {string} [align] Optional alignment value to test against.\n * Supplying this parameter would test whether this align parameter\n * would mean the image is aligned to its default position.\n * @return {boolean} defaultAlignment flag on or off\n */\nve.dm.MWImageModel.prototype.isDefaultAligned = function ( imageType, align ) {\n\tconst alignment = align || this.getAlignment(),\n\t\tdefaultAlignment = ( this.parentDoc.getDir() === 'rtl' ) ? 'left' : 'right';\n\n\timageType = imageType || this.getType();\n\t// No alignment specified means default alignment always\n\t// Inline images have no align attribute; during the initialization\n\t// stage of the model we have to account for that option. Later the\n\t// model creates a faux alignment for inline images ('none' for default)\n\t// but if initially the alignment is null or undefined, it means the image\n\t// is inline without explicit alignment (which makes it default aligned)\n\tif ( !alignment ) {\n\t\treturn true;\n\t}\n\n\tif (\n\t\t(\n\t\t\t( imageType === 'frameless' || imageType === 'none' ) &&\n\t\t\talignment === 'none'\n\t\t) ||\n\t\t(\n\t\t\t( imageType === 'thumb' || imageType === 'frame' ) &&\n\t\t\talignment === defaultAlignment\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Check whether the image can have a border set on it\n *\n * @return {boolean} Border possible or not\n */\nve.dm.MWImageModel.prototype.isBorderable = function () {\n\treturn this.borderable;\n};\n\n/**\n * Get the image file resource name\n *\n * @return {string} resourceName The resource name of the given media file\n */\nve.dm.MWImageModel.prototype.getResourceName = function () {\n\treturn this.imageResourceName;\n};\n\n/**\n * Get the image alternate text\n *\n * @return {string} Alternate text\n */\nve.dm.MWImageModel.prototype.getAltText = function () {\n\treturn this.altText || '';\n};\n\n/**\n * Get image wikitext type; 'thumb', 'frame', 'frameless' or 'none/inline'\n *\n * @return {string} Image type\n */\nve.dm.MWImageModel.prototype.getType = function () {\n\treturn this.type;\n};\n\n/**\n * Get the image size type of the image\n *\n * @return {string} Size type\n */\nve.dm.MWImageModel.prototype.getSizeType = function () {\n\treturn this.sizeType;\n};\n\n/**\n * Get symbolic name of media type.\n *\n * Example values: \"BITMAP\" for JPEG or PNG images; \"DRAWING\" for SVG graphics\n *\n * @return {string|undefined} Symbolic media type name, or undefined if empty\n */\nve.dm.MWImageModel.prototype.getMediaType = function () {\n\treturn this.mediaType;\n};\n\n/**\n * Get media tag: img, video or audio\n *\n * @return {string} Tag name\n */\nve.dm.MWImageModel.prototype.getMediaTag = function () {\n\tconst mediaType = this.getMediaType();\n\n\tif ( mediaType === 'VIDEO' ) {\n\t\treturn 'video';\n\t}\n\tif ( mediaType === 'AUDIO' ) {\n\t\treturn 'audio';\n\t}\n\treturn 'img';\n};\n\n/**\n * Get image alignment 'left', 'right', 'center', 'none' or 'default'\n *\n * @return {string|null} Image alignment. Inline images have initial alignment\n * value of null.\n */\nve.dm.MWImageModel.prototype.getAlignment = function () {\n\treturn this.alignment;\n};\n\n/**\n * Get image vertical alignment\n * 'middle', 'baseline', 'sub', 'super', 'top', 'text-top', 'bottom', 'text-bottom' or 'default'\n *\n * @return {string} Image alignment\n */\nve.dm.MWImageModel.prototype.getVerticalAlignment = function () {\n\treturn this.verticalAlignment;\n};\n\n/**\n * Get the scalable object responsible for size manipulations\n * for the given image\n *\n * @return {ve.dm.Scalable}\n */\nve.dm.MWImageModel.prototype.getScalable = function () {\n\treturn this.scalable;\n};\n\n/**\n * @typedef {Object} Dimensions\n * @memberof ve.ui.DimensionsWidget\n * @property {number} width The value of the width input\n * @property {number} height The value of the height input\n */\n\n/**\n * Get the image current dimensions\n *\n * @return {ve.ui.DimensionsWidget.Dimensions} Current dimensions width/height\n */\nve.dm.MWImageModel.prototype.getCurrentDimensions = function () {\n\treturn this.scalable.getCurrentDimensions();\n};\n\n/**\n * Get image caption document.\n *\n * Auto-generates a blank document if no document exists.\n *\n * @return {ve.dm.Document} Caption document\n */\nve.dm.MWImageModel.prototype.getCaptionDocument = function () {\n\tif ( !this.captionDoc ) {\n\t\tthis.captionDoc = this.parentDoc.cloneWithData( [\n\t\t\t{ type: 'paragraph', internal: { generated: 'wrapper' } },\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t] );\n\t}\n\treturn this.captionDoc;\n};\n\n/**\n * Toggle the option of whether this image can or cannot have\n * a border set on it.\n *\n * @param {boolean} [borderable] Set or unset borderable. If not\n * specified, the current state is toggled.\n */\nve.dm.MWImageModel.prototype.toggleBorderable = function ( borderable ) {\n\tborderable = borderable !== undefined ? !!borderable : !this.isBorderable();\n\n\tthis.borderable = borderable;\n};\n\n/**\n * Toggle the border flag of the image\n *\n * @param {boolean} [hasBorder] Border flag. Omit to toggle current value.\n */\nve.dm.MWImageModel.prototype.toggleBorder = function ( hasBorder ) {\n\thasBorder = hasBorder !== undefined ? !!hasBorder : !this.hasBorder();\n\n\tthis.border = !!hasBorder;\n};\n\n/**\n * Toggle the default size flag of the image\n *\n * @param {boolean} [isDefault] Default size flag. Omit to toggle current value.\n * @fires ve.dm.MWImageModel#sizeDefaultChange\n */\nve.dm.MWImageModel.prototype.toggleDefaultSize = function ( isDefault ) {\n\tisDefault = isDefault !== undefined ? !!isDefault : !this.isDefaultSize();\n\n\tif ( this.isDefaultSize() !== isDefault ) {\n\t\tthis.scalable.toggleDefault( !!isDefault );\n\t\tthis.resetDefaultDimensions();\n\t\tthis.emit( 'sizeDefaultChange', !!isDefault );\n\t}\n};\n\n/**\n * Cache all image attributes\n *\n * @param {Object} attrs Image attributes\n */\nve.dm.MWImageModel.prototype.cacheOriginalImageAttributes = function ( attrs ) {\n\tthis.attributesCache = attrs;\n};\n\n/**\n * Get the cache of all image attributes\n *\n * @return {Object} attrs Image attributes\n */\nve.dm.MWImageModel.prototype.getOriginalImageAttributes = function () {\n\treturn this.attributesCache;\n};\n\n/**\n * Set the current dimensions of the image.\n * Normalize in case only one dimension is available.\n *\n * @param {Object} dimensions Dimensions width and height\n * @param {number} dimensions.width The width of the image\n * @param {number} dimensions.height The height of the image\n */\nve.dm.MWImageModel.prototype.setCurrentDimensions = function ( dimensions ) {\n\tconst normalizedDimensions = ve.dm.Scalable.static.getDimensionsFromValue( dimensions, this.scalable.getRatio() );\n\tthis.scalable.setCurrentDimensions( normalizedDimensions );\n};\n\n/**\n * Set alternate text\n *\n * @param {string} text Alternate text\n */\nve.dm.MWImageModel.prototype.setAltText = function ( text ) {\n\tthis.altText = text;\n};\n\n/**\n * Set image type\n *\n * @see #getType\n *\n * @param {string} type Image type\n * @fires ve.dm.MWImageModel#typeChange\n */\nve.dm.MWImageModel.prototype.setType = function ( type ) {\n\tconst isDefaultAligned = this.isDefaultAligned( this.imageCurrentType );\n\n\tthis.type = type;\n\n\t// If we're switching between inline and block or vice versa,\n\t// check if the old type image was default aligned\n\tif ( isDefaultAligned && this.imageCurrentType !== this.type ) {\n\t\tif ( this.type === 'none' || this.type === 'frameless' ) {\n\t\t\t// Reset default alignment for switching to inline images\n\t\t\tthis.setAlignment( 'none' );\n\t\t} else {\n\t\t\t// Reset default alignment for all other images\n\t\t\tthis.setAlignment( 'default' );\n\t\t}\n\t}\n\n\t// Cache the current type for next check\n\tthis.imageCurrentType = type;\n\n\tif ( type === 'frame' || type === 'thumb' ) {\n\t\t// Disable border option\n\t\tthis.toggleBorderable( false );\n\t} else {\n\t\t// Enable border option\n\t\tthis.toggleBorderable( true );\n\t}\n\n\t// If type is frame, set to 'default' size\n\tif ( type === 'frame' ) {\n\t\tthis.toggleDefaultSize( true );\n\t}\n\n\t// Let the image node update scalable considerations\n\t// for default and max dimensions as per the new type.\n\tve.dm.MWImageNode.static.syncScalableToType( type, this.getMediaType(), this.getScalable() );\n\n\tthis.emit( 'typeChange', type );\n};\n\n/**\n * Reset the default dimensions of the image based on its type\n * and on whether we have the originalDimensions object from\n * the API\n */\nve.dm.MWImageModel.prototype.resetDefaultDimensions = function () {\n\tconst originalDimensions = this.scalable.getOriginalDimensions();\n\n\tif ( !ve.isEmptyObject( originalDimensions ) ) {\n\t\tif ( this.getType() === 'thumb' || this.getType() === 'frameless' ) {\n\t\t\t// Default is thumb size\n\t\t\tif ( originalDimensions.width <= this.defaultThumbSize ) {\n\t\t\t\tthis.scalable.setDefaultDimensions( originalDimensions );\n\t\t\t} else {\n\t\t\t\tthis.scalable.setDefaultDimensions(\n\t\t\t\t\tve.dm.Scalable.static.getDimensionsFromValue( {\n\t\t\t\t\t\twidth: this.defaultThumbSize\n\t\t\t\t\t}, this.scalable.getRatio() )\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Default is original size\n\t\t\tthis.scalable.setDefaultDimensions( originalDimensions );\n\t\t}\n\t} else {\n\t\tthis.scalable.clearDefaultDimensions();\n\t}\n};\n\n/**\n * Retrieve the currently set default dimensions from the scalable\n * object attached to the image.\n *\n * @return {Object} Image default dimensions\n */\nve.dm.MWImageModel.prototype.getDefaultDimensions = function () {\n\treturn this.scalable.getDefaultDimensions();\n};\n\n/**\n * Change size type of the image\n *\n * @param {string} type Size type 'default', 'custom' or 'scale'\n */\nve.dm.MWImageModel.prototype.setSizeType = function ( type ) {\n\tif ( this.sizeType !== type ) {\n\t\tthis.sizeType = type;\n\t\tthis.toggleDefaultSize( type === 'default' );\n\t}\n};\n\n/**\n * Set image alignment\n *\n * @see #getAlignment\n *\n * @param {string} align Alignment\n * @fires ve.dm.MWImageModel#alignmentChange\n */\nve.dm.MWImageModel.prototype.setAlignment = function ( align ) {\n\tif ( align === 'default' ) {\n\t\t// If default, set the alignment to language dir default\n\t\talign = this.getDefaultDir();\n\t}\n\n\tthis.alignment = align;\n\tthis.emit( 'alignmentChange', align );\n};\n\n/**\n * Set image vertical alignment\n *\n * @see #getVerticalAlignment\n *\n * @param {string} valign Alignment\n * @fires ve.dm.MWImageModel#alignmentChange\n */\nve.dm.MWImageModel.prototype.setVerticalAlignment = function ( valign ) {\n\tthis.verticalAlignment = valign;\n\tthis.emit( 'alignmentChange', valign );\n};\n\n/**\n * Get the default alignment according to the document direction\n *\n * @param {string} [imageNodeType] Optional. The image node type that we would\n * like to get the default direction for. Supplying this parameter allows us\n * to check what the default alignment of a specific type of node would be.\n * If the parameter is not supplied, the default alignment will be calculated\n * based on the current node type.\n * @return {string} Node alignment based on document direction\n */\nve.dm.MWImageModel.prototype.getDefaultDir = function ( imageNodeType ) {\n\timageNodeType = imageNodeType || this.getImageNodeType();\n\n\tif ( this.parentDoc.getDir() === 'rtl' ) {\n\t\t// Assume position is 'left'\n\t\treturn ( imageNodeType === 'mwBlockImage' ) ? 'left' : 'none';\n\t} else {\n\t\t// Assume position is 'right'\n\t\treturn ( imageNodeType === 'mwBlockImage' ) ? 'right' : 'none';\n\t}\n};\n\n/**\n * Get the image file source\n * The image file source that points to the location of the\n * file on the Web.\n * For instance, '//upload.wikimedia.org/wikipedia/commons/0/0f/Foo.jpg'\n *\n * @return {string} The source of the given media file\n */\nve.dm.MWImageModel.prototype.getImageSource = function () {\n\treturn this.imageSrc;\n};\n\n/**\n * Get the image file resource name.\n * The resource name represents the filename without the full\n * source url.\n * For example, './File:Foo.jpg'\n *\n * @return {string} The resource name of the given media file\n */\nve.dm.MWImageModel.prototype.getImageResourceName = function () {\n\treturn this.imageResourceName;\n};\n\n/**\n * Get the image href value.\n * This is the link that the image leads to. It usually contains\n * the link to the source of the image in commons or locally, but\n * may hold an alternative link if link= is supplied in the wikitext.\n * For example, './File:Foo.jpg' or 'http://www.wikipedia.org'\n *\n * @return {string} The destination href of the given media file\n */\nve.dm.MWImageModel.prototype.getImageHref = function () {\n\treturn this.imageHref;\n};\n\n/**\n * @param {string|null} classAttr\n */\nve.dm.MWImageModel.prototype.setImageClassAttr = function ( classAttr ) {\n\tthis.imageClassAttr = classAttr;\n};\n\n/**\n * @return {string|null}\n */\nve.dm.MWImageModel.prototype.getImageClassAttr = function () {\n\treturn this.imageClassAttr;\n};\n\n/**\n * @param {string|null} classAttr\n */\nve.dm.MWImageModel.prototype.setImgWrapperClassAttr = function ( classAttr ) {\n\tthis.imgWrapperClassAttr = classAttr;\n};\n\n/**\n * @return {string|null}\n */\nve.dm.MWImageModel.prototype.getImgWrapperClassAttr = function () {\n\treturn this.imgWrapperClassAttr;\n};\n\n/**\n * Attach a new scalable object to the model and request the\n * information from the API.\n *\n * @param {ve.dm.Scalable} scalable\n */\nve.dm.MWImageModel.prototype.attachScalable = function ( scalable ) {\n\tconst imageName = mw.libs.ve.normalizeParsoidResourceName( this.getResourceName() );\n\n\tif ( this.scalable instanceof ve.dm.Scalable ) {\n\t\tthis.scalable.disconnect( this );\n\t}\n\tthis.scalable = scalable;\n\n\t// Events\n\tthis.scalable.connect( this, { defaultSizeChange: 'onScalableDefaultSizeChange' } );\n\n\t// Call for updated scalable\n\tif ( imageName ) {\n\t\tve.dm.MWImageNode.static.getScalablePromise( imageName ).done( ( info ) => {\n\t\t\tthis.scalable.setOriginalDimensions( {\n\t\t\t\twidth: info.width,\n\t\t\t\theight: info.height\n\t\t\t} );\n\t\t\t// Update media type\n\t\t\tthis.setMediaType( info.mediatype );\n\t\t\t// Update according to type\n\t\t\tve.dm.MWImageNode.static.syncScalableToType(\n\t\t\t\tthis.getType(),\n\t\t\t\tthis.getMediaType(),\n\t\t\t\tthis.getScalable()\n\t\t\t);\n\n\t\t\t// We have to adjust the details in the initial hash if the original\n\t\t\t// image was 'default' since we didn't have default until now and the\n\t\t\t// default dimensions that were 'recorded' were wrong\n\t\t\tif ( !ve.isEmptyObject( this.initialHash ) && this.initialHash.scalable.isDefault ) {\n\t\t\t\tthis.initialHash.scalable.currentDimensions = this.scalable.getDefaultDimensions();\n\t\t\t}\n\n\t\t} );\n\t}\n};\n\n/**\n * Set the filename of the current image\n *\n * @param {string} filename Image filename (without namespace)\n */\nve.dm.MWImageModel.prototype.setFilename = function ( filename ) {\n\tthis.filename = filename;\n};\n\n/**\n * Get the filename of the current image\n *\n * @return {string} filename Image filename (without namespace)\n */\nve.dm.MWImageModel.prototype.getFilename = function () {\n\treturn this.filename;\n};\n\n/**\n * If the image changed, update scalable definitions.\n *\n * @param {Object} originalDimensions Image original dimensions\n */\nve.dm.MWImageModel.prototype.updateScalableDetails = function ( originalDimensions ) {\n\tlet newDimensions;\n\n\t// Resize the new image's current dimensions to default or based on the bounding box\n\tif ( this.isDefaultSize() ) {\n\t\t// Scale to default\n\t\tnewDimensions = ve.dm.MWImageNode.static.scaleToThumbnailSize( originalDimensions );\n\t} else {\n\t\tif ( this.getBoundingBox() ) {\n\t\t\t// Scale the new image by its width\n\t\t\tnewDimensions = ve.dm.MWImageNode.static.resizeToBoundingBox(\n\t\t\t\toriginalDimensions,\n\t\t\t\t{\n\t\t\t\t\twidth: this.boundingBox.width,\n\t\t\t\t\theight: Infinity\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tnewDimensions = originalDimensions;\n\t\t}\n\t}\n\n\tif ( newDimensions ) {\n\t\tthis.getScalable().setCurrentDimensions( newDimensions );\n\t}\n};\n\n/**\n * Set image caption document.\n *\n * @param {ve.dm.Document} doc Image caption document\n */\nve.dm.MWImageModel.prototype.setCaptionDocument = function ( doc ) {\n\tthis.captionDoc = doc;\n};\n\n/**\n * Check if the model attributes and parameters have been modified by\n * comparing the current hash to the new hash object.\n *\n * @return {boolean} Model has been modified\n */\nve.dm.MWImageModel.prototype.hasBeenModified = function () {\n\tif ( this.initialHash ) {\n\t\treturn !ve.compare( this.initialHash, this.getHashObject() );\n\t}\n\treturn true;\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/models/ve.dm.MWParameterModel.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/modules/ve-mw/dm/models/ve.dm.MWTemplateModel.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/modules/ve-mw/dm/models/ve.dm.MWTemplatePlaceholderModel.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/modules/ve-mw/dm/models/ve.dm.MWTemplateSpecModel.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/modules/ve-mw/dm/models/ve.dm.MWTransclusionContentModel.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/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":329,"column":15,"nodeType":"CallExpression","endLine":335,"endColumn":61}],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'$' is not defined.","line":132,"column":25,"nodeType":"Identifier","messageId":"undef","endLine":132,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWTransclusionModel class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Object literal\n *\n * @class ve.dm.MWTransclusionPartInstruction\n * @private\n */\n/**\n * @property {ve.dm.MWTransclusionPartModel} [remove]\n * @property {ve.dm.MWTransclusionPartModel} [add]\n * @property {number} [index]\n * @property {jQuery.Deferred} [deferred]\n */\n\n( function () {\n\tconst hasOwn = Object.hasOwnProperty,\n\t\tspecCache = {};\n\n\t/**\n\t * Represents a MediaWiki transclusion, i.e. a sequence of one or more template invocations that\n\t * strictly belong to each other (e.g. because they are unbalanced), possibly mixed with raw\n\t * wikitext snippets. These individual \"parts\" are subclasses of ve.dm.MWTransclusionPartModel.\n\t *\n\t * @class\n\t * @mixes OO.EventEmitter\n\t *\n\t * @constructor\n\t * @param {ve.dm.Document} doc Document to use associate with API requests\n\t */\n\tve.dm.MWTransclusionModel = function VeDmMWTransclusionModel( doc ) {\n\t\t// Mixin constructors\n\t\tOO.EventEmitter.call( this );\n\n\t\t/**\n\t\t * @property {ve.dm.MWTransclusionPartModel[]} parts\n\t\t * @property {number} uid\n\t\t * @property {jQuery.Promise[]} templateDataApiRequests Currently running API requests. The only\n\t\t * reason to keep these around is to be able to abort them earlier when the template dialog\n\t\t * closes or resets.\n\t\t * @property {Object[]} changeQueue\n\t\t */\n\t\tthis.doc = doc;\n\t\tthis.parts = [];\n\t\tthis.uid = 0;\n\t\tthis.templateDataApiRequests = [];\n\t\tthis.changeQueue = [];\n\t};\n\n\t/* Inheritance */\n\n\tOO.mixinClass( ve.dm.MWTransclusionModel, OO.EventEmitter );\n\n\t/* Events */\n\n\t/**\n\t * Emitted when a part is added, removed, replaced (e.g. a placeholder with an actual template),\n\t * or an existing part changed position.\n\t *\n\t * @event ve.dm.MWTransclusionPartInstruction#replace\n\t * @param {ve.dm.MWTransclusionPartModel|null} removed Removed part\n\t * @param {ve.dm.MWTransclusionPartModel|null} added Added or moved part\n\t * @param {number} [newPosition] Position the part was added or moved to\n\t */\n\n\t/**\n\t * Emitted when anything changed, including any changes in the content of the parts.\n\t *\n\t * @event ve.dm.MWTransclusionPartInstruction#change\n\t */\n\n\t/* Methods */\n\n\t/**\n\t * Insert transclusion at the end of a surface fragment.\n\t *\n\t * If forceType is not specified and this is used in async mode, users of this method\n\t * should ensure the surface is not accessible while the type is being evaluated.\n\t *\n\t * @param {ve.dm.SurfaceFragment} surfaceFragment Surface fragment after which to insert.\n\t * @param {string} [forceType] Force the type to 'inline' or 'block'. If not\n\t * specified it will be evaluated asynchronously.\n\t * @return {jQuery.Promise} Promise which resolves when the node has been inserted. If\n\t * forceType was specified this will be instant.\n\t */\n\tve.dm.MWTransclusionModel.prototype.insertTransclusionNode = function ( surfaceFragment, forceType ) {\n\t\tconst deferred = ve.createDeferred(),\n\t\t\tbaseNodeClass = ve.dm.MWTransclusionNode;\n\n\t\tconst insertNode = ( isInline, generatedContents ) => {\n\t\t\tconst type = isInline ? baseNodeClass.static.inlineType : baseNodeClass.static.blockType,\n\t\t\t\tdata = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tmw: this.getPlainObject()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{ type: '/' + type }\n\t\t\t\t];\n\n\t\t\t// If we just fetched the generated contents, put them in the store\n\t\t\t// so we don't do a duplicate API call later.\n\t\t\tif ( generatedContents ) {\n\t\t\t\tconst nodeClass = ve.dm.modelRegistry.lookup( type );\n\t\t\t\tconst store = surfaceFragment.getDocument().getStore();\n\t\t\t\tconst hash = OO.getHash( [ nodeClass.static.getHashObjectForRendering( data[ 0 ] ), undefined ] );\n\t\t\t\tstore.hash( generatedContents, hash );\n\t\t\t}\n\n\t\t\tsurfaceFragment.insertContent( data );\n\n\t\t\tdeferred.resolve();\n\t\t};\n\n\t\tif ( forceType ) {\n\t\t\tinsertNode( forceType === 'inline' );\n\t\t} else {\n\t\t\tve.init.target.parseWikitextFragment(\n\t\t\t\tbaseNodeClass.static.getWikitext( this.getPlainObject() ),\n\t\t\t\ttrue,\n\t\t\t\tsurfaceFragment.getDocument()\n\t\t\t).then( ( response ) => {\n\t\t\t\tif ( ve.getProp( response, 'visualeditor', 'result' ) === 'success' ) {\n\t\t\t\t\t// This method is only ever run by a client, so it is okay to use jQuery\n\t\t\t\t\t// eslint-disable-next-line no-undef\n\t\t\t\t\tlet contentNodes = $.parseHTML( response.visualeditor.content, surfaceFragment.getDocument().getHtmlDocument() ) || [];\n\t\t\t\t\tcontentNodes = ve.ce.MWTransclusionNode.static.filterRendering( contentNodes );\n\t\t\t\t\tinsertNode(\n\t\t\t\t\t\tbaseNodeClass.static.isHybridInline( contentNodes, ve.dm.converter ),\n\t\t\t\t\t\tcontentNodes\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// Request failed - just assume inline\n\t\t\t\t\tinsertNode( true );\n\t\t\t\t}\n\t\t\t}, () => {\n\t\t\t\tinsertNode( true );\n\t\t\t} );\n\t\t}\n\t\treturn deferred.promise();\n\t};\n\n\t/**\n\t * Update transclusion node in a document.\n\t *\n\t * @param {ve.dm.Surface} surfaceModel Surface model of main document\n\t * @param {ve.dm.MWTransclusionNode} node Transclusion node to update\n\t */\n\tve.dm.MWTransclusionModel.prototype.updateTransclusionNode = function ( surfaceModel, node ) {\n\t\tconst obj = this.getPlainObject();\n\n\t\tif ( obj !== null ) {\n\t\t\tsurfaceModel.getLinearFragment( node.getOuterRange(), true )\n\t\t\t\t.changeAttributes( { mw: obj } );\n\t\t} else {\n\t\t\tsurfaceModel.getLinearFragment( node.getOuterRange(), true )\n\t\t\t\t.removeContent();\n\t\t}\n\t};\n\n\t/**\n\t * Load from transclusion data, and fetch spec from server.\n\t *\n\t * @param {Object} data Transclusion data\n\t * @return {jQuery.Promise} Promise, resolved when spec is loaded\n\t */\n\tve.dm.MWTransclusionModel.prototype.load = function ( data ) {\n\t\tconst promises = [];\n\n\t\t// Convert single part format to multi-part format\n\t\t// Parsoid doesn't use this format any more, but we accept it for backwards compatibility\n\t\tif ( data.params && data.target ) {\n\t\t\tdata = { parts: [ { template: data } ] };\n\t\t}\n\n\t\tif ( Array.isArray( data.parts ) ) {\n\t\t\tfor ( let i = 0; i < data.parts.length; i++ ) {\n\t\t\t\tconst part = data.parts[ i ];\n\t\t\t\tif ( part.template ) {\n\t\t\t\t\tconst deferred = ve.createDeferred();\n\t\t\t\t\tpromises.push( deferred.promise() );\n\t\t\t\t\tthis.changeQueue.push( {\n\t\t\t\t\t\tadd: ve.dm.MWTemplateModel.newFromData( this, part.template ),\n\t\t\t\t\t\tdeferred: deferred\n\t\t\t\t\t} );\n\t\t\t\t} else if ( typeof part === 'string' ) {\n\t\t\t\t\tconst deferred = ve.createDeferred();\n\t\t\t\t\tpromises.push( deferred.promise() );\n\t\t\t\t\tthis.changeQueue.push( {\n\t\t\t\t\t\tadd: new ve.dm.MWTransclusionContentModel( this, part ),\n\t\t\t\t\t\tdeferred: deferred\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetTimeout( this.processChangeQueue.bind( this ) );\n\t\t}\n\n\t\treturn ve.promiseAll( promises );\n\t};\n\n\t/**\n\t * Process one or more queue items.\n\t *\n\t * @private\n\t * @param {ve.dm.MWTransclusionPartInstruction[]} queue List of objects containing parts to add and optionally\n\t * indexes to add them at, if no index is given parts will be added at the end\n\t * @fires ve.dm.MWTransclusionPartInstruction#replace For each item added\n\t * @fires ve.dm.MWTransclusionPartInstruction#change\n\t */\n\tve.dm.MWTransclusionModel.prototype.resolveChangeQueue = function ( queue ) {\n\t\tconst resolveQueue = [];\n\n\t\tfor ( let i = 0; i < queue.length; i++ ) {\n\t\t\tconst item = queue[ i ];\n\t\t\tlet remove = 0;\n\n\t\t\tif ( item.add instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tconst title = item.add.getTemplateDataQueryTitle();\n\t\t\t\tif ( hasOwn.call( specCache, title ) && specCache[ title ] ) {\n\t\t\t\t\titem.add.getSpec().setTemplateData( specCache[ title ] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Use specified index\n\t\t\tlet index = item.index;\n\t\t\t// Auto-remove if already existing, preserving index\n\t\t\tconst existing = this.parts.indexOf( item.add );\n\t\t\tif ( existing !== -1 ) {\n\t\t\t\tthis.removePart( item.add );\n\t\t\t\tif ( index && existing + 1 < index ) {\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Derive index from removal if given\n\t\t\tif ( index === undefined && item.remove ) {\n\t\t\t\tindex = this.parts.indexOf( item.remove );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\tremove = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Use last index as a last resort\n\t\t\tif ( index === undefined || index === -1 ) {\n\t\t\t\tindex = this.parts.length;\n\t\t\t}\n\n\t\t\tthis.parts.splice( index, remove, item.add );\n\t\t\tif ( item.add ) {\n\t\t\t\t// This forwards change events from the nested ve.dm.MWTransclusionPartModel upwards.\n\t\t\t\t// The array syntax is a way to call `this.emit( 'change' )`.\n\t\t\t\titem.add.connect( this, { change: [ 'emit', 'change' ] } );\n\t\t\t}\n\t\t\tif ( item.remove ) {\n\t\t\t\titem.remove.disconnect( this );\n\t\t\t}\n\t\t\tthis.emit( 'replace', item.remove || null, item.add, index );\n\n\t\t\t// Resolve promises\n\t\t\tif ( item.deferred ) {\n\t\t\t\tresolveQueue.push( item.deferred );\n\t\t\t}\n\t\t}\n\t\tthis.emit( 'change' );\n\n\t\t// We need to go back and resolve the deferreds after emitting change.\n\t\t// Otherwise we get silly situations like a single change event being\n\t\t// guaranteed after the transclusion loaded promise gets resolved.\n\t\tresolveQueue.forEach( ( queueItem ) => {\n\t\t\tqueueItem.resolve();\n\t\t} );\n\t};\n\n\t/**\n\t * @private\n\t */\n\tve.dm.MWTransclusionModel.prototype.processChangeQueue = function () {\n\t\tconst templateNamespaceId = mw.config.get( 'wgNamespaceIds' ).template,\n\t\t\ttitles = [];\n\n\t\tif ( !this.changeQueue.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst queue = this.changeQueue.slice();\n\n\t\t// Clear shared queue for future calls\n\t\tthis.changeQueue.length = 0;\n\n\t\t// Get unique list of template titles that aren't already loaded\n\t\tfor ( let i = 0; i < queue.length; i++ ) {\n\t\t\tconst item = queue[ i ];\n\t\t\tif ( item.add instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tconst title = item.add.getTemplateDataQueryTitle(),\n\t\t\t\t\tmwTitle = title ? mw.Title.newFromText( title, templateNamespaceId ) : null;\n\t\t\t\tif (\n\t\t\t\t\t// Skip titles that don't have a resolvable href\n\t\t\t\t\tmwTitle &&\n\t\t\t\t\t// Skip already cached data\n\t\t\t\t\t!hasOwn.call( specCache, title ) &&\n\t\t\t\t\t// Skip duplicate titles in the same batch\n\t\t\t\t\t!titles.includes( title )\n\t\t\t\t) {\n\t\t\t\t\ttitles.push( title );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Bypass server for empty lists\n\t\tif ( !titles.length ) {\n\t\t\tsetTimeout( this.resolveChangeQueue.bind( this, queue ) );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.templateDataApiRequests.push( this.callTemplateDataApi( titles, queue ) );\n\t};\n\n\t/**\n\t * @private\n\t * @param {string[]} titles\n\t * @param {ve.dm.MWTransclusionPartInstruction[]} queue\n\t * @return {jQuery.Promise}\n\t */\n\tve.dm.MWTransclusionModel.prototype.callTemplateDataApi = function ( titles, queue ) {\n\t\tconst xhr = ve.init.target.getContentApi( this.doc ).get( {\n\t\t\taction: 'templatedata',\n\t\t\ttitles: titles,\n\t\t\tlang: mw.config.get( 'wgUserLanguage' ),\n\t\t\tincludeMissingTitles: '1',\n\t\t\tredirects: '1'\n\t\t} ).done( this.cacheTemplateDataApiResponse.bind( this ) );\n\t\txhr.always(\n\t\t\tthis.markRequestAsDone.bind( this, xhr ),\n\t\t\tthis.resolveChangeQueue.bind( this, queue )\n\t\t);\n\t\treturn xhr;\n\t};\n\n\t/**\n\t * @private\n\t * @param {Object} [data]\n\t * @param {Object.<number,ve.dm.MWTemplatePageMetadata>} [data.pages]\n\t */\n\tve.dm.MWTransclusionModel.prototype.cacheTemplateDataApiResponse = function ( data ) {\n\t\tif ( !data || !data.pages ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Keep spec data on hand for future use\n\t\tfor ( const id in data.pages ) {\n\t\t\tconst title = data.pages[ id ].title;\n\n\t\t\tif ( data.pages[ id ].missing ) {\n\t\t\t\t// Remember templates that don't exist in the link cache\n\t\t\t\t// { title: { missing: true|false }\n\t\t\t\tconst missingTitle = {};\n\t\t\t\tmissingTitle[ title ] = { missing: true };\n\t\t\t\tve.init.platform.linkCache.setMissing( missingTitle );\n\t\t\t} else if ( data.pages[ id ].notemplatedata && !OO.isPlainObject( data.pages[ id ].params ) ) {\n\t\t\t\t// (T243868) Prevent asking again for templates that have neither user-provided specs\n\t\t\t\t// nor automatically detected params\n\t\t\t\tspecCache[ title ] = null;\n\t\t\t} else {\n\t\t\t\tspecCache[ title ] = data.pages[ id ];\n\t\t\t}\n\t\t}\n\n\t\t// Follow redirects\n\t\tconst aliasMap = data.redirects || [];\n\t\t// Follow MW's normalisation\n\t\tif ( data.normalized ) {\n\t\t\tve.batchPush( aliasMap, data.normalized );\n\t\t}\n\t\t// Cross-reference aliased titles.\n\t\tfor ( let i = 0; i < aliasMap.length; i++ ) {\n\t\t\t// Only define the alias if the target exists, otherwise\n\t\t\t// we create a new property with an invalid \"undefined\" value.\n\t\t\tif ( hasOwn.call( specCache, aliasMap[ i ].to ) ) {\n\t\t\t\tspecCache[ aliasMap[ i ].from ] = specCache[ aliasMap[ i ].to ];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * @private\n\t * @param {jQuery.Promise} apiPromise\n\t */\n\tve.dm.MWTransclusionModel.prototype.markRequestAsDone = function ( apiPromise ) {\n\t\t// Prune completed request\n\t\tconst index = this.templateDataApiRequests.indexOf( apiPromise );\n\t\tif ( index !== -1 ) {\n\t\t\tthis.templateDataApiRequests.splice( index, 1 );\n\t\t}\n\t};\n\n\tve.dm.MWTransclusionModel.prototype.abortAllApiRequests = function () {\n\t\tfor ( let i = 0; i < this.templateDataApiRequests.length; i++ ) {\n\t\t\tthis.templateDataApiRequests[ i ].abort();\n\t\t}\n\t\tthis.templateDataApiRequests.length = 0;\n\t};\n\n\t/**\n\t * Get plain object representation of template transclusion.\n\t *\n\t * @return {Object|null} Plain object representation, or null if empty\n\t */\n\tve.dm.MWTransclusionModel.prototype.getPlainObject = function () {\n\t\tconst parts = [];\n\n\t\tfor ( let i = 0; i < this.parts.length; i++ ) {\n\t\t\tconst part = this.parts[ i ];\n\t\t\tconst serialization = part.serialize();\n\t\t\tif ( serialization !== undefined && serialization !== '' ) {\n\t\t\t\tparts.push( serialization );\n\t\t\t}\n\t\t}\n\n\t\treturn parts.length ? { parts: parts } : null;\n\t};\n\n\t/**\n\t * @return {string} Next part ID, starting from \"part_0\", guaranteed to be unique for this\n\t * transclusion\n\t */\n\tve.dm.MWTransclusionModel.prototype.nextUniquePartId = function () {\n\t\treturn 'part_' + this.uid++;\n\t};\n\n\t/**\n\t * Replace asynchronously.\n\t *\n\t * @param {ve.dm.MWTransclusionPartModel} remove Part to remove\n\t * @param {ve.dm.MWTransclusionPartModel} add Part to add\n\t * @throws {Error} If part to remove is not valid\n\t * @throws {Error} If part to add is not valid\n\t * @return {jQuery.Promise} Promise, resolved when part is added\n\t */\n\tve.dm.MWTransclusionModel.prototype.replacePart = function ( remove, add ) {\n\t\tconst deferred = ve.createDeferred();\n\t\tif (\n\t\t\t!( remove instanceof ve.dm.MWTransclusionPartModel ) ||\n\t\t\t!( add instanceof ve.dm.MWTransclusionPartModel )\n\t\t) {\n\t\t\tthrow new Error( 'Invalid transclusion part' );\n\t\t}\n\t\tthis.changeQueue.push( { remove: remove, add: add, deferred: deferred } );\n\n\t\t// Fetch on next yield to process items in the queue together, subsequent calls will\n\t\t// have no effect because the queue will be clear\n\t\tsetTimeout( this.processChangeQueue.bind( this ) );\n\n\t\treturn deferred.promise();\n\t};\n\n\t/**\n\t * Added asynchronously, but order is preserved.\n\t *\n\t * @param {ve.dm.MWTransclusionPartModel} part\n\t * @param {number} [index] Specific index to add content at, defaults to the end\n\t * @throws {Error} If part is not valid\n\t * @return {jQuery.Promise} Promise, resolved when part is added\n\t */\n\tve.dm.MWTransclusionModel.prototype.addPart = function ( part, index ) {\n\t\tconst deferred = ve.createDeferred();\n\t\tif ( !( part instanceof ve.dm.MWTransclusionPartModel ) ) {\n\t\t\tthrow new Error( 'Invalid transclusion part' );\n\t\t}\n\t\tthis.changeQueue.push( { add: part, index: index, deferred: deferred } );\n\n\t\t// Fetch on next yield to process items in the queue together, subsequent calls to fetch will\n\t\t// have no effect because the queue will be clear\n\t\tsetTimeout( this.processChangeQueue.bind( this ) );\n\n\t\treturn deferred.promise();\n\t};\n\n\t/**\n\t * @param {ve.dm.MWTransclusionPartModel} part\n\t * @fires ve.dm.MWTransclusionPartInstruction#replace\n\t */\n\tve.dm.MWTransclusionModel.prototype.removePart = function ( part ) {\n\t\tconst index = this.parts.indexOf( part );\n\t\tif ( index !== -1 ) {\n\t\t\tthis.parts.splice( index, 1 );\n\t\t\tpart.disconnect( this );\n\t\t\tthis.emit( 'replace', part, null );\n\t\t}\n\t};\n\n\t/**\n\t * @return {boolean} True if the transclusion is literally empty or contains only placeholders\n\t */\n\tve.dm.MWTransclusionModel.prototype.isEmpty = function () {\n\t\treturn this.parts.every( ( part ) => part instanceof ve.dm.MWTemplatePlaceholderModel );\n\t};\n\n\t/**\n\t * @return {boolean} True if this is a single template or template placeholder\n\t */\n\tve.dm.MWTransclusionModel.prototype.isSingleTemplate = function () {\n\t\treturn this.parts.length === 1 && (\n\t\t\tthis.parts[ 0 ] instanceof ve.dm.MWTemplateModel ||\n\t\t\tthis.parts[ 0 ] instanceof ve.dm.MWTemplatePlaceholderModel\n\t\t);\n\t};\n\n\t/**\n\t * @return {ve.dm.MWTransclusionPartModel[]} All parts in this transclusion\n\t */\n\tve.dm.MWTransclusionModel.prototype.getParts = function () {\n\t\treturn this.parts;\n\t};\n\n\t/**\n\t * Matching is performed against the first section of the `id`, delimited by a '/'.\n\t *\n\t * @param {string} [id] Any id, including slash-delimited template parameter ids\n\t * @return {ve.dm.MWTransclusionPartModel|undefined} Part with matching ID, if found\n\t */\n\tve.dm.MWTransclusionModel.prototype.getPartFromId = function ( id ) {\n\t\tif ( !id ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For ids from ve.dm.MWParameterModel, compare against the part id\n\t\t// of the parameter instead of the entire model id (e.g. \"part_1\" instead of \"part_1/foo\").\n\t\tconst partId = id.split( '/', 1 )[ 0 ];\n\n\t\tfor ( let i = 0; i < this.parts.length; i++ ) {\n\t\t\tif ( this.parts[ i ].getId() === partId ) {\n\t\t\t\treturn this.parts[ i ];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Get the index of a part or parameter.\n\t *\n\t * Indexes are linear depth-first addresses in the transclusion tree.\n\t *\n\t * @param {ve.dm.MWTransclusionPartModel|ve.dm.MWParameterModel} model Part or parameter\n\t * @return {number} Page index of model\n\t */\n\tve.dm.MWTransclusionModel.prototype.getIndex = function ( model ) {\n\t\tconst parts = this.parts;\n\n\t\tlet index = 0;\n\t\tfor ( let i = 0; i < parts.length; i++ ) {\n\t\t\tconst part = parts[ i ];\n\t\t\tif ( part === model ) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t\tindex++;\n\t\t\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tconst names = part.getOrderedParameterNames();\n\t\t\t\tfor ( let j = 0; j < names.length; j++ ) {\n\t\t\t\t\tif ( part.getParameter( names[ j ] ) === model ) {\n\t\t\t\t\t\treturn index;\n\t\t\t\t\t}\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t};\n\n\t/**\n\t * Add missing required and suggested parameters to each transclusion.\n\t */\n\tve.dm.MWTransclusionModel.prototype.addPromptedParameters = function () {\n\t\tthis.parts.forEach( ( part ) => {\n\t\t\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\tpart.addPromptedParameters();\n\t\t\t}\n\t\t} );\n\t};\n\n\t/**\n\t * @return {boolean} True if any transclusion part contains meaningful, non-default user input\n\t */\n\tve.dm.MWTransclusionModel.prototype.containsValuableData = function () {\n\t\treturn this.parts.some( ( part ) => part.containsValuableData() );\n\t};\n\n\t/**\n\t * Resets the model's state.\n\t */\n\tve.dm.MWTransclusionModel.prototype.reset = function () {\n\t\tthis.parts = [];\n\t\tthis.uid = 0;\n\t\tthis.templateDataApiRequests = [];\n\t\tthis.changeQueue = [];\n\t};\n\n\t// Temporary compatibility for https://github.com/femiwiki/Sanctions/pull/118. Remove when not\n\t// needed any more.\n\tmw.log.deprecate( ve.dm.MWTransclusionModel.prototype, 'abortRequests',\n\t\tve.dm.MWTransclusionModel.prototype.abortAllApiRequests,\n\t\t'Use \"abortAllApiRequests\" instead.'\n\t);\n\n}() );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionPartModel.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/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.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/modules/ve-mw/dm/nodes/ve.dm.MWAlienBlockExtensionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWAlienExtensionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWAlienInlineExtensionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWAnnotationNode.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/modules/ve-mw/dm/nodes/ve.dm.MWBlockExtensionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":189,"column":3,"nodeType":"AssignmentExpression","endLine":189,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":198,"column":3,"nodeType":"AssignmentExpression","endLine":198,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":203,"column":3,"nodeType":"AssignmentExpression","endLine":203,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.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/modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageCaptionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":205,"column":3,"nodeType":"AssignmentExpression","endLine":205,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":210,"column":3,"nodeType":"AssignmentExpression","endLine":210,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWGalleryNode.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/modules/ve-mw/dm/nodes/ve.dm.MWHeadingNode.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/modules/ve-mw/dm/nodes/ve.dm.MWImageCaptionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":368,"column":3,"nodeType":"CallExpression","endLine":385,"endColumn":6}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWImageNode class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * DataModel MediaWiki image node.\n *\n * @class\n * @abstract\n * @extends ve.dm.GeneratedContentNode\n * @mixes ve.dm.FocusableNode\n * @mixes ve.dm.ResizableNode\n *\n * @constructor\n */\nve.dm.MWImageNode = function VeDmMWImageNode() {\n\t// Parent constructor\n\tve.dm.GeneratedContentNode.call( this );\n\n\t// Mixin constructors\n\tve.dm.FocusableNode.call( this );\n\t// ve.dm.MWResizableNode doesn't exist\n\tve.dm.ResizableNode.call( this );\n\n\tthis.scalablePromise = null;\n\n\t// Use 'bitmap' as default media type until we can\n\t// fetch the actual media type from the API\n\tthis.mediaType = 'BITMAP';\n\n\t// Initialize\n\tthis.constructor.static.syncScalableToType(\n\t\tthis.getAttribute( 'type' ),\n\t\tthis.mediaType,\n\t\tthis.getScalable()\n\t);\n\n\t// Events\n\tthis.connect( this, { attributeChange: 'onAttributeChange' } );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWImageNode, ve.dm.GeneratedContentNode );\n\nOO.mixinClass( ve.dm.MWImageNode, ve.dm.FocusableNode );\n\nOO.mixinClass( ve.dm.MWImageNode, ve.dm.ResizableNode );\n\n/* Static methods */\n\nve.dm.MWImageNode.static.rdfaToTypes = ( function () {\n\tconst rdfaToType = {};\n\n\t[ 'File', 'Image', 'Video', 'Audio' ].forEach( ( mediaClass ) => {\n\t\trdfaToType[ 'mw:' + mediaClass ] = { mediaClass: mediaClass, frameType: 'none' };\n\t\trdfaToType[ 'mw:' + mediaClass + '/Frameless' ] = { mediaClass: mediaClass, frameType: 'frameless' };\n\t\t// Block image only:\n\t\trdfaToType[ 'mw:' + mediaClass + '/Thumb' ] = { mediaClass: mediaClass, frameType: 'thumb' };\n\t\trdfaToType[ 'mw:' + mediaClass + '/Frame' ] = { mediaClass: mediaClass, frameType: 'frame' };\n\t} );\n\n\treturn rdfaToType;\n}() );\n\n/**\n * Get RDFa type\n *\n * @static\n * @param {string} mediaClass Media class, one of 'File', 'Image', 'Video' or 'Audio'\n * @param {string} frameType Frame type, one of 'none', 'frameless', 'thumb' or 'frame'\n * @param {boolean} isError Whether the included media file is missing\n * @return {string} RDFa type\n */\nve.dm.MWImageNode.static.getRdfa = function ( mediaClass, frameType, isError ) {\n\treturn ( isError ? 'mw:Error ' : '' ) + 'mw:' + mediaClass + {\n\t\tnone: '',\n\t\tframeless: '/Frameless',\n\t\t// Block image only:\n\t\tthumb: '/Thumb',\n\t\tframe: '/Frame'\n\t}[ frameType ];\n};\n\n/**\n * Map media tags to source attributes\n *\n * @type {Object}\n */\nve.dm.MWImageNode.static.tagsToSrcAttrs = {\n\timg: 'src',\n\taudio: null,\n\tvideo: 'poster',\n\tspan: null\n};\n\n/**\n * @inheritdoc ve.dm.GeneratedContentNode\n */\nve.dm.MWImageNode.static.getHashObjectForRendering = function ( dataElement ) {\n\t// \"Rendering\" is just the URL of the thumbnail, so we only\n\t// care about src & dimensions\n\treturn {\n\t\ttype: 'mwImage',\n\t\tresource: dataElement.attributes.resource,\n\t\twidth: dataElement.attributes.width,\n\t\theight: dataElement.attributes.height\n\t};\n};\n\nve.dm.MWImageNode.static.getMatchRdfaTypes = function () {\n\treturn Object.keys( this.rdfaToTypes );\n};\n\nve.dm.MWImageNode.static.allowedRdfaTypes = [ 'mw:Error' ];\n\nve.dm.MWImageNode.static.isDiffComparable = function ( element, other ) {\n\t// Images with different src's shouldn't be diffed\n\treturn element.type === other.type && element.attributes.resource === other.attributes.resource;\n};\n\nve.dm.MWImageNode.static.describeChanges = function ( attributeChanges, attributes ) {\n\tconst customKeys = [ 'width', 'height', 'defaultSize', 'src', 'href' ],\n\t\tdescriptions = [];\n\n\tfunction describeSize( width, height ) {\n\t\treturn width + ve.msg( 'visualeditor-dimensionswidget-times' ) + height + ve.msg( 'visualeditor-dimensionswidget-px' );\n\t}\n\n\tif ( 'width' in attributeChanges || 'height' in attributeChanges ) {\n\t\tlet sizeFrom, sizeTo;\n\t\tif ( attributeChanges.defaultSize && attributeChanges.defaultSize.from === true ) {\n\t\t\tsizeFrom = ve.msg( 'visualeditor-mediasizewidget-sizeoptions-default' );\n\t\t} else {\n\t\t\tsizeFrom = describeSize(\n\t\t\t\t'width' in attributeChanges ? attributeChanges.width.from : attributes.width,\n\t\t\t\t'height' in attributeChanges ? attributeChanges.height.from : attributes.height\n\t\t\t);\n\t\t}\n\t\tif ( attributeChanges.defaultSize && attributeChanges.defaultSize.to === true ) {\n\t\t\tsizeTo = ve.msg( 'visualeditor-mediasizewidget-sizeoptions-default' );\n\t\t} else {\n\t\t\tsizeTo = describeSize(\n\t\t\t\t'width' in attributeChanges ? attributeChanges.width.to : attributes.width,\n\t\t\t\t'height' in attributeChanges ? attributeChanges.height.to : attributes.height\n\t\t\t);\n\t\t}\n\n\t\tdescriptions.push(\n\t\t\tve.htmlMsg( 'visualeditor-changedesc-image-size', this.wrapText( 'del', sizeFrom ), this.wrapText( 'ins', sizeTo ) )\n\t\t);\n\t}\n\tfor ( const key in attributeChanges ) {\n\t\tif ( !customKeys.includes( key ) ) {\n\t\t\tif ( key === 'borderImage' && !attributeChanges.borderImage.from && !attributeChanges.borderImage.to ) {\n\t\t\t\t// Skip noise from the data model\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst change = this.describeChange( key, attributeChanges[ key ] );\n\t\t\tif ( change ) {\n\t\t\t\tdescriptions.push( change );\n\t\t\t}\n\t\t}\n\t}\n\treturn descriptions;\n};\n\nve.dm.MWImageNode.static.describeChange = function ( key, change ) {\n\tswitch ( key ) {\n\t\tcase 'align':\n\t\t\treturn ve.htmlMsg( 'visualeditor-changedesc-align',\n\t\t\t\t// The following messages are used here:\n\t\t\t\t// * visualeditor-align-desc-left\n\t\t\t\t// * visualeditor-align-desc-right\n\t\t\t\t// * visualeditor-align-desc-center\n\t\t\t\t// * visualeditor-align-desc-default\n\t\t\t\t// * visualeditor-align-desc-none\n\t\t\t\tthis.wrapText( 'del', ve.msg( 'visualeditor-align-desc-' + change.from ) ),\n\t\t\t\tthis.wrapText( 'ins', ve.msg( 'visualeditor-align-desc-' + change.to ) )\n\t\t\t);\n\t\tcase 'originalWidth':\n\t\tcase 'originalHeight':\n\t\tcase 'originalClasses':\n\t\tcase 'unrecognizedClasses':\n\t\t\treturn;\n\t\t// TODO: Handle valign\n\t}\n\t// Parent method\n\treturn ve.dm.Node.static.describeChange.apply( this, arguments );\n};\n\n/**\n * Take the given dimensions and scale them to thumbnail size.\n *\n * @param {Object} dimensions Width and height of the image\n * @param {string} [mediaType] Media type 'DRAWING' or 'BITMAP'\n * @return {Object} The new width and height of the scaled image\n */\nve.dm.MWImageNode.static.scaleToThumbnailSize = function ( dimensions, mediaType ) {\n\tconst defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )\n\t\t.thumbLimits[ mw.user.options.get( 'thumbsize' ) ];\n\n\tmediaType = mediaType || 'BITMAP';\n\n\tif ( dimensions.width && dimensions.height ) {\n\t\t// Use dimensions\n\t\t// Resize to default thumbnail size, but only if the image itself\n\t\t// isn't smaller than the default size\n\t\t// For svg/drawings, the default wiki size is always applied\n\t\tif ( dimensions.width > defaultThumbSize || mediaType === 'DRAWING' ) {\n\t\t\treturn ve.dm.Scalable.static.getDimensionsFromValue( {\n\t\t\t\twidth: defaultThumbSize\n\t\t\t}, dimensions.width / dimensions.height );\n\t\t}\n\t}\n\treturn dimensions;\n};\n\n/**\n * Translate the image dimensions into new ones according to the bounding box.\n *\n * @param {Object} imageDimensions Width and height of the image\n * @param {Object} boundingBox The limit of the bounding box\n * @return {Object} The new width and height of the scaled image.\n */\nve.dm.MWImageNode.static.resizeToBoundingBox = function ( imageDimensions, boundingBox ) {\n\tconst scale = Math.min(\n\t\tboundingBox.height / imageDimensions.height,\n\t\tboundingBox.width / imageDimensions.width\n\t);\n\n\tlet newDimensions = ve.copy( imageDimensions );\n\tif ( scale < 1 ) {\n\t\t// Scale down\n\t\tnewDimensions = {\n\t\t\twidth: Math.floor( newDimensions.width * scale ),\n\t\t\theight: Math.floor( newDimensions.height * scale )\n\t\t};\n\t}\n\treturn newDimensions;\n};\n\n/**\n * Update image scalable properties according to the image type.\n *\n * @param {string} type The new image type\n * @param {string} mediaType Image media type 'DRAWING' or 'BITMAP'\n * @param {ve.dm.Scalable} scalable The scalable object to update\n */\nve.dm.MWImageNode.static.syncScalableToType = function ( type, mediaType, scalable ) {\n\tconst defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )\n\t\t.thumbLimits[ mw.user.options.get( 'thumbsize' ) ];\n\n\tconst originalDimensions = scalable.getOriginalDimensions();\n\n\t// We can only set default dimensions if we have the original ones\n\tif ( originalDimensions ) {\n\t\tif ( type === 'thumb' || type === 'frameless' ) {\n\t\t\t// Set the default size to that in the wiki configuration if\n\t\t\t// 1. The original image width is not smaller than the default\n\t\t\t// 2. If the image is an SVG drawing\n\t\t\tlet dimensions;\n\t\t\tif ( originalDimensions.width >= defaultThumbSize || mediaType === 'DRAWING' ) {\n\t\t\t\tdimensions = ve.dm.Scalable.static.getDimensionsFromValue( {\n\t\t\t\t\twidth: defaultThumbSize\n\t\t\t\t}, scalable.getRatio() );\n\t\t\t} else {\n\t\t\t\tdimensions = ve.dm.Scalable.static.getDimensionsFromValue(\n\t\t\t\t\toriginalDimensions,\n\t\t\t\t\tscalable.getRatio()\n\t\t\t\t);\n\t\t\t}\n\t\t\tscalable.setDefaultDimensions( dimensions );\n\t\t} else {\n\t\t\tscalable.setDefaultDimensions( originalDimensions );\n\t\t}\n\t}\n\n\t// Deal with maximum dimensions for images and drawings\n\tif ( mediaType === 'DRAWING' ) {\n\t\t// Vector images are scalable past their original dimensions\n\t\t// EnforcedMax may have previously been set to true\n\t\tscalable.setEnforcedMax( false );\n\n\t} else if ( mediaType === 'AUDIO' ) {\n\t\t// Audio files are scalable to any width but have fixed height\n\t\tscalable.fixedRatio = false;\n\t\tscalable.setMinDimensions( { width: 1, height: 32 } );\n\t\t// TODO: No way to enforce max height but not max width\n\t\tscalable.setMaxDimensions( { width: 99999, height: 32 } );\n\t\tscalable.setEnforcedMax( true );\n\t\tscalable.setEnforcedMin( true );\n\n\t\t// Default dimensions for audio files are 0x0, which is no good\n\t\tscalable.setDefaultDimensions( { width: defaultThumbSize, height: 32 } );\n\n\t} else {\n\t\t// Raster image files are limited to their original dimensions\n\t\tif ( originalDimensions ) {\n\t\t\tscalable.setMaxDimensions( originalDimensions );\n\t\t\tscalable.setEnforcedMax( true );\n\t\t} else {\n\t\t\tscalable.setEnforcedMax( false );\n\t\t}\n\t}\n\t// TODO: Some day, when $wgSvgMaxSize works properly in MediaWiki\n\t// we can add it back as max dimension consideration.\n};\n\n/**\n * Get the scalable promise which fetches original dimensions from the API\n *\n * @param {string} filename The image filename whose details the scalable will represent\n * @return {jQuery.Promise} Promise which resolves after the image size details are fetched from the API\n */\nve.dm.MWImageNode.static.getScalablePromise = function ( filename ) {\n\t// On the first call set off an async call to update the scalable's\n\t// original dimensions from the API.\n\tif ( ve.init.platform.imageInfoCache ) {\n\t\treturn ve.init.platform.imageInfoCache.get( filename ).then( ( info ) => {\n\t\t\tif ( !info || info.missing ) {\n\t\t\t\treturn ve.createDeferred().reject().promise();\n\t\t\t}\n\t\t\treturn info;\n\t\t} );\n\t} else {\n\t\treturn ve.createDeferred().reject().promise();\n\t}\n};\n\n/* Methods */\n\n/**\n * Respond to attribute change.\n * Update the rendering of the 'align', src', 'width' and 'height' attributes\n * when they change in the model.\n *\n * @param {string} key Attribute key\n * @param {string} from Old value\n * @param {string} to New value\n */\nve.dm.MWImageNode.prototype.onAttributeChange = function ( key, from, to ) {\n\tif ( key === 'type' ) {\n\t\tthis.constructor.static.syncScalableToType( to, this.mediaType, this.getScalable() );\n\t}\n};\n\n/**\n * Get the normalised filename of the image\n *\n * @return {string} Filename (including namespace)\n */\nve.dm.MWImageNode.prototype.getFilename = function () {\n\treturn mw.libs.ve.normalizeParsoidResourceName( this.getAttribute( 'resource' ) || '' );\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWImageNode.prototype.getScalable = function () {\n\tif ( !this.scalablePromise ) {\n\t\tthis.scalablePromise = ve.dm.MWImageNode.static.getScalablePromise( this.getFilename() );\n\t\t// If the promise was already resolved before getScalablePromise returned, then jQuery will execute the done straight away.\n\t\t// So don't just do getScalablePromise( ... ).done because we need to make sure that this.scalablePromise gets set first.\n\t\tthis.scalablePromise.done( ( info ) => {\n\t\t\tif ( info ) {\n\t\t\t\tthis.getScalable().setOriginalDimensions( {\n\t\t\t\t\twidth: info.width,\n\t\t\t\t\theight: info.height\n\t\t\t\t} );\n\t\t\t\tconst oldMediaType = this.mediaType;\n\t\t\t\t// Update media type\n\t\t\t\tthis.mediaType = info.mediatype;\n\t\t\t\t// Update according to type\n\t\t\t\tthis.constructor.static.syncScalableToType(\n\t\t\t\t\tthis.getAttribute( 'type' ),\n\t\t\t\t\tthis.mediaType,\n\t\t\t\t\tthis.getScalable()\n\t\t\t\t);\n\t\t\t\tthis.emit( 'attributeChange', 'mediaType', oldMediaType, this.mediaType );\n\t\t\t}\n\t\t} );\n\t}\n\t// Mixin method\n\treturn ve.dm.ResizableNode.prototype.getScalable.call( this );\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWImageNode.prototype.createScalable = function () {\n\treturn new ve.dm.Scalable( {\n\t\tcurrentDimensions: {\n\t\t\twidth: this.getAttribute( 'width' ),\n\t\t\theight: this.getAttribute( 'height' )\n\t\t},\n\t\tminDimensions: {\n\t\t\twidth: 1,\n\t\t\theight: 1\n\t\t}\n\t} );\n};\n\n/**\n * Get symbolic name of media type.\n *\n * Example values: \"BITMAP\" for JPEG or PNG images; \"DRAWING\" for SVG graphics\n *\n * @return {string|undefined} Symbolic media type name, or undefined if empty\n */\nve.dm.MWImageNode.prototype.getMediaType = function () {\n\treturn this.mediaType;\n};\n\n/**\n * Get RDFa type\n *\n * @return {string} RDFa type\n */\nve.dm.MWImageNode.prototype.getRdfa = function () {\n\treturn this.constructor.static.getRdfa(\n\t\tthis.getAttribute( 'mediaClass' ),\n\t\tthis.getAttribute( 'type' ),\n\t\tthis.getAttribute( 'isError' )\n\t);\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWIncludesNode.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/modules/ve-mw/dm/nodes/ve.dm.MWInlineExtensionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":205,"column":3,"nodeType":"AssignmentExpression","endLine":205,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":208,"column":3,"nodeType":"AssignmentExpression","endLine":208,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":217,"column":3,"nodeType":"AssignmentExpression","endLine":217,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":222,"column":3,"nodeType":"AssignmentExpression","endLine":222,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWLanguageVariantBlockNode.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/modules/ve-mw/dm/nodes/ve.dm.MWLanguageVariantHiddenNode.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/modules/ve-mw/dm/nodes/ve.dm.MWLanguageVariantInlineNode.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/modules/ve-mw/dm/nodes/ve.dm.MWLanguageVariantNode.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/modules/ve-mw/dm/nodes/ve.dm.MWMagicLinkNode.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/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.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/modules/ve-mw/dm/nodes/ve.dm.MWPreNode.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/modules/ve-mw/dm/nodes/ve.dm.MWPreformattedNode.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/modules/ve-mw/dm/nodes/ve.dm.MWSignatureNode.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/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":83,"column":3,"nodeType":"AssignmentExpression","endLine":83,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionBlockNode.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/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionInlineNode.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/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.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/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionTableCellNode.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/modules/ve-mw/dm/ve.dm.MWWikitextSurface.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/modules/ve-mw/dm/ve.dm.MWWikitextSurfaceFragment.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":139,"column":3,"nodeType":"CallExpression","endLine":141,"endColumn":6}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor DataModel MWWikitextSurfaceFragment class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/**\n * DataModel MWWikitextSurfaceFragment.\n *\n * @class\n * @extends ve.dm.SourceSurfaceFragment\n *\n * @constructor\n * @param {ve.dm.Document} doc\n */\nve.dm.MWWikitextSurfaceFragment = function VeDmMwWikitextSurfaceFragment() {\n\t// Parent constructors\n\tve.dm.MWWikitextSurfaceFragment.super.apply( this, arguments );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.dm.MWWikitextSurfaceFragment, ve.dm.SourceSurfaceFragment );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.dm.MWWikitextSurfaceFragment.prototype.hasMatchingAncestor = function ( type, attributes ) {\n\tconst nodes = this.getSelectedLeafNodes();\n\n\tlet all = !!nodes.length;\n\tfor ( let i = 0, len = nodes.length; i < len; i++ ) {\n\t\tconst text = this.document.data.getText( false, nodes[ i ].getRange() );\n\t\t// TODO: Use a registry to do this matching\n\t\tswitch ( type ) {\n\t\t\tcase 'paragraph':\n\t\t\t\t// Anything but what's matched below\n\t\t\t\tall = !/^([ =]|<blockquote>)/.test( text );\n\t\t\t\tbreak;\n\t\t\tcase 'mwPreformatted':\n\t\t\t\tall = text.slice( 0, 1 ) === ' ';\n\t\t\t\tbreak;\n\t\t\tcase 'blockquote':\n\t\t\t\tall = text.slice( 0, 12 ) === '<blockquote>';\n\t\t\t\tbreak;\n\t\t\tcase 'mwHeading':\n\t\t\t\tall = new RegExp( '^={' + attributes.level + '}[^=]' ).test( text ) &&\n\t\t\t\t\tnew RegExp( '[^=]={' + attributes.level + '}$' ).test( text );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tall = false;\n\t\t\t\tbreak;\n\t\t}\n\t\tif ( !all ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn all;\n};\n\n/**\n * Wrap a text selection.\n *\n * If the selection is already identically wrapped it will be unwrapped.\n *\n * @param {string} before Text to go before selection\n * @param {string} after Text to go after selection\n * @param {Function|string} placeholder Placeholder text to insert at an empty selection\n * @param {boolean} [forceWrap=false] Force wrapping, even if matching wrapping exists\n * @return {ve.dm.MWWikitextSurfaceFragment}\n * @chainable\n */\nve.dm.MWWikitextSurfaceFragment.prototype.wrapText = function ( before, after, placeholder, forceWrap ) {\n\tplaceholder = OO.ui.resolveMsg( placeholder );\n\n\tfunction unwrap( fragment ) {\n\t\tconst text = fragment.getText();\n\t\tif (\n\t\t\t( !before || text.slice( 0, before.length ) === before ) &&\n\t\t\t( !after || text.slice( -after.length ) === after )\n\t\t) {\n\t\t\tfragment.unwrapText( before.length, after.length );\n\t\t\t// Just the placeholder left, nothing meaningful was selected so just remove it\n\t\t\tif ( fragment.getText() === placeholder ) {\n\t\t\t\tfragment.removeContent();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tif ( !forceWrap && ( unwrap( this ) || unwrap( this.adjustLinearSelection( -before.length, after.length ) ) ) ) {\n\t\treturn this;\n\t} else {\n\t\tif ( placeholder && this.getSelection().isCollapsed() ) {\n\t\t\tthis.insertContent( placeholder );\n\t\t}\n\t\tconst wrappedFragment = this.clone();\n\t\tconst wasExcludingInsertions = this.willExcludeInsertions();\n\t\tthis.setExcludeInsertions( true );\n\t\tthis.collapseToStart().insertContent( before );\n\t\tthis.collapseToEnd().insertContent( after );\n\t\tthis.setExcludeInsertions( wasExcludingInsertions );\n\t\treturn wrappedFragment;\n\t}\n};\n\n/**\n * Unwrap a fixed amount of text\n *\n * @param {number} before Amount of text to remove from start\n * @param {number} after Amount of text to remove from end\n * @return {ve.dm.MWWikitextSurfaceFragment}\n * @chainable\n */\nve.dm.MWWikitextSurfaceFragment.prototype.unwrapText = function ( before, after ) {\n\tthis.collapseToStart().adjustLinearSelection( 0, before ).removeContent();\n\tthis.collapseToEnd().adjustLinearSelection( -after, 0 ).removeContent();\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWWikitextSurfaceFragment.prototype.convertToSource = function ( doc ) {\n\tif ( !doc.data.hasContent() ) {\n\t\treturn ve.createDeferred().resolve( '' ).promise();\n\t}\n\n\tconst wikitextPromise = ve.init.target.getWikitextFragment( doc, false );\n\n\t// TODO: Emit an event to trigger the progress bar\n\tconst progressPromise = ve.init.target.getSurface().createProgress(\n\t\twikitextPromise, ve.msg( 'visualeditor-generating-wikitext-progress' )\n\t).then( ( progressBar, cancelPromise ) => {\n\t\tcancelPromise.fail( () => {\n\t\t\twikitextPromise.abort();\n\t\t} );\n\t} );\n\n\treturn ve.promiseAll( [ wikitextPromise, progressPromise ] ).then( ( wikitext ) => {\n\t\tconst deferred = ve.createDeferred();\n\t\tsetTimeout( () => {\n\t\t\tif ( wikitext !== undefined ) {\n\t\t\t\tdeferred.resolve( wikitext );\n\t\t\t} else {\n\t\t\t\tdeferred.reject();\n\t\t\t}\n\t\t}, ve.init.target.getSurface().dialogs.getTeardownDelay() );\n\t\treturn deferred.promise();\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.dm.MWWikitextSurfaceFragment.prototype.convertFromSource = function ( source ) {\n\tlet parsePromise;\n\tif ( !source ) {\n\t\tparsePromise = ve.createDeferred().resolve(\n\t\t\tve.dm.Document.static.newBlankDocument()\n\t\t).promise();\n\t} else {\n\t\tparsePromise = ve.init.target.parseWikitextFragment( source, false, this.getDocument() ).then( ( response ) => ve.dm.converter.getModelFromDom(\n\t\t\tve.createDocumentFromHtml( response.visualeditor.content )\n\t\t) );\n\t}\n\n\t// TODO: Show progress bar without breaking WindowAction\n\t/*\n\tve.init.target.getSurface().createProgress(\n\t\tparsePromise, ve.msg( 'visualeditor-generating-wikitext-progress' )\n\t).done( ( progressBar, cancelPromise ) => {\n\t\tcancelPromise.fail( () => {\n\t\t\tparsePromise.abort();\n\t\t} );\n\t} );\n\t*/\n\n\treturn parsePromise;\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.ApiResponseCache.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/modules/ve-mw/init/apiresponsecache/ve.init.mw.GalleryImageInfoCache.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/modules/ve-mw/init/apiresponsecache/ve.init.mw.ImageInfoCache.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/modules/ve-mw/init/apiresponsecache/ve.init.mw.LinkCache.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":81,"column":2,"nodeType":"CallExpression","endLine":98,"endColumn":5}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization LinkCache class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Caches information about titles.\n *\n * @class\n * @extends ve.init.mw.ApiResponseCache\n * @constructor\n * @param {mw.Api} [api]\n */\nve.init.mw.LinkCache = function VeInitMwLinkCache() {\n\t// Parent constructor\n\tve.init.mw.LinkCache.super.apply( this, arguments );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.LinkCache, ve.init.mw.ApiResponseCache );\n\n/* Static methods */\n\n/**\n * Get the icon name to use for a particular link type\n *\n * @param {Object} linkData Link data\n * @return {string} Icon name\n */\nve.init.mw.LinkCache.static.getIconForLink = function ( linkData ) {\n\tif ( linkData.missing ) {\n\t\treturn 'articleNotFound';\n\t}\n\tif ( linkData.redirect ) {\n\t\treturn 'articleRedirect';\n\t}\n\tif ( linkData.disambiguation ) {\n\t\treturn 'articleDisambiguation';\n\t}\n\treturn 'article';\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.LinkCache.static.processPage = function ( page ) {\n\treturn {\n\t\tmissing: page.missing !== undefined,\n\t\tknown: page.known !== undefined,\n\t\tredirect: page.redirect !== undefined,\n\t\tdisambiguation: ve.getProp( page, 'pageprops', 'disambiguation' ) !== undefined,\n\t\thidden: ve.getProp( page, 'pageprops', 'hiddencat' ) !== undefined,\n\t\timageUrl: ve.getProp( page, 'thumbnail', 'source' ),\n\t\tdescription: page.description\n\t};\n};\n\n/* Methods */\n\n/**\n * Requests information about the title, then adds classes to the provided element as appropriate.\n *\n * @param {string} title\n * @param {jQuery} $element Element to style\n * @param {boolean} [hasFragment=false] Whether the link goes to a fragment\n */\nve.init.mw.LinkCache.prototype.styleElement = function ( title, $element, hasFragment ) {\n\tconst cachedMissingData = this.getCached( '_missing/' + title );\n\n\tlet promise;\n\t// Use the synchronous missing link cache data if it exists\n\tif ( cachedMissingData ) {\n\t\tpromise = ve.createDeferred().resolve( cachedMissingData ).promise();\n\t} else {\n\t\tpromise = this.get( title );\n\t}\n\n\tpromise.done( ( data ) => {\n\t\tif ( data.missing && !data.known ) {\n\t\t\t$element.addClass( 'new' );\n\t\t} else {\n\t\t\t// Provided by core MediaWiki, styled like a <strong> element by default.\n\t\t\tif ( !hasFragment && this.constructor.static.normalizeTitle( title ) === this.constructor.static.normalizeTitle( mw.config.get( 'wgRelevantPageName' ) ) ) {\n\t\t\t\t$element.addClass( 'mw-selflink' );\n\t\t\t}\n\t\t\t// Provided by core MediaWiki, no styles by default.\n\t\t\tif ( data.redirect ) {\n\t\t\t\t$element.addClass( 'mw-redirect' );\n\t\t\t}\n\t\t\t// Provided by the Disambiguator extension, no styles by default.\n\t\t\tif ( data.disambiguation ) {\n\t\t\t\t$element.addClass( 'mw-disambig' );\n\t\t\t}\n\t\t}\n\t} );\n};\n\n/**\n * Given a chunk of Parsoid HTML, applies style transformations.\n *\n * Previously this was used for applying red-link styles, but that\n * has since been upstreamed to Parsoid.\n *\n * TODO: Evaluate if this method should be renamed/removed as it\n * now has nothing to do with the link cache.\n *\n * @param {jQuery} $elements Elements to style\n * @param {HTMLDocument} doc Base document to use for normalisation\n */\nve.init.mw.LinkCache.prototype.styleParsoidElements = function ( $elements ) {\n\tif ( ve.dm.MWLanguageVariantNode ) {\n\t\t// Render the user's preferred variant in language converter markup\n\t\t$elements.each( ( i, element ) => {\n\t\t\tve.dm.MWLanguageVariantNode.static.processVariants( element );\n\t\t} );\n\t}\n};\n\n/**\n * Enable or disable automatic assumption of existence.\n *\n * While enabled, any get() for a title that's not already in the cache will return\n * { missing: false } and write that to the cache.\n *\n * @param {boolean} assume Assume all uncached titles exist\n */\nve.init.mw.LinkCache.prototype.setAssumeExistence = function ( assume ) {\n\tthis.assumeExistence = !!assume;\n};\n\n/**\n * Set link missing data\n *\n * Stored separately from the full link data cache\n *\n * @param {Object} entries Object keyed by page title, with the values being data objects\n */\nve.init.mw.LinkCache.prototype.setMissing = function ( entries ) {\n\tconst missingEntries = {};\n\tfor ( const name in entries ) {\n\t\tmissingEntries[ '_missing/' + name ] = entries[ name ];\n\t}\n\tthis.set( missingEntries );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.LinkCache.prototype.get = function ( title ) {\n\tconst data = {};\n\tif ( this.assumeExistence ) {\n\t\tdata[ this.constructor.static.normalizeTitle( title ) ] = { missing: false };\n\t\tthis.setMissing( data );\n\t}\n\n\t// Parent method\n\treturn ve.init.mw.LinkCache.super.prototype.get.call( this, title );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.LinkCache.prototype.getRequestPromise = function ( subqueue ) {\n\treturn this.api.get( {\n\t\taction: 'query',\n\t\tprop: 'info|pageprops|pageimages|description',\n\t\tpithumbsize: 80,\n\t\tpilimit: subqueue.length,\n\t\tppprop: 'disambiguation|hiddencat',\n\t\ttitles: subqueue,\n\t\tcontinue: ''\n\t} );\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1155,"column":2,"nodeType":"CallExpression","endLine":1156,"endColumn":41},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":1155,"column":2,"nodeType":"CallExpression","endLine":1157,"endColumn":38},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1587,"column":32,"nodeType":"CallExpression","endLine":1588,"endColumn":42},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":1587,"column":32,"nodeType":"CallExpression","endLine":1589,"endColumn":49},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1645,"column":3,"nodeType":"CallExpression","endLine":1646,"endColumn":50},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":1645,"column":3,"nodeType":"CallExpression","endLine":1647,"endColumn":55},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1721,"column":37,"nodeType":"CallExpression","endLine":1727,"endColumn":55},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":1721,"column":37,"nodeType":"CallExpression","endLine":1728,"endColumn":52},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":2005,"column":2,"nodeType":"CallExpression","endLine":2073,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":2005,"column":2,"nodeType":"CallExpression","endLine":2075,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":2010,"column":3,"nodeType":"CallExpression","endLine":2072,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":2482,"column":18,"nodeType":"CallExpression","endLine":2488,"endColumn":6}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":224,"column":9,"nodeType":"CallExpression","endLine":224,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":352,"column":3,"nodeType":"CallExpression","endLine":352,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":586,"column":2,"nodeType":"CallExpression","endLine":586,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":625,"column":2,"nodeType":"CallExpression","endLine":625,"endColumn":79,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":630,"column":3,"nodeType":"CallExpression","endLine":630,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":630,"column":3,"nodeType":"CallExpression","endLine":630,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":634,"column":7,"nodeType":"CallExpression","endLine":634,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":637,"column":3,"nodeType":"CallExpression","endLine":637,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2406,"column":22,"nodeType":"CallExpression","endLine":2406,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2415,"column":21,"nodeType":"CallExpression","endLine":2415,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2435,"column":22,"nodeType":"CallExpression","endLine":2435,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":2440,"column":3,"nodeType":"CallExpression","endLine":2440,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization ArticleTarget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n\n/**\n * Initialization MediaWiki article target.\n *\n * @class\n * @extends ve.init.mw.Target\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {Object} [config.toolbarConfig]\n * @param {boolean} [config.register=true]\n */\nve.init.mw.ArticleTarget = function VeInitMwArticleTarget( config ) {\n\tconfig = config || {};\n\tconfig.toolbarConfig = ve.extendObject( {\n\t\tshadow: true,\n\t\tactions: true,\n\t\tfloatable: true\n\t}, config.toolbarConfig );\n\n\t// Parent constructor\n\tve.init.mw.ArticleTarget.super.call( this, config );\n\n\t// Register\n\tif ( config.register !== false ) {\n\t\t// ArticleTargets are never destroyed, but we can't trust ve.init.target to\n\t\t// not get overridden by other targets that may get created on the page.\n\t\tve.init.articleTarget = this;\n\t}\n\n\t// Properties\n\tthis.saveDialog = null;\n\tthis.saveDeferred = null;\n\tthis.saveFields = {};\n\tthis.wasSaveable = null;\n\tthis.docToSave = null;\n\tthis.originalDmDocPromise = null;\n\tthis.originalHtml = null;\n\tthis.toolbarSaveButton = null;\n\tthis.pageExists = mw.config.get( 'wgRelevantArticleId', 0 ) !== 0;\n\tconst enableVisualSectionEditing = mw.config.get( 'wgVisualEditorConfig' ).enableVisualSectionEditing;\n\tthis.enableVisualSectionEditing = enableVisualSectionEditing === true || enableVisualSectionEditing === this.constructor.static.trackingName;\n\tthis.toolbarScrollOffset = mw.config.get( 'wgVisualEditorToolbarScrollOffset', 0 );\n\tthis.currentUrl = new URL( location.href );\n\tthis.section = null;\n\tthis.visibleSection = null;\n\tthis.visibleSectionOffset = null;\n\tthis.sectionTitle = null;\n\tthis.editSummaryValue = null;\n\tthis.initialEditSummary = null;\n\tthis.initialCheckboxes = {};\n\n\tthis.viewUrl = new URL( mw.util.getUrl( this.getPageName() ), location.href );\n\tthis.isViewPage = (\n\t\tmw.config.get( 'wgAction' ) === 'view' &&\n\t\t!this.currentUrl.searchParams.has( 'diff' )\n\t);\n\n\tthis.copyrightWarning = null;\n\tthis.checkboxFields = null;\n\tthis.checkboxesByName = null;\n\tthis.$saveAccessKeyElements = null;\n\n\tthis.$editableContent = this.getEditableContent();\n\n\t// Sometimes we actually don't want to send a useful oldid\n\t// if we do, PostEdit will give us a 'page restored' message\n\t// Use undefined instead of 0 for new documents (T262838)\n\tthis.requestedRevId = mw.config.get( 'wgEditLatestRevision' ) ? mw.config.get( 'wgCurRevisionId' ) : mw.config.get( 'wgRevisionId' ) || undefined;\n\tthis.currentRevisionId = mw.config.get( 'wgCurRevisionId' ) || undefined;\n\tthis.revid = this.requestedRevId || this.currentRevisionId;\n\n\tthis.edited = false;\n\tthis.restoring = !!this.requestedRevId && this.requestedRevId !== this.currentRevisionId;\n\tthis.pageDeletedWarning = false;\n\tthis.events = {\n\t\ttrack: () => {},\n\t\ttrackActivationStart: () => {},\n\t\ttrackActivationComplete: () => {}\n\t};\n\n\tthis.preparedCacheKeyPromise = null;\n\tthis.clearState();\n\n\t// Initialization\n\tthis.$element.addClass( 've-init-mw-articleTarget' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.ArticleTarget, ve.init.mw.Target );\n\n/* Events */\n\n/**\n * @event ve.init.mw.ArticleTarget#save\n * @param {Object} data Save data from the API, see ve.init.mw.ArticleTarget#saveComplete\n * Fired immediately after a save is successfully completed\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#savePreview\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveReview\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveInitiated\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveWorkflowBegin\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#showChanges\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#noChanges\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#saveError\n * @param {string} code Error code\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#loadError\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#showChangesError\n */\n\n/**\n * @event ve.init.mw.ArticleTarget#serializeError\n */\n\n/**\n * Fired when serialization is complete\n *\n * @event ve.init.mw.ArticleTarget#serializeComplete\n */\n\n/* Static Properties */\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.name = 'article';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.annotateImportedData = true;\n\n/**\n * Tracking name of target class. Used by ArticleTargetEvents to identify which target we are tracking.\n *\n * @static\n * @property {string}\n * @inheritable\n */\nve.init.mw.ArticleTarget.static.trackingName = 'mwTarget';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.integrationType = 'page';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.platformType = 'other';\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.documentCommands = [\n\t...ve.init.mw.ArticleTarget.super.static.documentCommands,\n\t// Make help dialog triggerable from anywhere\n\t'commandHelp',\n\t// Make save commands triggerable from anywhere\n\t'showSave',\n\t'showChanges',\n\t'showPreview',\n\t'showMinoredit',\n\t'showWatchthis'\n];\n\n/* Static methods */\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.static.parseDocument = function ( documentString, mode, section, onlySection ) {\n\t// Add trailing linebreak to non-empty wikitext documents for consistency\n\t// with old editor and usability. Will be stripped on save. T156609\n\tif ( mode === 'source' && documentString ) {\n\t\tdocumentString += '\\n';\n\t}\n\n\t// Parent method\n\treturn ve.init.mw.ArticleTarget.super.static.parseDocument.call( this, documentString, mode, section, onlySection );\n};\n\n/**\n * Get the editable part of the page\n *\n * @return {jQuery} Editable DOM selection\n */\nve.init.mw.ArticleTarget.prototype.getEditableContent = function () {\n\treturn $( '#mw-content-text' );\n};\n\n/**\n * Build DOM for the redirect page subtitle (#redirectsub).\n *\n * @return {jQuery}\n */\nve.init.mw.ArticleTarget.static.buildRedirectSub = function () {\n\tconst $subMsg = mw.message( 'redirectpagesub' ).parseDom();\n\t// Page subtitle\n\t// Compare: Article::view()\n\treturn $( '<span>' )\n\t\t.attr( 'id', 'redirectsub' )\n\t\t.append( $subMsg );\n};\n\n/**\n * Build DOM for the redirect page content header (.redirectMsg).\n *\n * @param {string} title Redirect target\n * @return {jQuery}\n */\nve.init.mw.ArticleTarget.static.buildRedirectMsg = function ( title ) {\n\tconst $link = $( '<a>' )\n\t\t.attr( {\n\t\t\thref: mw.Title.newFromText( title ).getUrl(),\n\t\t\ttitle: mw.msg( 'visualeditor-redirect-description', title )\n\t\t} )\n\t\t.text( title );\n\tve.init.platform.linkCache.styleElement( title, $link );\n\n\t// Page content header\n\t// Compare: LinkRenderer::makeRedirectHeader()\n\treturn $( '<div>' )\n\t\t.addClass( 'redirectMsg' )\n\t\t// Hack: This is normally inside #mw-content-text, but we may insert it before, so we need this.\n\t\t// The following classes are used here:\n\t\t// * mw-content-ltr\n\t\t// * mw-content-rtl\n\t\t.addClass( 'mw-content-' + mw.config.get( 'wgVisualEditor' ).pageLanguageDir )\n\t\t.append(\n\t\t\t$( '<p>' ).text( mw.msg( 'redirectto' ) ),\n\t\t\t$( '<ul>' )\n\t\t\t\t.addClass( 'redirectText' )\n\t\t\t\t.append( $( '<li>' ).append( $link ) )\n\t\t);\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.setDefaultMode = function () {\n\tconst oldDefaultMode = this.defaultMode;\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.setDefaultMode.apply( this, arguments );\n\n\tif ( this.defaultMode !== oldDefaultMode ) {\n\t\tthis.updateTabs();\n\t\tif ( mw.libs.ve.setEditorPreference ) {\n\t\t\t// only set up by DAT.init\n\t\t\tmw.libs.ve.setEditorPreference( this.defaultMode === 'visual' ? 'visualeditor' : 'wikitext' );\n\t\t}\n\t}\n};\n\n/**\n * Update state of editing tabs from this target\n */\nve.init.mw.ArticleTarget.prototype.updateTabs = function () {};\n\n/**\n * Handle response to a successful load request.\n *\n * This method is called within the context of a target instance. If successful the DOM from the\n * server will be parsed, stored in {this.doc} and then {this.documentReady} will be called.\n *\n * @param {Object} response API response data\n * @param {string} status Text status message\n */\nve.init.mw.ArticleTarget.prototype.loadSuccess = function ( response ) {\n\tconst data = response ? ( response.visualeditor || response.visualeditoredit ) : null;\n\n\tif ( !data || typeof data.content !== 'string' ) {\n\t\tthis.loadFail( 've-api', { errors: [ {\n\t\t\tcode: 've-api',\n\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t} ] } );\n\t} else if ( response.veMode && response.veMode !== this.getDefaultMode() ) {\n\t\tthis.loadFail( 've-mode', { errors: [ {\n\t\t\tcode: 've-mode',\n\t\t\thtml: mw.message( 'visualeditor-loaderror-wrongmode',\n\t\t\t\tresponse.veMode, this.getDefaultMode() ).parse()\n\t\t} ] } );\n\t} else {\n\t\tthis.track( 'trace.parseResponse.enter' );\n\t\tthis.originalHtml = data.content;\n\t\tthis.etag = data.etag;\n\t\t// We are reading from `preloaded` which comes from the VE API. If we want\n\t\t// to make the VE API non-blocking in the future we will need to handle\n\t\t// special-cases like this where the content doesn't come from RESTBase.\n\t\tthis.fromEditedState = !!data.fromEditedState || !!data.preloaded;\n\t\tthis.switched = data.switched;\n\t\tconst mode = this.getDefaultMode();\n\t\tconst section = ( mode === 'source' || this.enableVisualSectionEditing ) ? this.section : null;\n\t\tthis.doc = this.constructor.static.parseDocument( this.originalHtml, mode, section );\n\t\tthis.originalDmDocPromise = null;\n\n\t\t// Properties that don't come from the API\n\t\tthis.initialSourceRange = data.initialSourceRange;\n\t\tthis.recovered = data.recovered;\n\t\tthis.isRedirect = false;\n\n\t\t// Parse data this not available in RESTBase\n\t\tif ( !this.parseMetadata( response ) ) {\n\t\t\t// Invalid metadata, loadFail() or load() has been called\n\t\t\treturn;\n\t\t}\n\n\t\tthis.track( 'trace.parseResponse.exit' );\n\n\t\t// Everything worked, the page was loaded, continue initializing the editor\n\t\tthis.documentReady( this.doc );\n\t}\n\n\tif ( !this.isViewPage ) {\n\t\t$( '#firstHeading' ).text(\n\t\t\tmw.Title.newFromText( this.getPageName() ).getPrefixedText()\n\t\t);\n\t}\n};\n\n/**\n * Parse document metadata from the API response\n *\n * @param {Object} response API response data\n * @return {boolean} Whether metadata was loaded successfully. If true, you should call\n * loadSuccess(). If false, either that loadFail() has been called or we're retrying via load().\n */\nve.init.mw.ArticleTarget.prototype.parseMetadata = function ( response ) {\n\tconst data = response ? ( response.visualeditor || response.visualeditoredit ) : null;\n\n\tif ( !data ) {\n\t\tthis.loadFail( 've-api', { errors: [ {\n\t\t\tcode: 've-api',\n\t\t\thtml: mw.message( 'api-clientside-error-invalidresponse' ).parse()\n\t\t} ] } );\n\t\treturn false;\n\t}\n\n\tthis.remoteNotices = ve.getObjectValues( data.notices );\n\tthis.protectedClasses = data.protectedClasses;\n\n\tthis.baseTimeStamp = data.basetimestamp;\n\tthis.startTimeStamp = data.starttimestamp;\n\tthis.revid = data.oldid || undefined;\n\tthis.preloaded = !!data.preloaded;\n\n\tthis.copyrightWarning = data.copyrightWarning;\n\n\tthis.checkboxesDef = data.checkboxesDef;\n\tthis.checkboxesMessages = data.checkboxesMessages;\n\tmw.messages.set( data.checkboxesMessages );\n\n\tthis.canEdit = data.canEdit;\n\tthis.wouldautocreate = data.wouldautocreate;\n\n\t// When docRevId is `undefined` it indicates that the page doesn't exist\n\tlet docRevId;\n\tconst aboutDoc = this.doc.documentElement && this.doc.documentElement.getAttribute( 'about' );\n\tif ( aboutDoc ) {\n\t\tconst docRevIdMatches = aboutDoc.match( /revision\\/([0-9]*)$/ );\n\t\tif ( docRevIdMatches.length >= 2 ) {\n\t\t\tdocRevId = parseInt( docRevIdMatches[ 1 ] );\n\t\t}\n\t}\n\t// There is no docRevId in source mode (doc is just a string), new visual documents, or when\n\t// switching from source mode with changes.\n\tif ( this.getDefaultMode() === 'visual' && !( this.switched && this.fromEditedState ) && docRevId !== this.revid ) {\n\t\tif ( this.retriedRevIdConflict ) {\n\t\t\t// Retried already, just error the second time.\n\t\t\tthis.loadFail( 've-api', { errors: [ {\n\t\t\t\tcode: 've-api',\n\t\t\t\thtml: mw.message( 'visualeditor-loaderror-revidconflict',\n\t\t\t\t\tString( docRevId ), String( this.revid ) ).parse()\n\t\t\t} ] } );\n\t\t} else {\n\t\t\tthis.retriedRevIdConflict = true;\n\t\t\t// TODO this retries both requests, in RESTbase mode we should only retry\n\t\t\t// the request that gave us the lower revid\n\t\t\tthis.loading = null;\n\t\t\t// HACK: Load with explicit revid to hopefully prevent this from happening again\n\t\t\tthis.requestedRevId = Math.max( docRevId || 0, this.revid );\n\t\t\tthis.load();\n\t\t}\n\t\treturn false;\n\t} else {\n\t\t// Set this to false after a successful load, so we don't immediately give up\n\t\t// if a subsequent load mismatches again\n\t\tthis.retriedRevIdConflict = false;\n\t}\n\n\t// Save dialog doesn't exist yet, so create an overlay for the widgets, and\n\t// append it to the save dialog later.\n\tthis.$saveDialogOverlay = $( '<div>' ).addClass( 'oo-ui-window-overlay' );\n\tconst checkboxes = mw.libs.ve.targetLoader.createCheckboxFields( this.checkboxesDef, { $overlay: this.$saveDialogOverlay } );\n\tthis.checkboxFields = checkboxes.checkboxFields;\n\tthis.checkboxesByName = checkboxes.checkboxesByName;\n\n\tthis.checkboxFields.forEach( ( field ) => {\n\t\t// TODO: This method should be upstreamed or moved so that targetLoader\n\t\t// can use it safely.\n\t\tve.targetLinksToNewWindow( field.$label[ 0 ] );\n\t} );\n\n\treturn true;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.documentReady = function () {\n\t// We need to wait until documentReady as local notices may require special messages\n\tthis.editNotices = this.remoteNotices.concat(\n\t\tthis.localNoticeMessages.map( ( msgKey ) => '<p>' + ve.init.platform.getParsedMessage( msgKey ) + '</p>' )\n\t);\n\n\tthis.loading = null;\n\tthis.edited = this.fromEditedState;\n\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.documentReady.apply( this, arguments );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.surfaceReady = function () {\n\tconst accessKeyPrefix = $.fn.updateTooltipAccessKeys.getAccessKeyPrefix().replace( /-/g, '+' ),\n\t\taccessKeyModifiers = new ve.ui.Trigger( accessKeyPrefix + '-' ).modifiers,\n\t\tsurfaceModel = this.getSurface().getModel();\n\n\t// loadSuccess() may have called setAssumeExistence( true );\n\tve.init.platform.linkCache.setAssumeExistence( false );\n\tsurfaceModel.connect( this, {\n\t\thistory: 'updateToolbarSaveButtonState'\n\t} );\n\n\t// Handle cancel events, i.e. pressing <escape>\n\tthis.getSurface().connect( this, {\n\t\tcancel: 'onSurfaceCancel'\n\t} );\n\n\t// Iterate over the trigger registry and resolve any access key conflicts\n\tfor ( const name in ve.ui.triggerRegistry.registry ) {\n\t\tconst triggers = ve.ui.triggerRegistry.registry[ name ];\n\t\tfor ( let i = 0; i < triggers.length; i++ ) {\n\t\t\tif ( ve.compare( triggers[ i ].modifiers, accessKeyModifiers ) ) {\n\t\t\t\tthis.disableAccessKey( triggers[ i ].primary );\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !mw.config.get( 'wgVisualEditorConfig' ).enableHelpCompletion ) {\n\t\tthis.getSurface().commandRegistry.unregister( 'openHelpCompletions' );\n\t\tthis.getSurface().commandRegistry.unregister( 'openHelpCompletionsTrigger' );\n\t}\n\n\tif ( !this.canEdit ) {\n\t\tthis.getSurface().setReadOnly( true );\n\t} else {\n\t\t// TODO: If the user rejects joining the collab session, start auto-save\n\t\tif ( !this.currentUrl.searchParams.has( 'collabSession' ) ) {\n\t\t\t// Auto-save\n\t\t\tthis.initAutosave();\n\t\t}\n\n\t\tsetTimeout( () => {\n\t\t\tmw.libs.ve.targetSaver.preloadDeflate();\n\t\t}, 500 );\n\t}\n\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.surfaceReady.apply( this, arguments );\n\n\tmw.hook( 've.activationComplete' ).fire();\n};\n\n/**\n * Handle surface cancel events\n */\nve.init.mw.ArticleTarget.prototype.onSurfaceCancel = function () {\n\tthis.tryTeardown( false, 'navigate-read' );\n};\n\n/**\n * Runs after the surface has been made ready and visible\n *\n * Implementing sub-classes must call this method.\n */\nve.init.mw.ArticleTarget.prototype.afterSurfaceReady = function () {\n\tthis.restoreEditSection();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.storeDocState = function ( html ) {\n\tconst mode = this.getSurface().getMode();\n\tthis.getSurface().getModel().storeDocState( {\n\t\trequest: {\n\t\t\tpageName: this.getPageName(),\n\t\t\tmode: mode,\n\t\t\t// Check true section editing is in use\n\t\t\tsection: ( mode === 'source' || this.enableVisualSectionEditing ) ? this.section : null\n\t\t},\n\t\tresponse: {\n\t\t\t// --------------------------------------------------------------------------------\n\t\t\t// This should match the API result in ApiVisualEditor.php and ArticleTarget#getWikitextDataPromiseForDoc\n\t\t\t// --------------------------------------------------------------------------------\n\t\t\tbasetimestamp: this.baseTimeStamp,\n\t\t\t// `blockinfo` is not used by this client\n\t\t\tcanEdit: this.canEdit,\n\t\t\tcheckboxesDef: this.checkboxesDef,\n\t\t\tcheckboxesMessages: this.checkboxesMessages,\n\t\t\t// `content` is not needed here, we store `html` instead\n\t\t\tcopyrightWarning: this.copyrightWarning,\n\t\t\tetag: this.etag,\n\t\t\tfromEditedState: this.fromEditedState, // extra\n\t\t\tnotices: this.remoteNotices,\n\t\t\toldid: this.revid,\n\t\t\tpreloaded: this.preloaded,\n\t\t\tprotectedClasses: this.protectedClasses,\n\t\t\t// `result` is not used\n\t\t\tstarttimestamp: this.startTimeStamp,\n\t\t\tswitched: this.switched,\n\t\t\twouldautocreate: this.wouldautocreate\n\t\t}\n\t}, html );\n};\n\n/**\n * Disable an access key by removing the attribute from any element containing it\n *\n * @param {string} key Access key\n */\nve.init.mw.ArticleTarget.prototype.disableAccessKey = function ( key ) {\n\t$( '[accesskey=' + key + ']' ).each( ( i, el ) => {\n\t\tconst $el = $( el );\n\n\t\t$el\n\t\t\t.attr( 'data-old-accesskey', $el.attr( 'accesskey' ) )\n\t\t\t.removeAttr( 'accesskey' );\n\t} );\n};\n\n/**\n * Re-enable all access keys\n */\nve.init.mw.ArticleTarget.prototype.restoreAccessKeys = function () {\n\t$( '[data-old-accesskey]' ).each( ( i, el ) => {\n\t\tconst $el = $( el );\n\n\t\t$el\n\t\t\t.attr( 'accesskey', $el.attr( 'data-old-accesskey' ) )\n\t\t\t.removeAttr( 'data-old-accesskey' );\n\t} );\n};\n\n/**\n * Handle an unsuccessful load request.\n *\n * This method is called within the context of a target instance.\n *\n * @param {string} code Error code from mw.Api\n * @param {Object} errorDetails API response\n * @fires ve.init.mw.ArticleTarget#loadError\n */\nve.init.mw.ArticleTarget.prototype.loadFail = function () {\n\tthis.loading = null;\n\tthis.emit( 'loadError' );\n};\n\n/**\n * Replace the page content with new HTML.\n *\n * @method\n * @param {string} html Rendered HTML from server\n * @param {string} categoriesHtml Rendered categories HTML from server\n * @param {string} displayTitle HTML to show as the page title\n * @param {Object} lastModified Object containing user-formatted date\n * and time strings, or undefined if we made no change.\n * @param {string} contentSub HTML to show as the content subtitle\n * @param {Array} sections Section data to display in the TOC\n */\nve.init.mw.ArticleTarget.prototype.replacePageContent = function (\n\thtml, categoriesHtml, displayTitle, lastModified, contentSub, sections\n) {\n\t// eslint-disable-next-line no-jquery/no-append-html\n\tthis.$editableContent.find( '.mw-parser-output' ).first().replaceWith( html );\n\tmw.hook( 'wikipage.content' ).fire( this.$editableContent );\n\n\tif ( displayTitle ) {\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t$( '#firstHeading' ).html( displayTitle );\n\t}\n\n\t// Categories are only shown in AMC on mobile\n\tif ( $( '#catlinks' ).length ) {\n\t\tconst $categories = $( $.parseHTML( categoriesHtml ) );\n\t\tmw.hook( 'wikipage.categories' ).fire( $categories );\n\t\t$( '#catlinks' ).replaceWith( $categories );\n\t}\n\n\tmw.util.clearSubtitle();\n\tmw.util.addSubtitle( contentSub );\n\n\tthis.setRealRedirectInterface();\n\n\tmw.hook( 'wikipage.tableOfContents' ).fire( sections );\n};\n\n/**\n * Handle successful DOM save event.\n *\n * @param {Object} data Save data from the API\n * @param {boolean} data.nocontent Indicates that page HTML and related properties were omitted\n * @param {string} data.content Rendered page HTML from server\n * @param {string} data.categorieshtml Rendered categories HTML from server\n * @param {number} data.newrevid New revision id, undefined if unchanged\n * @param {boolean} data.isRedirect Whether this page is a redirect or not\n * @param {string} data.displayTitleHtml What HTML to show as the page title\n * @param {Object} data.lastModified Object containing user-formatted date\n * and time strings, or undefined if we made no change.\n * @param {string} data.contentSub HTML to show as the content subtitle\n * @param {Array} data.modules The modules to be loaded on the page\n * @param {Object} data.jsconfigvars The mw.config values needed on the page\n * @param {Array} data.sections Section data to display in the TOC\n * @param {boolean} data.tempusercreated True if we just became logged in as a temporary user\n * @param {string} data.tempusercreatedredirect URL to visit to finish creating temp account\n * @fires ve.init.mw.ArticleTarget#save\n */\nve.init.mw.ArticleTarget.prototype.saveComplete = function ( data ) {\n\tthis.editSummaryValue = null;\n\tthis.initialEditSummary = null;\n\n\tthis.saveDeferred.resolve();\n\tthis.emit( 'save', data );\n\n\t// This is a page creation, a restoration, or we loaded the editor from a non-view page,\n\t// or we just became logged in as a temporary user: refresh the page.\n\tif ( data.nocontent || data.tempusercreated ) {\n\t\t// Teardown the target, ensuring auto-save data is cleared\n\t\tthis.teardown().then( () => {\n\t\t\tif ( data.newrevid !== undefined ) {\n\t\t\t\tlet action;\n\t\t\t\tif ( this.restoring ) {\n\t\t\t\t\taction = 'restored';\n\t\t\t\t} else if ( !this.pageExists ) {\n\t\t\t\t\taction = 'created';\n\t\t\t\t} else {\n\t\t\t\t\taction = 'saved';\n\t\t\t\t}\n\t\t\t\trequire( 'mediawiki.action.view.postEdit' ).fireHookOnPageReload( action, data.tempusercreated );\n\t\t\t}\n\n\t\t\tif ( data.tempusercreatedredirect ) {\n\t\t\t\tlocation.href = data.tempusercreatedredirect;\n\t\t\t} else {\n\t\t\t\tconst newUrl = new URL( this.viewUrl );\n\t\t\t\tif ( data.newrevid !== undefined ) {\n\t\t\t\t\t// For GrowthExperiments\n\t\t\t\t\tnewUrl.searchParams.set( 'venotify', 'saved' );\n\t\t\t\t}\n\t\t\t\tif ( data.isRedirect ) {\n\t\t\t\t\tnewUrl.searchParams.set( 'redirect', 'no' );\n\t\t\t\t}\n\t\t\t\tlocation.href = newUrl;\n\t\t\t}\n\t\t} );\n\t} else {\n\t\t// Update watch link to match 'watch checkbox' in save dialog.\n\t\t// User logged in if module loaded.\n\t\tif ( mw.loader.getState( 'mediawiki.page.watch.ajax' ) === 'ready' ) {\n\t\t\tconst watch = require( 'mediawiki.page.watch.ajax' );\n\n\t\t\twatch.updatePageWatchStatus(\n\t\t\t\tdata.watched,\n\t\t\t\tdata.watchlistexpiry\n\t\t\t);\n\t\t}\n\n\t\t// If we were explicitly editing an older version, make sure we won't\n\t\t// load the same old version again, now that we've saved the next edit\n\t\t// will be against the latest version.\n\t\t// If there is an ?oldid= parameter in the URL, this will cause restorePage() to remove it.\n\t\tthis.restoring = false;\n\n\t\t// Clear requestedRevId in case it was set by a retry or something; after saving\n\t\t// we don't want to go back into oldid mode anyway\n\t\tthis.requestedRevId = undefined;\n\n\t\tif ( data.newrevid !== undefined ) {\n\t\t\tmw.config.set( {\n\t\t\t\twgCurRevisionId: data.newrevid,\n\t\t\t\twgRevisionId: data.newrevid\n\t\t\t} );\n\t\t\tthis.revid = data.newrevid;\n\t\t\tthis.currentRevisionId = data.newrevid;\n\t\t}\n\n\t\t// Update module JS config values and notify ResourceLoader of any new\n\t\t// modules needed to be added to the page\n\t\tmw.config.set( data.jsconfigvars );\n\t\tmw.loader.load( data.modules );\n\n\t\tmw.config.set( {\n\t\t\twgIsRedirect: !!data.isRedirect\n\t\t} );\n\n\t\tif ( this.saveDialog ) {\n\t\t\tthis.saveDialog.reset();\n\t\t}\n\n\t\tthis.replacePageContent(\n\t\t\tdata.content,\n\t\t\tdata.categorieshtml,\n\t\t\tdata.displayTitleHtml,\n\t\t\tdata.lastModified,\n\t\t\tdata.contentSub,\n\t\t\tdata.sections\n\t\t);\n\n\t\t// Tear down the target now that we're done saving\n\t\t// Not passing trackMechanism because this isn't an abort action\n\t\tthis.tryTeardown( true );\n\t}\n};\n\n/**\n * Handle an unsuccessful save request.\n *\n * @param {HTMLDocument} doc HTML document we tried to save\n * @param {Object} saveData Options that were used\n * @param {string} code Error code\n * @param {Object|null} data Full API response data, or XHR error details\n * @fires ve.init.mw.ArticleTarget#saveError\n */\nve.init.mw.ArticleTarget.prototype.saveFail = function ( doc, saveData, code, data ) {\n\tthis.pageDeletedWarning = false;\n\n\tlet handled = false;\n\t// Handle empty response\n\tif ( !data ) {\n\t\tthis.saveErrorEmpty();\n\t\thandled = true;\n\t}\n\n\tif ( !handled && data.errors ) {\n\t\tfor ( let i = 0; i < data.errors.length; i++ ) {\n\t\t\tconst error = data.errors[ i ];\n\n\t\t\tif ( error.code === 'assertanonfailed' || error.code === 'assertuserfailed' || error.code === 'assertnameduserfailed' ) {\n\t\t\t\tthis.refreshUser().then( ( username ) => {\n\t\t\t\t\t// Reattempt the save after successfully refreshing the\n\t\t\t\t\t// user, but only if it's a temporary account (T345975)\n\t\t\t\t\tif ( error.code === 'assertanonfailed' && mw.util.isTemporaryUser( username ) ) {\n\t\t\t\t\t\tthis.startSave( this.getSaveOptions() );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.saveErrorNewUser( username );\n\t\t\t\t\t}\n\t\t\t\t}, () => {\n\t\t\t\t\tthis.saveErrorUnknown( data );\n\t\t\t\t} );\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'editconflict' ) {\n\t\t\t\tthis.editConflict();\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'pagedeleted' ) {\n\t\t\t\tthis.saveErrorPageDeleted();\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'hookaborted' ) {\n\t\t\t\tthis.saveErrorHookAborted( data );\n\t\t\t\thandled = true;\n\t\t\t} else if ( error.code === 'readonly' ) {\n\t\t\t\tthis.saveErrorReadOnly( data );\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !handled ) {\n\t\tconst saveErrorHandlerFactory = ve.init.mw.saveErrorHandlerFactory;\n\t\tfor ( const name in saveErrorHandlerFactory.registry ) {\n\t\t\tconst handler = saveErrorHandlerFactory.lookup( name );\n\t\t\tif ( handler.static.matchFunction( data ) ) {\n\t\t\t\thandler.static.process( data, this );\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Handle (other) unknown and/or unrecoverable errors\n\tif ( !handled ) {\n\t\tthis.saveErrorUnknown( data );\n\t\thandled = true;\n\t}\n\n\tlet errorCodes;\n\tif ( data.errors ) {\n\t\terrorCodes = OO.unique( data.errors.map( ( err ) => err.code ) ).join( ',' );\n\t} else if ( ve.getProp( data, 'visualeditoredit', 'edit', 'captcha' ) ) {\n\t\t// Eww\n\t\terrorCodes = 'captcha';\n\t} else {\n\t\terrorCodes = 'http-' + ( ( data.xhr && data.xhr.status ) || 0 );\n\t}\n\tthis.emit( 'saveError', errorCodes );\n};\n\n/**\n * Show an save process error message\n *\n * @param {string|jQuery|Node[]} msg Message content (string of HTML, jQuery object or array of\n * Node objects)\n * @param {boolean} [warning=false] Whether or not this is a warning.\n */\nve.init.mw.ArticleTarget.prototype.showSaveError = function ( msg, warning ) {\n\tthis.saveDeferred.reject( [ new OO.ui.Error( msg, { warning: warning } ) ] );\n};\n\n/**\n * Extract the error messages from an erroneous API response\n *\n * @param {Object} data API response data\n * @return {jQuery}\n */\nve.init.mw.ArticleTarget.prototype.extractErrorMessages = function ( data ) {\n\tconst $errorMsgs = ( new mw.Api() ).getErrorMessage( data );\n\t// Warning, this assumes there are only Element nodes in the jQuery set\n\t$errorMsgs.toArray().forEach( ve.targetLinksToNewWindow );\n\treturn $errorMsgs;\n};\n\n/**\n * Handle general save error\n */\nve.init.mw.ArticleTarget.prototype.saveErrorEmpty = function () {\n\tthis.showSaveError( this.extractErrorMessages( null ) );\n};\n\n/**\n * Handle hook abort save error\n *\n * @param {Object} data API response data\n */\nve.init.mw.ArticleTarget.prototype.saveErrorHookAborted = function ( data ) {\n\tthis.showSaveError( this.extractErrorMessages( data ) );\n};\n\n/**\n * Handle assert error indicating another user is logged in.\n *\n * @param {string|null} username Name of newly logged-in user, or a temporary account name,\n * or null if logged-out and temporary accounts are disabled\n */\nve.init.mw.ArticleTarget.prototype.saveErrorNewUser = function ( username ) {\n\tconst $msg = mw.message(\n\t\tusername === null ?\n\t\t\t'visualeditor-savedialog-identify-anon' :\n\t\t\tmw.util.isTemporaryUser( username ) ?\n\t\t\t\t'visualeditor-savedialog-identify-temp' :\n\t\t\t\t'visualeditor-savedialog-identify-user',\n\t\tusername\n\t).parseDom();\n\n\tthis.showSaveError( $msg, true );\n};\n\n/**\n * Handle unknown save error\n *\n * @param {Object|null} data API response data\n */\nve.init.mw.ArticleTarget.prototype.saveErrorUnknown = function ( data ) {\n\tthis.showSaveError( this.extractErrorMessages( data ) );\n};\n\n/**\n * Handle page deleted error\n */\nve.init.mw.ArticleTarget.prototype.saveErrorPageDeleted = function () {\n\tthis.pageDeletedWarning = true;\n\t// The API error message 'apierror-pagedeleted' is poor, make our own\n\tthis.showSaveError( mw.msg( 'visualeditor-recreate', mw.msg( 'ooui-dialog-process-continue' ) ), true );\n};\n\n/**\n * Handle read only error\n *\n * @param {Object} data API response data\n */\nve.init.mw.ArticleTarget.prototype.saveErrorReadOnly = function ( data ) {\n\tthis.showSaveError( this.extractErrorMessages( data ), true );\n};\n\n/**\n * Handle an edit conflict\n */\nve.init.mw.ArticleTarget.prototype.editConflict = function () {\n\tthis.saveDialog.popPending();\n\tthis.saveDialog.swapPanel( 'conflict' );\n};\n\n/**\n * Handle clicks on the review button in the save dialog.\n *\n * @fires ve.init.mw.ArticleTarget#saveReview\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogReview = function () {\n\tif ( !this.saveDialog.hasDiff ) {\n\t\tthis.emit( 'saveReview' );\n\t\tthis.saveDialog.pushPending();\n\t\t// Acquire a temporary user username before diffing, so that signatures and\n\t\t// user-related magic words display the temp user instead of IP user in the diff. (T331397)\n\t\tmw.user.acquireTempUserName().then( () => {\n\t\t\tif ( this.pageExists ) {\n\t\t\t\t// Has no callback, handled via this.showChangesDiff\n\t\t\t\tthis.showChanges( this.getDocToSave() );\n\t\t\t} else {\n\t\t\t\tthis.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\t\t\t\tthis.onSaveDialogReviewComplete( data.content );\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tthis.saveDialog.swapPanel( 'review' );\n\t}\n};\n\n/**\n * Handle clicks on the show preview button in the save dialog.\n *\n * @fires ve.init.mw.ArticleTarget#savePreview\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogPreview = function () {\n\tconst api = this.getContentApi();\n\n\tif ( !this.saveDialog.$previewViewer.children().length ) {\n\t\tthis.emit( 'savePreview' );\n\t\tthis.saveDialog.pushPending();\n\n\t\tconst params = {};\n\n\t\tconst sectionTitle = this.sectionTitle && this.sectionTitle.getValue();\n\t\tif ( sectionTitle ) {\n\t\t\tparams.section = 'new';\n\t\t\tparams.sectiontitle = sectionTitle;\n\t\t}\n\t\tif ( mw.config.get( 'wgUserVariant' ) ) {\n\t\t\tparams.variant = mw.config.get( 'wgUserVariant' );\n\t\t}\n\n\t\t// Acquire a temporary user username before previewing, so that signatures and\n\t\t// user-related magic words display the temp user instead of IP user in the preview. (T331397)\n\t\tmw.user.acquireTempUserName().then( () => api.post( ve.extendObject( params, {\n\t\t\taction: 'parse',\n\t\t\ttitle: this.getPageName(),\n\t\t\ttext: this.getDocToSave(),\n\t\t\tpst: true,\n\t\t\tpreview: true,\n\t\t\tsectionpreview: this.section !== null,\n\t\t\tdisableeditsection: true,\n\t\t\tuselang: mw.config.get( 'wgUserLanguage' ),\n\t\t\tuseskin: mw.config.get( 'skin' ),\n\t\t\tmobileformat: OO.ui.isMobile(),\n\t\t\tprop: [ 'text', 'categorieshtml', 'displaytitle', 'subtitle', 'modules', 'jsconfigvars' ]\n\t\t} ) ) ).then( ( response ) => {\n\t\t\tthis.saveDialog.showPreview( response );\n\t\t}, ( errorCode, details ) => {\n\t\t\tthis.saveDialog.showPreview( this.extractErrorMessages( details ) );\n\t\t} ).always( () => {\n\t\t\tthis.bindSaveDialogClearDiff();\n\t\t} );\n\t} else {\n\t\tthis.saveDialog.swapPanel( 'preview' );\n\t}\n};\n\n/**\n * Clear the save dialog's diff cache when the document changes\n */\nve.init.mw.ArticleTarget.prototype.bindSaveDialogClearDiff = function () {\n\t// Invalidate the viewer wikitext on next change\n\tthis.getSurface().getModel().getDocument().once( 'transact',\n\t\tthis.saveDialog.clearDiff.bind( this.saveDialog )\n\t);\n\tif ( this.sectionTitle ) {\n\t\tthis.sectionTitle.once( 'change', this.saveDialog.clearDiff.bind( this.saveDialog ) );\n\t}\n};\n\n/**\n * Handle completed serialize request for diff views for new page creations.\n *\n * @param {string} wikitext\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogReviewComplete = function ( wikitext ) {\n\tthis.bindSaveDialogClearDiff();\n\tthis.saveDialog.setDiffAndReview(\n\t\tve.createDeferred().resolve( $( '<pre>' ).text( wikitext ) ).promise(),\n\t\tthis.getVisualDiffGeneratorPromise(),\n\t\tthis.getSurface().getModel().getDocument().getHtmlDocument()\n\t);\n};\n\n/**\n * Get a visual diff object for the current document state\n *\n * @return {jQuery.Promise} Promise resolving with a generator for a ve.dm.VisualDiff visual diff\n */\nve.init.mw.ArticleTarget.prototype.getVisualDiffGeneratorPromise = function () {\n\treturn mw.loader.using( 'ext.visualEditor.diffLoader' ).then( () => {\n\t\tconst mode = this.getSurface().getMode();\n\n\t\tif ( !this.originalDmDocPromise ) {\n\t\t\tif ( mode === 'source' ) {\n\t\t\t\t// Always load full doc in source mode for correct reference diffing (T260008)\n\t\t\t\tthis.originalDmDocPromise = mw.libs.ve.diffLoader.fetchRevision( this.revid, this.getPageName() );\n\t\t\t} else {\n\t\t\t\tif ( !this.fromEditedState ) {\n\t\t\t\t\tconst dmDoc = this.constructor.static.createModelFromDom( this.doc, 'visual' );\n\t\t\t\t\tlet dmDocOrNode;\n\t\t\t\t\tif ( this.section !== null && this.enableVisualSectionEditing ) {\n\t\t\t\t\t\tdmDocOrNode = dmDoc.getNodesByType( 'section' )[ 0 ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdmDocOrNode = dmDoc;\n\t\t\t\t\t}\n\t\t\t\t\tthis.originalDmDocPromise = ve.createDeferred().resolve( dmDocOrNode ).promise();\n\t\t\t\t} else {\n\t\t\t\t\tthis.originalDmDocPromise = mw.libs.ve.diffLoader.fetchRevision( this.revid, this.getPageName(), this.section );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( mode === 'source' ) {\n\t\t\t// Acquire a temporary user username before diffing, so that signatures and\n\t\t\t// user-related magic words display the temp user instead of IP user in the diff. (T331397)\n\t\t\tconst newRevPromise = mw.user.acquireTempUserName().then( () => this.getContentApi().post( {\n\t\t\t\taction: 'visualeditor',\n\t\t\t\tpaction: 'parse',\n\t\t\t\tpage: this.getPageName(),\n\t\t\t\twikitext: this.getSurface().getDom(),\n\t\t\t\tsection: this.section,\n\t\t\t\tstash: 0,\n\t\t\t\tpst: true\n\t\t\t} ) ).then(\n\t\t\t\t// Source mode always fetches the whole document, so set section=null to unwrap sections\n\t\t\t\t( response ) => mw.libs.ve.diffLoader.getModelFromResponse( response, null )\n\t\t\t);\n\n\t\t\treturn mw.libs.ve.diffLoader.getVisualDiffGeneratorPromise( this.originalDmDocPromise, newRevPromise );\n\t\t} else {\n\t\t\treturn this.originalDmDocPromise.then(\n\t\t\t\t( originalDmDoc ) => () => new ve.dm.VisualDiff( originalDmDoc, this.getSurface().getModel().getDocument().getAttachedRoot() )\n\t\t\t);\n\t\t}\n\t} );\n};\n\n/**\n * Handle clicks on the resolve conflict button in the conflict dialog.\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogResolveConflict = function () {\n\tconst fields = { wpSave: 1 };\n\n\tif ( this.getSurface().getMode() === 'source' && this.section !== null ) {\n\t\t// TODO: This should happen in #getSaveFields, check if moving it there breaks anything\n\t\tfields.section = this.section;\n\t}\n\t// Get Wikitext from the DOM, and set up a submit call when it's done\n\tthis.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\tthis.submitWithSaveFields( fields, data.content );\n\t} );\n};\n\n/**\n * Handle dialog retry events\n * So we can handle trying to save again after page deletion warnings\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogRetry = function () {\n\tif ( this.pageDeletedWarning ) {\n\t\tthis.recreating = true;\n\t\tthis.pageExists = false;\n\t}\n};\n\n/**\n * Load the editor.\n *\n * This method initiates an API request for the page data unless dataPromise is passed in,\n * in which case it waits for that promise instead.\n *\n * @param {jQuery.Promise} [dataPromise] Promise for pending request, if any\n * @return {jQuery.Promise} Data promise\n */\nve.init.mw.ArticleTarget.prototype.load = function ( dataPromise ) {\n\tif ( this.getDefaultMode() === 'visual' && this.section === 'new' ) {\n\t\tthrow new Error( 'Adding new section is not supported in visual mode' );\n\t}\n\t// Prevent duplicate requests\n\tif ( this.loading ) {\n\t\treturn this.loading;\n\t}\n\tthis.events.trackActivationStart( mw.libs.ve.activationStart );\n\tmw.libs.ve.activationStart = null;\n\n\tconst url = new URL( location.href );\n\tdataPromise = dataPromise || mw.libs.ve.targetLoader.requestPageData( this.getDefaultMode(), this.getPageName(), {\n\t\tsessionStore: true,\n\t\tsection: this.section,\n\t\toldId: this.requestedRevId,\n\t\ttargetName: this.constructor.static.trackingName,\n\t\teditintro: url.searchParams.get( 'editintro' ),\n\t\tpreload: url.searchParams.get( 'preload' ),\n\t\tpreloadparams: mw.util.getArrayParam( 'preloadparams', url.searchParams )\n\t} );\n\n\tthis.loading = dataPromise;\n\tdataPromise\n\t\t.done( this.loadSuccess.bind( this ) )\n\t\t.fail( this.loadFail.bind( this ) );\n\n\treturn dataPromise;\n};\n\n/**\n * Clear the state of this target, preparing it to be reactivated later.\n */\nve.init.mw.ArticleTarget.prototype.clearState = function () {\n\tthis.restoreAccessKeys();\n\tthis.clearPreparedCacheKey();\n\tthis.loading = null;\n\tthis.saving = null;\n\tthis.clearDiff();\n\tthis.serializing = false;\n\tthis.submitting = false;\n\tthis.baseTimeStamp = null;\n\tthis.startTimeStamp = null;\n\tthis.checkboxes = null;\n\tthis.initialSourceRange = null;\n\tthis.doc = null;\n\tthis.originalDmDocPromise = null;\n\tthis.originalHtml = null;\n\tthis.toolbarSaveButton = null;\n\tthis.section = null;\n\tthis.visibleSection = null;\n\tthis.visibleSectionOffset = null;\n\tthis.editNotices = [];\n\tthis.remoteNotices = [];\n\tthis.localNoticeMessages = [];\n\tthis.recovered = false;\n\tthis.teardownPromise = null;\n};\n\n/**\n * Switch to edit source mode\n *\n * Opens a confirmation dialog if the document is modified or VE wikitext mode\n * is not available.\n */\nve.init.mw.ArticleTarget.prototype.editSource = function () {\n\tconst modified = this.fromEditedState || this.getSurface().getModel().hasBeenModified();\n\n\tthis.switchToWikitextEditor( modified );\n};\n\n/**\n * Get a document to save, cached until the surface is modified\n *\n * The default implementation returns an HTMLDocument, but other targets\n * may use a different document model (e.g. plain text for source mode).\n *\n * @return {Object} Document to save\n */\nve.init.mw.ArticleTarget.prototype.getDocToSave = function () {\n\tif ( !this.docToSave ) {\n\t\tthis.docToSave = this.createDocToSave();\n\t\t// Cache clearing events\n\t\tconst surface = this.getSurface();\n\t\tsurface.getModel().getDocument().once( 'transact', this.clearDocToSave.bind( this ) );\n\t\tsurface.once( 'destroy', this.clearDocToSave.bind( this ) );\n\t}\n\treturn this.docToSave;\n};\n\n/**\n * Create a document to save\n *\n * @return {Object} Document to save\n */\nve.init.mw.ArticleTarget.prototype.createDocToSave = function () {\n\treturn this.getSurface().getDom();\n};\n\n/**\n * Clear the document to save from the cache\n */\nve.init.mw.ArticleTarget.prototype.clearDocToSave = function () {\n\tthis.docToSave = null;\n\tthis.clearPreparedCacheKey();\n};\n\n/**\n * Serialize the current document and store the result in the serialization cache on the server.\n *\n * This function returns a promise that is resolved once serialization is complete, with the\n * cache key passed as the first parameter.\n *\n * If there's already a request pending for the same (reference-identical) HTMLDocument, this\n * function will not initiate a new request but will return the promise for the pending request.\n * If a request for the same document has already been completed, this function will keep returning\n * the same promise (which will already have been resolved) until clearPreparedCacheKey() is called.\n *\n * @param {HTMLDocument} doc Document to serialize\n */\nve.init.mw.ArticleTarget.prototype.prepareCacheKey = function ( doc ) {\n\tconst start = ve.now();\n\n\tif ( this.getSurface().getMode() === 'source' ) {\n\t\treturn;\n\t}\n\n\tif ( this.preparedCacheKeyPromise && this.preparedCacheKeyPromise.doc === doc ) {\n\t\treturn;\n\t}\n\tthis.clearPreparedCacheKey();\n\n\tlet xhr;\n\tlet aborted = false;\n\tthis.preparedCacheKeyPromise = mw.libs.ve.targetSaver.deflateDoc( doc, this.doc )\n\t\t.then( ( deflatedHtml ) => {\n\t\t\tif ( aborted ) {\n\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t}\n\t\t\txhr = this.getContentApi().postWithToken( 'csrf',\n\t\t\t\t{\n\t\t\t\t\taction: 'visualeditoredit',\n\t\t\t\t\tpaction: 'serializeforcache',\n\t\t\t\t\thtml: deflatedHtml,\n\t\t\t\t\tpage: this.getPageName(),\n\t\t\t\t\toldid: this.revid,\n\t\t\t\t\tetag: this.etag\n\t\t\t\t},\n\t\t\t\t{ contentType: 'multipart/form-data' }\n\t\t\t);\n\t\t\treturn xhr.then(\n\t\t\t\t( response ) => {\n\t\t\t\t\tconst trackData = { duration: ve.now() - start };\n\t\t\t\t\tif ( response.visualeditoredit && typeof response.visualeditoredit.cachekey === 'string' ) {\n\t\t\t\t\t\tthis.events.track( 'performance.system.serializeforcache', trackData );\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcacheKey: response.visualeditoredit.cachekey,\n\t\t\t\t\t\t\t// Pass the HTML for retries.\n\t\t\t\t\t\t\thtml: deflatedHtml\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.events.track( 'performance.system.serializeforcache.nocachekey', trackData );\n\t\t\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tthis.events.track( 'performance.system.serializeforcache.fail', { duration: ve.now() - start } );\n\t\t\t\t\treturn ve.createDeferred().reject();\n\t\t\t\t}\n\t\t\t);\n\t\t} )\n\t\t.promise( {\n\t\t\tabort: () => {\n\t\t\t\tif ( xhr ) {\n\t\t\t\t\txhr.abort();\n\t\t\t\t}\n\t\t\t\taborted = true;\n\t\t\t},\n\t\t\tdoc: doc\n\t\t} );\n};\n\n/**\n * Get the prepared wikitext, if any. Same as prepareWikitext() but does not initiate a request\n * if one isn't already pending or finished. Instead, it returns a rejected promise in that case.\n *\n * @param {HTMLDocument} doc Document to serialize\n * @return {jQuery.Promise} Abortable promise, resolved with a plain object containing `cacheKey`,\n * and `html` for retries.\n */\nve.init.mw.ArticleTarget.prototype.getPreparedCacheKey = function ( doc ) {\n\tif ( this.preparedCacheKeyPromise && this.preparedCacheKeyPromise.doc === doc ) {\n\t\treturn this.preparedCacheKeyPromise;\n\t}\n\treturn ve.createDeferred().reject().promise();\n};\n\n/**\n * Clear the promise for the prepared wikitext cache key, and abort it if it's still in progress.\n */\nve.init.mw.ArticleTarget.prototype.clearPreparedCacheKey = function () {\n\tif ( this.preparedCacheKeyPromise ) {\n\t\tthis.preparedCacheKeyPromise.abort();\n\t\tthis.preparedCacheKeyPromise = null;\n\t}\n};\n\n/**\n * Try submitting an API request with a cache key for prepared wikitext, falling back to submitting\n * HTML directly if there is no cache key present or pending, or if the request for the cache key\n * fails, or if using the cache key fails with a badcachekey error.\n *\n * This function will use mw.Api#postWithToken to retry automatically when encountering a 'badtoken'\n * error.\n *\n * @param {HTMLDocument|string} doc Document to submit or string in source mode\n * @param {Object} extraData POST parameters to send. Do not include 'html', 'cachekey' or 'format'.\n * @param {string} [eventName] If set, log an event when the request completes successfully. The\n * full event name used will be 'performance.system.{eventName}.withCacheKey' or .withoutCacheKey\n * depending on whether or not a cache key was used.\n * @return {jQuery.Promise} Promise which resolves/rejects when saving is complete/fails\n */\nve.init.mw.ArticleTarget.prototype.tryWithPreparedCacheKey = function ( doc, extraData, eventName ) {\n\tif ( this.getSurface().getMode() === 'source' ) {\n\t\tconst data = ve.copy( extraData );\n\n\t\t// TODO: This should happen in #getSaveOptions, check if moving it there breaks anything\n\t\tif ( this.section !== null ) {\n\t\t\tdata.section = this.section;\n\t\t}\n\t\tif ( this.sectionTitle ) {\n\t\t\tdata.sectiontitle = this.sectionTitle.getValue();\n\t\t\tdata.summary = undefined;\n\t\t}\n\n\t\treturn mw.libs.ve.targetSaver.postWikitext(\n\t\t\tdoc,\n\t\t\tdata,\n\t\t\t{ api: this.getContentApi() }\n\t\t);\n\t}\n\n\t// getPreparedCacheKey resolves with { cacheKey: ..., html: ... } or rejects.\n\t// After modification it never rejects, just resolves with { html: ... } instead\n\tconst htmlOrCacheKeyPromise = this.getPreparedCacheKey( doc ).then(\n\t\t// Success, use promise as-is.\n\t\tnull,\n\t\t// Fail, get deflatedHtml promise\n\t\t() => mw.libs.ve.targetSaver.deflateDoc( doc, this.doc ).then( ( html ) => ( { html: html } ) ) );\n\n\treturn htmlOrCacheKeyPromise.then( ( htmlOrCacheKey ) => mw.libs.ve.targetSaver.postHtml(\n\t\thtmlOrCacheKey.html,\n\t\thtmlOrCacheKey.cacheKey,\n\t\textraData,\n\t\t{\n\t\t\tonCacheKeyFail: this.clearPreparedCacheKey.bind( this ),\n\t\t\tapi: this.getContentApi(),\n\t\t\ttrack: this.events.track.bind( this.events ),\n\t\t\teventName: eventName,\n\t\t\tnow: ve.now\n\t\t}\n\t) );\n};\n\n/**\n * Handle the save dialog's save event\n *\n * Validates the inputs then starts the save process\n *\n * @param {jQuery.Deferred} saveDeferred Deferred object to resolve/reject when the save\n * succeeds/fails.\n * @fires ve.init.mw.ArticleTarget#saveInitiated\n */\nve.init.mw.ArticleTarget.prototype.onSaveDialogSave = function ( saveDeferred ) {\n\tif ( this.deactivating ) {\n\t\treturn;\n\t}\n\n\tconst saveOptions = this.getSaveOptions();\n\n\tif (\n\t\t+mw.user.options.get( 'forceeditsummary' ) &&\n\t\t( saveOptions.summary === '' || saveOptions.summary === this.initialEditSummary ) &&\n\t\t!this.saveDialog.messages.missingsummary\n\t) {\n\t\tthis.saveDialog.showMessage(\n\t\t\t'missingsummary',\n\t\t\tnew OO.ui.HtmlSnippet( ve.init.platform.getParsedMessage( 'missingsummary' ) )\n\t\t);\n\t\tthis.saveDialog.popPending();\n\t} else {\n\t\tthis.emit( 'saveInitiated' );\n\t\tthis.startSave( saveOptions );\n\t\tthis.saveDeferred = saveDeferred;\n\t}\n};\n\n/**\n * Start the save process\n *\n * @param {Object} saveOptions Save options\n */\nve.init.mw.ArticleTarget.prototype.startSave = function ( saveOptions ) {\n\tthis.save( this.getDocToSave(), saveOptions );\n};\n\n/**\n * Get save form fields from the save dialog form.\n *\n * @return {Object} Form data for submission to the MediaWiki action=edit UI\n */\nve.init.mw.ArticleTarget.prototype.getSaveFields = function () {\n\tconst fields = {};\n\n\tif ( this.section === 'new' ) {\n\t\t// MediaWiki action=edit UI doesn't have separate parameters for edit summary and new section\n\t\t// title. The edit summary parameter is supposed to contain the section title, and the real\n\t\t// summary is autogenerated.\n\t\tfields.wpSummary = this.sectionTitle ? this.sectionTitle.getValue() : '';\n\t} else {\n\t\tfields.wpSummary = this.saveDialog ?\n\t\t\tthis.saveDialog.editSummaryInput.getValue() :\n\t\t\t( this.editSummaryValue || this.initialEditSummary );\n\t}\n\n\tlet name;\n\t// Extra save fields added by extensions\n\tfor ( name in this.saveFields ) {\n\t\tfields[ name ] = this.saveFields[ name ]();\n\t}\n\n\tif ( this.recreating ) {\n\t\tfields.wpRecreate = true;\n\t}\n\n\tfor ( name in this.checkboxesByName ) {\n\t\t// DropdownInputWidget or CheckboxInputWidget\n\t\tif ( !this.checkboxesByName[ name ].isSelected || this.checkboxesByName[ name ].isSelected() ) {\n\t\t\tfields[ name ] = this.checkboxesByName[ name ].getValue();\n\t\t}\n\t}\n\n\treturn fields;\n};\n\n/**\n * Invoke #submit with the data from #getSaveFields\n *\n * @param {Object} fields Fields to add in addition to those from #getSaveFields\n * @param {string} wikitext Wikitext to submit\n * @return {boolean} Whether submission was started\n */\nve.init.mw.ArticleTarget.prototype.submitWithSaveFields = function ( fields, wikitext ) {\n\treturn this.submit( wikitext, ve.extendObject( this.getSaveFields(), fields ) );\n};\n\n/**\n * Get edit API options from the save dialog form.\n *\n * @return {Object} Save options for submission to the MediaWiki API\n */\nve.init.mw.ArticleTarget.prototype.getSaveOptions = function () {\n\tconst options = this.getSaveFields(),\n\t\tfieldMap = {\n\t\t\twpSummary: 'summary',\n\t\t\twpMinoredit: 'minor',\n\t\t\twpWatchthis: 'watchlist',\n\t\t\twpCaptchaId: 'captchaid',\n\t\t\twpCaptchaWord: 'captchaword'\n\t\t};\n\n\tfor ( const key in fieldMap ) {\n\t\tif ( options[ key ] !== undefined ) {\n\t\t\toptions[ fieldMap[ key ] ] = options[ key ];\n\t\t\tdelete options[ key ];\n\t\t}\n\t}\n\n\toptions.watchlist = 'watchlist' in options ? 'watch' : 'unwatch';\n\n\treturn options;\n};\n\n/**\n * Post DOM data to the Parsoid API.\n *\n * This method performs an asynchronous action and uses a callback function to handle the result.\n *\n * this.save( dom, { summary: 'test', minor: true, watch: false } );\n *\n * @param {HTMLDocument} doc Document to save\n * @param {Object} options Saving options. All keys are passed through, including unrecognized ones.\n * - {string} summary Edit summary\n * - {boolean} minor Edit is a minor edit\n * - {boolean} watch Watch the page\n * @return {jQuery.Promise} Save promise, see mw.libs.ve.targetSaver.postHtml\n */\nve.init.mw.ArticleTarget.prototype.save = function ( doc, options ) {\n\t// Prevent duplicate requests\n\tif ( this.saving ) {\n\t\treturn this.saving;\n\t}\n\n\tconst data = ve.extendObject( {}, options, {\n\t\tpage: this.getPageName(),\n\t\toldid: this.revid,\n\t\tbasetimestamp: this.baseTimeStamp,\n\t\tstarttimestamp: this.startTimeStamp,\n\t\tetag: this.etag,\n\t\tassert: mw.user.isAnon() ? 'anon' : 'user',\n\t\tassertuser: mw.user.getName() || undefined\n\t} );\n\n\tif ( !this.pageExists || this.restoring || !this.isViewPage ) {\n\t\t// This is a page creation, a restoration, or we loaded the editor from a non-view page.\n\t\t// We can't update the interface to reflect this new state, so we're going to reload the whole page.\n\t\t// Therefore we don't need the new revision's HTML content in the API response.\n\t\tdata.nocontent = true;\n\t}\n\n\tif ( this.wouldautocreate ) {\n\t\t// This means that we might need to redirect to an opaque URL,\n\t\t// so we must set up query parameters we want ahead of time.\n\t\t// TODO: `this.isRedirect` is only set in visual mode, not in source mode\n\t\tdata.returntoquery = this.isRedirect ? 'redirect=no' : '';\n\t\tdata.returntoanchor = this.getSectionHashFromPage();\n\t}\n\n\tconst config = mw.config.get( 'wgVisualEditorConfig' );\n\n\tconst taglist = data.vetags ? data.vetags.split( ',' ) : [];\n\n\tif ( config.useChangeTagging ) {\n\t\ttaglist.push(\n\t\t\tthis.getSurface().getMode() === 'source' ? 'visualeditor-wikitext' : 'visualeditor'\n\t\t);\n\t}\n\n\tif (\n\t\tthis.getSurface().getMode() === 'visual' &&\n\t\tmw.config.get( 'wgVisualEditorConfig' ).editCheckTagging\n\t) {\n\t\tconst documentModel = this.getSurface().getModel().getDocument();\n\t\t// New content needing a reference\n\t\tif ( mw.editcheck.hasAddedContentNeedingReference( documentModel ) ) {\n\t\t\ttaglist.push( 'editcheck-references' );\n\t\t}\n\t\t// New content, regardless of if it needs a reference\n\t\tif ( mw.editcheck.hasAddedContentNeedingReference( documentModel, true ) ) {\n\t\t\ttaglist.push( 'editcheck-newcontent' );\n\t\t}\n\t}\n\n\tdata.vetags = taglist.join( ',' );\n\n\tconst promise = this.saving = this.tryWithPreparedCacheKey( doc, data, 'save' )\n\t\t.done( this.saveComplete.bind( this ) )\n\t\t.fail( this.saveFail.bind( this, doc, data ) )\n\t\t.always( () => {\n\t\t\tthis.saving = null;\n\t\t} );\n\n\treturn promise;\n};\n\n/**\n * Show changes in the save dialog\n *\n * @param {Object} doc Document\n */\nve.init.mw.ArticleTarget.prototype.showChanges = function ( doc ) {\n\t// Invalidate the viewer diff on next change\n\tthis.getSurface().getModel().getDocument().once( 'transact', () => {\n\t\tthis.clearDiff();\n\t} );\n\tthis.saveDialog.setDiffAndReview(\n\t\tthis.getWikitextDiffPromise( doc ),\n\t\tthis.getVisualDiffGeneratorPromise(),\n\t\tthis.getSurface().getModel().getDocument().getHtmlDocument()\n\t);\n};\n\n/**\n * Clear all state associated with the diff\n */\nve.init.mw.ArticleTarget.prototype.clearDiff = function () {\n\tif ( this.saveDialog ) {\n\t\tthis.saveDialog.clearDiff();\n\t}\n\tthis.wikitextDiffPromise = null;\n};\n\n/**\n * Post DOM data to the Parsoid API to retrieve wikitext diff.\n *\n * @param {HTMLDocument} doc Document to compare against (via wikitext)\n * @return {jQuery.Promise} Promise which resolves with the wikitext diff, or rejects with an error\n * @fires ve.init.mw.ArticleTarget#showChanges\n * @fires ve.init.mw.ArticleTarget#showChangesError\n */\nve.init.mw.ArticleTarget.prototype.getWikitextDiffPromise = function ( doc ) {\n\tif ( !this.wikitextDiffPromise ) {\n\t\tthis.wikitextDiffPromise = this.tryWithPreparedCacheKey( doc, {\n\t\t\tpaction: 'diff',\n\t\t\tpage: this.getPageName(),\n\t\t\toldid: this.revid,\n\t\t\tetag: this.etag\n\t\t}, 'diff' ).then( ( data ) => {\n\t\t\tif ( !data.diff ) {\n\t\t\t\tthis.emit( 'noChanges' );\n\t\t\t}\n\t\t\treturn data.diff;\n\t\t} );\n\t\tthis.wikitextDiffPromise\n\t\t\t.done( this.emit.bind( this, 'showChanges' ) )\n\t\t\t.fail( this.emit.bind( this, 'showChangesError' ) );\n\t}\n\treturn this.wikitextDiffPromise;\n};\n\n/**\n * Post wikitext to MediaWiki.\n *\n * This method performs a synchronous action and will take the user to a new page when complete.\n *\n * this.submit( wikitext, { wpSummary: 'test', wpMinorEdit: 1, wpSave: 1 } );\n *\n * @param {string} wikitext Wikitext to submit\n * @param {Object} fields Other form fields to add (e.g. wpSummary, wpWatchthis, etc.). To actually\n * save the wikitext, add { wpSave: 1 }. To go to the diff view, add { wpDiff: 1 }.\n * @return {boolean} Submitting has been started\n */\nve.init.mw.ArticleTarget.prototype.submit = function ( wikitext, fields ) {\n\t// Prevent duplicate requests\n\tif ( this.submitting ) {\n\t\treturn false;\n\t}\n\t// Clear autosave now that we don't expect to need it again.\n\t// FIXME: This isn't transactional, so if the save fails we're left with no recourse.\n\tthis.clearDocState();\n\t// Save DOM\n\tthis.submitting = true;\n\tconst $form = $( '<form>' ).attr( { method: 'post', enctype: 'multipart/form-data' } ).addClass( 'oo-ui-element-hidden' );\n\tconst params = ve.extendObject( {\n\t\tformat: 'text/x-wiki',\n\t\tmodel: 'wikitext',\n\t\toldid: this.requestedRevId,\n\t\twpStarttime: this.startTimeStamp,\n\t\twpEdittime: this.baseTimeStamp,\n\t\twpTextbox1: wikitext,\n\t\twpEditToken: mw.user.tokens.get( 'csrfToken' ),\n\t\t// MediaWiki function-verification parameters, mostly relevant to the\n\t\t// classic editpage, but still required here:\n\t\twpUnicodeCheck: 'ℳ𝒲♥𝓊𝓃𝒾𝒸ℴ𝒹ℯ',\n\t\twpUltimateParam: true\n\t}, fields );\n\t// Add params as hidden fields\n\tfor ( const key in params ) {\n\t\t$form.append( $( '<input>' ).attr( { type: 'hidden', name: key, value: params[ key ] } ) );\n\t}\n\t// Submit the form, mimicking a traditional edit\n\t// Firefox requires the form to be attached\n\tconst submitUrl = mw.util.getUrl( this.getPageName(), {\n\t\taction: 'submit',\n\t\tveswitched: '1'\n\t} );\n\t$form.attr( 'action', submitUrl ).appendTo( 'body' ).trigger( 'submit' );\n\treturn true;\n};\n\n/**\n * Get Wikitext data from the Parsoid API.\n *\n * This method performs an asynchronous action and uses a callback function to handle the result.\n *\n * this.serialize( doc ).then( ( data ) => {\n * // Do something with data.content (wikitext)\n * } );\n *\n * @param {HTMLDocument} doc Document to serialize\n * @param {Function} [callback] Optional callback to run after.\n * Deprecated in favor of using the returned promise.\n * @return {jQuery.Promise} Serialize promise, see mw.libs.ve.targetSaver.postHtml\n */\nve.init.mw.ArticleTarget.prototype.serialize = function ( doc, callback ) {\n\t// Prevent duplicate requests\n\tif ( this.serializing ) {\n\t\treturn this.serializing;\n\t}\n\tconst promise = this.serializing = this.tryWithPreparedCacheKey( doc, {\n\t\tpaction: 'serialize',\n\t\tpage: this.getPageName(),\n\t\toldid: this.revid,\n\t\tetag: this.etag\n\t}, 'serialize' )\n\t\t.done( this.emit.bind( this, 'serializeComplete' ) )\n\t\t.fail( this.emit.bind( this, 'serializeError' ) )\n\t\t.always( () => {\n\t\t\tthis.serializing = null;\n\t\t} );\n\n\tif ( callback ) {\n\t\tOO.ui.warnDeprecation( 'Passing a callback to ve.init.mw.ArticleTarget#serialize is deprecated. Use the returned promise instead.' );\n\t\tpromise.then( ( data ) => {\n\t\t\tcallback.call( this, data.content );\n\t\t} );\n\t}\n\n\treturn promise;\n};\n\n/**\n * Get list of edit notices.\n *\n * @return {Array} List of edit notices\n */\nve.init.mw.ArticleTarget.prototype.getEditNotices = function () {\n\treturn this.editNotices;\n};\n\n// FIXME: split out view specific functionality, emit to subclass\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.track = function ( name ) {\n\tconst mode = this.surface ? this.surface.getMode() : this.getDefaultMode();\n\tve.track( name, { mode: mode } );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.createSurface = function ( dmDoc, config ) {\n\tconst sections = dmDoc.getNodesByType( 'section' );\n\tlet attachedRoot;\n\tif ( sections.length && sections.length === 1 ) {\n\t\tattachedRoot = sections[ 0 ];\n\t\tif ( !attachedRoot.isSurfaceable() ) {\n\t\t\tthrow new Error( 'Not a surfaceable node' );\n\t\t}\n\t}\n\n\t// Parent method\n\tconst surface = ve.init.mw.ArticleTarget.super.prototype.createSurface.call(\n\t\tthis,\n\t\tdmDoc,\n\t\tve.extendObject( { attachedRoot: attachedRoot }, config )\n\t);\n\n\treturn surface;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.getSurfaceClasses = function () {\n\tconst classes = ve.init.mw.ArticleTarget.super.prototype.getSurfaceClasses.call( this );\n\treturn [ ...classes, 'mw-body-content' ];\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.getSurfaceConfig = function ( config ) {\n\treturn ve.init.mw.ArticleTarget.super.prototype.getSurfaceConfig.call( this, ve.extendObject( {\n\t\t// Don't null selection on blur when editing a document.\n\t\t// Do use it in new section mode as there are multiple inputs\n\t\t// on the surface (header+content).\n\t\tnullSelectionOnBlur: this.section === 'new',\n\t\tclasses: this.getSurfaceClasses()\n\t\t\t// The following classes are used here:\n\t\t\t// * mw-textarea-proteced\n\t\t\t// * mw-textarea-cproteced\n\t\t\t// * mw-textarea-sproteced\n\t\t\t.concat( this.protectedClasses )\n\t\t\t// addClass doesn't like empty strings\n\t\t\t.filter( ( c ) => c )\n\t}, config ) );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.teardown = function () {\n\tif ( !this.teardownPromise ) {\n\t\tconst surface = this.getSurface();\n\n\t\t// Restore access keys\n\t\tif ( this.$saveAccessKeyElements ) {\n\t\t\tthis.$saveAccessKeyElements.attr( 'accesskey', ve.msg( 'accesskey-save' ) );\n\t\t\tthis.$saveAccessKeyElements = null;\n\t\t}\n\t\tif ( surface ) {\n\t\t\t// Disconnect history listener\n\t\t\tsurface.getModel().disconnect( this );\n\t\t}\n\n\t\tlet saveDialogPromise = ve.createDeferred().resolve().promise();\n\t\tif ( this.saveDialog ) {\n\t\t\tif ( this.saveDialog.isOpened() ) {\n\t\t\t\t// If the save dialog is still open (from saving) close it\n\t\t\t\tsaveDialogPromise = this.saveDialog.close().closed;\n\t\t\t}\n\t\t\t// Release the reference\n\t\t\tthis.saveDialog = null;\n\t\t}\n\n\t\t// Parent method\n\t\tthis.teardownPromise = ve.init.mw.ArticleTarget.super.prototype.teardown.call( this ).then( () => saveDialogPromise.then( () => {\n\t\t\tmw.hook( 've.deactivationComplete' ).fire( this.edited );\n\t\t} ) );\n\t}\n\treturn this.teardownPromise;\n};\n\n/**\n * Try to tear down the target, but leave ready for re-activation later\n *\n * Will first prompt the user if required, then call #teardown.\n *\n * @param {boolean} [noPrompt] Do not display a prompt to the user\n * @param {string} [trackMechanism] Abort mechanism; used for event tracking if present\n * @return {jQuery.Promise} Promise which resolves when the target has been torn down, rejects if the target won't be torn down\n */\nve.init.mw.ArticleTarget.prototype.tryTeardown = function ( noPrompt, trackMechanism ) {\n\tif ( !noPrompt && this.edited && mw.user.options.get( 'useeditwarning' ) ) {\n\t\treturn this.getSurface().dialogs.openWindow( 'abandonedit' )\n\t\t\t.closed.then( ( data ) => {\n\t\t\t\tif ( data && data.action === 'discard' ) {\n\t\t\t\t\treturn this.teardown( trackMechanism );\n\t\t\t\t}\n\t\t\t\treturn ve.createDeferred().reject().promise();\n\t\t\t} );\n\t} else {\n\t\treturn this.teardown( trackMechanism );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.ArticleTarget.prototype.setupToolbar = function () {\n\t// Parent method\n\tve.init.mw.ArticleTarget.super.prototype.setupToolbar.apply( this, arguments );\n\n\tthis.setupToolbarSaveButton();\n\tthis.updateToolbarSaveButtonState();\n\n\tif ( this.saveDialog ) {\n\t\tthis.editSummaryValue = this.saveDialog.editSummaryInput.getValue();\n\t\tthis.saveDialog.disconnect( this );\n\t\tthis.saveDialog = null;\n\t}\n};\n\n/**\n * Getting the message for the toolbar / save dialog save / publish button\n *\n * @param {boolean} [startProcess] Use version of the label for starting that process, i.e. with an ellipsis after it\n * @param {boolean} [forceShort] Force the short version of the label, always used on mobile\n * @return {Function|string} An i18n message or resolveable function\n */\nve.init.mw.ArticleTarget.prototype.getSaveButtonLabel = function ( startProcess, forceShort ) {\n\tconst suffix = startProcess ? '-start' : '';\n\n\tif ( forceShort || OO.ui.isMobile() ) {\n\t\t// The following messages can be used here:\n\t\t// * visualeditor-savedialog-label-publish-short\n\t\t// * visualeditor-savedialog-label-publish-short-start\n\t\t// * visualeditor-savedialog-label-save-short\n\t\t// * visualeditor-savedialog-label-save-short-start\n\t\tif ( mw.config.get( 'wgEditSubmitButtonLabelPublish' ) ) {\n\t\t\treturn OO.ui.deferMsg( 'visualeditor-savedialog-label-publish-short' + suffix );\n\t\t}\n\n\t\treturn OO.ui.deferMsg( 'visualeditor-savedialog-label-save-short' + suffix );\n\t}\n\n\t// The following messages can be used here\n\t// * publishpage\n\t// * publishpage-start\n\t// * publishchanges\n\t// * publishchanges-start\n\t// * savearticle\n\t// * savearticle-start\n\t// * savechanges\n\t// * savechanges-start\n\tif ( mw.config.get( 'wgEditSubmitButtonLabelPublish' ) ) {\n\t\treturn OO.ui.deferMsg( ( !this.pageExists ? 'publishpage' : 'publishchanges' ) + suffix );\n\t}\n\n\treturn OO.ui.deferMsg( ( !this.pageExists ? 'savearticle' : 'savechanges' ) + suffix );\n};\n\n/**\n * Setup the toolbarSaveButton property to point to the save tool\n *\n * @method\n * @abstract\n */\nve.init.mw.ArticleTarget.prototype.setupToolbarSaveButton = null;\n\n/**\n * Re-evaluate whether the article can be saved\n *\n * @return {boolean} The article can be saved\n */\nve.init.mw.ArticleTarget.prototype.isSaveable = function () {\n\tconst surface = this.getSurface();\n\tif ( !surface ) {\n\t\t// Called before we're attached, so meaningless; abandon for now\n\t\treturn false;\n\t}\n\n\tthis.edited =\n\t\t// Document was edited before loading\n\t\tthis.fromEditedState ||\n\t\t// Document was edited\n\t\tsurface.getModel().hasBeenModified() ||\n\t\t// Section title (if it exists) was edited\n\t\t( !!this.sectionTitle && this.sectionTitle.getValue() !== '' );\n\n\treturn this.edited || this.restoring;\n};\n\n/**\n * Update the toolbar save button to reflect if the article can be saved\n */\nve.init.mw.ArticleTarget.prototype.updateToolbarSaveButtonState = function () {\n\t// This should really be an emit( 'updateState' ) but that would cause\n\t// every tool to be updated on every transaction.\n\tthis.toolbarSaveButton.onUpdateState();\n\n\tconst isSaveable = this.isSaveable();\n\tif ( isSaveable !== this.wasSaveable ) {\n\t\tthis.emit( 'toolbarSaveButtonStateChanged' );\n\t\tthis.wasSaveable = isSaveable;\n\t}\n};\n\n/**\n * Show a save dialog\n *\n * @param {string} [action] Window action to trigger after opening\n * @param {string} [checkboxName] Checkbox to toggle after opening\n *\n * @fires ve.init.mw.ArticleTarget#saveWorkflowBegin\n */\nve.init.mw.ArticleTarget.prototype.showSaveDialog = function ( action, checkboxName ) {\n\tlet firstLoad = false;\n\n\tif ( !this.isSaveable() || this.saveDialogIsOpening ) {\n\t\treturn;\n\t}\n\n\tconst currentWindow = this.getSurface().getDialogs().getCurrentWindow();\n\tif ( currentWindow && currentWindow.constructor.static.name === 'mwSave' && ( action === 'save' || action === null ) ) {\n\t\t// The current window is the save dialog, and we've gotten here via\n\t\t// the save action. Trigger a save. We're doing this here instead of\n\t\t// relying on an accesskey on the save button, because that has some\n\t\t// cross-browser issues that makes it not work in Firefox.\n\t\tcurrentWindow.executeAction( 'save' );\n\t\treturn;\n\t}\n\n\tthis.saveDialogIsOpening = true;\n\n\tconst saveProcess = new OO.ui.Process();\n\tmw.hook( 've.preSaveProcess' ).fire( saveProcess, this );\n\n\tthis.emit( 'saveWorkflowBegin' );\n\n\tsaveProcess.execute().done( () => {\n\t\t// Preload the serialization\n\t\tthis.prepareCacheKey( this.getDocToSave() );\n\n\t\t// Get the save dialog\n\t\tthis.getSurface().getDialogs().getWindow( 'mwSave' ).done( ( win ) => {\n\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\n\t\t\tif ( !this.saveDialog ) {\n\t\t\t\tthis.saveDialog = win;\n\t\t\t\tfirstLoad = true;\n\n\t\t\t\t// Connect to save dialog\n\t\t\t\tthis.saveDialog.connect( this, {\n\t\t\t\t\tsave: 'onSaveDialogSave',\n\t\t\t\t\treview: 'onSaveDialogReview',\n\t\t\t\t\tpreview: 'onSaveDialogPreview',\n\t\t\t\t\tresolve: 'onSaveDialogResolveConflict',\n\t\t\t\t\tretry: 'onSaveDialogRetry',\n\t\t\t\t\t// The array syntax is a way to call `this.emit( 'saveWorkflowEnd' )`.\n\t\t\t\t\tclose: [ 'emit', 'saveWorkflowEnd' ],\n\t\t\t\t\tchangePanel: [ 'emit', 'saveWorkflowChangePanel' ]\n\t\t\t\t} );\n\n\t\t\t\t// Attach custom overlay\n\t\t\t\tthis.saveDialog.$element.append( this.$saveDialogOverlay );\n\t\t\t}\n\n\t\t\tconst data = this.getSaveDialogOpeningData();\n\n\t\t\tif (\n\t\t\t\t( action === 'review' && !data.canReview ) ||\n\t\t\t\t( action === 'preview' && !data.canPreview )\n\t\t\t) {\n\t\t\t\tthis.saveDialogIsOpening = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( firstLoad ) {\n\t\t\t\tfor ( const name in this.checkboxesByName ) {\n\t\t\t\t\tif ( this.initialCheckboxes[ name ] !== undefined ) {\n\t\t\t\t\t\tthis.checkboxesByName[ name ].setSelected( this.initialCheckboxes[ name ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet checkbox;\n\t\t\tif ( checkboxName && ( checkbox = this.checkboxesByName[ checkboxName ] ) ) {\n\t\t\t\tconst isSelected = !checkbox.isSelected();\n\t\t\t\t// Wait for native access key change to happen\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tcheckbox.setSelected( isSelected );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// When calling review/preview action, switch to those panels immediately\n\t\t\tif ( action === 'review' || action === 'preview' ) {\n\t\t\t\tdata.initialPanel = action;\n\t\t\t}\n\n\t\t\t// Open the dialog\n\t\t\tconst openPromise = windowAction.open( 'mwSave', data, action );\n\t\t\tif ( openPromise ) {\n\t\t\t\topenPromise.always( () => {\n\t\t\t\t\tthis.saveDialogIsOpening = false;\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t} ).fail( () => {\n\t\tthis.saveDialogIsOpening = false;\n\t} );\n};\n\n/**\n * Get opening data to pass to the save dialog\n *\n * @return {Object} Opening data\n */\nve.init.mw.ArticleTarget.prototype.getSaveDialogOpeningData = function () {\n\tconst mode = this.getSurface().getMode();\n\treturn {\n\t\tcanPreview: mode === 'source',\n\t\tcanReview: !( mode === 'source' && this.section === 'new' ),\n\t\tsectionTitle: this.sectionTitle && this.sectionTitle.getValue(),\n\t\tsaveButtonLabel: this.getSaveButtonLabel(),\n\t\tcopyrightWarning: this.copyrightWarning,\n\t\tcheckboxFields: this.checkboxFields,\n\t\tcheckboxesByName: this.checkboxesByName\n\t};\n};\n\n/**\n * Move the cursor in the editor to section specified by this.section.\n * Do nothing if this.section is undefined.\n */\nve.init.mw.ArticleTarget.prototype.restoreEditSection = function () {\n\tconst section = this.section !== null ? this.section : this.visibleSection;\n\tconst surface = this.getSurface();\n\tconst mode = surface.getMode();\n\n\tif (\n\t\tmode === 'source' ||\n\t\t( this.enableVisualSectionEditing && this.section !== null )\n\t) {\n\t\tthis.$scrollContainer.scrollTop( 0 );\n\t}\n\n\tif ( section === null || section === 'new' || section === '0' || section === 'T-0' ) {\n\t\treturn;\n\t}\n\n\tconst setExactScrollOffset = this.section === null && this.visibleSection !== null && this.visibleSectionOffset !== null,\n\t\t// User clicked section edit link with visual section editing not available:\n\t\t// Take them to the top of the section using goToHeading\n\t\tgoToStartOfHeading = this.section !== null && !this.enableVisualSectionEditing,\n\t\tsetEditSummary = this.section !== null;\n\n\tlet headingText;\n\tif ( mode === 'visual' ) {\n\t\tconst dmDoc = surface.getModel().getDocument();\n\t\t// In mw.libs.ve.unwrapParsoidSections we copy the data-mw-section-id from the section element\n\t\t// to the heading. Iterate over headings to find the one with the correct attribute\n\t\t// in originalDomElements.\n\t\tconst headingModel = dmDoc.getNodesByType( 'mwHeading' ).find( ( heading ) => {\n\t\t\tconst domElements = heading.getOriginalDomElements( dmDoc.getStore() );\n\t\t\treturn domElements && domElements.length && domElements[ 0 ].nodeType === Node.ELEMENT_NODE &&\n\t\t\t\tdomElements[ 0 ].getAttribute( 'data-mw-section-id' ) === section;\n\t\t} );\n\t\tif ( headingModel ) {\n\t\t\tconst headingView = surface.getView().getDocument().getDocumentNode().getNodeFromOffset( headingModel.getRange().start );\n\t\t\tif ( setEditSummary && !new URL( location.href ).searchParams.has( 'summary' ) ) {\n\t\t\t\theadingText = headingView.$element.text();\n\t\t\t}\n\t\t\tif ( setExactScrollOffset ) {\n\t\t\t\tthis.scrollToHeading( headingView, this.visibleSectionOffset );\n\t\t\t} else if ( goToStartOfHeading ) {\n\t\t\t\tthis.goToHeading( headingView );\n\t\t\t}\n\t\t}\n\t} else if ( mode === 'source' && setEditSummary ) {\n\t\t// With elements of extractSectionTitle + stripSectionName TODO:\n\t\t// Arguably, we should just throw this through the API and then do\n\t\t// the same extract-text pass we do in visual mode. Would save us\n\t\t// having to think about wikitext here.\n\t\theadingText = surface.getModel().getDocument().data.getText(\n\t\t\tfalse,\n\t\t\tsurface.getModel().getDocument().getDocumentNode().children[ 0 ].getRange()\n\t\t)\n\t\t\t// Extract the title\n\t\t\t.replace( /^\\s*=+\\s*(.*?)\\s*=+\\s*$/, '$1' )\n\t\t\t// Remove links\n\t\t\t.replace( /\\[\\[:?([^[|]+)\\|([^[]+)\\]\\]/g, '$2' )\n\t\t\t.replace( /\\[\\[:?([^[]+)\\|?\\]\\]/g, '$1' )\n\t\t\t.replace( new RegExp( '\\\\[(?:' + ve.init.platform.getUnanchoredExternalLinkUrlProtocolsRegExp().source + ')([^ ]+?) ([^\\\\[]+)\\\\]', 'ig' ), '$3' )\n\t\t\t// Cheap HTML removal\n\t\t\t.replace( /<[^>]+?>/g, '' );\n\t}\n\tif ( headingText ) {\n\t\tthis.initialEditSummary =\n\t\t\t'/* ' +\n\t\t\tve.graphemeSafeSubstring( headingText, 0, 244 ) +\n\t\t\t' */ ';\n\t}\n};\n\n/**\n * Move the cursor to a given heading and scroll to it.\n *\n * @param {ve.ce.HeadingNode} headingNode Heading node to scroll to\n */\nve.init.mw.ArticleTarget.prototype.goToHeading = function ( headingNode ) {\n\tconst surface = this.getSurface(),\n\t\tsurfaceView = surface.getView();\n\n\tlet offsetNode = headingNode,\n\t\tlastHeadingLevel = -1;\n\tlet nextNode;\n\t// Find next sibling which isn't a heading\n\twhile ( offsetNode instanceof ve.ce.HeadingNode && offsetNode.getModel().getAttribute( 'level' ) > lastHeadingLevel ) {\n\t\tlastHeadingLevel = offsetNode.getModel().getAttribute( 'level' );\n\t\t// Next sibling\n\t\tnextNode = offsetNode.parent.children[ offsetNode.parent.children.indexOf( offsetNode ) + 1 ];\n\t\tif ( !nextNode ) {\n\t\t\tbreak;\n\t\t}\n\t\toffsetNode = nextNode;\n\t}\n\tconst startOffset = offsetNode.getModel().getOffset();\n\n\tfunction setSelection() {\n\t\tsurfaceView.selectRelativeSelectableContentOffset( startOffset, 1 );\n\t}\n\n\tif ( surfaceView.isFocused() ) {\n\t\tsetSelection();\n\t\t// Focussing the document triggers showSelection which calls scrollIntoView\n\t\t// which uses a jQuery animation, so make sure this is aborted.\n\t\t$( OO.ui.Element.static.getClosestScrollableContainer( surfaceView.$element[ 0 ] ) ).stop( true );\n\t} else {\n\t\t// onDocumentFocus is debounced, so wait for that to happen before setting\n\t\t// the model selection, otherwise it will get reset\n\t\tsurfaceView.once( 'focus', setSelection );\n\t}\n\tthis.scrollToHeading( headingNode );\n};\n\n/**\n * Scroll to a given heading in the document.\n *\n * @param {ve.ce.HeadingNode} headingNode Heading node to scroll to\n * @param {number} [headingOffset=0] Set the top offset of the heading to a specific amount, relative\n * to the surface viewport.\n */\nve.init.mw.ArticleTarget.prototype.scrollToHeading = function ( headingNode, headingOffset ) {\n\tthis.$scrollContainer.scrollTop(\n\t\theadingNode.$element.offset().top - parseInt( headingNode.$element.css( 'margin-top' ) ) -\n\t\t( this.getSurface().padding.top + ( headingOffset || 0 ) ) );\n};\n\n/**\n * Get the URL hash for the current section's ID using the page's HTML.\n *\n * TODO: Do this in a less skin-dependent way\n *\n * @return {string} URL hash with leading '#', or empty string if not found\n */\nve.init.mw.ArticleTarget.prototype.getSectionHashFromPage = function () {\n\t// Assume there are section edit links, as the user just did a section edit. This also means\n\t// that the section numbers line up correctly, as not every H_ tag is a numbered section.\n\tconst $sections = this.$editableContent.find( '.mw-editsection' );\n\n\tlet section;\n\tif ( this.section === 'new' ) {\n\t\t// A new section is appended to the end, so take the last one.\n\t\tsection = $sections.length;\n\t} else {\n\t\tsection = this.section;\n\t}\n\tif ( section > 0 ) {\n\t\t// Compatibility with pre-T13555 markup\n\t\tconst $section = $sections.eq( section - 1 )\n\t\t\t.closest( '.mw-heading, h1, h2, h3, h4, h5, h6' )\n\t\t\t.find( 'h1, h2, h3, h4, h5, h6, .mw-headline' );\n\n\t\tif ( $section.length && $section.attr( 'id' ) ) {\n\t\t\treturn '#' + $section.attr( 'id' );\n\t\t}\n\t}\n\treturn '';\n};\n\n/**\n * Switches to the wikitext editor, either keeping (default) or discarding changes.\n *\n * @param {boolean} [modified=false] Whether there were any changes at all.\n */\nve.init.mw.ArticleTarget.prototype.switchToWikitextEditor = function ( modified ) {\n\t// When switching with changes we always pass the full page as changes in visual section mode\n\t// can still affect the whole document (e.g. removing a reference)\n\tif ( modified ) {\n\t\tthis.section = null;\n\t}\n\n\tif ( this.isModeAvailable( 'source' ) ) {\n\t\tif ( !modified ) {\n\t\t\tthis.reloadSurface( 'source' );\n\t\t} else {\n\t\t\tconst dataPromise = this.getWikitextDataPromiseForDoc( modified );\n\t\t\tthis.reloadSurface( 'source', dataPromise );\n\t\t}\n\t} else {\n\t\tthis.switchToFallbackWikitextEditor( modified );\n\t}\n};\n\n/**\n * Get a data promise for wikitext editing based on the current doc state\n *\n * @param {boolean} modified Whether there were any changes\n * @return {jQuery.Promise} Data promise\n */\nve.init.mw.ArticleTarget.prototype.getWikitextDataPromiseForDoc = function ( modified ) {\n\treturn this.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\t// HACK - add parameters the API doesn't provide for a VE->WT switch\n\t\t// --------------------------------------------------------------------------------\n\t\t// This should match the API result in ApiVisualEditor.php and ArticleTarget#storeDocState\n\t\t// --------------------------------------------------------------------------------\n\t\tdata.basetimestamp = this.baseTimeStamp;\n\t\t// `blockinfo` is not used by this client\n\t\tdata.canEdit = this.canEdit;\n\t\tdata.checkboxesDef = this.checkboxesDef;\n\t\tdata.checkboxesMessages = this.checkboxesMessages; // needed in case we end up autosaving with this data\n\t\t// `content` is already set\n\t\tdata.copyrightWarning = this.copyrightWarning;\n\t\tdata.etag = this.etag;\n\t\tdata.fromEditedState = modified; // this replaces data.preloaded\n\t\tdata.notices = this.remoteNotices;\n\t\tdata.oldid = this.revid;\n\t\tdata.protectedClasses = this.protectedClasses;\n\t\t// `result` is not used\n\t\tdata.starttimestamp = this.startTimeStamp;\n\t\tdata.wouldautocreate = this.wouldautocreate;\n\t\t// Wrap up like a response object as that is what dataPromise is expected to be\n\t\treturn { visualeditoredit: data };\n\t} );\n};\n\n/**\n * Switches to the fallback wikitext editor, either keeping (default) or discarding changes.\n *\n * @param {boolean} [modified=false] Whether there were any changes at all.\n * @return {jQuery.Promise} Promise which rejects if the switch fails\n */\nve.init.mw.ArticleTarget.prototype.switchToFallbackWikitextEditor = function () {\n\treturn ve.createDeferred().resolve().promise();\n};\n\n/**\n * Switch to the visual editor.\n */\nve.init.mw.ArticleTarget.prototype.switchToVisualEditor = function () {\n\tif ( !this.edited ) {\n\t\tthis.reloadSurface( 'visual' );\n\t\treturn;\n\t}\n\n\tconst url = new URL( location.href );\n\tconst dataPromise = mw.libs.ve.targetLoader.requestParsoidData( this.getPageName(), {\n\t\toldId: this.revid,\n\t\ttargetName: this.constructor.static.trackingName,\n\t\tmodified: this.edited,\n\t\twikitext: this.getDocToSave(),\n\t\tsection: this.section,\n\t\teditintro: url.searchParams.get( 'editintro' ),\n\t\tpreload: url.searchParams.get( 'preload' ),\n\t\tpreloadparams: mw.util.getArrayParam( 'preloadparams', url.searchParams )\n\t} );\n\n\tthis.reloadSurface( 'visual', dataPromise );\n};\n\n/**\n * Switch to a different wikitext section\n *\n * @param {string|null} section Section to switch to: a number, 'T-'-prefixed number, 'new'\n * or null (whole document)\n * @param {boolean} [noPrompt=false] Switch without prompting (changes will be lost either way)\n */\nve.init.mw.ArticleTarget.prototype.switchToWikitextSection = function ( section, noPrompt ) {\n\tif ( section === this.section ) {\n\t\treturn;\n\t}\n\tlet promise;\n\tif ( !noPrompt && this.edited && mw.user.options.get( 'useeditwarning' ) ) {\n\t\tpromise = this.getSurface().dialogs.openWindow( 'abandonedit' )\n\t\t\t.closed.then( ( data ) => data && data.action === 'discard' );\n\t} else {\n\t\tpromise = ve.createDeferred().resolve( true ).promise();\n\t}\n\tpromise.then( ( confirmed ) => {\n\t\tif ( confirmed ) {\n\t\t\t// Section has changed and edits have been discarded, so edit summary is no longer valid\n\t\t\t// TODO: Preserve summary if document changes can be preserved\n\t\t\tif ( this.saveDialog ) {\n\t\t\t\tthis.saveDialog.reset();\n\t\t\t}\n\t\t\t// TODO: If switching to a non-null section, get the new section title\n\t\t\tthis.initialEditSummary = null;\n\t\t\tthis.section = section;\n\t\t\tthis.reloadSurface( 'source' );\n\t\t\tthis.updateTabs();\n\t\t}\n\t} );\n};\n\n/**\n * Reload the target surface in the new editor mode\n *\n * @param {string} newMode New mode\n * @param {jQuery.Promise} [dataPromise] Data promise, if any\n */\nve.init.mw.ArticleTarget.prototype.reloadSurface = function ( newMode, dataPromise ) {\n\tthis.setDefaultMode( newMode );\n\tthis.clearDiff();\n\tconst promise = this.load( dataPromise );\n\tthis.getSurface().createProgress(\n\t\tpromise,\n\t\tve.msg( newMode === 'source' ? 'visualeditor-mweditmodesource-progress' : 'visualeditor-mweditmodeve-progress' ),\n\t\ttrue /* non-cancellable */\n\t);\n};\n\n/**\n * Display the given redirect subtitle and redirect page content header on the page.\n *\n * @param {jQuery} $sub Redirect subtitle, see #buildRedirectSub\n * @param {jQuery} $msg Redirect page content header, see #buildRedirectMsg\n */\nve.init.mw.ArticleTarget.prototype.updateRedirectInterface = function ( $sub, $msg ) {\n\t// For the subtitle, replace the real one with ours.\n\t// This is more complicated than it should be because we have to fiddle with the <br>.\n\tconst $currentSub = $( '#redirectsub' );\n\tif ( $currentSub.length ) {\n\t\tif ( $sub.length ) {\n\t\t\t$currentSub.replaceWith( $sub );\n\t\t} else {\n\t\t\t$currentSub.prev().filter( 'br' ).remove();\n\t\t\t$currentSub.remove();\n\t\t}\n\t} else {\n\t\tconst $subtitle = $( '#contentSub' );\n\t\tif ( $sub.length ) {\n\t\t\tif ( $subtitle.children().length ) {\n\t\t\t\t$subtitle.append( $( '<br>' ) );\n\t\t\t}\n\t\t\t$subtitle.append( $sub );\n\t\t}\n\t}\n\n\tif ( $msg.length ) {\n\t\t$msg\n\t\t\t// We need to be able to tell apart the real one and our fake one\n\t\t\t.addClass( 've-redirect-header' )\n\t\t\t.on( 'click', ( e ) => {\n\t\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\t\t\t\twindowAction.open( 'meta', { page: 'settings' } );\n\t\t\t\te.preventDefault();\n\t\t\t} );\n\t}\n\t// For the content header, the real one is hidden, insert ours before it.\n\tconst $currentMsg = $( '.ve-redirect-header' );\n\tif ( $currentMsg.length ) {\n\t\t$currentMsg.replaceWith( $msg );\n\t} else {\n\t\t// Hack: This is normally inside #mw-content-text, but that's hidden while editing.\n\t\t$( '#mw-content-text' ).before( $msg );\n\t}\n};\n\n/**\n * Set temporary redirect interface to match the current state of redirection in the editor.\n *\n * @param {string|null} title Current redirect target, or null if none\n */\nve.init.mw.ArticleTarget.prototype.setFakeRedirectInterface = function ( title ) {\n\tthis.isRedirect = !!title;\n\tthis.updateRedirectInterface(\n\t\ttitle ? this.constructor.static.buildRedirectSub() : $(),\n\t\ttitle ? this.constructor.static.buildRedirectMsg( title ) : $()\n\t);\n};\n\n/**\n * Set the redirect interface to match the page's redirect state.\n */\nve.init.mw.ArticleTarget.prototype.setRealRedirectInterface = function () {\n\tthis.updateRedirectInterface(\n\t\tmw.config.get( 'wgIsRedirect' ) ? this.constructor.static.buildRedirectSub() : $(),\n\t\t// Remove our custom content header - the original one in #mw-content-text will be shown\n\t\t$()\n\t);\n};\n\n/**\n * Render a list of categories\n *\n * Duplicate items are not shown.\n *\n * @param {ve.dm.MetaItem[]} categoryItems Array of category metaitems to display\n * @return {jQuery.Promise} A promise which will be resolved with the rendered categories\n */\nve.init.mw.ArticleTarget.prototype.renderCategories = function ( categoryItems ) {\n\tconst promises = [],\n\t\tcategories = { hidden: {}, normal: {} };\n\tcategoryItems.forEach( ( categoryItem, index ) => {\n\t\tconst attributes = ve.copy( ve.getProp( categoryItem, 'element', 'attributes' ) );\n\t\tattributes.index = index;\n\t\tpromises.push( ve.init.platform.linkCache.get( attributes.category ).done( ( result ) => {\n\t\t\tconst group = result.hidden ? categories.hidden : categories.normal;\n\t\t\t// In case of duplicates, first entry wins (like in MediaWiki)\n\t\t\tif ( !group[ attributes.category ] || group[ attributes.category ].index > attributes.index ) {\n\t\t\t\tgroup[ attributes.category ] = attributes;\n\t\t\t}\n\t\t} ) );\n\t} );\n\treturn ve.promiseAll( promises ).then( () => {\n\t\tconst $output = $( '<div>' ).addClass( 'catlinks' );\n\t\tfunction renderPageLink( page ) {\n\t\t\tconst title = mw.Title.newFromText( page ),\n\t\t\t\t$link = $( '<a>' ).attr( 'rel', 'mw:WikiLink' ).attr( 'href', title.getUrl() ).text( title.getMainText() );\n\t\t\t// Style missing links. The data should already have been fetched\n\t\t\t// as part of the earlier processing of categoryItems.\n\t\t\tve.init.platform.linkCache.styleElement( title.getPrefixedText(), $link, false );\n\t\t\treturn $link;\n\t\t}\n\t\tfunction renderPageLinks( pages ) {\n\t\t\tconst $list = $( '<ul>' );\n\t\t\tfor ( let i = 0; i < pages.length; i++ ) {\n\t\t\t\tconst $link = renderPageLink( pages[ i ] );\n\t\t\t\t$list.append( $( '<li>' ).append( $link ) );\n\t\t\t}\n\t\t\treturn $list;\n\t\t}\n\t\tfunction categorySort( group, a, b ) {\n\t\t\treturn group[ a ].index - group[ b ].index;\n\t\t}\n\t\tconst categoriesNormal = Object.keys( categories.normal );\n\t\tif ( categoriesNormal.length ) {\n\t\t\tcategoriesNormal.sort( categorySort.bind( null, categories.normal ) );\n\t\t\tconst $normal = $( '<div>' ).addClass( 'mw-normal-catlinks' );\n\t\t\tconst $pageLink = renderPageLink( ve.msg( 'pagecategorieslink' ) ).text( ve.msg( 'pagecategories', categoriesNormal.length ) );\n\t\t\tconst $pageLinks = renderPageLinks( categoriesNormal );\n\t\t\t$normal.append(\n\t\t\t\t$pageLink,\n\t\t\t\t$( document.createTextNode( ve.msg( 'colon-separator' ) ) ),\n\t\t\t\t$pageLinks\n\t\t\t);\n\t\t\t$output.append( $normal );\n\t\t}\n\t\tconst categoriesHidden = Object.keys( categories.hidden );\n\t\tif ( categoriesHidden.length ) {\n\t\t\tcategoriesHidden.sort( categorySort.bind( null, categories.hidden ) );\n\t\t\tconst $hidden = $( '<div>' ).addClass( 'mw-hidden-catlinks' );\n\t\t\tif ( mw.user.options.get( 'showhiddencats' ) ) {\n\t\t\t\t$hidden.addClass( 'mw-hidden-cats-user-shown' );\n\t\t\t} else if ( mw.config.get( 'wgNamespaceIds' ).category === mw.config.get( 'wgNamespaceNumber' ) ) {\n\t\t\t\t$hidden.addClass( 'mw-hidden-cats-ns-shown' );\n\t\t\t} else {\n\t\t\t\t$hidden.addClass( 'mw-hidden-cats-hidden' );\n\t\t\t}\n\t\t\tconst $hiddenPageLinks = renderPageLinks( categoriesHidden );\n\t\t\t$hidden.append(\n\t\t\t\t$( document.createTextNode( ve.msg( 'hidden-categories', categoriesHidden.length ) ) ),\n\t\t\t\t$( document.createTextNode( ve.msg( 'colon-separator' ) ) ),\n\t\t\t\t$hiddenPageLinks\n\t\t\t);\n\t\t\t$output.append( $hidden );\n\t\t}\n\t\treturn $output;\n\t} );\n};\n\n// Used in tryTeardown\nve.ui.windowFactory.register( mw.widgets.AbandonEditDialog );\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/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":245,"column":3,"nodeType":"CallExpression","endLine":256,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":398,"column":3,"nodeType":"CallExpression","endLine":404,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":398,"column":3,"nodeType":"CallExpression","endLine":406,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":679,"column":2,"nodeType":"CallExpression","endLine":700,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":799,"column":2,"nodeType":"CallExpression","endLine":817,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":872,"column":9,"nodeType":"CallExpression","endLine":881,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1475,"column":2,"nodeType":"CallExpression","endLine":1479,"endColumn":5}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":53,"column":7,"nodeType":"CallExpression","endLine":53,"endColumn":24,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":54,"column":29,"nodeType":"CallExpression","endLine":54,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":58,"column":27,"nodeType":"CallExpression","endLine":58,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":315,"column":7,"nodeType":"CallExpression","endLine":315,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":315,"column":7,"nodeType":"CallExpression","endLine":315,"endColumn":63,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":316,"column":3,"nodeType":"CallExpression","endLine":316,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":397,"column":3,"nodeType":"CallExpression","endLine":397,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":405,"column":4,"nodeType":"CallExpression","endLine":405,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":428,"column":2,"nodeType":"CallExpression","endLine":432,"endColumn":68,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":428,"column":2,"nodeType":"CallExpression","endLine":428,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":588,"column":2,"nodeType":"CallExpression","endLine":588,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":627,"column":3,"nodeType":"CallExpression","endLine":627,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":632,"column":3,"nodeType":"CallExpression","endLine":632,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":803,"column":21,"nodeType":"CallExpression","endLine":803,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-sizzle","severity":2,"message":"Selector extensions are not allowed","line":812,"column":4,"nodeType":"CallExpression","endLine":812,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":816,"column":3,"nodeType":"CallExpression","endLine":816,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":844,"column":4,"nodeType":"CallExpression","endLine":844,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":915,"column":2,"nodeType":"CallExpression","endLine":915,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1013,"column":29,"nodeType":"CallExpression","endLine":1013,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1111,"column":3,"nodeType":"CallExpression","endLine":1111,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1144,"column":44,"nodeType":"CallExpression","endLine":1144,"endColumn":84,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1234,"column":9,"nodeType":"CallExpression","endLine":1234,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1235,"column":4,"nodeType":"CallExpression","endLine":1235,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1242,"column":3,"nodeType":"CallExpression","endLine":1242,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":1242,"column":3,"nodeType":"CallExpression","endLine":1246,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1421,"column":51,"nodeType":"CallExpression","endLine":1421,"endColumn":81,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki Initialization DesktopArticleTarget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n\n/**\n * MediaWiki desktop article target.\n *\n * @class\n * @extends ve.init.mw.ArticleTarget\n *\n * @constructor\n * @param {Object} [config]\n */\nve.init.mw.DesktopArticleTarget = function VeInitMwDesktopArticleTarget( config ) {\n\t// Parent constructor\n\tve.init.mw.DesktopArticleTarget.super.call( this, config );\n\n\t// Parent constructor bound key event handlers, but we don't want them bound until\n\t// we activate; so unbind them again\n\tthis.unbindHandlers();\n\n\tthis.onWatchToggleHandler = this.onWatchToggle.bind( this );\n\n\t// Properties\n\tthis.onBeforeUnloadFallback = null;\n\tthis.onBeforeUnload = this.onBeforeUnload.bind( this );\n\tthis.onUnloadHandler = this.onUnload.bind( this );\n\tthis.activating = false;\n\tthis.deactivating = false;\n\tthis.deactivatingDeferred = null;\n\tthis.recreating = false;\n\tthis.activatingDeferred = null;\n\tthis.toolbarSetupDeferred = null;\n\tthis.suppressNormalStartupDialogs = false;\n\tthis.editingTabDialog = null;\n\tthis.welcomeDialog = null;\n\tthis.welcomeDialogPromise = null;\n\n\t// If this is true then #transformPage / #restorePage will not call pushState\n\t// This is to avoid adding a new history entry for the url we just got from onpopstate\n\t// (which would mess up with the expected order of Back/Forwards browsing)\n\tthis.actFromPopState = false;\n\tthis.popState = {\n\t\ttag: 'visualeditor'\n\t};\n\tthis.scrollTop = null;\n\tthis.section = null;\n\tif ( $( '#wpSummary' ).length ) {\n\t\tthis.initialEditSummary = $( '#wpSummary' ).val();\n\t} else {\n\t\tthis.initialEditSummary = this.currentUrl.searchParams.get( 'summary' );\n\t}\n\tthis.initialCheckboxes = $( '.editCheckboxes input' ).toArray()\n\t\t.reduce( ( initialCheckboxes, node ) => {\n\t\t\tinitialCheckboxes[ node.name ] = node.checked;\n\t\t\treturn initialCheckboxes;\n\t\t}, {} );\n\n\tthis.tabLayout = mw.config.get( 'wgVisualEditorConfig' ).tabLayout;\n\tthis.events = new ve.init.mw.ArticleTargetEvents( this );\n\tthis.$originalContent = $( '<div>' ).addClass( 've-init-mw-desktopArticleTarget-originalContent' );\n\tthis.$editableContent.addClass( 've-init-mw-desktopArticleTarget-editableContent' );\n\n\t// Initialization\n\tthis.$element\n\t\t.addClass( 've-init-mw-desktopArticleTarget' )\n\t\t.append( this.$originalContent );\n\n\t// We replace the current state with one that's marked with our tag. This way, when users\n\t// use the Back button to exit the editor we can restore Read mode. This is because we want\n\t// to ignore foreign states in onWindowPopState. Without this, the Read state is foreign.\n\t// FIXME: There should be a much better solution than this.\n\thistory.replaceState( this.popState, '', this.currentUrl );\n\n\tthis.setupSkinTabs();\n\n\twindow.addEventListener( 'popstate', this.onWindowPopState.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.init.mw.DesktopArticleTarget, ve.init.mw.ArticleTarget );\n\n/* Static Properties */\n\nve.init.mw.DesktopArticleTarget.static.toolbarGroups = ve.copy( ve.init.mw.DesktopArticleTarget.static.toolbarGroups );\nve.init.mw.DesktopArticleTarget.static.toolbarGroups.push(\n\t{\n\t\tname: 'help',\n\t\talign: 'after',\n\t\ttype: 'mwHelpList',\n\t\ticon: 'help',\n\t\tindicator: null,\n\t\ttitle: ve.msg( 'visualeditor-help-tool' ),\n\t\tinclude: [ { group: 'help' } ],\n\t\tpromote: [ 'mwUserGuide' ]\n\t},\n\t{\n\t\tname: 'notices',\n\t\talign: 'after',\n\t\tinclude: [ { group: 'notices' } ]\n\t},\n\t{\n\t\tname: 'pageMenu',\n\t\talign: 'after',\n\t\ttype: 'list',\n\t\ticon: 'menu',\n\t\tindicator: null,\n\t\ttitle: ve.msg( 'visualeditor-pagemenu-tooltip' ),\n\t\tlabel: ve.msg( 'visualeditor-pagemenu-tooltip' ),\n\t\tinvisibleLabel: true,\n\t\tinclude: [ { group: 'utility' } ],\n\t\tdemote: [ 'changeDirectionality', 'findAndReplace' ]\n\t},\n\t{\n\t\tname: 'editMode',\n\t\talign: 'after',\n\t\ttype: 'list',\n\t\ticon: 'edit',\n\t\ttitle: ve.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\tlabel: ve.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\tinvisibleLabel: true,\n\t\tinclude: [ { group: 'editMode' } ]\n\t},\n\t{\n\t\tname: 'save',\n\t\talign: 'after',\n\t\ttype: 'bar',\n\t\tinclude: [ { group: 'save' } ]\n\t}\n);\n\nve.init.mw.DesktopArticleTarget.static.platformType = 'desktop';\n\n/* Events */\n\n/**\n * @event ve.init.mw.DesktopArticleTarget#deactivate\n */\n\n/**\n * @event ve.init.mw.DesktopArticleTarget#transformPage\n */\n\n/**\n * @event ve.init.mw.DesktopArticleTarget#restorePage\n */\n\n/**\n * Fired when user clicks the button to open the save dialog.\n *\n * @event ve.init.mw.DesktopArticleTarget#saveWorkflowBegin\n */\n\n/**\n * Fired when user exits the save workflow\n *\n * @event ve.init.mw.DesktopArticleTarget#saveWorkflowEnd\n */\n\n/**\n * Fired when user initiates review changes in save workflow\n *\n * @event ve.init.mw.DesktopArticleTarget#saveReview\n */\n\n/**\n * Fired when user initiates saving of the document\n *\n * @event ve.init.mw.DesktopArticleTarget#saveInitiated\n */\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.addSurface = function ( dmDoc, config ) {\n\tconfig = ve.extendObject( {\n\t\t$overlayContainer: $(\n\t\t\tdocument.querySelector( '[data-mw-ve-target-container]' ) ||\n\t\t\tdocument.getElementById( 'content' )\n\t\t),\n\t\t// Vector-2022 content area has no padding itself, so popups render too close\n\t\t// to the edge of the text (T258501). Use a negative value to allow popups to\n\t\t// position slightly outside the content. Padding elsewhere means we are\n\t\t// guaranteed 30px of space between the content and the edge of the viewport.\n\t\t// Other skins pass 'undefined' to use the default padding of +10px.\n\t\toverlayPadding: mw.config.get( 'skin' ) === 'vector-2022' ? -10 : undefined\n\t}, config );\n\treturn ve.init.mw.DesktopArticleTarget.super.prototype.addSurface.call( this, dmDoc, config );\n};\n\n/**\n * Set the container for the target, appending the target to it\n *\n * @param {jQuery} $container\n */\nve.init.mw.DesktopArticleTarget.prototype.setContainer = function ( $container ) {\n\t$container.append( this.$element );\n\tthis.$container = $container;\n};\n\n/**\n * Verify that a PopStateEvent correlates to a state we created.\n *\n * @param {any} popState From PopStateEvent#state\n * @return {boolean}\n */\nve.init.mw.DesktopArticleTarget.prototype.verifyPopState = function ( popState ) {\n\treturn popState && popState.tag === 'visualeditor';\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.setupToolbar = function ( surface ) {\n\tconst mode = surface.getMode(),\n\t\twasSetup = !!this.toolbar;\n\n\tve.track( 'trace.setupToolbar.enter', { mode: mode } );\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.setupToolbar.call( this, surface );\n\n\tconst toolbar = this.getToolbar();\n\n\t// Allow the toolbar to start floating now if necessary\n\tthis.onContainerScroll();\n\n\tve.track( 'trace.setupToolbar.exit', { mode: mode } );\n\tif ( !wasSetup ) {\n\t\ttoolbar.$element\n\t\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar-open' );\n\t\tif ( !toolbar.isFloating() ) {\n\t\t\ttoolbar.$element.css( 'height', '' );\n\t\t}\n\t\tthis.toolbarSetupDeferred.resolve();\n\n\t\tthis.toolbarSetupDeferred.done( () => {\n\t\t\tconst newSurface = this.getSurface();\n\t\t\t// Check the surface wasn't torn down while the toolbar was animating\n\t\t\tif ( newSurface ) {\n\t\t\t\tve.track( 'trace.initializeToolbar.enter', { mode: mode } );\n\t\t\t\tthis.getToolbar().initialize();\n\t\t\t\tnewSurface.getView().emit( 'position' );\n\t\t\t\tnewSurface.getContext().updateDimensions();\n\t\t\t\tve.track( 'trace.initializeToolbar.exit', { mode: mode } );\n\t\t\t\tve.track( 'trace.activate.exit', { mode: mode } );\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.attachToolbar = function () {\n\t// Set edit notices, will be shown after welcome dialog.\n\t// Make sure notices actually exists, because this might be a mode-switch and\n\t// we've already removed it.\n\tconst editNotices = this.getEditNotices(),\n\t\tactionTools = this.toolbar.tools;\n\tif ( editNotices && editNotices.length && actionTools.notices ) {\n\t\tactionTools.notices.setNotices( editNotices );\n\t} else if ( actionTools.notices ) {\n\t\tactionTools.notices.destroy();\n\t\tactionTools.notices = null;\n\t}\n\n\t// Move the toolbar to top of target, before heading etc.\n\t// Avoid re-attaching as it breaks CSS animations\n\tif ( !this.toolbar.$element.parent().is( this.$element ) ) {\n\t\tthis.toolbar.$element\n\t\t\t// Set 0 before attach (expanded in #setupToolbar)\n\t\t\t.css( 'height', '0' )\n\t\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar' );\n\t\tthis.$element.prepend( this.toolbar.$element );\n\n\t\t// Calculate if the 'oo-ui-toolbar-narrow' class is needed (OOUI does it too late for our\n\t\t// toolbar because the methods are called in the wrong order, see T92282).\n\t\tthis.toolbar.onWindowResize();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.setupToolbarSaveButton = function () {\n\tthis.toolbarSaveButton = this.toolbar.getToolGroupByName( 'save' ).items[ 0 ];\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.updateTabs = function () {\n\tmw.libs.ve.updateTabs( true, this.getDefaultMode(), this.section === 'new' );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.loadSuccess = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.loadSuccess.apply( this, arguments );\n\n\tthis.wikitextFallbackLoading = false;\n\t// Duplicate of this code in ve.init.mw.DesktopArticleTarget.init.js\n\t// eslint-disable-next-line no-jquery/no-class-state\n\tif ( $( '#ca-edit' ).hasClass( 'visualeditor-showtabdialog' ) ) {\n\t\t$( '#ca-edit' ).removeClass( 'visualeditor-showtabdialog' );\n\t\t// Set up a temporary window manager\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\t$( OO.ui.getTeleportTarget() ).append( windowManager.$element );\n\t\tthis.editingTabDialog = new mw.libs.ve.EditingTabDialog();\n\t\twindowManager.addWindows( [ this.editingTabDialog ] );\n\t\twindowManager.openWindow( this.editingTabDialog )\n\t\t\t.closed.then( ( data ) => {\n\t\t\t\t// Detach the temporary window manager\n\t\t\t\twindowManager.destroy();\n\n\t\t\t\tif ( data && data.action === 'prefer-wt' ) {\n\t\t\t\t\tthis.switchToWikitextEditor( false );\n\t\t\t\t} else if ( data && data.action === 'multi-tab' ) {\n\t\t\t\t\tlocation.reload();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// Pretend the user saw the welcome dialog before suppressing it.\n\t\tmw.libs.ve.stopShowingWelcomeDialog();\n\t\tthis.suppressNormalStartupDialogs = true;\n\t}\n};\n\n/**\n * Handle the watch button being toggled on/off.\n *\n * @param {boolean} isWatched\n * @param {string} expiry\n * @param {string} expirySelected\n */\nve.init.mw.DesktopArticleTarget.prototype.onWatchToggle = function ( isWatched ) {\n\tif ( !this.active && !this.activating ) {\n\t\treturn;\n\t}\n\tif ( this.checkboxesByName && this.checkboxesByName.wpWatchthis ) {\n\t\tthis.checkboxesByName.wpWatchthis.setSelected(\n\t\t\t!!mw.user.options.get( 'watchdefault' ) ||\n\t\t\t( !!mw.user.options.get( 'watchcreations' ) && !this.pageExists ) ||\n\t\t\tisWatched\n\t\t);\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.bindHandlers = function () {\n\tve.init.mw.DesktopArticleTarget.super.prototype.bindHandlers.call( this );\n\tif ( this.onWatchToggleHandler ) {\n\t\tmw.hook( 'wikipage.watchlistChange' ).add( this.onWatchToggleHandler );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.unbindHandlers = function () {\n\tve.init.mw.DesktopArticleTarget.super.prototype.unbindHandlers.call( this );\n\tif ( this.onWatchToggleHandler ) {\n\t\tmw.hook( 'wikipage.watchlistChange' ).remove( this.onWatchToggleHandler );\n\t}\n};\n\n/**\n * Switch to edit mode.\n *\n * @param {jQuery.Promise} [dataPromise] Promise for pending request from\n * mw.libs.ve.targetLoader#requestPageData, if any\n * @return {jQuery.Promise}\n */\nve.init.mw.DesktopArticleTarget.prototype.activate = function ( dataPromise ) {\n\t// We may be re-activating an old target, during which time ve.init.target\n\t// has been overridden.\n\tve.init.target = ve.init.articleTarget;\n\n\tif ( !this.active && !this.activating ) {\n\t\tthis.activating = true;\n\t\tthis.activatingDeferred = ve.createDeferred();\n\t\tthis.toolbarSetupDeferred = ve.createDeferred();\n\n\t\t$( 'html' ).addClass( 've-activating' );\n\t\tve.promiseAll( [ this.activatingDeferred, this.toolbarSetupDeferred ] ).done( () => {\n\t\t\tif ( !this.suppressNormalStartupDialogs ) {\n\t\t\t\tthis.maybeShowWelcomeDialog();\n\t\t\t\tthis.maybeShowMetaDialog();\n\t\t\t}\n\t\t\tthis.afterActivate();\n\t\t} ).fail( () => {\n\t\t\t$( 'html' ).removeClass( 've-activating' );\n\t\t} );\n\n\t\t// Handlers were unbound in constructor. Will be unbound again in teardown.\n\t\tthis.bindHandlers();\n\n\t\tthis.originalEditondbclick = mw.user.options.get( 'editondblclick' );\n\t\tmw.user.options.set( 'editondblclick', 0 );\n\n\t\t// User interface changes\n\t\tthis.changeDocumentTitle();\n\t\tthis.transformPage();\n\n\t\tthis.load( dataPromise );\n\t}\n\treturn this.activatingDeferred.promise();\n};\n\n/**\n * Edit mode has finished activating\n */\nve.init.mw.DesktopArticleTarget.prototype.afterActivate = function () {\n\t// eslint-disable-next-line mediawiki/class-doc\n\t$( 'html' )\n\t\t// Remove ve-activating when loading for the first time,\n\t\t// and when switching remove previous mode's class.\n\t\t.removeClass( 've-activating ve-active-visual ve-active-source' )\n\t\t.addClass( 've-active ve-active-' + this.getSurface().getMode() );\n\n\t// Disable TemplateStyles in the original content\n\t// (We do this here because toggling 've-active' class above hides it)\n\tthis.$editableContent.find( 'style[data-mw-deduplicate^=\"TemplateStyles:\"]' ).prop( 'disabled', true );\n\n\tthis.afterSurfaceReady();\n\n\tif ( !this.editingTabDialog ) {\n\t\tif ( this.sectionTitle ) {\n\t\t\tthis.sectionTitle.focus();\n\t\t} else {\n\t\t\t// We have to focus the page after hiding the original content, otherwise\n\t\t\t// in firefox the contentEditable container was below the view page, and\n\t\t\t// 'focus' scrolled the screen down.\n\t\t\t// Support: Firefox\n\t\t\tthis.getSurface().getView().focus();\n\t\t}\n\t\t// Transfer and initial source range to the surface (e.g. from tempWikitextEditor)\n\t\tif ( this.initialSourceRange && this.getSurface().getMode() === 'source' ) {\n\t\t\tconst surfaceModel = this.getSurface().getModel();\n\t\t\tconst range = surfaceModel.getRangeFromSourceOffsets( this.initialSourceRange.from, this.initialSourceRange.to );\n\t\t\tsurfaceModel.setLinearSelection( range );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.setSurface = function ( surface ) {\n\tconst resetSurface = surface !== this.surface;\n\n\tif ( resetSurface ) {\n\t\tthis.$editableContent.after( surface.$element );\n\t}\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.setSurface.apply( this, arguments );\n\n\tif ( resetSurface ) {\n\t\tthis.setupNewSection( surface );\n\t}\n};\n\n/**\n * Setup new section input for a surface, if required\n *\n * @param {ve.ui.Surface} surface\n */\nve.init.mw.DesktopArticleTarget.prototype.setupNewSection = function ( surface ) {\n\tif ( surface.getMode() === 'visual' && this.section === 'new' ) {\n\t\tthrow new Error( 'Adding new section is not supported in visual mode' );\n\t}\n\tif ( surface.getMode() === 'source' && this.section === 'new' ) {\n\t\tif ( !this.sectionTitle ) {\n\t\t\tthis.sectionTitle = new OO.ui.TextInputWidget( {\n\t\t\t\t$element: $( '<h2>' ),\n\t\t\t\tclasses: [ 've-init-mw-desktopArticleTarget-sectionTitle' ],\n\t\t\t\tplaceholder: ve.msg( 'visualeditor-section-title-placeholder' ),\n\t\t\t\tspellcheck: true\n\t\t\t} );\n\t\t\tif ( this.recovered ) {\n\t\t\t\tthis.sectionTitle.setValue(\n\t\t\t\t\tve.init.platform.sessionStorage.get( 've-docsectiontitle' ) || ''\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.sectionTitle.connect( this, { change: 'onSectionTitleChange' } );\n\t\t}\n\t\tsurface.setPlaceholder( ve.msg( 'visualeditor-section-body-placeholder' ) );\n\t\tthis.$editableContent.before( this.sectionTitle.$element );\n\n\t\tif ( this.currentUrl.searchParams.has( 'preloadtitle' ) ) {\n\t\t\tthis.sectionTitle.setValue( this.currentUrl.searchParams.get( 'preloadtitle' ) );\n\t\t}\n\t\tsurface.once( 'destroy', this.teardownNewSection.bind( this, surface ) );\n\t} else {\n\t\tve.init.platform.sessionStorage.remove( 've-docsectiontitle' );\n\t}\n};\n\n/**\n * Handle section title changes\n */\nve.init.mw.DesktopArticleTarget.prototype.onSectionTitleChange = function () {\n\tve.init.platform.sessionStorage.set( 've-docsectiontitle', this.sectionTitle.getValue() );\n\tthis.updateToolbarSaveButtonState();\n};\n\n/**\n * Teardown new section inputs\n *\n * @param {ve.ui.Surface} surface\n */\nve.init.mw.DesktopArticleTarget.prototype.teardownNewSection = function ( surface ) {\n\tsurface.setPlaceholder( '' );\n\tif ( this.sectionTitle ) {\n\t\tthis.sectionTitle.$element.remove();\n\t\tthis.sectionTitle = null;\n\t}\n};\n\n/**\n * @inheritdoc\n *\n * A prompt will not be shown if tryTeardown() is called while activation is still in progress.\n * If tryTeardown() is called while the target is deactivating, or while it's not active and\n * not activating, nothing happens.\n */\nve.init.mw.DesktopArticleTarget.prototype.tryTeardown = function ( noPrompt, trackMechanism ) {\n\tif ( this.deactivating || ( !this.active && !this.activating ) ) {\n\t\treturn this.teardownPromise || ve.createDeferred().resolve().promise();\n\t}\n\n\t// Just in case these weren't closed before\n\tif ( this.welcomeDialog ) {\n\t\tthis.welcomeDialog.close();\n\t}\n\tif ( this.editingTabDialog ) {\n\t\tthis.editingTabDialog.close();\n\t}\n\tthis.editingTabDialog = null;\n\n\t// Parent method\n\treturn ve.init.mw.DesktopArticleTarget.super.prototype.tryTeardown.call( this, noPrompt || this.activating, trackMechanism );\n};\n\n/**\n * @inheritdoc\n *\n * @param {string} [trackMechanism]\n * @fires ve.init.mw.DesktopArticleTarget#deactivate\n */\nve.init.mw.DesktopArticleTarget.prototype.teardown = function ( trackMechanism ) {\n\t// Event tracking\n\tlet abortType, abortedMode;\n\tif ( trackMechanism ) {\n\t\tif ( this.activating ) {\n\t\t\tabortType = 'preinit';\n\t\t} else if ( !this.edited ) {\n\t\t\tabortType = 'nochange';\n\t\t} else if ( this.saving ) {\n\t\t\tabortType = 'abandonMidsave';\n\t\t} else {\n\t\t\t// switchwith and switchwithout do not go through this code path,\n\t\t\t// they go through switchToWikitextEditor() instead\n\t\t\tabortType = 'abandon';\n\t\t}\n\t\tabortedMode = this.surface ? this.surface.getMode() : this.getDefaultMode();\n\t}\n\n\t// Cancel activating, start deactivating\n\tthis.deactivating = true;\n\tthis.deactivatingDeferred = ve.createDeferred();\n\tthis.activating = false;\n\tthis.activatingDeferred.reject();\n\t$( 'html' ).addClass( 've-deactivating' ).removeClass( 've-activated ve-active' );\n\n\tthis.emit( 'deactivate' );\n\n\t// Restore TemplateStyles of the original content\n\t// (We do this here because toggling 've-active' class above displays it)\n\tthis.$editableContent.find( 'style[data-mw-deduplicate^=\"TemplateStyles:\"]' ).prop( 'disabled', false );\n\n\t// User interface changes\n\tthis.restorePage();\n\tthis.restoreDocumentTitle();\n\n\tmw.user.options.set( 'editondblclick', this.originalEditondbclick );\n\tthis.originalEditondbclick = undefined;\n\n\t// TODO: Use better checks to see if these restorations are required.\n\tif ( this.getSurface() ) {\n\t\tif ( this.active ) {\n\t\t\tthis.teardownUnloadHandlers();\n\t\t}\n\t}\n\n\t// Parent method\n\treturn ve.init.mw.DesktopArticleTarget.super.prototype.teardown.call( this ).then( () => {\n\t\t// After teardown\n\t\tthis.active = false;\n\n\t\t// If there is a load in progress, try to abort it\n\t\tif ( this.loading && this.loading.abort ) {\n\t\t\tthis.loading.abort();\n\t\t}\n\n\t\tthis.clearState();\n\t\tthis.initialEditSummary = new URL( location.href ).searchParams.get( 'summary' );\n\t\tthis.editSummaryValue = null;\n\n\t\t// Move original content back out of the target\n\t\tthis.$element.parent().append( this.$originalContent.children() );\n\n\t\t$( '.ve-init-mw-desktopArticleTarget-uneditableContent' )\n\t\t\t.removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\n\t\tthis.deactivating = false;\n\t\tthis.deactivatingDeferred.resolve();\n\t\t$( 'html' ).removeClass( 've-deactivating' );\n\n\t\t// Event tracking\n\t\tif ( trackMechanism ) {\n\t\t\tve.track( 'editAttemptStep', {\n\t\t\t\taction: 'abort',\n\t\t\t\ttype: abortType,\n\t\t\t\tmechanism: trackMechanism,\n\t\t\t\tmode: abortedMode\n\t\t\t} );\n\t\t}\n\n\t\tif ( !this.isViewPage ) {\n\t\t\tconst newUrl = new URL( this.viewUrl );\n\t\t\tif ( mw.config.get( 'wgIsRedirect' ) ) {\n\t\t\t\tnewUrl.searchParams.set( 'redirect', 'no' );\n\t\t\t}\n\t\t\tlocation.href = newUrl;\n\t\t}\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.loadFail = function ( code, errorDetails ) {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.loadFail.apply( this, arguments );\n\n\tif ( this.wikitextFallbackLoading ) {\n\t\t// Failed twice now\n\t\tmw.log.warn( 'Failed to fall back to wikitext', code, errorDetails );\n\t\tconst newUrl = new URL( this.viewUrl );\n\t\tnewUrl.searchParams.set( 'action', 'edit' );\n\t\tnewUrl.searchParams.set( 'veswitched', '1' );\n\t\tlocation.href = newUrl;\n\t\treturn;\n\t}\n\n\tif ( !this.activating ) {\n\t\t// Load failed after activation abandoned (e.g. user pressed escape).\n\t\t// Nothing more to do.\n\t\treturn;\n\t}\n\n\tconst $confirmPromptMessage = this.extractErrorMessages( errorDetails );\n\n\tOO.ui.confirm( $confirmPromptMessage, {\n\t\tactions: [\n\t\t\t{ action: 'accept', label: OO.ui.msg( 'ooui-dialog-process-retry' ), flags: 'primary' },\n\t\t\t{ action: 'reject', label: OO.ui.msg( 'ooui-dialog-message-reject' ), flags: 'safe' }\n\t\t]\n\t} ).done( ( confirmed ) => {\n\t\tif ( confirmed ) {\n\t\t\t// Retry load\n\t\t\tthis.load();\n\t\t} else {\n\t\t\t// User pressed \"cancel\"\n\t\t\tif ( this.getSurface() ) {\n\t\t\t\t// Restore the mode of the current surface\n\t\t\t\tthis.setDefaultMode( this.getSurface().getMode() );\n\t\t\t\tthis.activatingDeferred.reject();\n\t\t\t} else {\n\t\t\t\t// We're switching from read mode or the 2010 wikitext editor:\n\t\t\t\t// just give up and stay where you are\n\t\t\t\tthis.tryTeardown( true );\n\t\t\t}\n\t\t}\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.surfaceReady = function () {\n\tif ( !this.activating ) {\n\t\t// Activation was aborted before we got here. Do nothing\n\t\t// TODO are there things we need to clean up?\n\t\treturn;\n\t}\n\n\tconst surface = this.getSurface();\n\n\tthis.activating = false;\n\n\t// TODO: mwTocWidget should probably live in a ve.ui.MWSurface subclass\n\tif ( mw.config.get( 'wgVisualEditorConfig' ).enableTocWidget ) {\n\t\tsurface.mwTocWidget = new ve.ui.MWTocWidget( this.getSurface() );\n\t\tsurface.once( 'destroy', () => {\n\t\t\tsurface.mwTocWidget.$element.remove();\n\t\t} );\n\t}\n\n\tconst metaList = this.getSurface().getModel().getDocument().getMetaList();\n\n\tmetaList.connect( this, {\n\t\tinsert: 'onMetaItemInserted',\n\t\tremove: 'onMetaItemRemoved'\n\t} );\n\t// Rebuild the category list from the page we got from the API. This makes\n\t// it work regardless of whether we came here from activating on an\n\t// existing page, or loading via an edit URL.\n\tthis.rebuildCategories( metaList.getItemsInGroup( 'mwCategory' ), true );\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.surfaceReady.apply( this, arguments );\n\n\tconst redirectMetaItems = metaList.getItemsInGroup( 'mwRedirect' );\n\tif ( redirectMetaItems.length ) {\n\t\tthis.setFakeRedirectInterface( redirectMetaItems[ 0 ].getAttribute( 'title' ) );\n\t} else {\n\t\tthis.setFakeRedirectInterface( null );\n\t}\n\n\tthis.setupUnloadHandlers();\n\n\tthis.activatingDeferred.resolve();\n\tthis.events.trackActivationComplete();\n};\n\n/**\n * Update the redirect and category interfaces when a meta item is inserted into the page.\n *\n * @param {ve.dm.MetaItem} metaItem Item that was inserted\n */\nve.init.mw.DesktopArticleTarget.prototype.onMetaItemInserted = function ( metaItem ) {\n\tswitch ( metaItem.getType() ) {\n\t\tcase 'mwRedirect':\n\t\t\tthis.setFakeRedirectInterface( metaItem.getAttribute( 'title' ) );\n\t\t\tbreak;\n\t\tcase 'mwCategory': {\n\t\t\tconst metaList = this.getSurface().getModel().getDocument().getMetaList();\n\t\t\tthis.rebuildCategories( metaList.getItemsInGroup( 'mwCategory' ) );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Update the redirect and category interfaces when a meta item is removed from the page.\n *\n * @param {ve.dm.MetaItem} metaItem Item that was removed\n * @param {number} offset Linear model offset that the item was at\n * @param {number} index Index within that offset the item was at\n */\nve.init.mw.DesktopArticleTarget.prototype.onMetaItemRemoved = function ( metaItem ) {\n\tswitch ( metaItem.getType() ) {\n\t\tcase 'mwRedirect':\n\t\t\tthis.setFakeRedirectInterface( null );\n\t\t\tbreak;\n\t\tcase 'mwCategory': {\n\t\t\tconst metaList = this.getSurface().getModel().getDocument().getMetaList();\n\t\t\tthis.rebuildCategories( metaList.getItemsInGroup( 'mwCategory' ) );\n\t\t\tbreak;\n\t\t}\n\t}\n};\n\n/**\n * Redisplay the category list on the page\n *\n * This is used for the preview while editing. Leaving the editor either restores the initial\n * categories, or uses the ones generated by the save API.\n *\n * @param {ve.dm.MetaItem[]} categoryItems Array of category metaitems to display\n */\nve.init.mw.DesktopArticleTarget.prototype.rebuildCategories = function ( categoryItems ) {\n\tthis.renderCategories( categoryItems ).done( ( $categories ) => {\n\t\t// Clone the existing catlinks for any specific properties which might\n\t\t// be needed by the rest of the page. Also gives us a not-attached\n\t\t// version, which we can pass to wikipage.categories as it requests.\n\t\tconst $catlinks = $( '#catlinks' ).clone().empty().removeClass( 'categories-allhidden' )\n\t\t\t.append( $categories.children() );\n\t\t// If all categories are hidden, we need to hide the box.\n\t\t$catlinks.toggleClass( 'catlinks-allhidden',\n\t\t\t$catlinks.find( '.mw-normal-catlinks' ).length === 0 &&\n\t\t\t// Some situations make the hidden-categories visible (a user\n\t\t\t// preference, and being on a category page) so rather than\n\t\t\t// encoding that logic here just check whether they're visible:\n\t\t\t// eslint-disable-next-line no-jquery/no-sizzle\n\t\t\t$catlinks.find( '.mw-hidden-catlinks:visible' ).length === 0\n\t\t);\n\t\tthis.transformCategoryLinks( $catlinks );\n\t\tmw.hook( 'wikipage.categories' ).fire( $catlinks );\n\t\t$( '#catlinks' ).replaceWith( $catlinks );\n\t} );\n};\n\n/**\n * Handle clicks on the view tab.\n *\n * @param {jQuery.Event} e Mouse click event\n */\nve.init.mw.DesktopArticleTarget.prototype.onViewTabClick = function ( e ) {\n\tif ( ( !this.active && !this.activating ) || !ve.isUnmodifiedLeftClick( e ) ) {\n\t\treturn;\n\t}\n\tthis.tryTeardown( false, 'navigate-read' );\n\te.preventDefault();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.saveComplete = function ( data ) {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.saveComplete.apply( this, arguments );\n\n\t// If there is no content, then parent method will reload the whole page\n\tif ( !data.nocontent ) {\n\t\t// Fix permalinks\n\t\tif ( data.newrevid !== undefined ) {\n\t\t\t$( '#t-permalink' ).add( '#coll-download-as-rl' ).find( 'a' ).each( ( i, el ) => {\n\t\t\t\tconst permalinkUrl = new URL( el.href );\n\t\t\t\tpermalinkUrl.searchParams.set( 'oldid', data.newrevid );\n\t\t\t\t$( el ).attr( 'href', permalinkUrl.toString() );\n\t\t\t} );\n\t\t}\n\n\t\tif ( data.newrevid !== undefined ) {\n\t\t\t// (T370771) Update wgCurRevisionId and wgRevisionId (!)\n\t\t\t// Mirror of DiscussionTools's cb5d585b93d83f9a7b4df10a71a0d574295f861c\n\t\t\tmw.config.set( {\n\t\t\t\twgCurRevisionId: data.newrevid,\n\t\t\t\twgRevisionId: data.newrevid\n\t\t\t} );\n\n\t\t\t// Actually fire the postEdit hook, now that the save is complete\n\t\t\trequire( 'mediawiki.action.view.postEdit' ).fireHook( 'saved' );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.serialize = function () {\n\t// Parent method\n\tconst promise = ve.init.mw.DesktopArticleTarget.super.prototype.serialize.apply( this, arguments );\n\n\treturn promise.fail( ( error, response ) => {\n\t\tconst $errorMessages = this.extractErrorMessages( response );\n\t\tOO.ui.alert( $errorMessages );\n\n\t\t// It's possible to get here while the save dialog has never been opened (if the user uses\n\t\t// the switch to source mode option)\n\t\tif ( this.saveDialog ) {\n\t\t\tthis.saveDialog.popPending();\n\t\t}\n\t} );\n};\n\n/**\n * Handle clicks on the MwMeta button in the toolbar.\n *\n * @param {jQuery.Event} e Mouse click event\n */\nve.init.mw.DesktopArticleTarget.prototype.onToolbarMetaButtonClick = function () {\n\tthis.getSurface().getDialogs().openWindow( 'meta' );\n};\n\n/**\n * Modify tabs in the skin to support in-place editing.\n *\n * 'Read' and 'Edit source' (when not using single edit tab) bound here,\n * 'Edit' and single edit tab are bound in mw.DesktopArticleTarget.init.\n */\nve.init.mw.DesktopArticleTarget.prototype.setupSkinTabs = function () {\n\tconst namespaceNumber = mw.config.get( 'wgNamespaceNumber' );\n\tconst namespaceName = mw.config.get( 'wgCanonicalNamespace' );\n\tconst isTalkNamespace = mw.Title.isTalkNamespace( namespaceNumber );\n\t// Title::getNamespaceKey()\n\tlet namespaceKey = namespaceName.toLowerCase() || 'main';\n\tif ( namespaceKey === 'file' ) {\n\t\tnamespaceKey = 'image';\n\t}\n\tlet namespaceTabId;\n\t// SkinTemplate::buildContentNavigationUrls()\n\tif ( isTalkNamespace ) {\n\t\tnamespaceTabId = 'ca-talk';\n\t} else {\n\t\tnamespaceTabId = 'ca-nstab-' + namespaceKey;\n\t}\n\t$( '#ca-view' ).add( '#' + namespaceTabId ).find( 'a' )\n\t\t.on( 'click.ve-target', this.onViewTabClick.bind( this ) );\n\n\t// Used by Extension:GuidedTour\n\tmw.hook( 've.skinTabSetupComplete' ).fire();\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.getSaveDialogOpeningData = function () {\n\tconst data = ve.init.mw.DesktopArticleTarget.super.prototype.getSaveDialogOpeningData.apply( this, arguments );\n\tdata.editSummary = this.editSummaryValue || this.initialEditSummary;\n\treturn data;\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.teardownToolbar = function () {\n\tconst deferred = ve.createDeferred();\n\n\tif ( !this.toolbar ) {\n\t\treturn deferred.resolve().promise();\n\t}\n\n\tthis.toolbar.$element\n\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar-preclose' )\n\t\t.css( 'height', this.toolbar.$bar[ 0 ].offsetHeight );\n\trequestAnimationFrame( () => {\n\t\tthis.toolbar.$element\n\t\t\t.css( 'height', '0' )\n\t\t\t.addClass( 've-init-mw-desktopArticleTarget-toolbar-close' );\n\t\tthis.toolbar.$element.one( 'transitionend', () => {\n\t\t\t// Parent method\n\t\t\tve.init.mw.DesktopArticleTarget.super.prototype.teardownToolbar.call( this );\n\t\t\tdeferred.resolve();\n\t\t} );\n\t} );\n\treturn deferred.promise();\n};\n\n/**\n * Change the document title to state that we are now editing.\n */\nve.init.mw.DesktopArticleTarget.prototype.changeDocumentTitle = function () {\n\tconst title = mw.Title.newFromText( this.getPageName() );\n\tconst pageTitleMsg = mw.message( 'pagetitle',\n\t\tve.msg(\n\t\t\tthis.pageExists ? 'editing' : 'creating',\n\t\t\ttitle.getPrefixedText()\n\t\t)\n\t);\n\n\t// T317600\n\tif ( pageTitleMsg.isParseable() ) {\n\t\t// Use the real title if we loaded a view page, otherwise reconstruct it\n\t\tthis.originalDocumentTitle = this.isViewPage ? document.title : ve.msg( 'pagetitle', title.getPrefixedText() );\n\t\t// Reconstruct an edit title\n\t\tdocument.title = pageTitleMsg.text();\n\t} else {\n\t\tmw.log.warn( 'VisualEditor: MediaWiki:Pagetitle contains unsupported syntax. ' +\n\t\t\t'https://www.mediawiki.org/wiki/Manual:Messages_API#Feature_support_in_JavaScript' );\n\t}\n};\n\n/**\n * Restore the original document title.\n */\nve.init.mw.DesktopArticleTarget.prototype.restoreDocumentTitle = function () {\n\tif ( this.originalDocumentTitle ) {\n\t\tdocument.title = this.originalDocumentTitle;\n\t}\n};\n\n/**\n * Page modifications for switching to edit mode.\n *\n * @fires ve.init.mw.DesktopArticleTarget#transformPage\n */\nve.init.mw.DesktopArticleTarget.prototype.transformPage = function () {\n\tthis.updateTabs();\n\tthis.emit( 'transformPage' );\n\n\t// TODO: Deprecate in favour of ve.activationComplete\n\t// Only used by one gadget\n\tmw.hook( 've.activate' ).fire();\n\n\t// Move all native content inside the target\n\t// Exclude notification area to work around T143837\n\tthis.$originalContent.append(\n\t\tthis.$element.siblings()\n\t\t\t.not( '.mw-notification-area' )\n\t\t\t.not( '.ve-init-mw-desktopArticleTarget-toolbarPlaceholder' )\n\t);\n\n\t// To preserve event handlers (e.g. HotCat) if editing is cancelled, detach the original container\n\t// and replace it with a clone during editing\n\tthis.$originalCategories = $( '#catlinks' );\n\tthis.$originalCategories.after( this.$originalCategories.clone() );\n\tthis.$originalCategories.detach();\n\n\t// Mark every non-direct ancestor between editableContent and the container as uneditable\n\tlet $content = this.$editableContent;\n\twhile ( $content && $content.length && !$content.parent().is( this.$container ) ) {\n\t\t$content.prevAll( ':not( .ve-init-mw-tempWikitextEditorWidget )' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t$content.nextAll( ':not( .ve-init-mw-tempWikitextEditorWidget )' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t$content = $content.parent();\n\t}\n\n\tthis.restoreEditTabsIfNeeded( $content );\n\tthis.updateHistoryState();\n};\n\n/**\n * Checks the edit/view tabs have not been marked as disabled. The view tab provides a way\n * to exit the VisualEditor so its important it is not marked as uneditable.\n *\n * @param {jQuery} $content area\n */\nve.init.mw.DesktopArticleTarget.prototype.restoreEditTabsIfNeeded = function ( $content ) {\n\tconst $viewTab = $content.find( '.ve-init-mw-desktopArticleTarget-uneditableContent #ca-view' );\n\tif ( $viewTab.length ) {\n\t\t$viewTab.parents( '.ve-init-mw-desktopArticleTarget-uneditableContent' ).removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t}\n};\n\n/**\n * Category link section transformations for switching to edit mode. Broken out\n * so it can be re-applied when displaying changes to the categories.\n *\n * @param {jQuery} $catlinks Category links container element\n */\nve.init.mw.DesktopArticleTarget.prototype.transformCategoryLinks = function ( $catlinks ) {\n\t// Un-disable the catlinks wrapper, but not the links\n\tif ( this.getSurface() && this.getSurface().getMode() === 'visual' ) {\n\t\t$catlinks.removeClass( 've-init-mw-desktopArticleTarget-uneditableContent' )\n\t\t\t.on( 'click.ve-target', () => {\n\t\t\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\t\t\t\twindowAction.open( 'meta', { page: 'categories' } );\n\t\t\t\treturn false;\n\t\t\t} )\n\t\t\t.find( 'a' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t} else {\n\t\t$catlinks.addClass( 've-init-mw-desktopArticleTarget-uneditableContent' ).off( 'click.ve-target' );\n\t}\n};\n\n/**\n * Update the history state based on the editor mode\n */\nve.init.mw.DesktopArticleTarget.prototype.updateHistoryState = function () {\n\tconst veaction = this.getDefaultMode() === 'visual' ? 'edit' : 'editsource',\n\t\tsection = this.section;\n\n\t// Push veaction=edit(source) url in history (if not already present).\n\t// If we got here from DesktopArticleTarget.init, then it will be already present.\n\tif (\n\t\t!this.actFromPopState &&\n\t\t(\n\t\t\tthis.currentUrl.searchParams.get( 'veaction' ) !== veaction ||\n\t\t\tthis.currentUrl.searchParams.get( 'section' ) !== section\n\t\t) &&\n\t\tthis.currentUrl.searchParams.get( 'action' ) !== 'edit'\n\t) {\n\t\t// Set the current URL\n\t\tconst url = this.currentUrl;\n\n\t\tif ( mw.libs.ve.isSingleEditTab ) {\n\t\t\turl.searchParams.set( 'action', 'edit' );\n\t\t\tmw.config.set( 'wgAction', 'edit' );\n\t\t} else {\n\t\t\turl.searchParams.set( 'veaction', veaction );\n\t\t\turl.searchParams.delete( 'action' );\n\t\t\tmw.config.set( 'wgAction', 'view' );\n\t\t}\n\t\tif ( this.section !== null ) {\n\t\t\turl.searchParams.set( 'section', this.section );\n\t\t} else {\n\t\t\turl.searchParams.delete( 'section' );\n\t\t}\n\n\t\thistory.pushState( this.popState, '', url );\n\t}\n\tthis.actFromPopState = false;\n};\n\n/**\n * Page modifications for switching back to view mode.\n *\n * @fires ve.init.mw.DesktopArticleTarget#restorePage\n */\nve.init.mw.DesktopArticleTarget.prototype.restorePage = function () {\n\t// Restore any previous redirectMsg/redirectsub\n\tthis.setRealRedirectInterface();\n\tif ( this.$originalCategories ) {\n\t\t$( '#catlinks' ).replaceWith( this.$originalCategories );\n\t}\n\n\t// TODO: Deprecate in favour of ve.deactivationComplete\n\tmw.hook( 've.deactivate' ).fire();\n\tthis.emit( 'restorePage' );\n\n\t// Push article url into history\n\tif ( !this.actFromPopState ) {\n\t\t// Remove the VisualEditor query parameters\n\t\tconst url = this.currentUrl;\n\t\tif ( url.searchParams.has( 'veaction' ) ) {\n\t\t\turl.searchParams.delete( 'veaction' );\n\t\t}\n\t\tif ( this.section !== null ) {\n\t\t\t// Translate into a hash for the new URL:\n\t\t\t// This should be after replacePageContent if this is post-save, so we can just look\n\t\t\t// at the headers on the page.\n\t\t\tconst hash = this.getSectionHashFromPage();\n\t\t\tif ( hash ) {\n\t\t\t\turl.hash = hash;\n\t\t\t\tthis.viewUrl.hash = hash;\n\t\t\t\tconst target = document.getElementById( hash.slice( 1 ) );\n\n\t\t\t\tif ( target ) {\n\t\t\t\t\t// Scroll the page to the edited section\n\t\t\t\t\tsetTimeout( () => {\n\t\t\t\t\t\ttarget.scrollIntoView( true );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t\turl.searchParams.delete( 'section' );\n\t\t}\n\t\tif ( url.searchParams.has( 'action' ) && $( '#wpTextbox1:not(.ve-dummyTextbox)' ).length === 0 ) {\n\t\t\t// If we're not overlaid on an edit page, remove action=edit\n\t\t\turl.searchParams.delete( 'action' );\n\t\t\tmw.config.set( 'wgAction', 'view' );\n\t\t}\n\t\tif ( url.searchParams.has( 'oldid' ) && !this.restoring ) {\n\t\t\t// We have an oldid in the query string but it's the most recent one, so remove it\n\t\t\turl.searchParams.delete( 'oldid' );\n\t\t}\n\n\t\t// Remove parameters which are only intended for the editor, not for read mode\n\t\turl.searchParams.delete( 'editintro' );\n\t\turl.searchParams.delete( 'preload' );\n\t\turl.searchParams.delete( 'preloadparams[]' );\n\t\turl.searchParams.delete( 'preloadtitle' );\n\t\turl.searchParams.delete( 'summary' );\n\n\t\t// If there are any other query parameters left, re-use that URL object.\n\t\t// Otherwise use the canonical style view URL (T44553, T102363).\n\t\tconst keys = [];\n\t\turl.searchParams.forEach( ( val, key ) => {\n\t\t\tkeys.push( key );\n\t\t} );\n\t\tif ( !keys.length || ( keys.length === 1 && keys[ 0 ] === 'title' ) ) {\n\t\t\thistory.pushState( this.popState, '', this.viewUrl );\n\t\t} else {\n\t\t\thistory.pushState( this.popState, '', url );\n\t\t}\n\t}\n};\n\n/**\n * @param {Event} e Native event object\n */\nve.init.mw.DesktopArticleTarget.prototype.onWindowPopState = function ( e ) {\n\tif ( !this.verifyPopState( e.state ) ) {\n\t\t// Ignore popstate events fired for states not created by us\n\t\t// This also filters out the initial fire in Chrome (T59901).\n\t\treturn;\n\t}\n\n\tconst oldUrl = this.currentUrl;\n\n\tthis.currentUrl = new URL( location.href );\n\tlet veaction = this.currentUrl.searchParams.get( 'veaction' );\n\tconst action = this.currentUrl.searchParams.get( 'action' );\n\n\tif ( !veaction && action === 'edit' ) {\n\t\tveaction = this.getDefaultMode() === 'source' ? 'editsource' : 'edit';\n\t}\n\n\tif ( this.isModeAvailable( 'source' ) && this.active ) {\n\t\tif ( veaction === 'editsource' && this.getDefaultMode() === 'visual' ) {\n\t\t\tthis.actFromPopState = true;\n\t\t\tthis.switchToWikitextEditor();\n\t\t} else if ( veaction === 'edit' && this.getDefaultMode() === 'source' ) {\n\t\t\tthis.actFromPopState = true;\n\t\t\tthis.switchToVisualEditor();\n\t\t}\n\t}\n\tif ( !this.active && ( veaction === 'edit' || veaction === 'editsource' ) ) {\n\t\tthis.actFromPopState = true;\n\t\tthis.emit( 'reactivate' );\n\t}\n\tif ( this.active && veaction !== 'edit' && veaction !== 'editsource' ) {\n\t\tthis.actFromPopState = true;\n\t\t// \"Undo\" the pop-state, as the event is not cancellable\n\t\thistory.pushState( this.popState, '', oldUrl );\n\t\tthis.currentUrl = oldUrl;\n\t\tthis.tryTeardown( false, 'navigate-back' ).then( () => {\n\t\t\t// Teardown was successful, re-apply the undone state\n\t\t\thistory.back();\n\t\t} ).always( () => {\n\t\t\tthis.actFromPopState = false;\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.replacePageContent = function (\n\thtml, categoriesHtml, displayTitle, lastModified /* , contentSub, sections */\n) {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.replacePageContent.apply( this, arguments );\n\n\tif ( lastModified ) {\n\t\t// If we were not viewing the most recent revision before (a requirement\n\t\t// for lastmod to have been added by MediaWiki), we will be now.\n\t\tif ( !$( '#footer-info-lastmod' ).length ) {\n\t\t\t$( '#footer-info' ).prepend(\n\t\t\t\t$( '<li>' ).attr( 'id', 'footer-info-lastmod' )\n\t\t\t);\n\t\t}\n\n\t\t// Intentionally treated as HTML\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t$( '#footer-info-lastmod' ).html( ' ' + mw.msg(\n\t\t\t'lastmodifiedat',\n\t\t\tlastModified.date,\n\t\t\tlastModified.time\n\t\t) );\n\t}\n\n\tthis.$originalCategories = null;\n\n\t// Re-set any edit section handlers now that the page content has been replaced\n\tmw.libs.ve.setupEditLinks();\n};\n\n/**\n * Add onunload and onbeforeunload handlers.\n */\nve.init.mw.DesktopArticleTarget.prototype.setupUnloadHandlers = function () {\n\tif ( window.onbeforeunload !== this.onBeforeUnload ) {\n\t\t// Remember any already set beforeunload handler\n\t\tthis.onBeforeUnloadFallback = window.onbeforeunload;\n\t\t// Attach our handlers\n\t\twindow.onbeforeunload = this.onBeforeUnload;\n\t\twindow.addEventListener( 'unload', this.onUnloadHandler );\n\t}\n};\n/**\n * Remove onunload and onbeforunload handlers.\n */\nve.init.mw.DesktopArticleTarget.prototype.teardownUnloadHandlers = function () {\n\t// Restore whatever previous onbeforeunload hook existed\n\twindow.onbeforeunload = this.onBeforeUnloadFallback;\n\tthis.onBeforeUnloadFallback = null;\n\twindow.removeEventListener( 'unload', this.onUnloadHandler );\n};\n\n/**\n * Show the beta dialog as needed\n */\nve.init.mw.DesktopArticleTarget.prototype.maybeShowWelcomeDialog = function () {\n\tconst editorMode = this.getDefaultMode(),\n\t\twindowManager = this.getSurface().dialogs;\n\n\tthis.welcomeDialogPromise = ve.createDeferred();\n\n\tif ( mw.libs.ve.shouldShowWelcomeDialog() ) {\n\t\tthis.welcomeDialog = new mw.libs.ve.WelcomeDialog();\n\t\twindowManager.addWindows( [ this.welcomeDialog ] );\n\t\twindowManager.openWindow(\n\t\t\tthis.welcomeDialog,\n\t\t\t{\n\t\t\t\tswitchable: editorMode === 'source' ? this.isModeAvailable( 'visual' ) : true,\n\t\t\t\teditor: editorMode\n\t\t\t}\n\t\t)\n\t\t\t.closed.then( ( data ) => {\n\t\t\t\tthis.welcomeDialogPromise.resolve();\n\t\t\t\tthis.welcomeDialog = null;\n\t\t\t\tif ( data && data.action === 'switch-wte' ) {\n\t\t\t\t\tthis.switchToWikitextEditor( false );\n\t\t\t\t} else if ( data && data.action === 'switch-ve' ) {\n\t\t\t\t\tthis.switchToVisualEditor();\n\t\t\t\t}\n\t\t\t} );\n\t\tmw.libs.ve.stopShowingWelcomeDialog();\n\t} else {\n\t\tthis.welcomeDialogPromise.reject();\n\t}\n};\n\n/**\n * Show the meta dialog as needed on load.\n */\nve.init.mw.DesktopArticleTarget.prototype.maybeShowMetaDialog = function () {\n\tif ( this.welcomeDialogPromise ) {\n\t\t// Pop out the notices when the welcome dialog is closed\n\t\tthis.welcomeDialogPromise\n\t\t\t.always( () => {\n\t\t\t\tif (\n\t\t\t\t\tthis.switched &&\n\t\t\t\t\t!mw.user.options.get( 'visualeditor-hidevisualswitchpopup' )\n\t\t\t\t) {\n\t\t\t\t\t// Show \"switched\" popup\n\t\t\t\t\tconst popup = new mw.libs.ve.SwitchPopupWidget( 'visual' );\n\t\t\t\t\tthis.toolbar.tools.editModeSource.toolGroup.$element.append( popup.$element );\n\t\t\t\t\tpopup.toggle( true );\n\t\t\t\t} else if ( this.toolbar.tools.notices ) {\n\t\t\t\t\t// Show notices\n\t\t\t\t\tthis.toolbar.tools.notices.getPopup().toggle( true );\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\tconst redirectMetaItems = this.getSurface().getModel().getDocument().getMetaList().getItemsInGroup( 'mwRedirect' );\n\tif ( redirectMetaItems.length ) {\n\t\tconst windowAction = ve.ui.actionFactory.create( 'window', this.getSurface() );\n\t\twindowAction.open( 'meta', { page: 'settings' } );\n\t}\n};\n\n/**\n * Handle before unload event.\n *\n * @return {string|undefined} Message\n */\nve.init.mw.DesktopArticleTarget.prototype.onBeforeUnload = function () {\n\t// Check if someone already set on onbeforeunload hook\n\tif ( this.onBeforeUnloadFallback ) {\n\t\t// Get the result of their onbeforeunload hook\n\t\tconst fallbackResult = this.onBeforeUnloadFallback();\n\t\t// If it returned something, exit here and return their message\n\t\tif ( fallbackResult !== undefined ) {\n\t\t\treturn fallbackResult;\n\t\t}\n\t}\n\t// Check if there's been an edit\n\tif (\n\t\tthis.getSurface() &&\n\t\t$.contains( document, this.getSurface().$element.get( 0 ) ) &&\n\t\tthis.edited &&\n\t\t!this.submitting &&\n\t\tmw.user.options.get( 'useeditwarning' )\n\t) {\n\t\t// Return our message\n\t\treturn ve.msg( 'mw-widgets-abandonedit' );\n\t}\n};\n\n/**\n * Handle unload event.\n */\nve.init.mw.DesktopArticleTarget.prototype.onUnload = function () {\n\tif ( !this.submitting ) {\n\t\tve.track( 'editAttemptStep', {\n\t\t\taction: 'abort',\n\t\t\ttype: this.edited ? 'unknown-edited' : 'unknown',\n\t\t\tmechanism: 'navigate',\n\t\t\tmode: this.surface ? this.surface.getMode() : this.getDefaultMode()\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToVisualEditor = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.switchToVisualEditor.apply( this, arguments );\n\n\tif ( this.isModeAvailable( 'visual' ) ) {\n\t\tve.track( 'activity.editor-switch', { action: 'visual-desktop' } );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToWikitextEditor = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.switchToWikitextEditor.apply( this, arguments );\n\n\tif ( this.isModeAvailable( 'source' ) ) {\n\t\tve.track( 'activity.editor-switch', { action: 'source-nwe-desktop' } );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToWikitextSection = function () {\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.switchToWikitextSection.apply( this, arguments );\n\n\tve.track( 'activity.editor-switch', { action: 'source-nwe-desktop' } );\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.switchToFallbackWikitextEditor = function ( modified ) {\n\tconst oldId = mw.config.get( 'wgRevisionId' ) || $( 'input[name=parentRevId]' ).val();\n\tconst prefPromise = mw.libs.ve.setEditorPreference( 'wikitext' );\n\n\tif ( !modified ) {\n\t\tve.track( 'activity.editor-switch', { action: 'source-desktop' } );\n\t\tve.track( 'editAttemptStep', {\n\t\t\taction: 'abort',\n\t\t\ttype: 'switchnochange',\n\t\t\tmechanism: 'navigate',\n\t\t\tmode: 'visual'\n\t\t} );\n\t\tthis.submitting = true;\n\t\treturn prefPromise.then( () => {\n\t\t\tconst url = new URL( this.viewUrl );\n\t\t\turl.searchParams.set( 'action', 'edit' );\n\t\t\t// No changes, safe to stay in section mode\n\t\t\tif ( this.section !== null ) {\n\t\t\t\turl.searchParams.set( 'section', this.section );\n\t\t\t} else {\n\t\t\t\turl.searchParams.delete( 'section' );\n\t\t\t}\n\t\t\turl.searchParams.set( 'veswitched', '1' );\n\t\t\tif ( oldId && oldId !== mw.config.get( 'wgCurRevisionId' ) ) {\n\t\t\t\turl.searchParams.set( 'oldid', oldId );\n\t\t\t}\n\t\t\tif ( mw.libs.ve.isWelcomeDialogSuppressed() ) {\n\t\t\t\turl.searchParams.set( 'vehidebetadialog', '1' );\n\t\t\t}\n\t\t\tlocation.href = url.toString();\n\t\t} );\n\t} else {\n\t\treturn this.serialize( this.getDocToSave() ).then( ( data ) => {\n\t\t\tve.track( 'activity.editor-switch', { action: 'source-desktop' } );\n\t\t\tve.track( 'editAttemptStep', {\n\t\t\t\taction: 'abort',\n\t\t\t\ttype: 'switchwith',\n\t\t\t\tmechanism: 'navigate',\n\t\t\t\tmode: 'visual'\n\t\t\t} );\n\t\t\tthis.submitWithSaveFields( { wpDiff: true, wpAutoSummary: '' }, data.content );\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.init.mw.DesktopArticleTarget.prototype.reloadSurface = function () {\n\tthis.activating = true;\n\tthis.activatingDeferred = ve.createDeferred();\n\n\t// Parent method\n\tve.init.mw.DesktopArticleTarget.super.prototype.reloadSurface.apply( this, arguments );\n\n\tthis.activatingDeferred.done( () => {\n\t\tthis.updateHistoryState();\n\t\tthis.afterActivate();\n\t\tthis.setupTriggerListeners();\n\t} );\n\tthis.toolbarSetupDeferred.resolve();\n};\n\n/* Registration */\n\nve.init.mw.targetFactory.register( ve.init.mw.DesktopArticleTarget );\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/modules/ve-mw/init/targets/ve.init.mw.MobileArticleTarget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":38,"column":26,"nodeType":"CallExpression","endLine":38,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":395,"column":3,"nodeType":"CallExpression","endLine":395,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/targets/ve.init.mw.Target.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":344,"column":89,"nodeType":"ObjectExpression","endLine":350,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'revision_id' is not in camel case.","line":124,"column":3,"nodeType":"Identifier","messageId":"notCamelCase","endLine":124,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/ve.init.mw.Platform.init.js","messages":[],"suppressedMessages":[{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":9,"column":1,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":9,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/ve.init.mw.Platform.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":212,"column":9,"nodeType":"CallExpression","endLine":212,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-each-util","severity":2,"message":"Prefer Array#forEach to $.each","line":279,"column":3,"nodeType":"CallExpression","endLine":324,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-each-util","severity":2,"message":"Prefer Array#forEach to $.each","line":282,"column":4,"nodeType":"CallExpression","endLine":296,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/ve.init.mw.SaveErrorHandler.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/modules/ve-mw/init/ve.init.mw.TargetFactory.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/modules/ve-mw/init/ve.init.mw.ViewportZoomHandler.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":33,"column":23,"nodeType":"CallExpression","endLine":33,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/init/ve.init.mw.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/modules/ve-mw/preinit/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.MWEditModeTool.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":124,"column":28,"nodeType":"CallExpression","endLine":124,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.MWEditingTabDialog.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":82,"column":4,"nodeType":"CallExpression","endLine":86,"endColumn":7}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWEditingTabDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\nmw.libs.ve = mw.libs.ve || {};\n/**\n * Dialog for allowing new users to change editing tab preferences.\n *\n * @class\n * @extends OO.ui.MessageDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nmw.libs.ve.EditingTabDialog = function MWLibsVEMWEditingTabDialog( config ) {\n\t// Parent constructor\n\tmw.libs.ve.EditingTabDialog.super.call( this, config );\n};\n\n/* Inheritance */\n\nOO.inheritClass( mw.libs.ve.EditingTabDialog, OO.ui.MessageDialog );\n\n/* Static Properties */\n\nmw.libs.ve.EditingTabDialog.static.name = 'editingtab';\n\nmw.libs.ve.EditingTabDialog.static.size = 'medium';\n\nmw.libs.ve.EditingTabDialog.static.title = mw.msg( 'visualeditor-editingtabdialog-title' );\n\nmw.libs.ve.EditingTabDialog.static.message = mw.msg( 'visualeditor-editingtabdialog-body' );\n\nmw.libs.ve.EditingTabDialog.static.actions = [\n\n\t{\n\t\taction: 'prefer-wt',\n\t\tlabel: mw.msg( 'visualeditor-preference-tabs-prefer-wt' )\n\t},\n\t{\n\t\taction: 'prefer-ve',\n\t\tlabel: mw.msg( 'visualeditor-preference-tabs-prefer-ve' )\n\t},\n\t{\n\t\taction: 'multi-tab',\n\t\tlabel: mw.msg( 'visualeditor-preference-tabs-multi-tab' )\n\t},\n\t{\n\t\tlabel: mw.msg( 'visualeditor-editingtabdialog-ok' ),\n\t\tflags: [ 'progressive', 'primary' ]\n\t}\n];\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nmw.libs.ve.EditingTabDialog.prototype.getSetupProcess = function ( action ) {\n\treturn mw.libs.ve.EditingTabDialog.super.prototype.getSetupProcess.call( this, action )\n\t\t.next( () => {\n\t\t\t// Same as ve.init.target.getLocalApi()\n\t\t\tnew mw.Api().saveOption( 'visualeditor-hidetabdialog', 1 );\n\t\t\tmw.user.options.set( 'visualeditor-hidetabdialog', 1 );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nmw.libs.ve.EditingTabDialog.prototype.getActionProcess = function ( action ) {\n\tif ( action ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tconst actionWidget = this.getActions().get( { actions: action } )[ 0 ];\n\t\t\tactionWidget.pushPending();\n\t\t\tthis.pushPending();\n\n\t\t\t// Same as ve.init.target.getLocalApi()\n\t\t\tnew mw.Api().saveOption( 'visualeditor-tabs', action ).done( () => {\n\t\t\t\tactionWidget.popPending();\n\t\t\t\tmw.user.options.set( 'visualeditor-tabs', action );\n\t\t\t\tthis.close( { action: action } );\n\t\t\t} );\n\t\t} );\n\t} else {\n\t\t// Parent method\n\t\treturn mw.libs.ve.EditingTabDialog.super.prototype.getActionProcess.call( this, action );\n\t}\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.MWVESwitchPopupWidget.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/modules/ve-mw/preinit/ve.init.MWWelcomeDialog.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/modules/ve-mw/preinit/ve.init.mw.ArticleTargetLoader.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":155,"column":15,"nodeType":"CallExpression","endLine":155,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":385,"column":7,"nodeType":"CallExpression","endLine":385,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.mw.ArticleTargetSaver.js","messages":[],"suppressedMessages":[{"ruleId":"no-undef","severity":2,"message":"'ve' is not defined.","line":111,"column":31,"nodeType":"Identifier","messageId":"undef","endLine":111,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":674,"column":6,"nodeType":"CallExpression","endLine":676,"endColumn":9},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1090,"column":5,"nodeType":"CallExpression","endLine":1113,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1520,"column":6,"nodeType":"CallExpression","endLine":1587,"endColumn":9},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":1613,"column":4,"nodeType":"CallExpression","endLine":1639,"endColumn":7}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":62,"column":3,"nodeType":"CallExpression","endLine":62,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":90,"column":3,"nodeType":"CallExpression","endLine":90,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":182,"column":3,"nodeType":"CallExpression","endLine":182,"endColumn":72,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":183,"column":3,"nodeType":"CallExpression","endLine":183,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":186,"column":3,"nodeType":"CallExpression","endLine":186,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":232,"column":3,"nodeType":"CallExpression","endLine":232,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":233,"column":3,"nodeType":"CallExpression","endLine":233,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":240,"column":3,"nodeType":"CallExpression","endLine":240,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":244,"column":8,"nodeType":"CallExpression","endLine":244,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":245,"column":52,"nodeType":"CallExpression","endLine":245,"endColumn":69,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":404,"column":15,"nodeType":"CallExpression","endLine":404,"endColumn":38,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":439,"column":9,"nodeType":"CallExpression","endLine":439,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":447,"column":4,"nodeType":"CallExpression","endLine":447,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":448,"column":4,"nodeType":"CallExpression","endLine":448,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":478,"column":12,"nodeType":"CallExpression","endLine":478,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":479,"column":16,"nodeType":"CallExpression","endLine":479,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":481,"column":13,"nodeType":"CallExpression","endLine":481,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":483,"column":13,"nodeType":"CallExpression","endLine":483,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":487,"column":12,"nodeType":"CallExpression","endLine":487,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":490,"column":11,"nodeType":"CallExpression","endLine":490,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":495,"column":3,"nodeType":"CallExpression","endLine":495,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":498,"column":3,"nodeType":"CallExpression","endLine":498,"endColumn":47,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":516,"column":3,"nodeType":"CallExpression","endLine":516,"endColumn":80,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":533,"column":13,"nodeType":"CallExpression","endLine":533,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":601,"column":48,"nodeType":"CallExpression","endLine":601,"endColumn":66,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":628,"column":4,"nodeType":"CallExpression","endLine":628,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":852,"column":45,"nodeType":"CallExpression","endLine":852,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":977,"column":6,"nodeType":"CallExpression","endLine":977,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":982,"column":6,"nodeType":"CallExpression","endLine":982,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1002,"column":20,"nodeType":"CallExpression","endLine":1002,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1003,"column":22,"nodeType":"CallExpression","endLine":1003,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1016,"column":5,"nodeType":"CallExpression","endLine":1016,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1033,"column":27,"nodeType":"CallExpression","endLine":1033,"endColumn":66,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1134,"column":21,"nodeType":"CallExpression","endLine":1134,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1142,"column":24,"nodeType":"CallExpression","endLine":1142,"endColumn":52,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1148,"column":5,"nodeType":"CallExpression","endLine":1148,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1398,"column":3,"nodeType":"CallExpression","endLine":1398,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1400,"column":3,"nodeType":"CallExpression","endLine":1400,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1438,"column":28,"nodeType":"CallExpression","endLine":1438,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1456,"column":26,"nodeType":"CallExpression","endLine":1456,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1461,"column":4,"nodeType":"CallExpression","endLine":1461,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1465,"column":55,"nodeType":"CallExpression","endLine":1465,"endColumn":73,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1466,"column":22,"nodeType":"CallExpression","endLine":1466,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1516,"column":5,"nodeType":"CallExpression","endLine":1516,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1533,"column":9,"nodeType":"CallExpression","endLine":1533,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1568,"column":12,"nodeType":"CallExpression","endLine":1568,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":1568,"column":12,"nodeType":"CallExpression","endLine":1568,"endColumn":68,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1569,"column":8,"nodeType":"CallExpression","endLine":1569,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1607,"column":60,"nodeType":"CallExpression","endLine":1607,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki DesktopArticleTarget init.\n *\n * This file must remain as widely compatible as the base compatibility\n * for MediaWiki itself (see mediawiki/core:/resources/startup.js).\n * Avoid use of: SVG, HTML5 DOM, ContentEditable etc.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/* eslint-disable no-jquery/no-global-selector */\n// TODO: ve.now and ve.track should be moved to mw.libs.ve\n/* global ve */\n\n/**\n * Platform preparation for the MediaWiki view page. This loads (when user needs it) the\n * actual MediaWiki integration and VisualEditor library.\n */\n( function () {\n\tconst configData = require( './data.json' ),\n\t\tveactionToMode = {\n\t\t\tedit: 'visual',\n\t\t\teditsource: 'source'\n\t\t},\n\t\tavailableModes = [];\n\tlet init = null,\n\t\tconf = null,\n\t\ttabMessages = null,\n\t\tpageExists = null,\n\t\tviewUrl = null,\n\t\tveEditUrl = null,\n\t\ttabPreference = null;\n\tlet veEditSourceUrl, targetPromise, url,\n\t\tinitialWikitext, oldId,\n\t\tisLoading, tempWikitextEditor, tempWikitextEditorData,\n\t\t$toolbarPlaceholder, $toolbarPlaceholderBar,\n\t\tcontentTop, wasFloating,\n\t\tactive = false,\n\t\ttargetLoaded = false,\n\t\tplugins = [],\n\t\twelcomeDialogDisabled = false,\n\t\teducationPopupsDisabled = false,\n\t\t// Defined after document-ready below\n\t\t$targetContainer = null;\n\n\tif ( mw.config.get( 'wgMFMode' ) ) {\n\t\tmw.log.warn( 'Attempted to load desktop target on mobile.' );\n\t\treturn;\n\t}\n\n\t/**\n\t * Show the loading progress bar\n\t */\n\tfunction showLoading() {\n\t\tif ( isLoading ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisLoading = true;\n\n\t\t$( 'html' ).addClass( 've-activated ve-loading' );\n\t\tif ( !init.$loading ) {\n\t\t\tinit.progressBar = new mw.libs.ve.ProgressBarWidget();\n\t\t\tinit.$loading = $( '<div>' )\n\t\t\t\t.addClass( 've-init-mw-desktopArticleTarget-loading-overlay' )\n\t\t\t\t.append( init.progressBar.$element );\n\t\t}\n\t\t$( document ).on( 'keydown', onDocumentKeyDown );\n\n\t\t$toolbarPlaceholderBar.append( init.$loading );\n\t}\n\n\t/**\n\t * Increment loading progress by one step\n\t *\n\t * See mw.libs.ve.ProgressBarWidget for steps.\n\t */\n\tfunction incrementLoadingProgress() {\n\t\tinit.progressBar.incrementLoadingProgress();\n\t}\n\n\t/**\n\t * Clear and hide the loading progress bar\n\t */\n\tfunction clearLoading() {\n\t\tinit.progressBar.clearLoading();\n\t\tisLoading = false;\n\t\t$( document ).off( 'keydown', onDocumentKeyDown );\n\t\t$( 'html' ).removeClass( 've-loading' );\n\t\tif ( init.$loading ) {\n\t\t\tinit.$loading.detach();\n\t\t}\n\n\t\tif ( tempWikitextEditor ) {\n\t\t\tteardownTempWikitextEditor();\n\t\t}\n\t\thideToolbarPlaceholder();\n\t}\n\n\t/**\n\t * Handle window scroll events\n\t *\n\t * @param {Event} e\n\t */\n\tfunction onWindowScroll() {\n\t\tconst scrollTop = $( document.documentElement ).scrollTop();\n\t\tconst floating = scrollTop > contentTop;\n\t\tif ( floating !== wasFloating ) {\n\t\t\tconst width = $targetContainer.outerWidth();\n\t\t\t$toolbarPlaceholder.toggleClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-floating', floating );\n\t\t\t$toolbarPlaceholderBar.css( 'width', width );\n\t\t\twasFloating = floating;\n\t\t}\n\t}\n\n\tconst onWindowScrollListener = mw.util.throttle( onWindowScroll, 250 );\n\n\t/**\n\t * Show a placeholder for the VE toolbar\n\t */\n\tfunction showToolbarPlaceholder() {\n\t\tif ( !$toolbarPlaceholder ) {\n\t\t\t// Create an equal-height placeholder for the toolbar to avoid vertical jump\n\t\t\t// when the real toolbar is ready.\n\t\t\t$toolbarPlaceholder = $( '<div>' ).addClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder' );\n\t\t\t$toolbarPlaceholderBar = $( '<div>' ).addClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-bar' );\n\t\t\t$toolbarPlaceholder.append( $toolbarPlaceholderBar );\n\t\t}\n\t\t// Toggle -floating class before append (if required) to avoid content moving later\n\t\tcontentTop = $targetContainer.offset().top;\n\t\twasFloating = null;\n\t\tonWindowScroll();\n\n\t\tconst scrollTopBefore = $( document.documentElement ).scrollTop();\n\n\t\t$targetContainer.prepend( $toolbarPlaceholder );\n\n\t\twindow.addEventListener( 'scroll', onWindowScrollListener, { passive: true } );\n\n\t\tif ( wasFloating ) {\n\t\t\t// Browser might not support scroll anchoring:\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-anchor/Guide_to_scroll_anchoring\n\t\t\t// ...so compute the new scroll offset ourselves.\n\t\t\twindow.scrollTo( 0, scrollTopBefore + $toolbarPlaceholder.outerHeight() );\n\t\t}\n\n\t\t// Add class for transition after first render\n\t\tsetTimeout( () => {\n\t\t\t$toolbarPlaceholder.addClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-open' );\n\t\t} );\n\t}\n\n\t/**\n\t * Hide the placeholder for the VE toolbar\n\t */\n\tfunction hideToolbarPlaceholder() {\n\t\tif ( $toolbarPlaceholder ) {\n\t\t\twindow.removeEventListener( 'scroll', onWindowScrollListener );\n\t\t\t$toolbarPlaceholder.detach();\n\t\t\t$toolbarPlaceholder.removeClass( 've-init-mw-desktopArticleTarget-toolbarPlaceholder-open' );\n\t\t}\n\t}\n\n\t/**\n\t * Create a temporary `<textarea>` wikitext editor while source mode loads\n\t *\n\t * @param {Object} data Initialisation data for VE\n\t */\n\tfunction setupTempWikitextEditor( data ) {\n\t\tlet wikitext = data.content;\n\t\t// Add trailing linebreak to non-empty wikitext documents for consistency\n\t\t// with old editor and usability. Will be stripped on save. T156609\n\t\tif ( wikitext ) {\n\t\t\twikitext += '\\n';\n\t\t}\n\t\ttempWikitextEditor = new mw.libs.ve.MWTempWikitextEditorWidget( { value: wikitext } );\n\t\ttempWikitextEditorData = data;\n\n\t\t// Bring forward some transformations that show the editor is now ready\n\t\t// Grey out the page title if it is below the editing toolbar (depending on skin), to show it is uneditable.\n\t\t$( '.ve-init-mw-desktopArticleTarget-targetContainer #firstHeading' ).addClass( 've-init-mw-desktopArticleTarget-uneditableContent' );\n\t\t$( '#mw-content-text' )\n\t\t\t.before( tempWikitextEditor.$element )\n\t\t\t.addClass( 'oo-ui-element-hidden' );\n\t\t$( 'html' ).addClass( 've-tempSourceEditing' ).removeClass( 've-loading' );\n\n\t\t// Resize the textarea to fit content. We could do this more often (e.g. on change)\n\t\t// but hopefully this temporary textarea won't be visible for too long.\n\t\ttempWikitextEditor.adjustSize().moveCursorToStart();\n\t\tve.track( 'editAttemptStep', { action: 'ready', mode: 'source', platform: 'desktop' } );\n\t\tmw.libs.ve.tempWikitextEditor = tempWikitextEditor;\n\t\tmw.hook( 've.wikitextInteractive' ).fire();\n\t}\n\n\t/**\n\t * Synchronise state of temporary wikitexteditor back to the VE initialisation data object\n\t */\n\tfunction syncTempWikitextEditor() {\n\t\tlet wikitext = tempWikitextEditor.getValue();\n\n\t\t// Strip trailing linebreak. Will get re-added in ArticleTarget#parseDocument.\n\t\tif ( wikitext.slice( -1 ) === '\\n' ) {\n\t\t\twikitext = wikitext.slice( 0, -1 );\n\t\t}\n\n\t\tif ( wikitext !== tempWikitextEditorData.content ) {\n\t\t\t// Write changes back to response data object,\n\t\t\t// which will be used to construct the surface.\n\t\t\ttempWikitextEditorData.content = wikitext;\n\t\t\t// TODO: Consider writing changes using a\n\t\t\t// transaction so they can be undone.\n\t\t\t// For now, just mark surface as pre-modified\n\t\t\ttempWikitextEditorData.fromEditedState = true;\n\t\t}\n\n\t\t// Store the last-seen selection and pass to the target\n\t\ttempWikitextEditorData.initialSourceRange = tempWikitextEditor.getRange();\n\n\t\ttempWikitextEditor.$element.prop( 'readonly', true );\n\t}\n\n\t/**\n\t * Teardown the temporary wikitext editor\n\t */\n\tfunction teardownTempWikitextEditor() {\n\t\t// Destroy widget and placeholder\n\t\ttempWikitextEditor.$element.remove();\n\t\tmw.libs.ve.tempWikitextEditor = tempWikitextEditor = null;\n\t\ttempWikitextEditorData = null;\n\n\t\t$( '#mw-content-text' ).removeClass( 'oo-ui-element-hidden' );\n\t\t$( 'html' ).removeClass( 've-tempSourceEditing' );\n\t}\n\n\t/**\n\t * Abort loading the editor\n\t */\n\tfunction abortLoading() {\n\t\t$( 'html' ).removeClass( 've-activated' );\n\t\tactive = false;\n\t\tupdateTabs( false );\n\t\t// Push read tab URL to history\n\t\tif ( $( '#ca-view a' ).length ) {\n\t\t\thistory.pushState( { tag: 'visualeditor' }, '', $( '#ca-view a' ).attr( 'href' ) );\n\t\t}\n\t\tclearLoading();\n\t}\n\n\t/**\n\t * Handle keydown events on the document\n\t *\n\t * @param {jQuery.Event} e Keydown event\n\t */\n\tfunction onDocumentKeyDown( e ) {\n\t\tif ( e.which === 27 /* OO.ui.Keys.ESCAPE */ ) {\n\t\t\tabortLoading();\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\t/**\n\t * Parse a section value from a query string object\n\t *\n\t * @example\n\t * parseSection( new URL( location.href ).searchParams.get( 'section' ) )\n\t *\n\t * @param {string|undefined} section Section value from query object\n\t * @return {string|null} Section if valid, null otherwise\n\t */\n\tfunction parseSection( section ) {\n\t\t// Section must be a number, 'new' or 'T-' prefixed\n\t\tif ( section && /^(new|\\d+|T-\\d+)$/.test( section ) ) {\n\t\t\treturn section;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Use deferreds to avoid loading and instantiating Target multiple times.\n\t *\n\t * @private\n\t * @param {string} mode Target mode: 'visual' or 'source'\n\t * @param {string} section Section to edit\n\t * @return {jQuery.Promise}\n\t */\n\tfunction getTarget( mode, section ) {\n\t\tif ( !targetPromise ) {\n\t\t\t// The TargetLoader module is loaded in the bottom queue, so it should have been\n\t\t\t// requested already but it might not have finished loading yet\n\t\t\ttargetPromise = mw.loader.using( 'ext.visualEditor.targetLoader' )\n\t\t\t\t.then( () => {\n\t\t\t\t\tmw.libs.ve.targetLoader.addPlugin(\n\t\t\t\t\t\t// Run VisualEditorPreloadModules, but if they fail, we still want to continue\n\t\t\t\t\t\t// loading, so convert failure to success\n\t\t\t\t\t\t() => mw.loader.using( conf.preloadModules ).catch(\n\t\t\t\t\t\t\t() => $.Deferred().resolve()\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t\t// Add modules specific to desktop (modules shared between desktop\n\t\t\t\t\t// and mobile are already added by TargetLoader)\n\t\t\t\t\t[\n\t\t\t\t\t\t'ext.visualEditor.desktopArticleTarget',\n\t\t\t\t\t\t// Add requested plugins\n\t\t\t\t\t\t...plugins\n\t\t\t\t\t].forEach( mw.libs.ve.targetLoader.addPlugin );\n\t\t\t\t\tplugins = [];\n\t\t\t\t\treturn mw.libs.ve.targetLoader.loadModules( mode );\n\t\t\t\t} )\n\t\t\t\t.then( () => {\n\t\t\t\t\tif ( !active ) {\n\t\t\t\t\t\t// Loading was aborted\n\t\t\t\t\t\t// TODO: Make loaders abortable instead of waiting\n\t\t\t\t\t\ttargetPromise = null;\n\t\t\t\t\t\treturn $.Deferred().reject().promise();\n\t\t\t\t\t}\n\n\t\t\t\t\tconst target = ve.init.mw.targetFactory.create(\n\t\t\t\t\t\tconf.contentModels[ mw.config.get( 'wgPageContentModel' ) ], {\n\t\t\t\t\t\t\tmodes: availableModes,\n\t\t\t\t\t\t\tdefaultMode: mode\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t\ttarget.on( 'deactivate', () => {\n\t\t\t\t\t\tactive = false;\n\t\t\t\t\t\tupdateTabs( false );\n\t\t\t\t\t} );\n\t\t\t\t\ttarget.on( 'reactivate', () => {\n\t\t\t\t\t\turl = new URL( location.href );\n\t\t\t\t\t\tactivateTarget(\n\t\t\t\t\t\t\tgetEditModeFromUrl( url ),\n\t\t\t\t\t\t\tparseSection( url.searchParams.get( 'section' ) )\n\t\t\t\t\t\t);\n\t\t\t\t\t} );\n\t\t\t\t\ttarget.setContainer( $targetContainer );\n\t\t\t\t\ttargetLoaded = true;\n\t\t\t\t\treturn target;\n\t\t\t\t}, ( e ) => {\n\t\t\t\t\tmw.log.warn( 'VisualEditor failed to load: ' + e );\n\t\t\t\t\treturn $.Deferred().reject( e ).promise();\n\t\t\t\t} );\n\t\t}\n\n\t\ttargetPromise.then( ( target ) => {\n\t\t\ttarget.section = section;\n\t\t} );\n\n\t\treturn targetPromise;\n\t}\n\n\t/**\n\t * @private\n\t * @param {Object} initData\n\t * @param {URL} [linkUrl]\n\t */\n\tfunction trackActivateStart( initData, linkUrl ) {\n\t\tif ( !linkUrl ) {\n\t\t\tlinkUrl = url;\n\t\t}\n\t\tif ( linkUrl.searchParams.get( 'wvprov' ) === 'sticky-header' ) {\n\t\t\tinitData.mechanism += '-sticky-header';\n\t\t}\n\t\tve.track( 'trace.activate.enter', { mode: initData.mode } );\n\t\tinitData.action = 'init';\n\t\tinitData.integration = 'page';\n\t\tve.track( 'editAttemptStep', initData );\n\t\tmw.libs.ve.activationStart = ve.now();\n\t}\n\n\t/**\n\t * Get the skin-specific message for an edit tab\n\t *\n\t * @param {string} tabMsg Base tab message key\n\t * @return {string} Message text\n\t */\n\tfunction getTabMessage( tabMsg ) {\n\t\tlet tabMsgKey = tabMessages[ tabMsg ];\n\t\tconst skinMsgKeys = {\n\t\t\tedit: 'edit',\n\t\t\tcreate: 'create',\n\t\t\teditlocaldescription: 'edit-local',\n\t\t\tcreatelocaldescription: 'create-local'\n\t\t};\n\t\tconst key = skinMsgKeys[ tabMsg ];\n\t\tif ( !tabMsgKey && key ) {\n\t\t\t// Some skins don't use the default skin message keys.\n\t\t\t// The following messages can be used here:\n\t\t\t// * vector-view-edit\n\t\t\t// * vector-view-create\n\t\t\t// * vector-view-edit-local\n\t\t\t// * vector-view-create-local\n\t\t\t// * messages for other skins\n\t\t\ttabMsgKey = mw.config.get( 'skin' ) + '-view-' + key;\n\t\t\tif ( !mw.message( tabMsgKey ).exists() ) {\n\t\t\t\t// The following messages can be used here:\n\t\t\t\t// * skin-view-edit\n\t\t\t\t// * skin-view-create\n\t\t\t\t// * skin-view-edit-local\n\t\t\t\t// * skin-view-create-local\n\t\t\t\ttabMsgKey = 'skin-view-' + key;\n\t\t\t}\n\t\t}\n\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\tconst msg = mw.message( tabMsgKey );\n\t\tif ( !msg.isParseable() ) {\n\t\t\tmw.log.warn( 'VisualEditor: MediaWiki:' + tabMsgKey + ' contains unsupported syntax. ' +\n\t\t\t\t'https://www.mediawiki.org/wiki/Manual:Messages_API#Feature_support_in_JavaScript' );\n\t\t\treturn undefined;\n\t\t}\n\t\treturn msg.text();\n\t}\n\n\t/**\n\t * Set the user's new preferred editor\n\t *\n\t * @param {string} editor Preferred editor, 'visualeditor' or 'wikitext'\n\t * @return {jQuery.Promise} Promise which resolves when the preference has been set\n\t */\n\tfunction setEditorPreference( editor ) {\n\t\t// If visual mode isn't available, don't set the editor preference as the\n\t\t// user has expressed no choice by opening this editor. (T246259)\n\t\t// Strictly speaking the same thing should happen if visual mode is\n\t\t// available but source mode isn't, but that is never the case.\n\t\tif ( !init.isVisualAvailable ) {\n\t\t\treturn $.Deferred().resolve().promise();\n\t\t}\n\n\t\tif ( editor !== 'visualeditor' && editor !== 'wikitext' ) {\n\t\t\tthrow new Error( 'setEditorPreference called with invalid option: ', editor );\n\t\t}\n\n\t\tlet key = pageExists ? 'edit' : 'create',\n\t\t\tsectionKey = 'editsection';\n\n\t\tif (\n\t\t\tmw.config.get( 'wgVisualEditorConfig' ).singleEditTab &&\n\t\t\ttabPreference === 'remember-last'\n\t\t) {\n\t\t\tif ( $( '#ca-view-foreign' ).length ) {\n\t\t\t\tkey += 'localdescription';\n\t\t\t}\n\t\t\tif ( editor === 'wikitext' ) {\n\t\t\t\tkey += 'source';\n\t\t\t\tsectionKey += 'source';\n\t\t\t}\n\n\t\t\t$( '#ca-edit a' ).text( getTabMessage( key ) );\n\t\t\t$( '.mw-editsection a' ).text( getTabMessage( sectionKey ) );\n\t\t}\n\n\t\tmw.cookie.set( 'VEE', editor, { path: '/', expires: 30 * 86400, prefix: '' } );\n\n\t\t// Save user preference if logged in\n\t\tif (\n\t\t\tmw.user.isNamed() &&\n\t\t\tmw.user.options.get( 'visualeditor-editor' ) !== editor\n\t\t) {\n\t\t\t// Same as ve.init.target.getLocalApi()\n\t\t\treturn new mw.Api().saveOption( 'visualeditor-editor', editor ).then( () => {\n\t\t\t\tmw.user.options.set( 'visualeditor-editor', editor );\n\t\t\t} );\n\t\t}\n\t\treturn $.Deferred().resolve().promise();\n\t}\n\n\t/**\n\t * Update state of editing tabs\n\t *\n\t * @param {boolean} editing Whether the editor is loaded\n\t * @param {string} [mode='visual'] Edit mode ('visual' or 'source')\n\t * @param {boolean} [isNewSection] Adding a new section\n\t */\n\tfunction updateTabs( editing, mode, isNewSection ) {\n\t\tlet $tab;\n\n\t\tif ( editing ) {\n\t\t\tif ( isNewSection ) {\n\t\t\t\t$tab = $( '#ca-addsection' );\n\t\t\t} else if ( $( '#ca-ve-edit' ).length ) {\n\t\t\t\tif ( !mode || mode === 'visual' ) {\n\t\t\t\t\t$tab = $( '#ca-ve-edit' );\n\t\t\t\t} else {\n\t\t\t\t\t$tab = $( '#ca-edit' );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Single edit tab\n\t\t\t\t$tab = $( '#ca-edit' );\n\t\t\t}\n\t\t} else {\n\t\t\t$tab = $( '#ca-view' );\n\t\t}\n\n\t\t// Deselect current mode (e.g. \"view\" or \"history\") in skins that have\n\t\t// separate tab sections for content actions and namespaces, like Vector.\n\t\t$( '#p-views' ).find( 'li.selected' ).removeClass( 'selected' );\n\t\t// In skins like MonoBook that don't have the separate tab sections,\n\t\t// deselect the known tabs for editing modes (when switching or exiting editor).\n\t\t$( '#ca-edit, #ca-ve-edit, #ca-addsection' ).not( $tab ).removeClass( 'selected' );\n\n\t\t$tab.addClass( 'selected' );\n\t}\n\n\t/**\n\t * Scroll to a specific heading before VE loads\n\t *\n\t * Similar to ve.init.mw.ArticleTarget.prototype.scrollToHeading\n\t *\n\t * @param {string} section Parsed section (string)\n\t */\n\tfunction scrollToSection( section ) {\n\t\tif ( section === '0' || section === 'new' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet $heading;\n\t\t$( '#mw-content-text .mw-editsection a:not( .mw-editsection-visualeditor )' ).each( ( i, el ) => {\n\t\t\tconst linkUrl = new URL( el.href );\n\t\t\tif ( section === parseSection( linkUrl.searchParams.get( 'section' ) ) ) {\n\t\t\t\t$heading = $( el ).closest( '.mw-heading, h1, h2, h3, h4, h5, h6' );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\t// When loading on action=edit URLs, there is no page content\n\t\tif ( !$heading || !$heading.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet offset = 0;\n\t\tconst enableVisualSectionEditing = mw.config.get( 'wgVisualEditorConfig' ).enableVisualSectionEditing;\n\t\tif ( enableVisualSectionEditing === true || enableVisualSectionEditing === 'desktop' ) {\n\t\t\t// Heading will jump to the top of the page in visual section editing.\n\t\t\t// This measurement already includes the height of $toolbarPlaceholder.\n\t\t\toffset = $( '#mw-content-text' ).offset().top;\n\t\t} else {\n\t\t\t// Align with top of heading margin. Doesn't apply in visual section editing as the margin collapses.\n\t\t\toffset = parseInt( $heading.css( 'margin-top' ) ) + $toolbarPlaceholder.outerHeight();\n\t\t}\n\n\t\t// Support for CSS `scroll-behavior: smooth;` and JS `window.scroll( { behavior: 'smooth' } )`\n\t\t// is correlated:\n\t\t// * https://caniuse.com/css-scroll-behavior\n\t\t// * https://caniuse.com/mdn-api_window_scroll_options_behavior_parameter\n\t\tconst supportsSmoothScroll = 'scrollBehavior' in document.documentElement.style;\n\t\tconst newScrollTop = $heading.offset().top - offset;\n\t\tif ( supportsSmoothScroll ) {\n\t\t\twindow.scroll( {\n\t\t\t\ttop: newScrollTop,\n\t\t\t\tbehavior: 'smooth'\n\t\t\t} );\n\t\t} else {\n\t\t\t// Ideally we would use OO.ui.Element.static.getRootScrollableElement here\n\t\t\t// as it has slightly better browser support (Chrome < 60)\n\t\t\tconst scrollContainer = document.documentElement;\n\n\t\t\t$( scrollContainer ).animate( {\n\t\t\t\tscrollTop: newScrollTop\n\t\t\t} );\n\t\t}\n\t}\n\n\t/**\n\t * Load and activate the target.\n\t *\n\t * If you need to call methods on the target before activate is called, call getTarget()\n\t * yourself, chain your work onto that promise, and pass that chained promise in as targetPromise.\n\t * E.g. `activateTarget( getTarget().then( function( target ) { target.doAThing(); } ) );`\n\t *\n\t * @private\n\t * @param {string} mode Target mode: 'visual' or 'source'\n\t * @param {string} [section] Section to edit.\n\t * If visual section editing is not enabled, we will jump to the start of this section, and still\n\t * the heading to prefix the edit summary.\n\t * @param {jQuery.Promise} [tPromise] Promise that will be resolved with a ve.init.mw.DesktopArticleTarget\n\t * @param {boolean} [modified=false] The page has been modified before loading (e.g. in source mode)\n\t */\n\tfunction activateTarget( mode, section, tPromise, modified ) {\n\t\tlet dataPromise;\n\n\t\tupdateTabs( true, mode, section === 'new' );\n\n\t\t// Only call requestPageData early if the target object isn't there yet.\n\t\t// If the target object is there, this is a second or subsequent load, and the\n\t\t// internal state of the target object can influence the load request.\n\t\tif ( !targetLoaded ) {\n\t\t\t// The TargetLoader module is loaded in the bottom queue, so it should have been\n\t\t\t// requested already but it might not have finished loading yet\n\t\t\tdataPromise = mw.loader.using( 'ext.visualEditor.targetLoader' )\n\t\t\t\t.then( () => mw.libs.ve.targetLoader.requestPageData( mode, mw.config.get( 'wgRelevantPageName' ), {\n\t\t\t\t\tsessionStore: true,\n\t\t\t\t\tsection: section,\n\t\t\t\t\toldId: oldId,\n\t\t\t\t\t// Should be ve.init.mw.DesktopArticleTarget.static.trackingName, but the\n\t\t\t\t\t// class hasn't loaded yet.\n\t\t\t\t\t// This is used for stats tracking, so do not change!\n\t\t\t\t\ttargetName: 'mwTarget',\n\t\t\t\t\tmodified: modified,\n\t\t\t\t\teditintro: url.searchParams.get( 'editintro' ),\n\t\t\t\t\tpreload: url.searchParams.get( 'preload' ),\n\t\t\t\t\tpreloadparams: mw.util.getArrayParam( 'preloadparams', url.searchParams ),\n\t\t\t\t\t// If switching to visual with modifications, check if we have wikitext to convert\n\t\t\t\t\twikitext: mode === 'visual' && modified ? $( '#wpTextbox1' ).textSelection( 'getContents' ) : undefined\n\t\t\t\t} ) );\n\n\t\t\tdataPromise\n\t\t\t\t.then( ( response ) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// Check target promise hasn't already failed (isLoading=false)\n\t\t\t\t\t\tisLoading &&\n\t\t\t\t\t\t// TODO: Support tempWikitextEditor when section=new (T185633)\n\t\t\t\t\t\tmode === 'source' && section !== 'new' &&\n\t\t\t\t\t\t// Can't use temp editor when recovering an autosave\n\t\t\t\t\t\t!( response.visualeditor && response.visualeditor.recovered )\n\t\t\t\t\t) {\n\t\t\t\t\t\tsetupTempWikitextEditor( response.visualeditor );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.then( incrementLoadingProgress );\n\t\t}\n\n\t\t// Do this before section scrolling\n\t\tshowToolbarPlaceholder();\n\t\tmw.hook( 've.activationStart' ).fire();\n\n\t\tlet visibleSection = null;\n\t\tlet visibleSectionOffset = null;\n\t\tif ( section === null ) {\n\t\t\tlet firstVisibleEditSection = null;\n\t\t\t$( '#firstHeading, #mw-content-text .mw-editsection' ).each( ( i, el ) => {\n\t\t\t\tconst top = el.getBoundingClientRect().top;\n\t\t\t\tif ( top > 0 ) {\n\t\t\t\t\tfirstVisibleEditSection = el;\n\t\t\t\t\t// break\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( firstVisibleEditSection && firstVisibleEditSection.id !== 'firstHeading' ) {\n\t\t\t\tconst firstVisibleSectionLink = firstVisibleEditSection.querySelector( 'a' );\n\t\t\t\tconst linkUrl = new URL( firstVisibleSectionLink.href );\n\t\t\t\tvisibleSection = parseSection( linkUrl.searchParams.get( 'section' ) );\n\n\t\t\t\tconst firstVisibleHeading = $( firstVisibleEditSection ).closest( '.mw-heading, h1, h2, h3, h4, h5, h6' )[ 0 ];\n\t\t\t\tvisibleSectionOffset = firstVisibleHeading.getBoundingClientRect().top;\n\t\t\t}\n\t\t} else if ( mode === 'visual' ) {\n\t\t\tscrollToSection( section );\n\t\t}\n\n\t\tshowLoading( mode );\n\t\tincrementLoadingProgress();\n\t\tactive = true;\n\n\t\ttPromise = tPromise || getTarget( mode, section );\n\t\ttPromise\n\t\t\t.then( ( target ) => {\n\t\t\t\ttarget.visibleSection = visibleSection;\n\t\t\t\ttarget.visibleSectionOffset = visibleSectionOffset;\n\n\t\t\t\tincrementLoadingProgress();\n\t\t\t\t// If target was already loaded, ensure the mode is correct\n\t\t\t\ttarget.setDefaultMode( mode );\n\t\t\t\t// syncTempWikitextEditor modified the result object in the dataPromise\n\t\t\t\tif ( tempWikitextEditor ) {\n\t\t\t\t\tsyncTempWikitextEditor();\n\t\t\t\t}\n\n\t\t\t\tconst deactivating = target.deactivatingDeferred || $.Deferred().resolve();\n\t\t\t\treturn deactivating.then( () => {\n\t\t\t\t\ttarget.currentUrl = new URL( location.href );\n\t\t\t\t\tconst activatePromise = target.activate( dataPromise );\n\n\t\t\t\t\t// toolbarSetupDeferred resolves slightly before activatePromise, use done\n\t\t\t\t\t// to run in the same paint cycle as the VE toolbar being drawn\n\t\t\t\t\ttarget.toolbarSetupDeferred.done( () => {\n\t\t\t\t\t\thideToolbarPlaceholder();\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn activatePromise;\n\t\t\t\t} );\n\t\t\t} )\n\t\t\t.then( () => {\n\t\t\t\tif ( mode === 'visual' ) {\n\t\t\t\t\t// `action: 'ready'` has already been fired for source mode in setupTempWikitextEditor\n\t\t\t\t\tve.track( 'editAttemptStep', { action: 'ready', mode: mode } );\n\t\t\t\t} else if ( !tempWikitextEditor ) {\n\t\t\t\t\t// We're in source mode, but skipped the\n\t\t\t\t\t// tempWikitextEditor, so make sure we do relevant\n\t\t\t\t\t// tracking / hooks:\n\t\t\t\t\tve.track( 'editAttemptStep', { action: 'ready', mode: mode } );\n\t\t\t\t\tmw.hook( 've.wikitextInteractive' ).fire();\n\t\t\t\t}\n\t\t\t\tve.track( 'editAttemptStep', { action: 'loaded', mode: mode } );\n\t\t\t} )\n\t\t\t.always( clearLoading );\n\t}\n\n\t/**\n\t * @private\n\t * @param {string} mode Target mode: 'visual' or 'source'\n\t * @param {string} [section]\n\t * @param {boolean} [modified=false] The page has been modified before loading (e.g. in source mode)\n\t * @param {URL} [linkUrl] URL to navigate to, potentially with extra parameters\n\t */\n\tfunction activatePageTarget( mode, section, modified, linkUrl ) {\n\t\ttrackActivateStart( { type: 'page', mechanism: mw.config.get( 'wgArticleId' ) ? 'click' : 'new', mode: mode }, linkUrl );\n\n\t\tif ( !active ) {\n\t\t\t// Replace the current state with one that is tagged as ours, to prevent the\n\t\t\t// back button from breaking when used to exit VE. FIXME: there should be a better\n\t\t\t// way to do this. See also similar code in the DesktopArticleTarget constructor.\n\t\t\thistory.replaceState( { tag: 'visualeditor' }, '', url );\n\t\t\t// Set action=edit or veaction=edit/editsource\n\t\t\t// Use linkUrl to preserve parameters like 'editintro' (T56029)\n\t\t\thistory.pushState( { tag: 'visualeditor' }, '', linkUrl || ( mode === 'source' ? veEditSourceUrl : veEditUrl ) );\n\t\t\t// Update URL instance\n\t\t\turl = linkUrl || veEditUrl;\n\n\t\t\tactivateTarget( mode, section, undefined, modified );\n\t\t}\n\t}\n\n\t/**\n\t * Get the last mode a user used\n\t *\n\t * @return {string|null} 'visualeditor', 'wikitext' or null\n\t */\n\tfunction getLastEditor() {\n\t\t// This logic matches VisualEditorHooks::getLastEditor\n\t\tlet editor = mw.cookie.get( 'VEE', '' );\n\t\t// Set editor to user's preference or site's default (ignore the cookie) if …\n\t\tif (\n\t\t\t// … user is logged in,\n\t\t\tmw.user.isNamed() ||\n\t\t\t// … no cookie is set, or\n\t\t\t!editor ||\n\t\t\t// value is invalid.\n\t\t\t!( editor === 'visualeditor' || editor === 'wikitext' )\n\t\t) {\n\t\t\teditor = mw.user.options.get( 'visualeditor-editor' );\n\t\t}\n\t\treturn editor;\n\t}\n\n\t/**\n\t * Get the preferred editor for this edit page\n\t *\n\t * For the preferred *available* editor, use getAvailableEditPageEditor.\n\t *\n\t * @return {string|null} 'visualeditor', 'wikitext' or null\n\t */\n\tfunction getEditPageEditor() {\n\t\t// This logic matches VisualEditorHooks::getEditPageEditor\n\t\t// !!+ casts '0' to false\n\t\tconst isRedLink = !!+url.searchParams.get( 'redlink' );\n\t\t// On dual-edit-tab wikis, the edit page must mean the user wants wikitext,\n\t\t// unless following a redlink\n\t\tif ( !mw.config.get( 'wgVisualEditorConfig' ).singleEditTab && !isRedLink ) {\n\t\t\treturn 'wikitext';\n\t\t}\n\t\t// Adding a new section is not supported in visual mode\n\t\tif ( url.searchParams.get( 'section' ) === 'new' ) {\n\t\t\treturn 'wikitext';\n\t\t}\n\n\t\tswitch ( tabPreference ) {\n\t\t\tcase 'prefer-ve':\n\t\t\t\treturn 'visualeditor';\n\t\t\tcase 'prefer-wt':\n\t\t\t\treturn 'wikitext';\n\t\t\tcase 'multi-tab':\n\t\t\t\t// 'multi-tab'\n\t\t\t\t// TODO: See VisualEditor.hooks.php\n\t\t\t\treturn isRedLink ?\n\t\t\t\t\tgetLastEditor() :\n\t\t\t\t\t'wikitext';\n\t\t\tcase 'remember-last':\n\t\t\tdefault:\n\t\t\t\treturn getLastEditor();\n\t\t}\n\t}\n\n\t/**\n\t * Get the preferred editor which is also available on this edit page\n\t *\n\t * @return {string} 'visual' or 'source'\n\t */\n\tfunction getAvailableEditPageEditor() {\n\t\tswitch ( getEditPageEditor() ) {\n\t\t\tcase 'visualeditor':\n\t\t\t\tif ( init.isVisualAvailable ) {\n\t\t\t\t\treturn 'visual';\n\t\t\t\t}\n\t\t\t\tif ( init.isWikitextAvailable ) {\n\t\t\t\t\treturn 'source';\n\t\t\t\t}\n\t\t\t\treturn null;\n\n\t\t\tcase 'wikitext':\n\t\t\tdefault:\n\t\t\t\treturn init.isWikitextAvailable ? 'source' : null;\n\t\t}\n\t}\n\n\t/**\n\t * Check if a boolean preference is set in user options, mw.storage or a cookie\n\t *\n\t * @param {string} prefName Preference name\n\t * @param {string} storageKey mw.storage key\n\t * @param {string} cookieName Cookie name\n\t * @return {boolean} Preference is set\n\t */\n\tfunction checkPreferenceOrStorage( prefName, storageKey, cookieName ) {\n\t\tstorageKey = storageKey || prefName;\n\t\tcookieName = cookieName || storageKey;\n\t\treturn !!( mw.user.options.get( prefName ) ||\n\t\t\t(\n\t\t\t\t!mw.user.isNamed() && (\n\t\t\t\t\tmw.storage.get( storageKey ) ||\n\t\t\t\t\tmw.cookie.get( cookieName, '' )\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * Set a boolean preference to true in user options, mw.storage or a cookie\n\t *\n\t * @param {string} prefName Preference name\n\t * @param {string} storageKey mw.storage key\n\t * @param {string} cookieName Cookie name\n\t */\n\tfunction setPreferenceOrStorage( prefName, storageKey, cookieName ) {\n\t\tstorageKey = storageKey || prefName;\n\t\tcookieName = cookieName || storageKey;\n\t\tif ( !mw.user.isNamed() ) {\n\t\t\t// Try local storage first; if that fails, set a cookie\n\t\t\tif ( !mw.storage.set( storageKey, 1 ) ) {\n\t\t\t\tmw.cookie.set( cookieName, 1, { path: '/', expires: 30 * 86400, prefix: '' } );\n\t\t\t}\n\t\t} else {\n\t\t\tnew mw.Api().saveOption( prefName, '1' );\n\t\t\tmw.user.options.set( prefName, '1' );\n\t\t}\n\t}\n\n\tconf = mw.config.get( 'wgVisualEditorConfig' );\n\ttabMessages = conf.tabMessages;\n\tviewUrl = new URL( mw.util.getUrl( mw.config.get( 'wgRelevantPageName' ) ), location.href );\n\turl = new URL( location.href );\n\t// T156998: Don't trust 'oldid' query parameter, it'll be wrong if 'diff' or 'direction'\n\t// is set to 'next' or 'prev'.\n\toldId = mw.config.get( 'wgRevisionId' ) || $( 'input[name=parentRevId]' ).val();\n\tif ( oldId === mw.config.get( 'wgCurRevisionId' ) || mw.config.get( 'wgEditLatestRevision' ) ) {\n\t\t// The page may have been edited by someone else after we loaded it, setting this to \"undefined\"\n\t\t// indicates that we should load the actual latest revision.\n\t\toldId = undefined;\n\t}\n\tpageExists = !!mw.config.get( 'wgRelevantArticleId' );\n\tconst isViewPage = mw.config.get( 'wgIsArticle' ) && !url.searchParams.has( 'diff' );\n\tconst wgAction = mw.config.get( 'wgAction' );\n\tconst isEditPage = wgAction === 'edit' || wgAction === 'submit';\n\tconst pageCanLoadEditor = isViewPage || isEditPage;\n\tconst pageIsProbablyEditable = mw.config.get( 'wgIsProbablyEditable' ) ||\n\t\tmw.config.get( 'wgRelevantPageIsProbablyEditable' );\n\n\t// Cast \"0\" (T89513)\n\tconst enable = !!+mw.user.options.get( 'visualeditor-enable' );\n\tconst tempdisable = !!+mw.user.options.get( 'visualeditor-betatempdisable' );\n\tconst autodisable = !!+mw.user.options.get( 'visualeditor-autodisable' );\n\ttabPreference = mw.user.options.get( 'visualeditor-tabs' );\n\n\t/**\n\t * The only edit tab shown to the user is for visual mode\n\t *\n\t * @return {boolean}\n\t */\n\tfunction isOnlyTabVE() {\n\t\treturn conf.singleEditTab && getAvailableEditPageEditor() === 'visual';\n\t}\n\n\t/**\n\t * The only edit tab shown to the user is for source mode\n\t *\n\t * @return {boolean}\n\t */\n\tfunction isOnlyTabWikitext() {\n\t\treturn conf.singleEditTab && getAvailableEditPageEditor() === 'source';\n\t}\n\n\tinit = {\n\t\t/**\n\t\t * Add a plugin module or function.\n\t\t *\n\t\t * Plugins are run after VisualEditor is loaded, but before it is initialized. This allows\n\t\t * plugins to add classes and register them with the factories and registries.\n\t\t *\n\t\t * The parameter to this function can be a ResourceLoader module name or a function.\n\t\t *\n\t\t * If it's a module name, it will be loaded together with the VisualEditor core modules when\n\t\t * VE is loaded. No special care is taken to ensure that the module runs after the VE\n\t\t * classes are loaded, so if this is desired, the module should depend on\n\t\t * ext.visualEditor.core .\n\t\t *\n\t\t * If it's a function, it will be invoked once the VisualEditor core modules and any\n\t\t * plugin modules registered through this function have been loaded, but before the editor\n\t\t * is intialized. The function can optionally return a jQuery.Promise . VisualEditor will\n\t\t * only be initialized once all promises returned by plugin functions have been resolved.\n\t\t *\n\t\t * // Register ResourceLoader module\n\t\t * mw.libs.ve.addPlugin( 'ext.gadget.foobar' );\n\t\t *\n\t\t * // Register a callback\n\t\t * mw.libs.ve.addPlugin( ( target ) => {\n\t\t * ve.dm.Foobar = .....\n\t\t * } );\n\t\t *\n\t\t * // Register a callback that loads another script\n\t\t * mw.libs.ve.addPlugin( () => $.getScript( 'http://example.com/foobar.js' ) );\n\t\t *\n\t\t * @param {string|Function} plugin Module name or callback that optionally returns a promise\n\t\t */\n\t\taddPlugin: function ( plugin ) {\n\t\t\tplugins.push( plugin );\n\t\t},\n\n\t\t/**\n\t\t * Adjust edit page links in the current document\n\t\t *\n\t\t * This will run multiple times in a page lifecycle, notably when the\n\t\t * page first loads and after post-save content replacement occurs. It\n\t\t * needs to avoid doing anything which will cause problems if it's run\n\t\t * twice or more.\n\t\t */\n\t\tsetupEditLinks: function () {\n\t\t\t// NWE\n\t\t\tif ( init.isWikitextAvailable && !isOnlyTabVE() ) {\n\t\t\t\t$(\n\t\t\t\t\t// Edit section links, except VE ones when both editors visible\n\t\t\t\t\t'.mw-editsection a:not( .mw-editsection-visualeditor ),' +\n\t\t\t\t\t// Edit tab\n\t\t\t\t\t'#ca-edit a,' +\n\t\t\t\t\t// Add section is currently a wikitext-only feature\n\t\t\t\t\t'#ca-addsection a'\n\t\t\t\t).each( ( i, el ) => {\n\t\t\t\t\tif ( !el.href ) {\n\t\t\t\t\t\t// Not a real link, probably added by a gadget or another extension (T328094)\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst linkUrl = new URL( el.href );\n\t\t\t\t\tif ( linkUrl.searchParams.has( 'action' ) ) {\n\t\t\t\t\t\tlinkUrl.searchParams.delete( 'action' );\n\t\t\t\t\t\tlinkUrl.searchParams.set( 'veaction', 'editsource' );\n\t\t\t\t\t\t$( el ).attr( 'href', linkUrl.toString() );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\t// Set up the tabs appropriately if the user has VE on\n\t\t\tif ( init.isAvailable ) {\n\t\t\t\t// … on two-edit-tab wikis, or single-edit-tab wikis, where the user wants both …\n\t\t\t\tif (\n\t\t\t\t\t!init.isSingleEditTab && init.isVisualAvailable &&\n\t\t\t\t\t// T253941: This option does not actually disable the editor, only leaves the tabs/links unchanged\n\t\t\t\t\t!( conf.disableForAnons && mw.user.isAnon() )\n\t\t\t\t) {\n\t\t\t\t\t// … set the skin up with both tabs and both section edit links.\n\t\t\t\t\tinit.setupMultiTabSkin();\n\t\t\t\t} else if (\n\t\t\t\t\tpageCanLoadEditor && (\n\t\t\t\t\t\t( init.isVisualAvailable && isOnlyTabVE() ) ||\n\t\t\t\t\t\t( init.isWikitextAvailable && isOnlyTabWikitext() )\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\t// … on single-edit-tab wikis, where VE or NWE is the user's preferred editor\n\t\t\t\t\t// Handle section edit link clicks\n\t\t\t\t\t$( '.mw-editsection a' ).off( '.ve-target' ).on( 'click.ve-target', ( e ) => {\n\t\t\t\t\t\t// isOnlyTabVE is computed on click as it may have changed since load\n\t\t\t\t\t\tinit.onEditSectionLinkClick( isOnlyTabVE() ? 'visual' : 'source', e );\n\t\t\t\t\t} );\n\t\t\t\t\t// Allow instant switching to edit mode, without refresh\n\t\t\t\t\t$( '#ca-edit' ).off( '.ve-target' ).on( 'click.ve-target', ( e ) => {\n\t\t\t\t\t\tinit.onEditTabClick( isOnlyTabVE() ? 'visual' : 'source', e );\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Setup multiple edit tabs and section links (edit + edit source)\n\t\t */\n\t\tsetupMultiTabSkin: function () {\n\t\t\tinit.setupMultiTabs();\n\t\t\tinit.setupMultiSectionLinks();\n\t\t},\n\n\t\t/**\n\t\t * Setup multiple edit tabs (edit + edit source)\n\t\t */\n\t\tsetupMultiTabs: function () {\n\t\t\t// Minerva puts the '#ca-...' ids on <a> nodes, other skins put them on <li>\n\t\t\tconst $caEdit = $( '#ca-edit' );\n\t\t\tconst $caVeEdit = $( '#ca-ve-edit' );\n\n\t\t\tif ( pageCanLoadEditor ) {\n\t\t\t\t// Allow instant switching to edit mode, without refresh\n\t\t\t\t$caVeEdit.off( '.ve-target' ).on( 'click.ve-target', init.onEditTabClick.bind( init, 'visual' ) );\n\t\t\t}\n\t\t\tif ( pageCanLoadEditor ) {\n\t\t\t\t// Always bind \"Edit source\" tab, because we want to handle switching with changes\n\t\t\t\t$caEdit.off( '.ve-target' ).on( 'click.ve-target', init.onEditTabClick.bind( init, 'source' ) );\n\t\t\t}\n\t\t\tif ( pageCanLoadEditor && init.isWikitextAvailable ) {\n\t\t\t\t// Only bind \"Add topic\" tab if NWE is available, because VE doesn't support section\n\t\t\t\t// so we never have to switch from it when editing a section\n\t\t\t\t$( '#ca-addsection' ).off( '.ve-target' ).on( 'click.ve-target', init.onEditTabClick.bind( init, 'source' ) );\n\t\t\t}\n\n\t\t\tif ( init.isVisualAvailable ) {\n\t\t\t\tif ( conf.tabPosition === 'before' ) {\n\t\t\t\t\t$caEdit.addClass( 'collapsible' );\n\t\t\t\t} else {\n\t\t\t\t\t$caVeEdit.addClass( 'collapsible' );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Setup multiple section links (edit + edit source)\n\t\t */\n\t\tsetupMultiSectionLinks: function () {\n\t\t\tif ( pageCanLoadEditor ) {\n\t\t\t\tconst $editsections = $( '#mw-content-text .mw-editsection' );\n\n\t\t\t\t// Only init without refresh if we're on a view page. Though section edit links\n\t\t\t\t// are rarely shown on non-view pages, they appear in one other case, namely\n\t\t\t\t// when on a diff against the latest version of a page. In that case we mustn't\n\t\t\t\t// init without refresh as that'd initialise for the wrong rev id (T52925)\n\t\t\t\t// and would preserve the wrong DOM with a diff on top.\n\t\t\t\t$editsections.find( '.mw-editsection-visualeditor' )\n\t\t\t\t\t.off( '.ve-target' ).on( 'click.ve-target', init.onEditSectionLinkClick.bind( init, 'visual' ) );\n\t\t\t\tif ( init.isWikitextAvailable ) {\n\t\t\t\t\t// TOOD: Make this less fragile\n\t\t\t\t\t$editsections.find( 'a:not( .mw-editsection-visualeditor )' )\n\t\t\t\t\t\t.off( '.ve-target' ).on( 'click.ve-target', init.onEditSectionLinkClick.bind( init, 'source' ) );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check whether a jQuery event represents a plain left click, without\n\t\t * any modifiers or a programmatically triggered click.\n\t\t *\n\t\t * This is a duplicate of a function in ve.utils, because this file runs\n\t\t * before any of VE core or OOui has been loaded.\n\t\t *\n\t\t * @param {jQuery.Event} e\n\t\t * @return {boolean} Whether it was an unmodified left click\n\t\t */\n\t\tisUnmodifiedLeftClick: function ( e ) {\n\t\t\treturn e && ( (\n\t\t\t\te.which && e.which === 1 && !( e.shiftKey || e.altKey || e.ctrlKey || e.metaKey )\n\t\t\t) || e.isTrigger );\n\t\t},\n\n\t\t/**\n\t\t * Handle click events on an edit tab\n\t\t *\n\t\t * @param {string} mode Edit mode, 'visual' or 'source'\n\t\t * @param {Event} e Event\n\t\t */\n\t\tonEditTabClick: function ( mode, e ) {\n\t\t\tif ( !init.isUnmodifiedLeftClick( e ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( !active && mode === 'source' && !init.isWikitextAvailable ) {\n\t\t\t\t// We're not active so we don't need to manage a switch, and\n\t\t\t\t// we don't have source mode available so we don't need to\n\t\t\t\t// activate VE. Just follow the link.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tif ( isLoading ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst section = $( e.target ).closest( '#ca-addsection' ).length ? 'new' : null;\n\n\t\t\tif ( active ) {\n\t\t\t\ttargetPromise.done( ( target ) => {\n\t\t\t\t\tif ( target.getDefaultMode() === 'source' ) {\n\t\t\t\t\t\tif ( mode === 'visual' ) {\n\t\t\t\t\t\t\ttarget.switchToVisualEditor();\n\t\t\t\t\t\t} else if ( mode === 'source' ) {\n\t\t\t\t\t\t\t// Requested section may have changed --\n\t\t\t\t\t\t\t// switchToWikitextSection will do nothing if the\n\t\t\t\t\t\t\t// section is unchanged.\n\t\t\t\t\t\t\ttarget.switchToWikitextSection( section );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( target.getDefaultMode() === 'visual' ) {\n\t\t\t\t\t\tif ( mode === 'source' ) {\n\t\t\t\t\t\t\tif ( section ) {\n\t\t\t\t\t\t\t\t// switching from visual via the \"add section\" tab\n\t\t\t\t\t\t\t\ttarget.switchToWikitextSection( section );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttarget.editSource();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Visual-to-visual doesn't need to do anything,\n\t\t\t\t\t\t// because we don't have any section concerns. Just\n\t\t\t\t\t\t// no-op it.\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tconst link = $( e.target ).closest( 'a' )[ 0 ];\n\t\t\t\tconst linkUrl = link && link.href ? new URL( link.href ) : null;\n\t\t\t\tif ( section !== null ) {\n\t\t\t\t\tinit.activateVe( mode, linkUrl, section );\n\t\t\t\t} else {\n\t\t\t\t\t// Do not pass `section` to handle switching from section editing in WikiEditor if needed\n\t\t\t\t\tinit.activateVe( mode, linkUrl );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Activate VE\n\t\t *\n\t\t * @param {string} mode Target mode: 'visual' or 'source'\n\t\t * @param {URL} [linkUrl] URL to navigate to, potentially with extra parameters\n\t\t * @param {string} [section]\n\t\t */\n\t\tactivateVe: function ( mode, linkUrl, section ) {\n\t\t\tconst wikitext = $( '#wpTextbox1' ).textSelection( 'getContents' ),\n\t\t\t\tmodified = mw.config.get( 'wgAction' ) === 'submit' ||\n\t\t\t\t\t(\n\t\t\t\t\t\tmw.config.get( 'wgAction' ) === 'edit' &&\n\t\t\t\t\t\twikitext !== initialWikitext\n\t\t\t\t\t);\n\n\t\t\tif ( section === undefined ) {\n\t\t\t\tconst sectionVal = $( 'input[name=wpSection]' ).val();\n\t\t\t\tsection = sectionVal !== '' && sectionVal !== undefined ? sectionVal : null;\n\t\t\t}\n\n\t\t\t// Close any open jQuery.UI dialogs (e.g. WikiEditor's find and replace)\n\t\t\tif ( $.fn.dialog ) {\n\t\t\t\t$( '.ui-dialog-content' ).dialog( 'close' );\n\t\t\t}\n\n\t\t\t// Release the edit warning on #wpTextbox1 which was setup in mediawiki.action.edit.editWarning.js\n\t\t\t$( window ).off( 'beforeunload.editwarning' );\n\t\t\tactivatePageTarget( mode, section, modified, linkUrl );\n\t\t},\n\n\t\t/**\n\t\t * Handle section edit links being clicked\n\t\t *\n\t\t * @param {string} mode Edit mode\n\t\t * @param {jQuery.Event} e Click event\n\t\t * @param {string} [section] Override edit section, taken from link URL if not specified\n\t\t */\n\t\tonEditSectionLinkClick: function ( mode, e, section ) {\n\t\t\tconst link = $( e.target ).closest( 'a' )[ 0 ];\n\t\t\tif ( !link || !link.href ) {\n\t\t\t\t// Not a real link, probably added by a gadget or another extension (T328094)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst linkUrl = new URL( link.href );\n\t\t\tconst title = mw.Title.newFromText( linkUrl.searchParams.get( 'title' ) || '' );\n\n\t\t\tif (\n\t\t\t\t// Modified click (e.g. ctrl+click)\n\t\t\t\t!init.isUnmodifiedLeftClick( e ) ||\n\t\t\t\t// Not an edit action\n\t\t\t\t!( linkUrl.searchParams.has( 'action' ) || linkUrl.searchParams.has( 'veaction' ) ) ||\n\t\t\t\t// Edit target is on another host (e.g. commons file)\n\t\t\t\tlinkUrl.host !== location.host ||\n\t\t\t\t// Title param doesn't match current page\n\t\t\t\ttitle && title.getPrefixedText() !== new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getPrefixedText()\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\tif ( isLoading ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttrackActivateStart( { type: 'section', mechanism: section === 'new' ? 'new' : 'click', mode: mode }, linkUrl );\n\n\t\t\tif ( !active ) {\n\t\t\t\t// Replace the current state with one that is tagged as ours, to prevent the\n\t\t\t\t// back button from breaking when used to exit VE. FIXME: there should be a better\n\t\t\t\t// way to do this. See also similar code in the DesktopArticleTarget constructor.\n\t\t\t\thistory.replaceState( { tag: 'visualeditor' }, '', url );\n\t\t\t\t// Use linkUrl to preserve the 'section' parameter and others like 'editintro' (T56029)\n\t\t\t\thistory.pushState( { tag: 'visualeditor' }, '', linkUrl );\n\t\t\t\t// Update URL instance\n\t\t\t\turl = linkUrl;\n\n\t\t\t\t// Use section from URL\n\t\t\t\tif ( section === undefined ) {\n\t\t\t\t\tsection = parseSection( linkUrl.searchParams.get( 'section' ) );\n\t\t\t\t}\n\t\t\t\tconst tPromise = getTarget( mode, section );\n\t\t\t\tactivateTarget( mode, section, tPromise );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check whether the welcome dialog should be shown.\n\t\t *\n\t\t * The welcome dialog can be disabled in configuration; or by calling disableWelcomeDialog();\n\t\t * or using a query string parameter; or if we've recorded that we've already shown it before\n\t\t * in a user preference, local storage or a cookie.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshouldShowWelcomeDialog: function () {\n\t\t\treturn !(\n\t\t\t\t// Disabled in config?\n\t\t\t\t!mw.config.get( 'wgVisualEditorConfig' ).showBetaWelcome ||\n\t\t\t\t// Disabled for the current request?\n\t\t\t\tthis.isWelcomeDialogSuppressed() ||\n\t\t\t\t// Joining a collab session\n\t\t\t\turl.searchParams.has( 'collabSession' ) ||\n\t\t\t\t// Hidden using preferences, local storage or cookie?\n\t\t\t\tcheckPreferenceOrStorage( 'visualeditor-hidebetawelcome', 've-beta-welcome-dialog' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Check whether the welcome dialog is temporarily disabled.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisWelcomeDialogSuppressed: function () {\n\t\t\treturn !!(\n\t\t\t\t// Disabled by calling disableWelcomeDialog()?\n\t\t\t\twelcomeDialogDisabled ||\n\t\t\t\t// Hidden using URL parameter?\n\t\t\t\tnew URL( location.href ).searchParams.has( 'vehidebetadialog' ) ||\n\t\t\t\t// Check for deprecated hidewelcomedialog parameter (T249954)\n\t\t\t\tnew URL( location.href ).searchParams.has( 'hidewelcomedialog' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Record that we've already shown the welcome dialog to this user, so that it won't be shown\n\t\t * to them again.\n\t\t *\n\t\t * Uses a preference for logged-in users; uses local storage or a cookie for anonymous users.\n\t\t */\n\t\tstopShowingWelcomeDialog: function () {\n\t\t\tsetPreferenceOrStorage( 'visualeditor-hidebetawelcome', 've-beta-welcome-dialog' );\n\t\t},\n\n\t\t/**\n\t\t * Prevent the welcome dialog from being shown on this page view only.\n\t\t *\n\t\t * Causes shouldShowWelcomeDialog() to return false, but doesn't save anything to preferences\n\t\t * or local storage, so future page views are not affected.\n\t\t */\n\t\tdisableWelcomeDialog: function () {\n\t\t\twelcomeDialogDisabled = true;\n\t\t},\n\n\t\t/**\n\t\t * Check whether the user education popups (ve.ui.MWEducationPopupWidget) should be shown.\n\t\t *\n\t\t * The education popups can be disabled by calling disableWelcomeDialog(), or if we've\n\t\t * recorded that we've already shown it before in a user preference, local storage or a cookie.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshouldShowEducationPopups: function () {\n\t\t\treturn !(\n\t\t\t\t// Disabled by calling disableEducationPopups()?\n\t\t\t\teducationPopupsDisabled ||\n\t\t\t\t// Hidden using preferences, local storage, or cookie?\n\t\t\t\tcheckPreferenceOrStorage( 'visualeditor-hideusered', 've-hideusered' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Record that we've already shown the education popups to this user, so that it won't be\n\t\t * shown to them again.\n\t\t *\n\t\t * Uses a preference for logged-in users; uses local storage or a cookie for anonymous users.\n\t\t */\n\t\tstopShowingEducationPopups: function () {\n\t\t\tsetPreferenceOrStorage( 'visualeditor-hideusered', 've-hideusered' );\n\t\t},\n\n\t\t/**\n\t\t * Prevent the education popups from being shown on this page view only.\n\t\t *\n\t\t * Causes shouldShowEducationPopups() to return false, but doesn't save anything to\n\t\t * preferences or local storage, so future page views are not affected.\n\t\t */\n\t\tdisableEducationPopups: function () {\n\t\t\teducationPopupsDisabled = true;\n\t\t}\n\t};\n\n\tinit.isSingleEditTab = conf.singleEditTab && tabPreference !== 'multi-tab';\n\n\t// On a view page, extend the current URL so extra parameters are carried over\n\t// On a non-view page, use viewUrl\n\tveEditUrl = new URL( pageCanLoadEditor ? url : viewUrl );\n\tif ( oldId ) {\n\t\tveEditUrl.searchParams.set( 'oldid', oldId );\n\t}\n\tveEditUrl.searchParams.delete( 'veaction' );\n\tveEditUrl.searchParams.delete( 'action' );\n\tif ( init.isSingleEditTab ) {\n\t\tveEditUrl.searchParams.set( 'action', 'edit' );\n\t\tveEditSourceUrl = veEditUrl;\n\t} else {\n\t\tveEditSourceUrl = new URL( veEditUrl );\n\t\tveEditUrl.searchParams.set( 'veaction', 'edit' );\n\t\tveEditSourceUrl.searchParams.set( 'veaction', 'editsource' );\n\t}\n\n\t// Whether VisualEditor should be available for the current user, page, wiki, mediawiki skin,\n\t// browser etc.\n\tinit.isAvailable = VisualEditorSupportCheck();\n\t// Extensions can disable VE in certain circumstances using the VisualEditorBeforeEditor hook (T174180)\n\n\tconst enabledForUser = (\n\t\t// User has 'visualeditor-enable' preference enabled (for alpha opt-in)\n\t\t// User has 'visualeditor-betatempdisable' preference disabled\n\t\t// User has 'visualeditor-autodisable' preference disabled\n\t\t( conf.isBeta ? enable : !tempdisable ) && !autodisable\n\t);\n\n\t// Duplicated in VisualEditor.hooks.php#isVisualAvailable()\n\tinit.isVisualAvailable = (\n\t\tinit.isAvailable &&\n\n\t\t// If forced by the URL parameter, skip the namespace check (T221892) and preference check\n\t\t( url.searchParams.get( 'veaction' ) === 'edit' || (\n\t\t\t// Only in enabled namespaces\n\t\t\tconf.namespaces.includes( new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getNamespaceId() ) &&\n\n\t\t\t// Enabled per user preferences\n\t\t\tenabledForUser\n\t\t) ) &&\n\n\t\t// Only for pages with a supported content model\n\t\tObject.prototype.hasOwnProperty.call( conf.contentModels, mw.config.get( 'wgPageContentModel' ) )\n\t);\n\n\t// Duplicated in VisualEditor.hooks.php#isWikitextAvailable()\n\tinit.isWikitextAvailable = (\n\t\tinit.isAvailable &&\n\n\t\t// If forced by the URL parameter, skip the checks (T239796)\n\t\t( url.searchParams.get( 'veaction' ) === 'editsource' || (\n\t\t\t// Enabled on site\n\t\t\tconf.enableWikitext &&\n\n\t\t\t// User preference\n\t\t\tmw.user.options.get( 'visualeditor-newwikitext' )\n\t\t) ) &&\n\n\t\t// Only on wikitext pages\n\t\tmw.config.get( 'wgPageContentModel' ) === 'wikitext'\n\t);\n\n\tif ( init.isVisualAvailable ) {\n\t\tavailableModes.push( 'visual' );\n\t}\n\n\tif ( init.isWikitextAvailable ) {\n\t\tavailableModes.push( 'source' );\n\t}\n\n\t// FIXME: We should do this more elegantly\n\tinit.setEditorPreference = setEditorPreference;\n\n\tinit.updateTabs = updateTabs;\n\n\t// Note: Though VisualEditor itself only needed this exposure for a very small reason\n\t// (namely to access the old init.unsupportedList from the unit tests...) this has become one\n\t// of the nicest ways to easily detect whether the VisualEditor initialisation code is present.\n\t//\n\t// The VE global was once available always, but now that platform integration initialisation\n\t// is properly separated, it doesn't exist until the platform loads VisualEditor core.\n\t//\n\t// Most of mw.libs.ve is considered subject to change and private. An exception is that\n\t// mw.libs.ve.isVisualAvailable is public, and indicates whether the VE editor itself can be loaded\n\t// on this page. See above for why it may be false.\n\tmw.libs.ve = $.extend( mw.libs.ve || {}, init );\n\n\tif ( init.isVisualAvailable ) {\n\t\t$( 'html' ).addClass( 've-available' );\n\t} else {\n\t\t$( 'html' ).addClass( 've-not-available' );\n\t\t// Don't return here because we do want the skin setup to consistently happen\n\t\t// for e.g. \"Edit\" > \"Edit source\" even when VE is not available.\n\t}\n\n\t/**\n\t * Check if a URL doesn't contain any params which would prevent VE from loading, e.g. 'undo'\n\t *\n\t * @param {URL} editUrl\n\t * @return {boolean} URL contains no unsupported params\n\t */\n\tfunction isSupportedEditPage( editUrl ) {\n\t\treturn configData.unsupportedEditParams.every( ( param ) => !editUrl.searchParams.has( param ) );\n\t}\n\n\t/**\n\t * Get the edit mode for the given URL\n\t *\n\t * @param {URL} editUrl Edit URL\n\t * @return {string|null} 'visual' or 'source', null if the editor is not being loaded\n\t */\n\tfunction getEditModeFromUrl( editUrl ) {\n\t\tif ( mw.config.get( 'wgDiscussionToolsStartNewTopicTool' ) ) {\n\t\t\t// Avoid conflicts with DiscussionTools\n\t\t\treturn null;\n\t\t}\n\t\tif ( isViewPage && init.isAvailable ) {\n\t\t\t// On view pages if veaction is correctly set\n\t\t\tconst mode = veactionToMode[ editUrl.searchParams.get( 'veaction' ) ] ||\n\t\t\t\t// Always load VE visual mode if collabSession is set\n\t\t\t\t( editUrl.searchParams.has( 'collabSession' ) ? 'visual' : null );\n\t\t\tif ( mode && availableModes.includes( mode ) ) {\n\t\t\t\treturn mode;\n\t\t\t}\n\t\t}\n\t\t// Edit pages\n\t\tif ( isEditPage && isSupportedEditPage( editUrl ) ) {\n\t\t\t// User has disabled VE, or we are in view source only mode, or we have landed here with posted data\n\t\t\tif ( !enabledForUser || $( '#ca-viewsource' ).length || mw.config.get( 'wgAction' ) === 'submit' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn getAvailableEditPageEditor();\n\t\t}\n\t\treturn null;\n\t}\n\n\t$( () => {\n\t\t$targetContainer = $(\n\t\t\tdocument.querySelector( '[data-mw-ve-target-container]' ) ||\n\t\t\tdocument.getElementById( 'content' )\n\t\t);\n\t\tif ( pageCanLoadEditor ) {\n\t\t\t$targetContainer.addClass( 've-init-mw-desktopArticleTarget-targetContainer' );\n\t\t}\n\n\t\tlet showWikitextWelcome = true;\n\t\tconst numEditButtons = $( '#ca-edit, #ca-ve-edit' ).length,\n\t\t\tsection = parseSection( url.searchParams.get( 'section' ) );\n\n\t\tconst requiredSkinElements =\n\t\t\t$targetContainer.length &&\n\t\t\t$( '#mw-content-text' ).length &&\n\t\t\t// A link to open the editor is technically not necessary if it's going to open itself\n\t\t\t( isEditPage || numEditButtons );\n\n\t\tif ( url.searchParams.get( 'action' ) === 'edit' && $( '#wpTextbox1' ).length ) {\n\t\t\tinitialWikitext = $( '#wpTextbox1' ).textSelection( 'getContents' );\n\t\t}\n\n\t\tif ( ( init.isVisualAvailable || init.isWikitextAvailable ) &&\n\t\t\tpageCanLoadEditor &&\n\t\t\tpageIsProbablyEditable &&\n\t\t\t!requiredSkinElements\n\t\t) {\n\t\t\tmw.log.warn(\n\t\t\t\t'Your skin is incompatible with VisualEditor. ' +\n\t\t\t\t'See https://www.mediawiki.org/wiki/Extension:VisualEditor/Skin_requirements for the requirements.'\n\t\t\t);\n\t\t\t// If the edit buttons are not there it's likely a browser extension or gadget for anonymous user\n\t\t\t// has removed them. We're not interested in errors from this scenario so don't log.\n\t\t\t// If they exist log the error so we can address the problem.\n\t\t\tif ( numEditButtons > 0 ) {\n\t\t\t\tconst err = new Error( 'Incompatible with VisualEditor' );\n\t\t\t\terr.name = 'VeIncompatibleSkinWarning';\n\t\t\t\tmw.errorLogger.logError( err, 'error.visualeditor' );\n\t\t\t}\n\t\t} else if ( init.isAvailable ) {\n\t\t\tconst mode = getEditModeFromUrl( url );\n\t\t\tif ( mode ) {\n\t\t\t\tshowWikitextWelcome = false;\n\t\t\t\ttrackActivateStart( {\n\t\t\t\t\ttype: section === null ? 'page' : 'section',\n\t\t\t\t\tmechanism: ( section === 'new' || !mw.config.get( 'wgArticleId' ) ) ? 'url-new' : 'url',\n\t\t\t\t\tmode: mode\n\t\t\t\t} );\n\t\t\t\tactivateTarget( mode, section );\n\t\t\t} else if (\n\t\t\t\tinit.isVisualAvailable &&\n\t\t\t\tpageCanLoadEditor &&\n\t\t\t\tinit.isSingleEditTab\n\t\t\t) {\n\t\t\t\t// In single edit tab mode we never have an edit tab\n\t\t\t\t// with accesskey 'v' so create one\n\t\t\t\t$( document.body ).append(\n\t\t\t\t\t$( '<a>' )\n\t\t\t\t\t\t.attr( { accesskey: mw.msg( 'accesskey-ca-ve-edit' ), href: veEditUrl } )\n\t\t\t\t\t\t// Accesskey fires a click event\n\t\t\t\t\t\t.on( 'click.ve-target', init.onEditTabClick.bind( init, 'visual' ) )\n\t\t\t\t\t\t.addClass( 'oo-ui-element-hidden' )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Add the switch button to WikiEditor on edit pages\n\t\t\tif (\n\t\t\t\tinit.isVisualAvailable &&\n\t\t\t\tisEditPage &&\n\t\t\t\t$( '#wpTextbox1' ).length\n\t\t\t) {\n\t\t\t\tmw.loader.load( 'ext.visualEditor.switching' );\n\t\t\t\tmw.hook( 'wikiEditor.toolbarReady' ).add( ( $textarea ) => {\n\t\t\t\t\tmw.loader.using( 'ext.visualEditor.switching' ).done( () => {\n\t\t\t\t\t\tconst showPopup = url.searchParams.has( 'veswitched' ) && !mw.user.options.get( 'visualeditor-hidesourceswitchpopup' ),\n\t\t\t\t\t\t\ttoolFactory = new OO.ui.ToolFactory(),\n\t\t\t\t\t\t\ttoolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\t\t\t\t\ttoolFactory.register( mw.libs.ve.MWEditModeVisualTool );\n\t\t\t\t\t\ttoolFactory.register( mw.libs.ve.MWEditModeSourceTool );\n\t\t\t\t\t\tconst switchToolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\t\t\t\t\tclasses: [ 've-init-mw-editSwitch' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tswitchToolbar.on( 'switchEditor', ( m ) => {\n\t\t\t\t\t\t\tif ( m === 'visual' ) {\n\t\t\t\t\t\t\t\t$( '#wpTextbox1' ).trigger( 'wikiEditor-switching-visualeditor' );\n\t\t\t\t\t\t\t\tinit.activateVe( 'visual' );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tswitchToolbar.setup( [ {\n\t\t\t\t\t\t\tname: 'editMode',\n\t\t\t\t\t\t\ttype: 'list',\n\t\t\t\t\t\t\ticon: 'edit',\n\t\t\t\t\t\t\ttitle: mw.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\t\t\t\t\t\tlabel: mw.msg( 'visualeditor-mweditmode-tooltip' ),\n\t\t\t\t\t\t\tinvisibleLabel: true,\n\t\t\t\t\t\t\tinclude: [ 'editModeVisual', 'editModeSource' ]\n\t\t\t\t\t\t} ] );\n\n\t\t\t\t\t\tconst popup = new mw.libs.ve.SwitchPopupWidget( 'source' );\n\n\t\t\t\t\t\tswitchToolbar.tools.editModeVisual.toolGroup.$element.append( popup.$element );\n\t\t\t\t\t\tswitchToolbar.emit( 'updateState' );\n\n\t\t\t\t\t\t$textarea.wikiEditor( 'addToToolbar', {\n\t\t\t\t\t\t\tsection: 'secondary',\n\t\t\t\t\t\t\tgroup: 'default',\n\t\t\t\t\t\t\ttools: {\n\t\t\t\t\t\t\t\tveEditSwitch: {\n\t\t\t\t\t\t\t\t\ttype: 'element',\n\t\t\t\t\t\t\t\t\telement: switchToolbar.$element\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tpopup.toggle( showPopup );\n\n\t\t\t\t\t\t// Duplicate of this code in ve.init.mw.DesktopArticleTarget.js\n\t\t\t\t\t\t// eslint-disable-next-line no-jquery/no-class-state\n\t\t\t\t\t\tif ( $( '#ca-edit' ).hasClass( 'visualeditor-showtabdialog' ) ) {\n\t\t\t\t\t\t\t$( '#ca-edit' ).removeClass( 'visualeditor-showtabdialog' );\n\t\t\t\t\t\t\t// Set up a temporary window manager\n\t\t\t\t\t\t\tconst windowManager = new OO.ui.WindowManager();\n\t\t\t\t\t\t\t$( OO.ui.getTeleportTarget() ).append( windowManager.$element );\n\t\t\t\t\t\t\tconst editingTabDialog = new mw.libs.ve.EditingTabDialog();\n\t\t\t\t\t\t\twindowManager.addWindows( [ editingTabDialog ] );\n\t\t\t\t\t\t\twindowManager.openWindow( editingTabDialog )\n\t\t\t\t\t\t\t\t.closed.then( ( data ) => {\n\t\t\t\t\t\t\t\t\t// Detach the temporary window manager\n\t\t\t\t\t\t\t\t\twindowManager.destroy();\n\n\t\t\t\t\t\t\t\t\tif ( data && data.action === 'prefer-ve' ) {\n\t\t\t\t\t\t\t\t\t\tlocation.href = veEditUrl;\n\t\t\t\t\t\t\t\t\t} else if ( data && data.action === 'multi-tab' ) {\n\t\t\t\t\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\t\t// Remember that the user wanted wikitext, at least this time\n\t\t\t\tmw.libs.ve.setEditorPreference( 'wikitext' );\n\n\t\t\t\t// If the user has loaded WikiEditor, clear any auto-save state they\n\t\t\t\t// may have from a previous VE session\n\t\t\t\t// We don't have access to the VE session storage methods, but invalidating\n\t\t\t\t// the docstate is sufficient to prevent the data from being used.\n\t\t\t\tmw.storage.session.remove( 've-docstate' );\n\t\t\t}\n\n\t\t\tinit.setupEditLinks();\n\t\t}\n\n\t\tif (\n\t\t\tpageCanLoadEditor &&\n\t\t\tshowWikitextWelcome &&\n\t\t\t// At least one editor is available (T201928)\n\t\t\t( init.isVisualAvailable || init.isWikitextAvailable || $( '#wpTextbox1' ).length ) &&\n\t\t\tisEditPage &&\n\t\t\tinit.shouldShowWelcomeDialog() &&\n\t\t\t// Not on protected pages\n\t\t\tpageIsProbablyEditable\n\t\t) {\n\t\t\tmw.loader.using( 'ext.visualEditor.welcome' ).done( () => {\n\t\t\t\t// Check shouldShowWelcomeDialog() again: any code that might have called\n\t\t\t\t// stopShowingWelcomeDialog() wouldn't have had an opportunity to do that\n\t\t\t\t// yet by the first time we checked\n\t\t\t\tif ( !init.shouldShowWelcomeDialog() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst windowManager = new OO.ui.WindowManager();\n\t\t\t\tconst welcomeDialog = new mw.libs.ve.WelcomeDialog();\n\t\t\t\t$( OO.ui.getTeleportTarget() ).append( windowManager.$element );\n\t\t\t\twindowManager.addWindows( [ welcomeDialog ] );\n\t\t\t\twindowManager.openWindow(\n\t\t\t\t\twelcomeDialog,\n\t\t\t\t\t{\n\t\t\t\t\t\tswitchable: init.isVisualAvailable,\n\t\t\t\t\t\teditor: 'source'\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\t\t.closed.then( ( data ) => {\n\t\t\t\t\t\twindowManager.destroy();\n\t\t\t\t\t\tif ( data && data.action === 'switch-ve' ) {\n\t\t\t\t\t\t\tinit.activateVe( 'visual' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\tinit.stopShowingWelcomeDialog();\n\t\t\t} );\n\t\t}\n\n\t\tif ( url.searchParams.has( 'venotify' ) ) {\n\t\t\turl.searchParams.delete( 'venotify' );\n\t\t\t// Get rid of the ?venotify= from the URL\n\t\t\thistory.replaceState( null, '', url );\n\t\t}\n\t} );\n}() );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.mw.DiffLoader.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/modules/ve-mw/preinit/ve.init.mw.DiffPage.init.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":53,"column":3,"nodeType":"CallExpression","endLine":53,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-undef","severity":2,"message":"'ve' is not defined.","line":77,"column":29,"nodeType":"Identifier","messageId":"undef","endLine":77,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":126,"column":34,"nodeType":"CallExpression","endLine":126,"endColumn":72,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":144,"column":3,"nodeType":"CallExpression","endLine":144,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/preinit/ve.init.mw.ProgressBarWidget.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/modules/ve-mw/preinit/ve.init.mw.TempWikitextEditorWidget.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/modules/ve-mw/preinit/ve.utils.parsoid.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/modules/ve-mw/tests/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"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/modules/ve-mw/tests/ce/ve.ce.ContentBranchNode.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ce/ve.ce.Document.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ce/ve.ce.Surface.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/annotations/ve.dm.MWInternalLinkAnnotation.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/models/ve.dm.MWImageModel.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/models/ve.dm.MWTemplateModel.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/models/ve.dm.MWTemplateSpecModel.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/models/ve.dm.MWTransclusionContentModel.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/models/ve.dm.MWTransclusionModel.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/nodes/ve.dm.MWTransclusionNode.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/ve.dm.Converter.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/ve.dm.Document.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/ve.dm.SurfaceFragment.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/dm/ve.dm.mwExample.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":"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/modules/ve-mw/tests/init/targets/ve.init.mw.DesktopArticleTarget.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":108,"column":2,"nodeType":"CallExpression","endLine":108,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/preinit/ve.utils.parsoid.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-script-url","severity":2,"message":"Script URL is a form of eval.","line":227,"column":10,"nodeType":"Literal","messageId":"unexpectedScriptURL","endLine":227,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-script-url","severity":2,"message":"Script URL is a form of eval.","line":229,"column":12,"nodeType":"Literal","messageId":"unexpectedScriptURL","endLine":229,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/actions/ve.ui.FormatAction.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/actions/ve.ui.MWLinkAction.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":51,"column":2,"nodeType":"CallExpression","endLine":67,"endColumn":5}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWWikitextStringTransferHandler tests.\n *\n * @copyright See AUTHORS.txt\n */\n\nQUnit.module( 've.ui.MWWikitextStringTransferHandler', ve.test.utils.newMwEnvironment( {\n\tbeforeEach() {\n\t\t// Mock XHR for mw.Api()\n\t\tthis.server = this.sandbox.useFakeServer();\n\t\t// Random number, chosen by a fair dice roll.\n\t\t// Used to make #mwt ID deterministic\n\t\tthis.randomStub = sinon.stub( Math, 'random' ).returns( 0.04 );\n\t},\n\tafterEach() {\n\t\tthis.randomStub.restore();\n\t}\n} ) );\n\nve.test.utils.runWikitextStringHandlerTest = ( assert, server, string, mimeType, expectedResponse, expectedData, annotations, assertDom, base, msg ) => {\n\tconst done = assert.async(),\n\t\titem = ve.ui.DataTransferItem.static.newFromString( string, mimeType ),\n\t\tdoc = ve.dm.Document.static.newBlankDocument(),\n\t\tmockSurface = {\n\t\t\tgetModel: () => ( {\n\t\t\t\t\tgetDocument: () => doc\n\t\t\t\t} ),\n\t\t\tcreateProgress: () => ve.createDeferred().promise()\n\t\t};\n\n\tve.fixBase( doc.getHtmlDocument(), doc.getHtmlDocument(), base );\n\n\t// Preprocess the expectedData array\n\tfor ( let i = 0; i < expectedData.length; i++ ) {\n\t\tif ( Array.isArray( expectedData[ i ] ) ) {\n\t\t\tfor ( let j = 0; j < expectedData[ i ][ 1 ].length; j++ ) {\n\t\t\t\tif ( typeof expectedData[ i ][ 1 ][ j ] === 'number' ) {\n\t\t\t\t\texpectedData[ i ][ 1 ][ j ] = annotations[ expectedData[ i ][ 1 ][ j ] ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check we match the wikitext string handler\n\tconst name = ve.ui.dataTransferHandlerFactory.getHandlerNameForItem( item );\n\tassert.strictEqual( name, 'wikitextString', msg + ': triggers match function' );\n\n\t// Invoke the handler\n\tconst handler = ve.ui.dataTransferHandlerFactory.create( 'wikitextString', mockSurface, item );\n\n\thandler.getInsertableData().done( ( docOrData ) => {\n\t\tlet actualData, store;\n\t\tif ( docOrData instanceof ve.dm.Document ) {\n\t\t\tactualData = docOrData.getData();\n\t\t\tstore = docOrData.getStore();\n\t\t} else {\n\t\t\tactualData = docOrData;\n\t\t\tstore = new ve.dm.HashValueStore();\n\t\t}\n\t\tve.dm.example.postprocessAnnotations( actualData, store );\n\t\tif ( assertDom ) {\n\t\t\tassert.equalLinearDataWithDom( store, actualData, expectedData, msg + ': data match (with DOM)' );\n\t\t} else {\n\t\t\tassert.equalLinearData( actualData, expectedData, msg + ': data match' );\n\t\t}\n\t\tdone();\n\t} );\n\n\tif ( server && expectedResponse ) {\n\t\tserver.respond( [ 200, { 'Content-Type': 'application/json' }, JSON.stringify( {\n\t\t\tvisualeditor: {\n\t\t\t\tresult: 'success',\n\t\t\t\tcontent: expectedResponse\n\t\t\t}\n\t\t} ) ] );\n\t}\n};\n\nQUnit.test.each( 'convert', [\n\t{\n\t\tmsg: 'Simple link',\n\t\t// Put link in the middle of text to verify that the\n\t\t// start-of-line and end-of-line anchors on the heading\n\t\t// identification pattern don't affect link identification\n\t\tpasteString: 'some [[Foo]] text',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<p>some <a rel=\"mw:WikiLink\" href=\"./Foo\" title=\"Foo\">Foo</a> text</p>',\n\t\tannotations: [ {\n\t\t\ttype: 'link/mwInternal',\n\t\t\tattributes: {\n\t\t\t\tlookupTitle: 'Foo',\n\t\t\t\tnormalizedTitle: 'Foo',\n\t\t\t\ttitle: 'Foo'\n\t\t\t}\n\t\t} ],\n\t\texpectedData: [\n\t\t\t{ type: 'paragraph' },\n\t\t\t...'some ',\n\t\t\t[ 'F', [ 0 ] ],\n\t\t\t[ 'o', [ 0 ] ],\n\t\t\t[ 'o', [ 0 ] ],\n\t\t\t...' text',\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Simple link with no p-wrapping',\n\t\tpasteString: '*[[Foo]]',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<ul><li><a rel=\"mw:WikiLink\" href=\"./Foo\" title=\"Foo\">Foo</a></li></ul>',\n\t\tannotations: [ {\n\t\t\ttype: 'link/mwInternal',\n\t\t\tattributes: {\n\t\t\t\tlookupTitle: 'Foo',\n\t\t\t\tnormalizedTitle: 'Foo',\n\t\t\t\ttitle: 'Foo'\n\t\t\t}\n\t\t} ],\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'list',\n\t\t\t\tattributes: { style: 'bullet' }\n\t\t\t},\n\t\t\t{ type: 'listItem' },\n\t\t\t{\n\t\t\t\ttype: 'paragraph',\n\t\t\t\tinternal: { generated: 'wrapper' }\n\t\t\t},\n\t\t\t[ 'F', [ 0 ] ],\n\t\t\t[ 'o', [ 0 ] ],\n\t\t\t[ 'o', [ 0 ] ],\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: '/listItem' },\n\t\t\t{ type: '/list' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Simple template',\n\t\tpasteString: '{{Template}}',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<div typeof=\"mw:Transclusion\" about=\"#mwt1\">Template</div>',\n\t\tassertDom: true,\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'mwTransclusionBlock',\n\t\t\t\tattributes: {\n\t\t\t\t\tmw: {}\n\t\t\t\t},\n\t\t\t\toriginalDomElements: $.parseHTML( '<div typeof=\"mw:Transclusion\" about=\"#mwt40000000\">Template</div>' )\n\t\t\t},\n\t\t\t{ type: '/mwTransclusionBlock' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Headings, only RESTBase IDs stripped',\n\t\tpasteString: '==heading==',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<h2 id=\"mwAB\">foo</h2><h2 id=\"mw-meaningful-id\">bar</h2>',\n\t\tannotations: [],\n\t\tassertDom: true,\n\t\texpectedData: [\n\t\t\t{ type: 'mwHeading', attributes: { level: 2 }, originalDomElements: $.parseHTML( '<h2>foo</h2>' ) },\n\t\t\t...'foo',\n\t\t\t{ type: '/mwHeading' },\n\t\t\t{ type: 'mwHeading', attributes: { level: 2 }, originalDomElements: $.parseHTML( '<h2 id=\"mw-meaningful-id\">bar</h2>' ) },\n\t\t\t...'bar',\n\t\t\t{ type: '/mwHeading' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Headings, parsoid fallback ids don\\'t interfere with whitespace stripping',\n\t\tpasteString: '== Tudnivalók ==',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: '<h2 id=\"Tudnivalók\"><span id=\"Tudnival.C3.B3k\" typeof=\"mw:FallbackId\"></span> Tudnivalók </h2>',\n\t\tannotations: [],\n\t\tassertDom: true,\n\t\texpectedData: [\n\t\t\t{ type: 'mwHeading', attributes: { level: 2 }, originalDomElements: $.parseHTML( '<h2 id=\"Tudnivalók\"> Tudnivalók </h2>' ) },\n\t\t\t...'Tudnivalók',\n\t\t\t{ type: '/mwHeading' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Magic link (RFC)',\n\t\tpasteString: 'RFC 1234',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: false,\n\t\tannotations: [],\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\tattributes: {\n\t\t\t\t\tcontent: 'RFC 1234'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: '/link/mwMagic'\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Magic link (PMID)',\n\t\tpasteString: 'PMID 1234',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: false,\n\t\tannotations: [],\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\tattributes: {\n\t\t\t\t\tcontent: 'PMID 1234'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: '/link/mwMagic'\n\t\t\t}\n\t\t]\n\t},\n\t{\n\t\tmsg: 'Magic link (ISBN)',\n\t\tpasteString: 'ISBN 123456789X',\n\t\tpasteType: 'text/plain',\n\t\tparsoidResponse: false,\n\t\tannotations: [],\n\t\texpectedData: [\n\t\t\t{\n\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\tattributes: {\n\t\t\t\t\tcontent: 'ISBN 123456789X'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: '/link/mwMagic'\n\t\t\t}\n\t\t]\n\t}\n], function ( assert, caseItem ) {\n\tmw.config.set( {\n\t\twgArticlePath: '/wiki/$1'\n\t} );\n\n\tve.test.utils.runWikitextStringHandlerTest(\n\t\tassert, this.server, caseItem.pasteString, caseItem.pasteType, caseItem.parsoidResponse,\n\t\tcaseItem.expectedData, caseItem.annotations, caseItem.assertDom, ve.dm.mwExample.baseUri,\n\t\tcaseItem.msg\n\t);\n} );\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.UrlStringTransferHandler.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/dialogs/ve.ui.MWTransclusionDialog.test.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":42,"column":3,"nodeType":"CallExpression","endLine":91,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":42,"column":3,"nodeType":"CallExpression","endLine":94,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":82,"column":4,"nodeType":"CallExpression","endLine":89,"endColumn":7}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor Template Dialog and Transclusion Dialog tests\n *\n * @copyright See AUTHORS.txt\n */\n\n{\n\tQUnit.module( 've.ui.MWTransclusionDialog', ve.test.utils.newMwEnvironment( {\n\t\tconfig: {\n\t\t\t// Set config variable to activate new sidebar feature\n\t\t\t// TODO: remove this when sidebar feature will be default\n\t\t\twgVisualEditorConfig: ve.extendObject( {}, mw.config.get( 'wgVisualEditorConfig' ), {\n\t\t\t\ttransclusionDialogNewSidebar: true\n\t\t\t} )\n\t\t}\n\t} ) );\n\n\tconst createFragmentFromDoc = function ( doc ) {\n\t\t// convert doc to something ui magical\n\t\tconst surface = new ve.dm.Surface( doc );\n\t\t// VE block from surface\n\t\tconst fragment = surface.getLinearFragment( new ve.Range( 1 ) );\n\n\t\t// return fragment as data for the dialog\n\t\treturn { fragment: fragment };\n\t};\n\n\tQUnit.test.skip( 'onReplacePart', ( assert ) => {\n\t\t// don't kill test until this promise is resolved, to allow the async workflow to complete\n\t\tconst finishTest = assert.async();\n\n\t\t// new wiki page and fragment\n\t\tconst doc = ve.dm.Document.static.newBlankDocument();\n\t\tconst fragment = createFragmentFromDoc( doc );\n\n\t\t// new popup window\n\t\tconst dialog = new ve.ui.MWTransclusionDialog();\n\t\tconst windowManager = new OO.ui.WindowManager();\n\t\twindowManager.addWindows( [ dialog ] );\n\t\tconst windowInstance = windowManager.openWindow( dialog, fragment );\n\n\t\twindowInstance.opened.done( () => {\n\t\t\tconst transclusion = dialog.transclusionModel;\n\t\t\t// mock api call with template data for Test\n\t\t\tconst templateData = {\n\t\t\t\ttitle: 'Template:Test',\n\t\t\t\tparams: {\n\t\t\t\t\tBlub: {\n\t\t\t\t\t\tlabel: 'Blub',\n\t\t\t\t\t\tdescription: 'blub',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\trequired: true\n\t\t\t\t\t},\n\t\t\t\t\tFoo: {\n\t\t\t\t\t\tlabel: 'Foo',\n\t\t\t\t\t\tdescription: 'Foo',\n\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\trequired: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\ttransclusion.cacheTemplateDataApiResponse( { pages: [ templateData ] } );\n\n\t\t\t// add a template with an undocumented parameter to the dialog\n\t\t\tconst data = {\n\t\t\t\ttarget: {\n\t\t\t\t\ttitle: 'Template:Test',\n\t\t\t\t\twt: 'Test',\n\t\t\t\t\thref: 'Template:Test'\n\t\t\t\t},\n\t\t\t\tparams: {\n\t\t\t\t\ttest: {\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ti: 0\n\t\t\t};\n\t\t\tconst template = ve.dm.MWTemplateModel.newFromData( transclusion, data );\n\n\t\t\t// change transclusion model (onReplacePart happens automatically)\n\t\t\tconst promise = transclusion.addPart( template );\n\n\t\t\tpromise.done( () => {\n\t\t\t\t// checking for parameter checkboxes\n\t\t\t\t// (should be 3 because of 2 predefined and 1 undocumented)\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tdialog.$element.find( '.ve-ui-mwTransclusionOutlineParameterWidget' ).length, 3\n\t\t\t\t);\n\t\t\t\tdialog.close();\n\t\t\t} );\n\n\t\t} ).fail( () => {\n\t\t\tassert.true( false );\n\t\t\tfinishTest();\n\t\t} );\n\n\t\twindowInstance.closed.then( () => {\n\t\t\tassert.true( true );\n\t\t\tfinishTest();\n\t\t} );\n\t} );\n}\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/inspectors/ve.ui.FragmentInspector.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/pages/ve.ui.MWAddParameterPage.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/pages/ve.ui.MWParameterPage.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/ve.ui.DiffElement.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWParameterCheckboxInputWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTemplateTitleInputWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":7,"column":15,"nodeType":"CallExpression","endLine":7,"endColumn":84,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlinePlaceholderWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ui/widgets/ve.ui.MWTransclusionOutlineWidget.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":7,"column":15,"nodeType":"CallExpression","endLine":7,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'part_0' is not in camel case.","line":80,"column":22,"nodeType":"Identifier","messageId":"notCamelCase","endLine":80,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/tests/ve.test.utils.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":2,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":41,"column":4,"nodeType":"CallExpression","endLine":41,"endColumn":85,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":88,"column":4,"nodeType":"CallExpression","endLine":88,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"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/modules/ve-mw/ui/actions/ve.ui.MWLinkAction.js","messages":[],"suppressedMessages":[{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\[.","line":86,"column":11,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":86,"endColumn":12,"suggestions":[{"messageId":"removeEscape","fix":{"range":[2562,2563],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[2562,2562],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\[.","line":87,"column":11,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":87,"endColumn":12,"suggestions":[{"messageId":"removeEscape","fix":{"range":[2597,2598],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[2597,2597],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/actions/ve.ui.MWSaveDialogAction.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/modules/ve-mw/ui/actions/ve.ui.MWWikitextAction.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/modules/ve-mw/ui/commands/ve.ui.MWWikitextWarningCommand.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":37,"column":19,"nodeType":"CallExpression","endLine":37,"endColumn":108,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWAlienExtensionContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWAnnotationContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":62,"column":4,"nodeType":"CallExpression","endLine":62,"endColumn":99,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/contextitems/ve.ui.MWDefinedTransclusionContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWGalleryContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWIncludesContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":60,"column":15,"nodeType":"CallExpression","endLine":60,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":73,"column":15,"nodeType":"CallExpression","endLine":73,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/contextitems/ve.ui.MWInternalLinkContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWLanguageVariantNodeContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":112,"column":16,"nodeType":"CallExpression","endLine":112,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":137,"column":23,"nodeType":"CallExpression","endLine":137,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":139,"column":16,"nodeType":"CallExpression","endLine":139,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":145,"column":16,"nodeType":"CallExpression","endLine":145,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":169,"column":14,"nodeType":"CallExpression","endLine":169,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":176,"column":16,"nodeType":"CallExpression","endLine":176,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/contextitems/ve.ui.MWMagicLinkNodeContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWMediaContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWNumberedExternalLinkNodeContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWPreContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWSignatureContextItem.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/modules/ve-mw/ui/contextitems/ve.ui.MWTransclusionContextItem.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":85,"column":2,"nodeType":"CallExpression","endLine":89,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/contextitems/ve.ui.MWWikitextPasteContextItem.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/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWMediaTransferHandler.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/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextPlainTextStringTransferHandler.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/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.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/modules/ve-mw/ui/dialogs/ve.ui.MWCommandHelpDialog.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/modules/ve-mw/ui/dialogs/ve.ui.MWExtensionDialog.js","messages":[],"suppressedMessages":[{"ruleId":"arrow-body-style","severity":2,"message":"Unexpected block statement surrounding arrow body; move the returned value immediately after the `=>`.","line":89,"column":36,"nodeType":"ArrowFunctionExpression","messageId":"unexpectedSingleBlock","endLine":97,"endColumn":5,"fix":{"range":[2322,2558],"text":"this.confirmAbandon().then( ( confirm ) => {\n\t\t\t\t\tif ( confirm ) {\n\t\t\t\t\t\t/* We may need to rethink this if something in the\n\t\t\t\t\t\t dependency chain adds to the current behaviour */\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t}\n\t\t\t\t} )"},"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWExtensionPreviewDialog.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/modules/ve-mw/ui/dialogs/ve.ui.MWFloatingHelpDialog.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/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":436,"column":26,"nodeType":"CallExpression","endLine":440,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":623,"column":9,"nodeType":"CallExpression","endLine":630,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":705,"column":2,"nodeType":"CallExpression","endLine":712,"endColumn":5}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWGalleryDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for editing MediaWiki galleries.\n *\n * @class\n * @extends ve.ui.NodeDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWGalleryDialog = function VeUiMWGalleryDialog() {\n\t// Parent constructor\n\tve.ui.MWGalleryDialog.super.apply( this, arguments );\n\n\tthis.$element.addClass( 've-ui-mwGalleryDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWGalleryDialog, ve.ui.NodeDialog );\n\n/* Static properties */\n\nve.ui.MWGalleryDialog.static.name = 'gallery';\n\nve.ui.MWGalleryDialog.static.size = 'large';\n\nve.ui.MWGalleryDialog.static.title =\n\tOO.ui.deferMsg( 'visualeditor-mwgallerydialog-title' );\n\nve.ui.MWGalleryDialog.static.modelClasses = [ ve.dm.MWGalleryNode ];\n\nve.ui.MWGalleryDialog.static.includeCommands = null;\n\nve.ui.MWGalleryDialog.static.excludeCommands = [\n\t// No formatting\n\t'paragraph',\n\t'heading1',\n\t'heading2',\n\t'heading3',\n\t'heading4',\n\t'heading5',\n\t'heading6',\n\t'preformatted',\n\t'blockquote',\n\t// No block-level markup is allowed inside gallery caption (or gallery image captions)\n\t// No tables\n\t'insertTable',\n\t'deleteTable',\n\t'mergeCells',\n\t'tableCaption',\n\t'tableCellHeader',\n\t'tableCellData',\n\t// No structure\n\t'bullet',\n\t'bulletWrapOnce',\n\t'number',\n\t'numberWrapOnce',\n\t'indent',\n\t'outdent',\n\t// Nested galleries don't work either\n\t'gallery'\n];\n\n/**\n * Get the import rules for the surface widget in the dialog\n *\n * @see ve.dm.ElementLinearData#sanitize\n * @return {Object} Import rules\n */\nve.ui.MWGalleryDialog.static.getImportRules = function () {\n\tconst rules = ve.copy( ve.init.target.constructor.static.importRules );\n\treturn ve.extendObject(\n\t\trules,\n\t\t{\n\t\t\tall: {\n\t\t\t\tblacklist: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\t// No block-level markup is allowed inside gallery caption (or gallery image captions).\n\t\t\t\t\t\t// No lists, no tables.\n\t\t\t\t\t\tlist: true,\n\t\t\t\t\t\tlistItem: true,\n\t\t\t\t\t\tdefinitionList: true,\n\t\t\t\t\t\tdefinitionListItem: true,\n\t\t\t\t\t\ttable: true,\n\t\t\t\t\t\ttableCaption: true,\n\t\t\t\t\t\ttableSection: true,\n\t\t\t\t\t\ttableRow: true,\n\t\t\t\t\t\ttableCell: true,\n\t\t\t\t\t\tmwTable: true,\n\t\t\t\t\t\tmwTransclusionTableCell: true,\n\t\t\t\t\t\t// Nested galleries don't work either\n\t\t\t\t\t\tmwGallery: true\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'blacklist' )\n\t\t\t\t),\n\t\t\t\t// Headings are also possible, but discouraged\n\t\t\t\tconversions: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\tmwHeading: 'paragraph'\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'conversions' )\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t);\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWGalleryDialog.super.prototype.initialize.call( this );\n\n\t// States\n\tthis.highlightedItem = null;\n\tthis.searchPanelVisible = false;\n\tthis.selectedFilenames = {};\n\tthis.initialImageData = [];\n\tthis.originalMwDataNormalized = null;\n\tthis.originalGalleryGroupItems = [];\n\tthis.imageData = {};\n\tthis.isMobile = OO.ui.isMobile();\n\n\t// Default settings\n\tthis.defaults = mw.config.get( 'wgVisualEditorConfig' ).galleryOptions;\n\n\t// Images and options tab panels\n\tthis.indexLayout = new OO.ui.IndexLayout();\n\tconst imagesTabPanel = new OO.ui.TabPanelLayout( 'images', {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-card-images' ),\n\t\t// Contains a menu layout which handles its own scrolling\n\t\tscrollable: false,\n\t\tpadded: true\n\t} );\n\tconst optionsTabPanel = new OO.ui.TabPanelLayout( 'options', {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-card-options' ),\n\t\tpadded: true\n\t} );\n\n\t// Images tab panel\n\n\t// General layout\n\tconst imageListContentPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true,\n\t\tscrollable: true\n\t} );\n\tconst imageListMenuPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true\n\t} );\n\tthis.imageListMenuLayout = new OO.ui.MenuLayout( {\n\t\tmenuPosition: this.isMobile ? 'after' : 'bottom',\n\t\tclasses: [\n\t\t\t've-ui-mwGalleryDialog-imageListMenuLayout',\n\t\t\tthis.isMobile ?\n\t\t\t\t've-ui-mwGalleryDialog-imageListMenuLayout-mobile' :\n\t\t\t\t've-ui-mwGalleryDialog-imageListMenuLayout-desktop'\n\t\t],\n\t\tcontentPanel: imageListContentPanel,\n\t\tmenuPanel: imageListMenuPanel\n\t} );\n\tthis.editPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true,\n\t\tscrollable: true\n\t} );\n\tthis.searchPanel = new OO.ui.PanelLayout( {\n\t\tpadded: true,\n\t\texpanded: true,\n\t\tscrollable: true\n\t} );\n\tthis.editSearchStack = new OO.ui.StackLayout( {\n\t\titems: [ this.editPanel, this.searchPanel ]\n\t} );\n\tthis.imageTabMenuLayout = new OO.ui.MenuLayout( {\n\t\tmenuPosition: this.isMobile ? 'top' : 'before',\n\t\tclasses: [\n\t\t\t've-ui-mwGalleryDialog-menuLayout',\n\t\t\tthis.isMobile ?\n\t\t\t\t've-ui-mwGalleryDialog-menuLayout-mobile' :\n\t\t\t\t've-ui-mwGalleryDialog-menuLayout-desktop'\n\t\t],\n\t\tmenuPanel: this.imageListMenuLayout,\n\t\tcontentPanel: this.editSearchStack\n\t} );\n\n\t// Menu\n\tthis.$emptyGalleryMessage = $( '<div>' )\n\t\t.addClass( 'oo-ui-element-hidden' )\n\t\t.text( ve.msg( 'visualeditor-mwgallerydialog-empty-gallery-message' ) );\n\tthis.galleryGroup = new ve.ui.MWGalleryGroupWidget( {\n\t\torientation: this.isMobile ? 'horizontal' : 'vertical'\n\t} );\n\tthis.showSearchPanelButton = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-search-button-label' ),\n\t\tinvisibleLabel: !!this.isMobile,\n\t\ticon: 'add',\n\t\tframed: false,\n\t\tflags: [ 'progressive' ],\n\t\tclasses: [ 've-ui-mwGalleryDialog-show-search-panel-button' ]\n\t} );\n\n\t// Edit panel\n\tthis.filenameFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-filename' ),\n\t\ticon: 'image'\n\t} );\n\tthis.$highlightedImage = $( '<div>' )\n\t\t.addClass( 've-ui-mwGalleryDialog-highlighted-image mw-no-invert' );\n\tthis.filenameFieldset.$element.append( this.$highlightedImage );\n\tthis.highlightedCaptionTarget = ve.init.target.createTargetWidget( {\n\t\tincludeCommands: this.constructor.static.includeCommands,\n\t\texcludeCommands: this.constructor.static.excludeCommands,\n\t\timportRules: this.constructor.static.getImportRules(),\n\t\tmultiline: false\n\t} );\n\tthis.highlightedAltTextInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-dialog-media-alttext-section' )\n\t} );\n\tthis.altTextSameAsCaption = new OO.ui.CheckboxInputWidget();\n\tthis.removeButton = new OO.ui.ButtonWidget( {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-remove-button-label' ),\n\t\ticon: 'trash',\n\t\tflags: [ 'destructive' ],\n\t\tclasses: [ 've-ui-mwGalleryDialog-remove-button' ]\n\t} );\n\n\tconst highlightedCaptionField = new OO.ui.FieldLayout( this.highlightedCaptionTarget, {\n\t\talign: 'top'\n\t} );\n\tconst highlightedCaptionFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-section' )\n\t} );\n\thighlightedCaptionFieldset.addItems( [ highlightedCaptionField ] );\n\n\tconst highlightedAltTextField = new OO.ui.FieldLayout( this.highlightedAltTextInput, {\n\t\talign: 'top'\n\t} );\n\tconst altTextSameAsCaptionField = new OO.ui.FieldLayout( this.altTextSameAsCaption, {\n\t\talign: 'inline',\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-alttext-checkbox' )\n\t} );\n\tconst highlightedAltTextFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-alttext-section' )\n\t} );\n\thighlightedAltTextFieldset.addItems( [\n\t\thighlightedAltTextField,\n\t\taltTextSameAsCaptionField\n\t] );\n\n\t// Search panel\n\tthis.searchWidget = new mw.widgets.MediaSearchWidget( {\n\t\trowHeight: this.isMobile ? 100 : 150\n\t} );\n\n\t// Options tab panel\n\n\t// Input widgets\n\tthis.modeDropdown = new OO.ui.DropdownWidget( { menu: { items: [\n\t\t'traditional',\n\t\t'nolines',\n\t\t'packed',\n\t\t'packed-overlay',\n\t\t'packed-hover',\n\t\t'slideshow'\n\t].map( ( data ) => new OO.ui.MenuOptionWidget( {\n\t\tdata: data,\n\t\t// Messages used here:\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-traditional\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-nolines\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-packed\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-packed-overlay\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-packed-hover\n\t\t// * visualeditor-mwgallerydialog-mode-dropdown-label-slideshow\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-mode-dropdown-label-' + data )\n\t} ) ) } } );\n\tthis.captionTarget = ve.init.target.createTargetWidget( {\n\t\tincludeCommands: this.constructor.static.includeCommands,\n\t\texcludeCommands: this.constructor.static.excludeCommands,\n\t\timportRules: this.constructor.static.getImportRules(),\n\t\tmultiline: false\n\t} );\n\tthis.widthsInput = new OO.ui.NumberInputWidget( {\n\t\tmin: 0,\n\t\tshowButtons: false,\n\t\tinput: {\n\t\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-widths-input-placeholder', this.defaults.imageWidth )\n\t\t}\n\t} );\n\tthis.heightsInput = new OO.ui.NumberInputWidget( {\n\t\tmin: 0,\n\t\tshowButtons: false,\n\t\tinput: {\n\t\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-heights-input-placeholder', this.defaults.imageHeight )\n\t\t}\n\t} );\n\tthis.perRowInput = new OO.ui.NumberInputWidget( {\n\t\tmin: 0,\n\t\tshowButtons: false\n\t} );\n\tthis.showFilenameCheckbox = new OO.ui.CheckboxInputWidget( {\n\t\tvalue: 'yes'\n\t} );\n\tthis.classesInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-classes-input-placeholder' )\n\t} );\n\tthis.stylesInput = new OO.ui.TextInputWidget( {\n\t\tplaceholder: ve.msg( 'visualeditor-mwgallerydialog-styles-input-placeholder' )\n\t} );\n\n\t// Field layouts\n\tconst modeField = new OO.ui.FieldLayout( this.modeDropdown, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-mode-field-label' )\n\t} );\n\tconst captionField = new OO.ui.FieldLayout( this.captionTarget, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-caption-field-label' ),\n\t\talign: this.isMobile ? 'top' : 'left'\n\t} );\n\tconst widthsField = new OO.ui.FieldLayout( this.widthsInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-widths-field-label' )\n\t} );\n\tconst heightsField = new OO.ui.FieldLayout( this.heightsInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-heights-field-label' )\n\t} );\n\tconst perRowField = new OO.ui.FieldLayout( this.perRowInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-perrow-field-label' )\n\t} );\n\tconst showFilenameField = new OO.ui.FieldLayout( this.showFilenameCheckbox, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-show-filename-field-label' )\n\t} );\n\tconst classesField = new OO.ui.FieldLayout( this.classesInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-classes-field-label' )\n\t} );\n\tconst stylesField = new OO.ui.FieldLayout( this.stylesInput, {\n\t\tlabel: ve.msg( 'visualeditor-mwgallerydialog-styles-field-label' )\n\t} );\n\n\t// Append everything\n\timageListMenuPanel.$element.append(\n\t\tthis.showSearchPanelButton.$element\n\t);\n\timageListContentPanel.$element.append(\n\t\tthis.$emptyGalleryMessage,\n\t\tthis.galleryGroup.$element\n\t);\n\tthis.editPanel.$element.append(\n\t\tthis.filenameFieldset.$element,\n\t\thighlightedCaptionFieldset.$element,\n\t\thighlightedAltTextFieldset.$element,\n\t\tthis.removeButton.$element\n\t);\n\tthis.searchPanel.$element.append(\n\t\tthis.searchWidget.$element\n\t);\n\timagesTabPanel.$element.append(\n\t\tthis.imageTabMenuLayout.$element\n\t);\n\toptionsTabPanel.$element.append(\n\t\tmodeField.$element,\n\t\tcaptionField.$element,\n\t\twidthsField.$element,\n\t\theightsField.$element,\n\t\tperRowField.$element,\n\t\tshowFilenameField.$element,\n\t\tclassesField.$element,\n\t\tstylesField.$element\n\t);\n\tthis.indexLayout.addTabPanels( [\n\t\timagesTabPanel,\n\t\toptionsTabPanel\n\t] );\n\tthis.$body.append( this.indexLayout.$element );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tconst namespaceIds = mw.config.get( 'wgNamespaceIds' ),\n\t\t\t\tmwData = this.selectedNode && this.selectedNode.getAttribute( 'mw' ),\n\t\t\t\tattributes = mwData && mwData.attrs,\n\t\t\t\tcaptionNode = this.selectedNode && this.selectedNode.getCaptionNode(),\n\t\t\t\timageNodes = this.selectedNode && this.selectedNode.getImageNodes(),\n\t\t\t\tisReadOnly = this.isReadOnly();\n\n\t\t\tthis.anyItemModified = false;\n\n\t\t\t// Images tab panel\n\t\t\t// If editing an existing gallery, populate with the images...\n\t\t\tif ( this.selectedNode ) {\n\t\t\t\tconst imageTitles = [];\n\n\t\t\t\tfor ( let i = 0, ilen = imageNodes.length; i < ilen; i++ ) {\n\t\t\t\t\tconst image = imageNodes[ i ];\n\t\t\t\t\tconst resourceTitle = mw.Title.newFromText( mw.libs.ve.normalizeParsoidResourceName( image.getAttribute( 'resource' ) ), namespaceIds.file );\n\t\t\t\t\tif ( !resourceTitle ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst resource = resourceTitle.getPrefixedText();\n\t\t\t\t\tconst imageCaptionNode = image.getCaptionNode();\n\t\t\t\t\timageTitles.push( resource );\n\t\t\t\t\tthis.initialImageData.push( {\n\t\t\t\t\t\tresource: resource,\n\t\t\t\t\t\taltText: image.getAttribute( 'altText' ),\n\t\t\t\t\t\taltTextSame: image.getAttribute( 'altTextSame' ),\n\t\t\t\t\t\thref: image.getAttribute( 'href' ),\n\t\t\t\t\t\tsrc: image.getAttribute( 'src' ),\n\t\t\t\t\t\theight: image.getAttribute( 'height' ),\n\t\t\t\t\t\twidth: image.getAttribute( 'width' ),\n\t\t\t\t\t\tcaptionDocument: this.createCaptionDocument( imageCaptionNode ),\n\t\t\t\t\t\ttagName: image.getAttribute( 'tagName' ),\n\t\t\t\t\t\tisError: image.getAttribute( 'isError' ),\n\t\t\t\t\t\terrorText: image.getAttribute( 'errorText' ),\n\t\t\t\t\t\timageClassAttr: image.getAttribute( 'imageClassAttr' ),\n\t\t\t\t\t\timgWrapperClassAttr: image.getAttribute( 'imgWrapperClassAttr' ),\n\t\t\t\t\t\tmw: image.getAttribute( 'mw' ),\n\t\t\t\t\t\tmediaClass: image.getAttribute( 'mediaClass' ),\n\t\t\t\t\t\tmediaTag: image.getAttribute( 'mediaTag' )\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\t// Populate menu and edit panels\n\t\t\t\tthis.imagesPromise = this.requestImages( {\n\t\t\t\t\ttitles: imageTitles\n\t\t\t\t} ).done( () => {\n\t\t\t\t\tthis.onHighlightItem();\n\t\t\t\t} );\n\n\t\t\t// ...Otherwise show the search panel\n\t\t\t} else {\n\t\t\t\tthis.toggleEmptyGalleryMessage( true );\n\t\t\t\tthis.toggleSearchPanel( true );\n\t\t\t}\n\n\t\t\t// Options tab panel\n\n\t\t\t// Set options\n\t\t\tconst mode = attributes && attributes.mode || this.defaults.mode;\n\t\t\tconst widths = attributes && parseInt( attributes.widths ) || '';\n\t\t\tconst heights = attributes && parseInt( attributes.heights ) || '';\n\t\t\tconst perRow = attributes && attributes.perrow || '';\n\t\t\tconst showFilename = attributes && attributes.showfilename === 'yes';\n\t\t\tconst classes = attributes && attributes.class || '';\n\t\t\tconst styles = attributes && attributes.style || '';\n\t\t\t// Caption\n\t\t\tthis.captionDocument = this.createCaptionDocument( captionNode );\n\n\t\t\t// Populate options panel\n\t\t\tthis.modeDropdown.getMenu().selectItemByData( mode );\n\t\t\tthis.widthsInput.setValue( widths );\n\t\t\tthis.heightsInput.setValue( heights );\n\t\t\tthis.perRowInput.setValue( perRow );\n\t\t\tthis.showFilenameCheckbox.setSelected( showFilename );\n\t\t\tthis.classesInput.setValue( classes );\n\t\t\tthis.stylesInput.setValue( styles );\n\t\t\t// Caption\n\t\t\tthis.captionTarget.setDocument( this.captionDocument );\n\t\t\tthis.captionTarget.setReadOnly( isReadOnly );\n\n\t\t\tif ( mwData ) {\n\t\t\t\tthis.originalMwDataNormalized = ve.copy( mwData );\n\t\t\t\tthis.updateMwData( this.originalMwDataNormalized );\n\t\t\t}\n\n\t\t\tthis.highlightedAltTextInput.setReadOnly( isReadOnly || this.altTextSameAsCaption.isSelected() );\n\t\t\tthis.altTextSameAsCaption.setDisabled( isReadOnly );\n\t\t\tthis.modeDropdown.setDisabled( isReadOnly );\n\t\t\tthis.widthsInput.setReadOnly( isReadOnly );\n\t\t\tthis.heightsInput.setReadOnly( isReadOnly );\n\t\t\tthis.perRowInput.setReadOnly( isReadOnly );\n\t\t\tthis.showFilenameCheckbox.setDisabled( isReadOnly );\n\t\t\tthis.classesInput.setReadOnly( isReadOnly );\n\t\t\tthis.stylesInput.setReadOnly( isReadOnly );\n\n\t\t\tthis.showSearchPanelButton.setDisabled( isReadOnly );\n\t\t\tthis.removeButton.setDisabled( isReadOnly );\n\n\t\t\tthis.galleryGroup.toggleDraggable( !isReadOnly );\n\n\t\t\t// Disable fields depending on mode\n\t\t\tthis.onModeDropdownChange();\n\n\t\t\t// Add event handlers\n\t\t\tthis.indexLayout.connect( this, { set: 'updateDialogSize' } );\n\t\t\tthis.searchWidget.getResults().connect( this, { choose: 'onSearchResultsChoose' } );\n\t\t\tthis.showSearchPanelButton.connect( this, { click: 'onShowSearchPanelButtonClick' } );\n\t\t\tthis.galleryGroup.connect( this, { editItem: 'onHighlightItem' } );\n\t\t\tthis.galleryGroup.connect( this, { change: 'updateActions' } );\n\t\t\tthis.removeButton.connect( this, { click: 'onRemoveItem' } );\n\t\t\tthis.modeDropdown.getMenu().connect( this, { choose: 'onModeDropdownChange' } );\n\t\t\tthis.widthsInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.heightsInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.perRowInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.showFilenameCheckbox.connect( this, { change: 'updateActions' } );\n\t\t\tthis.classesInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.stylesInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.captionTarget.connect( this, { change: 'updateActions' } );\n\t\t\tthis.highlightedAltTextInput.connect( this, { change: 'updateActions' } );\n\t\t\tthis.altTextSameAsCaption.connect( this, { change: 'onAltTextSameAsCaptionChange' } );\n\t\t\tthis.highlightedCaptionTarget.connect( this, { change: 'onHighlightedCaptionTargetChange' } );\n\n\t\t\treturn this.imagesPromise;\n\t\t} );\n};\n\n/**\n * Get a new caption document for the gallery caption or an image caption.\n *\n * @private\n * @param {ve.dm.MWGalleryCaptionNode|ve.dm.MWGalleryImageCaptionNode|null} captionNode\n * @return {ve.dm.Document}\n */\nve.ui.MWGalleryDialog.prototype.createCaptionDocument = function ( captionNode ) {\n\tif ( captionNode && captionNode.getLength() > 0 ) {\n\t\treturn this.selectedNode.getDocument().cloneFromRange( captionNode.getRange() );\n\t} else {\n\t\treturn this.getFragment().getDocument().cloneWithData( [\n\t\t\t{ type: 'paragraph', internal: { generated: 'wrapper' } },\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t] );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.searchWidget.getQuery().focus().select();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\t// Layouts\n\t\t\tthis.indexLayout.setTabPanel( 'images' );\n\t\t\tthis.indexLayout.resetScroll();\n\t\t\tthis.imageTabMenuLayout.resetScroll();\n\n\t\t\t// Widgets\n\t\t\tthis.galleryGroup.clearItems();\n\t\t\tthis.searchWidget.getQuery().setValue( '' );\n\t\t\tthis.searchWidget.teardown();\n\n\t\t\t// States\n\t\t\tthis.highlightedItem = null;\n\t\t\tthis.searchPanelVisible = false;\n\t\t\tthis.selectedFilenames = {};\n\t\t\tthis.initialImageData = [];\n\t\t\tthis.originalMwDataNormalized = null;\n\t\t\tthis.originalGalleryGroupItems = [];\n\n\t\t\t// Disconnect events\n\t\t\tthis.indexLayout.disconnect( this );\n\t\t\tthis.searchWidget.getResults().disconnect( this );\n\t\t\tthis.showSearchPanelButton.disconnect( this );\n\t\t\tthis.galleryGroup.disconnect( this );\n\t\t\tthis.removeButton.disconnect( this );\n\t\t\tthis.modeDropdown.disconnect( this );\n\t\t\tthis.widthsInput.disconnect( this );\n\t\t\tthis.heightsInput.disconnect( this );\n\t\t\tthis.perRowInput.disconnect( this );\n\t\t\tthis.showFilenameCheckbox.disconnect( this );\n\t\t\tthis.classesInput.disconnect( this );\n\t\t\tthis.stylesInput.disconnect( this );\n\t\t\tthis.highlightedAltTextInput.disconnect( this );\n\t\t\tthis.altTextSameAsCaption.disconnect( this );\n\t\t\tthis.captionTarget.disconnect( this );\n\t\t\tthis.highlightedCaptionTarget.disconnect( this );\n\n\t\t} );\n};\n\nve.ui.MWGalleryDialog.prototype.getActionProcess = function ( action ) {\n\treturn ve.ui.MWGalleryDialog.super.prototype.getActionProcess.call( this, action )\n\t\t.next( () => {\n\t\t\tif ( action === 'done' ) {\n\t\t\t\t// Save the input values for the highlighted item\n\t\t\t\tthis.updateHighlightedItem();\n\n\t\t\t\tthis.insertOrUpdateNode();\n\t\t\t\tthis.close( { action: 'done' } );\n\t\t\t}\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWGalleryDialog.prototype.getBodyHeight = function () {\n\treturn 600;\n};\n\n/**\n * Request the images for the images tab panel menu\n *\n * @param {Object} options Options for the request\n * @return {jQuery.Promise} Promise which resolves when image data has been fetched\n */\nve.ui.MWGalleryDialog.prototype.requestImages = function ( options ) {\n\tconst promises = options.titles.map( ( title ) => ve.init.platform.galleryImageInfoCache.get( title ) );\n\n\treturn ve.promiseAll( promises )\n\t\t.done( ( ...args ) => {\n\t\t\tconst resp = {};\n\t\t\toptions.titles.forEach( ( title, i ) => {\n\t\t\t\tresp[ title ] = args[ i ];\n\t\t\t} );\n\t\t\tthis.onRequestImagesSuccess( resp );\n\t\t} );\n};\n\n/**\n * Create items for the returned images and add them to the gallery group\n *\n * @param {Object} response jQuery response object\n */\nve.ui.MWGalleryDialog.prototype.onRequestImagesSuccess = function ( response ) {\n\tconst thumbUrls = {},\n\t\titems = [],\n\t\tconfig = { isMobile: this.isMobile, draggable: !this.isReadOnly() };\n\n\tlet title;\n\tfor ( title in response ) {\n\t\tthumbUrls[ title ] = {\n\t\t\tthumbUrl: response[ title ].thumburl,\n\t\t\twidth: response[ title ].thumbwidth,\n\t\t\theight: response[ title ].thumbheight\n\t\t};\n\t}\n\n\tif ( this.initialImageData.length > 0 ) {\n\t\tthis.initialImageData.forEach( ( image ) => {\n\t\t\timage.thumbUrl = thumbUrls[ image.resource ].thumbUrl;\n\t\t\titems.push( new ve.ui.MWGalleryItemWidget( image, config ) );\n\t\t} );\n\t\tthis.initialImageData = [];\n\t\tthis.originalGalleryGroupItems = ve.copy( items );\n\t} else {\n\t\tfor ( title in this.selectedFilenames ) {\n\t\t\tif ( Object.prototype.hasOwnProperty.call( thumbUrls, title ) ) {\n\t\t\t\titems.push( new ve.ui.MWGalleryItemWidget( {\n\t\t\t\t\tresource: title,\n\t\t\t\t\taltText: null,\n\t\t\t\t\taltTextSame: true,\n\t\t\t\t\t// TODO: support changing the link in the UI somewhere;\n\t\t\t\t\t// for now, always link to the resource. Do it here when\n\t\t\t\t\t// generating new results, so existing links from source\n\t\t\t\t\t// will be preserved.\n\t\t\t\t\thref: title,\n\t\t\t\t\tsrc: '',\n\t\t\t\t\theight: thumbUrls[ title ].height,\n\t\t\t\t\twidth: thumbUrls[ title ].width,\n\t\t\t\t\tthumbUrl: thumbUrls[ title ].thumbUrl,\n\t\t\t\t\tcaptionDocument: this.createCaptionDocument( null ),\n\t\t\t\t\tisError: false,\n\t\t\t\t\terrorText: null,\n\t\t\t\t\timageClassAttr: 'mw-file-element',\n\t\t\t\t\tmw: {},\n\t\t\t\t\tmediaClass: 'File',\n\t\t\t\t\tmediaTag: 'img'\n\t\t\t\t}, config ) );\n\t\t\t\tdelete this.selectedFilenames[ title ];\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.galleryGroup.addItems( items );\n\n\t// Gallery is no longer empty\n\tthis.updateActions();\n\tthis.toggleEmptyGalleryMessage( false );\n};\n\n/**\n * Request a new image and highlight it\n *\n * @param {string} title Normalized title of the new image\n */\nve.ui.MWGalleryDialog.prototype.addNewImage = function ( title ) {\n\t// Make list of unique pending images, for onRequestImagesSuccess\n\tthis.selectedFilenames[ title ] = true;\n\n\t// Request image\n\tthis.requestImages( {\n\t\ttitles: [ title ]\n\t} ).done( () => {\n\t\t// populate edit panel with the new image\n\t\tconst items = this.galleryGroup.items;\n\t\tthis.onHighlightItem( items[ items.length - 1 ] );\n\t\tthis.highlightedCaptionTarget.focus();\n\t} );\n};\n\n/**\n * Update the image currently being edited (ve.ui.MWGalleryItemWidget) with the values from inputs\n * in this dialog (currently only the image caption).\n */\nve.ui.MWGalleryDialog.prototype.updateHighlightedItem = function () {\n\tthis.anyItemModified = this.anyItemModified || this.isHighlightedItemModified();\n\n\t// TODO: Support link, page and lang\n\tif ( this.highlightedItem ) {\n\t\t// No need to call setCaptionDocument(), the document object is updated on every change\n\t\tthis.highlightedItem.setAltText( this.highlightedAltTextInput.getValue() );\n\t\tthis.highlightedItem.setAltTextSame( this.altTextSameAsCaption.isSelected() );\n\t}\n};\n\n/**\n * Handle search results choose event.\n *\n * @param {mw.widgets.MediaResultWidget} item Chosen item\n */\nve.ui.MWGalleryDialog.prototype.onSearchResultsChoose = function ( item ) {\n\tconst title = mw.Title.newFromText( item.getData().title ).getPrefixedText();\n\n\t// Check title against pending insertions\n\t// TODO: Prevent two 'choose' events firing from the UI\n\tif ( !Object.prototype.hasOwnProperty.call( this.selectedFilenames, title ) ) {\n\t\tthis.addNewImage( title );\n\t}\n\n\tthis.updateActions();\n};\n\n/**\n * Handle click event for the remove button\n */\nve.ui.MWGalleryDialog.prototype.onRemoveItem = function () {\n\tconst removedItemIndex = this.galleryGroup.items.indexOf( this.highlightedItem );\n\t// Remove the highlighted item\n\tthis.galleryGroup.removeItems( [ this.highlightedItem ] );\n\n\t// Highlight another item, or show the search panel if the gallery is now empty\n\tthis.onHighlightItem( undefined, removedItemIndex !== -1 ? removedItemIndex : undefined );\n};\n\n/**\n * Handle clicking on an image in the menu\n *\n * @param {ve.ui.MWGalleryItemWidget} [item] The item that was clicked on\n * @param {number} [removedItemIndex] Index of just-removed item\n */\nve.ui.MWGalleryDialog.prototype.onHighlightItem = function ( item, removedItemIndex ) {\n\t// Unhighlight previous item\n\tif ( this.highlightedItem ) {\n\t\tthis.highlightedItem.toggleHighlighted( false );\n\t}\n\n\t// Show edit panel\n\t// (This also calls updateHighlightedItem() to save the input values.)\n\tthis.toggleSearchPanel( false );\n\n\t// Highlight new item.\n\tif ( removedItemIndex !== undefined ) {\n\t\t// The removed item might have been the last item in the list, in which\n\t\t// case highlight the new last item.\n\t\tconst index = Math.min( removedItemIndex, this.galleryGroup.items.length - 1 );\n\t\titem = this.galleryGroup.items[ index ];\n\t} else if ( !item ) {\n\t\t// If no item was given, highlight the first item in the gallery.\n\t\titem = this.galleryGroup.items[ 0 ];\n\t}\n\n\tif ( !item ) {\n\t\t// Show the search panel if the gallery is empty\n\t\tthis.toggleEmptyGalleryMessage( true );\n\t\tthis.toggleSearchPanel( true );\n\t\treturn;\n\t}\n\n\titem.toggleHighlighted( true );\n\tthis.highlightedItem = item;\n\n\t// Scroll item into view in menu\n\tOO.ui.Element.static.scrollIntoView( item.$element[ 0 ] );\n\n\t// Populate edit panel\n\tconst title = mw.Title.newFromText( mw.libs.ve.normalizeParsoidResourceName( item.resource ) );\n\tconst $link = $( '<a>' )\n\t\t.addClass( 've-ui-mwMediaDialog-description-link' )\n\t\t.attr( 'target', '_blank' )\n\t\t.attr( 'rel', 'noopener' )\n\t\t.text( ve.msg( 'visualeditor-dialog-media-content-description-link' ) );\n\n\t// T322704\n\tve.setAttributeSafe( $link[ 0 ], 'href', title.getUrl(), '#' );\n\n\tthis.filenameFieldset.setLabel(\n\t\t$( '<span>' ).append(\n\t\t\t$( document.createTextNode( title.getMainText() + ' ' ) ),\n\t\t\t$link\n\t\t)\n\t);\n\tthis.$highlightedImage\n\t\t.css( 'background-image', 'url(' + item.thumbUrl + ')' );\n\tthis.highlightedCaptionTarget.setDocument( item.captionDocument );\n\tthis.highlightedCaptionTarget.setReadOnly( this.isReadOnly() );\n\tthis.highlightedAltTextInput.setValue( item.altText );\n\tthis.highlightedAltTextInput.setReadOnly( this.isReadOnly() || item.altTextSame );\n\tthis.altTextSameAsCaption.setSelected( item.altTextSame );\n};\n\n/**\n * Handle change event for this.modeDropdown\n */\nve.ui.MWGalleryDialog.prototype.onModeDropdownChange = function () {\n\tconst mode = this.modeDropdown.getMenu().findSelectedItem().getData(),\n\t\tdisabled = (\n\t\t\tmode === 'packed' ||\n\t\t\tmode === 'packed-overlay' ||\n\t\t\tmode === 'packed-hover' ||\n\t\t\tmode === 'slideshow'\n\t\t);\n\n\tthis.widthsInput.setDisabled( disabled );\n\tthis.perRowInput.setDisabled( disabled );\n\n\t// heights is only ignored in slideshow mode\n\tthis.heightsInput.setDisabled( mode === 'slideshow' );\n\n\tthis.updateActions();\n};\n\n/**\n * Handle change event for this.highlightedCaptionTarget\n */\nve.ui.MWGalleryDialog.prototype.onHighlightedCaptionTargetChange = function () {\n\tif ( this.altTextSameAsCaption.isSelected() ) {\n\t\tconst surfaceModel = this.highlightedCaptionTarget.getSurface().getModel();\n\t\tconst caption = surfaceModel.getLinearFragment(\n\t\t\tsurfaceModel.getDocument().getDocumentRange()\n\t\t).getText();\n\t\tthis.highlightedAltTextInput.setValue( caption );\n\t}\n\tthis.updateActions();\n};\n\n/**\n * Handle change event for this.altTextSameAsCaption\n */\nve.ui.MWGalleryDialog.prototype.onAltTextSameAsCaptionChange = function () {\n\tthis.highlightedAltTextInput.setReadOnly( this.isReadOnly() || this.altTextSameAsCaption.isSelected() );\n\tthis.onHighlightedCaptionTargetChange();\n};\n\n/**\n * Handle click event for showSearchPanelButton\n */\nve.ui.MWGalleryDialog.prototype.onShowSearchPanelButtonClick = function () {\n\tthis.toggleSearchPanel( true );\n};\n\n/**\n * Toggle the search panel (and the edit panel, the opposite way)\n *\n * @param {boolean} [visible] The search panel is visible\n */\nve.ui.MWGalleryDialog.prototype.toggleSearchPanel = function ( visible ) {\n\tvisible = visible !== undefined ? visible : !this.searchPanelVisible;\n\n\t// If currently visible panel is an edit panel, save the input values for the highlighted item\n\tif ( !this.searchPanelVisible ) {\n\t\tthis.updateHighlightedItem();\n\t}\n\n\t// Record the state of the search panel\n\tthis.searchPanelVisible = visible;\n\n\t// Toggle the search panel, and do the opposite for the edit panel\n\tthis.editSearchStack.setItem( visible ? this.searchPanel : this.editPanel );\n\n\tthis.imageListMenuLayout.toggleMenu( !visible );\n\tif ( this.highlightedItem && visible ) {\n\t\tthis.highlightedItem.toggleHighlighted( false );\n\t\tthis.highlightedItem = null;\n\t}\n\n\t// If the edit panel is visible, focus the caption target\n\tif ( !visible ) {\n\t\tthis.highlightedCaptionTarget.focus();\n\t} else {\n\t\t// Try to populate with user uploads\n\t\tthis.searchWidget.queryMediaQueue();\n\t\tthis.searchWidget.getQuery().focus().select();\n\t}\n\tthis.updateDialogSize();\n};\n\n/**\n * Resize the dialog according to which panel is focused\n */\nve.ui.MWGalleryDialog.prototype.updateDialogSize = function () {\n\tif ( this.searchPanelVisible && this.indexLayout.currentTabPanelName === 'images' ) {\n\t\tthis.setSize( 'larger' );\n\t} else {\n\t\tthis.setSize( 'large' );\n\t}\n};\n\n/**\n * Toggle the empty gallery message\n *\n * @param {boolean} empty The gallery is empty\n */\nve.ui.MWGalleryDialog.prototype.toggleEmptyGalleryMessage = function ( empty ) {\n\tthis.$emptyGalleryMessage.toggleClass( 'oo-ui-element-hidden', !empty );\n};\n\n/**\n * Disable the \"Done\" button if the gallery is empty, otherwise enable it\n *\n * TODO Disable the button until the user makes any changes\n */\nve.ui.MWGalleryDialog.prototype.updateActions = function () {\n\tthis.actions.setAbilities( { done: this.isSaveable() } );\n};\n\n/**\n * Check if gallery attributes or contents would be modified if changes were applied.\n *\n * @return {boolean}\n */\nve.ui.MWGalleryDialog.prototype.isSaveable = function () {\n\t// Check attributes\n\tif ( this.originalMwDataNormalized ) {\n\t\tconst mwDataCopy = ve.copy( this.selectedNode.getAttribute( 'mw' ) );\n\t\tthis.updateMwData( mwDataCopy );\n\t\tif ( !ve.compare( mwDataCopy, this.originalMwDataNormalized ) ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\tif ( this.captionTarget.hasBeenModified() ) {\n\t\treturn true;\n\t}\n\n\t// Check contents: each image's attributes and contents (caption)\n\tif ( this.anyItemModified || this.isHighlightedItemModified() ) {\n\t\treturn true;\n\t}\n\n\t// Check contents: added/removed/reordered images\n\tif ( this.originalGalleryGroupItems ) {\n\t\tif ( this.galleryGroup.items.length !== this.originalGalleryGroupItems.length ) {\n\t\t\treturn true;\n\t\t}\n\t\tfor ( let i = 0; i < this.galleryGroup.items.length; i++ ) {\n\t\t\tif ( this.galleryGroup.items[ i ] !== this.originalGalleryGroupItems[ i ] ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false;\n};\n\n/**\n * Check if currently highlighted item's attributes or contents would be modified if changes were\n * applied.\n *\n * @return {boolean}\n */\nve.ui.MWGalleryDialog.prototype.isHighlightedItemModified = function () {\n\tif ( this.highlightedItem ) {\n\t\tif ( this.highlightedAltTextInput.getValue() !== this.highlightedItem.altText ) {\n\t\t\treturn true;\n\t\t}\n\t\tif ( this.altTextSameAsCaption.isSelected() !== this.highlightedItem.altTextSame ) {\n\t\t\treturn true;\n\t\t}\n\t\tif ( this.highlightedCaptionTarget.hasBeenModified() ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/**\n * Insert or update the node in the document model from the new values\n */\nve.ui.MWGalleryDialog.prototype.insertOrUpdateNode = function () {\n\tconst surfaceModel = this.getFragment().getSurface(),\n\t\tsurfaceModelDocument = surfaceModel.getDocument(),\n\t\titems = this.galleryGroup.items,\n\t\tdata = [];\n\n\tlet mwData;\n\n\tfunction scaleImage( height, width, maxHeight, maxWidth ) {\n\t\tconst heightScaleFactor = maxHeight / height;\n\t\tconst widthScaleFactor = maxWidth / width;\n\n\t\tconst scaleFactor = width * heightScaleFactor > maxWidth ? widthScaleFactor : heightScaleFactor;\n\n\t\treturn {\n\t\t\theight: Math.round( height * scaleFactor ),\n\t\t\twidth: Math.round( width * scaleFactor )\n\t\t};\n\t}\n\n\t/**\n\t * Get linear data from a gallery item\n\t *\n\t * @param {ve.ui.MWGalleryItemWidget} galleryItem Gallery item\n\t * @return {Array} Linear data\n\t */\n\tfunction getImageLinearData( galleryItem ) {\n\t\tconst size = scaleImage(\n\t\t\tparseInt( galleryItem.height ),\n\t\t\tparseInt( galleryItem.width ),\n\t\t\tparseInt( mwData.attrs.heights || this.defaults.imageHeight ),\n\t\t\tparseInt( mwData.attrs.widths || this.defaults.imageWidth )\n\t\t);\n\t\tconst imageAttributes = {\n\t\t\tresource: './' + galleryItem.resource,\n\t\t\taltText: ( !galleryItem.altText && !galleryItem.originalAltText ) ?\n\t\t\t\t// Use original null/empty value\n\t\t\t\tgalleryItem.originalAltText :\n\t\t\t\tgalleryItem.altText,\n\t\t\taltTextSame: galleryItem.altTextSame,\n\t\t\thref: galleryItem.href,\n\t\t\t// For existing images use `src` to avoid triggering a diff if the\n\t\t\t// thumbnail size changes. For new images we have to use `thumbUrl` (T310623).\n\t\t\tsrc: galleryItem.src || galleryItem.thumbUrl,\n\t\t\theight: size.height,\n\t\t\twidth: size.width,\n\t\t\ttagName: galleryItem.tagName,\n\t\t\tisError: galleryItem.isError,\n\t\t\terrorText: galleryItem.errorText,\n\t\t\timageClassAttr: galleryItem.imageClassAttr,\n\t\t\timgWrapperClassAttr: galleryItem.imgWrapperClassAttr,\n\t\t\tmw: galleryItem.mw,\n\t\t\tmediaClass: galleryItem.mediaClass,\n\t\t\tmediaTag: galleryItem.mediaTag\n\t\t};\n\n\t\treturn [\n\t\t\t{ type: 'mwGalleryImage', attributes: imageAttributes },\n\t\t\t{ type: 'mwGalleryImageCaption' },\n\t\t\t// Actual caption contents are inserted later\n\t\t\t{ type: '/mwGalleryImageCaption' },\n\t\t\t{ type: '/mwGalleryImage' }\n\t\t];\n\t}\n\n\tlet innerRange;\n\tif ( this.selectedNode ) {\n\t\t// Update mwData\n\t\tmwData = ve.copy( this.selectedNode.getAttribute( 'mw' ) );\n\t\tthis.updateMwData( mwData );\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromAttributeChanges(\n\t\t\t\tsurfaceModelDocument,\n\t\t\t\tthis.selectedNode.getOuterRange().start,\n\t\t\t\t{ mw: mwData }\n\t\t\t)\n\t\t);\n\n\t\tinnerRange = this.selectedNode.getRange();\n\t} else {\n\t\t// Make gallery node and mwData\n\t\tconst element = {\n\t\t\ttype: 'mwGallery',\n\t\t\tattributes: {\n\t\t\t\tmw: {\n\t\t\t\t\tname: 'gallery',\n\t\t\t\t\tattrs: {},\n\t\t\t\t\tbody: {}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tmwData = element.attributes.mw;\n\t\tthis.updateMwData( mwData );\n\t\t// Collapse returns a new fragment, so update this.fragment\n\t\tthis.fragment = this.getFragment().collapseToEnd();\n\t\tthis.getFragment().insertContent( [\n\t\t\telement,\n\t\t\t{ type: '/mwGallery' }\n\t\t] );\n\n\t\tinnerRange = new ve.Range( this.fragment.getSelection().getRange().from + 1 );\n\t}\n\n\t// Update all child elements' data, but without the contents of the captions\n\tif ( this.captionDocument.data.hasContent() ) {\n\t\tdata.push(\n\t\t\t{ type: 'mwGalleryCaption' },\n\t\t\t{ type: '/mwGalleryCaption' }\n\t\t);\n\t}\n\t// Build node for each image\n\tfor ( let i = 0, ilen = items.length; i < ilen; i++ ) {\n\t\tve.batchPush( data, getImageLinearData.call( this, items[ i ] ) );\n\t}\n\t// Replace whole contents of this node with the new ones\n\tsurfaceModel.change(\n\t\tve.dm.TransactionBuilder.static.newFromReplacement(\n\t\t\tsurfaceModelDocument,\n\t\t\tinnerRange,\n\t\t\tdata\n\t\t)\n\t);\n\n\t// Minus 2 to skip past </mwGalleryImageCaption></mwGalleryImage>\n\tlet captionInsertionOffset = innerRange.from + data.length - 2;\n\t// Update image captions. In reverse order to avoid having to adjust offsets for each insertion.\n\tfor ( let i = items.length - 1; i >= 0; i-- ) {\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\t\t\tsurfaceModel.getDocument(),\n\t\t\t\tcaptionInsertionOffset,\n\t\t\t\titems[ i ].captionDocument\n\t\t\t)\n\t\t);\n\t\t// Skip past </mwGalleryImageCaption></mwGalleryImage><mwGalleryImage><mwGalleryImageCaption>\n\t\tcaptionInsertionOffset -= 4;\n\t}\n\n\t// Update gallery caption\n\tif ( this.captionDocument.data.hasContent() ) {\n\t\tsurfaceModel.change(\n\t\t\tve.dm.TransactionBuilder.static.newFromDocumentInsertion(\n\t\t\t\tsurfaceModel.getDocument(),\n\t\t\t\t// Plus 1 to skip past <mwGalleryCaption>\n\t\t\t\tinnerRange.from + 1,\n\t\t\t\tthis.captionDocument\n\t\t\t)\n\t\t);\n\t}\n};\n\n/**\n * Update the 'mw' attribute with data from inputs in the dialog.\n *\n * @param {Object} mwData Value of the 'mw' attribute, updated in-place\n * @private\n */\nve.ui.MWGalleryDialog.prototype.updateMwData = function ( mwData ) {\n\t// Need to do this, otherwise mwData.body.extsrc will override all attribute changes\n\tmwData.body = {};\n\t// Need to do this, otherwise it will override the caption from the gallery caption node\n\tdelete mwData.attrs.caption;\n\t// Update attributes\n\tlet mode;\n\tif ( this.modeDropdown.getMenu().findSelectedItem() ) {\n\t\tmode = this.modeDropdown.getMenu().findSelectedItem().getData();\n\t}\n\t// Unset mode attribute if it is the same as the default\n\tmwData.attrs.mode = mode === this.defaults.mode ? undefined : mode;\n\tmwData.attrs.widths = this.widthsInput.getValue() || undefined;\n\tmwData.attrs.heights = this.heightsInput.getValue() || undefined;\n\tmwData.attrs.perrow = this.perRowInput.getValue() || undefined;\n\tmwData.attrs.showfilename = this.showFilenameCheckbox.isSelected() ? 'yes' : undefined;\n\tmwData.attrs.class = this.classesInput.getValue() || undefined;\n\tmwData.attrs.style = this.stylesInput.getValue() || undefined;\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWGalleryDialog );\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/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":720,"column":2,"nodeType":"CallExpression","endLine":725,"endColumn":6}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWMediaDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for inserting and editing MediaWiki media.\n *\n * @class\n * @extends ve.ui.NodeDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWMediaDialog = function VeUiMWMediaDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWMediaDialog.super.call( this, config );\n\n\t// Properties\n\tthis.imageModel = null;\n\tthis.isSettingUpModel = false;\n\tthis.isInsertion = false;\n\tthis.selectedImageInfo = null;\n\tthis.searchCache = {};\n\n\tthis.$element.addClass( 've-ui-mwMediaDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWMediaDialog, ve.ui.NodeDialog );\n\n/* Static Properties */\n\nve.ui.MWMediaDialog.static.name = 'media';\n\nve.ui.MWMediaDialog.static.title =\n\tOO.ui.deferMsg( 'visualeditor-dialog-media-title' );\n\nve.ui.MWMediaDialog.static.size = 'medium';\n\nve.ui.MWMediaDialog.static.actions = [\n\t{\n\t\taction: 'done',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-apply' ),\n\t\tflags: [ 'progressive', 'primary' ],\n\t\tmodes: 'edit'\n\t},\n\t{\n\t\taction: 'insert',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-insert' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: 'insert'\n\t},\n\t{\n\t\taction: 'change',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-change-image' ),\n\t\tmodes: [ 'edit', 'insert' ]\n\t},\n\t{\n\t\taction: 'choose',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-choose-image' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'info' ]\n\t},\n\t{\n\t\taction: 'upload',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-upload' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'upload-upload' ]\n\t},\n\t{\n\t\taction: 'save',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-save' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'upload-info' ]\n\t},\n\t{\n\t\taction: 'cancelchoose',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-goback' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'info' ]\n\t},\n\t{\n\t\taction: 'cancelupload',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-goback' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'upload-info' ]\n\t},\n\t{\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-cancel' ),\n\t\tflags: [ 'safe', 'close' ],\n\t\tmodes: [ 'readonly', 'edit', 'insert', 'select', 'search', 'upload-upload' ]\n\t},\n\t{\n\t\taction: 'back',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-media-goback' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'change' ]\n\t}\n];\n\nve.ui.MWMediaDialog.static.modelClasses = [ ve.dm.MWBlockImageNode, ve.dm.MWInlineImageNode ];\n\nve.ui.MWMediaDialog.static.includeCommands = null;\n\nve.ui.MWMediaDialog.static.excludeCommands = [\n\t// No formatting\n\t'paragraph',\n\t'heading1',\n\t'heading2',\n\t'heading3',\n\t'heading4',\n\t'heading5',\n\t'heading6',\n\t'preformatted',\n\t'blockquote',\n\t// TODO: Decide if tables tools should be allowed\n\t'tableCellHeader',\n\t'tableCellData',\n\t// No structure\n\t'bullet',\n\t'bulletWrapOnce',\n\t'number',\n\t'numberWrapOnce',\n\t'indent',\n\t'outdent'\n];\n\n/**\n * Get the import rules for the surface widget in the dialog\n *\n * @see ve.dm.ElementLinearData#sanitize\n * @return {Object} Import rules\n */\nve.ui.MWMediaDialog.static.getImportRules = function () {\n\tconst rules = ve.copy( ve.init.target.constructor.static.importRules );\n\treturn ve.extendObject(\n\t\trules,\n\t\t{\n\t\t\tall: {\n\t\t\t\tblacklist: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\t// Tables (but not lists) are possible in wikitext with a leading\n\t\t\t\t\t\t// line break but we prevent creating these with the UI\n\t\t\t\t\t\tlist: true,\n\t\t\t\t\t\tlistItem: true,\n\t\t\t\t\t\tdefinitionList: true,\n\t\t\t\t\t\tdefinitionListItem: true,\n\t\t\t\t\t\ttable: true,\n\t\t\t\t\t\ttableCaption: true,\n\t\t\t\t\t\ttableSection: true,\n\t\t\t\t\t\ttableRow: true,\n\t\t\t\t\t\ttableCell: true,\n\t\t\t\t\t\tmwTable: true,\n\t\t\t\t\t\tmwTransclusionTableCell: true\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'blacklist' )\n\t\t\t\t),\n\t\t\t\t// Headings are also possible, but discouraged\n\t\t\t\tconversions: ve.extendObject(\n\t\t\t\t\t{\n\t\t\t\t\t\tmwHeading: 'paragraph'\n\t\t\t\t\t},\n\t\t\t\t\tve.getProp( rules, 'all', 'conversions' )\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t);\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getEscapeAction = function () {\n\tconst backOrClose = this.actions.get( { flags: [ 'back', 'close' ], visible: true } );\n\tif ( backOrClose.length ) {\n\t\treturn backOrClose[ 0 ].getAction();\n\t}\n\treturn null;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getBodyHeight = function () {\n\t// FIXME: This should vary on panel.\n\treturn 600;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWMediaDialog.super.prototype.initialize.call( this );\n\n\t// Main layout\n\tthis.panels = new OO.ui.StackLayout();\n\n\t// Settings panels\n\tthis.mediaSettingsLayout = new OO.ui.IndexLayout( {\n\t\tclasses: [ 've-ui-mwMediaDialog-panel-settings' ]\n\t} );\n\tthis.generalSettingsPanel = new OO.ui.TabPanelLayout( 'general', {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-page-general' )\n\t} );\n\tthis.advancedSettingsPanel = new OO.ui.TabPanelLayout( 'advanced', {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-page-advanced' )\n\t} );\n\n\t// General settings panel\n\n\t// Filename\n\tthis.filenameFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-filename' ),\n\t\ticon: 'image'\n\t} );\n\n\t// Caption\n\tthis.captionTarget = ve.init.target.createTargetWidget( {\n\t\tincludeCommands: this.constructor.static.includeCommands,\n\t\texcludeCommands: this.constructor.static.excludeCommands,\n\t\timportRules: this.constructor.static.getImportRules(),\n\t\tinDialog: this.constructor.static.name,\n\t\tmultiline: false\n\t} );\n\tconst captionField = new OO.ui.FieldLayout( this.captionTarget, {\n\t\talign: 'top'\n\t} );\n\tthis.captionFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-content-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-content-section-help' ),\n\t\tclasses: [ 've-ui-mwMediaDialog-caption-fieldset' ]\n\t} );\n\tthis.captionFieldset.addItems( [ captionField ] );\n\n\t// Alt text\n\tthis.altTextInput = new OO.ui.MultilineTextInputWidget( {\n\t\tspellcheck: true,\n\t\tclasses: [ 've-ui-mwMediaDialog-altText' ],\n\t\tautosize: true,\n\t\trows: 1,\n\t\tallowLinebreaks: false\n\t} );\n\tconst altTextField = new OO.ui.FieldLayout( this.altTextInput, {\n\t\talign: 'top'\n\t} );\n\tconst altTextFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-alttext-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-alttext-section-help' )\n\t} );\n\taltTextFieldset.addItems( [ altTextField ] );\n\n\t// Advanced settings\n\n\t// Position\n\tthis.positionSelect = new ve.ui.AlignWidget( {\n\t\tdir: this.getDir()\n\t} );\n\tconst positionSelectField = new OO.ui.FieldLayout( this.positionSelect );\n\tthis.positionCheckbox = new OO.ui.CheckboxInputWidget();\n\tconst positionCheckboxField = new OO.ui.FieldLayout( this.positionCheckbox, {\n\t\t$overlay: this.$overlay,\n\t\talign: 'inline',\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-position-checkbox' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-position-checkbox-help' )\n\t} );\n\tconst positionFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-position-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-position-section-help' )\n\t} );\n\tpositionFieldset.addItems( [\n\t\tpositionCheckboxField,\n\t\tpositionSelectField\n\t] );\n\n\t// Type\n\tthis.typeSelectDropdown = new OO.ui.DropdownWidget( { $overlay: this.$overlay } );\n\tthis.typeSelect = this.typeSelectDropdown.getMenu();\n\tthis.typeSelect.addItems( [\n\t\t// TODO: Inline images require a bit of further work, will be coming soon\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'thumb',\n\t\t\ticon: 'imageLayoutThumbnail',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-thumb' )\n\t\t} ),\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'frameless',\n\t\t\ticon: 'imageLayoutFrameless',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-frameless' )\n\t\t} ),\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'frame',\n\t\t\ticon: 'imageLayoutFrame',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-frame' )\n\t\t} ),\n\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\tdata: 'none',\n\t\t\ticon: 'imageLayoutBasic',\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-none' )\n\t\t} )\n\t] );\n\tconst typeSelectField = new OO.ui.FieldLayout( this.typeSelectDropdown, {\n\t\talign: 'top'\n\t} );\n\tthis.borderCheckbox = new OO.ui.CheckboxInputWidget();\n\tconst borderField = new OO.ui.FieldLayout( this.borderCheckbox, {\n\t\talign: 'inline',\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-border' )\n\t} );\n\tthis.typeFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-type-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-type-section-help' )\n\t} );\n\tthis.typeFieldset.addItems( [\n\t\ttypeSelectField,\n\t\tborderField\n\t] );\n\n\t// Size\n\tthis.sizeWidget = new ve.ui.MediaSizeWidget( undefined, {\n\t\tdimensionsAlign: 'top'\n\t} );\n\tconst sizeWidgetField = new OO.ui.FieldLayout( this.sizeWidget );\n\tthis.sizeFieldset = new OO.ui.FieldsetLayout( {\n\t\t$overlay: this.$overlay,\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-size-section' ),\n\t\thelp: ve.msg( 'visualeditor-dialog-media-size-section-help' )\n\t} );\n\tthis.sizeFieldset.addItems( [\n\t\tsizeWidgetField\n\t] );\n\n\t// Search, upload and info layouts\n\tthis.mediaSearchPanel = new OO.ui.TabPanelLayout( {\n\t\tclasses: [ 've-ui-mwMediaDialog-panel-search' ],\n\t\tscrollable: true\n\t} );\n\tif ( mw.ForeignStructuredUpload && mw.ForeignStructuredUpload.BookletLayout ) {\n\t\tthis.mediaUploadBooklet = new mw.ForeignStructuredUpload.BookletLayout( {\n\t\t\t$overlay: this.$overlay\n\t\t} );\n\t}\n\tthis.mediaImageInfoPanel = new OO.ui.TabPanelLayout( {\n\t\tclasses: [ 've-ui-mwMediaDialog-panel-imageinfo' ],\n\t\tscrollable: false\n\t} );\n\tthis.$infoPanelWrapper = $( '<div>' ).addClass( 've-ui-mwMediaDialog-panel-imageinfo-wrapper' );\n\n\t// Search and upload panels\n\tthis.searchTabs = new OO.ui.IndexLayout();\n\tconst searchPanel = new OO.ui.TabPanelLayout( 'search', {\n\t\tlabel: ve.msg( 'visualeditor-dialog-media-search-tab-search' )\n\t} );\n\tlet uploadPanel;\n\tif ( this.mediaUploadBooklet ) {\n\t\tuploadPanel = new OO.ui.TabPanelLayout( 'upload', {\n\t\t\tlabel: ve.msg( 'visualeditor-dialog-media-search-tab-upload' ),\n\t\t\tcontent: [ this.mediaUploadBooklet ]\n\t\t} );\n\t}\n\n\t// Search widget\n\tthis.search = new mw.widgets.MediaSearchWidget( {\n\t\trowHeight: OO.ui.isMobile() ? 120 : 200\n\t} );\n\n\t// Events\n\tthis.positionCheckbox.connect( this, { change: 'onPositionCheckboxChange' } );\n\tthis.borderCheckbox.connect( this, { change: 'onBorderCheckboxChange' } );\n\tthis.positionSelect.connect( this, { choose: 'onPositionSelectChoose' } );\n\tthis.typeSelect.connect( this, { choose: 'onTypeSelectChoose' } );\n\tthis.search.getQuery().connect( this, { change: 'onSearchQueryChange' } );\n\tthis.search.getQuery().$indicator.on( 'mousedown', this.onSearchQueryClear.bind( this ) );\n\tthis.search.getResults().connect( this, { choose: 'onSearchResultsChoose' } );\n\tthis.captionTarget.connect( this, { change: 'checkChanged' } );\n\tthis.altTextInput.connect( this, { change: 'onAlternateTextChange' } );\n\tthis.searchTabs.connect( this, { set: 'onSearchTabsSet' } );\n\tif ( this.mediaUploadBooklet ) {\n\t\tthis.mediaUploadBooklet.connect( this, {\n\t\t\tset: 'onMediaUploadBookletSet',\n\t\t\tuploadValid: 'onUploadValid',\n\t\t\tinfoValid: 'onInfoValid'\n\t\t} );\n\t}\n\n\t// Append panels\n\tsearchPanel.$element.append( this.search.$element );\n\tthis.searchTabs.addTabPanels( [ searchPanel ] );\n\tif ( this.mediaUploadBooklet ) {\n\t\tthis.searchTabs.addTabPanels( [ uploadPanel ] );\n\t}\n\tthis.mediaSearchPanel.$element.append(\n\t\tthis.searchTabs.$element\n\t);\n\tthis.generalSettingsPanel.$element.append(\n\t\tthis.filenameFieldset.$element,\n\t\tthis.captionFieldset.$element,\n\t\taltTextFieldset.$element\n\t);\n\tthis.advancedSettingsPanel.$element.append(\n\t\tpositionFieldset.$element,\n\t\tthis.typeFieldset.$element,\n\t\tthis.sizeFieldset.$element\n\t);\n\tthis.mediaSettingsLayout.addTabPanels( [\n\t\tthis.generalSettingsPanel,\n\t\tthis.advancedSettingsPanel\n\t] );\n\tthis.panels.addItems( [\n\t\tthis.mediaSearchPanel,\n\t\tthis.mediaImageInfoPanel,\n\t\tthis.mediaSettingsLayout\n\t] );\n\tthis.$body.append( this.panels.$element );\n};\n\n/**\n * Handle set events from the search tabs\n *\n * @param {OO.ui.TabPanelLayout} tabPanel Current tabPanel\n */\nve.ui.MWMediaDialog.prototype.onSearchTabsSet = function ( tabPanel ) {\n\tconst name = tabPanel.getName();\n\n\tthis.actions.setMode( name );\n\n\tswitch ( name ) {\n\t\tcase 'search':\n\t\t\tthis.setSize( 'larger' );\n\t\t\tbreak;\n\n\t\tcase 'upload':\n\t\t\t// Initialize and reset the upload booklet if it hasn't\n\t\t\t// been initiailized since setup.\n\t\t\tif ( !this.mediaUploadBookletInit ) {\n\t\t\t\tthis.mediaUploadBookletInit = true;\n\t\t\t\tthis.mediaUploadBooklet.initialize();\n\t\t\t}\n\t\t\tthis.setSize( 'medium' );\n\t\t\tthis.uploadPageNameSet( 'upload' );\n\t\t\tbreak;\n\t}\n};\n\n/**\n * Handle panelNameSet events from the upload stack\n *\n * @param {OO.ui.PageLayout} page Current page\n */\nve.ui.MWMediaDialog.prototype.onMediaUploadBookletSet = function ( page ) {\n\tthis.uploadPageNameSet( page.getName() );\n};\n\n/**\n * The upload booklet's page name has changed\n *\n * @param {string} pageName Page name\n */\nve.ui.MWMediaDialog.prototype.uploadPageNameSet = function ( pageName ) {\n\tif ( pageName === 'insert' ) {\n\t\tconst imageInfo = this.mediaUploadBooklet.upload.getImageInfo();\n\t\tthis.chooseImageInfo( imageInfo );\n\t} else {\n\t\t// Hide the tabs after the first page\n\t\tthis.searchTabs.toggleMenu( pageName === 'upload' );\n\n\t\tthis.actions.setMode( 'upload-' + pageName );\n\t}\n};\n\n/**\n * Handle uploadValid events\n *\n * @param {boolean} isValid The panel is complete and valid\n */\nve.ui.MWMediaDialog.prototype.onUploadValid = function ( isValid ) {\n\tthis.actions.setAbilities( { upload: isValid } );\n};\n\n/**\n * Handle infoValid events\n *\n * @param {boolean} isValid The panel is complete and valid\n */\nve.ui.MWMediaDialog.prototype.onInfoValid = function ( isValid ) {\n\tthis.actions.setAbilities( { save: isValid } );\n};\n\n/**\n * Build the image info panel from the information in the API.\n * Use the metadata info if it exists.\n * Note: Some information in the metadata object needs to be safely\n * stripped from its html wrappers.\n *\n * @param {Object} imageinfo Image info\n */\nve.ui.MWMediaDialog.prototype.buildMediaInfoPanel = function ( imageinfo ) {\n\tconst contentDirection = this.getFragment().getDocument().getDir(),\n\t\timageTitleText = imageinfo.title || imageinfo.canonicaltitle,\n\t\timageTitle = new OO.ui.LabelWidget( {\n\t\t\tlabel: mw.Title.newFromText( imageTitleText ).getNameText()\n\t\t} ),\n\t\tmetadata = imageinfo.extmetadata,\n\t\t// Field configuration (in order)\n\t\tapiDataKeysConfig = [\n\t\t\t{\n\t\t\t\tname: 'ImageDescription',\n\t\t\t\tvalue: ve.getProp( metadata, 'ImageDescription', 'value' ),\n\t\t\t\tformat: 'html',\n\t\t\t\tview: {\n\t\t\t\t\ttype: 'description',\n\t\t\t\t\tprimary: true,\n\t\t\t\t\tdescriptionHeight: '5em'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: '$fileDetails',\n\t\t\t\t// Real value is set later\n\t\t\t\tvalue: '',\n\t\t\t\tformat: 'html',\n\t\t\t\tview: { icon: 'image' }\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'LicenseShortName',\n\t\t\t\tvalue: ve.getProp( metadata, 'LicenseShortName', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: {\n\t\t\t\t\thref: ve.getProp( metadata, 'LicenseUrl', 'value' ),\n\t\t\t\t\ticon: this.getLicenseIcon( ve.getProp( metadata, 'LicenseShortName', 'value' ) )\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Artist',\n\t\t\t\tvalue: ve.getProp( metadata, 'Artist', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: {\n\t\t\t\t\t// \"Artist\" label\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-meta-artist',\n\t\t\t\t\ticon: 'userAvatar'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Credit',\n\t\t\t\tvalue: ve.getProp( metadata, 'Credit', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: { icon: 'userAvatar' }\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'user',\n\t\t\t\tvalue: imageinfo.user,\n\t\t\t\tformat: 'plaintext',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'userAvatar',\n\t\t\t\t\t// This is 'uploaded by'\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-artist'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'timestamp',\n\t\t\t\tvalue: imageinfo.timestamp,\n\t\t\t\tformat: 'plaintext',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'clock',\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-uploaded',\n\t\t\t\t\tisDate: true\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'DateTimeOriginal',\n\t\t\t\tvalue: ve.getProp( metadata, 'DateTimeOriginal', 'value' ),\n\t\t\t\tformat: 'html-remove-formatting',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'clock',\n\t\t\t\t\tlabelMsg: 'visualeditor-dialog-media-info-created'\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'moreinfo',\n\t\t\t\tvalue: ve.msg( 'visualeditor-dialog-media-info-moreinfo' ),\n\t\t\t\tformat: 'plaintext',\n\t\t\t\tview: {\n\t\t\t\t\ticon: 'info',\n\t\t\t\t\thref: imageinfo.descriptionurl\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\tfields = {},\n\t\t// Store clean API data\n\t\tapiData = {},\n\t\tfileType = this.getFileType( imageinfo.url ),\n\t\t$thumbContainer = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-thumb' ),\n\t\t$main = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-main' ),\n\t\t$details = $( '<div>' )\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-details' ),\n\t\t$image = $( '<img>' );\n\n\t// Main section - title\n\t$main.append(\n\t\timageTitle.$element\n\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-title' )\n\t);\n\n\t// Clean data from the API responses\n\tfor ( let i = 0; i < apiDataKeysConfig.length; i++ ) {\n\t\tconst field = apiDataKeysConfig[ i ].name;\n\t\tif ( apiDataKeysConfig[ i ].format === 'html' ) {\n\t\t\tapiData[ field ] = new OO.ui.HtmlSnippet( apiDataKeysConfig[ i ].value );\n\n\t\t} else if ( apiDataKeysConfig[ i ].format === 'html-remove-formatting' ) {\n\t\t\tapiData[ field ] = this.cleanAPIresponse( apiDataKeysConfig[ i ].value );\n\n\t\t} else if ( apiDataKeysConfig[ i ].format === 'plaintext' ) {\n\t\t\tapiData[ field ] = apiDataKeysConfig[ i ].value;\n\n\t\t} else {\n\t\t\tthrow new Error( 'Unexpected metadata field format' );\n\t\t}\n\t}\n\n\t// Add sizing info for non-audio images\n\tif ( imageinfo.mediatype === 'AUDIO' ) {\n\t\t// Label this file as an audio\n\t\tapiData.$fileDetails = $( '<span>' )\n\t\t\t.text( ve.msg( 'visualeditor-dialog-media-info-audiofile' ) );\n\t} else {\n\t\t// Build the display for image size and type\n\t\tapiData.$fileDetails = $( '<div>' )\n\t\t\t.append(\n\t\t\t\t$( '<span>' ).text(\n\t\t\t\t\timageinfo.width +\n\t\t\t\t\t'\\u00a0' +\n\t\t\t\t\tve.msg( 'visualeditor-dimensionswidget-times' ) +\n\t\t\t\t\t'\\u00a0' +\n\t\t\t\t\timageinfo.height +\n\t\t\t\t\tve.msg( 'visualeditor-dimensionswidget-px' )\n\t\t\t\t),\n\t\t\t\t$( '<span>' )\n\t\t\t\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-separator' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-media-info-separator' ) ),\n\t\t\t\t$( '<span>' ).text( fileType )\n\t\t\t);\n\t}\n\n\t// Attach all fields in order\n\tfor ( let i = 0; i < apiDataKeysConfig.length; i++ ) {\n\t\tconst field = apiDataKeysConfig[ i ].name;\n\t\tif ( apiData[ field ] ) {\n\t\t\tconst $section = apiDataKeysConfig[ i ].view.primary ? $main : $details;\n\n\t\t\tfields[ field ] = new ve.ui.MWMediaInfoFieldWidget( apiData[ field ], apiDataKeysConfig[ i ].view );\n\t\t\t$section.append( fields[ field ].$element );\n\t\t}\n\t}\n\n\t// Build the info panel\n\tconst $info = $( '<div>' )\n\t\t.addClass( 've-ui-mwMediaDialog-panel-imageinfo-info' )\n\t\t.append(\n\t\t\t$main.prop( 'dir', contentDirection ),\n\t\t\t$details\n\t\t);\n\tve.targetLinksToNewWindow( $info[ 0 ] );\n\n\t// Initialize thumb container\n\t$thumbContainer\n\t\t.append( $image.prop( 'src', imageinfo.thumburl ) );\n\n\tthis.$infoPanelWrapper.append(\n\t\t$thumbContainer,\n\t\t$info\n\t);\n\n\t// Force a scrollbar to the screen before we measure it\n\tthis.mediaImageInfoPanel.$element.css( 'overflow-y', 'scroll' );\n\tconst windowWidth = this.mediaImageInfoPanel.$element.width();\n\n\t// Define thumbnail size\n\tlet newDimensions;\n\tif ( imageinfo.mediatype === 'AUDIO' ) {\n\t\t// HACK: We are getting the wrong information from the\n\t\t// API about audio files. Set their thumbnail to square\n\t\tnewDimensions = {\n\t\t\twidth: imageinfo.thumbwidth,\n\t\t\theight: imageinfo.thumbwidth\n\t\t};\n\t} else {\n\t\t// For regular images, calculate a bigger image dimensions\n\t\tnewDimensions = ve.dm.MWImageNode.static.resizeToBoundingBox(\n\t\t\t// Original image dimensions\n\t\t\t{\n\t\t\t\twidth: imageinfo.width,\n\t\t\t\theight: imageinfo.height\n\t\t\t},\n\t\t\t// Bounding box -- the size of the dialog, minus padding\n\t\t\t{\n\t\t\t\twidth: windowWidth,\n\t\t\t\theight: this.getBodyHeight() - 120\n\t\t\t}\n\t\t);\n\t}\n\t// Resize the image\n\t$image.css( {\n\t\twidth: newDimensions.width,\n\t\theight: newDimensions.height\n\t} );\n\n\t// Call for a bigger image\n\tthis.fetchThumbnail( imageTitleText, newDimensions )\n\t\t.done( ( thumburl ) => {\n\t\t\tif ( thumburl ) {\n\t\t\t\t$image.prop( 'src', thumburl );\n\t\t\t}\n\t\t} );\n\n\tconst isPortrait = newDimensions.width < ( windowWidth * 3 / 5 );\n\tthis.mediaImageInfoPanel.$element.toggleClass( 've-ui-mwMediaDialog-panel-imageinfo-portrait', isPortrait );\n\tthis.mediaImageInfoPanel.$element.append( this.$infoPanelWrapper );\n\tif ( isPortrait ) {\n\t\t$info.outerWidth( Math.floor( windowWidth - $thumbContainer.outerWidth( true ) - 15 ) );\n\t}\n\n\t// Initialize fields\n\tfor ( const field in fields ) {\n\t\tfields[ field ].initialize();\n\t}\n\t// Let the scrollbar appear naturally if it should\n\tthis.mediaImageInfoPanel.$element.css( 'overflow', '' );\n};\n\n/**\n * Fetch a bigger image thumbnail from the API.\n *\n * @param {string} imageName Image source\n * @param {Object} dimensions Image dimensions\n * @return {jQuery.Promise} Thumbnail promise that resolves with new thumb url\n */\nve.ui.MWMediaDialog.prototype.fetchThumbnail = function ( imageName, dimensions ) {\n\t// Check cache first\n\tif ( this.searchCache[ imageName ] ) {\n\t\treturn ve.createDeferred().resolve( this.searchCache[ imageName ] );\n\t}\n\n\tconst params = {\n\t\taction: 'query',\n\t\tprop: 'imageinfo',\n\t\tiiprop: 'url',\n\t\ttitles: imageName\n\t};\n\n\tif ( dimensions.width ) {\n\t\tparams.iiurlwidth = dimensions.width;\n\t}\n\tif ( dimensions.height ) {\n\t\tparams.iiurlheight = dimensions.height;\n\t}\n\treturn ve.init.target.getContentApi( this.getFragment().getDocument() ).get( params )\n\t\t.then( ( response ) => {\n\t\t\tconst thumburl = ve.getProp( response.query.pages[ 0 ], 'imageinfo', 0, 'thumburl' );\n\t\t\t// Cache\n\t\t\tthis.searchCache[ imageName ] = thumburl;\n\t\t\treturn thumburl;\n\t\t} );\n};\n\n/**\n * Clean the API responses and return it in plaintext. If needed, truncate.\n *\n * @param {string} html Raw response from the API\n * @return {string} Plaintext clean response\n */\nve.ui.MWMediaDialog.prototype.cleanAPIresponse = function ( html ) {\n\tlet text = $( $.parseHTML( html ) ).text();\n\n\t// Check if the string should be truncated\n\tconst charLimit = 50;\n\tif ( text.length > charLimit ) {\n\t\tconst ellipsis = ve.msg( 'visualeditor-dialog-media-info-ellipsis' );\n\t\ttext = text.slice( 0, charLimit ) + ellipsis;\n\t}\n\n\treturn text;\n};\n\n/**\n * Get the file type from the suffix of the url\n *\n * @param {string} url Full file url\n * @return {string} File type\n */\nve.ui.MWMediaDialog.prototype.getFileType = function ( url ) {\n\t// TODO: Validate these types, and work with icons\n\t// SVG, PNG, JPEG, GIF, TIFF, XCF;\n\t// OGA, OGG, MIDI, WAV;\n\t// WEBM, OGV, OGX;\n\t// APNG;\n\t// PDF, DJVU\n\treturn url.split( '.' ).pop().toUpperCase();\n};\n\n/**\n * Get the proper icon for the license if it is recognized\n * or general info icon if it is not recognized.\n *\n * @param {string} license License short name\n * @return {string} Icon name\n */\nve.ui.MWMediaDialog.prototype.getLicenseIcon = function ( license ) {\n\tif ( !license ) {\n\t\treturn 'info';\n\t}\n\n\tconst normalized = license.toLowerCase().replace( /[-_]/g, ' ' );\n\n\t// FIXME: Structured data from Commons will make this properly\n\t// multilingual. For now, this is the limit of what is sensible.\n\tif ( /^((cc )?pd|public domain)/.test( normalized ) ) {\n\t\treturn 'public-domain';\n\t} else if ( /^cc (by|sa)?/.test( normalized ) ) {\n\t\treturn 'logoCC';\n\t} else {\n\t\treturn 'info';\n\t}\n};\n\n/**\n * Handle search results choose event.\n *\n * @param {mw.widgets.MediaResultWidget} item Chosen item\n */\nve.ui.MWMediaDialog.prototype.onSearchResultsChoose = function ( item ) {\n\tthis.chooseImageInfo( item.getData() );\n\n\tve.track( 'activity.' + this.constructor.static.name, {\n\t\taction: 'search-choose-image'\n\t} );\n};\n\n/**\n * Handle query change events from the search input widget\n *\n * @param {string} query\n */\nve.ui.MWMediaDialog.prototype.onSearchQueryChange = function ( query ) {\n\tif ( query === '' ) {\n\t\treturn;\n\t}\n\n\tve.track( 'activity.' + this.constructor.static.name, {\n\t\taction: 'search-change-query'\n\t} );\n};\n\n/**\n * Handle clearing of search query by user clicking on indicator\n */\nve.ui.MWMediaDialog.prototype.onSearchQueryClear = function () {\n\tve.track( 'activity.' + this.constructor.static.name, {\n\t\taction: 'search-clear-query'\n\t} );\n};\n\n/**\n * Choose image info for editing\n *\n * @param {Object} info Image info\n */\nve.ui.MWMediaDialog.prototype.chooseImageInfo = function ( info ) {\n\tthis.$infoPanelWrapper.empty();\n\t// Switch panels\n\tthis.selectedImageInfo = info;\n\tthis.switchPanels( 'imageInfo' );\n\t// Build info panel\n\tthis.buildMediaInfoPanel( info );\n};\n\n/**\n * Handle new image being chosen.\n *\n * @param {mw.widgets.MediaResultWidget|null} item Selected item\n */\nve.ui.MWMediaDialog.prototype.confirmSelectedImage = function () {\n\tconst obj = {},\n\t\tinfo = this.selectedImageInfo;\n\n\tif ( info ) {\n\t\tconst imageTitleText = info.title || info.canonicaltitle;\n\t\t// Run title through mw.Title so the File: prefix is localised\n\t\tconst title = mw.Title.newFromText( imageTitleText ).getPrefixedText();\n\t\tif ( !this.imageModel ) {\n\t\t\t// Create a new image model based on default attributes\n\t\t\tthis.imageModel = ve.dm.MWImageModel.static.newFromImageAttributes(\n\t\t\t\t{\n\t\t\t\t\t// Per https://www.mediawiki.org/w/?diff=931265&oldid=prev\n\t\t\t\t\thref: './' + title,\n\t\t\t\t\tsrc: info.url,\n\t\t\t\t\tresource: './' + title,\n\t\t\t\t\twidth: info.thumbwidth,\n\t\t\t\t\theight: info.thumbheight,\n\t\t\t\t\tmediaType: info.mediatype,\n\t\t\t\t\ttype: 'thumb',\n\t\t\t\t\talign: 'default',\n\t\t\t\t\tdefaultSize: true,\n\t\t\t\t\timageClassAttr: 'mw-file-element'\n\t\t\t\t},\n\t\t\t\tthis.getFragment().getDocument()\n\t\t\t);\n\t\t\tthis.attachImageModel();\n\t\t\tthis.resetCaption();\n\t\t} else {\n\t\t\t// Update the current image model with the new image source\n\t\t\tthis.imageModel.changeImageSource(\n\t\t\t\t{\n\t\t\t\t\tmediaType: info.mediatype,\n\t\t\t\t\thref: './' + title,\n\t\t\t\t\tsrc: info.url,\n\t\t\t\t\tresource: './' + title\n\t\t\t\t},\n\t\t\t\tinfo\n\t\t\t);\n\t\t\tthis.updateFilenameFieldset();\n\t\t}\n\n\t\t// Cache\n\t\t// We're trimming the stored data down to be consistent with what\n\t\t// ImageInfoCache.getRequestPromise fetches.\n\t\tobj[ imageTitleText ] = {\n\t\t\tsize: info.size,\n\t\t\twidth: info.width,\n\t\t\theight: info.height,\n\t\t\tmediatype: info.mediatype\n\t\t};\n\t\tve.init.platform.imageInfoCache.set( obj );\n\n\t\tthis.checkChanged();\n\t\tthis.switchPanels( 'edit' );\n\n\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\taction: 'search-confirm-image'\n\t\t} );\n\t}\n};\n\n/**\n * Update the filename fieldset (link to media page)\n */\nve.ui.MWMediaDialog.prototype.updateFilenameFieldset = function () {\n\tconst title = mw.Title.newFromText( mw.libs.ve.normalizeParsoidResourceName( this.imageModel.getResourceName() ) );\n\tthis.filenameFieldset.setLabel(\n\t\t$( '<span>' ).append(\n\t\t\t$( document.createTextNode( this.imageModel.getFilename() + ' ' ) ),\n\t\t\t$( '<a>' )\n\t\t\t\t.addClass( 've-ui-mwMediaDialog-description-link' )\n\t\t\t\t.attr( 'href', title.getUrl() )\n\t\t\t\t.attr( 'target', '_blank' )\n\t\t\t\t.attr( 'rel', 'noopener' )\n\t\t\t\t.text( ve.msg( 'visualeditor-dialog-media-content-description-link' ) )\n\t\t)\n\t);\n};\n\n/**\n * Handle image model alignment change\n *\n * @param {string} alignment Image alignment\n */\nve.ui.MWMediaDialog.prototype.onImageModelAlignmentChange = function ( alignment ) {\n\talignment = alignment || 'none';\n\n\t// Select the item without triggering the 'choose' event\n\tthis.positionSelect.selectItemByData( alignment !== 'none' ? alignment : undefined );\n\n\tthis.positionCheckbox.setSelected( alignment !== 'none' );\n\tthis.checkChanged();\n};\n\n/**\n * Handle image model type change\n *\n * @param {string} type Image type\n */\nve.ui.MWMediaDialog.prototype.onImageModelTypeChange = function ( type ) {\n\tthis.typeSelect.selectItemByData( type );\n\n\tthis.borderCheckbox.setDisabled(\n\t\t!this.imageModel.isBorderable()\n\t);\n\n\tthis.borderCheckbox.setSelected(\n\t\tthis.imageModel.isBorderable() && this.imageModel.hasBorder()\n\t);\n\tthis.checkChanged();\n};\n\n/**\n * Handle change event on the positionCheckbox element.\n *\n * @param {boolean} isSelected Checkbox status\n */\nve.ui.MWMediaDialog.prototype.onPositionCheckboxChange = function ( isSelected ) {\n\tconst currentModelAlignment = this.imageModel.getAlignment();\n\n\tthis.positionSelect.setDisabled( !isSelected );\n\tthis.checkChanged();\n\t// Only update the model if the current value is different than that\n\t// of the image model\n\tif (\n\t\t( currentModelAlignment === 'none' && isSelected ) ||\n\t\t( currentModelAlignment !== 'none' && !isSelected )\n\t) {\n\t\tif ( isSelected ) {\n\t\t\t// Picking a floating alignment value will create a block image\n\t\t\t// no matter what the type is, so in here we want to calculate\n\t\t\t// the default alignment of a block to set as our initial alignment\n\t\t\t// in case the checkbox is clicked but there was no alignment set\n\t\t\t// previously.\n\t\t\tconst newPositionValue = this.imageModel.getDefaultDir( 'mwBlockImage' );\n\t\t\tthis.imageModel.setAlignment( newPositionValue );\n\t\t} else {\n\t\t\t// If we're unchecking the box, always set alignment to none and unselect the position widget\n\t\t\tthis.imageModel.setAlignment( 'none' );\n\t\t}\n\t}\n};\n\n/**\n * Handle change event on the positionCheckbox element.\n *\n * @param {boolean} isSelected Checkbox status\n */\nve.ui.MWMediaDialog.prototype.onBorderCheckboxChange = function ( isSelected ) {\n\t// Only update if the value is different than the model\n\tif ( this.imageModel.hasBorder() !== isSelected ) {\n\t\t// Update the image model\n\t\tthis.imageModel.toggleBorder( isSelected );\n\t\tthis.checkChanged();\n\t}\n};\n\n/**\n * Handle change event on the positionSelect element.\n *\n * @param {OO.ui.ButtonOptionWidget} item Selected item\n */\nve.ui.MWMediaDialog.prototype.onPositionSelectChoose = function ( item ) {\n\tconst position = item.getData();\n\n\t// Only update if the value is different than the model\n\tif ( this.imageModel.getAlignment() !== position ) {\n\t\tthis.imageModel.setAlignment( position );\n\t\tthis.checkChanged();\n\t}\n};\n\n/**\n * Handle change event on the typeSelect element.\n *\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nve.ui.MWMediaDialog.prototype.onTypeSelectChoose = function ( item ) {\n\tconst type = item.getData();\n\n\t// Only update if the value is different than the model\n\tif ( this.imageModel.getType() !== type ) {\n\t\tthis.imageModel.setType( type );\n\t\tthis.checkChanged();\n\t}\n\n\t// If type is 'frame', custom size is ignored\n\tif ( type === 'frame' ) {\n\t\tthis.sizeWidget.setSizeType( 'default' );\n\t}\n};\n\n/**\n * Handle changeSizeType events from the MediaSizeWidget\n *\n * @param {string} sizeType Size type\n */\nve.ui.MWMediaDialog.prototype.onChangeSizeType = function ( sizeType ) {\n\t// type=frame is not resizeable, so change it to type=thumb\n\tif ( sizeType === 'custom' && this.imageModel.getType() === 'frame' ) {\n\t\tthis.imageModel.setType( 'thumb' );\n\t}\n\n\tthis.checkChanged();\n};\n\n/**\n * Respond to change in alternate text\n *\n * @param {string} text New alternate text\n */\nve.ui.MWMediaDialog.prototype.onAlternateTextChange = function ( text ) {\n\tthis.imageModel.setAltText( text );\n\tthis.checkChanged();\n};\n\n/**\n * When changes occur, enable the apply button.\n */\nve.ui.MWMediaDialog.prototype.checkChanged = function () {\n\tlet captionChanged = false;\n\n\t// Only check 'changed' status after the model has finished\n\t// building itself\n\tif ( !this.isSettingUpModel ) {\n\t\tcaptionChanged = !!this.captionTarget && this.captionTarget.hasBeenModified();\n\n\t\tif (\n\t\t\tthis.imageModel &&\n\t\t\t// Activate or deactivate the apply/insert buttons\n\t\t\t// Make sure sizes are valid first\n\t\t\tthis.sizeWidget.isValid() &&\n\t\t\t(\n\t\t\t\t// Check that the model or caption changed\n\t\t\t\tthis.isInsertion ||\n\t\t\t\tcaptionChanged ||\n\t\t\t\tthis.imageModel.hasBeenModified()\n\t\t\t)\n\t\t) {\n\t\t\tthis.actions.setAbilities( { insert: true, done: true } );\n\t\t} else {\n\t\t\tthis.actions.setAbilities( { insert: false, done: false } );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWMediaDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tconst isReadOnly = this.isReadOnly();\n\n\t\t\t// Set language for search results\n\t\t\tthis.search.setLang( this.getFragment().getDocument().getLang() );\n\n\t\t\tif ( this.selectedNode ) {\n\t\t\t\tthis.isInsertion = false;\n\t\t\t\t// Create image model\n\t\t\t\tthis.imageModel = ve.dm.MWImageModel.static.newFromImageNode( this.selectedNode );\n\t\t\t\tthis.attachImageModel();\n\n\t\t\t\tif ( !this.imageModel.isDefaultSize() ) {\n\t\t\t\t\t// To avoid dirty diff in case where only the image changes,\n\t\t\t\t\t// we will store the initial bounding box, in case the image\n\t\t\t\t\t// is not defaultSize\n\t\t\t\t\tthis.imageModel.setBoundingBox( this.imageModel.getCurrentDimensions() );\n\t\t\t\t}\n\t\t\t\t// Store initial hash to compare against\n\t\t\t\tthis.imageModel.storeInitialHash( this.imageModel.getHashObject() );\n\t\t\t} else {\n\t\t\t\tthis.isInsertion = true;\n\t\t\t}\n\n\t\t\tthis.search.setup();\n\t\t\t// Try to populate with user uploads\n\t\t\tthis.search.queryMediaQueue();\n\t\t\tthis.resetCaption();\n\n\t\t\tthis.altTextInput.setReadOnly( isReadOnly );\n\t\t\tthis.positionCheckbox.setDisabled( isReadOnly );\n\t\t\t// TODO: This widget is not readable when disabled\n\t\t\tthis.positionSelect.setDisabled( isReadOnly );\n\t\t\tthis.typeSelectDropdown.setDisabled( isReadOnly );\n\t\t\tthis.borderCheckbox.setDisabled( isReadOnly );\n\t\t\tthis.sizeWidget.setDisabled( isReadOnly );\n\n\t\t\t// Pass `true` to avoid focussing. If we focus the image caption widget during dialog\n\t\t\t// opening, and it wants to display a context menu, it will be mispositioned.\n\t\t\tthis.switchPanels( this.selectedNode ? 'edit' : 'search', true );\n\n\t\t\tthis.actions.setAbilities( { upload: false, save: false, insert: false, done: false } );\n\n\t\t\tthis.mediaUploadBookletInit = false;\n\t\t\tif ( data.file && this.mediaUploadBooklet ) {\n\t\t\t\tthis.searchTabs.setTabPanel( 'upload' );\n\t\t\t\tthis.mediaUploadBooklet.setFile( data.file );\n\t\t\t}\n\t\t} );\n};\n\n/**\n * Switch between the edit and insert/search panels\n *\n * @param {string} panel Panel name\n * @param {boolean} [noFocus=false] Do not put focus into the default field of the panel\n */\nve.ui.MWMediaDialog.prototype.switchPanels = function ( panel, noFocus ) {\n\tswitch ( panel ) {\n\t\tcase 'edit':\n\t\t\tthis.setSize( this.constructor.static.size );\n\t\t\t// Set the edit panel\n\t\t\tthis.panels.setItem( this.mediaSettingsLayout );\n\t\t\t// Focus the general settings page\n\t\t\tthis.mediaSettingsLayout.setTabPanel( 'general' );\n\t\t\t// Parent functionality (edit/insert/readonly)\n\t\t\tthis.actions.setMode( this.getMode() );\n\t\t\tif ( !noFocus ) {\n\t\t\t\t// Focus the caption surface\n\t\t\t\tthis.captionTarget.focus();\n\t\t\t}\n\t\t\t// Auto-sized alt text field is populated while hidden,\n\t\t\t// so force a manual resize now.\n\t\t\tthis.altTextInput.adjustSize( true );\n\t\t\tbreak;\n\t\tcase 'search':\n\t\t\tthis.setSize( 'larger' );\n\t\t\tthis.selectedImageInfo = null;\n\t\t\t// Set the edit panel\n\t\t\tthis.panels.setItem( this.mediaSearchPanel );\n\t\t\tthis.searchTabs.setTabPanel( 'search' );\n\t\t\tthis.searchTabs.toggleMenu( true );\n\t\t\tthis.actions.setMode( this.imageModel ? 'change' : 'select' );\n\t\t\tif ( !noFocus ) {\n\t\t\t\tthis.search.getQuery().focus().select();\n\t\t\t}\n\t\t\t// Layout pending items\n\t\t\tthis.search.runLayoutQueue();\n\t\t\tbreak;\n\t\tdefault:\n\t\tcase 'imageInfo':\n\t\t\tthis.setSize( 'larger' );\n\t\t\t// Hide/show buttons\n\t\t\tthis.actions.setMode( 'info' );\n\t\t\t// Hide/show the panels\n\t\t\tthis.panels.setItem( this.mediaImageInfoPanel );\n\t\t\tbreak;\n\t}\n\tthis.currentPanel = panel || 'imageinfo';\n};\n\n/**\n * Attach the image model to the dialog\n */\nve.ui.MWMediaDialog.prototype.attachImageModel = function () {\n\tif ( this.imageModel ) {\n\t\tthis.imageModel.disconnect( this );\n\t\tthis.sizeWidget.disconnect( this );\n\t}\n\n\t// Events\n\tthis.imageModel.connect( this, {\n\t\talignmentChange: 'onImageModelAlignmentChange',\n\t\ttypeChange: 'onImageModelTypeChange',\n\t\tsizeDefaultChange: 'checkChanged'\n\t} );\n\n\t// Set up\n\t// Ignore the following changes in validation while we are\n\t// setting up the initial tools according to the model state\n\tthis.isSettingUpModel = true;\n\n\t// Filename\n\tthis.updateFilenameFieldset();\n\n\t// Size widget\n\tthis.sizeWidget.setScalable( this.imageModel.getScalable() );\n\tthis.sizeWidget.connect( this, {\n\t\tchangeSizeType: 'onChangeSizeType',\n\t\tchange: 'checkChanged',\n\t\tvalid: 'checkChanged'\n\t} );\n\n\t// Initialize size\n\tthis.sizeWidget.setSizeType( this.imageModel.isDefaultSize() ? 'default' : 'custom' );\n\n\t// Update default dimensions\n\tthis.sizeWidget.updateDefaultDimensions();\n\n\t// Set initial alt text\n\tthis.altTextInput.setValue( this.imageModel.getAltText() );\n\n\t// Set initial alignment\n\tthis.positionSelect.setDisabled( !this.imageModel.isAligned() );\n\tthis.positionSelect.selectItemByData( this.imageModel.isAligned() && this.imageModel.getAlignment() );\n\tthis.positionCheckbox.setSelected( this.imageModel.isAligned() );\n\n\t// Border flag\n\tthis.borderCheckbox.setDisabled( !this.imageModel.isBorderable() );\n\tthis.borderCheckbox.setSelected( this.imageModel.isBorderable() && this.imageModel.hasBorder() );\n\n\t// Type select\n\tthis.typeSelect.selectItemByData( this.imageModel.getType() || 'none' );\n\n\tthis.isSettingUpModel = false;\n};\n\n/**\n * Reset the caption surface\n */\nve.ui.MWMediaDialog.prototype.resetCaption = function () {\n\tconst doc = this.getFragment().getDocument();\n\n\t// Get existing caption. We only do this in setup, because the caption\n\t// should not reset to original if the image is replaced or edited.\n\t//\n\t// If the selected node is a block image and the caption already exists,\n\t// store the initial caption and set it as the caption document\n\tif (\n\t\tthis.imageModel &&\n\t\tthis.selectedNode &&\n\t\tthis.selectedNode.getDocument() &&\n\t\tthis.selectedNode instanceof ve.dm.MWBlockImageNode\n\t) {\n\t\tconst captionNode = this.selectedNode.getCaptionNode();\n\t\tif ( captionNode && captionNode.getLength() > 0 ) {\n\t\t\tthis.imageModel.setCaptionDocument(\n\t\t\t\tthis.selectedNode.getDocument().cloneFromRange( captionNode.getRange() )\n\t\t\t);\n\t\t}\n\t}\n\n\tlet captionDocument;\n\tif ( this.imageModel ) {\n\t\tcaptionDocument = this.imageModel.getCaptionDocument();\n\t} else {\n\t\tcaptionDocument = doc.cloneWithData( [\n\t\t\t{ type: 'paragraph', internal: { generated: 'wrapper' } },\n\t\t\t{ type: '/paragraph' },\n\t\t\t{ type: 'internalList' },\n\t\t\t{ type: '/internalList' }\n\t\t] );\n\t}\n\n\t// Set document\n\tthis.captionTarget.setDocument( captionDocument );\n\tthis.captionTarget.setReadOnly( this.isReadOnly() );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWMediaDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tif ( !data.file ) {\n\t\t\t\tthis.switchPanels( this.selectedNode ? 'edit' : 'search' );\n\t\t\t}\n\t\t\t// Revalidate size\n\t\t\tthis.sizeWidget.validateDimensions();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWMediaDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\tthis.mediaSettingsLayout.resetScroll();\n\t\t\t// Cleanup\n\t\t\tthis.search.getQuery().setValue( '' );\n\t\t\tthis.search.teardown();\n\t\t\tif ( this.imageModel ) {\n\t\t\t\tthis.imageModel.disconnect( this );\n\t\t\t\tthis.sizeWidget.disconnect( this );\n\t\t\t}\n\t\t\tthis.captionTarget.clear();\n\t\t\tthis.imageModel = null;\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWMediaDialog.prototype.getActionProcess = function ( action ) {\n\tlet handler;\n\n\tswitch ( action ) {\n\t\tcase 'change':\n\t\t\thandler = function () {\n\t\t\t\tthis.switchPanels( 'search' );\n\t\t\t};\n\n\t\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\t\taction: 'search-change-image'\n\t\t\t} );\n\t\t\tbreak;\n\t\tcase 'back':\n\t\t\thandler = function () {\n\t\t\t\tthis.switchPanels( 'edit' );\n\t\t\t};\n\t\t\tbreak;\n\t\tcase 'choose':\n\t\t\thandler = function () {\n\t\t\t\tthis.confirmSelectedImage();\n\t\t\t\tthis.switchPanels( 'edit' );\n\t\t\t};\n\t\t\tbreak;\n\t\tcase 'cancelchoose':\n\t\t\thandler = function () {\n\t\t\t\tthis.switchPanels( 'search' );\n\t\t\t};\n\t\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\t\taction: 'search-change-image'\n\t\t\t} );\n\t\t\tbreak;\n\t\tcase 'cancelupload':\n\t\t\thandler = function () {\n\t\t\t\tthis.searchTabs.setTabPanel( 'upload' );\n\t\t\t\tthis.searchTabs.toggleMenu( true );\n\t\t\t\treturn this.mediaUploadBooklet.initialize();\n\t\t\t};\n\t\t\tbreak;\n\t\tcase 'upload':\n\t\t\tve.track( 'activity.' + this.constructor.static.name, {\n\t\t\t\taction: 'search-upload-image'\n\t\t\t} );\n\t\t\treturn new OO.ui.Process( this.mediaUploadBooklet.uploadFile() );\n\t\tcase 'save':\n\t\t\treturn new OO.ui.Process( this.mediaUploadBooklet.saveFile() );\n\t\tcase 'done':\n\t\tcase 'insert':\n\t\t\thandler = function () {\n\t\t\t\tconst surfaceModel = this.getFragment().getSurface();\n\n\t\t\t\t// Update from the form\n\t\t\t\tthis.imageModel.setAltText( this.altTextInput.getValue() );\n\t\t\t\tthis.imageModel.setCaptionDocument(\n\t\t\t\t\tthis.captionTarget.getSurface().getModel().getDocument()\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\t// There was an initial node\n\t\t\t\t\tthis.selectedNode &&\n\t\t\t\t\t// And we didn't change the image type block/inline or vice versa\n\t\t\t\t\tthis.selectedNode.type === this.imageModel.getImageNodeType() &&\n\t\t\t\t\t// And we didn't change the image itself\n\t\t\t\t\tthis.selectedNode.getAttribute( 'src' ) ===\n\t\t\t\t\t\tthis.imageModel.getImageSource()\n\t\t\t\t) {\n\t\t\t\t\t// We only need to update the attributes of the current node\n\t\t\t\t\tthis.imageModel.updateImageNode( this.selectedNode, surfaceModel );\n\t\t\t\t} else {\n\t\t\t\t\t// Replacing an image or inserting a brand new one\n\t\t\t\t\tthis.fragment = this.imageModel.insertImageNode( this.getFragment() );\n\t\t\t\t}\n\n\t\t\t\tthis.close( { action: action } );\n\t\t\t};\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn ve.ui.MWMediaDialog.super.prototype.getActionProcess.call( this, action );\n\t}\n\n\treturn new OO.ui.Process( handler, this );\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWMediaDialog );\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/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-each-util","severity":2,"message":"Prefer Array#forEach to $.each","line":96,"column":2,"nodeType":"CallExpression","endLine":109,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMobileSaveDialog.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":48,"column":4,"nodeType":"CallExpression","endLine":48,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWPreDialog.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/modules/ve-mw/ui/dialogs/ve.ui.MWRequiredParamBlankConfirmDialog.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/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":358,"column":27,"nodeType":"CallExpression","endLine":373,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":358,"column":27,"nodeType":"CallExpression","endLine":376,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":493,"column":2,"nodeType":"CallExpression","endLine":498,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":509,"column":2,"nodeType":"CallExpression","endLine":511,"endColumn":5}],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":173,"column":4,"nodeType":"CallExpression","endLine":173,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":209,"column":4,"nodeType":"CallExpression","endLine":209,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":219,"column":3,"nodeType":"CallExpression","endLine":219,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":221,"column":3,"nodeType":"CallExpression","endLine":234,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":226,"column":4,"nodeType":"CallExpression","endLine":232,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":370,"column":7,"nodeType":"CallExpression","endLine":370,"endColumn":91,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideDown","line":428,"column":19,"nodeType":"CallExpression","endLine":431,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-slide","severity":2,"message":"Prefer CSS transitions to .slideUp","line":453,"column":3,"nodeType":"CallExpression","endLine":456,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":542,"column":27,"nodeType":"CallExpression","endLine":543,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":670,"column":19,"nodeType":"CallExpression","endLine":671,"endColumn":76,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":804,"column":4,"nodeType":"CallExpression","endLine":804,"endColumn":47,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWSaveDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for saving MediaWiki pages.\n *\n * Note that most methods are not safe to call before the dialog has initialized, except where\n * noted otherwise.\n *\n * @class\n * @extends OO.ui.ProcessDialog\n *\n * @constructor\n * @param {Object} [config] Config options\n */\nve.ui.MWSaveDialog = function VeUiMwSaveDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWSaveDialog.super.call( this, config );\n\n\t// Properties\n\tthis.editSummaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' );\n\tthis.restoring = false;\n\tthis.messages = {};\n\tthis.setupDeferred = ve.createDeferred();\n\tthis.checkboxesByName = null;\n\tthis.changedEditSummary = false;\n\tthis.canReview = false;\n\tthis.canPreview = false;\n\tthis.hasDiff = false;\n\tthis.diffElement = null;\n\tthis.diffElementPromise = null;\n\tthis.getDiffElementPromise = null;\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwSaveDialog' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWSaveDialog, OO.ui.ProcessDialog );\n\n/* Static Properties */\n\nve.ui.MWSaveDialog.static.name = 'mwSave';\n\nve.ui.MWSaveDialog.static.title =\n\tOO.ui.deferMsg( 'visualeditor-savedialog-title-save' );\n\nve.ui.MWSaveDialog.static.actions = [\n\t{\n\t\taction: 'save',\n\t\t// label will be set by config.saveButtonLabel\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: [ 'save', 'review', 'preview' ]\n\t},\n\t{\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-resume-editing' ),\n\t\tflags: [ 'safe', OO.ui.isMobile() ? 'back' : 'close' ],\n\t\tmodes: [ 'save', 'conflict' ]\n\t},\n\t{\n\t\taction: 'review',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-review' ),\n\t\tmodes: [ 'save', 'preview' ]\n\t},\n\t{\n\t\taction: 'preview',\n\t\tlabel: OO.ui.deferMsg( 'showpreview' ),\n\t\tmodes: [ 'save', 'review' ]\n\t},\n\t{\n\t\taction: 'approve',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-review-good' ),\n\t\tflags: [ 'safe', 'back' ],\n\t\tmodes: [ 'review', 'preview' ]\n\t},\n\t{\n\t\taction: 'resolve',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-savedialog-label-resolve-conflict' ),\n\t\tflags: [ 'primary', 'progressive' ],\n\t\tmodes: 'conflict'\n\t}\n];\n\n/* Events */\n\n/**\n * Emitted when the user clicks the save button\n *\n * @event ve.ui.MWSaveDialog#save\n * @param {jQuery.Deferred} saveDeferred Deferred object to resolve/reject when the save\n * succeeds/fails.\n */\n\n/**\n * Emitted when the user clicks the review changes button\n *\n * @event ve.ui.MWSaveDialog#review\n */\n\n/**\n * Emitted when the user clicks the show preview button\n *\n * @event ve.ui.MWSaveDialog#preview\n */\n\n/**\n * Emitted when the user clicks the resolve conflict button\n *\n * @event ve.ui.MWSaveDialog#resolve\n */\n\n/**\n * Emitted when the user clicks the retry/continue save button after an error.\n *\n * @event ve.ui.MWSaveDialog#retry\n */\n\n/**\n * Emitted when the save dialog changes panel, and when it opens\n *\n * @event ve.ui.MWSaveDialog#changePanel\n */\n\n/* Methods */\n\n/**\n * Set review content and show review panel.\n *\n * @param {jQuery.Promise} wikitextDiffPromise Wikitext diff HTML promise\n * @param {jQuery.Promise} visualDiffGeneratorPromise Visual diff promise\n * @param {HTMLDocument} [baseDoc] Base document against which to normalise links when rendering visualDiff\n */\nve.ui.MWSaveDialog.prototype.setDiffAndReview = function ( wikitextDiffPromise, visualDiffGeneratorPromise, baseDoc ) {\n\tthis.clearDiff();\n\n\tfunction createDiffElement( visualDiff ) {\n\t\tconst diffElement = new ve.ui.DiffElement( visualDiff );\n\t\t// The following classes are used here:\n\t\t// * mw-content-ltr\n\t\t// * mw-content-rtl\n\t\tdiffElement.$document.addClass( [\n\t\t\t'mw-body-content',\n\t\t\t'mw-parser-output',\n\t\t\t'mw-content-' + visualDiff.newDoc.getDir()\n\t\t] );\n\t\tve.targetLinksToNewWindow( diffElement.$document[ 0 ] );\n\t\t// Run styles so links render with their appropriate classes\n\t\tve.init.platform.linkCache.styleParsoidElements( diffElement.$document, baseDoc );\n\t\tmw.libs.ve.fixFragmentLinks( diffElement.$document[ 0 ], mw.Title.newFromText( ve.init.target.getPageName() ), 'mw-save-visualdiff-' );\n\t\treturn diffElement;\n\t}\n\n\t// Visual diff\n\tthis.$reviewVisualDiff.append( new OO.ui.ProgressBarWidget().$element );\n\t// Don't generate the DiffElement until the tab is switched to\n\tthis.getDiffElementPromise = function () {\n\t\treturn visualDiffGeneratorPromise.then( ( visualDiffGenerator ) => createDiffElement( visualDiffGenerator() ) );\n\t};\n\n\tthis.baseDoc = baseDoc;\n\n\t// Wikitext diff\n\tthis.$reviewWikitextDiff.append( new OO.ui.ProgressBarWidget().$element );\n\twikitextDiffPromise.then( ( wikitextDiff ) => {\n\t\tif ( wikitextDiff ) {\n\t\t\t// wikitextDiff is an HTML string we trust from the API\n\t\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\t\tthis.$reviewWikitextDiff.empty().append( wikitextDiff );\n\t\t\t// Remove the HTML diff-mode ButtonGroupWidget because this.reviewModeButtonSelect replaces it.\n\t\t\t// This matches what's done for action=diff in modules/ve-mw/preinit/ve.init.mw.DiffPage.init.js\n\t\t\tthis.$reviewWikitextDiff.find( '.ve-init-mw-diffPage-diffMode' ).empty();\n\t\t} else {\n\t\t\tthis.$reviewWikitextDiff.empty().append(\n\t\t\t\t$( '<div>' ).addClass( 've-ui-mwSaveDialog-no-changes' ).text( ve.msg( 'visualeditor-diff-no-changes' ) )\n\t\t\t);\n\t\t}\n\t}, ( code, errorObject ) => {\n\t\tconst $errorMessage = ve.init.target.extractErrorMessages( errorObject );\n\n\t\tthis.$reviewWikitextDiff.empty().append(\n\t\t\tnew OO.ui.MessageWidget( {\n\t\t\t\ttype: 'error',\n\t\t\t\tlabel: $errorMessage\n\t\t\t} ).$element\n\t\t);\n\t} ).always( () => {\n\t\tthis.updateSize();\n\t} );\n\n\tthis.hasDiff = true;\n\tthis.popPending();\n\tthis.swapPanel( 'review' );\n};\n\n/**\n * Set preview content and show preview panel.\n *\n * @param {Object|jQuery} response action=parse API response, or error message\n */\nve.ui.MWSaveDialog.prototype.showPreview = function ( response ) {\n\tif ( response instanceof $ ) {\n\t\tthis.$previewViewer.empty().append(\n\t\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\t\t$( '<em>' ).append( response )\n\t\t);\n\t} else {\n\t\tconst data = response.parse,\n\t\t\tconfig = mw.config.get( 'wgVisualEditor' );\n\n\t\tmw.config.set( data.jsconfigvars );\n\t\tmw.loader.using( ( data.modules || [] ).concat( data.modulestyles || [] ) );\n\n\t\t// eslint-disable-next-line no-jquery/no-html\n\t\tthis.$previewHeading.html( data.displaytitle );\n\t\t// eslint-disable-next-line no-jquery/no-append-html\n\t\tthis.$previewViewer.empty().append(\n\t\t\t// The following classes are used here:\n\t\t\t// * mw-content-ltr\n\t\t\t// * mw-content-rtl\n\t\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t\t$( '<div>' )\n\t\t\t\t.addClass( 'mw-content-' + config.pageLanguageDir )\n\t\t\t\t.attr( {\n\t\t\t\t\tlang: config.pageLanguageCode,\n\t\t\t\t\tdir: config.pageLanguageDir\n\t\t\t\t} )\n\t\t\t\t.html( data.text ),\n\t\t\tdata.categorieshtml\n\t\t);\n\n\t\tve.targetLinksToNewWindow( this.$previewViewer[ 0 ] );\n\t\tmw.libs.ve.fixFragmentLinks( this.$previewViewer[ 0 ], mw.Title.newFromText( ve.init.target.getPageName() ), 'mw-save-preview-' );\n\n\t\t// Run hooks so other things can alter the document\n\t\tmw.hook( 'wikipage.content' ).fire( this.$previewViewer );\n\t}\n\n\tthis.popPending();\n\tthis.swapPanel( 'preview' );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.pushPending = function () {\n\tthis.getActions().setAbilities( { review: false, preview: false } );\n\treturn ve.ui.MWSaveDialog.super.prototype.pushPending.call( this );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.popPending = function () {\n\tconst ret = ve.ui.MWSaveDialog.super.prototype.popPending.call( this );\n\tif ( !this.isPending() ) {\n\t\tthis.getActions().setAbilities( { review: true, preview: true } );\n\t}\n\treturn ret;\n};\n\n/**\n * Clear the diff displayed in the review panel, if any.\n */\nve.ui.MWSaveDialog.prototype.clearDiff = function () {\n\tthis.$reviewWikitextDiff.empty();\n\tthis.$reviewVisualDiff.empty();\n\tthis.$previewViewer.empty();\n\tthis.hasDiff = false;\n\tthis.diffElement = null;\n\tthis.diffElementPromise = null;\n\tthis.getDiffElementPromise = null;\n};\n\n/**\n * Swap state in the save dialog.\n *\n * @param {string} panel One of 'save', 'review' or 'conflict'\n * @param {boolean} [noFocus=false] Don't attempt to focus anything (e.g. while setting up)\n * @throws {Error} Unknown saveDialog panel\n */\nve.ui.MWSaveDialog.prototype.swapPanel = function ( panel, noFocus ) {\n\tif ( ![ 'save', 'review', 'preview', 'conflict' ].includes( panel ) ) {\n\t\tthrow new Error( 'Unknown saveDialog panel: ' + panel );\n\t}\n\n\tconst mode = panel,\n\t\tpanelObj = this[ panel + 'Panel' ];\n\n\t// Update the window title\n\t// The following messages are used here:\n\t// * visualeditor-savedialog-title-conflict\n\t// * visualeditor-savedialog-title-preview\n\t// * visualeditor-savedialog-title-review\n\t// * visualeditor-savedialog-title-save\n\tthis.title.setLabel( ve.msg( 'visualeditor-savedialog-title-' + panel ) );\n\n\t// Reset save button if we disabled it for e.g. unrecoverable spam error\n\tthis.actions.setAbilities( { save: true } );\n\n\tif ( !noFocus ) {\n\t\t// On panels without inputs, ensure the dialog is focused so events\n\t\t// are captured, e.g. 'Esc' to close\n\t\tthis.$content[ 0 ].focus();\n\t}\n\n\tlet size = 'medium';\n\tswitch ( panel ) {\n\t\tcase 'save':\n\t\t\tif ( !noFocus && this.panels.getCurrentItem() !== this.savePanel ) {\n\t\t\t\t// HACK: FF needs *another* defer\n\t\t\t\tsetTimeout( () => {\n\t\t\t\t\tthis.editSummaryInput.moveCursorToEnd();\n\t\t\t\t} );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'conflict':\n\t\t\tthis.actions.setAbilities( { save: false } );\n\t\t\tbreak;\n\t\tcase 'preview':\n\t\t\tsize = 'full';\n\t\t\tthis.previewPanel.$element[ 0 ].focus();\n\t\t\tthis.previewPanel.$element.prepend( this.$previewEditSummaryContainer );\n\t\t\tbreak;\n\t\tcase 'review':\n\t\t\tsize = 'larger';\n\t\t\tthis.reviewModeButtonSelect.$element.after( this.$previewEditSummaryContainer );\n\t\t\tsetTimeout( () => {\n\t\t\t\tthis.updateReviewMode();\n\n\t\t\t\tve.track(\n\t\t\t\t\t'activity.' + this.constructor.static.name,\n\t\t\t\t\t{ action: 'review-initial-' + this.reviewModeButtonSelect.findSelectedItem().getData() }\n\t\t\t\t);\n\t\t\t} );\n\t\t\tbreak;\n\t}\n\tif ( panel === 'preview' || panel === 'review' ) {\n\t\tconst currentEditSummaryWikitext = this.editSummaryInput.getValue();\n\t\tif ( this.lastEditSummaryWikitext === undefined || this.lastEditSummaryWikitext !== currentEditSummaryWikitext ) {\n\t\t\tif ( this.editSummaryXhr ) {\n\t\t\t\tthis.editSummaryXhr.abort();\n\t\t\t}\n\t\t\tthis.lastEditSummaryWikitext = currentEditSummaryWikitext;\n\t\t\tthis.$previewEditSummary.empty();\n\n\t\t\tif ( !currentEditSummaryWikitext || currentEditSummaryWikitext.trim() === '' ) {\n\t\t\t\t// Don't bother with an API request for an empty summary\n\t\t\t\tthis.$previewEditSummary.text( ve.msg( 'visualeditor-savedialog-review-nosummary' ) );\n\t\t\t} else {\n\t\t\t\tthis.$previewEditSummary.parent().removeClass( 'oo-ui-element-hidden' );\n\t\t\t\tconst $spinner = $.createSpinner();\n\t\t\t\tthis.$previewEditSummary.append( $spinner );\n\t\t\t\tthis.editSummaryXhr = ve.init.target.getContentApi().post( {\n\t\t\t\t\taction: 'parse',\n\t\t\t\t\ttitle: ve.init.target.getPageName(),\n\t\t\t\t\tprop: '',\n\t\t\t\t\tsummary: currentEditSummaryWikitext\n\t\t\t\t} ).done( ( result ) => {\n\t\t\t\t\tif ( result.parse.parsedsummary === '' ) {\n\t\t\t\t\t\tthis.$previewEditSummary.parent().addClass( 'oo-ui-element-hidden' );\n\t\t\t\t\t\tthis.$previewEditSummary.empty();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Intentionally treated as HTML\n\t\t\t\t\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t\t\t\t\tthis.$previewEditSummary.html( ve.msg( 'parentheses', result.parse.parsedsummary ) );\n\t\t\t\t\t\tve.targetLinksToNewWindow( this.$previewEditSummary[ 0 ] );\n\t\t\t\t\t}\n\t\t\t\t} ).fail( () => {\n\t\t\t\t\tthis.$previewEditSummary.parent().addClass( 'oo-ui-element-hidden' );\n\t\t\t\t\tthis.$previewEditSummary.empty();\n\t\t\t\t} ).always( () => {\n\t\t\t\t\tthis.updateSize();\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Show the target panel\n\tthis.panels.setItem( panelObj );\n\tthis.setSize( size );\n\n\t// Set mode after setting size so that the footer is measured correctly\n\tthis.actions.setMode( mode );\n\n\t// Only show preview in source mode\n\tthis.actions.forEach( { actions: 'preview' }, ( action ) => {\n\t\taction.toggle( this.canPreview && panel !== 'preview' );\n\t} );\n\n\t// Diff API doesn't support section=new\n\tthis.actions.forEach( { actions: 'review' }, ( action ) => {\n\t\taction.toggle( this.canReview && panel !== 'review' );\n\t} );\n\n\t// Support: iOS\n\t// HACK: iOS Safari sometimes makes the entire panel completely disappear (T221289).\n\t// Rebuilding it makes it reappear.\n\tOO.ui.Element.static.reconsiderScrollbars( panelObj.$element[ 0 ] );\n\n\tmw.hook( 've.saveDialog.stateChanged' ).fire();\n};\n\n/**\n * Show a message in the save dialog.\n *\n * @param {string} name Message's unique name\n * @param {jQuery|string|Function|OO.ui.HtmlSnippet} label Message content. See OO.ui.mixin.LabelElement.\n * @param {string} config MessageWidget config. Defaults to an inline warning.\n * @return {jQuery.Promise} Promise which resolves when the message has been shown, rejects if no new message shown.\n */\nve.ui.MWSaveDialog.prototype.showMessage = function ( name, label, config ) {\n\tif ( !this.messages[ name ] ) {\n\t\tconst messageWidget = new OO.ui.MessageWidget( ve.extendObject( {\n\t\t\tclasses: [ 've-ui-mwSaveDialog-message' ],\n\t\t\tlabel: label,\n\t\t\tinline: true,\n\t\t\ttype: 'warning'\n\t\t}, config ) );\n\t\tthis.$saveMessages.append( messageWidget.$element.css( 'display', 'none' ) );\n\n\t\t// FIXME: Use CSS transitions\n\t\t// eslint-disable-next-line no-jquery/no-slide\n\t\tconst promise = messageWidget.$element.slideDown( {\n\t\t\tduration: 250,\n\t\t\tprogress: this.updateSize.bind( this )\n\t\t} ).promise();\n\n\t\tthis.swapPanel( 'save' );\n\n\t\t// Can be hidden later by #clearMessage\n\t\tthis.messages[ name ] = messageWidget.$element;\n\n\t\treturn promise;\n\t}\n\treturn ve.createDeferred().reject().promise();\n};\n\n/**\n * Remove a message from the save dialog.\n *\n * @param {string} name Message's unique name\n */\nve.ui.MWSaveDialog.prototype.clearMessage = function ( name ) {\n\tconst $message = this.messages[ name ];\n\tif ( $message ) {\n\t\t// FIXME: Use CSS transitions\n\t\t// eslint-disable-next-line no-jquery/no-slide\n\t\t$message.slideUp( {\n\t\t\tduration: 250,\n\t\t\tprogress: this.updateSize.bind( this )\n\t\t} ).promise().then( () => {\n\t\t\t$message.remove();\n\t\t\tthis.updateSize();\n\t\t} );\n\t\tdelete this.messages[ name ];\n\t}\n};\n\n/**\n * Remove all messages from the save dialog.\n */\nve.ui.MWSaveDialog.prototype.clearAllMessages = function () {\n\tthis.$saveMessages.empty();\n\tthis.messages = {};\n};\n\n/**\n * Reset the fields of the save dialog.\n */\nve.ui.MWSaveDialog.prototype.reset = function () {\n\t// Reset summary input\n\tthis.editSummaryInput.setValue( '' );\n\t// Uncheck minoredit\n\tif ( this.checkboxesByName.wpMinoredit ) {\n\t\tthis.checkboxesByName.wpMinoredit.setSelected( false );\n\t}\n\tthis.clearDiff();\n};\n\n/**\n * Initialize MediaWiki page specific checkboxes.\n *\n * This method is safe to call even when the dialog hasn't been initialized yet.\n *\n * @param {OO.ui.FieldLayout[]} checkboxFields Checkbox fields\n */\nve.ui.MWSaveDialog.prototype.setupCheckboxes = function ( checkboxFields ) {\n\tthis.setupDeferred.done( () => {\n\t\tcheckboxFields.forEach( ( field ) => {\n\t\t\tthis.$saveCheckboxes.append( field.$element );\n\t\t} );\n\t\tthis.updateOptionsBar();\n\t} );\n};\n\n/**\n * Change the edit summary prefilled in the save dialog.\n *\n * This method is safe to call even when the dialog hasn't been initialized yet.\n *\n * @param {string} summary Edit summary to prefill\n */\nve.ui.MWSaveDialog.prototype.setEditSummary = function ( summary ) {\n\tthis.setupDeferred.done( () => {\n\t\tthis.editSummaryInput.setValue( summary );\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.initialize = function () {\n\tconst mwString = require( 'mediawiki.String' );\n\n\t// Parent method\n\tve.ui.MWSaveDialog.super.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.panels = new OO.ui.StackLayout( { scrollable: false } );\n\tthis.panels.connect( this, { set: [ 'emit', 'changePanel' ] } );\n\n\tthis.savePanel = new OO.ui.PanelLayout( {\n\t\texpanded: false,\n\t\tpadded: true,\n\t\tclasses: [ 've-ui-mwSaveDialog-savePanel' ]\n\t} );\n\n\t// Character counter in edit summary\n\tthis.editSummaryCountLabel = new OO.ui.LabelWidget( {\n\t\tclasses: [ 've-ui-mwSaveDialog-editSummary-count' ],\n\t\tlabel: '',\n\t\ttitle: ve.msg( 'visualeditor-editsummary-characters-remaining' )\n\t} );\n\n\t// Save panel\n\t// eslint-disable-next-line no-jquery/no-html\n\tthis.$editSummaryLabel = $( '<div>' ).addClass( 've-ui-mwSaveDialog-summaryLabel' )\n\t\t.html( ve.init.platform.getParsedMessage( 'summary' ) );\n\tve.targetLinksToNewWindow( this.$editSummaryLabel[ 0 ] );\n\tthis.editSummaryInput = new ve.ui.MWEditSummaryWidget( {\n\t\t$overlay: this.$overlay,\n\t\tplaceholder: ve.msg( 'visualeditor-editsummary' ),\n\t\tclasses: [ 've-ui-mwSaveDialog-summary' ]\n\t} );\n\t// Show a warning if the user presses Enter\n\tthis.editSummaryInput.on( 'enter', () => {\n\t\tthis.showMessage(\n\t\t\t'keyboard-shortcut-submit',\n\t\t\tve.msg(\n\t\t\t\t'visualeditor-savedialog-keyboard-shortcut-submit',\n\t\t\t\tnew ve.ui.Trigger( ve.ui.commandHelpRegistry.lookup( 'dialogConfirm' ).shortcuts[ 0 ] ).getMessage()\n\t\t\t)\n\t\t).then( () => {\n\t\t\t// Restore focus after potential window resize\n\t\t\tthis.editSummaryInput.focus();\n\t\t} );\n\t} );\n\t// Limit length, and display the remaining characters\n\tthis.editSummaryInput.$input.codePointLimit( this.editSummaryCodePointLimit );\n\tthis.editSummaryInput.on( 'change', () => {\n\t\tconst remaining = this.editSummaryCodePointLimit - mwString.codePointLength( this.editSummaryInput.getValue() );\n\t\t// TODO: This looks a bit weird, there is no unit in the UI, just numbers.\n\t\tthis.changedEditSummary = true;\n\t\tif ( remaining > 99 ) {\n\t\t\tthis.editSummaryCountLabel.setLabel( '' );\n\t\t} else {\n\t\t\tthis.editSummaryCountLabel.setLabel( mw.language.convertNumber( remaining ) );\n\t\t}\n\n\t\tthis.updateOptionsBar();\n\t} );\n\tthis.editSummaryInput.on( 'resize', () => {\n\t\tif ( this.overflowTimeout !== undefined ) {\n\t\t\tclearTimeout( this.overflowTimeout );\n\t\t}\n\t\tthis.panels.$element.css( 'overflow', 'hidden' );\n\t\tthis.updateSize();\n\t\tthis.overflowTimeout = setTimeout( () => {\n\t\t\tthis.panels.$element.css( 'overflow', '' );\n\t\t}, 250 );\n\t} );\n\n\tthis.$saveCheckboxes = $( '<div>' ).addClass( 've-ui-mwSaveDialog-checkboxes' );\n\tthis.$saveOptions = $( '<div>' ).addClass( 've-ui-mwSaveDialog-options' ).append(\n\t\tthis.$saveCheckboxes,\n\t\tthis.editSummaryCountLabel.$element\n\t);\n\tthis.$license = $( '<p>' ).addClass( 've-ui-mwSaveDialog-license' );\n\tthis.$saveMessages = $( '<div>' ).addClass( 've-ui-mwSaveDialog-messages' );\n\tthis.$saveFoot = $( '<div>' ).addClass( 've-ui-mwSaveDialog-foot' ).append( this.$license );\n\tve.targetLinksToNewWindow( this.$saveFoot[ 0 ] );\n\tthis.savePanel.$element.append(\n\t\tthis.$editSummaryLabel,\n\t\tthis.editSummaryInput.$element,\n\t\tthis.$saveOptions,\n\t\tthis.$saveMessages,\n\t\tthis.$saveFoot\n\t);\n\n\tthis.updateOptionsBar();\n\n\t// Review panel\n\tthis.reviewPanel = new OO.ui.PanelLayout( {\n\t\texpanded: false,\n\t\tpadded: true\n\t} );\n\n\tthis.$reviewVisualDiff = $( '<div>' ).addClass( 've-ui-mwSaveDialog-viewer' );\n\tthis.$reviewWikitextDiff = $( '<div>' ).addClass( 've-ui-mwSaveDialog-viewer' );\n\n\tthis.reviewModeButtonSelect = new OO.ui.ButtonSelectWidget( {\n\t\titems: [\n\t\t\tnew OO.ui.ButtonOptionWidget( { data: 'visual', icon: 'eye', label: ve.msg( 'visualeditor-savedialog-review-visual' ) } ),\n\t\t\tnew OO.ui.ButtonOptionWidget( { data: 'source', icon: 'wikiText', label: ve.msg( 'visualeditor-savedialog-review-wikitext' ) } )\n\t\t],\n\t\tclasses: [ 've-ui-mwSaveDialog-reviewMode' ]\n\t} );\n\tthis.reviewModeButtonSelect.connect( this, {\n\t\tchoose: 'onReviewChoose',\n\t\tselect: 'updateReviewMode'\n\t} );\n\n\tthis.$previewEditSummary = $( '<span>' ).addClass( 've-ui-mwSaveDialog-summaryPreview' ).addClass( 'comment' );\n\tthis.$previewEditSummaryContainer = $( '<div>' )\n\t\t.addClass( 'mw-summary-preview' )\n\t\t.text( ve.msg( 'summary-preview' ) )\n\t\t.append( $( '<br>' ), this.$previewEditSummary );\n\tthis.$reviewActions = $( '<div>' ).addClass( 've-ui-mwSaveDialog-actions' );\n\tthis.reviewPanel.$element.append(\n\t\tthis.reviewModeButtonSelect.$element,\n\t\tthis.$reviewVisualDiff,\n\t\tthis.$reviewWikitextDiff,\n\t\tthis.$reviewActions\n\t);\n\n\t// Preview panel\n\tthis.previewPanel = new OO.ui.PanelLayout( {\n\t\tclasses: [ 've-ui-mwSaveDialog-preview' ],\n\t\texpanded: false,\n\t\tpadded: true\n\t} );\n\tthis.$previewHeading = $( '<h1>' ).addClass( 'firstHeading' );\n\tthis.$previewViewer = $( '<div>' ).addClass( [\n\t\t'mw-body-content',\n\t\t'mw-parser-output'\n\t] );\n\tthis.previewPanel.$element\n\t\t// Make focusable for keyboard accessible scrolling\n\t\t.prop( 'tabIndex', 0 )\n\t\t.append(\n\t\t\t$( '<div>' ).addClass( 'mw-content-container' ).append(\n\t\t\t\t$( '<div>' ).addClass( 'mw-body' ).append(\n\t\t\t\t\tthis.$previewHeading,\n\t\t\t\t\tthis.$previewViewer\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t// Conflict panel\n\tthis.conflictPanel = new OO.ui.PanelLayout( {\n\t\texpanded: false,\n\t\tpadded: true\n\t} );\n\t// eslint-disable-next-line no-jquery/no-html\n\tthis.$conflict = $( '<div>' ).addClass( 've-ui-mwSaveDialog-conflict' )\n\t\t.html( ve.init.platform.getParsedMessage( 'visualeditor-editconflict' ) );\n\tve.targetLinksToNewWindow( this.$conflict[ 0 ] );\n\tthis.conflictPanel.$element.append( this.$conflict );\n\n\t// Panel stack\n\tthis.panels.addItems( [\n\t\tthis.savePanel,\n\t\tthis.reviewPanel,\n\t\tthis.previewPanel,\n\t\tthis.conflictPanel\n\t] );\n\n\t// Initialization\n\tthis.$body.append( this.panels.$element );\n\n\tthis.setupDeferred.resolve();\n};\n\nve.ui.MWSaveDialog.prototype.updateOptionsBar = function () {\n\tconst showOptions = !!this.editSummaryCountLabel.getLabel() || !this.$saveCheckboxes.is( ':empty' );\n\tif ( showOptions !== this.showOptions ) {\n\t\tthis.savePanel.$element.toggleClass( 've-ui-mwSaveDialog-withOptions', showOptions );\n\t\tthis.showOptions = showOptions;\n\t\tthis.updateSize();\n\t}\n};\n\n/**\n * Update the current review mode\n *\n * @param {OO.ui.ButtonOptionWidget} [button] The button clicked, or false if this is the initial setup\n */\nve.ui.MWSaveDialog.prototype.updateReviewMode = function () {\n\tif ( !this.hasDiff ) {\n\t\treturn;\n\t}\n\n\tconst diffMode = this.reviewModeButtonSelect.findSelectedItem().getData(),\n\t\tsurfaceMode = ve.init.target.getSurface().getMode(),\n\t\tisVisual = diffMode === 'visual';\n\n\t// Config values used here:\n\t// * visualeditor-diffmode-visual\n\t// * visualeditor-diffmode-source\n\tve.userConfig( 'visualeditor-diffmode-' + surfaceMode, diffMode );\n\n\tthis.$reviewVisualDiff.toggleClass( 'oo-ui-element-hidden', !isVisual );\n\tthis.$reviewWikitextDiff.toggleClass( 'oo-ui-element-hidden', isVisual );\n\tif ( isVisual ) {\n\t\tif ( !this.diffElement ) {\n\t\t\tif ( !this.diffElementPromise ) {\n\t\t\t\tthis.diffElementPromise = this.getDiffElementPromise().then( ( diffElement ) => {\n\t\t\t\t\tthis.diffElement = diffElement;\n\t\t\t\t\tthis.$reviewVisualDiff.empty().append( diffElement.$element );\n\t\t\t\t\tthis.positionDiffElement();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis.positionDiffElement();\n\t}\n\n\t// Support: iOS\n\t// HACK: iOS Safari sometimes makes the entire panel completely disappear (T219680).\n\t// Rebuilding it makes it reappear.\n\tOO.ui.Element.static.reconsiderScrollbars( this.reviewPanel.$element[ 0 ] );\n\n\tthis.updateSize();\n};\n\n/**\n * Update the current review mode\n *\n * @param {OO.ui.OptionWidget} item Item chosen\n */\nve.ui.MWSaveDialog.prototype.onReviewChoose = function ( item ) {\n\tve.track( 'activity.' + this.constructor.static.name, { action: 'review-switch-' + item.getData() } );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.setDimensions = function () {\n\t// Parent method\n\tve.ui.MWSaveDialog.super.prototype.setDimensions.apply( this, arguments );\n\n\tif ( !this.positioning ) {\n\t\tthis.positionDiffElement();\n\t}\n};\n\n/**\n * Re-position elements within the diff element\n *\n * Should be called whenever the diff element's container has changed width.\n */\nve.ui.MWSaveDialog.prototype.positionDiffElement = function () {\n\tif ( this.panels.getCurrentItem() === this.reviewPanel ) {\n\t\tsetTimeout( () => {\n\t\t\tthis.withoutSizeTransitions( () => {\n\t\t\t\t// This is delayed, so check the visual diff is still visible\n\t\t\t\tif ( this.diffElement && this.isVisible() && this.reviewModeButtonSelect.findSelectedItem().getData() === 'visual' ) {\n\t\t\t\t\tthis.diffElement.positionDescriptions();\n\t\t\t\t\tthis.positioning = true;\n\t\t\t\t\tthis.updateSize();\n\t\t\t\t\tthis.positioning = false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\t}\n};\n\n/**\n * @inheritdoc\n * @param {Object} [data]\n * @param {boolean} [data.canReview=false] User can review changes\n * @param {boolean} [data.canPreview=false] User can preview changes\n * @param {string} [data.copyrightWarning] HTML to display as the copyright message\n * @param {OO.ui.FieldLayout[]} [data.checkboxFields=[]] Checkbox fields\n * @param {Object} [data.checkboxesByName={}] Checkbox widgets, indexed by name\n * @param {string} [data.sectionTitle] Section title, if in new section mode\n * @param {string} [data.editSummary] Edit summary\n * @param {string} [data.initialPanel='save'] Initial panel to show\n * @param {jQuery|string|OO.ui.HtmlSnippet|Function|null} [data.saveButtonLabel] Label for the save button\n */\nve.ui.MWSaveDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWSaveDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tconst surfaceMode = ve.init.target.getSurface().getMode();\n\n\t\t\tthis.canReview = !!data.canReview;\n\t\t\tthis.canPreview = !!data.canPreview;\n\t\t\t// eslint-disable-next-line no-jquery/no-html\n\t\t\tthis.$license.html( data.copyrightWarning );\n\t\t\tthis.setupCheckboxes( data.checkboxFields || [] );\n\t\t\tthis.checkboxesByName = data.checkboxesByName || {};\n\t\t\t// HACK: Change layout when wpWatchlistExpiry is present to force wpWatchthis\n\t\t\t// onto a new line, hopefully with the expiry dropdown\n\t\t\tthis.$saveCheckboxes.toggleClass( 've-ui-mwSaveDialog-checkboxes-withExpiry', !!this.checkboxesByName.wpWatchlistExpiry );\n\t\t\t// Toggle the watchlist-expiry dropdown's disabled state according to the\n\t\t\t// selected state of the watchthis checkbox.\n\t\t\tif ( this.checkboxesByName.wpWatchthis && this.checkboxesByName.wpWatchlistExpiry ) {\n\t\t\t\t// Set initial state to match the watchthis checkbox.\n\t\t\t\tthis.checkboxesByName.wpWatchlistExpiry.setDisabled( !this.checkboxesByName.wpWatchthis.isSelected() );\n\t\t\t\t// Change state on every change of the watchthis checkbox.\n\t\t\t\tthis.checkboxesByName.wpWatchthis.on( 'change', ( enabled ) => {\n\t\t\t\t\tthis.checkboxesByName.wpWatchlistExpiry.setDisabled( !enabled );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tfunction trackCheckbox( n ) {\n\t\t\t\tve.track( 'activity.mwSave', { action: 'checkbox-' + n } );\n\t\t\t}\n\t\t\tfor ( const name in this.checkboxesByName ) {\n\t\t\t\tthis.checkboxesByName[ name ].$element.off( '.mwSave' ).on( 'click.mwSave', trackCheckbox.bind( this, name ) );\n\t\t\t}\n\n\t\t\tif ( data.sectionTitle ) {\n\t\t\t\tthis.setEditSummary( ve.msg( 'newsectionsummary', data.sectionTitle ) );\n\t\t\t\tthis.editSummaryInput.setDisabled( true );\n\t\t\t} else {\n\t\t\t\tthis.editSummaryInput.setDisabled( false );\n\t\t\t\tif ( !this.changedEditSummary ) {\n\t\t\t\t\tthis.setEditSummary( data.editSummary );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Config values used here:\n\t\t\t// * visualeditor-diffmode-visual\n\t\t\t// * visualeditor-diffmode-source\n\t\t\tthis.reviewModeButtonSelect.selectItemByData(\n\t\t\t\tve.userConfig( 'visualeditor-diffmode-' + surfaceMode ) || surfaceMode\n\t\t\t);\n\n\t\t\t// Old messages should not persist\n\t\t\tthis.clearAllMessages();\n\t\t\t// Don't focus during setup to prevent scroll jumping (T153010)\n\t\t\tthis.swapPanel( data.initialPanel || 'save', true );\n\t\t\t// Update save button label\n\t\t\tthis.actions.forEach( { actions: 'save' }, ( action ) => {\n\t\t\t\taction.setLabel( data.saveButtonLabel );\n\t\t\t} );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWSaveDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\t// HACK: iOS Safari sometimes makes the entire panel completely disappear (T221289).\n\t\t\t// Rebuilding it makes it reappear.\n\t\t\tOO.ui.Element.static.reconsiderScrollbars( this.panels.getCurrentItem().$element[ 0 ] );\n\n\t\t\t// Support: Firefox\n\t\t\t// In Firefox, trying to focus a hidden input will throw an\n\t\t\t// exception. This would happen when opening the preview via\n\t\t\t// keyboard shortcut.\n\t\t\tif ( this.panels.getCurrentItem() === this.savePanel ) {\n\t\t\t\t// This includes a #focus call\n\t\t\t\tthis.editSummaryInput.moveCursorToEnd();\n\t\t\t}\n\t\t\tthis.emit( 'changePanel' );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWSaveDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.emit( 'close' );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getEscapeAction = function () {\n\tconst backOrClose = this.actions.get( { flags: [ 'back', 'close' ], visible: true } );\n\tif ( backOrClose.length ) {\n\t\treturn backOrClose[ 0 ].getAction();\n\t}\n\treturn null;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getActionProcess = function ( action ) {\n\tve.track( 'activity.' + this.constructor.static.name, { action: 'dialog-' + ( action || 'abort' ) } );\n\n\tif ( action === 'save' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tconst saveDeferred = ve.createDeferred();\n\t\t\tthis.clearMessage( 'keyboard-shortcut-submit' );\n\t\t\tthis.emit( 'save', saveDeferred );\n\t\t\treturn saveDeferred.promise();\n\t\t} );\n\t}\n\tif ( action === 'review' || action === 'preview' || action === 'resolve' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tthis.emit( action );\n\t\t} );\n\t}\n\tif ( action === 'approve' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tthis.swapPanel( 'save' );\n\t\t} );\n\t}\n\n\treturn ve.ui.MWSaveDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWSaveDialog.prototype.getBodyHeight = function () {\n\t// Don't vary the height when the foot is made visible or not\n\treturn this.panels.getCurrentItem().$element.outerHeight( true );\n};\n\n/**\n * Handle retry button click events.\n *\n * Hides errors and then tries again.\n */\nve.ui.MWSaveDialog.prototype.onRetryButtonClick = function () {\n\tthis.emit( 'retry' );\n\tve.ui.MWSaveDialog.super.prototype.onRetryButtonClick.apply( this, arguments );\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWSaveDialog );\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/modules/ve-mw/ui/dialogs/ve.ui.MWTableDialog.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/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":363,"column":4,"nodeType":"CallExpression","endLine":404,"endColumn":7}],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'template_names' is not in camel case.","line":384,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":384,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_edit_count_bucket' is not in camel case.","line":389,"column":20,"nodeType":"Identifier","messageId":"notCamelCase","endLine":389,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'template_names' is not in camel case.","line":465,"column":6,"nodeType":"Identifier","messageId":"notCamelCase","endLine":465,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_edit_count_bucket' is not in camel case.","line":470,"column":20,"nodeType":"Identifier","messageId":"notCamelCase","endLine":470,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWTemplateDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Abstract base class for dialogs that allow to insert and edit MediaWiki transclusions, i.e. a\n * sequence of one or more template invocations that strictly belong to each other (e.g. because\n * they are unbalanced), possibly mixed with raw wikitext snippets. Currently used for:\n * - {@see ve.ui.MWTransclusionDialog} for arbitrary transclusions. Registered via the name\n * \"transclusion\".\n * - {@see ve.ui.MWCitationDialog} in the Cite extension for the predefined citation types from\n * [[MediaWiki:visualeditor-cite-tool-definition.json]]. These are strictly limited to a single\n * template invocation. Registered via the name \"cite\".\n *\n * @class\n * @abstract\n * @extends ve.ui.NodeDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @property {ve.dm.MWTransclusionModel|null} transclusionModel\n * @property {ve.ui.MWTransclusionOutlineWidget} sidebar\n * @property {boolean} [canGoBack=false]\n */\nve.ui.MWTemplateDialog = function VeUiMWTemplateDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWTemplateDialog.super.call( this, config );\n\n\t// Properties\n\tthis.transclusionModel = null;\n\tthis.loaded = false;\n\tthis.altered = false;\n\tthis.canGoBack = false;\n\tthis.preventReselection = false;\n\n\tthis.confirmDialogs = new ve.ui.WindowManager( { factory: ve.ui.windowFactory, isolate: true } );\n\t$( OO.ui.getTeleportTarget() ).append( this.confirmDialogs.$element );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTemplateDialog, ve.ui.NodeDialog );\n\n/* Static Properties */\n\nve.ui.MWTemplateDialog.static.modelClasses = [ ve.dm.MWTransclusionNode ];\n\n/**\n * Configuration for the {@see ve.ui.MWTwoPaneTransclusionDialogLayout} used in this dialog.\n *\n * @static\n * @property {Object}\n * @inheritable\n */\nve.ui.MWTemplateDialog.static.bookletLayoutConfig = {};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWTemplateDialog.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tif ( this.transclusionModel.isEmpty() ) {\n\t\t\t\t// Focus the template placeholder input field.\n\t\t\t\tthis.bookletLayout.focus();\n\t\t\t}\n\n\t\t\tthis.bookletLayout.getPagesOrdered().forEach( ( page ) => {\n\t\t\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\t\t\tpage.updateSize();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n};\n\n/**\n * Update dialog actions whenever the content changes.\n *\n * @private\n */\nve.ui.MWTemplateDialog.prototype.touch = function () {\n\tif ( this.loaded ) {\n\t\tthis.altered = true;\n\t\tthis.setApplicableStatus();\n\t}\n};\n\n/**\n * Handle parts being replaced.\n *\n * @protected\n * @param {ve.dm.MWTransclusionPartModel|null} removed Removed part\n * @param {ve.dm.MWTransclusionPartModel|null} added Added part\n */\nve.ui.MWTemplateDialog.prototype.onReplacePart = function ( removed, added ) {\n\tconst removePages = [];\n\n\tif ( removed ) {\n\t\t// Remove parameter pages of removed templates\n\t\tif ( removed instanceof ve.dm.MWTemplateModel ) {\n\t\t\tconst params = removed.getParameters();\n\t\t\tfor ( const name in params ) {\n\t\t\t\tremovePages.push( params[ name ].getId() );\n\t\t\t}\n\t\t\tremoved.disconnect( this );\n\t\t}\n\t\tremovePages.push( removed.getId() );\n\t\tthis.bookletLayout.removePages( removePages );\n\t}\n\n\tif ( added ) {\n\t\tconst page = this.getPageFromPart( added );\n\t\tif ( page ) {\n\t\t\tlet reselect;\n\n\t\t\tthis.bookletLayout.addPages( [ page ], this.transclusionModel.getIndex( added ) );\n\t\t\tif ( removed ) {\n\t\t\t\t// When we're replacing a part, it can only be a template placeholder\n\t\t\t\t// becoming an actual template. Focus this new template.\n\t\t\t\treselect = added.getId();\n\t\t\t}\n\n\t\t\tif ( added instanceof ve.dm.MWTemplateModel ) {\n\t\t\t\t// Prevent selection changes while parameters are added\n\t\t\t\tthis.preventReselection = true;\n\n\t\t\t\t// Add existing params to templates (the template might be being moved)\n\t\t\t\tconst names = added.getOrderedParameterNames();\n\t\t\t\tfor ( let i = 0; i < names.length; i++ ) {\n\t\t\t\t\tthis.onAddParameter( added.getParameter( names[ i ] ) );\n\t\t\t\t}\n\t\t\t\tadded.connect( this, { add: 'onAddParameter', remove: 'onRemoveParameter' } );\n\n\t\t\t\tthis.preventReselection = false;\n\n\t\t\t\tif ( this.loaded ) {\n\t\t\t\t\tif ( reselect ) {\n\t\t\t\t\t\tthis.bookletLayout.focusPart( reselect );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst documentedParameters = added.getSpec().getDocumentedParameterOrder(),\n\t\t\t\t\tundocumentedParameters = added.getSpec().getUndocumentedParameterNames();\n\n\t\t\t\tif ( !documentedParameters.length || undocumentedParameters.length ) {\n\t\t\t\t\tpage.addPlaceholderParameter();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( added || removed ) {\n\t\tthis.touch();\n\t}\n\tthis.updateTitle();\n};\n\n/**\n * Handle add param events.\n *\n * @private\n * @param {ve.dm.MWParameterModel} param Added param\n */\nve.ui.MWTemplateDialog.prototype.onAddParameter = function ( param ) {\n\tlet page;\n\n\tif ( param.getName() ) {\n\t\tpage = new ve.ui.MWParameterPage( param, {\n\t\t\t$overlay: this.$overlay, readOnly: this.isReadOnly()\n\t\t} )\n\t\t\t.connect( this, {\n\t\t\t\thasValueChange: 'onHasValueChange'\n\t\t\t} );\n\t} else {\n\t\t// Create parameter placeholder.\n\t\tpage = new ve.ui.MWAddParameterPage( param, param.getId(), {\n\t\t\t$overlay: this.$overlay\n\t\t} )\n\t\t\t.connect( this, {\n\t\t\t\ttemplateParameterAdded: this.bookletLayout.focusPart.bind( this.bookletLayout )\n\t\t\t} );\n\t}\n\tthis.bookletLayout.addPages( [ page ], this.transclusionModel.getIndex( param ) );\n\tif ( this.loaded ) {\n\t\tthis.touch();\n\n\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\tpage.updateSize();\n\t\t}\n\t}\n};\n\n/**\n * Handle remove param events.\n *\n * @private\n * @param {ve.dm.MWParameterModel} param Removed param\n */\nve.ui.MWTemplateDialog.prototype.onRemoveParameter = function ( param ) {\n\tthis.bookletLayout.removePages( [ param.getId() ] );\n\n\tthis.touch();\n};\n\n/**\n * Sets transclusion applicable status\n *\n * If the transclusion is empty or only contains a placeholder it will not be insertable.\n * If the transclusion only contains a placeholder it will not be editable.\n *\n * @private\n */\nve.ui.MWTemplateDialog.prototype.setApplicableStatus = function () {\n\tconst canSave = !this.transclusionModel.isEmpty();\n\tthis.actions.setAbilities( { done: canSave && this.altered } );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getBodyHeight = function () {\n\treturn 400;\n};\n\n/**\n * Get a page for a transclusion part.\n *\n * @protected\n * @param {ve.dm.MWTransclusionModel} part Part to get page for\n * @return {OO.ui.PageLayout|null} Page for part, null if no matching page could be found\n */\nve.ui.MWTemplateDialog.prototype.getPageFromPart = function ( part ) {\n\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\treturn new ve.ui.MWTemplatePage( part, part.getId(), { $overlay: this.$overlay, isReadOnly: this.isReadOnly() } );\n\t} else if ( part instanceof ve.dm.MWTemplatePlaceholderModel ) {\n\t\treturn new ve.ui.MWTemplatePlaceholderPage(\n\t\t\tpart,\n\t\t\tpart.getId(),\n\t\t\t{ $overlay: this.$overlay }\n\t\t);\n\t}\n\treturn null;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getSelectedNode = function ( data ) {\n\tconst selectedNode = ve.ui.MWTemplateDialog.super.prototype.getSelectedNode.call( this );\n\n\t// Data initialization\n\tdata = data || {};\n\n\t// Require template to match if specified\n\tif ( selectedNode && data.template && !selectedNode.isSingleTemplate( data.template ) ) {\n\t\treturn null;\n\t}\n\n\treturn selectedNode;\n};\n\n/**\n * Update the dialog title.\n *\n * @protected\n */\nve.ui.MWTemplateDialog.prototype.updateTitle = function () {\n\tlet title = ve.msg( 'visualeditor-dialog-transclusion-loading' );\n\n\tif ( this.transclusionModel.isSingleTemplate() ) {\n\t\tconst part = this.transclusionModel.getParts()[ 0 ];\n\t\tif ( part instanceof ve.dm.MWTemplateModel ) {\n\t\t\ttitle = ve.msg(\n\t\t\t\tthis.getMode() === 'insert' ?\n\t\t\t\t\t'visualeditor-dialog-transclusion-title-insert-known-template' :\n\t\t\t\t\t'visualeditor-dialog-transclusion-title-edit-known-template',\n\t\t\t\tpart.getSpec().getLabel()\n\t\t\t);\n\t\t} else {\n\t\t\ttitle = ve.msg( 'visualeditor-dialog-transclusion-title-insert-template' );\n\t\t}\n\t}\n\tthis.title.setLabel( title );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWTemplateDialog.super.prototype.initialize.call( this );\n\n\t// Properties\n\tthis.bookletLayout = new ve.ui.MWTwoPaneTransclusionDialogLayout( this.constructor.static.bookletLayoutConfig );\n\t// TODO: Remove once all references are gone.\n\tthis.sidebar = this.bookletLayout.sidebar;\n\n\t// Initialization\n\tthis.$content.addClass( 've-ui-mwTemplateDialog' );\n\t// bookletLayout is appended after the form has been built in getSetupProcess for performance\n};\n\n/**\n * If the user has left blank required parameters, confirm that they actually want to do this.\n * If no required parameters were left blank, or if they were but the user decided to go ahead\n * anyway, the returned deferred will be resolved.\n * Otherwise, the returned deferred will be rejected.\n *\n * @private\n * @return {jQuery.Deferred}\n */\nve.ui.MWTemplateDialog.prototype.checkRequiredParameters = function () {\n\tconst blankRequired = [],\n\t\tdeferred = ve.createDeferred();\n\n\tthis.bookletLayout.stackLayout.getItems().forEach( ( page ) => {\n\t\tif ( !( page instanceof ve.ui.MWParameterPage ) ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( page.parameter.isRequired() && !page.valueInput.getValue() ) {\n\t\t\tblankRequired.push( mw.msg(\n\t\t\t\t'quotation-marks',\n\t\t\t\tpage.parameter.template.getSpec().getParameterLabel( page.parameter.getName() )\n\t\t\t) );\n\t\t}\n\t} );\n\tif ( blankRequired.length ) {\n\t\tthis.confirmDialogs.openWindow( 'requiredparamblankconfirm', {\n\t\t\tmessage: mw.msg(\n\t\t\t\t'visualeditor-dialog-transclusion-required-parameter-is-blank',\n\t\t\t\tmw.language.listToText( blankRequired ),\n\t\t\t\tblankRequired.length\n\t\t\t),\n\t\t\ttitle: mw.msg(\n\t\t\t\t'visualeditor-dialog-transclusion-required-parameter-dialog-title',\n\t\t\t\tblankRequired.length\n\t\t\t)\n\t\t} ).closed.then( ( data ) => {\n\t\t\tif ( data && data.action === 'ok' ) {\n\t\t\t\tdeferred.resolve();\n\t\t\t} else {\n\t\t\t\tdeferred.reject();\n\t\t\t}\n\t\t} );\n\t} else {\n\t\tdeferred.resolve();\n\t}\n\treturn deferred.promise();\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getActionProcess = function ( action ) {\n\tif ( action === 'done' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tconst deferred = ve.createDeferred();\n\t\t\tthis.checkRequiredParameters().done( () => {\n\t\t\t\tconst surfaceModel = this.getFragment().getSurface(),\n\t\t\t\t\tobj = this.transclusionModel.getPlainObject();\n\n\t\t\t\tthis.pushPending();\n\n\t\t\t\tlet modelPromise = ve.createDeferred().resolve().promise();\n\t\t\t\tif ( this.selectedNode instanceof ve.dm.MWTransclusionNode ) {\n\t\t\t\t\tthis.transclusionModel.updateTransclusionNode( surfaceModel, this.selectedNode );\n\t\t\t\t\t// TODO: updating the node could result in the inline/block state change\n\t\t\t\t} else if ( obj !== null ) {\n\t\t\t\t\t// Collapse returns a new fragment, so update this.fragment\n\t\t\t\t\tthis.fragment = this.getFragment().collapseToEnd();\n\t\t\t\t\tmodelPromise = this.transclusionModel.insertTransclusionNode( this.getFragment() );\n\t\t\t\t}\n\n\t\t\t\t// TODO tracking will only be implemented temporarily to answer questions on\n\t\t\t\t// template usage for the Technical Wishes topic area see T258917\n\t\t\t\tconst templateEvent = {\n\t\t\t\t\taction: 'save',\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplate_names: []\n\t\t\t\t};\n\t\t\t\tconst editCountBucket = mw.config.get( 'wgUserEditCountBucket' );\n\t\t\t\tif ( editCountBucket !== null ) {\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplateEvent.user_edit_count_bucket = editCountBucket;\n\t\t\t\t}\n\t\t\t\tconst parts = this.transclusionModel.getParts();\n\t\t\t\tfor ( let i = 0; i < parts.length; i++ ) {\n\t\t\t\t\t// Only {@see ve.dm.MWTemplateModel} have a title\n\t\t\t\t\tconst title = parts[ i ].getTitle && parts[ i ].getTitle();\n\t\t\t\t\tif ( title ) {\n\t\t\t\t\t\ttemplateEvent.template_names.push( title );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmw.track( 'event.VisualEditorTemplateDialogUse', templateEvent );\n\n\t\t\t\treturn modelPromise.then( () => {\n\t\t\t\t\tthis.close( { action: action } ).closed.always( this.popPending.bind( this ) );\n\t\t\t\t} );\n\t\t\t} ).always( deferred.resolve );\n\n\t\t\treturn deferred;\n\t\t} );\n\t}\n\n\treturn ve.ui.MWTemplateDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getSetupProcess = function ( data ) {\n\tdata = data || {};\n\treturn ve.ui.MWTemplateDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tlet promise;\n\n\t\t\t// Properties\n\t\t\tthis.loaded = false;\n\t\t\tthis.altered = false;\n\t\t\tthis.transclusionModel = new ve.dm.MWTransclusionModel( this.getFragment().getDocument() );\n\n\t\t\t// Events\n\t\t\tthis.transclusionModel.connect( this, {\n\t\t\t\treplace: 'onReplacePart',\n\t\t\t\tchange: 'touch'\n\t\t\t} );\n\n\t\t\t// Detach the form while building for performance\n\t\t\tthis.bookletLayout.$element.detach();\n\n\t\t\tthis.transclusionModel.connect( this.bookletLayout, { replace: 'onReplacePart' } );\n\n\t\t\t// Initialization\n\t\t\tif ( !this.selectedNode ) {\n\t\t\t\tif ( data.template ) {\n\t\t\t\t\t// The template name is from MediaWiki:Visualeditor-cite-tool-definition.json,\n\t\t\t\t\t// passed via a ve.ui.Command, which triggers a ve.ui.MWCitationAction, which\n\t\t\t\t\t// executes ve.ui.WindowAction.open(), which opens this dialog.\n\t\t\t\t\tconst template = ve.dm.MWTemplateModel.newFromName(\n\t\t\t\t\t\tthis.transclusionModel, data.template\n\t\t\t\t\t);\n\t\t\t\t\tpromise = this.transclusionModel.addPart( template );\n\t\t\t\t} else {\n\t\t\t\t\t// Open the dialog to add a new template, always starting with a placeholder\n\t\t\t\t\tconst placeholderPage = new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel );\n\t\t\t\t\tpromise = this.transclusionModel.addPart( placeholderPage );\n\t\t\t\t\tpromise.then( () => {\n\t\t\t\t\t\tthis.bookletLayout.setPage( placeholderPage.getId() );\n\t\t\t\t\t} );\n\t\t\t\t\tthis.canGoBack = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Open the dialog to edit an existing template\n\n\t\t\t\t// TODO tracking will only be implemented temporarily to answer questions on\n\t\t\t\t// template usage for the Technical Wishes topic area see T258917\n\t\t\t\tconst templateEvent = {\n\t\t\t\t\taction: 'edit',\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplate_names: []\n\t\t\t\t};\n\t\t\t\tconst editCountBucket = mw.config.get( 'wgUserEditCountBucket' );\n\t\t\t\tif ( editCountBucket !== null ) {\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\ttemplateEvent.user_edit_count_bucket = editCountBucket;\n\t\t\t\t}\n\t\t\t\tfor ( let i = 0; i < this.selectedNode.partsList.length; i++ ) {\n\t\t\t\t\tif ( this.selectedNode.partsList[ i ].templatePage ) {\n\t\t\t\t\t\ttemplateEvent.template_names.push( this.selectedNode.partsList[ i ].templatePage );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmw.track( 'event.VisualEditorTemplateDialogUse', templateEvent );\n\n\t\t\t\tpromise = this.transclusionModel\n\t\t\t\t\t.load( ve.copy( this.selectedNode.getAttribute( 'mw' ) ) )\n\t\t\t\t\t.then( this.initializeTemplateParameters.bind( this ) );\n\t\t\t}\n\t\t\tthis.actions.setAbilities( { done: false } );\n\n\t\t\treturn promise.then( () => {\n\t\t\t\t// Add missing required and suggested parameters to each transclusion.\n\t\t\t\tthis.transclusionModel.addPromptedParameters();\n\n\t\t\t\tthis.$body.append( this.bookletLayout.$element );\n\t\t\t\tthis.$element.addClass( 've-ui-mwTemplateDialog-ready' );\n\t\t\t\tthis.loaded = true;\n\t\t\t} );\n\t\t} );\n};\n\n/**\n * Intentionally empty. This is provided for Wikia extensibility.\n */\nve.ui.MWTemplateDialog.prototype.initializeTemplateParameters = function () {};\n\n/**\n * @private\n * @param {string} pageName\n * @param {boolean} hasValue\n */\nve.ui.MWTemplateDialog.prototype.onHasValueChange = function ( pageName, hasValue ) {\n\tthis.sidebar.toggleHasValueByPageName( pageName, hasValue );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTemplateDialog.prototype.getTeardownProcess = function ( data ) {\n\treturn ve.ui.MWTemplateDialog.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\t// Cleanup\n\t\t\tthis.$element.removeClass( 've-ui-mwTemplateDialog-ready' );\n\t\t\tthis.transclusionModel.disconnect( this );\n\t\t\tthis.transclusionModel.abortAllApiRequests();\n\t\t\tthis.transclusionModel = null;\n\t\t\tthis.bookletLayout.clearPages();\n\t\t\tthis.content = null;\n\t\t} );\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":103,"column":3,"nodeType":"CallExpression","endLine":103,"endColumn":88},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":429,"column":3,"nodeType":"CallExpression","endLine":429,"endColumn":88},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":528,"column":2,"nodeType":"CallExpression","endLine":532,"endColumn":6}],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":312,"column":3,"nodeType":"CallExpression","endLine":312,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWTransclusionDialog class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Dialog for inserting and editing MediaWiki transclusions, i.e. a sequence of one or more template\n * invocations that strictly belong to each other (e.g. because they are unbalanced), possibly\n * mixed with raw wikitext snippets.\n *\n * Note the base class {@see ve.ui.MWTemplateDialog} alone does not allow to manage more than a\n * single template invocation. Most of the code for this feature set is exclusive to this subclass.\n *\n * @class\n * @extends ve.ui.MWTemplateDialog\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWTransclusionDialog = function VeUiMWTransclusionDialog( config ) {\n\t// Parent constructor\n\tve.ui.MWTransclusionDialog.super.call( this, config );\n\n\t// Properties\n\tthis.isSidebarExpanded = null;\n\n\tthis.hotkeyTriggers = {};\n\tthis.$element.on( 'keydown', this.onKeyDown.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWTransclusionDialog, ve.ui.MWTemplateDialog );\n\n/* Static Properties */\n\nve.ui.MWTransclusionDialog.static.name = 'transclusion';\n\nve.ui.MWTransclusionDialog.static.size = 'larger';\n\nve.ui.MWTransclusionDialog.static.actions = [\n\t...ve.ui.MWTemplateDialog.static.actions,\n\t{\n\t\taction: 'mode',\n\t\t// label is set by updateModeActionState\n\t\tmodes: [ 'edit', 'insert' ]\n\t},\n\t{\n\t\taction: 'back',\n\t\tlabel: OO.ui.deferMsg( 'visualeditor-dialog-action-goback' ),\n\t\tmodes: [ 'edit', 'insert' ],\n\t\tflags: [ 'safe', 'back' ]\n\t}\n];\n\nve.ui.MWTransclusionDialog.static.smallScreenMaxWidth = 540;\n\n/* Static Methods */\n\n/**\n * @return {boolean}\n */\nve.ui.MWTransclusionDialog.static.isSmallScreen = function () {\n\treturn $( window ).width() <= ve.ui.MWTransclusionDialog.static.smallScreenMaxWidth;\n};\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getEscapeAction = function () {\n\tconst backOrClose = this.actions.get( { flags: [ 'back', 'close' ], visible: true } );\n\tif ( backOrClose.length ) {\n\t\treturn backOrClose[ 0 ].getAction();\n\t}\n\treturn null;\n};\n\n/**\n * Handle outline controls move events.\n *\n * @private\n * @param {number} places Number of places to move the selected item\n */\nve.ui.MWTransclusionDialog.prototype.onOutlineControlsMove = function ( places ) {\n\tconst part = this.transclusionModel.getPartFromId( this.bookletLayout.getSelectedTopLevelPartId() );\n\tif ( !part ) {\n\t\treturn;\n\t}\n\n\tconst newPlace = this.transclusionModel.getParts().indexOf( part ) + places;\n\tif ( newPlace < 0 || newPlace >= this.transclusionModel.getParts().length ) {\n\t\treturn;\n\t}\n\n\t// Move part to new location, and if dialog is loaded switch to new part page\n\tconst promise = this.transclusionModel.addPart( part, newPlace );\n\tif ( this.loaded && !this.preventReselection ) {\n\t\t// FIXME: Should be handled internally {@see ve.ui.MWTwoPaneTransclusionDialogLayout}\n\t\tpromise.done( this.bookletLayout.focusPart.bind( this.bookletLayout, part.getId() ) );\n\t}\n};\n\n/**\n * Handle outline controls remove events.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.onOutlineControlsRemove = function () {\n\tconst controls = this.bookletLayout.getOutlineControls();\n\t// T301914: Safe-guard for when a keyboard shortcut triggers this, instead of the actual button\n\tif ( !controls.isVisible() ||\n\t\t!controls.removeButton.isVisible() ||\n\t\tcontrols.removeButton.isDisabled()\n\t) {\n\t\treturn;\n\t}\n\n\tconst partId = this.bookletLayout.getSelectedTopLevelPartId(),\n\t\tpart = this.transclusionModel.getPartFromId( partId );\n\tif ( part ) {\n\t\tthis.transclusionModel.removePart( part );\n\t}\n};\n\n/**\n * Create a new template part at the end of the transclusion.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.addTemplatePlaceholder = function () {\n\tthis.addPart( new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel ) );\n};\n\n/**\n * Handle add wikitext button click or hotkey events.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.addWikitext = function () {\n\tthis.addPart( new ve.dm.MWTransclusionContentModel( this.transclusionModel ) );\n};\n\n/**\n * Handle add parameter hotkey events.\n *\n * @private\n * @param {jQuery.Event} e Key down event\n */\nve.ui.MWTransclusionDialog.prototype.addParameter = function ( e ) {\n\t// Check if the focus was in e.g. a parameter list or filter input when the hotkey was pressed\n\tlet partId = this.bookletLayout.sidebar.findPartIdContainingElement( e.target ),\n\t\tpart = this.transclusionModel.getPartFromId( partId );\n\n\tif ( !( part instanceof ve.dm.MWTemplateModel ) ) {\n\t\t// Otherwise add to the template that's currently selected via its title or parameter\n\t\tpartId = this.bookletLayout.getTopLevelPartIdForSelection();\n\t\tpart = this.transclusionModel.getPartFromId( partId );\n\t}\n\n\tif ( this.transclusionModel.isSingleTemplate() ) {\n\t\tpart = this.transclusionModel.getParts()[ 0 ];\n\t}\n\n\tif ( !( part instanceof ve.dm.MWTemplateModel ) ) {\n\t\treturn;\n\t}\n\n\t// TODO: Use a distinct class for placeholder model rather than\n\t// these magical \"empty\" constants.\n\tconst placeholderParameter = new ve.dm.MWParameterModel( part );\n\tpart.addParameter( placeholderParameter );\n\tthis.bookletLayout.focusPart( placeholderParameter.getId() );\n\n\tthis.autoExpandSidebar();\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.onReplacePart = function ( removed, added ) {\n\tve.ui.MWTransclusionDialog.super.prototype.onReplacePart.call( this, removed, added );\n\tconst parts = this.transclusionModel.getParts();\n\n\tif ( parts.length === 0 ) {\n\t\tthis.addPart( new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel ) );\n\t} else if ( parts.length > 1 ) {\n\t\tthis.$element.removeClass( 've-ui-mwTransclusionDialog-single-transclusion' );\n\t}\n\n\t// multipart message\n\tthis.bookletLayout.stackLayout.$element.prepend( this.multipartMessage.$element );\n\tthis.multipartMessage.toggle( parts.length > 1 );\n\n\tthis.autoExpandSidebar();\n\tthis.updateModeActionState();\n\tthis.updateActionSet();\n};\n\n/**\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.setupHotkeyTriggers = function () {\n\t// Lower-case modifier and key names as specified in {@see ve.ui.Trigger}\n\tconst isMac = ve.getSystemPlatform() === 'mac',\n\t\tmeta = isMac ? 'meta+' : 'ctrl+';\n\tconst hotkeys = {\n\t\taddTemplate: meta + 'd',\n\t\taddWikitext: meta + 'shift+y',\n\t\taddParameter: meta + 'shift+d',\n\t\tmoveUp: meta + 'shift+up',\n\t\tmoveDown: meta + 'shift+down',\n\t\tremove: meta + 'delete',\n\t\tremoveBackspace: meta + 'backspace'\n\t};\n\n\tconst notInTextFields = /^(?!INPUT|TEXTAREA)/i;\n\tthis.connectHotKeyBinding( hotkeys.addTemplate, this.addTemplatePlaceholder.bind( this ) );\n\tthis.connectHotKeyBinding( hotkeys.addWikitext, this.addWikitext.bind( this ) );\n\tthis.connectHotKeyBinding( hotkeys.addParameter, this.addParameter.bind( this ) );\n\tthis.connectHotKeyBinding( hotkeys.moveUp, this.onOutlineControlsMove.bind( this, -1 ), notInTextFields );\n\tthis.connectHotKeyBinding( hotkeys.moveDown, this.onOutlineControlsMove.bind( this, 1 ), notInTextFields );\n\tthis.connectHotKeyBinding( hotkeys.remove, this.onOutlineControlsRemove.bind( this ), notInTextFields );\n\tif ( isMac ) {\n\t\tthis.connectHotKeyBinding( hotkeys.removeBackspace, this.onOutlineControlsRemove.bind( this ), notInTextFields );\n\t}\n\n\tconst controls = this.bookletLayout.getOutlineControls();\n\tthis.addHotkeyToTitle( controls.addTemplateButton, hotkeys.addTemplate );\n\tthis.addHotkeyToTitle( controls.addWikitextButton, hotkeys.addWikitext );\n\tthis.addHotkeyToTitle( controls.upButton, hotkeys.moveUp );\n\tthis.addHotkeyToTitle( controls.downButton, hotkeys.moveDown );\n\tthis.addHotkeyToTitle( controls.removeButton, hotkeys.remove );\n};\n\n/**\n * @private\n * @param {string} hotkey\n * @param {Function} handler\n * @param {RegExp} [validTypes]\n */\nve.ui.MWTransclusionDialog.prototype.connectHotKeyBinding = function ( hotkey, handler, validTypes ) {\n\tthis.hotkeyTriggers[ hotkey ] = {\n\t\thandler: handler,\n\t\tvalidTypes: validTypes\n\t};\n};\n\n/**\n * @private\n * @param {OO.ui.mixin.TitledElement} element\n * @param {string} hotkey\n */\nve.ui.MWTransclusionDialog.prototype.addHotkeyToTitle = function ( element, hotkey ) {\n\t// Separated with a space as in {@see OO.ui.Tool.updateTitle}\n\telement.setTitle( element.getTitle() + ' ' + new ve.ui.Trigger( hotkey ).getMessage() );\n};\n\n/**\n * Handles key down events.\n *\n * @protected\n * @param {jQuery.Event} e Key down event\n */\nve.ui.MWTransclusionDialog.prototype.onKeyDown = function ( e ) {\n\tconst hotkey = new ve.ui.Trigger( e ).toString(),\n\t\ttrigger = this.hotkeyTriggers[ hotkey ];\n\n\tif ( trigger && ( !trigger.validTypes || trigger.validTypes.test( e.target.nodeName ) ) ) {\n\t\ttrigger.handler( e );\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getPageFromPart = function ( part ) {\n\tconst page = ve.ui.MWTransclusionDialog.super.prototype.getPageFromPart.call( this, part );\n\tif ( !page && part instanceof ve.dm.MWTransclusionContentModel ) {\n\t\treturn new ve.ui.MWTransclusionContentPage( part, part.getId(), { $overlay: this.$overlay, isReadOnly: this.isReadOnly() } );\n\t}\n\treturn page;\n};\n\n/**\n * Automatically expand or collapse the sidebar according to default logic.\n *\n * @protected\n */\nve.ui.MWTransclusionDialog.prototype.autoExpandSidebar = function () {\n\tlet expandSidebar;\n\n\tconst isSmallScreen = this.constructor.static.isSmallScreen();\n\n\tconst showOtherActions = isSmallScreen ||\n\t\t// Check for unknown actions, show the toolbar if any are available.\n\t\tthis.actions.getOthers().some( ( action ) => action.action !== 'mode' );\n\tthis.actions.forEach( { actions: [ 'mode' ] }, ( action ) => {\n\t\taction.toggle( isSmallScreen );\n\t} );\n\tthis.$otherActions.toggleClass( 'oo-ui-element-hidden', !showOtherActions );\n\n\tif ( isSmallScreen && this.transclusionModel.isEmpty() ) {\n\t\texpandSidebar = false;\n\t} else if ( isSmallScreen &&\n\t\t// eslint-disable-next-line no-jquery/no-class-state\n\t\tthis.$content.hasClass( 've-ui-mwTransclusionDialog-small-screen' )\n\t) {\n\t\t// We did this already. If the sidebar is visible or not is now the user's decision.\n\t\treturn;\n\t} else {\n\t\texpandSidebar = !isSmallScreen;\n\t}\n\n\tthis.$content.toggleClass( 've-ui-mwTransclusionDialog-small-screen', isSmallScreen );\n\n\tthis.toggleSidebar( expandSidebar );\n};\n\n/**\n * Set if the sidebar is visible (which means the dialog is expanded), or collapsed.\n *\n * @param {boolean} expandSidebar\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.toggleSidebar = function ( expandSidebar ) {\n\tif ( this.isSidebarExpanded === expandSidebar ) {\n\t\treturn;\n\t}\n\n\tthis.isSidebarExpanded = expandSidebar;\n\tthis.$content\n\t\t.toggleClass( 've-ui-mwTransclusionDialog-collapsed', !expandSidebar )\n\t\t.toggleClass( 've-ui-mwTransclusionDialog-expanded', expandSidebar );\n\n\tthis.bookletLayout.toggleOutline( expandSidebar );\n\tthis.updateTitle();\n\tthis.updateModeActionState();\n\n\t// HACK blur any active input so that its dropdown will be hidden and won't end\n\t// up being mispositioned\n\tthis.$content.find( 'input:focus' ).trigger( 'blur' );\n\n\tif ( this.loaded && this.constructor.static.isSmallScreen() ) {\n\t\t// Updates the page sizes when the menu is toggled using the button. This needs\n\t\t// to happen after the animation when the panel is visible.\n\t\tsetTimeout( () => {\n\t\t\tthis.bookletLayout.stackLayout.getItems().forEach( ( page ) => {\n\t\t\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\t\t\tpage.updateSize();\n\t\t\t\t}\n\t\t\t} );\n\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\n\t\t// Reapply selection and scrolling when switching between panes.\n\t\tconst selectedPage = this.bookletLayout.getCurrentPage();\n\t\tif ( selectedPage ) {\n\t\t\tconst name = selectedPage.getName();\n\t\t\t// Align whichever panel is becoming visible, after animation completes.\n\t\t\t// TODO: Should hook onto an animation promise—but is this possible when pure CSS?\n\t\t\tsetTimeout( () => {\n\t\t\t\tif ( expandSidebar ) {\n\t\t\t\t\tthis.sidebar.setSelectionByPageName( name );\n\t\t\t\t} else {\n\t\t\t\t\tselectedPage.scrollElementIntoView( { alignToTop: true, padding: { top: 20 } } );\n\t\t\t\t\tif ( !OO.ui.isMobile() ) {\n\t\t\t\t\t\tselectedPage.focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, OO.ui.theme.getDialogTransitionDuration() );\n\t\t}\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.updateTitle = function () {\n\tif ( !this.transclusionModel.isSingleTemplate() ) {\n\t\tthis.title.setLabel( ve.msg( 'visualeditor-dialog-transclusion-title-edit-transclusion' ) );\n\t} else {\n\t\t// Parent method\n\t\tve.ui.MWTransclusionDialog.super.prototype.updateTitle.call( this );\n\t}\n};\n\n/**\n * Update the state of the 'mode' action\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.updateModeActionState = function () {\n\tconst isExpanded = this.isSidebarExpanded,\n\t\tlabel = ve.msg( isExpanded ?\n\t\t\t'visualeditor-dialog-transclusion-collapse-options' :\n\t\t\t'visualeditor-dialog-transclusion-expand-options' );\n\n\tthis.actions.forEach( { actions: [ 'mode' ] }, ( action ) => {\n\t\taction.setLabel( label );\n\t\taction.$button.attr( 'aria-expanded', isExpanded ? 1 : 0 );\n\t} );\n\n\t// The button is only visible on very narrow screens, {@see autoExpandSidebar}.\n\t// It's always needed, except in the initial placeholder state.\n\tconst isInitialState = !isExpanded && this.transclusionModel.isEmpty(),\n\t\tcanCollapse = !isInitialState;\n\tthis.actions.setAbilities( { mode: canCollapse } );\n};\n\n/**\n * Add a part to the transclusion.\n *\n * @param {ve.dm.MWTransclusionPartModel} part Part to add\n */\nve.ui.MWTransclusionDialog.prototype.addPart = function ( part ) {\n\tconst parts = this.transclusionModel.getParts(),\n\t\tpartId = this.bookletLayout.getTopLevelPartIdForSelection(),\n\t\tselectedPart = this.transclusionModel.getPartFromId( partId );\n\t// Insert after selected part, or at the end if nothing is selected\n\tconst index = selectedPart ? parts.indexOf( selectedPart ) + 1 : parts.length;\n\t// Add the part, and if dialog is loaded switch to part page\n\tconst promise = this.transclusionModel.addPart( part, index );\n\tif ( this.loaded && !this.preventReselection ) {\n\t\tpromise.done( this.bookletLayout.focusPart.bind( this.bookletLayout, part.getId() ) );\n\t}\n};\n\n/**\n * Show a confirm prompt before closing the dialog\n *\n * @param {string} prompt Prompt\n * @return {jQuery.Promise} Close promise\n */\nve.ui.MWTransclusionDialog.prototype.closeConfirm = function ( prompt ) {\n\treturn OO.ui.confirm( prompt, {\n\t\tactions: [\n\t\t\t{\n\t\t\t\taction: 'reject',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-transclusion-confirmation-reject' ),\n\t\t\t\tflags: 'safe'\n\t\t\t},\n\t\t\t{\n\t\t\t\taction: 'accept',\n\t\t\t\tlabel: ve.msg( 'visualeditor-dialog-transclusion-confirmation-discard' ),\n\t\t\t\t// TODO: Destructive actions don't get focus by default, but maybe should here?\n\t\t\t\tflags: 'destructive'\n\t\t\t}\n\t\t]\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getActionProcess = function ( action ) {\n\tconst willLoseProgress = this.getMode() === 'insert' ?\n\t\t// A new template with no parameters is not considered valuable.\n\t\tthis.transclusionModel.containsValuableData() :\n\t\t// The user has changed a parameter, and is not on the template search page.\n\t\t( this.altered && !this.transclusionModel.isEmpty() );\n\n\tswitch ( action ) {\n\t\tcase 'back':\n\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\tif ( willLoseProgress ) {\n\t\t\t\t\tthis.closeConfirm( ve.msg( 'visualeditor-dialog-transclusion-back-confirmation-prompt' ) ).then( ( confirmed ) => {\n\t\t\t\t\t\tif ( confirmed ) {\n\t\t\t\t\t\t\tthis.resetDialog();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tthis.resetDialog();\n\t\t\t\t}\n\t\t\t} );\n\t\tcase 'mode':\n\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\tthis.toggleSidebar( !this.isSidebarExpanded );\n\t\t\t} );\n\t\tcase '':\n\t\t\t// close action\n\t\t\tif ( willLoseProgress ) {\n\t\t\t\treturn new OO.ui.Process( () => {\n\t\t\t\t\tthis.closeConfirm( ve.msg( 'visualeditor-dialog-transclusion-close-confirmation-prompt' ) ).then( ( confirmed ) => {\n\t\t\t\t\t\tif ( confirmed ) {\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t\t}\n\t}\n\treturn ve.ui.MWTransclusionDialog.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * Update the widgets in the dialog's action bar.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.updateActionSet = function () {\n\tconst backButton = this.actions.get( { flags: [ 'back' ] } ).pop(),\n\t\tsaveButton = this.actions.get( { actions: [ 'done' ] } ).pop();\n\n\tif ( saveButton && this.getMode() === 'edit' ) {\n\t\tsaveButton.setLabel( ve.msg( 'visualeditor-dialog-transclusion-action-save' ) );\n\t}\n\n\tconst closeButton = this.actions.get( { flags: [ 'close' ] } ).pop(),\n\t\tcanGoBack = this.getMode() === 'insert' && this.canGoBack && !this.transclusionModel.isEmpty();\n\n\tcloseButton.toggle( !canGoBack );\n\tbackButton.toggle( canGoBack );\n};\n\n/**\n * Revert the dialog back to its initial state.\n *\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.resetDialog = function () {\n\tthis.transclusionModel.reset();\n\tthis.bookletLayout.clearPages();\n\tconst placeholderPage = new ve.dm.MWTemplatePlaceholderModel( this.transclusionModel );\n\tthis.transclusionModel.addPart( placeholderPage )\n\t\t.done( () => {\n\t\t\tthis.bookletLayout.focusPart( placeholderPage.getId() );\n\t\t\tthis.autoExpandSidebar();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.initialize = function () {\n\t// Parent method\n\tve.ui.MWTransclusionDialog.super.prototype.initialize.call( this );\n\n\tthis.setupHotkeyTriggers();\n\n\t// multipart message gets attached in onReplacePart()\n\tthis.multipartMessage = new OO.ui.MessageWidget( {\n\t\tlabel: mw.message( 'visualeditor-dialog-transclusion-multipart-message' ).parseDom(),\n\t\tclasses: [ 've-ui-mwTransclusionDialog-multipart-message' ]\n\t} );\n\tve.targetLinksToNewWindow( this.multipartMessage.$element[ 0 ] );\n\n\tconst helpPopup = new ve.ui.MWFloatingHelpElement( {\n\t\tlabel: mw.message( 'visualeditor-dialog-transclusion-help-title' ).text(),\n\t\ttitle: mw.message( 'visualeditor-dialog-transclusion-help-title' ).text(),\n\t\t$message: new OO.ui.FieldsetLayout( {\n\t\t\titems: [\n\t\t\t\tnew OO.ui.LabelWidget( {\n\t\t\t\t\tlabel: mw.message( 'visualeditor-dialog-transclusion-help-message' ).text()\n\t\t\t\t} ),\n\t\t\t\tthis.getMessageButton( 'visualeditor-dialog-transclusion-help-page-help', 'helpNotice' ),\n\t\t\t\tthis.getMessageButton( 'visualeditor-dialog-transclusion-help-page-shortcuts', 'keyboard' )\n\t\t\t],\n\t\t\tclasses: [ 've-ui-mwTransclusionDialog-floatingHelpElement-fieldsetLayout' ]\n\t\t} ).$element\n\t} );\n\thelpPopup.$element.addClass( 've-ui-mwTransclusionDialog-floatingHelpElement' );\n\thelpPopup.$element.appendTo( this.$body );\n\n\t// Events\n\tthis.getManager().connect( this, { resize: ve.debounce( this.onWindowResize.bind( this ) ) } );\n\tthis.bookletLayout.getOutlineControls().connect( this, {\n\t\taddTemplate: 'addTemplatePlaceholder',\n\t\taddWikitext: 'addWikitext',\n\t\tmove: 'onOutlineControlsMove',\n\t\tremove: 'onOutlineControlsRemove'\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWTransclusionDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.bookletLayout.getOutlineControls().toggle( !this.transclusionModel.isSingleTemplate() );\n\t\t\tthis.$element.toggleClass(\n\t\t\t\t've-ui-mwTransclusionDialog-single-transclusion',\n\t\t\t\tthis.transclusionModel.isSingleTemplate()\n\t\t\t);\n\n\t\t\tthis.updateModeActionState();\n\t\t\tthis.autoExpandSidebar();\n\n\t\t\tif ( !this.transclusionModel.isSingleTemplate() ) {\n\t\t\t\tthis.sidebar.hideAllUnusedParameters();\n\t\t\t}\n\t\t\t// We can do this only after the widget is visible on screen\n\t\t\tthis.sidebar.initializeAllStickyHeaderHeights();\n\t\t} );\n};\n\n/**\n * @private\n */\nve.ui.MWTransclusionDialog.prototype.onWindowResize = function () {\n\tif ( this.transclusionModel ) {\n\t\tthis.autoExpandSidebar();\n\n\t\tthis.bookletLayout.getPagesOrdered().forEach( ( page ) => {\n\t\t\tif ( page instanceof ve.ui.MWParameterPage ) {\n\t\t\t\tpage.updateSize();\n\t\t\t}\n\t\t} );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWTransclusionDialog.prototype.getSizeProperties = function () {\n\treturn ve.extendObject(\n\t\t{ height: '90%' },\n\t\tve.ui.MWTransclusionDialog.super.prototype.getSizeProperties.call( this )\n\t);\n};\n\n/**\n * Converts a message link into an OO.ui.ButtonWidget with an icon.\n *\n * @private\n * @param {string} message i18n message key\n * @param {string} icon icon name\n * @return {OO.ui.ButtonWidget}\n */\nve.ui.MWTemplateDialog.prototype.getMessageButton = function ( message, icon ) {\n\t// Messages that can be used here:\n\t// * visualeditor-dialog-transclusion-help-page-help\n\t// * visualeditor-dialog-transclusion-help-page-shortcuts\n\tconst $link = mw.message( message ).parseDom(),\n\t\tbutton = new OO.ui.ButtonWidget( {\n\t\t\tlabel: $link.text(),\n\t\t\thref: $link.attr( 'href' ),\n\t\t\ttarget: '_blank',\n\t\t\tflags: 'progressive',\n\t\t\ticon: icon,\n\t\t\tframed: false\n\t\t} );\n\tbutton.$button.attr( 'role', 'link' );\n\treturn button;\n};\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWTransclusionDialog );\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/modules/ve-mw/ui/elements/ve.ui.MWExpandableContentElement.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/modules/ve-mw/ui/elements/ve.ui.MWExpandableErrorElement.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/modules/ve-mw/ui/elements/ve.ui.MWFloatingHelpElement.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/modules/ve-mw/ui/elements/ve.ui.MWPreviewElement.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/modules/ve-mw/ui/inspectors/ve.ui.MWAlienExtensionInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWCommentInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWExtensionInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWLanguageVariantInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":214,"column":2,"nodeType":"CallExpression","endLine":217,"endColumn":6}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface LinkAnnotationInspector class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Inspector for applying and editing labeled MediaWiki internal and external links.\n *\n * @class\n * @extends ve.ui.LinkAnnotationInspector\n *\n * @constructor\n * @param {Object} [config] Configuration options\n */\nve.ui.MWLinkAnnotationInspector = function VeUiMWLinkAnnotationInspector( config ) {\n\t// Parent constructor\n\tve.ui.MWLinkAnnotationInspector.super.call( this, ve.extendObject( { padded: false }, config ) );\n\n\tthis.$element.addClass( 've-ui-mwLinkAnnotationInspector' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWLinkAnnotationInspector, ve.ui.LinkAnnotationInspector );\n\n/* Static properties */\n\nve.ui.MWLinkAnnotationInspector.static.name = 'link';\n\nve.ui.MWLinkAnnotationInspector.static.modelClasses = [\n\tve.dm.MWExternalLinkAnnotation,\n\tve.dm.MWInternalLinkAnnotation\n];\n\nve.ui.MWLinkAnnotationInspector.static.actions = [\n\t...ve.ui.MWLinkAnnotationInspector.static.actions,\n\t{\n\t\taction: 'convert',\n\t\tlabel: null, // see #updateActions\n\t\tmodes: [ 'edit', 'insert' ]\n\t}\n];\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.initialize = function () {\n\t// Properties\n\tthis.allowProtocolInInternal = false;\n\tthis.internalAnnotationInput = this.createInternalAnnotationInput();\n\tthis.externalAnnotationInput = this.createExternalAnnotationInput();\n\n\tthis.linkTypeIndex = new OO.ui.IndexLayout( {\n\t\texpanded: false,\n\t\tframed: false\n\t} );\n\n\tthis.linkTypeIndex.addTabPanels( [\n\t\tnew OO.ui.TabPanelLayout( 'internal', {\n\t\t\tlabel: mw.config.get( 'wgSiteName' ),\n\t\t\texpanded: false,\n\t\t\tscrollable: false,\n\t\t\tpadded: true\n\t\t} ),\n\t\tnew OO.ui.TabPanelLayout( 'external', {\n\t\t\tlabel: ve.msg( 'visualeditor-linkinspector-button-link-external' ),\n\t\t\texpanded: false,\n\t\t\tscrollable: false,\n\t\t\tpadded: true\n\t\t} )\n\t] );\n\n\t// Parent method\n\t// Parent requires createAnnotationInput to be callable, but tries to move\n\t// inputs in the DOM, so call this before we restructure the DOM.\n\tve.ui.MWLinkAnnotationInspector.super.prototype.initialize.call( this );\n\n\tthis.internalAnnotationField = this.annotationField;\n\tthis.externalAnnotationField = new OO.ui.FieldLayout(\n\t\tthis.externalAnnotationInput,\n\t\t{\n\t\t\talign: 'top',\n\t\t\tlabel: ve.msg( 'visualeditor-linkinspector-title' )\n\t\t}\n\t);\n\n\tthis.onExternalLinkInputChangeDebounced = ve.debounce( this.onExternalLinkInputChange, 750 );\n\n\t// Events\n\tthis.linkTypeIndex.connect( this, { set: 'onLinkTypeIndexSet' } );\n\tthis.labelInput.connect( this, { change: 'onLabelInputChange' } );\n\tthis.internalAnnotationInput.connect( this, { change: 'onInternalLinkChange' } );\n\tthis.externalAnnotationInput.connect( this, { change: 'onExternalLinkChange' } );\n\tthis.internalAnnotationInput.input.getResults().connect( this, { choose: 'onFormSubmit' } );\n\t// Form submit only auto triggers on enter when there is one input\n\tthis.internalAnnotationInput.getTextInputWidget().connect( this, {\n\t\tchange: 'onInternalLinkInputChange',\n\t\tenter: 'onLinkInputEnter'\n\t} );\n\tthis.externalAnnotationInput.getTextInputWidget().connect( this, {\n\t\tchange: 'onExternalLinkInputChangeDebounced',\n\t\tenter: 'onLinkInputEnter'\n\t} );\n\t// this.internalAnnotationInput is already bound by parent class\n\tthis.externalAnnotationInput.connect( this, { change: 'onAnnotationInputChange' } );\n\n\tthis.internalAnnotationInput.input.results.connect( this, {\n\t\tadd: 'onInternalLinkChangeResultsChange',\n\t\t// Listening to remove causes a flicker, and is not required\n\t\t// as 'add' is always trigger on a change too\n\t\tchoose: 'onInternalLinkSearchResultsChoose'\n\t} );\n\n\t// Initialization\n\t// HACK: IndexLayout is absolutely positioned, so place actions inside it\n\tthis.linkTypeIndex.$content.append( this.$otherActions );\n\tthis.linkTypeIndex.getTabPanel( 'internal' ).$element.append( this.internalAnnotationField.$element );\n\tthis.linkTypeIndex.getTabPanel( 'external' ).$element.append( this.externalAnnotationField.$element );\n\t// labelField gets moved between tabs when activated\n\tif ( OO.ui.isMobile() ) {\n\t\tthis.linkTypeIndex.getTabPanel( 'internal' ).$element.prepend( this.labelField.$element );\n\t}\n\tthis.form.$element.empty().append( this.linkTypeIndex.$element );\n\tif ( !OO.ui.isMobile() ) {\n\t\tthis.externalAnnotationField.setLabel( null );\n\t}\n};\n\n/**\n * @return {ve.ui.MWInternalLinkAnnotationWidget}\n */\nve.ui.MWLinkAnnotationInspector.prototype.createInternalAnnotationInput = function () {\n\treturn new ve.ui.MWInternalLinkAnnotationWidget();\n};\n\n/**\n * @return {ve.ui.MWExternalLinkAnnotationWidget}\n */\nve.ui.MWLinkAnnotationInspector.prototype.createExternalAnnotationInput = function () {\n\treturn new ve.ui.MWExternalLinkAnnotationWidget();\n};\n\n/**\n * Check if the current input mode is for external links\n *\n * @return {boolean} Input mode is for external links\n */\nve.ui.MWLinkAnnotationInspector.prototype.isExternal = function () {\n\treturn this.linkTypeIndex.getCurrentTabPanelName() === 'external';\n};\n\n/**\n * Handle change events on the label input\n *\n * @param {string} value\n */\nve.ui.MWLinkAnnotationInspector.prototype.onLabelInputChange = function () {\n\tif ( this.isActive && !this.trackedLabelInputChange ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'label-input' } );\n\t\tthis.trackedLabelInputChange = true;\n\t}\n};\n\n/**\n * Handle change events on the internal link widget\n *\n * @param {ve.dm.MWInternalLinkAnnotation} annotation\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkChange = function () {\n\tthis.updateActions();\n};\n\n/**\n * Handle list change events ('add') from the interal link's result widget\n *\n * @param {OO.ui.OptionWidget[]} items Added items\n * @param {number} index Index of insertion point\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkChangeResultsChange = function () {\n\tthis.updateSize();\n};\n\n/**\n * Handle choose events from the result widget\n *\n * @param {OO.ui.OptionWidget} item Chosen item\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkSearchResultsChoose = function () {\n\tve.track( 'activity.' + this.constructor.static.name, { action: 'search-pages-choose' } );\n};\n\n/**\n * Handle change events on the external link widget\n *\n * @param {ve.dm.MWExternalLinkAnnotation} annotation\n */\nve.ui.MWLinkAnnotationInspector.prototype.onExternalLinkChange = function () {\n\tthis.updateActions();\n};\n\n/**\n * Handle enter events on the external/internal link inputs\n *\n * @param {jQuery.Event} e Key press event\n */\nve.ui.MWLinkAnnotationInspector.prototype.onLinkInputEnter = function () {\n\tif ( this.annotationInput.getTextInputWidget().getValue().trim() === '' ) {\n\t\tthis.executeAction( 'done' );\n\t}\n\tthis.annotationInput.getTextInputWidget().getValidity()\n\t\t.done( () => {\n\t\t\tthis.executeAction( 'done' );\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.updateActions = function () {\n\tlet msg = null;\n\n\tve.ui.MWLinkAnnotationInspector.super.prototype.updateActions.call( this );\n\n\t// show/hide convert action\n\tconst content = this.fragment ? this.fragment.getText() : '';\n\tconst annotation = this.annotationInput.getAnnotation();\n\tconst href = annotation && annotation.getHref();\n\tif ( href && ve.dm.MWMagicLinkNode.static.validateHref( content, href ) ) {\n\t\tconst type = ve.dm.MWMagicLinkType.static.fromContent( content ).type;\n\t\tmsg = 'visualeditor-linkinspector-convert-link-' + type.toLowerCase();\n\t}\n\n\t// Once we toggle the visibility of the ActionWidget, we can't filter\n\t// it with `get` any more. So we have to use `forEach`:\n\tthis.actions.forEach( null, ( action ) => {\n\t\tif ( action.getAction() === 'convert' ) {\n\t\t\tif ( msg ) {\n\t\t\t\t// The following messages are used here:\n\t\t\t\t// * visualeditor-linkinspector-convert-link-isbn\n\t\t\t\t// * visualeditor-linkinspector-convert-link-pmid\n\t\t\t\t// * visualeditor-linkinspector-convert-link-rfc\n\t\t\t\taction.setLabel( OO.ui.deferMsg( msg ) );\n\t\t\t\taction.toggle( true );\n\t\t\t} else {\n\t\t\t\taction.toggle( false );\n\t\t\t}\n\t\t}\n\t} );\n};\n\n/**\n * Handle change events on the internal link widget's input\n *\n * @param {string} value Current value of input widget\n */\nve.ui.MWLinkAnnotationInspector.prototype.onInternalLinkInputChange = function ( value ) {\n\t// If this looks like an external link, switch to the correct tabPanel.\n\t// Note: We don't care here if it's a *valid* link, so we just\n\t// check whether it looks like a URI -- i.e. whether it starts with\n\t// something that appears to be a schema per RFC1630. Later the external\n\t// link inspector will use getExternalLinkUrlProtocolsRegExp for validity\n\t// checking.\n\t// Note 2: RFC1630 might be too broad in practice. You don't really see\n\t// schemas that use the full set of allowed characters, and we might get\n\t// more false positives by checking for them.\n\t// Note 3: We allow protocol-relative URIs here.\n\tif ( this.internalAnnotationInput.getTextInputWidget().getValue() !== value ) {\n\t\treturn;\n\t}\n\tif ( this.isActive && !this.trackedInternalLinkInputChange && !this.switchingLinkTypes ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'search-pages-input' } );\n\t\tthis.trackedInternalLinkInputChange = true;\n\t}\n\tif (\n\t\t!this.allowProtocolInInternal &&\n\t\t( /^(?:[a-z][a-z0-9$\\-_@.&!*\"'(),]*:)?\\/\\//i ).test( value.trim() )\n\t) {\n\t\tthis.linkTypeIndex.setTabPanel( 'external' );\n\t\t// Changing tabPanel focuses and selects the input, so collapse the cursor back to the end.\n\t\tthis.externalAnnotationInput.getTextInputWidget().moveCursorToEnd();\n\t}\n\n\tthis.internalAnnotationInput.getTextInputWidget().getValidity()\n\t\t.then(\n\t\t\t() => {\n\t\t\t\tthis.internalAnnotationField.setErrors( [] );\n\t\t\t\tthis.updateSize();\n\t\t\t}, () => {\n\t\t\t\tthis.internalAnnotationField.setErrors( [ ve.msg( 'visualeditor-linkinspector-illegal-title' ) ] );\n\t\t\t\tthis.updateSize();\n\t\t\t}\n\t\t);\n\n};\n\n/**\n * Handle change events on the external link widget's input\n *\n * @param {string} value Current value of input widget\n */\nve.ui.MWLinkAnnotationInspector.prototype.onExternalLinkInputChange = function () {\n\tthis.externalAnnotationInput.getValidity().then(\n\t\t() => {\n\t\t\t// clear any invalid-protocol errors\n\t\t\tthis.externalAnnotationField.setErrors( [] );\n\t\t}, ( errortype ) => {\n\t\t\t// Messages that can be used here:\n\t\t\t// * visualeditor-linkinspector-invalid-blocked\n\t\t\t// * visualeditor-linkinspector-invalid-external\n\t\t\tthis.externalAnnotationField.setErrors( [ ve.msg( 'visualeditor-linkinspector-' + errortype ) ] );\n\t\t\tif ( errortype === 'invalid-blocked' ) {\n\t\t\t\t// This has been quite async, so:\n\t\t\t\tthis.actions.forEach( { actions: [ 'done', 'insert' ] }, ( action ) => {\n\t\t\t\t\taction.setDisabled( true );\n\t\t\t\t} );\n\t\t\t\tve.track( 'activity.editCheckReliability', { action: 'link-blocked' } );\n\t\t\t}\n\t\t}\n\t).always( () => {\n\t\tthis.updateSize();\n\t} );\n\n\tif ( this.isActive && !this.trackedExternalLinkInputChange && !this.switchingLinkTypes ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'external-link-input' } );\n\t\tthis.trackedExternalLinkInputChange = true;\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.createAnnotationInput = function () {\n\treturn this.isExternal() ? this.externalAnnotationInput : this.internalAnnotationInput;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getSetupProcess = function ( data ) {\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getSetupProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.isReady = false;\n\n\t\t\tconst isReadOnly = this.isReadOnly();\n\t\t\tthis.linkTypeIndex.setTabPanel(\n\t\t\t\tthis.initialAnnotation instanceof ve.dm.MWExternalLinkAnnotation ? 'external' : 'internal'\n\t\t\t);\n\t\t\tthis.annotationInput.setAnnotation( this.initialAnnotation );\n\t\t\tthis.internalAnnotationInput.setReadOnly( isReadOnly );\n\t\t\tthis.externalAnnotationInput.setReadOnly( isReadOnly );\n\n\t\t\tthis.trackedInternalLinkInputChange = false;\n\t\t\tthis.trackedExternalLinkInputChange = false;\n\t\t\tthis.isActive = true;\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getReadyProcess = function ( data ) {\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getReadyProcess.call( this, data )\n\t\t.next( () => {\n\t\t\tthis.isReady = true;\n\t\t\t// Focus is skipped during setup. (T321026)\n\t\t\tthis.annotationInput.getTextInputWidget().focus();\n\t\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getActionProcess = function ( action ) {\n\tif ( action === 'convert' ) {\n\t\treturn new OO.ui.Process( () => {\n\t\t\tthis.close( { action: 'done', convert: true } );\n\t\t} );\n\t}\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getActionProcess.call( this, action );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getTeardownProcess = function ( data ) {\n\tlet fragment;\n\treturn ve.ui.MWLinkAnnotationInspector.super.prototype.getTeardownProcess.call( this, data )\n\t\t.first( () => {\n\t\t\t// Save the original fragment for later.\n\t\t\tfragment = this.getFragment();\n\n\t\t\tthis.isActive = false;\n\t\t} )\n\t\t.next( () => {\n\t\t\tconst selection = fragment && fragment.getSelection();\n\n\t\t\t// Handle conversion to magic link.\n\t\t\tif ( data && data.convert && selection instanceof ve.dm.LinearSelection ) {\n\t\t\t\tconst annotations = fragment.getDocument().data\n\t\t\t\t\t.getAnnotationsFromRange( selection.getRange() )\n\t\t\t\t\t// Remove link annotations\n\t\t\t\t\t.filter( ( annotation ) => !/^link/.test( annotation.name ) );\n\t\t\t\tconst linearData = new ve.dm.ElementLinearData( annotations.store, [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'link/mwMagic',\n\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\tcontent: fragment.getText()\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: '/link/mwMagic'\n\t\t\t\t\t}\n\t\t\t\t] );\n\t\t\t\tlinearData.setAnnotationsAtOffset( 0, annotations );\n\t\t\t\tfragment.insertContent( linearData.getData(), true );\n\t\t\t}\n\n\t\t\t// Clear dialog state.\n\t\t\tthis.allowProtocolInInternal = false;\n\t\t\t// Make sure both inputs are cleared\n\t\t\tthis.internalAnnotationInput.setAnnotation( null );\n\t\t\tthis.externalAnnotationInput.setAnnotation( null );\n\t\t} );\n};\n\n/**\n * Handle set events from the linkTypeIndex layout\n *\n * @param {OO.ui.TabPanelLayout} tabPanel Current tabPanel\n */\nve.ui.MWLinkAnnotationInspector.prototype.onLinkTypeIndexSet = function ( tabPanel ) {\n\tconst text = this.annotationInput.getTextInputWidget().getValue(),\n\t\tend = text.length,\n\t\tisExternal = this.isExternal(),\n\t\tinputHasProtocol = ve.init.platform.getExternalLinkUrlProtocolsRegExp().test( text );\n\n\tthis.switchingLinkTypes = true;\n\n\tthis.annotationInput = isExternal ? this.externalAnnotationInput : this.internalAnnotationInput;\n\n\tif ( OO.ui.isMobile() ) {\n\t\ttabPanel.$element.prepend( this.labelField.$element );\n\t}\n\n\tthis.updateSize();\n\n\t// If the user manually switches to internal links with an external link in the input, remember this\n\tif ( !isExternal && inputHasProtocol ) {\n\t\tthis.allowProtocolInInternal = true;\n\t}\n\n\tthis.annotationInput.getTextInputWidget().setValue( text );\n\tif ( this.isReady ) {\n\t\t// Focussing an element that isn't visible yet triggers a\n\t\t// bug in jQuery that prevents future focusses. (T321026)\n\t\tthis.annotationInput.getTextInputWidget().focus();\n\t}\n\t// Select entire link when switching, for ease of replacing entire contents.\n\t// Most common case:\n\t// 1. Inspector opened, internal-link shown with the selected-word prefilled\n\t// 2. User clicks external link tab (unnecessary, because we'd auto-switch, but the user doesn't know that)\n\t// 3. User pastes a link, intending to replace the existing prefilled link\n\tthis.annotationInput.getTextInputWidget().$input[ 0 ].setSelectionRange( 0, end );\n\t// Focusing a TextInputWidget normally unsets validity. However, because\n\t// we're kind of pretending this is the same input, just in a different\n\t// mode, it doesn't make sense to the user that the focus behavior occurs.\n\tthis.annotationInput.getTextInputWidget().setValidityFlag();\n\n\tthis.onAnnotationInputChange();\n\n\tif ( this.isActive ) {\n\t\tve.track( 'activity.' + this.constructor.static.name, { action: 'panel-switch' } );\n\t}\n\n\tthis.switchingLinkTypes = false;\n};\n\n/**\n * Gets an annotation object from a fragment.\n *\n * The type of link is automatically detected based on some crude heuristics.\n *\n * @param {ve.dm.SurfaceFragment} fragment Current selection\n * @return {ve.dm.MWInternalLinkAnnotation|ve.dm.MWExternalLinkAnnotation|null}\n */\nve.ui.MWLinkAnnotationInspector.prototype.getAnnotationFromFragment = function ( fragment ) {\n\tconst target = fragment.getText(),\n\t\ttitle = mw.Title.newFromText( target );\n\n\t// Figure out if this is an internal or external link\n\tif ( ve.init.platform.getExternalLinkUrlProtocolsRegExp().test( target ) ) {\n\t\t// External link\n\t\treturn this.newExternalLinkAnnotation( {\n\t\t\ttype: 'link/mwExternal',\n\t\t\tattributes: {\n\t\t\t\thref: target\n\t\t\t}\n\t\t} );\n\t} else if ( title ) {\n\t\t// Internal link\n\t\treturn this.newInternalLinkAnnotationFromTitle( title );\n\t} else {\n\t\t// Doesn't look like an external link and mw.Title considered it an illegal value,\n\t\t// for an internal link.\n\t\treturn null;\n\t}\n};\n\n/**\n * @param {mw.Title} title The title to link to.\n * @return {ve.dm.MWInternalLinkAnnotation} The annotation.\n */\nve.ui.MWLinkAnnotationInspector.prototype.newInternalLinkAnnotationFromTitle = function ( title ) {\n\treturn ve.dm.MWInternalLinkAnnotation.static.newFromTitle( title );\n};\n\n/**\n * @param {Object} element\n * @return {ve.dm.MWExternalLinkAnnotation} The annotation.\n */\nve.ui.MWLinkAnnotationInspector.prototype.newExternalLinkAnnotation = function ( element ) {\n\treturn new ve.dm.MWExternalLinkAnnotation( element );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getInsertionText = function () {\n\t// Prefer user input, not normalized annotation, to preserve case\n\tconst label = this.labelInput.getValue().trim();\n\tif ( label ) {\n\t\treturn label;\n\t} else if ( this.isNew && this.isExternal() ) {\n\t\treturn '';\n\t} else {\n\t\treturn this.annotationInput.getTextInputWidget().getValue();\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWLinkAnnotationInspector.prototype.getInsertionData = function () {\n\t// If this is a new external link with no label, insert an autonumbered link instead of a link annotation\n\t// (applying the annotation on this later does nothing because of disallowedAnnotationTypes).\n\t// Otherwise call parent method to figure out the text to insert and annotate.\n\tif ( this.isNew && this.isExternal() && !this.labelInput.getValue().trim() ) {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttype: 'link/mwNumberedExternal',\n\t\t\t\tattributes: {\n\t\t\t\t\thref: this.annotationInput.getHref()\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ type: '/link/mwNumberedExternal' }\n\t\t];\n\t} else {\n\t\treturn this.getInsertionText().split( '' );\n\t}\n};\n\n// #getInsertionText call annotationInput#getHref, which returns the link title,\n// so no custmisation is needed.\n\n/* Registration */\n\nve.ui.windowFactory.register( ve.ui.MWLinkAnnotationInspector );\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/modules/ve-mw/ui/inspectors/ve.ui.MWLinkNodeInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWLiveExtensionInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWMagicLinkNodeInspector.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/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.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/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.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/modules/ve-mw/ui/layouts/ve.ui.MWVerticalLayout.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/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":203,"column":10,"nodeType":"CallExpression","endLine":203,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/pages/ve.ui.MWAdvancedSettingsPage.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":84,"column":79,"nodeType":"CallExpression","endLine":84,"endColumn":94,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/pages/ve.ui.MWCategoriesPage.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/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":36,"column":2,"nodeType":"CallExpression","endLine":36,"endColumn":73},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":163,"column":2,"nodeType":"CallExpression","endLine":170,"endColumn":65},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":163,"column":2,"nodeType":"CallExpression","endLine":171,"endColumn":63}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor user interface MWLanguagesPage class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki meta dialog Languages page.\n *\n * @class\n * @extends OO.ui.PageLayout\n *\n * @constructor\n * @param {string} name Unique symbolic name of page\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWLanguagesPage = function VeUiMWLanguagesPage() {\n\t// Parent constructor\n\tve.ui.MWLanguagesPage.super.apply( this, arguments );\n\n\t// Properties\n\tthis.languagesFieldset = new OO.ui.FieldsetLayout( {\n\t\tlabel: ve.msg( 'visualeditor-dialog-meta-languages-label' ),\n\t\ticon: 'textLanguage'\n\t} );\n\n\t// Initialization\n\tthis.languagesFieldset.$element.append(\n\t\t$( '<span>' )\n\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-readonlynote' ) )\n\t);\n\tthis.$element.append( this.languagesFieldset.$element );\n\n\tthis.getAllLanguageItems().done( this.onLoadLanguageData.bind( this ) );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWLanguagesPage, OO.ui.PageLayout );\n\n/* Methods */\n\n/**\n * @inheritdoc\n */\nve.ui.MWLanguagesPage.prototype.setupOutlineItem = function () {\n\tthis.outlineItem\n\t\t.setIcon( 'textLanguage' )\n\t\t.setLabel( ve.msg( 'visualeditor-dialog-meta-languages-section' ) );\n};\n\nve.ui.MWLanguagesPage.prototype.onLoadLanguageData = function ( languages ) {\n\tconst $languagesTable = $( '<table>' ),\n\t\tlanguageslength = languages.length;\n\n\t$languagesTable\n\t\t.addClass( 've-ui-mwLanguagesPage-languages-table' )\n\t\t.append( $( '<tr>' )\n\t\t\t.append(\n\t\t\t\t$( '<th>' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-code-label' ) )\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$( '<th>' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-name-label' ) )\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$( '<th>' )\n\t\t\t\t\t.text( ve.msg( 'visualeditor-dialog-meta-languages-link-label' ) )\n\t\t\t)\n\t\t);\n\n\tfor ( let i = 0; i < languageslength; i++ ) {\n\t\tlanguages[ i ].safelang = languages[ i ].lang;\n\t\tlanguages[ i ].dir = 'auto';\n\t\tif ( $.uls ) {\n\t\t\t// site codes don't always represent official language codes\n\t\t\t// using real language code instead of a dummy ('redirect' in ULS' terminology)\n\t\t\tlanguages[ i ].safelang = $.uls.data.isRedirect( languages[ i ].lang ) || languages[ i ].lang;\n\t\t\tlanguages[ i ].dir = ve.init.platform.getLanguageDirection( languages[ i ].safelang );\n\t\t}\n\t\t$languagesTable.append(\n\t\t\t$( '<tr>' ).append(\n\t\t\t\t$( '<td>' ).text( languages[ i ].lang ),\n\t\t\t\t$( '<td>' ).text( languages[ i ].langname ).add( $( '<td>' ).text( languages[ i ].title ) )\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\tlang: languages[ i ].safelang,\n\t\t\t\t\t\tdir: languages[ i ].dir\n\t\t\t\t\t} )\n\t\t\t)\n\t\t);\n\t}\n\n\tthis.languagesFieldset.$element.append( $languagesTable );\n};\n\n/**\n * Handle language items being loaded.\n *\n * @param {jQuery.Deferred} deferred Deferred to resolve with language data\n * @param {Object} response API response\n */\nve.ui.MWLanguagesPage.prototype.onAllLanguageItemsSuccess = function ( deferred, response ) {\n\tconst languages = [],\n\t\tlanglinks = OO.getProp( response, 'query', 'pages', 0, 'langlinks' );\n\tif ( langlinks ) {\n\t\tfor ( let i = 0, iLen = langlinks.length; i < iLen; i++ ) {\n\t\t\tlanguages.push( {\n\t\t\t\tlang: langlinks[ i ].lang,\n\t\t\t\tlangname: langlinks[ i ].autonym,\n\t\t\t\ttitle: langlinks[ i ].title,\n\t\t\t\tmetaItem: null\n\t\t\t} );\n\t\t}\n\t}\n\tdeferred.resolve( languages );\n};\n\n/**\n * Gets language item from meta list item\n *\n * @param {ve.dm.MWLanguageMetaItem} metaItem\n * @return {Object} item\n */\nve.ui.MWLanguagesPage.prototype.getLanguageItemFromMetaListItem = function ( metaItem ) {\n\t// TODO: get real values from metaItem once Parsoid actually provides them - T50970\n\treturn {\n\t\tlang: 'lang',\n\t\tlangname: 'langname',\n\t\ttitle: 'title',\n\t\tmetaItem: metaItem\n\t};\n};\n\n/**\n * Get array of language items from meta list\n *\n * @return {Object[]} items\n */\nve.ui.MWLanguagesPage.prototype.getLocalLanguageItems = function () {\n\tconst items = [],\n\t\tlanguages = this.metaList.getItemsInGroup( 'mwLanguage' ),\n\t\tlanguageslength = languages.length;\n\n\t// Loop through MWLanguages and build out items\n\n\tfor ( let i = 0; i < languageslength; i++ ) {\n\t\titems.push( this.getLanguageItemFromMetaListItem( languages[ i ] ) );\n\t}\n\treturn items;\n};\n\n/**\n * Get array of language items from meta list\n *\n * @return {jQuery.Promise}\n */\nve.ui.MWLanguagesPage.prototype.getAllLanguageItems = function () {\n\tconst deferred = ve.createDeferred();\n\t// TODO: Detect paging token if results exceed limit\n\tve.init.target.getContentApi().get( {\n\t\taction: 'query',\n\t\tprop: 'langlinks',\n\t\tllprop: 'autonym',\n\t\tlllimit: 500,\n\t\ttitles: ve.init.target.getPageName()\n\t} )\n\t\t.done( this.onAllLanguageItemsSuccess.bind( this, deferred ) )\n\t\t.fail( this.onAllLanguageItemsError.bind( this, deferred ) );\n\treturn deferred.promise();\n};\n\n/**\n * Handle language items failing to be loaded.\n *\n * TODO: This error function should probably not be empty.\n */\nve.ui.MWLanguagesPage.prototype.onAllLanguageItemsError = function () {};\n\nve.ui.MWLanguagesPage.prototype.getFieldsets = function () {\n\treturn [\n\t\tthis.languagesFieldset\n\t];\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.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/modules/ve-mw/ui/pages/ve.ui.MWSettingsPage.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":140,"column":4,"nodeType":"ObjectExpression","endLine":146,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.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/modules/ve-mw/ui/pages/ve.ui.MWTemplatePlaceholderPage.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'template_names' is not in camel case.","line":126,"column":3,"nodeType":"Identifier","messageId":"notCamelCase","endLine":126,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'user_edit_count_bucket' is not in camel case.","line":131,"column":9,"nodeType":"Identifier","messageId":"notCamelCase","endLine":131,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/pages/ve.ui.MWTemplatesUsedPage.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":50,"column":3,"nodeType":"CallExpression","endLine":50,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/pages/ve.ui.MWTransclusionContentPage.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/modules/ve-mw/ui/styles/apex/ve.ui.Icons.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/modules/ve-mw/ui/styles/apex/ve.ui.Indicators.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/modules/ve-mw/ui/styles/wikimediaui/ve.ui.Icons.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/modules/ve-mw/ui/styles/wikimediaui/ve.ui.Indicators.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/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":196,"column":2,"nodeType":"CallExpression","endLine":200,"endColumn":5}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki UserInterface help list toolgroup classes.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * MediaWiki UserInterface edit mode tool.\n *\n * This extends ListToolGroup to add a footer below the tool list.\n * The footer contains the version number.\n *\n * @class\n * @extends OO.ui.ListToolGroup\n *\n * @constructor\n * @param {OO.ui.Toolbar} toolbar\n * @param {Object} [config] Configuration options\n */\nve.ui.MWHelpListToolGroup = function VeUiMwHelpListToolGroup() {\n\tthis.$footer = $( '<div>' ).addClass( 've-ui-mwHelpListToolGroup-tools-footer' );\n\n\t// Parent constructor\n\tve.ui.MWHelpListToolGroup.super.apply( this, arguments );\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwHelpListToolGroup' );\n\tthis.$group.addClass( 've-ui-mwHelpListToolGroup-tools' );\n};\n\n/* Setup */\n\nOO.inheritClass( ve.ui.MWHelpListToolGroup, OO.ui.ListToolGroup );\n\n/* Static Properties */\n\n/**\n * @static\n * @inheritdoc\n */\nve.ui.MWHelpListToolGroup.static.name = 'mwHelpList';\n\n/* Methods */\n\nve.ui.MWHelpListToolGroup.prototype.insertItemElements = function () {\n\t// Mixin method\n\tOO.ui.mixin.GroupElement.prototype.insertItemElements.apply( this, arguments );\n\n\tthis.$group.append( this.$footer );\n};\n\nve.ui.MWHelpListToolGroup.prototype.setActive = function () {\n\t// Parent method\n\tve.ui.MWHelpListToolGroup.super.prototype.setActive.apply( this, arguments );\n\n\tif ( this.active && !this.versionPromise ) {\n\t\tconst $version = $( '<div>' ).addClass( 'oo-ui-pendingElement-pending' ).text( '\\u00a0' );\n\t\tthis.$footer.append( $version );\n\t\tthis.versionPromise = ve.init.target.getLocalApi().get( {\n\t\t\taction: 'query',\n\t\t\tmeta: 'siteinfo',\n\t\t\tsiprop: 'extensions'\n\t\t} ).then( ( response ) => {\n\t\t\tconst extension = response.query.extensions.filter( ( ext ) => ext.name === 'VisualEditor' )[ 0 ];\n\n\t\t\tif ( extension && extension[ 'vcs-version' ] ) {\n\t\t\t\t$version\n\t\t\t\t\t.removeClass( 'oo-ui-pendingElement-pending' )\n\t\t\t\t\t.empty()\n\t\t\t\t\t.append( $( '<a>' )\n\t\t\t\t\t\t.addClass( 've-ui-mwHelpListToolGroup-version-link' )\n\t\t\t\t\t\t.attr( 'target', '_blank' )\n\t\t\t\t\t\t.attr( 'rel', 'noopener' )\n\t\t\t\t\t\t.attr( 'href', extension[ 'vcs-url' ] )\n\t\t\t\t\t\t.append( $( '<span>' )\n\t\t\t\t\t\t\t.addClass( 've-ui-mwHelpListToolGroup-version-label' )\n\t\t\t\t\t\t\t.text( ve.msg( 'visualeditor-version-label' ) + ' ' + extension[ 'vcs-version' ].slice( 0, 7 ) )\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t.append( ' ' )\n\t\t\t\t\t.append( $( '<span>' )\n\t\t\t\t\t\t.addClass( 've-ui-mwHelpListToolGroup-version-date' )\n\t\t\t\t\t\t.text( extension[ 'vcs-date' ] )\n\t\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t$version.remove();\n\t\t\t}\n\t\t}, () => {\n\t\t\t$version.remove();\n\t\t} );\n\t}\n};\n\n/* Registration */\n\nve.ui.toolGroupFactory.register( ve.ui.MWHelpListToolGroup );\n\n/**\n * User guide tool.\n *\n * @class\n * @extends ve.ui.Tool\n * @constructor\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config] Configuration options\n */\nve.ui.MWUserGuideTool = function VeUiMWUserGuideTool() {\n\tve.ui.MWUserGuideTool.super.apply( this, arguments );\n\n\tthis.setDisabled( false );\n};\nOO.inheritClass( ve.ui.MWUserGuideTool, ve.ui.Tool );\nve.ui.MWUserGuideTool.static.name = 'mwUserGuide';\nve.ui.MWUserGuideTool.static.group = 'help';\nve.ui.MWUserGuideTool.static.icon = 'help';\nve.ui.MWUserGuideTool.static.title =\n\tOO.ui.deferMsg( 'visualeditor-help-label' );\nve.ui.MWUserGuideTool.static.autoAddToCatchall = false;\n\n// Never disabled\nve.ui.MWUserGuideTool.prototype.onUpdateState = function () {};\n\nve.ui.MWUserGuideTool.prototype.onSelect = function () {\n\tthis.setActive( false );\n\tconst urlOrTitle = ve.msg( 'visualeditor-help-link' );\n\tif ( urlOrTitle.includes( '//' ) ) {\n\t\twindow.open( urlOrTitle );\n\t} else {\n\t\t// This link used to be internal link to mw:, but that doesn't work\n\t\t// on 3rd party installations (T367267). Keep support for internal\n\t\t// links as many wikis have local overrides which are internal.\n\t\twindow.open( new mw.Title( urlOrTitle ).getUrl() );\n\t}\n};\n\nve.ui.toolFactory.register( ve.ui.MWUserGuideTool );\n\n/**\n * Feedback dialog tool.\n *\n * @class\n * @extends ve.ui.Tool\n * @constructor\n * @param {OO.ui.ToolGroup} toolGroup\n * @param {Object} [config] Configuration options\n */\nve.ui.MWFeedbackDialogTool = function VeUiMWFeedbackDialogTool() {\n\tve.ui.MWFeedbackDialogTool.super.apply( this, arguments );\n\n\tthis.setDisabled( false );\n};\nOO.inheritClass( ve.ui.MWFeedbackDialogTool, ve.ui.Tool );\nve.ui.MWFeedbackDialogTool.static.name = 'mwFeedbackDialog';\nve.ui.MWFeedbackDialogTool.static.group = 'help';\nve.ui.MWFeedbackDialogTool.static.icon = 'speechBubble';\nve.ui.MWFeedbackDialogTool.static.title =\n\tOO.ui.deferMsg( 'visualeditor-feedback-tool' );\nve.ui.MWFeedbackDialogTool.static.autoAddToCatchall = false;\n\n// Never disabled\nve.ui.MWFeedbackDialogTool.prototype.onUpdateState = function () {};\n\nve.ui.MWFeedbackDialogTool.prototype.onSelect = function () {\n\tthis.setActive( false );\n\n\tif ( !this.feedbackPromise ) {\n\t\tthis.feedbackPromise = mw.loader.using( 'mediawiki.feedback' ).then( () => {\n\t\t\tconst mode = this.toolbar.getSurface().getMode();\n\n\t\t\t// This can't be constructed until the editor has loaded as it uses special messages\n\t\t\tconst feedbackConfig = {\n\t\t\t\tbugsLink: 'https://phabricator.wikimedia.org/maniphest/task/edit/form/1/?projects=VisualEditor',\n\t\t\t\tshowUseragentCheckbox: true,\n\t\t\t\tuseragentCheckboxMandatory: true\n\t\t\t};\n\n\t\t\t// If so configured, tell mw.feedback that we're posting to a remote wiki and set the title\n\t\t\tconst veConfig = mw.config.get( 'wgVisualEditorConfig' );\n\t\t\tif ( veConfig.feedbackApiUrl ) {\n\t\t\t\tfeedbackConfig.apiUrl = veConfig.feedbackApiUrl;\n\t\t\t\tfeedbackConfig.title = new mw.Title(\n\t\t\t\t\tmode === 'source' ?\n\t\t\t\t\t\tveConfig.sourceFeedbackTitle : veConfig.feedbackTitle\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tfeedbackConfig.title = new mw.Title(\n\t\t\t\t\tmode === 'source' ?\n\t\t\t\t\t\tve.msg( 'visualeditor-feedback-source-link' ) : ve.msg( 'visualeditor-feedback-link' )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn new mw.Feedback( feedbackConfig );\n\t\t} );\n\t}\n\tthis.feedbackPromise.done( ( feedback ) => {\n\t\tfeedback.launch( {\n\t\t\tmessage: ve.msg( 'visualeditor-feedback-defaultmessage', location.toString() )\n\t\t} );\n\t} );\n};\n\nve.ui.toolFactory.register( ve.ui.MWFeedbackDialogTool );\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/modules/ve-mw/ui/tools/ve.ui.MWBackTool.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/modules/ve-mw/ui/tools/ve.ui.MWEditModeTool.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/modules/ve-mw/ui/tools/ve.ui.MWFormatTool.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/modules/ve-mw/ui/tools/ve.ui.MWGalleryDialogTool.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/modules/ve-mw/ui/tools/ve.ui.MWLinkInspectorTool.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/modules/ve-mw/ui/tools/ve.ui.MWMediaDialogTool.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/modules/ve-mw/ui/tools/ve.ui.MWMetaDialogTool.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/modules/ve-mw/ui/tools/ve.ui.MWMobileLinkInspectorTool.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/modules/ve-mw/ui/tools/ve.ui.MWPopupTool.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":127,"column":20,"nodeType":"CallExpression","endLine":129,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/tools/ve.ui.MWSaveTool.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/modules/ve-mw/ui/tools/ve.ui.MWSignatureTool.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/modules/ve-mw/ui/tools/ve.ui.MWTransclusionDialogTool.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/modules/ve-mw/ui/ve.ui.MWAriaDescribe.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/modules/ve-mw/ui/ve.ui.MWCommandRegistry.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/modules/ve-mw/ui/ve.ui.MWExtensionWindow.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/modules/ve-mw/ui/ve.ui.MWSequenceRegistry.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/modules/ve-mw/ui/ve.ui.MWSurface.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/modules/ve-mw/ui/ve.ui.MWWikitextCommandRegistry.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/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":76,"column":4,"nodeType":"CallExpression","endLine":77,"endColumn":21},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":76,"column":4,"nodeType":"CallExpression","endLine":80,"endColumn":8}],"suppressedMessages":[],"errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MWWikitextDataTransferHandlerFactory class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/**\n * Drop handler Factory.\n *\n * @class\n * @extends ve.ui.DataTransferHandlerFactory\n * @constructor\n */\nve.ui.MWWikitextDataTransferHandlerFactory = function VeUiMwWikitextDataTransferHandlerFactory() {\n\t// Parent constructor\n\tve.ui.MWWikitextDataTransferHandlerFactory.super.apply( this, arguments );\n\n\tfor ( const name in ve.ui.dataTransferHandlerFactory.registry ) {\n\t\tthis.register( ve.ui.dataTransferHandlerFactory.registry[ name ] );\n\t}\n\n\tve.ui.dataTransferHandlerFactory.on( 'register', ( n, data ) => {\n\t\tthis.register( data );\n\t} );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWWikitextDataTransferHandlerFactory, ve.ui.DataTransferHandlerFactory );\n\n/* Methods */\n\n/**\n * Create an object based on a name.\n *\n * Name is used to look up the constructor to use, while all additional arguments are passed to the\n * constructor directly, so leaving one out will pass an undefined to the constructor.\n *\n * See https://doc.wikimedia.org/oojs/master/OO.Factory.html\n *\n * @param {string} name Object name\n * @param {...any} [args] Arguments to pass to the constructor\n * @return {Object} The new object\n * @throws {Error} Unknown object name\n */\nve.ui.MWWikitextDataTransferHandlerFactory.prototype.create = function () {\n\t// Parent method\n\tconst handler = ve.ui.MWWikitextDataTransferHandlerFactory.super.prototype.create.apply( this, arguments ),\n\t\tresolve = handler.resolve.bind( handler );\n\n\tfunction isPlain( data ) {\n\t\treturn typeof data === 'string' || ve.dm.LinearData.static.getType( data ) === 'paragraph';\n\t}\n\n\thandler.resolve = function ( dataOrDoc ) {\n\t\tif ( typeof dataOrDoc === 'string' || ( Array.isArray( dataOrDoc ) && dataOrDoc.every( isPlain ) ) ) {\n\t\t\tresolve( dataOrDoc );\n\t\t} else {\n\t\t\tconst doc = dataOrDoc instanceof ve.dm.Document ?\n\t\t\t\tdataOrDoc :\n\t\t\t\t// The handler may have also written items to the store\n\t\t\t\tnew ve.dm.Document( new ve.dm.ElementLinearData( handler.surface.getModel().getDocument().getStore(), dataOrDoc ) );\n\n\t\t\t// Optimization: we can skip a server hit if this is a plain link,\n\t\t\t// with no title, whose href is equal to the contained text. This\n\t\t\t// avoids a stutter in the common case of pasting a link into the\n\t\t\t// document.\n\t\t\tconst annotations = doc.data.getAnnotationsFromRange( new ve.Range( 0, doc.data.getLength() ) );\n\t\t\tif ( annotations.getLength() === 1 ) {\n\t\t\t\tconst text = doc.data.getText();\n\t\t\t\tif ( annotations.get( 0 ).getAttribute( 'href' ) === text ) {\n\t\t\t\t\treturn resolve( text );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tve.init.target.getWikitextFragment( doc, false )\n\t\t\t\t.done( resolve )\n\t\t\t\t.fail( () => {\n\t\t\t\t\thandler.abort();\n\t\t\t\t} );\n\t\t}\n\t};\n\n\treturn handler;\n};\n\n/* Initialization */\n\nve.ui.wikitextDataTransferHandlerFactory = new ve.ui.MWWikitextDataTransferHandlerFactory();\n\nve.ui.wikitextDataTransferHandlerFactory.unregister( ve.ui.MWWikitextStringTransferHandler );\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/modules/ve-mw/ui/ve.ui.MWWikitextSequenceRegistry.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/modules/ve-mw/ui/ve.ui.MWWikitextSurface.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":2,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":32,"column":18,"nodeType":"CallExpression","endLine":32,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/ve.ui.MWWikitextTransferRegistry.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":27,"column":1,"nodeType":"CallExpression","endLine":36,"endColumn":4}],"suppressedMessages":[],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor MediaWiki WikitextTransferRegistry and registrations.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Heuristic patterns which attempts to discover wikitext, without\n * incurring too many false positives.\n *\n * Rules can be regular expressions or strings\n */\nve.ui.mwWikitextTransferRegistry = new OO.Registry();\n\nve.ui.mwWikitextTransferRegistry.register(\n\t'heading',\n\t// ==...== on a single line of max 80 characters\n\t/(^\\s*(={2,6})[^=\\r\\n]{1,80}\\2\\s*$)/m\n);\n\nve.ui.mwWikitextTransferRegistry.register(\n\t'internalLink',\n\t'[['\n);\n\nve.init.platform.getInitializedPromise().done( () => {\n\tve.ui.mwWikitextTransferRegistry.register(\n\t\t'externalLink',\n\t\t// [url label]\n\t\tnew RegExp(\n\t\t\t'\\\\[' + ve.init.platform.getUnanchoredExternalLinkUrlProtocolsRegExp().source + '\\\\S+ [^\\\\]]+\\\\]',\n\t\t\t'i'\n\t\t)\n\t);\n} );\n\nve.ui.mwWikitextTransferRegistry.register(\n\t'template',\n\t'{{'\n);\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWAceEditorWidget.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":82,"column":3,"nodeType":"CallExpression","endLine":82,"endColumn":60},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":90,"column":2,"nodeType":"CallExpression","endLine":94,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":153,"column":2,"nodeType":"CallExpression","endLine":158,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":201,"column":2,"nodeType":"CallExpression","endLine":206,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":219,"column":2,"nodeType":"CallExpression","endLine":221,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":265,"column":2,"nodeType":"CallExpression","endLine":292,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":265,"column":2,"nodeType":"CallExpression","endLine":294,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":323,"column":2,"nodeType":"CallExpression","endLine":327,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":339,"column":2,"nodeType":"CallExpression","endLine":341,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":353,"column":2,"nodeType":"CallExpression","endLine":355,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":367,"column":2,"nodeType":"CallExpression","endLine":374,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":385,"column":2,"nodeType":"CallExpression","endLine":387,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":385,"column":2,"nodeType":"CallExpression","endLine":389,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":401,"column":3,"nodeType":"CallExpression","endLine":404,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":406,"column":2,"nodeType":"CallExpression","endLine":409,"endColumn":5}],"suppressedMessages":[],"errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWAceEditorWidget class.\n *\n * @copyright See AUTHORS.txt\n */\n\n/* global ace */\n\n/**\n * Text input widget which use an Ace editor instance when available\n *\n * For the most part this can be treated just like a TextInputWidget with\n * a few extra considerations:\n *\n * - For performance it is recommended to destroy the editor when\n * you are finished with it, using #teardown. If you need to use\n * the widget again let the editor can be restored with #setup.\n * - After setting an initial value the undo stack can be reset\n * using clearUndoStack so that you can't undo past the initial\n * state.\n *\n * @class\n * @extends ve.ui.WhitespacePreservingTextInputWidget\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {string} [config.autocomplete='none'] Symbolic name of autocomplete\n * mode: 'none', 'basic' (requires the user to press Ctrl-Space) or\n * 'live' (shows a list of suggestions as the user types)\n * @param {Array} [config.autocompleteWordList=null] List of words to\n * autocomplete to\n */\nve.ui.MWAceEditorWidget = function VeUiMWAceEditorWidget( config ) {\n\t// Configuration\n\tconfig = config || {};\n\n\tthis.autocomplete = config.autocomplete || 'none';\n\tthis.autocompleteWordList = config.autocompleteWordList || null;\n\n\tthis.$ace = $( '<div>' ).attr( 'dir', 'ltr' );\n\tthis.editor = null;\n\t// Initialise to a rejected promise for the setValue call in the parent constructor\n\tthis.loadingPromise = ve.createDeferred().reject().promise();\n\tthis.styleHeight = null;\n\n\t// Parent constructor\n\tve.ui.MWAceEditorWidget.super.call( this, config );\n\n\t// Clear the fake loading promise and setup properly\n\tthis.loadingPromise = null;\n\tthis.setup();\n\n\tthis.$element\n\t\t.append( this.$ace )\n\t\t.addClass( 've-ui-mwAceEditorWidget' );\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWAceEditorWidget, ve.ui.WhitespacePreservingTextInputWidget );\n\n/* Events */\n\n/**\n * The editor has resized\n *\n * @event ve.ui.MWAceEditorWidget#resize\n */\n\n/* Methods */\n\n/**\n * Setup the Ace editor instance\n */\nve.ui.MWAceEditorWidget.prototype.setup = function () {\n\tif ( !this.loadingPromise ) {\n\t\tthis.loadingPromise = mw.loader.getState( 'ext.codeEditor.ace' ) ?\n\t\t\tmw.loader.using( 'ext.codeEditor.ace' ) :\n\t\t\tve.createDeferred().reject().promise();\n\t\t// Resolved promises will run synchronously, so ensure #setupEditor\n\t\t// runs after this.loadingPromise is stored.\n\t\tthis.loadingPromise.done( this.setupEditor.bind( this ) );\n\t}\n};\n\n/**\n * Destroy the Ace editor instance\n */\nve.ui.MWAceEditorWidget.prototype.teardown = function () {\n\tthis.loadingPromise.done( () => {\n\t\tthis.$input.removeClass( 'oo-ui-element-hidden' );\n\t\tthis.editor.destroy();\n\t\tthis.editor = null;\n\t} ).always( () => {\n\t\tthis.loadingPromise = null;\n\t} );\n};\n\n/**\n * Setup the Ace editor\n *\n * @fires ve.ui.MWAceEditorWidget#resize\n */\nve.ui.MWAceEditorWidget.prototype.setupEditor = function () {\n\tlet basePath = mw.config.get( 'wgExtensionAssetsPath', '' );\n\n\tif ( basePath.slice( 0, 2 ) === '//' ) {\n\t\t// ACE uses web workers, which have importScripts, which don't like relative links.\n\t\tbasePath = window.location.protocol + basePath;\n\t}\n\tace.config.set( 'basePath', basePath + '/CodeEditor/modules/ace' );\n\n\tthis.$input.addClass( 'oo-ui-element-hidden' );\n\tthis.editor = ace.edit( this.$ace[ 0 ] );\n\tthis.setMinRows( this.minRows );\n\n\t// Autocompletion\n\tthis.editor.setOptions( {\n\t\tenableBasicAutocompletion: this.autocomplete !== 'none',\n\t\tenableLiveAutocompletion: this.autocomplete === 'live'\n\t} );\n\tif ( this.autocompleteWordList ) {\n\t\tconst completer = {\n\t\t\tgetCompletions: ( editor, session, pos, prefix, callback ) => {\n\t\t\t\tconst wordList = this.autocompleteWordList;\n\t\t\t\tcallback( null, wordList.map( ( word ) => ( {\n\t\t\t\t\tcaption: word,\n\t\t\t\t\tvalue: word,\n\t\t\t\t\tmeta: 'static'\n\t\t\t\t} ) ) );\n\t\t\t}\n\t\t};\n\t\tace.require( 'ace/ext/language_tools' ).addCompleter( completer );\n\t}\n\n\tthis.editor.getSession().on( 'change', this.onEditorChange.bind( this ) );\n\tthis.editor.renderer.on( 'resize', this.onEditorResize.bind( this ) );\n\tthis.setEditorValue( this.getValue() );\n\t// Force resize (T303964)\n\n\tthis.editor.resize( true );\n};\n\n/**\n * Set the autocomplete property\n *\n * @param {string} mode Symbolic name of autocomplete mode\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.setAutocomplete = function ( mode ) {\n\tthis.autocomplete = mode;\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.renderer.setOptions( {\n\t\t\tenableBasicAutocompletion: this.autocomplete !== 'none',\n\t\t\tenableLiveAutocompletion: this.autocomplete === 'live'\n\t\t} );\n\t} );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWAceEditorWidget.prototype.setValue = function ( value ) {\n\t// Always do something synchronously so that getValue can be used immediately.\n\t// setEditorValue is called once when the loadingPromise resolves in setupEditor.\n\tif ( this.loadingPromise.state() === 'resolved' ) {\n\t\tthis.setEditorValue( value );\n\t} else {\n\t\tve.ui.MWAceEditorWidget.super.prototype.setValue.call( this, value );\n\t}\n\treturn this;\n};\n\n/**\n * Set the value of the Ace editor widget\n *\n * @param {string} value\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.setEditorValue = function ( value ) {\n\tif ( value !== this.editor.getValue() ) {\n\t\tconst selectionState = this.editor.session.selection.toJSON();\n\t\tthis.editor.setValue( value );\n\t\tthis.editor.session.selection.fromJSON( selectionState );\n\t}\n\treturn this;\n};\n\n/**\n * Set the minimum number of rows in the Ace editor widget\n *\n * @param {number} minRows The minimum number of rows\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.setMinRows = function ( minRows ) {\n\tthis.minRows = minRows;\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.setOptions( {\n\t\t\tminLines: this.minRows || 3,\n\t\t\tmaxLines: this.autosize ? this.maxRows : this.minRows || 3\n\t\t} );\n\t} );\n\t// TODO: Implement minRows setter for OO.ui.TextInputWidget\n\t// and call it here in loadingPromise.fail\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWAceEditorWidget.prototype.setReadOnly = function ( readOnly ) {\n\t// Parent method\n\tve.ui.MWAceEditorWidget.super.prototype.setReadOnly.call( this, readOnly );\n\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.setReadOnly( this.isReadOnly() );\n\t} );\n\n\tthis.$element.toggleClass( 've-ui-mwAceEditorWidget-readOnly', !!this.isReadOnly() );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWAceEditorWidget.prototype.getRange = function () {\n\tlet lines;\n\tfunction posToOffset( row, col ) {\n\t\tlet offset = 0;\n\n\t\tfor ( let r = 0; r < row; r++ ) {\n\t\t\toffset += lines[ r ].length;\n\t\t\toffset++; // for the newline character\n\t\t}\n\t\treturn offset + col;\n\t}\n\n\tif ( this.editor ) {\n\t\tlines = this.editor.getSession().getDocument().getAllLines();\n\n\t\tconst selection = this.editor.getSelection();\n\t\tconst isBackwards = selection.isBackwards();\n\t\tconst range = selection.getRange();\n\t\tconst start = posToOffset( range.start.row, range.start.column );\n\t\tconst end = posToOffset( range.end.row, range.end.column );\n\n\t\treturn {\n\t\t\tfrom: isBackwards ? end : start,\n\t\t\tto: isBackwards ? start : end\n\t\t};\n\t} else {\n\t\treturn ve.ui.MWAceEditorWidget.super.prototype.getRange.call( this );\n\t}\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWAceEditorWidget.prototype.selectRange = function ( from, to ) {\n\tthis.focus();\n\tthis.loadingPromise.done( () => {\n\t\tconst doc = this.editor.getSession().getDocument(),\n\t\t\tlines = doc.getAllLines();\n\n\t\tto = to || from;\n\n\t\tfunction offsetToPos( offset ) {\n\t\t\tlet row = 0,\n\t\t\t\tpos = 0;\n\n\t\t\twhile ( row < lines.length && pos + lines[ row ].length < offset ) {\n\t\t\t\tpos += lines[ row ].length;\n\t\t\t\tpos++; // for the newline character\n\t\t\t\trow++;\n\t\t\t}\n\t\t\tconst col = offset - pos;\n\t\t\treturn { row: row, column: col };\n\t\t}\n\n\t\tconst fromOffset = offsetToPos( from );\n\t\tconst toOffset = offsetToPos( to );\n\n\t\tconst selection = this.editor.getSelection();\n\t\tconst range = selection.getRange();\n\t\trange.setStart( fromOffset.row, fromOffset.column );\n\t\trange.setEnd( toOffset.row, toOffset.column );\n\t\tselection.setSelectionRange( range );\n\t} ).fail( () => {\n\t\tve.ui.MWAceEditorWidget.super.prototype.selectRange.call( this, from, to );\n\t} );\n\treturn this;\n};\n\n/**\n * Handle change events from the Ace editor\n */\nve.ui.MWAceEditorWidget.prototype.onEditorChange = function () {\n\t// Call setValue on the parent to keep the value property in sync with the editor\n\tve.ui.MWAceEditorWidget.super.prototype.setValue.call( this, this.editor.getValue() );\n};\n\n/**\n * Handle resize events from the Ace editor\n *\n * @fires ve.ui.MWAceEditorWidget#resize\n */\nve.ui.MWAceEditorWidget.prototype.onEditorResize = function () {\n\t// On the first setup the editor doesn't resize until the end of the cycle\n\tsetTimeout( this.emit.bind( this, 'resize' ) );\n};\n\n/**\n * Clear the editor's undo stack\n *\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.clearUndoStack = function () {\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.session.setUndoManager(\n\t\t\tnew ace.UndoManager()\n\t\t);\n\t} );\n\treturn this;\n};\n\n/**\n * Toggle the visibility of line numbers\n *\n * @param {boolean} visible\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.toggleLineNumbers = function ( visible ) {\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.setOption( 'showLineNumbers', visible );\n\t} );\n\treturn this;\n};\n\n/**\n * Toggle the visibility of the print margin\n *\n * @param {boolean} visible\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.togglePrintMargin = function ( visible ) {\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.renderer.setShowPrintMargin( visible );\n\t} );\n\treturn this;\n};\n\n/**\n * Set the language mode of the editor (programming language)\n *\n * @param {string} lang Language\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.setLanguage = function ( lang ) {\n\tthis.loadingPromise.done( () => {\n\t\tace.config.loadModule( 'ace/ext/modelist', ( modelist ) => {\n\t\t\tif ( !modelist || !modelist.modesByName[ lang ] ) {\n\t\t\t\tlang = 'text';\n\t\t\t}\n\t\t\tthis.editor.getSession().setMode( 'ace/mode/' + lang );\n\t\t} );\n\t} );\n\treturn this;\n};\n\n/**\n * Focus the editor\n *\n * @return {ve.ui.MWAceEditorWidget}\n * @chainable\n */\nve.ui.MWAceEditorWidget.prototype.focus = function () {\n\tthis.loadingPromise.done( () => {\n\t\tthis.editor.focus();\n\t} ).fail( () => {\n\t\tve.ui.MWAceEditorWidget.super.prototype.focus.call( this );\n\t} );\n\treturn this;\n};\n\n/**\n * @inheritdoc\n * @param {boolean} [force=false] Force a resize call on Ace editor\n */\nve.ui.MWAceEditorWidget.prototype.adjustSize = function ( force ) {\n\t// If the editor has loaded, resize events are emitted from #onEditorResize\n\t// so do nothing here unless this is a user triggered resize, otherwise call the parent method.\n\tif ( force ) {\n\t\tthis.loadingPromise.done( () => {\n\n\t\t\tthis.editor.resize();\n\t\t} );\n\t}\n\tthis.loadingPromise.fail( () => {\n\t\t// Parent method\n\t\tve.ui.MWAceEditorWidget.super.prototype.adjustSize.call( this );\n\t} );\n\treturn this;\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWCategoryItemWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWCategoryPopupWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js","messages":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":117,"column":3,"nodeType":"CallExpression","endLine":125,"endColumn":6}],"suppressedMessages":[{"ruleId":"no-jquery/no-map-util","severity":2,"message":"Prefer Array#map to $.map","line":375,"column":19,"nodeType":"CallExpression","endLine":375,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-sizzle","severity":2,"message":"Selector extensions are not allowed","line":460,"column":30,"nodeType":"CallExpression","endLine":460,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/*!\n * VisualEditor UserInterface MWCategoryWidget class.\n *\n * @copyright See AUTHORS.txt\n * @license The MIT License (MIT); see LICENSE.txt\n */\n\n/**\n * Creates an ve.ui.MWCategoryWidget object.\n *\n * @class\n * @abstract\n * @extends OO.ui.Widget\n * @mixes OO.ui.mixin.GroupElement\n * @mixes OO.ui.mixin.DraggableGroupElement\n *\n * @constructor\n * @param {Object} [config] Configuration options\n * @param {jQuery} [config.$overlay] Overlay to render dropdowns in\n */\nve.ui.MWCategoryWidget = function VeUiMWCategoryWidget( config ) {\n\t// Config initialization\n\tconfig = config || {};\n\n\t// Parent constructor\n\tve.ui.MWCategoryWidget.super.call( this, config );\n\n\t// Mixin constructors\n\tOO.ui.mixin.GroupElement.call( this, config );\n\tOO.ui.mixin.DraggableGroupElement.call( this, ve.extendObject( {}, config, { orientation: 'horizontal' } ) );\n\n\tconst categoryNamespace = mw.config.get( 'wgNamespaceIds' ).category;\n\t// Properties\n\tthis.fragment = null;\n\tthis.categories = {};\n\t// Source -> target\n\tthis.categoryRedirects = {};\n\t// Title cache - will contain entries even if title is already normalized\n\tthis.normalizedTitles = {};\n\tthis.popup = new ve.ui.MWCategoryPopupWidget();\n\tthis.input = new ve.ui.MWCategoryInputWidget( this, { $overlay: config.$overlay } );\n\tthis.forceCapitalization = !mw.config.get( 'wgCaseSensitiveNamespaces' ).includes( categoryNamespace );\n\tthis.categoryPrefix = mw.config.get( 'wgFormattedNamespaces' )[ categoryNamespace ] + ':';\n\tthis.expandedItem = null;\n\n\t// Events\n\tthis.input.connect( this, { choose: 'onInputChoose' } );\n\tthis.popup.connect( this, {\n\t\tremoveCategory: 'onRemoveCategory',\n\t\tupdateSortkey: 'onUpdateSortkey',\n\t\tready: 'onPopupOpened',\n\t\tclosing: 'onPopupClosing'\n\t} );\n\tthis.connect( this, {\n\t\tdrag: 'onDrag'\n\t} );\n\n\t// Initialization\n\tthis.$element.addClass( 've-ui-mwCategoryWidget' )\n\t\t.append(\n\t\t\tthis.$group.addClass( 've-ui-mwCategoryWidget-items' ).append(\n\t\t\t\tthis.input.$element\n\t\t\t),\n\t\t\tthis.popup.$element,\n\t\t\t$( '<div>' ).css( 'clear', 'both' )\n\t\t);\n};\n\n/* Inheritance */\n\nOO.inheritClass( ve.ui.MWCategoryWidget, OO.ui.Widget );\n\nOO.mixinClass( ve.ui.MWCategoryWidget, OO.ui.mixin.GroupElement );\nOO.mixinClass( ve.ui.MWCategoryWidget, OO.ui.mixin.DraggableGroupElement );\n\n/* Events */\n\n/**\n * @event ve.ui.MWCategoryWidget#newCategory\n * @param {Object} item Category item\n * @param {string} item.name Fully prefixed category name\n * @param {string} item.value Category value (name without prefix)\n * @param {ve.dm.MWCategoryMetaItem} item.metaItem\n * @param {ve.dm.MetaItem} [beforeCategory] Insert after this category; if unset, insert at the end\n */\n\n/**\n * @event ve.ui.MWCategoryWidget#updateSortkey\n * @param {Object} item Category item\n * @param {string} item.name Fully prefixed category name\n * @param {string} item.value Category value (name without prefix)\n * @param {ve.dm.MWCategoryMetaItem} item.metaItem\n */\n\n/* Methods */\n\n/**\n * Surface fragment for modifying meta list\n *\n * @param {ve.dm.SurfaceFragment|null} fragment Surface fragment\n */\nve.ui.MWCategoryWidget.prototype.setFragment = function ( fragment ) {\n\tthis.fragment = fragment;\n};\n\n/**\n * Handle input 'choose' event.\n *\n * @param {OO.ui.MenuOptionWidget} item Selected item\n */\nve.ui.MWCategoryWidget.prototype.onInputChoose = function ( item ) {\n\tconst value = item.getData();\n\n\tif ( value && value !== '' ) {\n\t\t// Add new item\n\t\tconst categoryItem = this.getCategoryItemFromValue( value );\n\t\tthis.queryCategoryStatus( [ categoryItem.name ] ).done( () => {\n\t\t\t// Remove existing items by name\n\t\t\tconst toRemove = mw.Title.newFromText( categoryItem.name ).getMainText();\n\t\t\tif ( Object.prototype.hasOwnProperty.call( this.categories, toRemove ) ) {\n\t\t\t\tthis.fragment.removeMeta( this.categories[ toRemove ].metaItem );\n\t\t\t}\n\t\t\tcategoryItem.name = this.normalizedTitles[ categoryItem.name ];\n\t\t\tthis.emit( 'newCategory', categoryItem );\n\t\t} );\n\t}\n};\n\n/**\n * Hanle popup open event\n *\n */\nve.ui.MWCategoryWidget.prototype.onPopupOpened = function () {\n\tthis.popup.removeButton.focus();\n};\n\n/**\n * Handle popup closing dialog\n */\nve.ui.MWCategoryWidget.prototype.onPopupClosing = function () {\n\tthis.expandedItem.focus();\n};\n\n/**\n * Get a category item.\n *\n * @param {string} value Category name\n * @return {Object} Category item with name, value and metaItem properties\n */\nve.ui.MWCategoryWidget.prototype.getCategoryItemFromValue = function ( value ) {\n\t// Normalize\n\tconst title = mw.Title.newFromText( this.categoryPrefix + value );\n\tif ( title ) {\n\t\treturn {\n\t\t\tname: title.getPrefixedText(),\n\t\t\tvalue: title.getMainText(),\n\t\t\tmetaItem: {}\n\t\t};\n\t}\n\n\tif ( this.forceCapitalization ) {\n\t\tvalue = value.slice( 0, 1 ).toUpperCase() + value.slice( 1 );\n\t}\n\n\treturn {\n\t\tname: this.categoryPrefix + value,\n\t\tvalue: value,\n\t\tmetaItem: {}\n\t};\n};\n\n/**\n * Focus the widget\n */\nve.ui.MWCategoryWidget.prototype.focus = function () {\n\tthis.input.$input[ 0 ].focus();\n};\n\n/**\n * @param {ve.ui.MWCategoryItemWidget} item Item that was moved\n * @param {number} newIndex The new index of the item\n */\nve.ui.MWCategoryWidget.prototype.onDrag = function () {\n\tthis.fitInput();\n};\n\n/**\n * @inheritdoc OO.ui.mixin.DraggableGroupElement\n * @fires ve.ui.MWCategoryWidget#newCategory\n */\nve.ui.MWCategoryWidget.prototype.reorder = function ( item, newIndex ) {\n\t// Compute beforeCategory before removing, otherwise newIndex\n\t// could be off by one\n\tconst beforeCategory = this.items[ newIndex ] && this.items[ newIndex ].metaItem;\n\tif ( Object.prototype.hasOwnProperty.call( this.categories, item.value ) ) {\n\t\tthis.fragment.removeMeta( this.categories[ item.value ].metaItem );\n\t}\n\n\tthis.emit( 'newCategory', item, beforeCategory );\n};\n\n/**\n * Removes category from model.\n *\n * @param {string} name Removed category name\n */\nve.ui.MWCategoryWidget.prototype.onRemoveCategory = function ( name ) {\n\tthis.fragment.removeMeta( this.categories[ name ].metaItem );\n\tdelete this.categories[ name ];\n};\n\n/**\n * Update sortkey value, emit updateSortkey event\n *\n * @param {string} name\n * @param {string} value\n * @fires ve.ui.MWCategoryWidget#updateSortkey\n */\nve.ui.MWCategoryWidget.prototype.onUpdateSortkey = function ( name, value ) {\n\tthis.categories[ name ].sortKey = value;\n\tthis.emit( 'updateSortkey', this.categories[ name ] );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoryWidget.prototype.clearItems = function () {\n\tOO.ui.mixin.GroupElement.prototype.clearItems.call( this );\n\tthis.categories = {};\n};\n\n/**\n * Toggles popup menu per category item\n *\n * @param {Object} item\n */\nve.ui.MWCategoryWidget.prototype.onTogglePopupMenu = function ( item ) {\n\t// Close open popup.\n\tif ( item.value !== this.popup.category ) {\n\t\tthis.popup.openPopup( item );\n\t\tthis.expandedItem = item;\n\t\tthis.popup\n\t\t\t.$element\n\t\t\t.attr( 'aria-label',\n\t\t\t\tve.msg( 'visualeditor-dialog-meta-categories-category' )\n\t\t\t);\n\t} else {\n\t\t// Handle toggle\n\t\tthis.popup.closePopup();\n\t}\n};\n\n/**\n * Set the default sort key.\n *\n * @param {string} value Default sort key value\n */\nve.ui.MWCategoryWidget.prototype.setDefaultSortKey = function ( value ) {\n\tthis.popup.setDefaultSortKey( value );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoryWidget.prototype.setDisabled = function () {\n\t// Parent method\n\tve.ui.MWCategoryWidget.super.prototype.setDisabled.apply( this, arguments );\n\n\tconst isDisabled = this.isDisabled();\n\n\tif ( this.input ) {\n\t\tthis.input.setDisabled( isDisabled );\n\t}\n\tif ( this.items ) {\n\t\tthis.items.forEach( ( item ) => {\n\t\t\titem.setDisabled( isDisabled );\n\t\t} );\n\t}\n\tif ( this.popup ) {\n\t\tthis.popup.closePopup();\n\t}\n};\n\n/**\n * Get list of category names.\n *\n * @return {string[]} List of category names\n */\nve.ui.MWCategoryWidget.prototype.getCategories = function () {\n\treturn Object.keys( this.categories );\n};\n\n/**\n * Starts a request to update the link cache's hidden and missing status for\n * the given titles, following normalisation responses as necessary.\n *\n * @param {string[]} categoryNames\n * @return {jQuery.Promise}\n */\nve.ui.MWCategoryWidget.prototype.queryCategoryStatus = function ( categoryNames ) {\n\t// Get rid of any we already know the hidden status of, or have an entry\n\t// if normalizedTitles (i.e. have been fetched before)\n\tconst categoryNamesToQuery = categoryNames.filter( ( name ) => {\n\t\tif ( this.normalizedTitles[ name ] ) {\n\t\t\treturn false;\n\t\t}\n\t\tconst cacheEntry = ve.init.platform.linkCache.getCached( name );\n\t\tif ( cacheEntry && cacheEntry.hidden ) {\n\t\t\t// As we aren't doing an API request for this category, mark it in the cache.\n\t\t\tthis.normalizedTitles[ name ] = name;\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t} );\n\n\tif ( !categoryNamesToQuery.length ) {\n\t\treturn ve.createDeferred().resolve( {} ).promise();\n\t}\n\n\tlet index = 0;\n\tconst batchSize = 50, promises = [];\n\t// Batch this up into groups of 50\n\twhile ( index < categoryNamesToQuery.length ) {\n\t\tpromises.push( ve.init.target.getContentApi().get( {\n\t\t\taction: 'query',\n\t\t\tprop: 'pageprops',\n\t\t\ttitles: categoryNamesToQuery.slice( index, index + batchSize ),\n\t\t\tppprop: 'hiddencat',\n\t\t\tredirects: ''\n\t\t} ).then( ( result ) => {\n\t\t\tconst linkCacheUpdate = {},\n\t\t\t\tnormalizedTitles = {};\n\t\t\tif ( result && result.query && result.query.pages ) {\n\t\t\t\tresult.query.pages.forEach( ( pageInfo ) => {\n\t\t\t\t\tlinkCacheUpdate[ pageInfo.title ] = {\n\t\t\t\t\t\tmissing: Object.prototype.hasOwnProperty.call( pageInfo, 'missing' ),\n\t\t\t\t\t\thidden: pageInfo.pageprops &&\n\t\t\t\t\t\t\tObject.prototype.hasOwnProperty.call( pageInfo.pageprops, 'hiddencat' )\n\t\t\t\t\t};\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( result && result.query && result.query.redirects ) {\n\t\t\t\tresult.query.redirects.forEach( ( redirectInfo ) => {\n\t\t\t\t\tthis.categoryRedirects[ redirectInfo.from ] = redirectInfo.to;\n\t\t\t\t} );\n\t\t\t}\n\t\t\tve.init.platform.linkCache.set( linkCacheUpdate );\n\n\t\t\tif ( result.query && result.query.normalized ) {\n\t\t\t\tresult.query.normalized.forEach( ( normalisation ) => {\n\t\t\t\t\tnormalizedTitles[ normalisation.from ] = normalisation.to;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tcategoryNames.forEach( ( name ) => {\n\t\t\t\tthis.normalizedTitles[ name ] = normalizedTitles[ name ] || name;\n\t\t\t} );\n\t\t} ) );\n\t\tindex += batchSize;\n\t}\n\n\treturn ve.promiseAll( promises );\n};\n\n/**\n * Adds category items.\n *\n * @param {Object[]} items Items to add\n * @param {number} [index] Index to insert items after\n * @return {jQuery.Promise}\n */\nve.ui.MWCategoryWidget.prototype.addItems = function ( items, index ) {\n\tconst categoryItems = [],\n\t\t// eslint-disable-next-line no-jquery/no-map-util\n\t\tcategoryNames = $.map( items, ( item ) => item.name );\n\n\treturn this.queryCategoryStatus( categoryNames ).then( () => {\n\t\tlet config;\n\t\tconst checkValueMatches = function ( existingCategoryItem ) {\n\t\t\treturn config.item.value === existingCategoryItem.value;\n\t\t};\n\n\t\titems.forEach( ( item ) => {\n\t\t\titem.name = this.normalizedTitles[ item.name ];\n\n\t\t\tconst itemTitle = new mw.Title( item.name, mw.config.get( 'wgNamespaceIds' ).category );\n\t\t\t// Create a widget using the item data\n\t\t\tconfig = {\n\t\t\t\titem: item\n\t\t\t};\n\t\t\tlet cachedData;\n\t\t\tif ( Object.prototype.hasOwnProperty.call( this.categoryRedirects, itemTitle.getPrefixedText() ) ) {\n\t\t\t\tconfig.redirectTo = new mw.Title(\n\t\t\t\t\tthis.categoryRedirects[ itemTitle.getPrefixedText() ],\n\t\t\t\t\tmw.config.get( 'wgNamespaceIds' ).category\n\t\t\t\t).getMainText();\n\t\t\t\tcachedData = ve.init.platform.linkCache.getCached( this.categoryRedirects[ itemTitle.getPrefixedText() ] );\n\t\t\t} else {\n\t\t\t\tcachedData = ve.init.platform.linkCache.getCached( item.name );\n\t\t\t}\n\t\t\tconfig.hidden = cachedData.hidden;\n\t\t\tconfig.missing = cachedData.missing;\n\t\t\tconfig.disabled = this.disabled;\n\n\t\t\tconst categoryItem = new ve.ui.MWCategoryItemWidget( config );\n\t\t\tcategoryItem.connect( this, {\n\t\t\t\ttogglePopupMenu: 'onTogglePopupMenu'\n\t\t\t} );\n\n\t\t\t// Index item\n\t\t\tthis.categories[ itemTitle.getMainText() ] = categoryItem;\n\t\t\t// Copy sortKey from old item when \"moving\"\n\t\t\tconst existingCategoryItems = this.items.filter( checkValueMatches );\n\t\t\tif ( existingCategoryItems.length ) {\n\t\t\t\t// There should only be one element in existingCategoryItems\n\t\t\t\tcategoryItem.sortKey = existingCategoryItems[ 0 ].sortKey;\n\t\t\t\tthis.removeItems( [ existingCategoryItems[ 0 ] ] );\n\t\t\t}\n\n\t\t\tcategoryItems.push( categoryItem );\n\t\t} );\n\n\t\tOO.ui.mixin.DraggableGroupElement.prototype.addItems.call( this, categoryItems, index );\n\n\t\t// Ensure the input remains the last item in the list, and preserve focus\n\t\tconst hadFocus = this.getElementDocument().activeElement === this.input.$input[ 0 ];\n\t\tthis.$group.append( this.input.$element );\n\t\tif ( hadFocus ) {\n\t\t\tthis.input.$input[ 0 ].focus();\n\t\t}\n\t\tthis.fitInput();\n\t} );\n};\n\n/**\n * @inheritdoc\n */\nve.ui.MWCategoryWidget.prototype.removeItems = function ( items ) {\n\tfor ( let i = 0, len = items.length; i < len; i++ ) {\n\t\tconst categoryItem = items[ i ];\n\t\tif ( categoryItem ) {\n\t\t\tcategoryItem.disconnect( this );\n\t\t\titems.push( categoryItem );\n\t\t\tdelete this.categories[ categoryItem.value ];\n\t\t}\n\t}\n\n\tOO.ui.mixin.DraggableGroupElement.prototype.removeItems.call( this, items );\n\n\tthis.fitInput();\n};\n\n/**\n * Auto-fit the input.\n */\nve.ui.MWCategoryWidget.prototype.fitInput = function () {\n\tconst $input = this.input.$element;\n\n\t// eslint-disable-next-line no-jquery/no-sizzle\n\tif ( !this.items.length || !$input.is( ':visible' ) ) {\n\t\treturn;\n\t}\n\n\t// Measure the input's natural size\n\t$input.css( 'width', '' );\n\tconst inputWidth = $input.outerWidth( true );\n\n\t// this.items hasn't been updated if this was triggered by a drag event,\n\t// so look at document order\n\tconst $lastItem = this.$group.find( '.ve-ui-mwCategoryItemWidget' ).last();\n\t// Try to fit to the right of the last item\n\tconst availableSpace = Math.floor( this.$group.width() - ( $lastItem.position().left + $lastItem.outerWidth( true ) ) );\n\tif ( availableSpace > inputWidth ) {\n\t\t$input.css( 'width', availableSpace );\n\t}\n};\n","usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWEditSummaryWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWEducationPopupWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":54,"column":3,"nodeType":"CallExpression","endLine":58,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWExternalLinkAnnotationWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWGalleryGroupWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWGalleryItemWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWLazyMultilineTextInputWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWMediaInfoFieldWidget.js","messages":[],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":52,"column":14,"nodeType":"CallExpression","endLine":52,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/variable-pattern","severity":2,"message":"jQuery collection names must match the variablePattern","line":58,"column":4,"nodeType":"AssignmentExpression","endLine":67,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-html","severity":2,"message":"Prefer Element#innerHTML to .html","line":75,"column":3,"nodeType":"CallExpression","endLine":75,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-append-html","severity":1,"message":"Avoid injection of possibly unescaped HTML. Create DOM elements instead, or use .text.","line":78,"column":3,"nodeType":"CallExpression","endLine":78,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWParameterCheckboxInputWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWPreTextInputWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTargetWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTemplateTitleInputWidget.js","messages":[],"suppressedMessages":[{"ruleId":"prefer-regex-literals","severity":2,"message":"Use a regular expression literal instead of the 'RegExp' constructor.","line":73,"column":25,"nodeType":"NewExpression","messageId":"unexpectedRegExp","endLine":73,"endColumn":61,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"es-x/no-regexp-unicode-property-escapes","severity":2,"message":"ES2018 RegExp Unicode property escape sequences are forbidden.","line":73,"column":25,"nodeType":"NewExpression","messageId":"forbidden","endLine":73,"endColumn":61,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTocWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineButtonWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineControlsWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.js","messages":[],"suppressedMessages":[{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":184,"column":8,"nodeType":"CallExpression","endLine":184,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlinePartWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlinePlaceholderWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineToggleUnusedWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineWidget.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/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineWikitextWidget.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/modules/ve-mw/ve.track.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/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/api-testing/edit.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/pageobjects/edit.page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/content_editable.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/specs/toolbar.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/tests/selenium/wdio.conf.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}] --- end --- Disabling eslint rule 'no-jquery/no-done-fail' (broken in editcheck/modules/.eslintrc.json) on editcheck/modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/dm/.eslintrc.json) on modules/ve-mw/dm/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/preinit/.eslintrc.json) on modules/ve-mw/preinit/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/preinit/.eslintrc.json) on modules/ve-mw/preinit/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/tests/.eslintrc.json) on modules/ve-mw/tests/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/ve-mw/tests/.eslintrc.json) on modules/ve-mw/tests/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json Disabling eslint rule 'no-jquery/no-done-fail' (broken in modules/.eslintrc.json) on modules/.eslintrc.json $ /usr/bin/npm ci --- stderr --- npm WARN deprecated har-validator@5.1.5: this library is no longer supported npm WARN deprecated glob@8.1.0: Glob versions prior to v9 are no longer supported npm WARN deprecated formidable@1.2.6: Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated superagent@6.1.0: Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at <https://github.com/visionmedia/superagent/releases>. npm WARN deprecated svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x. --- stdout --- added 1212 packages, and audited 1213 packages in 44s 164 packages are looking for funding run `npm fund` for details 52 vulnerabilities (13 moderate, 36 high, 3 critical) To address issues that do not require attention, run: npm audit fix To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ /usr/bin/npm test --- stdout --- > visualeditor@0.0.0 test > grunt test && node build/checkModules.js Running "tyops:src" (tyops) task >> No typos found; 451 files checked for 21 typos. Running "eslint:all" (eslint) task /src/repo/build/screenshots.js 97:6 warning Found writeFile from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename /src/repo/editcheck/modules/editchecks/AddReferenceEditCheck.js 84:12 warning Prefer .then to .done no-jquery/no-done-fail 94:11 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw-collab/ve.init.mw.CollabTarget.init.js 65:3 warning Prefer .then to .done no-jquery/no-done-fail 65:3 warning Prefer .then to .fail no-jquery/no-done-fail 189:6 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js 79:15 warning Prefer .then to .done no-jquery/no-done-fail 79:15 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js 119:14 warning Prefer .then to .done no-jquery/no-done-fail 119:14 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js 176:14 warning Prefer .then to .done no-jquery/no-done-fail 176:14 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/models/ve.dm.MWImageModel.js 341:4 warning Prefer .then to .done no-jquery/no-done-fail 1199:3 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js 329:15 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js 368:3 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/ve.dm.MWWikitextSurfaceFragment.js 139:3 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.LinkCache.js 81:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js 1155:2 warning Prefer .then to .done no-jquery/no-done-fail 1155:2 warning Prefer .then to .fail no-jquery/no-done-fail 1587:32 warning Prefer .then to .done no-jquery/no-done-fail 1587:32 warning Prefer .then to .fail no-jquery/no-done-fail 1645:3 warning Prefer .then to .done no-jquery/no-done-fail 1645:3 warning Prefer .then to .fail no-jquery/no-done-fail 1721:37 warning Prefer .then to .done no-jquery/no-done-fail 1721:37 warning Prefer .then to .fail no-jquery/no-done-fail 2005:2 warning Prefer .then to .done no-jquery/no-done-fail 2005:2 warning Prefer .then to .fail no-jquery/no-done-fail 2010:3 warning Prefer .then to .done no-jquery/no-done-fail 2482:18 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js 245:3 warning Prefer .then to .done no-jquery/no-done-fail 398:3 warning Prefer .then to .done no-jquery/no-done-fail 398:3 warning Prefer .then to .fail no-jquery/no-done-fail 679:2 warning Prefer .then to .done no-jquery/no-done-fail 799:2 warning Prefer .then to .done no-jquery/no-done-fail 872:9 warning Prefer .then to .fail no-jquery/no-done-fail 1475:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/preinit/ve.init.MWEditingTabDialog.js 82:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js 674:6 warning Prefer .then to .done no-jquery/no-done-fail 1090:5 warning Prefer .then to .done no-jquery/no-done-fail 1520:6 warning Prefer .then to .done no-jquery/no-done-fail 1613:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js 51:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/tests/ui/dialogs/ve.ui.MWTransclusionDialog.test.js 42:3 warning Prefer .then to .done no-jquery/no-done-fail 42:3 warning Prefer .then to .fail no-jquery/no-done-fail 82:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js 436:26 warning Prefer .then to .done no-jquery/no-done-fail 623:9 warning Prefer .then to .done no-jquery/no-done-fail 705:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js 720:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js 358:27 warning Prefer .then to .done no-jquery/no-done-fail 358:27 warning Prefer .then to .fail no-jquery/no-done-fail 493:2 warning Prefer .then to .done no-jquery/no-done-fail 509:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js 363:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js 103:3 warning Prefer .then to .done no-jquery/no-done-fail 429:3 warning Prefer .then to .done no-jquery/no-done-fail 528:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js 214:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js 36:2 warning Prefer .then to .done no-jquery/no-done-fail 163:2 warning Prefer .then to .done no-jquery/no-done-fail 163:2 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js 196:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js 76:4 warning Prefer .then to .done no-jquery/no-done-fail 76:4 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/ve.ui.MWWikitextTransferRegistry.js 27:1 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/widgets/ve.ui.MWAceEditorWidget.js 82:3 warning Prefer .then to .done no-jquery/no-done-fail 90:2 warning Prefer .then to .done no-jquery/no-done-fail 153:2 warning Prefer .then to .done no-jquery/no-done-fail 201:2 warning Prefer .then to .done no-jquery/no-done-fail 219:2 warning Prefer .then to .done no-jquery/no-done-fail 265:2 warning Prefer .then to .done no-jquery/no-done-fail 265:2 warning Prefer .then to .fail no-jquery/no-done-fail 323:2 warning Prefer .then to .done no-jquery/no-done-fail 339:2 warning Prefer .then to .done no-jquery/no-done-fail 353:2 warning Prefer .then to .done no-jquery/no-done-fail 367:2 warning Prefer .then to .done no-jquery/no-done-fail 385:2 warning Prefer .then to .done no-jquery/no-done-fail 385:2 warning Prefer .then to .fail no-jquery/no-done-fail 401:3 warning Prefer .then to .done no-jquery/no-done-fail 406:2 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js 117:3 warning Prefer .then to .done no-jquery/no-done-fail ✖ 82 problems (0 errors, 82 warnings) Running "stylelint:all" (stylelint) task >> Linted 84 files without errors Running "banana:VisualEditor" (banana) task >> 7 message directories checked. Done. No missing files. --- end --- $ /usr/bin/npm audit --json --- stdout --- { "auditReportVersion": 2, "vulnerabilities": { "@babel/runtime": { "name": "@babel/runtime", "severity": "moderate", "isDirect": false, "via": [ { "source": 1103025, "name": "@babel/runtime", "dependency": "@babel/runtime", "title": "Babel has inefficient RexExp complexity in generated code with .replace when transpiling named capturing groups", "url": "https://github.com/advisories/GHSA-968p-4wvh-cqc8", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 6.2, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<7.26.10" } ], "effects": [], "range": "<7.26.10", "nodes": [ "node_modules/@babel/runtime" ], "fixAvailable": true }, "@jimp/core": { "name": "@jimp/core", "severity": "moderate", "isDirect": false, "via": [ "phin" ], "effects": [ "@jimp/custom" ], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/@jimp/core" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "@jimp/custom": { "name": "@jimp/custom", "severity": "moderate", "isDirect": false, "via": [ "@jimp/core" ], "effects": [ "jimp" ], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/@jimp/custom" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "@wdio/cli": { "name": "@wdio/cli", "severity": "high", "isDirect": true, "via": [ "webdriverio", "yarn-install" ], "effects": [ "@wdio/junit-reporter", "@wdio/local-runner", "@wdio/spec-reporter" ], "range": "5.4.10 - 8.43.0", "nodes": [ "node_modules/@wdio/cli" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/junit-reporter": { "name": "@wdio/junit-reporter", "severity": "high", "isDirect": true, "via": [ "@wdio/cli" ], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": [ "node_modules/@wdio/junit-reporter" ], "fixAvailable": { "name": "@wdio/junit-reporter", "version": "9.11.0", "isSemVerMajor": true } }, "@wdio/local-runner": { "name": "@wdio/local-runner", "severity": "high", "isDirect": true, "via": [ "@wdio/cli", "@wdio/runner" ], "effects": [], "range": "6.0.4 - 8.43.0", "nodes": [ "node_modules/@wdio/local-runner" ], "fixAvailable": { "name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/runner": { "name": "@wdio/runner", "severity": "high", "isDirect": false, "via": [ "webdriverio" ], "effects": [ "@wdio/local-runner" ], "range": "7.16.5 - 8.43.0", "nodes": [ "node_modules/@wdio/runner" ], "fixAvailable": { "name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/spec-reporter": { "name": "@wdio/spec-reporter", "severity": "high", "isDirect": true, "via": [ "@wdio/cli" ], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": [ "node_modules/@wdio/spec-reporter" ], "fixAvailable": { "name": "@wdio/spec-reporter", "version": "9.11.0", "isSemVerMajor": true } }, "bin-build": { "name": "bin-build", "severity": "high", "isDirect": false, "via": [ "download", "execa" ], "effects": [ "gifsicle", "guetzli", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin" ], "range": ">=2.1.2", "nodes": [ "node_modules/bin-build" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-check": { "name": "bin-check", "severity": "high", "isDirect": false, "via": [ "execa" ], "effects": [ "bin-wrapper" ], "range": ">=4.1.0", "nodes": [ "node_modules/bin-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-version": { "name": "bin-version", "severity": "high", "isDirect": false, "via": [ "find-versions" ], "effects": [ "bin-version-check" ], "range": "<=4.0.0", "nodes": [ "node_modules/bin-version" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-version-check": { "name": "bin-version-check", "severity": "high", "isDirect": false, "via": [ "bin-version" ], "effects": [ "bin-wrapper" ], "range": "<=4.0.0", "nodes": [ "node_modules/bin-version-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-wrapper": { "name": "bin-wrapper", "severity": "high", "isDirect": false, "via": [ "bin-check", "bin-version-check", "download" ], "effects": [ "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin" ], "range": ">=0.4.0", "nodes": [ "node_modules/bin-wrapper" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "cacheable-request": { "name": "cacheable-request", "severity": "high", "isDirect": false, "via": [ "http-cache-semantics" ], "effects": [ "got" ], "range": "0.1.0 - 2.1.4", "nodes": [ "node_modules/bin-wrapper/node_modules/cacheable-request" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "cross-spawn": { "name": "cross-spawn", "severity": "high", "isDirect": false, "via": [ { "source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<6.0.6" } ], "effects": [ "execa", "yarn-install" ], "range": "<6.0.6", "nodes": [ "node_modules/execa/node_modules/cross-spawn", "node_modules/yarn-install/node_modules/cross-spawn" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "css-select": { "name": "css-select", "severity": "high", "isDirect": false, "via": [ "nth-check" ], "effects": [ "svgo" ], "range": "<=3.1.0", "nodes": [ "node_modules/css-select" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "devtools": { "name": "devtools", "severity": "high", "isDirect": false, "via": [ "puppeteer-core" ], "effects": [], "range": ">=7.16.5", "nodes": [ "node_modules/devtools" ], "fixAvailable": true }, "download": { "name": "download", "severity": "moderate", "isDirect": false, "via": [ "got" ], "effects": [ "bin-build", "bin-wrapper" ], "range": ">=4.0.0", "nodes": [ "node_modules/bin-wrapper/node_modules/download", "node_modules/download" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "exec-buffer": { "name": "exec-buffer", "severity": "high", "isDirect": false, "via": [ "execa" ], "effects": [ "grunt-image" ], "range": ">=3.1.0", "nodes": [ "node_modules/exec-buffer" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "execa": { "name": "execa", "severity": "high", "isDirect": false, "via": [ "cross-spawn" ], "effects": [ "bin-build", "bin-check", "exec-buffer" ], "range": "0.5.0 - 0.9.0", "nodes": [ "node_modules/execa" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "find-versions": { "name": "find-versions", "severity": "high", "isDirect": false, "via": [ "semver-regex" ], "effects": [ "bin-version" ], "range": "<=3.2.0", "nodes": [ "node_modules/find-versions" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "gifsicle": { "name": "gifsicle", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/gifsicle" ], "fixAvailable": true }, "got": { "name": "got", "severity": "high", "isDirect": false, "via": [ { "source": 1088948, "name": "got", "dependency": "got", "title": "Got allows a redirect to a UNIX socket", "url": "https://github.com/advisories/GHSA-pfrx-2q88-qq97", "severity": "moderate", "cwe": [], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<11.8.5" }, "cacheable-request" ], "effects": [ "download" ], "range": "<=11.8.3", "nodes": [ "node_modules/bin-wrapper/node_modules/got", "node_modules/download/node_modules/got" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "grunt-image": { "name": "grunt-image", "severity": "high", "isDirect": true, "via": [ "exec-buffer", "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "svgo", "zopflipng-bin" ], "effects": [], "range": "0.1.0 || >=1.0.0", "nodes": [ "node_modules/grunt-image" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "guetzli": { "name": "guetzli", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": "*", "nodes": [ "node_modules/guetzli" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "http-cache-semantics": { "name": "http-cache-semantics", "severity": "high", "isDirect": false, "via": [ { "source": 1102456, "name": "http-cache-semantics", "dependency": "http-cache-semantics", "title": "http-cache-semantics vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-rc47-6667-2j5j", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<4.1.1" } ], "effects": [ "cacheable-request" ], "range": "<4.1.1", "nodes": [ "node_modules/bin-wrapper/node_modules/http-cache-semantics" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "jimp": { "name": "jimp", "severity": "moderate", "isDirect": true, "via": [ "@jimp/custom" ], "effects": [], "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/jimp" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "jpeg-recompress-bin": { "name": "jpeg-recompress-bin", "severity": "moderate", "isDirect": false, "via": [ "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.1", "nodes": [ "node_modules/jpeg-recompress-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "meow": { "name": "meow", "severity": "high", "isDirect": false, "via": [ "trim-newlines" ], "effects": [], "range": "3.4.0 - 5.0.0", "nodes": [ "node_modules/meow" ], "fixAvailable": true }, "minimatch": { "name": "minimatch", "severity": "high", "isDirect": false, "via": [ { "source": 1096485, "name": "minimatch", "dependency": "minimatch", "title": "minimatch ReDoS vulnerability", "url": "https://github.com/advisories/GHSA-f8q6-p94x-37v3", "severity": "high", "cwe": [ "CWE-400", "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.0.5" } ], "effects": [ "mocha" ], "range": "<3.0.5", "nodes": [ "node_modules/mocha/node_modules/minimatch" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "minimist": { "name": "minimist", "severity": "critical", "isDirect": false, "via": [ { "source": 1096466, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-vh95-rmgr-6w4m", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 5.6, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L" }, "range": "<0.2.1" }, { "source": 1097677, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-xvch-5gv4-984h", "severity": "critical", "cwe": [ "CWE-1321" ], "cvss": { "score": 9.8, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" }, "range": "<0.2.4" } ], "effects": [ "mkdirp" ], "range": "<=0.2.3", "nodes": [ "node_modules/mocha/node_modules/minimist" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mkdirp": { "name": "mkdirp", "severity": "critical", "isDirect": false, "via": [ "minimist" ], "effects": [ "mocha" ], "range": "0.4.1 - 0.5.1", "nodes": [ "node_modules/mocha/node_modules/mkdirp" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mocha": { "name": "mocha", "severity": "critical", "isDirect": true, "via": [ "minimatch", "mkdirp" ], "effects": [], "range": "1.21.5 - 9.2.1", "nodes": [ "node_modules/mocha" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mozjpeg": { "name": "mozjpeg", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=4.0.0", "nodes": [ "node_modules/mozjpeg" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "mwbot": { "name": "mwbot", "severity": "moderate", "isDirect": false, "via": [ "request" ], "effects": [ "wdio-mediawiki" ], "range": ">=0.1.6", "nodes": [ "node_modules/mwbot" ], "fixAvailable": false }, "nth-check": { "name": "nth-check", "severity": "high", "isDirect": false, "via": [ { "source": 1095141, "name": "nth-check", "dependency": "nth-check", "title": "Inefficient Regular Expression Complexity in nth-check", "url": "https://github.com/advisories/GHSA-rp65-9cf3-cjxr", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<2.0.1" } ], "effects": [ "css-select" ], "range": "<2.0.1", "nodes": [ "node_modules/css-select/node_modules/nth-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "optipng-bin": { "name": "optipng-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/optipng-bin" ], "fixAvailable": true }, "phin": { "name": "phin", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096967, "name": "phin", "dependency": "phin", "title": "phin may include sensitive headers in subsequent requests after redirect", "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf", "severity": "moderate", "cwe": [ "CWE-200" ], "cvss": { "score": 4.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N" }, "range": "<3.7.1" } ], "effects": [ "@jimp/core" ], "range": "<3.7.1", "nodes": [ "node_modules/phin" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "pngquant-bin": { "name": "pngquant-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/pngquant-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "puppeteer-core": { "name": "puppeteer-core", "severity": "high", "isDirect": false, "via": [ "ws" ], "effects": [ "devtools", "webdriverio" ], "range": "11.0.0 - 22.11.1", "nodes": [ "node_modules/puppeteer-core" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "request": { "name": "request", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": [ "CWE-918" ], "cvss": { "score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" }, "range": "<=2.88.2" }, "tough-cookie" ], "effects": [ "mwbot" ], "range": "*", "nodes": [ "node_modules/request" ], "fixAvailable": false }, "selenium-webdriver": { "name": "selenium-webdriver", "severity": "moderate", "isDirect": true, "via": [ "xml2js" ], "effects": [], "range": "2.43.1 - 4.0.0-rc-2", "nodes": [ "node_modules/selenium-webdriver" ], "fixAvailable": { "name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true } }, "semver-regex": { "name": "semver-regex", "severity": "high", "isDirect": false, "via": [ { "source": 1092475, "name": "semver-regex", "dependency": "semver-regex", "title": "semver-regex Regular Expression Denial of Service (ReDOS)", "url": "https://github.com/advisories/GHSA-44c6-4v22-4mhx", "severity": "high", "cwe": [ "CWE-400", "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.1.3" }, { "source": 1092605, "name": "semver-regex", "dependency": "semver-regex", "title": "Regular expression denial of service in semver-regex", "url": "https://github.com/advisories/GHSA-4x5v-gmq8-25ch", "severity": "low", "cwe": [ "CWE-1333" ], "cvss": { "score": 0, "vectorString": null }, "range": "<3.1.4" } ], "effects": [ "find-versions" ], "range": "<=3.1.3", "nodes": [ "node_modules/semver-regex" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "svgo": { "name": "svgo", "severity": "high", "isDirect": false, "via": [ "css-select" ], "effects": [ "grunt-image" ], "range": "1.0.0 - 1.3.2", "nodes": [ "node_modules/svgo" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "tough-cookie": { "name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N" }, "range": "<4.1.3" } ], "effects": [ "request" ], "range": "<4.1.3", "nodes": [ "node_modules/tough-cookie" ], "fixAvailable": false }, "trim-newlines": { "name": "trim-newlines", "severity": "high", "isDirect": false, "via": [ { "source": 1095100, "name": "trim-newlines", "dependency": "trim-newlines", "title": "Uncontrolled Resource Consumption in trim-newlines", "url": "https://github.com/advisories/GHSA-7p7h-4mm5-852v", "severity": "high", "cwe": [ "CWE-400" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.0.1" } ], "effects": [ "meow" ], "range": "<3.0.1", "nodes": [ "node_modules/trim-newlines" ], "fixAvailable": true }, "wdio-mediawiki": { "name": "wdio-mediawiki", "severity": "moderate", "isDirect": true, "via": [ "mwbot" ], "effects": [], "range": "*", "nodes": [ "node_modules/wdio-mediawiki" ], "fixAvailable": false }, "webdriverio": { "name": "webdriverio", "severity": "high", "isDirect": false, "via": [ "devtools", "puppeteer-core" ], "effects": [ "@wdio/cli", "@wdio/runner" ], "range": "7.16.5 - 8.43.0", "nodes": [ "node_modules/webdriverio" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "ws": { "name": "ws", "severity": "high", "isDirect": false, "via": [ { "source": 1098392, "name": "ws", "dependency": "ws", "title": "ws affected by a DoS when handling a request with many HTTP headers", "url": "https://github.com/advisories/GHSA-3h5v-q93c-6h6q", "severity": "high", "cwe": [ "CWE-476" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": ">=8.0.0 <8.17.1" } ], "effects": [ "puppeteer-core" ], "range": "8.0.0 - 8.17.0", "nodes": [ "node_modules/ws" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "xml2js": { "name": "xml2js", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096693, "name": "xml2js", "dependency": "xml2js", "title": "xml2js is vulnerable to prototype pollution", "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<0.5.0" } ], "effects": [ "selenium-webdriver" ], "range": "<0.5.0", "nodes": [ "node_modules/xml2js" ], "fixAvailable": { "name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true } }, "yarn-install": { "name": "yarn-install", "severity": "high", "isDirect": false, "via": [ "cross-spawn" ], "effects": [ "@wdio/cli" ], "range": "*", "nodes": [ "node_modules/yarn-install" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "zopflipng-bin": { "name": "zopflipng-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/zopflipng-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 13, "high": 36, "critical": 3, "total": 52 }, "dependencies": { "prod": 1, "dev": 1213, "optional": 2, "peer": 1, "peerOptional": 0, "total": 1213 } } } --- end --- Attempting to npm audit fix $ /usr/bin/npm audit fix --dry-run --only=dev --json --- stderr --- npm WARN invalid config only="dev" set in command line options npm WARN invalid config Must be one of: null, prod, production --- stdout --- { "added": 2, "removed": 0, "changed": 1, "audited": 1215, "funding": 164, "audit": { "auditReportVersion": 2, "vulnerabilities": { "@babel/runtime": { "name": "@babel/runtime", "severity": "moderate", "isDirect": false, "via": [ { "source": 1103025, "name": "@babel/runtime", "dependency": "@babel/runtime", "title": "Babel has inefficient RexExp complexity in generated code with .replace when transpiling named capturing groups", "url": "https://github.com/advisories/GHSA-968p-4wvh-cqc8", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 6.2, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<7.26.10" } ], "effects": [], "range": "<7.26.10", "nodes": [ "" ], "fixAvailable": true }, "@jimp/core": { "name": "@jimp/core", "severity": "moderate", "isDirect": false, "via": [ "phin" ], "effects": [ "@jimp/custom" ], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/@jimp/core" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "@jimp/custom": { "name": "@jimp/custom", "severity": "moderate", "isDirect": false, "via": [ "@jimp/core" ], "effects": [ "jimp" ], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/@jimp/custom" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "@wdio/cli": { "name": "@wdio/cli", "severity": "high", "isDirect": true, "via": [ "webdriverio", "yarn-install" ], "effects": [ "@wdio/junit-reporter", "@wdio/local-runner", "@wdio/spec-reporter" ], "range": "5.4.10 - 8.43.0", "nodes": [ "node_modules/@wdio/cli" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/junit-reporter": { "name": "@wdio/junit-reporter", "severity": "high", "isDirect": true, "via": [ "@wdio/cli" ], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": [ "node_modules/@wdio/junit-reporter" ], "fixAvailable": { "name": "@wdio/junit-reporter", "version": "9.11.0", "isSemVerMajor": true } }, "@wdio/local-runner": { "name": "@wdio/local-runner", "severity": "high", "isDirect": true, "via": [ "@wdio/cli", "@wdio/runner" ], "effects": [], "range": "6.0.4 - 8.43.0", "nodes": [ "node_modules/@wdio/local-runner" ], "fixAvailable": { "name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/runner": { "name": "@wdio/runner", "severity": "high", "isDirect": false, "via": [ "webdriverio" ], "effects": [ "@wdio/local-runner" ], "range": "7.16.5 - 8.43.0", "nodes": [ "node_modules/@wdio/runner" ], "fixAvailable": { "name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true } }, "@wdio/spec-reporter": { "name": "@wdio/spec-reporter", "severity": "high", "isDirect": true, "via": [ "@wdio/cli" ], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": [ "node_modules/@wdio/spec-reporter" ], "fixAvailable": { "name": "@wdio/spec-reporter", "version": "9.11.0", "isSemVerMajor": true } }, "bin-build": { "name": "bin-build", "severity": "high", "isDirect": false, "via": [ "download", "execa" ], "effects": [ "gifsicle", "guetzli", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin" ], "range": ">=2.1.2", "nodes": [ "node_modules/bin-build" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-check": { "name": "bin-check", "severity": "high", "isDirect": false, "via": [ "execa" ], "effects": [ "bin-wrapper" ], "range": ">=4.1.0", "nodes": [ "node_modules/bin-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-version": { "name": "bin-version", "severity": "high", "isDirect": false, "via": [ "find-versions" ], "effects": [ "bin-version-check" ], "range": "<=4.0.0", "nodes": [ "node_modules/bin-version" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-version-check": { "name": "bin-version-check", "severity": "high", "isDirect": false, "via": [ "bin-version" ], "effects": [ "bin-wrapper" ], "range": "<=4.0.0", "nodes": [ "node_modules/bin-version-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "bin-wrapper": { "name": "bin-wrapper", "severity": "high", "isDirect": false, "via": [ "bin-check", "bin-version-check", "download" ], "effects": [ "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin" ], "range": ">=0.4.0", "nodes": [ "node_modules/bin-wrapper" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "cacheable-request": { "name": "cacheable-request", "severity": "high", "isDirect": false, "via": [ "http-cache-semantics" ], "effects": [ "got" ], "range": "0.1.0 - 2.1.4", "nodes": [ "node_modules/bin-wrapper/node_modules/cacheable-request" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "cross-spawn": { "name": "cross-spawn", "severity": "high", "isDirect": false, "via": [ { "source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<6.0.6" } ], "effects": [ "execa", "yarn-install" ], "range": "<6.0.6", "nodes": [ "node_modules/execa/node_modules/cross-spawn", "node_modules/yarn-install/node_modules/cross-spawn" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "css-select": { "name": "css-select", "severity": "high", "isDirect": false, "via": [ "nth-check" ], "effects": [ "svgo" ], "range": "<=3.1.0", "nodes": [ "node_modules/css-select" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "devtools": { "name": "devtools", "severity": "high", "isDirect": false, "via": [ "puppeteer-core" ], "effects": [], "range": ">=7.16.5", "nodes": [ "node_modules/devtools" ], "fixAvailable": true }, "download": { "name": "download", "severity": "moderate", "isDirect": false, "via": [ "got" ], "effects": [ "bin-build", "bin-wrapper" ], "range": ">=4.0.0", "nodes": [ "node_modules/bin-wrapper/node_modules/download", "node_modules/download" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "exec-buffer": { "name": "exec-buffer", "severity": "high", "isDirect": false, "via": [ "execa" ], "effects": [ "grunt-image" ], "range": ">=3.1.0", "nodes": [ "node_modules/exec-buffer" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "execa": { "name": "execa", "severity": "high", "isDirect": false, "via": [ "cross-spawn" ], "effects": [ "bin-build", "bin-check", "exec-buffer" ], "range": "0.5.0 - 0.9.0", "nodes": [ "node_modules/execa" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "find-versions": { "name": "find-versions", "severity": "high", "isDirect": false, "via": [ "semver-regex" ], "effects": [ "bin-version" ], "range": "<=3.2.0", "nodes": [ "node_modules/find-versions" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "gifsicle": { "name": "gifsicle", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/gifsicle" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "got": { "name": "got", "severity": "high", "isDirect": false, "via": [ { "source": 1088948, "name": "got", "dependency": "got", "title": "Got allows a redirect to a UNIX socket", "url": "https://github.com/advisories/GHSA-pfrx-2q88-qq97", "severity": "moderate", "cwe": [], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<11.8.5" }, "cacheable-request" ], "effects": [ "download" ], "range": "<=11.8.3", "nodes": [ "node_modules/bin-wrapper/node_modules/got", "node_modules/download/node_modules/got" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "grunt-image": { "name": "grunt-image", "severity": "high", "isDirect": true, "via": [ "exec-buffer", "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "svgo", "zopflipng-bin" ], "effects": [], "range": "0.1.0 || >=1.0.0", "nodes": [ "node_modules/grunt-image" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "guetzli": { "name": "guetzli", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": "*", "nodes": [ "node_modules/guetzli" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "http-cache-semantics": { "name": "http-cache-semantics", "severity": "high", "isDirect": false, "via": [ { "source": 1102456, "name": "http-cache-semantics", "dependency": "http-cache-semantics", "title": "http-cache-semantics vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-rc47-6667-2j5j", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<4.1.1" } ], "effects": [ "cacheable-request" ], "range": "<4.1.1", "nodes": [ "node_modules/bin-wrapper/node_modules/http-cache-semantics" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "jimp": { "name": "jimp", "severity": "moderate", "isDirect": true, "via": [ "@jimp/custom" ], "effects": [], "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": [ "node_modules/jimp" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "jpeg-recompress-bin": { "name": "jpeg-recompress-bin", "severity": "moderate", "isDirect": false, "via": [ "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.1", "nodes": [ "node_modules/jpeg-recompress-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "meow": { "name": "meow", "severity": "high", "isDirect": false, "via": [ "trim-newlines" ], "effects": [], "range": "3.4.0 - 5.0.0", "nodes": [ "node_modules/meow" ], "fixAvailable": true }, "minimatch": { "name": "minimatch", "severity": "high", "isDirect": false, "via": [ { "source": 1096485, "name": "minimatch", "dependency": "minimatch", "title": "minimatch ReDoS vulnerability", "url": "https://github.com/advisories/GHSA-f8q6-p94x-37v3", "severity": "high", "cwe": [ "CWE-400", "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.0.5" } ], "effects": [ "mocha" ], "range": "<3.0.5", "nodes": [ "node_modules/mocha/node_modules/minimatch" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "minimist": { "name": "minimist", "severity": "critical", "isDirect": false, "via": [ { "source": 1096466, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-vh95-rmgr-6w4m", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 5.6, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L" }, "range": "<0.2.1" }, { "source": 1097677, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-xvch-5gv4-984h", "severity": "critical", "cwe": [ "CWE-1321" ], "cvss": { "score": 9.8, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" }, "range": "<0.2.4" } ], "effects": [ "mkdirp" ], "range": "<=0.2.3", "nodes": [ "node_modules/mocha/node_modules/minimist" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mkdirp": { "name": "mkdirp", "severity": "critical", "isDirect": false, "via": [ "minimist" ], "effects": [ "mocha" ], "range": "0.4.1 - 0.5.1", "nodes": [ "node_modules/mocha/node_modules/mkdirp" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mocha": { "name": "mocha", "severity": "critical", "isDirect": true, "via": [ "minimatch", "mkdirp" ], "effects": [], "range": "1.21.5 - 9.2.1", "nodes": [ "node_modules/mocha" ], "fixAvailable": { "name": "mocha", "version": "11.1.0", "isSemVerMajor": true } }, "mozjpeg": { "name": "mozjpeg", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [], "range": ">=4.0.0", "nodes": [ "node_modules/mozjpeg" ], "fixAvailable": true }, "mwbot": { "name": "mwbot", "severity": "moderate", "isDirect": false, "via": [ "request" ], "effects": [ "wdio-mediawiki" ], "range": ">=0.1.6", "nodes": [ "node_modules/mwbot" ], "fixAvailable": false }, "nth-check": { "name": "nth-check", "severity": "high", "isDirect": false, "via": [ { "source": 1095141, "name": "nth-check", "dependency": "nth-check", "title": "Inefficient Regular Expression Complexity in nth-check", "url": "https://github.com/advisories/GHSA-rp65-9cf3-cjxr", "severity": "high", "cwe": [ "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<2.0.1" } ], "effects": [ "css-select" ], "range": "<2.0.1", "nodes": [ "node_modules/css-select/node_modules/nth-check" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "optipng-bin": { "name": "optipng-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [], "range": ">=3.0.0", "nodes": [ "node_modules/optipng-bin" ], "fixAvailable": true }, "phin": { "name": "phin", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096967, "name": "phin", "dependency": "phin", "title": "phin may include sensitive headers in subsequent requests after redirect", "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf", "severity": "moderate", "cwe": [ "CWE-200" ], "cvss": { "score": 4.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N" }, "range": "<3.7.1" } ], "effects": [ "@jimp/core" ], "range": "<3.7.1", "nodes": [ "node_modules/phin" ], "fixAvailable": { "name": "jimp", "version": "1.6.0", "isSemVerMajor": true } }, "pngquant-bin": { "name": "pngquant-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/pngquant-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "puppeteer-core": { "name": "puppeteer-core", "severity": "high", "isDirect": false, "via": [ "ws" ], "effects": [ "devtools", "webdriverio" ], "range": "11.0.0 - 22.11.1", "nodes": [ "node_modules/puppeteer-core" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "request": { "name": "request", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": [ "CWE-918" ], "cvss": { "score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N" }, "range": "<=2.88.2" }, "tough-cookie" ], "effects": [ "mwbot" ], "range": "*", "nodes": [ "node_modules/request" ], "fixAvailable": false }, "selenium-webdriver": { "name": "selenium-webdriver", "severity": "moderate", "isDirect": true, "via": [ "xml2js" ], "effects": [], "range": "2.43.1 - 4.0.0-rc-2", "nodes": [ "node_modules/selenium-webdriver" ], "fixAvailable": { "name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true } }, "semver-regex": { "name": "semver-regex", "severity": "high", "isDirect": false, "via": [ { "source": 1092475, "name": "semver-regex", "dependency": "semver-regex", "title": "semver-regex Regular Expression Denial of Service (ReDOS)", "url": "https://github.com/advisories/GHSA-44c6-4v22-4mhx", "severity": "high", "cwe": [ "CWE-400", "CWE-1333" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.1.3" }, { "source": 1092605, "name": "semver-regex", "dependency": "semver-regex", "title": "Regular expression denial of service in semver-regex", "url": "https://github.com/advisories/GHSA-4x5v-gmq8-25ch", "severity": "low", "cwe": [ "CWE-1333" ], "cvss": { "score": 0, "vectorString": null }, "range": "<3.1.4" } ], "effects": [ "find-versions" ], "range": "<=3.1.3", "nodes": [ "node_modules/semver-regex" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "svgo": { "name": "svgo", "severity": "high", "isDirect": false, "via": [ "css-select" ], "effects": [ "grunt-image" ], "range": "1.0.0 - 1.3.2", "nodes": [ "node_modules/svgo" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } }, "tough-cookie": { "name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [ { "source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N" }, "range": "<4.1.3" } ], "effects": [ "request" ], "range": "<4.1.3", "nodes": [ "node_modules/tough-cookie" ], "fixAvailable": false }, "trim-newlines": { "name": "trim-newlines", "severity": "high", "isDirect": false, "via": [ { "source": 1095100, "name": "trim-newlines", "dependency": "trim-newlines", "title": "Uncontrolled Resource Consumption in trim-newlines", "url": "https://github.com/advisories/GHSA-7p7h-4mm5-852v", "severity": "high", "cwe": [ "CWE-400" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": "<3.0.1" } ], "effects": [ "meow" ], "range": "<3.0.1", "nodes": [ "node_modules/trim-newlines" ], "fixAvailable": true }, "wdio-mediawiki": { "name": "wdio-mediawiki", "severity": "moderate", "isDirect": true, "via": [ "mwbot" ], "effects": [], "range": "*", "nodes": [ "node_modules/wdio-mediawiki" ], "fixAvailable": false }, "webdriverio": { "name": "webdriverio", "severity": "high", "isDirect": false, "via": [ "devtools", "puppeteer-core" ], "effects": [ "@wdio/cli", "@wdio/runner" ], "range": "7.16.5 - 8.43.0", "nodes": [ "node_modules/webdriverio" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "ws": { "name": "ws", "severity": "high", "isDirect": false, "via": [ { "source": 1098392, "name": "ws", "dependency": "ws", "title": "ws affected by a DoS when handling a request with many HTTP headers", "url": "https://github.com/advisories/GHSA-3h5v-q93c-6h6q", "severity": "high", "cwe": [ "CWE-476" ], "cvss": { "score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" }, "range": ">=8.0.0 <8.17.1" } ], "effects": [ "puppeteer-core" ], "range": "8.0.0 - 8.17.0", "nodes": [ "node_modules/ws" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "xml2js": { "name": "xml2js", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096693, "name": "xml2js", "dependency": "xml2js", "title": "xml2js is vulnerable to prototype pollution", "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc", "severity": "moderate", "cwe": [ "CWE-1321" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<0.5.0" } ], "effects": [ "selenium-webdriver" ], "range": "<0.5.0", "nodes": [ "node_modules/xml2js" ], "fixAvailable": { "name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true } }, "yarn-install": { "name": "yarn-install", "severity": "high", "isDirect": false, "via": [ "cross-spawn" ], "effects": [ "@wdio/cli" ], "range": "*", "nodes": [ "node_modules/yarn-install" ], "fixAvailable": { "name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true } }, "zopflipng-bin": { "name": "zopflipng-bin", "severity": "high", "isDirect": false, "via": [ "bin-build", "bin-wrapper" ], "effects": [ "grunt-image" ], "range": ">=3.0.0", "nodes": [ "node_modules/zopflipng-bin" ], "fixAvailable": { "name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true } } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 13, "high": 36, "critical": 3, "total": 52 }, "dependencies": { "prod": 1, "dev": 1214, "optional": 2, "peer": 1, "peerOptional": 0, "total": 1214 } } } } --- end --- {"added": 2, "removed": 0, "changed": 1, "audited": 1215, "funding": 164, "audit": {"auditReportVersion": 2, "vulnerabilities": {"@babel/runtime": {"name": "@babel/runtime", "severity": "moderate", "isDirect": false, "via": [{"source": 1103025, "name": "@babel/runtime", "dependency": "@babel/runtime", "title": "Babel has inefficient RexExp complexity in generated code with .replace when transpiling named capturing groups", "url": "https://github.com/advisories/GHSA-968p-4wvh-cqc8", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 6.2, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<7.26.10"}], "effects": [], "range": "<7.26.10", "nodes": [""], "fixAvailable": true}, "@jimp/core": {"name": "@jimp/core", "severity": "moderate", "isDirect": false, "via": ["phin"], "effects": ["@jimp/custom"], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": ["node_modules/@jimp/core"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "@jimp/custom": {"name": "@jimp/custom", "severity": "moderate", "isDirect": false, "via": ["@jimp/core"], "effects": ["jimp"], "range": "<=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": ["node_modules/@jimp/custom"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "@wdio/cli": {"name": "@wdio/cli", "severity": "high", "isDirect": true, "via": ["webdriverio", "yarn-install"], "effects": ["@wdio/junit-reporter", "@wdio/local-runner", "@wdio/spec-reporter"], "range": "5.4.10 - 8.43.0", "nodes": ["node_modules/@wdio/cli"], "fixAvailable": {"name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true}}, "@wdio/junit-reporter": {"name": "@wdio/junit-reporter", "severity": "high", "isDirect": true, "via": ["@wdio/cli"], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": ["node_modules/@wdio/junit-reporter"], "fixAvailable": {"name": "@wdio/junit-reporter", "version": "9.11.0", "isSemVerMajor": true}}, "@wdio/local-runner": {"name": "@wdio/local-runner", "severity": "high", "isDirect": true, "via": ["@wdio/cli", "@wdio/runner"], "effects": [], "range": "6.0.4 - 8.43.0", "nodes": ["node_modules/@wdio/local-runner"], "fixAvailable": {"name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true}}, "@wdio/runner": {"name": "@wdio/runner", "severity": "high", "isDirect": false, "via": ["webdriverio"], "effects": ["@wdio/local-runner"], "range": "7.16.5 - 8.43.0", "nodes": ["node_modules/@wdio/runner"], "fixAvailable": {"name": "@wdio/local-runner", "version": "9.12.1", "isSemVerMajor": true}}, "@wdio/spec-reporter": {"name": "@wdio/spec-reporter", "severity": "high", "isDirect": true, "via": ["@wdio/cli"], "effects": [], "range": "6.0.4 - 8.0.0-alpha.631", "nodes": ["node_modules/@wdio/spec-reporter"], "fixAvailable": {"name": "@wdio/spec-reporter", "version": "9.11.0", "isSemVerMajor": true}}, "bin-build": {"name": "bin-build", "severity": "high", "isDirect": false, "via": ["download", "execa"], "effects": ["gifsicle", "guetzli", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin"], "range": ">=2.1.2", "nodes": ["node_modules/bin-build"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "bin-check": {"name": "bin-check", "severity": "high", "isDirect": false, "via": ["execa"], "effects": ["bin-wrapper"], "range": ">=4.1.0", "nodes": ["node_modules/bin-check"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "bin-version": {"name": "bin-version", "severity": "high", "isDirect": false, "via": ["find-versions"], "effects": ["bin-version-check"], "range": "<=4.0.0", "nodes": ["node_modules/bin-version"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "bin-version-check": {"name": "bin-version-check", "severity": "high", "isDirect": false, "via": ["bin-version"], "effects": ["bin-wrapper"], "range": "<=4.0.0", "nodes": ["node_modules/bin-version-check"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "bin-wrapper": {"name": "bin-wrapper", "severity": "high", "isDirect": false, "via": ["bin-check", "bin-version-check", "download"], "effects": ["gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "zopflipng-bin"], "range": ">=0.4.0", "nodes": ["node_modules/bin-wrapper"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "cacheable-request": {"name": "cacheable-request", "severity": "high", "isDirect": false, "via": ["http-cache-semantics"], "effects": ["got"], "range": "0.1.0 - 2.1.4", "nodes": ["node_modules/bin-wrapper/node_modules/cacheable-request"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "cross-spawn": {"name": "cross-spawn", "severity": "high", "isDirect": false, "via": [{"source": 1100562, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": ["CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<6.0.6"}], "effects": ["execa", "yarn-install"], "range": "<6.0.6", "nodes": ["node_modules/execa/node_modules/cross-spawn", "node_modules/yarn-install/node_modules/cross-spawn"], "fixAvailable": {"name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true}}, "css-select": {"name": "css-select", "severity": "high", "isDirect": false, "via": ["nth-check"], "effects": ["svgo"], "range": "<=3.1.0", "nodes": ["node_modules/css-select"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "devtools": {"name": "devtools", "severity": "high", "isDirect": false, "via": ["puppeteer-core"], "effects": [], "range": ">=7.16.5", "nodes": ["node_modules/devtools"], "fixAvailable": true}, "download": {"name": "download", "severity": "moderate", "isDirect": false, "via": ["got"], "effects": ["bin-build", "bin-wrapper"], "range": ">=4.0.0", "nodes": ["node_modules/bin-wrapper/node_modules/download", "node_modules/download"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "exec-buffer": {"name": "exec-buffer", "severity": "high", "isDirect": false, "via": ["execa"], "effects": ["grunt-image"], "range": ">=3.1.0", "nodes": ["node_modules/exec-buffer"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "execa": {"name": "execa", "severity": "high", "isDirect": false, "via": ["cross-spawn"], "effects": ["bin-build", "bin-check", "exec-buffer"], "range": "0.5.0 - 0.9.0", "nodes": ["node_modules/execa"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "find-versions": {"name": "find-versions", "severity": "high", "isDirect": false, "via": ["semver-regex"], "effects": ["bin-version"], "range": "<=3.2.0", "nodes": ["node_modules/find-versions"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "gifsicle": {"name": "gifsicle", "severity": "high", "isDirect": false, "via": ["bin-build", "bin-wrapper"], "effects": ["grunt-image"], "range": ">=3.0.0", "nodes": ["node_modules/gifsicle"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "got": {"name": "got", "severity": "high", "isDirect": false, "via": [{"source": 1088948, "name": "got", "dependency": "got", "title": "Got allows a redirect to a UNIX socket", "url": "https://github.com/advisories/GHSA-pfrx-2q88-qq97", "severity": "moderate", "cwe": [], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"}, "range": "<11.8.5"}, "cacheable-request"], "effects": ["download"], "range": "<=11.8.3", "nodes": ["node_modules/bin-wrapper/node_modules/got", "node_modules/download/node_modules/got"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "grunt-image": {"name": "grunt-image", "severity": "high", "isDirect": true, "via": ["exec-buffer", "gifsicle", "guetzli", "jpeg-recompress-bin", "mozjpeg", "optipng-bin", "pngquant-bin", "svgo", "zopflipng-bin"], "effects": [], "range": "0.1.0 || >=1.0.0", "nodes": ["node_modules/grunt-image"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "guetzli": {"name": "guetzli", "severity": "high", "isDirect": false, "via": ["bin-build", "bin-wrapper"], "effects": ["grunt-image"], "range": "*", "nodes": ["node_modules/guetzli"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "http-cache-semantics": {"name": "http-cache-semantics", "severity": "high", "isDirect": false, "via": [{"source": 1102456, "name": "http-cache-semantics", "dependency": "http-cache-semantics", "title": "http-cache-semantics vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-rc47-6667-2j5j", "severity": "high", "cwe": ["CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<4.1.1"}], "effects": ["cacheable-request"], "range": "<4.1.1", "nodes": ["node_modules/bin-wrapper/node_modules/http-cache-semantics"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "jimp": {"name": "jimp", "severity": "moderate", "isDirect": true, "via": ["@jimp/custom"], "effects": [], "range": "0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0", "nodes": ["node_modules/jimp"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "jpeg-recompress-bin": {"name": "jpeg-recompress-bin", "severity": "moderate", "isDirect": false, "via": ["bin-wrapper"], "effects": ["grunt-image"], "range": ">=3.0.1", "nodes": ["node_modules/jpeg-recompress-bin"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "meow": {"name": "meow", "severity": "high", "isDirect": false, "via": ["trim-newlines"], "effects": [], "range": "3.4.0 - 5.0.0", "nodes": ["node_modules/meow"], "fixAvailable": true}, "minimatch": {"name": "minimatch", "severity": "high", "isDirect": false, "via": [{"source": 1096485, "name": "minimatch", "dependency": "minimatch", "title": "minimatch ReDoS vulnerability", "url": "https://github.com/advisories/GHSA-f8q6-p94x-37v3", "severity": "high", "cwe": ["CWE-400", "CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<3.0.5"}], "effects": ["mocha"], "range": "<3.0.5", "nodes": ["node_modules/mocha/node_modules/minimatch"], "fixAvailable": {"name": "mocha", "version": "11.1.0", "isSemVerMajor": true}}, "minimist": {"name": "minimist", "severity": "critical", "isDirect": false, "via": [{"source": 1096466, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-vh95-rmgr-6w4m", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 5.6, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L"}, "range": "<0.2.1"}, {"source": 1097677, "name": "minimist", "dependency": "minimist", "title": "Prototype Pollution in minimist", "url": "https://github.com/advisories/GHSA-xvch-5gv4-984h", "severity": "critical", "cwe": ["CWE-1321"], "cvss": {"score": 9.8, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"}, "range": "<0.2.4"}], "effects": ["mkdirp"], "range": "<=0.2.3", "nodes": ["node_modules/mocha/node_modules/minimist"], "fixAvailable": {"name": "mocha", "version": "11.1.0", "isSemVerMajor": true}}, "mkdirp": {"name": "mkdirp", "severity": "critical", "isDirect": false, "via": ["minimist"], "effects": ["mocha"], "range": "0.4.1 - 0.5.1", "nodes": ["node_modules/mocha/node_modules/mkdirp"], "fixAvailable": {"name": "mocha", "version": "11.1.0", "isSemVerMajor": true}}, "mocha": {"name": "mocha", "severity": "critical", "isDirect": true, "via": ["minimatch", "mkdirp"], "effects": [], "range": "1.21.5 - 9.2.1", "nodes": ["node_modules/mocha"], "fixAvailable": {"name": "mocha", "version": "11.1.0", "isSemVerMajor": true}}, "mozjpeg": {"name": "mozjpeg", "severity": "high", "isDirect": false, "via": ["bin-build", "bin-wrapper"], "effects": [], "range": ">=4.0.0", "nodes": ["node_modules/mozjpeg"], "fixAvailable": true}, "mwbot": {"name": "mwbot", "severity": "moderate", "isDirect": false, "via": ["request"], "effects": ["wdio-mediawiki"], "range": ">=0.1.6", "nodes": ["node_modules/mwbot"], "fixAvailable": false}, "nth-check": {"name": "nth-check", "severity": "high", "isDirect": false, "via": [{"source": 1095141, "name": "nth-check", "dependency": "nth-check", "title": "Inefficient Regular Expression Complexity in nth-check", "url": "https://github.com/advisories/GHSA-rp65-9cf3-cjxr", "severity": "high", "cwe": ["CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<2.0.1"}], "effects": ["css-select"], "range": "<2.0.1", "nodes": ["node_modules/css-select/node_modules/nth-check"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "optipng-bin": {"name": "optipng-bin", "severity": "high", "isDirect": false, "via": ["bin-build", "bin-wrapper"], "effects": [], "range": ">=3.0.0", "nodes": ["node_modules/optipng-bin"], "fixAvailable": true}, "phin": {"name": "phin", "severity": "moderate", "isDirect": false, "via": [{"source": 1096967, "name": "phin", "dependency": "phin", "title": "phin may include sensitive headers in subsequent requests after redirect", "url": "https://github.com/advisories/GHSA-x565-32qp-m3vf", "severity": "moderate", "cwe": ["CWE-200"], "cvss": {"score": 4.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:N"}, "range": "<3.7.1"}], "effects": ["@jimp/core"], "range": "<3.7.1", "nodes": ["node_modules/phin"], "fixAvailable": {"name": "jimp", "version": "1.6.0", "isSemVerMajor": true}}, "pngquant-bin": {"name": "pngquant-bin", "severity": "high", "isDirect": false, "via": ["bin-build", "bin-wrapper"], "effects": ["grunt-image"], "range": ">=3.0.0", "nodes": ["node_modules/pngquant-bin"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "puppeteer-core": {"name": "puppeteer-core", "severity": "high", "isDirect": false, "via": ["ws"], "effects": ["devtools", "webdriverio"], "range": "11.0.0 - 22.11.1", "nodes": ["node_modules/puppeteer-core"], "fixAvailable": {"name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true}}, "request": {"name": "request", "severity": "moderate", "isDirect": false, "via": [{"source": 1096727, "name": "request", "dependency": "request", "title": "Server-Side Request Forgery in Request", "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6", "severity": "moderate", "cwe": ["CWE-918"], "cvss": {"score": 6.1, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"}, "range": "<=2.88.2"}, "tough-cookie"], "effects": ["mwbot"], "range": "*", "nodes": ["node_modules/request"], "fixAvailable": false}, "selenium-webdriver": {"name": "selenium-webdriver", "severity": "moderate", "isDirect": true, "via": ["xml2js"], "effects": [], "range": "2.43.1 - 4.0.0-rc-2", "nodes": ["node_modules/selenium-webdriver"], "fixAvailable": {"name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true}}, "semver-regex": {"name": "semver-regex", "severity": "high", "isDirect": false, "via": [{"source": 1092475, "name": "semver-regex", "dependency": "semver-regex", "title": "semver-regex Regular Expression Denial of Service (ReDOS)", "url": "https://github.com/advisories/GHSA-44c6-4v22-4mhx", "severity": "high", "cwe": ["CWE-400", "CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<3.1.3"}, {"source": 1092605, "name": "semver-regex", "dependency": "semver-regex", "title": "Regular expression denial of service in semver-regex", "url": "https://github.com/advisories/GHSA-4x5v-gmq8-25ch", "severity": "low", "cwe": ["CWE-1333"], "cvss": {"score": 0, "vectorString": null}, "range": "<3.1.4"}], "effects": ["find-versions"], "range": "<=3.1.3", "nodes": ["node_modules/semver-regex"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "svgo": {"name": "svgo", "severity": "high", "isDirect": false, "via": ["css-select"], "effects": ["grunt-image"], "range": "1.0.0 - 1.3.2", "nodes": ["node_modules/svgo"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}, "tough-cookie": {"name": "tough-cookie", "severity": "moderate", "isDirect": false, "via": [{"source": 1097682, "name": "tough-cookie", "dependency": "tough-cookie", "title": "tough-cookie Prototype Pollution vulnerability", "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 6.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"}, "range": "<4.1.3"}], "effects": ["request"], "range": "<4.1.3", "nodes": ["node_modules/tough-cookie"], "fixAvailable": false}, "trim-newlines": {"name": "trim-newlines", "severity": "high", "isDirect": false, "via": [{"source": 1095100, "name": "trim-newlines", "dependency": "trim-newlines", "title": "Uncontrolled Resource Consumption in trim-newlines", "url": "https://github.com/advisories/GHSA-7p7h-4mm5-852v", "severity": "high", "cwe": ["CWE-400"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<3.0.1"}], "effects": ["meow"], "range": "<3.0.1", "nodes": ["node_modules/trim-newlines"], "fixAvailable": true}, "wdio-mediawiki": {"name": "wdio-mediawiki", "severity": "moderate", "isDirect": true, "via": ["mwbot"], "effects": [], "range": "*", "nodes": ["node_modules/wdio-mediawiki"], "fixAvailable": false}, "webdriverio": {"name": "webdriverio", "severity": "high", "isDirect": false, "via": ["devtools", "puppeteer-core"], "effects": ["@wdio/cli", "@wdio/runner"], "range": "7.16.5 - 8.43.0", "nodes": ["node_modules/webdriverio"], "fixAvailable": {"name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true}}, "ws": {"name": "ws", "severity": "high", "isDirect": false, "via": [{"source": 1098392, "name": "ws", "dependency": "ws", "title": "ws affected by a DoS when handling a request with many HTTP headers", "url": "https://github.com/advisories/GHSA-3h5v-q93c-6h6q", "severity": "high", "cwe": ["CWE-476"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": ">=8.0.0 <8.17.1"}], "effects": ["puppeteer-core"], "range": "8.0.0 - 8.17.0", "nodes": ["node_modules/ws"], "fixAvailable": {"name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true}}, "xml2js": {"name": "xml2js", "severity": "moderate", "isDirect": false, "via": [{"source": 1096693, "name": "xml2js", "dependency": "xml2js", "title": "xml2js is vulnerable to prototype pollution", "url": "https://github.com/advisories/GHSA-776f-qx25-q3cc", "severity": "moderate", "cwe": ["CWE-1321"], "cvss": {"score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N"}, "range": "<0.5.0"}], "effects": ["selenium-webdriver"], "range": "<0.5.0", "nodes": ["node_modules/xml2js"], "fixAvailable": {"name": "selenium-webdriver", "version": "4.30.0", "isSemVerMajor": true}}, "yarn-install": {"name": "yarn-install", "severity": "high", "isDirect": false, "via": ["cross-spawn"], "effects": ["@wdio/cli"], "range": "*", "nodes": ["node_modules/yarn-install"], "fixAvailable": {"name": "@wdio/cli", "version": "9.12.1", "isSemVerMajor": true}}, "zopflipng-bin": {"name": "zopflipng-bin", "severity": "high", "isDirect": false, "via": ["bin-build", "bin-wrapper"], "effects": ["grunt-image"], "range": ">=3.0.0", "nodes": ["node_modules/zopflipng-bin"], "fixAvailable": {"name": "grunt-image", "version": "2.4.0", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 13, "high": 36, "critical": 3, "total": 52}, "dependencies": {"prod": 1, "dev": 1214, "optional": 2, "peer": 1, "peerOptional": 0, "total": 1214}}}} $ /usr/bin/npm audit fix --only=dev --- stderr --- npm WARN invalid config only="dev" set in command line options npm WARN invalid config Must be one of: null, prod, production --- stdout --- added 1 package, changed 1 package, and audited 1214 packages in 6s 164 packages are looking for funding run `npm fund` for details # npm audit report cross-spawn <6.0.6 Severity: high Regular Expression Denial of Service (ReDoS) in cross-spawn - https://github.com/advisories/GHSA-3xgq-45jj-v275 fix available via `npm audit fix --force` Will install @wdio/cli@9.12.1, which is a breaking change node_modules/execa/node_modules/cross-spawn node_modules/yarn-install/node_modules/cross-spawn execa 0.5.0 - 0.9.0 Depends on vulnerable versions of cross-spawn node_modules/execa bin-build >=2.1.2 Depends on vulnerable versions of download Depends on vulnerable versions of execa node_modules/bin-build gifsicle >=3.0.0 Depends on vulnerable versions of bin-build Depends on vulnerable versions of bin-wrapper node_modules/gifsicle guetzli * Depends on vulnerable versions of bin-build Depends on vulnerable versions of bin-wrapper node_modules/guetzli grunt-image 0.1.0 || >=1.0.0 Depends on vulnerable versions of exec-buffer Depends on vulnerable versions of gifsicle Depends on vulnerable versions of guetzli Depends on vulnerable versions of jpeg-recompress-bin Depends on vulnerable versions of mozjpeg Depends on vulnerable versions of optipng-bin Depends on vulnerable versions of pngquant-bin Depends on vulnerable versions of svgo Depends on vulnerable versions of zopflipng-bin node_modules/grunt-image mozjpeg >=4.0.0 Depends on vulnerable versions of bin-build Depends on vulnerable versions of bin-wrapper node_modules/mozjpeg optipng-bin >=3.0.0 Depends on vulnerable versions of bin-build Depends on vulnerable versions of bin-wrapper node_modules/optipng-bin pngquant-bin >=3.0.0 Depends on vulnerable versions of bin-build Depends on vulnerable versions of bin-wrapper node_modules/pngquant-bin zopflipng-bin >=3.0.0 Depends on vulnerable versions of bin-build Depends on vulnerable versions of bin-wrapper node_modules/zopflipng-bin bin-check >=4.1.0 Depends on vulnerable versions of execa node_modules/bin-check bin-wrapper >=0.4.0 Depends on vulnerable versions of bin-check Depends on vulnerable versions of bin-version-check Depends on vulnerable versions of download node_modules/bin-wrapper jpeg-recompress-bin >=3.0.1 Depends on vulnerable versions of bin-wrapper node_modules/jpeg-recompress-bin exec-buffer >=3.1.0 Depends on vulnerable versions of execa node_modules/exec-buffer yarn-install * Depends on vulnerable versions of cross-spawn node_modules/yarn-install @wdio/cli 5.4.10 - 8.43.0 Depends on vulnerable versions of webdriverio Depends on vulnerable versions of yarn-install node_modules/@wdio/cli @wdio/junit-reporter 6.0.4 - 8.0.0-alpha.631 Depends on vulnerable versions of @wdio/cli node_modules/@wdio/junit-reporter @wdio/local-runner 6.0.4 - 8.43.0 Depends on vulnerable versions of @wdio/cli Depends on vulnerable versions of @wdio/runner node_modules/@wdio/local-runner @wdio/spec-reporter 6.0.4 - 8.0.0-alpha.631 Depends on vulnerable versions of @wdio/cli node_modules/@wdio/spec-reporter got <=11.8.3 Severity: high Got allows a redirect to a UNIX socket - https://github.com/advisories/GHSA-pfrx-2q88-qq97 Depends on vulnerable versions of cacheable-request fix available via `npm audit fix --force` Will install grunt-image@2.4.0, which is a breaking change node_modules/bin-wrapper/node_modules/got node_modules/download/node_modules/got download >=4.0.0 Depends on vulnerable versions of got node_modules/bin-wrapper/node_modules/download node_modules/download http-cache-semantics <4.1.1 Severity: high http-cache-semantics vulnerable to Regular Expression Denial of Service - https://github.com/advisories/GHSA-rc47-6667-2j5j fix available via `npm audit fix --force` Will install grunt-image@2.4.0, which is a breaking change node_modules/bin-wrapper/node_modules/http-cache-semantics cacheable-request 0.1.0 - 2.1.4 Depends on vulnerable versions of http-cache-semantics node_modules/bin-wrapper/node_modules/cacheable-request minimatch <3.0.5 Severity: high minimatch ReDoS vulnerability - https://github.com/advisories/GHSA-f8q6-p94x-37v3 fix available via `npm audit fix --force` Will install mocha@11.1.0, which is a breaking change node_modules/mocha/node_modules/minimatch mocha 1.21.5 - 9.2.1 Depends on vulnerable versions of minimatch Depends on vulnerable versions of mkdirp node_modules/mocha minimist <=0.2.3 Severity: critical Prototype Pollution in minimist - https://github.com/advisories/GHSA-vh95-rmgr-6w4m Prototype Pollution in minimist - https://github.com/advisories/GHSA-xvch-5gv4-984h fix available via `npm audit fix --force` Will install mocha@11.1.0, which is a breaking change node_modules/mocha/node_modules/minimist mkdirp 0.4.1 - 0.5.1 Depends on vulnerable versions of minimist node_modules/mocha/node_modules/mkdirp nth-check <2.0.1 Severity: high Inefficient Regular Expression Complexity in nth-check - https://github.com/advisories/GHSA-rp65-9cf3-cjxr fix available via `npm audit fix --force` Will install grunt-image@2.4.0, which is a breaking change node_modules/css-select/node_modules/nth-check css-select <=3.1.0 Depends on vulnerable versions of nth-check node_modules/css-select svgo 1.0.0 - 1.3.2 Depends on vulnerable versions of css-select node_modules/svgo phin <3.7.1 Severity: moderate phin may include sensitive headers in subsequent requests after redirect - https://github.com/advisories/GHSA-x565-32qp-m3vf fix available via `npm audit fix --force` Will install jimp@1.6.0, which is a breaking change node_modules/phin @jimp/core <=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0 Depends on vulnerable versions of phin node_modules/@jimp/core @jimp/custom <=0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0 Depends on vulnerable versions of @jimp/core node_modules/@jimp/custom jimp 0.3.6-alpha.5 - 0.21.4--canary.1163.d07ed6254d130e2995d24101e93427ec091016e6.0 Depends on vulnerable versions of @jimp/custom node_modules/jimp request * Severity: moderate Server-Side Request Forgery in Request - https://github.com/advisories/GHSA-p8p7-x288-28g6 Depends on vulnerable versions of tough-cookie No fix available node_modules/request mwbot >=0.1.6 Depends on vulnerable versions of request node_modules/mwbot wdio-mediawiki * Depends on vulnerable versions of mwbot node_modules/wdio-mediawiki semver-regex <=3.1.3 Severity: high semver-regex Regular Expression Denial of Service (ReDOS) - https://github.com/advisories/GHSA-44c6-4v22-4mhx Regular expression denial of service in semver-regex - https://github.com/advisories/GHSA-4x5v-gmq8-25ch fix available via `npm audit fix --force` Will install grunt-image@2.4.0, which is a breaking change node_modules/semver-regex find-versions <=3.2.0 Depends on vulnerable versions of semver-regex node_modules/find-versions bin-version <=4.0.0 Depends on vulnerable versions of find-versions node_modules/bin-version bin-version-check <=4.0.0 Depends on vulnerable versions of bin-version node_modules/bin-version-check tough-cookie <4.1.3 Severity: moderate tough-cookie Prototype Pollution vulnerability - https://github.com/advisories/GHSA-72xf-g2v4-qvf3 No fix available node_modules/tough-cookie trim-newlines <3.0.1 Severity: high Uncontrolled Resource Consumption in trim-newlines - https://github.com/advisories/GHSA-7p7h-4mm5-852v fix available via `npm audit fix` node_modules/trim-newlines meow 3.4.0 - 5.0.0 Depends on vulnerable versions of trim-newlines node_modules/meow ws 8.0.0 - 8.17.0 Severity: high ws affected by a DoS when handling a request with many HTTP headers - https://github.com/advisories/GHSA-3h5v-q93c-6h6q fix available via `npm audit fix --force` Will install @wdio/cli@9.12.1, which is a breaking change node_modules/ws puppeteer-core 11.0.0 - 22.11.1 Depends on vulnerable versions of ws node_modules/puppeteer-core devtools >=7.16.5 Depends on vulnerable versions of puppeteer-core node_modules/devtools webdriverio 7.16.5 - 8.43.0 Depends on vulnerable versions of devtools Depends on vulnerable versions of puppeteer-core node_modules/webdriverio @wdio/runner 7.16.5 - 8.43.0 Depends on vulnerable versions of webdriverio node_modules/@wdio/runner xml2js <0.5.0 Severity: moderate xml2js is vulnerable to prototype pollution - https://github.com/advisories/GHSA-776f-qx25-q3cc fix available via `npm audit fix --force` Will install selenium-webdriver@4.30.0, which is a breaking change node_modules/xml2js selenium-webdriver 2.43.1 - 4.0.0-rc-2 Depends on vulnerable versions of xml2js node_modules/selenium-webdriver 51 vulnerabilities (12 moderate, 36 high, 3 critical) To address issues that do not require attention, run: npm audit fix To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. --- end --- Verifying that tests still pass $ /usr/bin/npm ci --- stderr --- npm WARN deprecated har-validator@5.1.5: this library is no longer supported npm WARN deprecated glob@8.1.0: Glob versions prior to v9 are no longer supported npm WARN deprecated formidable@1.2.6: Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated superagent@6.1.0: Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at <https://github.com/visionmedia/superagent/releases>. npm WARN deprecated svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x. --- stdout --- added 1213 packages, and audited 1214 packages in 42s 164 packages are looking for funding run `npm fund` for details 51 vulnerabilities (12 moderate, 36 high, 3 critical) To address issues that do not require attention, run: npm audit fix To address all issues possible (including breaking changes), run: npm audit fix --force Some issues need review, and may require choosing a different dependency. Run `npm audit` for details. --- end --- $ /usr/bin/npm test --- stdout --- > visualeditor@0.0.0 test > grunt test && node build/checkModules.js Running "tyops:src" (tyops) task >> No typos found; 451 files checked for 21 typos. Running "eslint:all" (eslint) task /src/repo/build/screenshots.js 97:6 warning Found writeFile from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename /src/repo/editcheck/modules/editchecks/AddReferenceEditCheck.js 84:12 warning Prefer .then to .done no-jquery/no-done-fail 94:11 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw-collab/ve.init.mw.CollabTarget.init.js 65:3 warning Prefer .then to .done no-jquery/no-done-fail 65:3 warning Prefer .then to .fail no-jquery/no-done-fail 189:6 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js 79:15 warning Prefer .then to .done no-jquery/no-done-fail 79:15 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWImageNode.js 119:14 warning Prefer .then to .done no-jquery/no-done-fail 119:14 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ce/nodes/ve.ce.MWTransclusionNode.js 176:14 warning Prefer .then to .done no-jquery/no-done-fail 176:14 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/models/ve.dm.MWImageModel.js 341:4 warning Prefer .then to .done no-jquery/no-done-fail 1199:3 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js 329:15 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js 368:3 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/dm/ve.dm.MWWikitextSurfaceFragment.js 139:3 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/init/apiresponsecache/ve.init.mw.LinkCache.js 81:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/init/targets/ve.init.mw.ArticleTarget.js 1155:2 warning Prefer .then to .done no-jquery/no-done-fail 1155:2 warning Prefer .then to .fail no-jquery/no-done-fail 1587:32 warning Prefer .then to .done no-jquery/no-done-fail 1587:32 warning Prefer .then to .fail no-jquery/no-done-fail 1645:3 warning Prefer .then to .done no-jquery/no-done-fail 1645:3 warning Prefer .then to .fail no-jquery/no-done-fail 1721:37 warning Prefer .then to .done no-jquery/no-done-fail 1721:37 warning Prefer .then to .fail no-jquery/no-done-fail 2005:2 warning Prefer .then to .done no-jquery/no-done-fail 2005:2 warning Prefer .then to .fail no-jquery/no-done-fail 2010:3 warning Prefer .then to .done no-jquery/no-done-fail 2482:18 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js 245:3 warning Prefer .then to .done no-jquery/no-done-fail 398:3 warning Prefer .then to .done no-jquery/no-done-fail 398:3 warning Prefer .then to .fail no-jquery/no-done-fail 679:2 warning Prefer .then to .done no-jquery/no-done-fail 799:2 warning Prefer .then to .done no-jquery/no-done-fail 872:9 warning Prefer .then to .fail no-jquery/no-done-fail 1475:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/preinit/ve.init.MWEditingTabDialog.js 82:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js 674:6 warning Prefer .then to .done no-jquery/no-done-fail 1090:5 warning Prefer .then to .done no-jquery/no-done-fail 1520:6 warning Prefer .then to .done no-jquery/no-done-fail 1613:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/tests/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.test.js 51:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/tests/ui/dialogs/ve.ui.MWTransclusionDialog.test.js 42:3 warning Prefer .then to .done no-jquery/no-done-fail 42:3 warning Prefer .then to .fail no-jquery/no-done-fail 82:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWGalleryDialog.js 436:26 warning Prefer .then to .done no-jquery/no-done-fail 623:9 warning Prefer .then to .done no-jquery/no-done-fail 705:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWMediaDialog.js 720:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js 358:27 warning Prefer .then to .done no-jquery/no-done-fail 358:27 warning Prefer .then to .fail no-jquery/no-done-fail 493:2 warning Prefer .then to .done no-jquery/no-done-fail 509:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTemplateDialog.js 363:4 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/dialogs/ve.ui.MWTransclusionDialog.js 103:3 warning Prefer .then to .done no-jquery/no-done-fail 429:3 warning Prefer .then to .done no-jquery/no-done-fail 528:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/inspectors/ve.ui.MWLinkAnnotationInspector.js 214:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/pages/ve.ui.MWLanguagesPage.js 36:2 warning Prefer .then to .done no-jquery/no-done-fail 163:2 warning Prefer .then to .done no-jquery/no-done-fail 163:2 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js 196:2 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/ve.ui.MWWikitextDataTransferHandlerFactory.js 76:4 warning Prefer .then to .done no-jquery/no-done-fail 76:4 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/ve.ui.MWWikitextTransferRegistry.js 27:1 warning Prefer .then to .done no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/widgets/ve.ui.MWAceEditorWidget.js 82:3 warning Prefer .then to .done no-jquery/no-done-fail 90:2 warning Prefer .then to .done no-jquery/no-done-fail 153:2 warning Prefer .then to .done no-jquery/no-done-fail 201:2 warning Prefer .then to .done no-jquery/no-done-fail 219:2 warning Prefer .then to .done no-jquery/no-done-fail 265:2 warning Prefer .then to .done no-jquery/no-done-fail 265:2 warning Prefer .then to .fail no-jquery/no-done-fail 323:2 warning Prefer .then to .done no-jquery/no-done-fail 339:2 warning Prefer .then to .done no-jquery/no-done-fail 353:2 warning Prefer .then to .done no-jquery/no-done-fail 367:2 warning Prefer .then to .done no-jquery/no-done-fail 385:2 warning Prefer .then to .done no-jquery/no-done-fail 385:2 warning Prefer .then to .fail no-jquery/no-done-fail 401:3 warning Prefer .then to .done no-jquery/no-done-fail 406:2 warning Prefer .then to .fail no-jquery/no-done-fail /src/repo/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js 117:3 warning Prefer .then to .done no-jquery/no-done-fail ✖ 82 problems (0 errors, 82 warnings) Running "stylelint:all" (stylelint) task >> Linted 84 files without errors Running "banana:VisualEditor" (banana) task >> 7 message directories checked. Done. No missing files. --- end --- {"1103025": {"source": 1103025, "name": "@babel/runtime", "dependency": "@babel/runtime", "title": "Babel has inefficient RexExp complexity in generated code with .replace when transpiling named capturing groups", "url": "https://github.com/advisories/GHSA-968p-4wvh-cqc8", "severity": "moderate", "cwe": ["CWE-1333"], "cvss": {"score": 6.2, "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<7.26.10"}} Upgrading n:@babel/runtime from 7.17.9 -> 7.26.10 {} {"1095100": {"source": 1095100, "name": "trim-newlines", "dependency": "trim-newlines", "title": "Uncontrolled Resource Consumption in trim-newlines", "url": "https://github.com/advisories/GHSA-7p7h-4mm5-852v", "severity": "high", "cwe": ["CWE-400"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<3.0.1"}} {} {} {"1095100": {"source": 1095100, "name": "trim-newlines", "dependency": "trim-newlines", "title": "Uncontrolled Resource Consumption in trim-newlines", "url": "https://github.com/advisories/GHSA-7p7h-4mm5-852v", "severity": "high", "cwe": ["CWE-400"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": "<3.0.1"}} $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- build: Updating npm dependencies * eslint-config-wikimedia: 0.28.2 → 0.29.1 The following rules are failing and were disabled: * editcheck/modules: * no-jquery/no-done-fail* modules: * no-jquery/no-done-fail* modules/ve-mw/dm: * no-jquery/no-done-fail* modules/ve-mw/preinit: * no-jquery/no-done-fail* modules/ve-mw/tests: * no-jquery/no-done-fail * @babel/runtime: 7.17.9 → 7.26.10 * https://github.com/advisories/GHSA-968p-4wvh-cqc8 $ git add . --- stdout --- --- end --- $ git commit -F /tmp/tmpc1buj3ih --- stdout --- [master 87d23c4] build: Updating npm dependencies 42 files changed, 107 insertions(+), 81 deletions(-) --- end --- $ git format-patch HEAD~1 --stdout --- stdout --- From 87d23c48143b961f348344253b8341290e2db7bc Mon Sep 17 00:00:00 2001 From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org> Date: Sun, 23 Mar 2025 13:27:59 +0000 Subject: [PATCH] build: Updating npm dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * eslint-config-wikimedia: 0.28.2 → 0.29.1 The following rules are failing and were disabled: * editcheck/modules: * no-jquery/no-done-fail* modules: * no-jquery/no-done-fail* modules/ve-mw/dm: * no-jquery/no-done-fail* modules/ve-mw/preinit: * no-jquery/no-done-fail* modules/ve-mw/tests: * no-jquery/no-done-fail * @babel/runtime: 7.17.9 → 7.26.10 * https://github.com/advisories/GHSA-968p-4wvh-cqc8 Change-Id: I3b39b7e1012b65f3a7887e45bc888c4630b617d2 --- editcheck/modules/.eslintrc.json | 7 ++- editcheck/modules/BaseEditCheck.js | 2 +- .../modules/EditCheckGutterSidebarDialog.js | 8 +-- editcheck/modules/controller.js | 4 +- modules/.eslintrc.json | 3 +- .../ve.ce.MWExternalLinkAnnotation.js | 2 +- modules/ve-mw/dm/.eslintrc.json | 3 +- .../ve.dm.MWExternalLinkAnnotation.js | 2 +- .../dm/metaitems/ve.dm.MWFlaggedMetaItem.js | 4 +- .../dm/models/ve.dm.MWTransclusionModel.js | 2 +- .../dm/nodes/ve.dm.MWAlienAnnotationNode.js | 2 +- .../ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js | 2 +- modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js | 2 +- .../dm/nodes/ve.dm.MWGalleryCaptionNode.js | 2 +- .../dm/nodes/ve.dm.MWGalleryImageNode.js | 6 +- modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js | 2 +- .../ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js | 10 +-- .../nodes/ve.dm.MWNumberedExternalLinkNode.js | 2 +- modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js | 2 +- .../dm/nodes/ve.dm.MWTransclusionNode.js | 2 +- .../init/ve.init.mw.ArticleTargetEvents.js | 2 +- modules/ve-mw/init/ve.init.mw.Platform.js | 2 +- modules/ve-mw/preinit/.eslintrc.json | 3 +- .../ve.init.mw.DesktopArticleTarget.init.js | 4 +- modules/ve-mw/preinit/ve.utils.parsoid.js | 4 +- modules/ve-mw/tests/.eslintrc.json | 3 +- .../ve.ui.MWAlienAnnotationContextItem.js | 4 +- .../ve.ui.MWWikitextStringTransferHandler.js | 2 +- .../ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js | 2 +- .../ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js | 2 +- ...ve.ui.MWWikitextLinkAnnotationInspector.js | 2 +- ...ve.ui.MWTwoPaneTransclusionDialogLayout.js | 4 +- .../ui/pages/ve.ui.MWAddParameterPage.js | 2 +- .../ve-mw/ui/pages/ve.ui.MWParameterPage.js | 4 +- .../ve-mw/ui/pages/ve.ui.MWTemplatePage.js | 2 +- .../toolgroups/ve.ui.MWHelpListToolGroup.js | 2 +- .../ui/widgets/ve.ui.MWCategoryInputWidget.js | 4 +- .../ui/widgets/ve.ui.MWCategoryWidget.js | 2 +- .../ve.ui.MWInternalLinkAnnotationWidget.js | 2 +- ....ui.MWTransclusionOutlineTemplateWidget.js | 2 +- package-lock.json | 63 ++++++++++++------- package.json | 2 +- 42 files changed, 107 insertions(+), 81 deletions(-) diff --git a/editcheck/modules/.eslintrc.json b/editcheck/modules/.eslintrc.json index 3f51c58..a3e78ae 100644 --- a/editcheck/modules/.eslintrc.json +++ b/editcheck/modules/.eslintrc.json @@ -1,7 +1,12 @@ { "root": true, - "extends": [ "../../modules/.eslintrc" ], + "extends": [ + "../../modules/.eslintrc" + ], "parserOptions": { "sourceType": "commonjs" + }, + "rules": { + "no-jquery/no-done-fail": "warn" } } diff --git a/editcheck/modules/BaseEditCheck.js b/editcheck/modules/BaseEditCheck.js index e5eb6b9..b0dd504 100644 --- a/editcheck/modules/BaseEditCheck.js +++ b/editcheck/modules/BaseEditCheck.js @@ -318,5 +318,5 @@ mw.editcheck.BaseEditCheck.prototype.isDismissedRange = function ( range ) { */ mw.editcheck.BaseEditCheck.prototype.isDismissedId = function ( id ) { const ids = this.controller.dismissedIds[ this.constructor.static.name ]; - return ids && ids.indexOf( id ) !== -1; + return ids && ids.includes( id ); }; diff --git a/editcheck/modules/EditCheckGutterSidebarDialog.js b/editcheck/modules/EditCheckGutterSidebarDialog.js index 810ca13..512827e 100644 --- a/editcheck/modules/EditCheckGutterSidebarDialog.js +++ b/editcheck/modules/EditCheckGutterSidebarDialog.js @@ -101,7 +101,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions let widget; const index = oldWidgets.findIndex( ( owidget ) => owidget.actions.length === section.actions.length && - owidget.actions.every( ( oact ) => section.actions.indexOf( oact ) !== -1 ) + owidget.actions.every( ( oact ) => section.actions.includes( oact ) ) ); if ( index !== -1 ) { widget = oldWidgets.splice( index, 1 )[ 0 ]; @@ -140,7 +140,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions actions: section.actions, footer: section.actions.length !== 1, // just filter out any discarded actions from the allowed set - updateFilter: ( updatedActions, newActions, discardedActions, prevActions ) => prevActions.filter( ( pact ) => discardedActions.indexOf( pact ) === -1 ) + updateFilter: ( updatedActions, newActions, discardedActions, prevActions ) => prevActions.filter( ( pact ) => !discardedActions.includes( pact ) ) } ); } else if ( section.actions.every( ( sact ) => currentWindow.hasAction( sact ) ) ) { @@ -156,7 +156,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions }; this.$body.append( widget.$element ); } - if ( widget.actions.indexOf( this.controller.focused ) !== -1 ) { + if ( widget.actions.includes( this.controller.focused ) ) { widget.icon.setFlags( action.getType() ); } else { widget.icon.clearFlags(); @@ -164,7 +164,7 @@ ve.ui.GutterSidebarEditCheckDialog.prototype.renderActions = function ( actions widget.$element.css( { top: section.rect.top + 2, height: section.rect.height - } ).toggleClass( 've-ui-editCheck-gutter-action-inactive', section.actions.indexOf( this.controller.focused ) === -1 ); + } ).toggleClass( 've-ui-editCheck-gutter-action-inactive', !section.actions.includes( this.controller.focused ) ); this.widgets.push( widget ); } ); diff --git a/editcheck/modules/controller.js b/editcheck/modules/controller.js index 26c0b1d..c953394 100644 --- a/editcheck/modules/controller.js +++ b/editcheck/modules/controller.js @@ -158,7 +158,7 @@ Controller.prototype.onSelect = function ( selection ) { ( check ) => check.getHighlightSelections().some( ( highlight ) => highlight.getCoveringRange().containsRange( selection.getCoveringRange() ) ) ); - if ( actions.length > 0 && actions.indexOf( this.focused ) === -1 ) { + if ( actions.length > 0 && !actions.includes( this.focused ) ) { // If the currently focused action is within the selection, don't jump around this.focusAction( actions[ 0 ] || null, false ); } @@ -202,7 +202,7 @@ Controller.prototype.onDocumentChange = function () { Controller.prototype.onActionsUpdated = function ( listener, actions, newActions, discardedActions ) { // do we need to redraw anything? if ( newActions.length || discardedActions.length ) { - if ( this.focused && discardedActions.indexOf( this.focused ) !== -1 ) { + if ( this.focused && discardedActions.includes( this.focused ) ) { this.focused = undefined; } this.updatePositions(); diff --git a/modules/.eslintrc.json b/modules/.eslintrc.json index c525608..2931d67 100644 --- a/modules/.eslintrc.json +++ b/modules/.eslintrc.json @@ -7,6 +7,7 @@ "./eslint-shared.json" ], "rules": { - "no-jquery/no-append-html": "warn" + "no-jquery/no-append-html": "warn", + "no-jquery/no-done-fail": "warn" } } diff --git a/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js b/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js index 6225d97..33c716c 100644 --- a/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js +++ b/modules/ve-mw/ce/annotations/ve.ce.MWExternalLinkAnnotation.js @@ -22,7 +22,7 @@ ve.ce.MWExternalLinkAnnotation = function VeCeMWExternalLinkAnnotation( model ) // DOM changes const rel = model.getAttribute( 'rel' ) || ''; const relValues = rel.split( /\s+/ ); - if ( relValues.indexOf( 'mw:WikiLink/Interwiki' ) >= 0 ) { + if ( relValues.includes( 'mw:WikiLink/Interwiki' ) ) { this.$anchor.addClass( 'extiw' ); } else { this.$anchor.addClass( 'external' ); diff --git a/modules/ve-mw/dm/.eslintrc.json b/modules/ve-mw/dm/.eslintrc.json index e115b9f..8820a89 100644 --- a/modules/ve-mw/dm/.eslintrc.json +++ b/modules/ve-mw/dm/.eslintrc.json @@ -10,6 +10,7 @@ "$": "off" }, "rules": { - "no-jquery/no-append-html": "warn" + "no-jquery/no-append-html": "warn", + "no-jquery/no-done-fail": "warn" } } diff --git a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js index 34d6dc9..94b6515 100644 --- a/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js +++ b/modules/ve-mw/dm/annotations/ve.dm.MWExternalLinkAnnotation.js @@ -45,7 +45,7 @@ ve.dm.MWExternalLinkAnnotation.static.toDataElement = function ( domElements, co types = type.trim().split( /\s+/ ); // If the link doesn't have a known RDFa type... - if ( types.indexOf( 'mw:ExtLink' ) === -1 && types.indexOf( 'mw:WikiLink/Interwiki' ) === -1 ) { + if ( !types.includes( 'mw:ExtLink' ) && !types.includes( 'mw:WikiLink/Interwiki' ) ) { // ...when pasting: auto-convert it to the correct type (internal/external/span) if ( converter.isFromClipboard() ) { if ( domElement.hasAttribute( 'href' ) ) { diff --git a/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js b/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js index 454962a..ca8be46 100644 --- a/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js +++ b/modules/ve-mw/dm/metaitems/ve.dm.MWFlaggedMetaItem.js @@ -32,7 +32,7 @@ ve.dm.MWFlaggedMetaItem.static.matchTagNames = [ 'meta' ]; ve.dm.MWFlaggedMetaItem.static.toDataElement = function ( domElements ) { let property = domElements[ 0 ].getAttribute( 'property' ); - if ( !property || this.matchRdfaTypes.indexOf( property ) === -1 ) { + if ( !property || !this.matchRdfaTypes.includes( property ) ) { // Fallback to first match if somehow unset property = this.matchRdfaTypes[ 0 ]; } @@ -44,7 +44,7 @@ ve.dm.MWFlaggedMetaItem.static.toDomElements = function ( dataElement, doc, conv let domElement; let property = OO.getProp( dataElement, 'attributes', 'property' ); - if ( !property || this.matchRdfaTypes.indexOf( property ) === -1 ) { + if ( !property || !this.matchRdfaTypes.includes( property ) ) { // Fallback to first item if somehow unset property = this.matchRdfaTypes[ 0 ]; } diff --git a/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js b/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js index f4a0565..f1d0d0a 100644 --- a/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js +++ b/modules/ve-mw/dm/models/ve.dm.MWTransclusionModel.js @@ -303,7 +303,7 @@ // Skip already cached data !hasOwn.call( specCache, title ) && // Skip duplicate titles in the same batch - titles.indexOf( title ) === -1 + !titles.includes( title ) ) { titles.push( title ); } diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js index 0fd9c14..4ff9507 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWAlienAnnotationNode.js @@ -45,7 +45,7 @@ ve.dm.MWAlienAnnotationNode.static.toDataElement = function ( domElements ) { ve.dm.MWAlienAnnotationNode.prototype.getWikitextTag = function () { const type = this.getAttribute( 'type' ); - if ( type.indexOf( '/End', type.length - 4 ) !== -1 ) { + if ( type.includes( '/End', type.length - 4 ) ) { return '</UNKNOWN>'; } return '<UNKNOWN>'; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js index cedef84..4dde33a 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWBlockImageNode.js @@ -43,7 +43,7 @@ ve.dm.MWBlockImageNode.static.name = 'mwBlockImage'; ve.dm.MWBlockImageNode.static.preserveHtmlAttributes = function ( attribute ) { const attributes = [ 'typeof', 'class', 'src', 'resource', 'width', 'height', 'href', 'rel', 'data-mw', 'alt' ]; - return attributes.indexOf( attribute ) === -1; + return !attributes.includes( attribute ); }; ve.dm.MWBlockImageNode.static.handlesOwnChildren = true; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js index cb28673..4a10078 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWEntityNode.js @@ -40,7 +40,7 @@ ve.dm.MWEntityNode.static.toDataElement = function ( domElements ) { character: domElements[ 0 ].textContent } }; - if ( domElements[ 0 ].getAttribute( 'typeof' ).indexOf( 'mw:DisplaySpace' ) !== -1 ) { + if ( domElements[ 0 ].getAttribute( 'typeof' ).includes( 'mw:DisplaySpace' ) ) { dataElement.attributes.displaySpace = true; } return dataElement; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js index 28d06fc..3820564 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryCaptionNode.js @@ -29,7 +29,7 @@ ve.dm.MWGalleryCaptionNode.static.matchTagNames = [ 'li' ]; ve.dm.MWGalleryCaptionNode.static.matchFunction = function ( element ) { const parentTypeof = ( element.parentNode && element.parentNode.getAttribute( 'typeof' ) ) || ''; return element.getAttribute( 'class' ) === 'gallerycaption' && - parentTypeof.trim().split( /\s+/ ).indexOf( 'mw:Extension/gallery' ) !== -1; + parentTypeof.trim().split( /\s+/ ).includes( 'mw:Extension/gallery' ); }; ve.dm.MWGalleryCaptionNode.static.parentNodeTypes = [ 'mwGallery' ]; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js index 9615412..45245b5 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWGalleryImageNode.js @@ -35,14 +35,14 @@ ve.dm.MWGalleryImageNode.static.childNodeTypes = [ 'mwGalleryImageCaption' ]; ve.dm.MWGalleryImageNode.static.matchFunction = function ( element ) { const parentTypeof = ( element.parentNode && element.parentNode.getAttribute( 'typeof' ) ) || ''; return element.getAttribute( 'class' ) === 'gallerybox' && - parentTypeof.trim().split( /\s+/ ).indexOf( 'mw:Extension/gallery' ) !== -1; + parentTypeof.trim().split( /\s+/ ).includes( 'mw:Extension/gallery' ); }; ve.dm.MWGalleryImageNode.static.parentNodeTypes = [ 'mwGallery' ]; ve.dm.MWGalleryImageNode.static.preserveHtmlAttributes = function ( attribute ) { const attributes = [ 'typeof', 'class', 'src', 'resource', 'width', 'height', 'href', 'rel', 'alt', 'data-mw' ]; - return attributes.indexOf( attribute ) === -1; + return !attributes.includes( attribute ); }; // By handling our own children we ensure that original DOM attributes // are deep copied back by the converter (in renderHtmlAttributeList) @@ -59,7 +59,7 @@ ve.dm.MWGalleryImageNode.static.textContentFromCaption = function textContentFro content += c.nodeValue; } else if ( c instanceof HTMLElement && - ( metaDataTags.indexOf( c.nodeName.toLowerCase() ) === -1 ) && + ( !metaDataTags.includes( c.nodeName.toLowerCase() ) ) && !/\bmw:Extension\/ref\b/.test( c.getAttribute( 'typeOf' ) ) ) { content += textContentFromCaption( c ); diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js index 974865c..cf0fdb0 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWImageNode.js @@ -154,7 +154,7 @@ ve.dm.MWImageNode.static.describeChanges = function ( attributeChanges, attribut ); } for ( const key in attributeChanges ) { - if ( customKeys.indexOf( key ) === -1 ) { + if ( !customKeys.includes( key ) ) { if ( key === 'borderImage' && !attributeChanges.borderImage.from && !attributeChanges.borderImage.to ) { // Skip noise from the data model continue; diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js index 6923ae2..49f40ce 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWInlineImageNode.js @@ -40,7 +40,7 @@ ve.dm.MWInlineImageNode.static.name = 'mwInlineImage'; ve.dm.MWInlineImageNode.static.preserveHtmlAttributes = function ( attribute ) { const attributes = [ 'typeof', 'class', 'src', 'resource', 'width', 'height', 'href', 'data-mw' ]; - return attributes.indexOf( attribute ) === -1; + return !attributes.includes( attribute ); }; ve.dm.MWInlineImageNode.static.matchTagNames = [ 'span' ]; @@ -108,7 +108,7 @@ ve.dm.MWInlineImageNode.static.toDataElement = function ( domElements, converter classes = typeof classes === 'string' ? classes.trim().split( /\s+/ ) : []; // Deal with border flag - if ( classes.indexOf( 'mw-image-border' ) !== -1 ) { + if ( classes.includes( 'mw-image-border' ) ) { attributes.borderImage = true; recognizedClasses.push( 'mw-image-border' ); } @@ -117,7 +117,7 @@ ve.dm.MWInlineImageNode.static.toDataElement = function ( domElements, converter attributes.valign = 'default'; [ 'midde', 'baseline', 'sub', 'super', 'top', 'text-top', 'bottom', 'text-bottom' ].some( ( valign ) => { const className = 'mw-valign-' + valign; - if ( classes.indexOf( className ) !== -1 ) { + if ( classes.includes( className ) ) { attributes.valign = valign; recognizedClasses.push( className ); return true; @@ -126,13 +126,13 @@ ve.dm.MWInlineImageNode.static.toDataElement = function ( domElements, converter } ); // Border - if ( classes.indexOf( 'mw-image-border' ) !== -1 ) { + if ( classes.includes( 'mw-image-border' ) ) { attributes.borderImage = true; recognizedClasses.push( 'mw-image-border' ); } // Default-size - if ( classes.indexOf( 'mw-default-size' ) !== -1 ) { + if ( classes.includes( 'mw-default-size' ) ) { attributes.defaultSize = true; recognizedClasses.push( 'mw-default-size' ); } diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js index 06c83e1..d5aa0d5 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWNumberedExternalLinkNode.js @@ -51,7 +51,7 @@ ve.dm.MWNumberedExternalLinkNode.static.matchFunction = function ( domElement ) // contexts.) // Note that ve:NumberedLink is only used internally by VE for cross-document // pastes and is never sent to Parsoid. - return domElement.childNodes.length === 0 || domElement.getAttribute( 'rel' ).indexOf( 've:NumberedLink' ) !== -1; + return domElement.childNodes.length === 0 || domElement.getAttribute( 'rel' ).includes( 've:NumberedLink' ); }; ve.dm.MWNumberedExternalLinkNode.static.toDataElement = function ( domElements ) { diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js index d5c0d38..2e6cff5 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWTableNode.js @@ -64,7 +64,7 @@ ve.dm.MWTableNode.static.toDataElement = function ( domElements ) { classAttr = domElement.getAttribute( 'class' ); const attributes = { - hasExpandedAttrs: ( domElement.getAttribute( 'typeof' ) || '' ).indexOf( 'mw:ExpandedAttrs' ) !== -1 + hasExpandedAttrs: ( domElement.getAttribute( 'typeof' ) || '' ).includes( 'mw:ExpandedAttrs' ) }; this.setClassAttributes( attributes, classAttr ); diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js index 8c282f3..5a0b174 100644 --- a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js +++ b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js @@ -63,7 +63,7 @@ ve.dm.MWTransclusionNode.static.enableAboutGrouping = true; // We handle rendering ourselves, no need to render attributes from originalDomElements (T207325), // except for data-parsoid/RESTBase ID (T207325) ve.dm.MWTransclusionNode.static.preserveHtmlAttributes = function ( attribute ) { - return [ 'data-parsoid', 'id' ].indexOf( attribute ) !== -1; + return [ 'data-parsoid', 'id' ].includes( attribute ); }; ve.dm.MWTransclusionNode.static.getHashObject = function ( dataElement ) { diff --git a/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js b/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js index 44b70ab..fea9c12 100644 --- a/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js +++ b/modules/ve-mw/init/ve.init.mw.ArticleTargetEvents.js @@ -150,7 +150,7 @@ ve.init.mw.ArticleTargetEvents.prototype.trackSaveError = function ( code ) { specialTypes = [ 'editconflict' ]; let key = 'performance.user.saveError'; - if ( specialTypes.indexOf( code ) !== -1 ) { + if ( specialTypes.includes( code ) ) { key += '.' + code; } this.trackTiming( key, { diff --git a/modules/ve-mw/init/ve.init.mw.Platform.js b/modules/ve-mw/init/ve.init.mw.Platform.js index 56b88fb..d28ca95 100644 --- a/modules/ve-mw/init/ve.init.mw.Platform.js +++ b/modules/ve-mw/init/ve.init.mw.Platform.js @@ -319,7 +319,7 @@ ve.init.mw.Platform.prototype.fetchSpecialCharList = function () { characters[ groupName ] = { label: mw.msg( 'special-characters-group-' + groupName ), symbols: this.processSpecialCharSymbols( groupObject ), - attributes: { dir: rtlGroups.indexOf( groupName ) !== -1 ? 'rtl' : 'ltr' } + attributes: { dir: rtlGroups.includes( groupName ) ? 'rtl' : 'ltr' } }; } ); diff --git a/modules/ve-mw/preinit/.eslintrc.json b/modules/ve-mw/preinit/.eslintrc.json index 9835fab..99f9238 100644 --- a/modules/ve-mw/preinit/.eslintrc.json +++ b/modules/ve-mw/preinit/.eslintrc.json @@ -5,6 +5,7 @@ "rules": { "no-jquery/no-extend": "off", "no-jquery/no-deferred": "off", - "no-jquery/no-when": "off" + "no-jquery/no-when": "off", + "no-jquery/no-done-fail": "warn" } } diff --git a/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js b/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js index 52ac88e..61615ac 100644 --- a/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js +++ b/modules/ve-mw/preinit/ve.init.mw.DesktopArticleTarget.init.js @@ -1342,7 +1342,7 @@ // If forced by the URL parameter, skip the namespace check (T221892) and preference check ( url.searchParams.get( 'veaction' ) === 'edit' || ( // Only in enabled namespaces - conf.namespaces.indexOf( new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getNamespaceId() ) !== -1 && + conf.namespaces.includes( new mw.Title( mw.config.get( 'wgRelevantPageName' ) ).getNamespaceId() ) && // Enabled per user preferences enabledForUser @@ -1428,7 +1428,7 @@ const mode = veactionToMode[ editUrl.searchParams.get( 'veaction' ) ] || // Always load VE visual mode if collabSession is set ( editUrl.searchParams.has( 'collabSession' ) ? 'visual' : null ); - if ( mode && availableModes.indexOf( mode ) !== -1 ) { + if ( mode && availableModes.includes( mode ) ) { return mode; } } diff --git a/modules/ve-mw/preinit/ve.utils.parsoid.js b/modules/ve-mw/preinit/ve.utils.parsoid.js index 9a18d5f..89a1564 100644 --- a/modules/ve-mw/preinit/ve.utils.parsoid.js +++ b/modules/ve-mw/preinit/ve.utils.parsoid.js @@ -147,7 +147,7 @@ mw.libs.ve.deduplicateStyles = function ( element ) { */ function isFosterablePosition( node ) { const fosterablePositions = [ 'table', 'thead', 'tbody', 'tfoot', 'tr' ]; - return node && fosterablePositions.indexOf( node.parentNode.nodeName.toLowerCase() ) !== -1; + return node && fosterablePositions.includes( node.parentNode.nodeName.toLowerCase() ); } const styleTagKeys = {}; @@ -318,7 +318,7 @@ mw.libs.ve.getTargetDataFromHref = function ( href, doc ) { const articleBaseRegex = new RegExp( regexEscape( articleBase ).replace( regexEscape( '$1' ), '(.*)' ) ); const matches = relativeHref.match( articleBaseRegex ); if ( matches ) { - if ( queryLength === 0 && matches && matches[ 1 ].split( '#' )[ 0 ].indexOf( '?' ) === -1 ) { + if ( queryLength === 0 && matches && !matches[ 1 ].split( '#' )[ 0 ].includes( '?' ) ) { // Take the relative path return returnInternalData( matches[ 1 ] ); } diff --git a/modules/ve-mw/tests/.eslintrc.json b/modules/ve-mw/tests/.eslintrc.json index 0f04043..fde9621 100644 --- a/modules/ve-mw/tests/.eslintrc.json +++ b/modules/ve-mw/tests/.eslintrc.json @@ -18,7 +18,8 @@ ], "indent": "off", "no-jquery/no-html": "off", - "no-jquery/no-parse-html-literal": "off" + "no-jquery/no-parse-html-literal": "off", + "no-jquery/no-done-fail": "warn" }, "parserOptions": { "ecmaVersion": 2018 diff --git a/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js b/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js index 5c3a6cb..5aa26ca 100644 --- a/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js +++ b/modules/ve-mw/ui/contextitems/ve.ui.MWAlienAnnotationContextItem.js @@ -36,7 +36,7 @@ ve.ui.MWAlienAnnotationContextItem.static.modelClasses = [ ve.ui.MWAlienAnnotationContextItem.prototype.getLabelMessage = function () { const type = this.model.getAttribute( 'type' ); - if ( type.indexOf( '/End', type.length - 4 ) !== -1 ) { + if ( type.includes( '/End', type.length - 4 ) ) { return mw.message( 'visualeditor-annotations-default-end' ).text(); } else { return mw.message( 'visualeditor-annotations-default-start' ).text(); @@ -45,7 +45,7 @@ ve.ui.MWAlienAnnotationContextItem.prototype.getLabelMessage = function () { ve.ui.MWAlienAnnotationContextItem.prototype.getDescriptionMessage = function () { const type = this.model.getAttribute( 'type' ); - if ( type.indexOf( '/End', type.length - 4 ) !== -1 ) { + if ( type.includes( '/End', type.length - 4 ) ) { return ''; } return mw.message( 'visualeditor-annotations-default-description' ).parseDom(); diff --git a/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js b/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js index 2549f04..a411203 100644 --- a/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js +++ b/modules/ve-mw/ui/datatransferhandlers/ve.ui.MWWikitextStringTransferHandler.js @@ -62,7 +62,7 @@ ve.ui.MWWikitextStringTransferHandler.static.matchFunction = function ( item ) { if ( registry.registry[ i ].test( text ) ) { return true; } - } else if ( text.indexOf( rule ) !== -1 ) { + } else if ( text.includes( rule ) ) { return true; } } diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js b/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js index 234784f..f92aac5 100644 --- a/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js +++ b/modules/ve-mw/ui/dialogs/ve.ui.MWMetaDialog.js @@ -227,7 +227,7 @@ ve.ui.MWMetaDialog.prototype.getSetupProcess = function ( data ) { selectWidget.findItemFromData( page ).setDisabled( isSource ); } ); - if ( isSource && visualOnlyPages.indexOf( data.page || 'categories' ) !== -1 ) { + if ( isSource && visualOnlyPages.includes( data.page || 'categories' ) ) { data.page = 'templatesUsed'; } diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js b/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js index 64262f4..a665315 100644 --- a/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js +++ b/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js @@ -284,7 +284,7 @@ ve.ui.MWSaveDialog.prototype.clearDiff = function () { * @throws {Error} Unknown saveDialog panel */ ve.ui.MWSaveDialog.prototype.swapPanel = function ( panel, noFocus ) { - if ( ( [ 'save', 'review', 'preview', 'conflict' ].indexOf( panel ) ) === -1 ) { + if ( ![ 'save', 'review', 'preview', 'conflict' ].includes( panel ) ) { throw new Error( 'Unknown saveDialog panel: ' + panel ); } diff --git a/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js b/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js index d3c4bd5..4857915 100644 --- a/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js +++ b/modules/ve-mw/ui/inspectors/ve.ui.MWWikitextLinkAnnotationInspector.js @@ -194,7 +194,7 @@ ve.ui.MWWikitextLinkAnnotationInspector.prototype.getTeardownProcess = function } else { labelText = this.initialLabel; } - if ( labelText.indexOf( ']]' ) !== -1 ) { + if ( labelText.includes( ']]' ) ) { labelText = labelText.replace( /(\]{2,})/g, '<nowiki>$1</nowiki>' ); } const labelTitle = mw.Title.newFromText( labelText ); diff --git a/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js b/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js index f688750..73c1d02 100644 --- a/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js +++ b/modules/ve-mw/ui/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout.js @@ -278,7 +278,7 @@ ve.ui.MWTwoPaneTransclusionDialogLayout.prototype.removePages = function ( pages this.stackLayout.getItems().forEach( ( page ) => { const pageName = page.getName(); - if ( pagesNamesToRemove.indexOf( pageName ) !== -1 ) { + if ( pagesNamesToRemove.includes( pageName ) ) { pagesToRemove.push( page ); delete this.pages[ pageName ]; if ( this.currentPageName === pageName ) { @@ -289,7 +289,7 @@ ve.ui.MWTwoPaneTransclusionDialogLayout.prototype.removePages = function ( pages } // Move the selection from a removed top-level part to another, but not to a parameter - if ( pageName.indexOf( '/' ) === -1 ) { + if ( !pageName.includes( '/' ) ) { if ( !isCurrentPageRemoved ) { // The last part before the removed one prevSelectionCandidate = pageName; diff --git a/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js b/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js index 289caa1..50a0876 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWAddParameterPage.js @@ -184,7 +184,7 @@ ve.ui.MWAddParameterPage.prototype.getValidationErrors = function ( name ) { const spec = this.template.getSpec(); let key; - if ( spec.getParameterAliases( name ).indexOf( name ) !== -1 ) { + if ( spec.getParameterAliases( name ).includes( name ) ) { key = 'visualeditor-dialog-transclusion-add-param-error-alias'; } else if ( this.template.hasParameter( name ) ) { key = 'visualeditor-dialog-transclusion-add-param-error-exists-selected'; diff --git a/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js b/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js index 487e169..9b0c917 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWParameterPage.js @@ -253,7 +253,7 @@ ve.ui.MWParameterPage.prototype.createValueInput = function () { ( suggestedValue ) => typeof suggestedValue === 'string' ).map( ( suggestedValue ) => ( { data: suggestedValue, label: suggestedValue || '\xA0' } ) ); return new OO.ui.ComboBoxInputWidget( valueInputConfig ); - } else if ( type !== 'line' || value.indexOf( '\n' ) !== -1 ) { + } else if ( type !== 'line' || value.includes( '\n' ) ) { // If the type is line, but there are already newlines in the provided // value, don't break the existing content by only providing a single- // line field. (This implies that the TemplateData for the field isn't @@ -277,7 +277,7 @@ ve.ui.MWParameterPage.prototype.createValueInput = function () { * @return {boolean} True if suggested values should be shown */ ve.ui.MWParameterPage.prototype.isSuggestedValueType = function ( type ) { - return [ 'unknown', 'content', 'line', 'string', 'number', 'unbalanced-wikitext' ].indexOf( type ) > -1; + return [ 'unknown', 'content', 'line', 'string', 'number', 'unbalanced-wikitext' ].includes( type ); }; /** diff --git a/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js b/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js index 718e443..a71391a 100644 --- a/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js +++ b/modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js @@ -67,7 +67,7 @@ ve.ui.MWTemplatePage = function VeUiMWTemplatePage( template, name, config ) { } catch ( e ) { } // When {{User:Foo}} can be parsed as "Foo", we know the ":" is not syntax. - key = title && title.getMain().indexOf( ':' ) === -1 ? + key = title && !title.getMain().includes( ':' ) ? 'visualeditor-dialog-transclusion-template-title-nonexistent' : 'visualeditor-dialog-transclusion-template-title-modifier'; } else { diff --git a/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js b/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js index 8403c85..2ec87ff 100644 --- a/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js +++ b/modules/ve-mw/ui/toolgroups/ve.ui.MWHelpListToolGroup.js @@ -124,7 +124,7 @@ ve.ui.MWUserGuideTool.prototype.onUpdateState = function () {}; ve.ui.MWUserGuideTool.prototype.onSelect = function () { this.setActive( false ); const urlOrTitle = ve.msg( 'visualeditor-help-link' ); - if ( urlOrTitle.indexOf( '//' ) !== -1 ) { + if ( urlOrTitle.includes( '//' ) ) { window.open( urlOrTitle ); } else { // This link used to be internal link to mw:, but that doesn't work diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js index b53d4ce..470a1d4 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryInputWidget.js @@ -105,7 +105,7 @@ ve.ui.MWCategoryInputWidget.prototype.getLookupCacheDataFromResponse = function } if ( linkCacheUpdate[ redirect.to ].redirectFrom && - linkCacheUpdate[ redirect.to ].redirectFrom.indexOf( redirect.from ) === -1 + !linkCacheUpdate[ redirect.to ].redirectFrom.includes( redirect.from ) ) { linkCacheUpdate[ redirect.to ].redirectFrom.push( redirect.from ); } else { @@ -157,7 +157,7 @@ ve.ui.MWCategoryInputWidget.prototype.getLookupMenuOptionsFromData = function ( linkCacheUpdate[ suggestedCategoryTitle ] = { missing: false }; } if ( - existingCategories.indexOf( suggestedCategory ) === -1 + !existingCategories.includes( suggestedCategory ) ) { if ( suggestedCacheEntry && suggestedCacheEntry.hidden ) { hiddenCategoryItems.push( suggestedCategory ); diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js index b0058d1..8853d21 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWCategoryWidget.js @@ -39,7 +39,7 @@ ve.ui.MWCategoryWidget = function VeUiMWCategoryWidget( config ) { this.normalizedTitles = {}; this.popup = new ve.ui.MWCategoryPopupWidget(); this.input = new ve.ui.MWCategoryInputWidget( this, { $overlay: config.$overlay } ); - this.forceCapitalization = mw.config.get( 'wgCaseSensitiveNamespaces' ).indexOf( categoryNamespace ) === -1; + this.forceCapitalization = !mw.config.get( 'wgCaseSensitiveNamespaces' ).includes( categoryNamespace ); this.categoryPrefix = mw.config.get( 'wgFormattedNamespaces' )[ categoryNamespace ] + ':'; this.expandedItem = null; diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js index 4e34618..d3706e2 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWInternalLinkAnnotationWidget.js @@ -112,7 +112,7 @@ ve.ui.MWInternalLinkAnnotationWidget.prototype.onTextChange = function ( value ) value = targetData.title; this.input.query.setValue( targetData.title ); } - } else if ( namespacesWithSubpages.indexOf( basePageObj.namespace ) !== -1 && value[ 0 ] === '/' ) { + } else if ( namespacesWithSubpages.includes( basePageObj.namespace ) && value[ 0 ] === '/' ) { // This does make it more-difficult to deliberately link to a page in the // default namespace that starts with a / when you're on a subpage-allowing // namespace. However, the exact same trick you need to know to make it work diff --git a/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js b/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js index 670bee0..c46dd3b 100644 --- a/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js +++ b/modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineTemplateWidget.js @@ -431,7 +431,7 @@ ve.ui.MWTransclusionOutlineTemplateWidget.prototype.filterParameters = function const foundSomeMatch = placesToSearch.some( // Aliases missed validation for a long time and aren't guaranteed to be strings - ( term ) => term && typeof term === 'string' && term.toLowerCase().indexOf( query ) !== -1 + ( term ) => term && typeof term === 'string' && term.toLowerCase().includes( query ) ); item.toggle( foundSomeMatch ); diff --git a/package-lock.json b/package-lock.json index b215750..56eafe7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@wdio/mocha-framework": "7.33.0", "@wdio/spec-reporter": "7.16.13", "api-testing": "1.6.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "grunt": "1.6.1", "grunt-banana-checker": "0.13.0", "grunt-contrib-watch": "1.1.0", @@ -161,17 +161,23 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", @@ -4863,9 +4869,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", @@ -4878,13 +4884,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": { @@ -5091,9 +5100,9 @@ } }, "node_modules/eslint-plugin-no-jquery": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz", - "integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", + "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", "dev": true, "peerDependencies": { "eslint": ">=8.0.0" @@ -14220,12 +14229,20 @@ "dev": true }, "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + } } }, "@csstools/css-parser-algorithms": { @@ -17862,9 +17879,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", @@ -17877,7 +17894,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", @@ -18024,9 +18041,9 @@ } }, "eslint-plugin-no-jquery": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.1.tgz", - "integrity": "sha512-GrzdjIxox/3x8hpSwpxiMuEQFipiJHTGiVsp0T1TI6GH+KVSbXa4z/56xTV1WiIe66u3iRgvCIipu9CRthecpQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz", + "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 7313de2..fce88e9 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@wdio/mocha-framework": "7.33.0", "@wdio/spec-reporter": "7.16.13", "api-testing": "1.6.0", - "eslint-config-wikimedia": "0.28.2", + "eslint-config-wikimedia": "0.29.1", "grunt": "1.6.1", "grunt-banana-checker": "0.13.0", "grunt-contrib-watch": "1.1.0", -- 2.39.2 --- end ---