This run took 52 seconds.
$ date --- stdout --- Tue Jul 1 01:48:30 UTC 2025 --- end --- $ git clone file:///srv/git/mediawiki-extensions-GuidedTour.git repo --depth=1 -b master --- stderr --- Cloning into 'repo'... --- stdout --- --- end --- $ git config user.name libraryupgrader --- stdout --- --- end --- $ git config user.email tools.libraryupgrader@tools.wmflabs.org --- stdout --- --- end --- $ git submodule update --init --- stdout --- --- end --- $ grr init --- stdout --- Installed commit-msg hook. --- end --- $ git show-ref refs/heads/master --- stdout --- 671fe1a6d6ca3e854a609777e600cf492979e209 refs/heads/master --- end --- $ /usr/bin/npm audit --json --- stdout --- { "auditReportVersion": 2, "vulnerabilities": { "brace-expansion": { "name": "brace-expansion", "severity": "low", "isDirect": false, "via": [ { "source": 1105443, "name": "brace-expansion", "dependency": "brace-expansion", "title": "brace-expansion Regular Expression Denial of Service vulnerability", "url": "https://github.com/advisories/GHSA-v6h2-p8h4-qcjw", "severity": "low", "cwe": [ "CWE-400" ], "cvss": { "score": 3.1, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L" }, "range": ">=1.0.0 <=1.1.11" }, { "source": 1105444, "name": "brace-expansion", "dependency": "brace-expansion", "title": "brace-expansion Regular Expression Denial of Service vulnerability", "url": "https://github.com/advisories/GHSA-v6h2-p8h4-qcjw", "severity": "low", "cwe": [ "CWE-400" ], "cvss": { "score": 3.1, "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L" }, "range": ">=2.0.0 <=2.0.1" } ], "effects": [], "range": "1.0.0 - 1.1.11 || 2.0.0 - 2.0.1", "nodes": [ "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion", "node_modules/@typescript-eslint/parser/node_modules/brace-expansion", "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion", "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion", "node_modules/brace-expansion", "node_modules/eslint-plugin-n/node_modules/brace-expansion" ], "fixAvailable": true } }, "metadata": { "vulnerabilities": { "info": 0, "low": 1, "moderate": 0, "high": 0, "critical": 0, "total": 1 }, "dependencies": { "prod": 1, "dev": 737, "optional": 4, "peer": 0, "peerOptional": 0, "total": 737 } } } --- 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.9) - Locking composer/xdebug-handler (3.0.5) - Locking dealerdirect/phpcodesniffer-composer-installer (v1.1.1) - Locking doctrine/deprecations (1.1.5) - Locking felixfbecker/advanced-json-rpc (v3.2.1) - Locking mediawiki/mediawiki-codesniffer (v47.0.0) - Locking mediawiki/mediawiki-phan-config (0.15.1) - Locking mediawiki/minus-x (1.1.3) - Locking mediawiki/phan-taint-check-plugin (6.1.0) - Locking microsoft/tolerant-php-parser (v0.1.2) - Locking netresearch/jsonmapper (v4.5.0) - Locking phan/phan (5.4.5) - Locking php-parallel-lint/php-console-color (v1.0.1) - Locking php-parallel-lint/php-console-highlighter (v1.0.0) - Locking php-parallel-lint/php-parallel-lint (v1.4.0) - Locking phpcsstandards/phpcsextra (1.2.1) - Locking phpcsstandards/phpcsutils (1.0.12) - Locking phpdocumentor/reflection-common (2.2.0) - Locking phpdocumentor/reflection-docblock (5.6.2) - Locking phpdocumentor/type-resolver (1.10.0) - Locking 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.12.2) - Locking symfony/console (v7.3.1) - Locking symfony/deprecation-contracts (v3.6.0) - Locking symfony/polyfill-ctype (v1.32.0) - Locking symfony/polyfill-intl-grapheme (v1.32.0) - Locking symfony/polyfill-intl-normalizer (v1.32.0) - Locking symfony/polyfill-mbstring (v1.32.0) - Locking symfony/polyfill-php80 (v1.32.0) - Locking symfony/service-contracts (v3.6.0) - Locking symfony/string (v7.3.0) - Locking tysonandre/var_representation_polyfill (0.1.3) - Locking webmozart/assert (1.11.0) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 38 installs, 0 updates, 0 removals 0 [>---------------------------] 0 [->--------------------------] - Installing squizlabs/php_codesniffer (3.12.2): Extracting archive - Installing dealerdirect/phpcodesniffer-composer-installer (v1.1.1): Extracting archive - Installing composer/pcre (3.3.2): Extracting archive - Installing symfony/polyfill-php80 (v1.32.0): Extracting archive - Installing phpcsstandards/phpcsutils (1.0.12): Extracting archive - Installing phpcsstandards/phpcsextra (1.2.1): Extracting archive - Installing symfony/polyfill-mbstring (v1.32.0): Extracting archive - Installing composer/spdx-licenses (1.5.9): Extracting archive - Installing composer/semver (3.4.3): Extracting archive - Installing mediawiki/mediawiki-codesniffer (v47.0.0): Extracting archive - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive - Installing symfony/polyfill-intl-normalizer (v1.32.0): Extracting archive - Installing symfony/polyfill-intl-grapheme (v1.32.0): Extracting archive - Installing symfony/polyfill-ctype (v1.32.0): Extracting archive - Installing symfony/string (v7.3.0): Extracting archive - Installing symfony/deprecation-contracts (v3.6.0): Extracting archive - Installing psr/container (2.0.2): Extracting archive - Installing symfony/service-contracts (v3.6.0): Extracting archive - Installing symfony/console (v7.3.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.5): Extracting archive - Installing phpdocumentor/type-resolver (1.10.0): Extracting archive - Installing phpdocumentor/reflection-docblock (5.6.2): Extracting archive - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive - Installing psr/log (3.0.2): Extracting archive - Installing composer/xdebug-handler (3.0.5): Extracting archive - Installing phan/phan (5.4.5): Extracting archive - Installing mediawiki/phan-taint-check-plugin (6.1.0): Extracting archive - Installing mediawiki/mediawiki-phan-config (0.15.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 17 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.29.1 -> 0.30.0 $ /usr/bin/npm install --- stderr --- npm WARN ERESOLVE overriding peer dependency npm WARN While resolving: GuidedTour@undefined npm WARN Found: eslint-config-wikimedia@0.29.1 npm WARN node_modules/eslint-config-wikimedia npm WARN dev eslint-config-wikimedia@"0.30.0" from the root project npm WARN 1 more (@wmde/eslint-config-wikimedia-typescript) npm WARN npm WARN Could not resolve dependency: npm WARN peer eslint-config-wikimedia@"^0.29.1" from @wmde/eslint-config-wikimedia-typescript@0.2.13 npm WARN node_modules/@wmde/eslint-config-wikimedia-typescript npm WARN dev @wmde/eslint-config-wikimedia-typescript@"^0.2.13" from the root project npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead npm WARN deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options. --- stdout --- added 737 packages, and audited 738 packages in 26s 197 packages are looking for funding run `npm fund` for details 1 low severity vulnerability To address all issues, run: npm audit fix Run `npm audit` for details. --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ ./node_modules/.bin/eslint . --fix --- stdout --- /src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.Tour.js 191:20 warning Where possible, maintain application state in JS to avoid slower DOM queries no-jquery/no-class-state /src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.TransitionEvent.js 4:1 warning Invalid JSDoc tag name "alternateClassName" jsdoc/check-tag-names /src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.main.js 285:3 warning Found more than one @return declaration jsdoc/require-returns 285:3 warning Found more than one @return declaration jsdoc/require-returns-check /src/repo/modules/mediawiki.libs.guiders/mediawiki.libs.guiders.js 386:17 warning Positional selector extensions are not allowed no-jquery/no-sizzle 445:17 warning Positional selector extensions are not allowed no-jquery/no-sizzle 744:3 warning Selector extensions are not allowed no-jquery/no-sizzle ✖ 7 problems (0 errors, 7 warnings) --- end --- $ ./node_modules/.bin/eslint . -f json --- stdout --- [{"filePath":"/src/repo/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"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/.svgo.config.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"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/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"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/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/cypress.config.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"@typescript-eslint/indent","replacedBy":["@stylistic/ts/indent"]},{"ruleId":"@typescript-eslint/member-delimiter-style","replacedBy":["@stylistic/ts/member-delimiter-style"]},{"ruleId":"@typescript-eslint/type-annotation-spacing","replacedBy":["@stylistic/ts/type-annotation-spacing"]},{"ruleId":"@typescript-eslint/semi","replacedBy":["@stylistic/ts/semi"]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"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":"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-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/cypress/.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/cypress/e2e/uprightdownleft.cy.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"@typescript-eslint/indent","replacedBy":["@stylistic/ts/indent"]},{"ruleId":"@typescript-eslint/member-delimiter-style","replacedBy":["@stylistic/ts/member-delimiter-style"]},{"ruleId":"@typescript-eslint/type-annotation-spacing","replacedBy":["@stylistic/ts/type-annotation-spacing"]},{"ruleId":"@typescript-eslint/semi","replacedBy":["@stylistic/ts/semi"]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"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":"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-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/cypress/support/e2e.ts","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"@typescript-eslint/indent","replacedBy":["@stylistic/ts/indent"]},{"ruleId":"@typescript-eslint/member-delimiter-style","replacedBy":["@stylistic/ts/member-delimiter-style"]},{"ruleId":"@typescript-eslint/type-annotation-spacing","replacedBy":["@stylistic/ts/type-annotation-spacing"]},{"ruleId":"@typescript-eslint/semi","replacedBy":["@stylistic/ts/semi"]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"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":"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-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/cypress/tsconfig.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/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/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/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/ext.guidedTour.autolauncher.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.launcher.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib.internal.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.Step.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":206,"column":18,"nodeType":"CallExpression","endLine":206,"endColumn":46,"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":216,"column":18,"nodeType":"CallExpression","endLine":216,"endColumn":42,"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":323,"column":18,"nodeType":"CallExpression","endLine":323,"endColumn":46,"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":345,"column":18,"nodeType":"CallExpression","endLine":345,"endColumn":46,"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":738,"column":20,"nodeType":"CallExpression","endLine":738,"endColumn":50,"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":744,"column":26,"nodeType":"CallExpression","endLine":744,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.StepBuilder.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.Tour.js","messages":[{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":191,"column":20,"nodeType":"CallExpression","endLine":191,"endColumn":51}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\tconst gt = mw.guidedTour,\n\t\tinternal = gt.internal,\n\t\tguiders = mw.libs.guiders;\n\n\t// Any public member used to define the tour belongs in TourBuilder or\n\t// StepBuilder.\n\t/**\n\t * A guided tour\n\t *\n\t * @class mw.guidedTour.Tour\n\t *\n\t * @package\n\t */\n\n\t/**\n\t * See mw.guidedTour.TourBuilder#constructor, which passes through to this.\n\t *\n\t * @constructor\n\t * @param {Object} tourSpec Specification of tour\n\t * @private\n\t */\n\tfunction Tour( tourSpec ) {\n\t\t/**\n\t\t * Name of tour\n\t\t *\n\t\t * @property {string}\n\t\t * @private\n\t\t * @readonly\n\t\t */\n\t\tthis.name = tourSpec.name;\n\n\t\t/**\n\t\t * Whether tour is limited to one page\n\t\t *\n\t\t * @property {boolean}\n\t\t * @private\n\t\t * @readonly\n\t\t */\n\t\tthis.isSinglePage = tourSpec.isSinglePage;\n\n\t\t/**\n\t\t * Condition for showing the tour.\n\t\t *\n\t\t * See mw.guidedTour.Tour#constructor for details on possible values.\n\t\t *\n\t\t * @property {string}\n\t\t * @private\n\t\t * @readonly\n\t\t */\n\t\tthis.showConditionally = tourSpec.showConditionally;\n\n\t\tinternal.definedTours[ this.name ] = this;\n\n\t\t/**\n\t\t * Object mapping step names to mw.guidedTour.Step objects\n\t\t *\n\t\t * @property {Object}\n\t\t * @private\n\t\t */\n\t\tthis.steps = {};\n\n\t\t/**\n\t\t * First step of tour\n\t\t *\n\t\t * @property {mw.guidedTour.Step}\n\t\t * @private\n\t\t */\n\t\tthis.firstStep = null;\n\n\t\t// TODO (mattflaschen, 2014-04-04): Consider refactoring this in\n\t\t// conjunction with the user state work.\n\t\t/**\n\t\t * Current step\n\t\t *\n\t\t * This step is the most recently displayed for the user. It is not\n\t\t * necessarily currently displayed. It indicates the user's progress\n\t\t * through the tour. It corresponds to the step saved to the user's\n\t\t * state (cookie), except for single-page tours (which use this, but not\n\t\t * the cookie).\n\t\t *\n\t\t * @property {mw.guidedTour.Step}\n\t\t * @private\n\t\t */\n\t\tthis.currentStep = null;\n\n\t\t// Manually updated by the TourBuilder since JavaScript does not have a\n\t\t// performant way to get the length of an object/associative array.\n\t\t/**\n\t\t * Step count\n\t\t *\n\t\t * @property {number}\n\t\t * @private\n\t\t * @readonly\n\t\t */\n\t\tthis.stepCount = 0;\n\n\t\t/**\n\t\t * CSS class\n\t\t *\n\t\t * @property {string}\n\t\t * @private\n\t\t * @readonly\n\t\t */\n\t\tthis.cssClass = 'mw-guidedtour-tour-' + this.name;\n\n\t\t/**\n\t\t * Whether the tour should be flipped; see getShouldFlipHorizontally.\n\t\t *\n\t\t * Initialized in initialize()\n\t\t */\n\t\tthis.flipRTL = null;\n\n\t\tconst moduleName = internal.getTourModuleName( this.name );\n\n\t\t/**\n\t\t * Whether this is defined through a ResourceLoader module in an extension\n\t\t *\n\t\t * @property {boolean}\n\t\t * @private\n\t\t * @readonly\n\t\t */\n\t\tthis.isExtensionDefined = ( mw.loader.getState( moduleName ) !== null );\n\n\t\t/**\n\t\t * Promise tracking when this tour is initialized (guiders have been created)\n\t\t *\n\t\t * @property {null|jQuery.Deferred}\n\t\t * @private\n\t\t */\n\t\tthis.initialized = null;\n\n\t\t/**\n\t\t * Whether to omit transition events when clicking next or back\n\t\t *\n\t\t * @property {boolean}\n\t\t */\n\t\tthis.emitTransitionOnStep = tourSpec.emitTransitionOnStep;\n\t}\n\n\t// TODO: Change this to use before/after (T142267)\n\t/**\n\t * Determines whether guiders in this tour should be horizontally flipped due to LTR/RTL\n\t *\n\t * Considers the HTML element's dir attribute and body LTR/RTL classes in addition\n\t * to parameter.\n\t *\n\t * We assume that all tours defined in extensions use LTR, as with CSS/LESS.\n\t *\n\t * We assume that tours defined on-wiki use their site's directionality.\n\t *\n\t * Examples:\n\t *\n\t * * A user on Arabic Wikipedia views an extension-defined tour in the default\n\t * language for their wiki (Arabic). The tour is flipped.\n\t *\n\t * * A user on Hebrew Wikipedia writes a tour in the MediaWiki namespace. They\n\t * view the tour in the default language (Hebrew). The tour is not flipped.\n\t *\n\t * * A user on English Wikipedia is browsing with the user language set to Farsi.\n\t * They view an extension-defined tour. The tour is flipped.\n\t *\n\t * @private\n\t *\n\t * @param {'ltr'|'rtl'} interfaceDirection Direction the interface is being viewed\n\t * in; can be changed by user preferences or uselang\n\t * @param {'ltr'|'rtl'} siteDirection Main direction of site\n\t *\n\t * @return {boolean} true if steps should be flipped, false otherwise\n\t */\n\tTour.prototype.getShouldFlipHorizontally = function ( interfaceDirection, siteDirection ) {\n\t\t// Direction the tour is assumed to be written for\n\t\tconst tourDirection = this.isExtensionDefined ? 'ltr' : siteDirection;\n\n\t\t// We flip if needed to match the interface direction\n\t\treturn tourDirection !== interfaceDirection;\n\t};\n\n\t/**\n\t * Initializes a tour to prepare for showing it. If it's already initialized,\n\t * do nothing.\n\t *\n\t * @private\n\t *\n\t * @return {jQuery.Promise} Promise that waits on all steps to initialize (or one to fail)\n\t */\n\tTour.prototype.initialize = function () {\n\t\tconst promises = [],\n\t\t\t$body = $( document.body ),\n\t\t\tinterfaceDirection = $( 'html' ).attr( 'dir' ),\n\t\t\tsiteDirection = $body.hasClass( 'sitedir-ltr' ) ? 'ltr' : 'rtl';\n\n\t\tif ( !this.initialized ) {\n\t\t\tthis.flipRTL = this.getShouldFlipHorizontally( interfaceDirection, siteDirection );\n\t\t\tfor ( const stepName in this.steps ) {\n\t\t\t\tpromises.push( this.steps[ stepName ].initialize() );\n\t\t\t}\n\t\t\tthis.initialized = $.when.apply( $, promises );\n\t\t}\n\n\t\treturn this.initialized;\n\t};\n\n\t/**\n\t * Checks whether any of the guiders in this tour are visible\n\t *\n\t * @private\n\t *\n\t * @return {boolean} Whether part of this tour is visible\n\t */\n\tTour.prototype.isVisible = function () {\n\t\tconst tourVisibleSelector = '.' + this.cssClass + ':visible';\n\n\t\treturn $( tourVisibleSelector ).length > 0;\n\t};\n\n\t/**\n\t * Gets a step object, given a step name or step object.\n\t *\n\t * In either case, it checks that the step belongs to the tour, and throws an\n\t * exception if it does not.\n\t *\n\t * @private\n\t *\n\t * @param {string|mw.guidedTour.Step} step Step name or step\n\t *\n\t * @return {mw.guidedTour.Step} step, validated to exist in this tour\n\t * @throws {mw.guidedTour.IllegalArgumentError} If the step, or step name, is not\n\t * part of this tour\n\t */\n\tTour.prototype.getStep = function ( step ) {\n\t\tlet stepName;\n\n\t\tif ( typeof step === 'string' ) {\n\t\t\tstepName = step;\n\t\t\tstep = this.steps[ stepName ];\n\t\t\tif ( !step ) {\n\t\t\t\tthrow new gt.IllegalArgumentError( 'Step \"' + stepName + '\" not found in the \"' + this.name + '\" tour.' );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( step.tour !== this ) {\n\t\t\t\tthrow new gt.IllegalArgumentError( 'Step object must belong to this tour (\"' + this.name + '\")' );\n\t\t\t}\n\t\t}\n\n\t\treturn step;\n\t};\n\n\t/**\n\t * Shows a step\n\t *\n\t * It can be requested by name (string) or by Step (mw.guidedTour.Step).\n\t *\n\t * It will first check to see if the tour should transition.\n\t *\n\t * @private\n\t *\n\t * @param {mw.guidedTour.Step|string} step Step name or object\n\t *\n\t * @throws {Error} If initialize fails\n\t */\n\tTour.prototype.showStep = function ( step ) {\n\t\tstep = this.getStep( step );\n\n\t\tthis.initialize().then( () => {\n\t\t\tconst transitionEvent = new gt.TransitionEvent();\n\t\t\ttransitionEvent.type = gt.TransitionEvent.BUILTIN;\n\t\t\ttransitionEvent.subtype = gt.TransitionEvent.TRANSITION_BEFORE_SHOW;\n\t\t\tstep = step.checkTransition( transitionEvent );\n\n\t\t\t// null means a TransitionAction (hide/end)\n\t\t\tif ( step !== null ) {\n\t\t\t\tconst guider = guiders._guiderById( step.specification.id );\n\t\t\t\tif ( guider !== undefined && guider.elem.is( ':visible' ) ) {\n\t\t\t\t\t// Already showing the same one\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// A guider from the same tour is visible\n\t\t\t\tif ( this.isVisible() ) {\n\t\t\t\t\tguiders.hideAll();\n\t\t\t\t}\n\n\t\t\t\tguiders.show( step.specification.id );\n\t\t\t}\n\t\t} ).catch( ( e ) => {\n\t\t\tthrow new Error( 'Could not show step \\'' + step.name + '\\' because this.initialize() failed. Underlying error: ' + e );\n\t\t} );\n\t};\n\n\t/**\n\t * Starts tour by showing the first step\n\t *\n\t * @private\n\t *\n\t * @throws {mw.guidedTour.TourDefinitionError} If firstStep was never called on the\n\t * TourBuilder\n\t */\n\tTour.prototype.start = function () {\n\t\tif ( this.firstStep === null ) {\n\t\t\tthrow new gt.TourDefinitionError(\n\t\t\t\t'The .firstStep() method must be called for all tours.',\n\t\t\t);\n\t\t}\n\n\t\tthis.showStep( this.firstStep );\n\t};\n\n\tmw.guidedTour.Tour = Tour;\n}() );\n","usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.TourBuilder.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.TransitionAction.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.TransitionEvent.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc tag name \"alternateClassName\".","line":4,"column":1,"nodeType":"Block","endLine":4,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"( function () {\n\t/**\n\t * @class mw.guidedTour.TransitionEvent\n\t * @alternateClassName gt.TransitionEvent\n\t *\n\t * Information on the event that triggered a transition check.\n\t */\n\n\t/**\n\t * Constructs a TransitionEvent\n\t *\n\t * @class\n\t * @constructor\n\t * @private\n\t */\n\tfunction TransitionEvent() {}\n\n\t/**\n\t * Type string indicating event was initiated by GuidedTour\n\t *\n\t * This type is in progress, and the usage may change.\n\t *\n\t * @property {string}\n\t * @static\n\t * @readonly\n\t */\n\tTransitionEvent.BUILTIN = 'BUILTIN';\n\n\t/**\n\t * Type string indicating event was initiated by mw.hook firing\n\t *\n\t * @property {string}\n\t * @static\n\t * @readonly\n\t */\n\tTransitionEvent.MW_HOOK = 'MW_HOOK';\n\n\t/**\n\t * Subtype string indicating a builtin event was fired immediately before a guider\n\t * was shown\n\t *\n\t * @property {string}\n\t * @static\n\t * @readonly\n\t */\n\tTransitionEvent.TRANSITION_BEFORE_SHOW = 'TRANSITION_BEFORE_SHOW';\n\n\t/**\n\t * Subtype string indicating a builtin event was fired because the user clicked\n\t * the next button\n\t *\n\t * @property {string}\n\t * @static\n\t * @readonly\n\t */\n\tTransitionEvent.TRANSITION_NEXT = 'TRANSITION_NEXT';\n\n\t/**\n\t * Subtype string indicating a builtin event was fired because the user clicked\n\t * the back button\n\t *\n\t * @property {string}\n\t * @static\n\t * @readonly\n\t */\n\tTransitionEvent.TRANSITION_BACK = 'TRANSITION_BACK';\n\n\t/**\n\t * Type of event that triggered the transition check\n\t *\n\t * Current possible values are:\n\t *\n\t * - gt.TransitionEvent.BUILTIN - builtin event\n\t * - gt.TransitionEvent.MW_HOOK - mw.hook event\n\t *\n\t * @property {string} type\n\t */\n\n\t/**\n\t * Subtype of event; currently only used for 'builtin' type.\n\t *\n\t * @property {string|undefined} subtype\n\t */\n\n\t/**\n\t * Hook name, only for 'mw.hook' type\n\t *\n\t * @property {string|undefined} hookName\n\t */\n\n\t/**\n\t * Hook arguments, only for 'mw.hook' type. This converts the arguments (0 or more)\n\t * passed when the hook fired to an array.\n\t *\n\t * @property {Array|undefined} hookArguments\n\t * @ignore\n\t */\n\n\tmw.guidedTour = mw.guidedTour || {};\n\tmw.guidedTour.TransitionEvent = TransitionEvent;\n}() );\n","usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.WikitextDescription.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/ext.guidedTour.lib/ext.guidedTour.lib.main.js","messages":[{"ruleId":"jsdoc/require-returns","severity":1,"message":"Found more than one @return declaration.","line":285,"column":3,"nodeType":"Block","endLine":296,"endColumn":6},{"ruleId":"jsdoc/require-returns-check","severity":1,"message":"Found more than one @return declaration.","line":285,"column":3,"nodeType":"Block","endLine":296,"endColumn":6}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* global ve */\n/**\n * @classdesc GuidedTour public API\n *\n * Set as mw.guidedTour and often aliased to gt locally\n *\n * @author Terry Chay <tchay@wikimedia.org>\n * @author Matt Flaschen <mflaschen@wikimedia.org>\n * @author Ori Livneh <olivneh@wikimedia.org>\n * @author Rob Moen <rmoen@wikimedia.org>\n * @author S Page <spage@wikimedia.org>\n * @author Sam Smith <git@samsmith.io>\n * @author Luke Welling <lwelling@wikimedia.org>\n *\n * @class mw.guidedTour\n * @singleton\n */\n/*\n * Part of GuidedTour, the MediaWiki extension for guided tours.\n *\n * Uses Optimize.ly's Guiders library (with customizations developed at WordPress\n * and MediaWiki).\n */\n( function ( guiders ) {\n\t'use strict';\n\n\tconst gt = mw.guidedTour,\n\t\tinternal = gt.internal;\n\tlet cookieName, cookieParams;\n\t// Initialized to false at page load\n\t// Will be set true any time postEdit fires, including right after\n\t// legacy wgPostEdit variable is set to true.\n\tlet isPostEdit = false;\n\n\t/**\n\t * Returns the current user state, initalizing it if needed\n\t *\n\t * @private\n\t *\n\t * @return {Object} user state object. If there is none, or the format was\n\t * invalid, returns a skeleton state object from\n\t * mw.guidedTour.internal#getInitialUserStateObject\n\t */\n\tfunction getCookieState() {\n\t\tconst cookieValue = mw.cookie.get( cookieName );\n\t\tconst parsed = internal.parseUserState( cookieValue );\n\t\tif ( parsed !== null ) {\n\t\t\treturn parsed;\n\t\t} else {\n\t\t\treturn internal.getInitialUserStateObject();\n\t\t}\n\t}\n\n\t/**\n\t * Returns the current combined user state (cookie state and server-launched state)\n\t * Basically, this acts like the cookie state, except the server can specify\n\t * tours that take precedence via a $wg.\n\t *\n\t * @private\n\t *\n\t * @return {Object} combined state object. If there is none, or the format was\n\t * invalid, returns a skeleton state object from\n\t * mw.guidedTour.internal#getInitialUserStateObject\n\t */\n\tfunction getUserState() {\n\t\tconst cookieState = getCookieState(),\n\t\t\tserverState = mw.config.get( 'wgGuidedTourLaunchState' );\n\t\tlet state = cookieState;\n\n\t\tif ( serverState !== null ) {\n\t\t\tstate = $.extend( true, state, serverState );\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\t/**\n\t * Removes a tour from the cookie\n\t *\n\t * @private\n\t *\n\t * @param {string} tourName name of tour to remove\n\t */\n\tfunction removeTourFromUserStateByName( tourName ) {\n\t\tconst parsedCookie = getCookieState();\n\t\tdelete parsedCookie.tours[ tourName ];\n\t\tmw.cookie.set( cookieName, JSON.stringify( parsedCookie ), cookieParams );\n\t}\n\n\t/**\n\t * Launch tour from given user state\n\t *\n\t * @private\n\t *\n\t * @param {Object} state State that specifies the tour progress\n\t *\n\t * // @return {boolean} Whether a tour was launched\n\t */\n\tfunction launchTourFromState( state ) {\n\t\tconst candidateTours = [];\n\n\t\tfor ( const tourName in state.tours ) {\n\t\t\tcandidateTours.push( {\n\t\t\t\tname: tourName,\n\t\t\t\tstep: state.tours[ tourName ].step,\n\t\t\t} );\n\t\t}\n\n\t\tconst tourNames = candidateTours.map( ( el ) => el.name );\n\n\t\tinternal.loadMultipleTours( tourNames )\n\t\t\t.always( () => {\n\t\t\t\tlet tourName, max, currentStart;\n\n\t\t\t\t// This value is before 1970, but is a simple way\n\t\t\t\t// to ensure the comparison below always works.\n\t\t\t\tmax = {\n\t\t\t\t\tstartTime: -1,\n\t\t\t\t};\n\n\t\t\t\t// Not all the tours in the cookie necessarily\n\t\t\t\t// loaded successfully, but the defined tours did.\n\t\t\t\t// So we make sure it is defined and in the user\n\t\t\t\t// state.\n\t\t\t\tfor ( tourName in internal.definedTours ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tstate.tours[ tourName ] !== undefined &&\n\t\t\t\t\t\tgt.shouldShowTour( {\n\t\t\t\t\t\t\ttourName: tourName,\n\t\t\t\t\t\t\tuserState: state,\n\t\t\t\t\t\t\tpageName: mw.config.get( 'wgPageName' ),\n\t\t\t\t\t\t\tarticleId: mw.config.get( 'wgArticleId' ),\n\t\t\t\t\t\t\tcondition: internal.definedTours[ tourName ].showConditionally,\n\t\t\t\t\t\t} )\n\t\t\t\t\t) {\n\t\t\t\t\t\tcurrentStart = state.tours[ tourName ].startTime || 0;\n\t\t\t\t\t\tif ( currentStart > max.startTime ) {\n\t\t\t\t\t\t\tmax = {\n\t\t\t\t\t\t\t\tname: tourName,\n\t\t\t\t\t\t\t\tstep: state.tours[ tourName ].step,\n\t\t\t\t\t\t\t\tstartTime: currentStart,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( max.name !== undefined ) {\n\t\t\t\t\t// Launch the most recently started tour\n\t\t\t\t\t// that meets the conditions.\n\t\t\t\t\tgt.launchTour( max.name, gt.makeTourId( max ) );\n\t\t\t\t}\n\t\t\t} );\n\t}\n\n\t// TODO (mattflaschen, 2013-07-10): Known issue: This runs too early on a direct\n\t// visit to a veaction=edit page. This probably affects other JS-generated\n\t// interfaces too.\n\t/**\n\t * Initializes guiders and shows tour, starting at the specified step.\n\t * Does not check conditions, so that should already be done\n\t *\n\t * @private\n\t *\n\t * @param {string} tourName name of tour\n\t * @param {string} tourId id to start at\n\t * @throws {mw.guidedTour.IllegalArgumentError} If the tour ID is not consistent\n\t * with the tour name, or does not refer to a valid step\n\t */\n\tfunction showTour( tourName, tourId ) {\n\t\tconst tour = internal.definedTours[ tourName ];\n\n\t\tconst tourInfo = gt.parseTourId( tourId );\n\t\tif ( tourInfo.name !== tourName ) {\n\t\t\tthrow new gt.IllegalArgumentError( 'The tour ID \"' + tourId + '\" is not part of the tour \"' + tourName + '\".' );\n\t\t}\n\n\t\ttour.showStep( tourInfo.step );\n\t}\n\n\t/**\n\t * Guiders has a window resize and document ready listener.\n\t *\n\t * However, we're adding some MW-specific code. Currently, this listens for a\n\t * custom event from the WikiEditor extension, which fires after the extension's\n\t * async loop finishes. If WikiEditor is not running this event just won't fire.\n\t *\n\t * @private\n\t */\n\tfunction setupRepositionListeners() {\n\t\t$( '#wpTextbox1' ).on( 'wikiEditor-toolbar-doneInitialSections', guiders.reposition );\n\t\tmw.hook( 've.skinTabSetupComplete' ).add( guiders.reposition );\n\t}\n\n\t/**\n\t * Listen for events that may mean a tour should transition.\n\t * Currently this listens for some custom events from VisualEditor.\n\t *\n\t * @private\n\t * @memberof mw.guidedTour\n\t */\n\tfunction setupStepTransitionListeners() {\n\t\t// TODO (mattflaschen, 2014-03-17): Temporary hack, until\n\t\t// there are tour-level transition listeners.\n\t\t// Will also change as mediawiki.libs.guiders module is refactored.\n\t\t/**\n\t\t * Checks for a transition after a minimal timeout\n\t\t *\n\t\t * @param {mw.guidedTour.TransitionEvent} transitionEvent event that triggered\n\t\t * the check\n\t\t * @memberof mw.guidedTour\n\t\t */\n\t\tfunction transition( transitionEvent ) {\n\t\t\t// I found this timeout necessary when testing, probably to give the\n\t\t\t// browser queue a chance to do pending DOM rendering.\n\t\t\tsetTimeout( () => {\n\t\t\t\tif ( guiders._currentGuiderID === null ) {\n\t\t\t\t\t// Ignore transitions if there is no active tour.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst currentStepInfo = gt.parseTourId( guiders._currentGuiderID );\n\t\t\t\tif ( currentStepInfo === null ) {\n\t\t\t\t\tmw.log.warn( 'Invalid _currentGuiderID. Returning early' );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst tour = internal.definedTours[ currentStepInfo.name ];\n\t\t\t\tconst currentStep = tour.getStep( currentStepInfo.step );\n\t\t\t\tconst nextStep = currentStep.checkTransition( transitionEvent );\n\t\t\t\tif ( nextStep !== currentStep && nextStep !== null ) {\n\t\t\t\t\ttour.showStep( nextStep );\n\t\t\t\t}\n\n\t\t\t}, 0 );\n\t\t}\n\n\t\t// The next two are handled differently since they also require\n\t\t// settings an internal boolean.\n\t\t// TODO (mattflaschen, 2014-04-01): Hack pending tour-level listeners.\n\t\tmw.hook( 'postEdit' ).add( () => {\n\t\t\tconst transitionEvent = new gt.TransitionEvent();\n\t\t\ttransitionEvent.type = gt.TransitionEvent.MW_HOOK;\n\t\t\ttransitionEvent.hookName = 'postEdit';\n\t\t\ttransitionEvent.hookArguments = [];\n\n\t\t\tisPostEdit = true;\n\t\t\ttransition( transitionEvent );\n\t\t} );\n\t}\n\n\t/**\n\t * Internal initialization of guiders and guidedtour, called once after singleton\n\t * is built.\n\t *\n\t * @private\n\t */\n\tfunction initialize() {\n\t\t// GuidedTour uses cookies to keep the user's progress when they are in the\n\t\t// tour, unless it's single-page.\n\t\tcookieName = '-mw-tour';\n\t\tcookieParams = {\n\t\t\texpires: null, // null means to use a session cookie.\n\t\t\tsameSite: 'Lax',\n\t\t};\n\n\t\t// Show X button\n\t\tguiders._defaultSettings.xButton = true;\n\n\t\tguiders._defaultSettings.autoFocus = true;\n\t\tguiders._defaultSettings.closeOnEscape = true;\n\t\tguiders._defaultSettings.closeOnClickOutside = true;\n\t\tguiders._defaultSettings.flipToKeepOnScreen = true;\n\n\t\t$( () => {\n\t\t\tsetupRepositionListeners();\n\t\t\tsetupStepTransitionListeners();\n\t\t} );\n\t}\n\n\t// Add external API (internal API is at gt.internal)\n\t// Most, but not all, of this is public (non-public ones use standard\n\t// @private marking).\n\tObject.assign( gt, {\n\t\t/**\n\t\t * Parses tour ID into an object with name and step keys.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {string} tourId ID of tour/step combination\n\t\t *\n\t\t * @return {Object|null} Tour info object, or null if invalid input\n\t\t * @return {string} return.name Tour name\n\t\t * @return {string} return.step Tour step, always a string, but\n\t\t * either textual (e.g. 'preview') or numeric (e.g. '5')\n\t\t */\n\t\tparseTourId: function ( tourId ) {\n\t\t\t// Keep in sync with regex in GuidedTourHooks.php\n\t\t\tconst TOUR_ID_REGEX = /^gt-([^.-]+)-([^.-]+)$/;\n\n\t\t\tif ( typeof tourId !== 'string' ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst tourMatch = tourId.match( TOUR_ID_REGEX );\n\t\t\tif ( !tourMatch ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst tourName = tourMatch[ 1 ];\n\t\t\tconst tourStep = tourMatch[ 2 ];\n\n\t\t\tif ( tourName.length === 0 ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tname: tourName,\n\t\t\t\tstep: tourStep,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Serializes tour information into a string\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {Object} tourInfo\n\t\t * @param {string} tourInfo.name Tour name\n\t\t * @param {number|string} tourInfo.step Tour step, which can be a string,\n\t\t * such as 'preview', or numeric, as either a string ('5') or a\n\t\t * number (5).\n\t\t *\n\t\t * @return {string|null} ID of tour, or null if invalid input\n\t\t */\n\t\tmakeTourId: function ( tourInfo ) {\n\t\t\tif ( !$.isPlainObject( tourInfo ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn 'gt-' + tourInfo.name + '-' + tourInfo.step;\n\t\t},\n\n\t\t/**\n\t\t * Launch a tour. Tours start automatically if the environment is present\n\t\t * (user string or cookie).\n\t\t *\n\t\t * However, this method allows one tour to launch another. It also allows\n\t\t * callers to launch a tour on demand.\n\t\t *\n\t\t * The tour will only be shown if allowed by the specification (see defineTour).\n\t\t *\n\t\t * It will first try loading a tour module, then fall back on an on-wiki tour.\n\t\t * This means the caller doesn't need to know how it's implemented (which could\n\t\t * change).\n\t\t *\n\t\t * launchTour is used to load the tour specified in the URL too. This case\n\t\t * does not require an extra request for an extension-defined tour since it\n\t\t * is already loaded.\n\t\t *\n\t\t * `mw.guidedTour.launcher.launchTour` should always be used over this method.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {string} tourName Name of tour\n\t\t * @param {string|null} [tourId='gt-' + tourName + '-' + step] ID of tour\n\t\t * and step. Omitted or null means to start the tour from the beginning.\n\t\t */\n\t\tlaunchTour: function ( tourName, tourId ) {\n\t\t\tinternal.loadTour( tourName ).then( () => {\n\t\t\t\tconst tour = internal.definedTours[ tourName ];\n\n\t\t\t\tif ( tour && gt.shouldShowTour( {\n\t\t\t\t\ttourName: tourName,\n\t\t\t\t\tuserState: getUserState(),\n\t\t\t\t\tpageName: mw.config.get( 'wgPageName' ),\n\t\t\t\t\tarticleId: mw.config.get( 'wgArticleId' ),\n\t\t\t\t\tcondition: tour.showConditionally,\n\t\t\t\t} ) ) {\n\t\t\t\t\tif ( tourId ) {\n\t\t\t\t\t\tshowTour( tourName, tourId );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttour.start();\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 * Attempts to launch a tour from the query string (tour parameter)\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} Whether a tour was launched\n\t\t */\n\t\tlaunchTourFromQueryString: function () {\n\t\t\tconst tourName = mw.util.getParamValue( 'tour' );\n\n\t\t\tif ( tourName !== null && tourName.length !== 0 ) {\n\t\t\t\tconst step = gt.getStepFromQuery();\n\t\t\t\tlet tourId;\n\t\t\t\tif ( step !== null && step !== '' ) {\n\t\t\t\t\ttourId = gt.makeTourId( {\n\t\t\t\t\t\tname: tourName,\n\t\t\t\t\t\tstep: step,\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\ttourId = null;\n\t\t\t\t}\n\n\t\t\t\tgt.launchTour( tourName, tourId );\n\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\t/**\n\t\t * Attempts to launch a tour from combined user state (cookie + tours launched\n\t\t * directly by server)\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} Whether a tour was launched\n\t\t */\n\t\tlaunchTourFromUserState: function () {\n\t\t\tconst state = getUserState();\n\t\t\treturn launchTourFromState( state );\n\t\t},\n\n\t\t/**\n\t\t * Attempts to automatically launch a tour based on the environment\n\t\t *\n\t\t * If the query string has a tour parameter, the method attempts to use that.\n\t\t *\n\t\t * Otherwise, the method tries to use the GuidedTour cookie. It checks which tours\n\t\t * are applicable to the current page. If more than one is, this method\n\t\t * loads the most recently started tour.\n\t\t *\n\t\t * If both fail, it does nothing.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t */\n\t\tlaunchTourFromEnvironment: function () {\n\t\t\t// Tour is either in the query string or cookie (prefer query string)\n\n\t\t\tif ( this.launchTourFromQueryString() ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.launchTourFromUserState();\n\t\t},\n\n\t\t/**\n\t\t * Sets the tour cookie, given a tour name and optionally, a step.\n\t\t *\n\t\t * You can use this when you want the tour to be displayed on a future page.\n\t\t * If there is currently no cookie, it will set the start time. This\n\t\t * will not be done if only the step is changing.\n\t\t *\n\t\t * This does not take into account isSinglePage.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {string} name Tour name\n\t\t * @param {number|string} [step=1] Tour step\n\t\t */\n\t\tsetTourCookie: function ( name, step ) {\n\t\t\tstep = step || 1;\n\n\t\t\tgt.updateUserStateForTour( {\n\t\t\t\ttourInfo: {\n\t\t\t\t\tname: name,\n\t\t\t\t\tstep: step,\n\t\t\t\t},\n\t\t\t\twasShown: false,\n\t\t\t} );\n\t\t},\n\n\t\t// TODO (mattflaschen, 2014-04-04): Cleanup and move into Tour\n\t\t/**\n\t\t * Ends the tour, removing user's state\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {string} [tourName] tour to end, defaulting to most recent one\n\t\t * that showed a guider\n\t\t */\n\t\tendTour: function ( tourName ) {\n\t\t\tif ( tourName !== undefined ) {\n\t\t\t\tremoveTourFromUserStateByName( tourName );\n\t\t\t} else {\n\t\t\t\tconst tourId = guiders._currentGuiderID;\n\t\t\t\tconst tourInfo = gt.parseTourId( tourId );\n\t\t\t\ttourName = tourInfo.name;\n\t\t\t\tconst guider = guiders._guiderById( tourId );\n\t\t\t\tgt.removeTourFromUserStateByGuider( guider );\n\t\t\t}\n\n\t\t\tconst tour = internal.definedTours[ tourName ];\n\t\t\tif ( tour.currentStep !== null ) {\n\t\t\t\ttour.currentStep.unregisterMwHooks();\n\t\t\t}\n\n\t\t\tguiders.hideAll();\n\t\t},\n\n\t\t/**\n\t\t * Hides the guider(s)\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t */\n\t\thideAll: function () {\n\t\t\tguiders.hideAll();\n\t\t},\n\n\t\t// Begin onShow bindings section\n\t\t//\n\t\t// These are used as the value of the onShow field of a step.\n\t\t// These are deprecated. To allow async API calls, they are now\n\t\t// implemented another way in mw.GuidedTour.Step, but this is a temporary\n\t\t// backwards compatibility shim.\n\t\t/**\n\t\t * Parses description as wikitext\n\t\t *\n\t\t * Add this to onShow.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t * @method\n\t\t * @deprecated\n\t\t *\n\t\t * @param {Object} guider Guider object to set description on\n\t\t */\n\t\tparseDescription: 'parseDescription is not a real function',\n\n\t\t// Do not use mw.log.deprecate for this, since there is some magic\n\t\t// in StepBuilder that accesses it to check equality.\n\t\t/**\n\t\t * Parses a wiki page and uses the HTML as the description.\n\t\t *\n\t\t * To use this, put the page name as the description, and use this as the\n\t\t * value of onShow.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t * @method\n\t\t * @deprecated\n\t\t *\n\t\t * @param {Object} guider Guider object to set description on\n\t\t */\n\t\tgetPageAsDescription: 'getPageAsDescription is not a real function',\n\n\t\t// End onShow bindings section\n\n\t\t//\n\t\t// Begin transition helpers\n\t\t//\n\t\t// These are utility functions useful in determining whether a step should\n\t\t// transition (e.g. move to a new step or hide the guider), and if so what\n\t\t// to do.\n\t\t/**\n\t\t * Checks whether user is on a particular wiki page.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {string} pageName Expected page name\n\t\t *\n\t\t * @return {boolean} true if the page name is a strict match, false otherwise\n\t\t */\n\t\tisPage: function ( pageName ) {\n\t\t\treturn mw.config.get( 'wgPageName' ) === pageName;\n\t\t},\n\n\t\t/**\n\t\t * Checks whether the query and pageName match the provided ones.\n\t\t *\n\t\t * It will return true if and only if the actual query string has all of the\n\t\t * mappings from queryParts (the actual query string may be a superset of the\n\t\t * expected), and pageName (optional) is exactly equal to wgPageName.\n\t\t *\n\t\t * If pageName is falsy, the page name will not be considered in any way.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {Object} queryParts Object mapping expected query\n\t\t * parameter names (string) to expected values (string)\n\t\t * @param {string} [pageName] Page name\n\t\t *\n\t\t * @return {boolean} true if and only if there is a match per above\n\t\t */\n\t\thasQuery: function ( queryParts, pageName ) {\n\t\t\tlet qname;\n\n\t\t\tif ( pageName && mw.config.get( 'wgPageName' ) !== pageName ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor ( qname in queryParts ) {\n\t\t\t\tif ( mw.util.getParamValue( qname ) !== queryParts[ qname ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Checks if the user is editing, with either wikitext or the\n\t\t * VisualEditor. Does not include previewing.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} true if and only if they are actively editing\n\t\t */\n\t\tisEditing: function () {\n\t\t\treturn gt.isEditingWithWikitext() || gt.isEditingWithVisualEditor();\n\t\t},\n\n\t\t/**\n\t\t * Checks if the user is editing with wikitext. Does not include previewing.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} true if and only if they are on the edit action\n\t\t */\n\t\tisEditingWithWikitext: function () {\n\t\t\treturn mw.config.get( 'wgAction' ) === 'edit';\n\t\t},\n\n\t\t/**\n\t\t * Checks if the user is editing with VisualEditor. This is only true if\n\t\t * the surface is actually open for edits.\n\t\t *\n\t\t * Use isVisualEditorOpen instead if you want to check if there is a\n\t\t * VisualEditor instance on the page.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t * @see mw.guidedTour#isVisualEditorOpen\n\t\t *\n\t\t * @return {boolean} true if and only if they are actively editing with VisualEditor\n\t\t */\n\t\tisEditingWithVisualEditor: function () {\n\t\t\treturn $( '.ve-ce-documentNode[contenteditable=\"true\"]' ).length > 0;\n\t\t},\n\n\t\t/**\n\t\t * Checks whether VisualEditor is open\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} true if and only if there is a VisualEditor instance\n\t\t * on the page\n\t\t */\n\t\tisVisualEditorOpen: function () {\n\t\t\treturn typeof ve !== 'undefined' && ve.instances && ve.instances.length > 0;\n\t\t},\n\n\t\t// TODO: Doesn't currently detect reviewing with VE\n\t\t/**\n\t\t * Checks whether the user is previewing or reviewing changes\n\t\t * (after clicking \"Show changes\")\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} true if and only if they are reviewing\n\t\t */\n\t\tisReviewing: function () {\n\t\t\treturn gt.isReviewingWithWikitext();\n\t\t},\n\n\t\t/**\n\t\t * Checks whether the user is previewing or reviewing wikitext changes\n\t\t * (the latter meaning the screen after clicking \"Show changes\")\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} true if and only if they are reviewing wikitext\n\t\t */\n\t\tisReviewingWithWikitext: function () {\n\t\t\treturn mw.config.get( 'wgAction' ) === 'submit';\n\t\t},\n\n\t\t/**\n\t\t * Checks whether the user just saved an edit.\n\t\t *\n\t\t * You can also handle the 'postEdit' mw.hook in a\n\t\t * mw.guidedTour.StepBuilder#transition handler.\n\t\t *\n\t\t * This method is not necessary if post-edit is the only\n\t\t * criterion for the transition.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @return {boolean} true if they just saved an edit, false otherwise\n\t\t */\n\t\tisPostEdit: function () {\n\t\t\treturn isPostEdit;\n\t\t},\n\n\t\t// End transition helpers\n\n\t\t/**\n\t\t * Gets step of tour from querystring\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @return {string} Step\n\t\t */\n\t\tgetStepFromQuery: function () {\n\t\t\treturn mw.util.getParamValue( 'step' );\n\t\t},\n\n\t\t/**\n\t\t * Resumes a loaded tour, specifying a tour and (optionally) a step.\n\t\t *\n\t\t * If no step is provided, it will first try to get a step from the URL.\n\t\t *\n\t\t * If that fails, it will try to resume from the cookie.\n\t\t *\n\t\t * Finally, it will default to step 1.\n\t\t *\n\t\t * @memberof mw.guidedTour#\n\t\t *\n\t\t * @param {string} tourName Tour name\n\t\t * @param {number|string} [step] Step, defaulting to the cookie or first step of tour.\n\t\t */\n\t\tresumeTour: function ( tourName, step ) {\n\t\t\tif ( step === undefined ) {\n\t\t\t\tstep = gt.getStepFromQuery() || 0;\n\t\t\t}\n\n\t\t\tconst userState = getUserState();\n\t\t\tif ( ( step === 0 ) && userState.tours[ tourName ] !== undefined ) {\n\t\t\t\t// start from user state position\n\t\t\t\tshowTour( tourName, gt.makeTourId( {\n\t\t\t\t\tname: tourName,\n\t\t\t\t\tstep: userState.tours[ tourName ].step,\n\t\t\t\t} ) );\n\t\t\t}\n\n\t\t\tif ( step === 0 ) {\n\t\t\t\tstep = 1;\n\t\t\t}\n\t\t\t// start from step specified\n\t\t\tshowTour( tourName, gt.makeTourId( {\n\t\t\t\tname: tourName,\n\t\t\t\tstep: step,\n\t\t\t} ) );\n\t\t},\n\n\t\t/**\n\t\t * Removes the tour cookie for a given guider.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {Object} guider any guider from the tour\n\t\t */\n\t\tremoveTourFromUserStateByGuider: function ( guider ) {\n\t\t\tconst tourInfo = gt.parseTourId( guider.id );\n\t\t\tif ( tourInfo !== null ) {\n\t\t\t\tremoveTourFromUserStateByName( tourInfo.name );\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates a single tour in the user cookie state. The tour must already be loaded.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {Object} args keyword arguments\n\t\t * @param {Object} args.tourInfo tour info object with name and step\n\t\t * @param {boolean} args.wasShown true if the guider was actually just shown on the\n\t\t * current page, false otherwise. Certain fields can only be initialized on a\n\t\t * page where it was shown.\n\t\t */\n\t\tupdateUserStateForTour: function ( args ) {\n\t\t\tconst cookieState = getCookieState();\n\n\t\t\tconst tourName = args.tourInfo.name;\n\t\t\t// It should be defined, except when wasShown is false.\n\t\t\tconst tourSpec = internal.definedTours[ tourName ] || {};\n\n\t\t\t// Ensure there's a sub-object for this tour\n\t\t\tif ( cookieState.tours[ tourName ] === undefined ) {\n\t\t\t\tcookieState.tours[ tourName ] = {};\n\n\t\t\t\tcookieState.tours[ tourName ].startTime = Date.now();\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\targs.wasShown && tourSpec.showConditionally === 'stickToFirstPage' &&\n\t\t\t\tcookieState.tours[ tourName ].firstArticleId === undefined &&\n\t\t\t\tcookieState.tours[ tourName ].firstSpecialPageName === undefined\n\t\t\t) {\n\t\t\t\tconst articleId = mw.config.get( 'wgArticleId' );\n\t\t\t\tif ( articleId !== 0 ) {\n\t\t\t\t\tcookieState.tours[ tourName ].firstArticleId = articleId;\n\t\t\t\t} else {\n\t\t\t\t\tconst pageName = mw.config.get( 'wgPageName' );\n\t\t\t\t\tcookieState.tours[ tourName ].firstSpecialPageName = pageName;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcookieState.tours[ tourName ].step = String( args.tourInfo.step );\n\t\t\tconst cookieValue = JSON.stringify( cookieState );\n\t\t\tmw.cookie.set( cookieName, cookieValue, cookieParams );\n\t\t},\n\n\t\t// Below are exposed for unit testing only, and should be considered\n\t\t// private\n\t\t/**\n\t\t * Returns cookie configuration, for testing only.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @return {Object} cookie configuration\n\t\t */\n\t\tgetCookieConfiguration: function () {\n\t\t\treturn {\n\t\t\t\tname: cookieName,\n\t\t\t\tparameters: cookieParams,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Determines whether to show a given tour, given the name, full cookie\n\t\t * value, and condition specified in the tour definition.\n\t\t *\n\t\t * Exposed only for testing.\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {Object} args arguments\n\t\t * @param {string} args.tourName name of tour\n\t\t * @param {Object} args.userState full value of tour cookie, not null\n\t\t * @param {string} args.pageName current full page name (wgPageName format)\n\t\t * @param {string} args.articleId current article ID\n\t\t * @param {string} [args.condition] showIf condition specified in tour definition, if any\n\t\t * See mw.guidedTour.TourBuilder#constructor for usage\n\t\t *\n\t\t * @return {boolean} true to show, false otherwise\n\t\t * @throws {mw.guidedTour.TourDefinitionError} On invalid conditions\n\t\t */\n\t\tshouldShowTour: function ( args ) {\n\t\t\tconst subState = args.userState.tours[ args.tourName ];\n\t\t\tif ( args.condition !== undefined ) {\n\t\t\t\t// TODO (mattflaschen, 2013-07-09): Allow having multiple\n\t\t\t\t// conditions ANDed together in an array.\n\t\t\t\tswitch ( args.condition ) {\n\t\t\t\t\tcase 'stickToFirstPage':\n\t\t\t\t\t\tif ( subState === undefined ) {\n\t\t\t\t\t\t\t// Not yet shown\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( subState.firstArticleId !== undefined ) {\n\t\t\t\t\t\t\treturn subState.firstArticleId === args.articleId;\n\t\t\t\t\t\t} else if ( subState.firstSpecialPageName !== undefined ) {\n\t\t\t\t\t\t\treturn subState.firstSpecialPageName === args.pageName;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'wikitext':\n\t\t\t\t\t\t// Any screen that is *not* VisualEditor-specific\n\t\t\t\t\t\t// Reading, history, wikitext-specific screens, etc.\n\t\t\t\t\t\treturn !gt.isVisualEditorOpen();\n\t\t\t\t\tcase 'VisualEditor':\n\t\t\t\t\t\t// Any screen that is *not* wikitext-specific\n\t\t\t\t\t\t// Reading, history, VisualEditor screen, etc.\n\t\t\t\t\t\treturn !gt.isEditingWithWikitext() && !gt.isReviewingWithWikitext();\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new gt.TourDefinitionError( '\\'' + args.condition + '\\' is not a supported condition' );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// No conditions or inconsistent cookie data\n\t\t\treturn true;\n\t\t},\n\t} );\n\n\t/**\n\t * Creates a tour based on an object specifying it, but does not show\n\t * it immediately\n\t *\n\t * mw.guidedTour.Tour#constructor has details on tourSpec.name,\n\t * tourSpec.isSinglePage, and tourSpec.showConditionally.\n\t *\n\t * @method defineTour\n\t * @memberof mw.guidedTour#\n\t *\n\t * @param {Object} tourSpec object specifying tour\n\t * @param {Array} tourSpec.steps Array of steps; see\n\t * mw.guidedTour.TourBuilder#step. In addition, the following\n\t * option is supported only through defineTour.\n\t * @param {Function} [tourSpec.steps.shouldSkip] Function returning a\n\t * boolean, which specifies whether to skip the current step based on the\n\t * page state\n\t * @param {boolean} tourSpec.steps.shouldSkip.return true to skip, false\n\t * otherwise\n\t *\n\t * @return {mw.guidedTour.TourBuilder} the builder used to create the tour\n\t * @throws {mw.guidedTour.TourDefinitionError} On invalid input\n\t */\n\tgt.defineTour = function ( tourSpec ) {\n\t\tconst stepBuilders = [];\n\t\tlet stepCount = null, steps = null;\n\n\t\t/**\n\t\t * Prepares a stepSpec for being passed to firstStep or step\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {number} index 0-based index in step array for step to convert\n\t\t * @param {Object} stepSpec Specification\n\t\t *\n\t\t * @return {Object} Augmented object\n\t\t */\n\t\tfunction convertStepSpec( index, stepSpec ) {\n\t\t\treturn $.extend( true, {\n\t\t\t\tname: ( index + 1 ).toString(),\n\t\t\t\tallowAutomaticNext: false,\n\t\t\t}, stepSpec );\n\t\t}\n\n\t\t/**\n\t\t * Follows the chain of shouldSkip through the steps, and returns the\n\t\t * resulting StepBuilder, mw.guidedTour.TransitionAction#hide (if the last\n\t\t * shouldSkip returns true), or undefined\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {number} skipStartIndex 0-based index of the step to start at\n\t\t * @param {number} delta +1 for moving forwards, -1 for moving backwards\n\t\t *\n\t\t * @return {mw.guidedTour.StepBuilder|mw.guidedTour.TransitionAction|undefined}\n\t\t * next step, hide (if the tour should be hidden for now), or undefined\n\t\t * for no change\n\t\t */\n\t\tfunction followShouldSkip( skipStartIndex, delta ) {\n\t\t\tlet skipIndex = skipStartIndex;\n\n\t\t\twhile ( skipIndex >= 0 &&\n\t\t\t\tskipIndex < stepCount &&\n\t\t\t\tsteps[ skipIndex ].shouldSkip &&\n\t\t\t\tsteps[ skipIndex ].shouldSkip() ) {\n\n\t\t\t\tskipIndex += delta;\n\t\t\t}\n\n\t\t\tif ( skipIndex === skipStartIndex ) {\n\t\t\t\t// No change, so don't skip\n\t\t\t\treturn undefined;\n\t\t\t} else if ( skipIndex >= 0 && skipIndex < stepCount ) {\n\t\t\t\treturn stepBuilders[ skipIndex ];\n\t\t\t} else {\n\t\t\t\t// Skipped past the end\n\t\t\t\treturn gt.TransitionAction.HIDE;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Gets a transition callback for the given start index\n\t\t *\n\t\t * @private\n\t\t *\n\t\t * @param {number} startIndex 0-based index of step to convert\n\t\t *\n\t\t * @return {Function} Handler that returns the target after skipping\n\t\t */\n\t\tfunction getTransitionHandler( startIndex ) {\n\t\t\treturn function ( event ) {\n\t\t\t\tlet delta = 1;\n\t\t\t\tif ( event.type === gt.TransitionEvent.BUILTIN && event.subtype === gt.TransitionEvent.TRANSITION_BACK ) {\n\t\t\t\t\tdelta = -1;\n\t\t\t\t}\n\t\t\t\treturn followShouldSkip( startIndex, delta );\n\t\t\t};\n\t\t}\n\n\t\tif ( arguments.length !== 1 ) {\n\t\t\t// Object itself is checked in TourBuilder.\n\t\t\tthrow new gt.TourDefinitionError( 'Check your syntax. There must be exactly one argument, \\'tourSpec\\', which must be an object.' );\n\t\t}\n\n\t\tconst tourBuilder = new gt.TourBuilder( tourSpec );\n\n\t\tsteps = tourSpec.steps;\n\t\tif ( !Array.isArray( steps ) || steps.length < 1 ) {\n\t\t\tthrow new gt.TourDefinitionError( '\\'tourSpec.steps\\' must be an array, a list of one or more steps.' );\n\t\t}\n\n\t\tstepCount = steps.length;\n\n\t\tstepBuilders[ 0 ] = tourBuilder.firstStep(\n\t\t\tconvertStepSpec( 0, tourSpec.steps[ 0 ] ),\n\t\t);\n\n\t\tfor ( let i = 1; i < stepCount; i++ ) {\n\t\t\tstepBuilders[ i ] = tourBuilder.step(\n\t\t\t\tconvertStepSpec( i, steps[ i ] ),\n\t\t\t);\n\t\t}\n\n\t\tfor ( let j = 0; j < stepCount; j++ ) {\n\t\t\tif ( j < stepCount - 1 ) {\n\t\t\t\tstepBuilders[ j ].next( stepBuilders[ j + 1 ] );\n\t\t\t}\n\t\t\tif ( j > 0 ) {\n\t\t\t\tstepBuilders[ j ].back( stepBuilders[ j - 1 ] );\n\t\t\t}\n\n\t\t\t// Don't register a custom skip handler if it can never skip.\n\t\t\tif ( steps[ j ].shouldSkip ) {\n\t\t\t\tstepBuilders[ j ].transition( getTransitionHandler( j ) );\n\t\t\t}\n\t\t}\n\n\t\treturn tourBuilder;\n\t};\n\n\t/**\n\t * @class mw.guidedTour.TourDefinitionError\n\t * @classdesc Error subclass for errors that occur during tour definition\n\t * @extends Error\n\t *\n\t * @constructor\n\t * @param {string} message Error message text\n\t */\n\tgt.TourDefinitionError = function ( message ) {\n\t\tthis.message = message;\n\t};\n\n\tgt.TourDefinitionError.prototype.toString = function () {\n\t\treturn 'TourDefinitionError: ' + this.message;\n\t};\n\tgt.TourDefinitionError.prototype.constructor = gt.TourDefinitionError;\n\n\t/**\n\t * @class mw.guidedTour.IllegalArgumentError\n\t * @classdesc Error subclass for invalid arguments (that are not part of tour definition)\n\t * @extends Error\n\t *\n\t * @constructor\n\t * @param {string} message Error message text\n\t */\n\tgt.IllegalArgumentError = function ( message ) {\n\t\tthis.message = message;\n\t};\n\n\tgt.IllegalArgumentError.prototype.toString = function () {\n\t\treturn 'IllegalArgumentError: ' + this.message;\n\t};\n\tgt.IllegalArgumentError.prototype.constructor = gt.IllegalArgumentError;\n\n\tinitialize();\n}( mw.libs.guiders ) );\n","usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/mediawiki.libs.guiders/mediawiki.libs.guiders.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":386,"column":17,"nodeType":"CallExpression","endLine":386,"endColumn":64},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Positional selector extensions are not allowed","line":445,"column":17,"nodeType":"CallExpression","endLine":445,"endColumn":65},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":744,"column":3,"nodeType":"CallExpression","endLine":744,"endColumn":25}],"suppressedMessages":[{"ruleId":"no-script-url","severity":2,"message":"Script URL is a form of eval.","line":102,"column":38,"nodeType":"Literal","messageId":"unexpectedScriptURL","endLine":102,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/variable-pattern","severity":2,"message":"jQuery collection names must match the variablePattern","line":158,"column":5,"nodeType":"AssignmentExpression","endLine":160,"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":178,"column":5,"nodeType":"CallExpression","endLine":178,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeIn","line":478,"column":3,"nodeType":"CallExpression","endLine":478,"endColumn":42,"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":481,"column":5,"nodeType":"CallExpression","endLine":481,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeOut","line":489,"column":3,"nodeType":"CallExpression","endLine":489,"endColumn":43,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-parse-html-literal","severity":2,"message":"Prefer DOM building to parsing HTML literals","line":496,"column":4,"nodeType":"CallExpression","endLine":496,"endColumn":36,"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":533,"column":3,"nodeType":"CallExpression","endLine":533,"endColumn":50,"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":595,"column":4,"nodeType":"CallExpression","endLine":595,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/variable-pattern","severity":2,"message":"jQuery collection names must match the variablePattern","line":694,"column":3,"nodeType":"AssignmentExpression","endLine":694,"endColumn":33,"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":697,"column":4,"nodeType":"CallExpression","endLine":697,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-fade","severity":2,"message":"Prefer CSS transitions to .fadeOut","line":753,"column":3,"nodeType":"CallExpression","endLine":753,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"// TODO (mattflaschen, 2013-07-30): Remove these after the following are resolved:\n// * Script URL, we need to determine the replacement, either a wrapper of the onclick that\n// calls preventDefault, or another element with no default.\n/*!\n * guiders.js\n *\n * Developed by Jeff Pickhardt (jeff+pickhardt@optimizely.com) at Optimizely. (www.optimizely.com)\n * We make A/B testing you'll actually use.\n *\n * Released under the Apache License 2.0.\n * www.apache.org/licenses/LICENSE-2.0.html\n *\n * Questions about Optimizely should be sent to:\n * sales@optimizely.com or support@optimizely.com\n *\n * Further developed by the Growth Team at Wikimedia.\n *\n * Enjoy!\n *\n * Changes:\n *\n * - initGuider(): Allows for initializing Guiders without actually creating them (useful when guider is not in the DOM yet. Avoids error: base is null [Break On This Error] var top = base.top;\n *\n * - overlay \"error\": If not set to true, this defines the class of the overlay. (This is useful for coloring the background of the overlay red on error.\n * - onShow: If this returns a guider object, then it can shunt (skip) the rest of show()\n *\n * See https://www.mediawiki.org/wiki/Extension:GuidedTour and https://phabricator.wikimedia.org/diffusion/EGTO/\n *\n * Previously, there was a MediaWiki-specific repository for\n * Guiders (based on the upstream one). For earlier version control history, see\n * https://phabricator.wikimedia.org/diffusion/EGTG/history/\n */\n\n/**\n * @classdesc Code for rendering and low-level code of moving between steps.\n *\n * You should use the public mw.guidedTour API when possible, rather then calling methods\n * from this file directly. The API of this file will change.\n *\n * @author jeff+pickhardt@optimizely.com\n * @author mflaschen@wikimedia.org\n * @author tychay@php.net\n *\n * @class mw.libs.guiders\n * @singleton\n */\nmw.libs.guiders = ( function () {\n\tconst guiders = {};\n\n\tguiders._defaultSettings = {\n\t\tattachTo: null, // Selector of the element to attach to.\n\t\tautoFocus: false, // Determines whether or not the browser scrolls to the element.\n\t\tbuttons: [],\n\t\tbuttonCustomHTML: '',\n\t\tclassString: null,\n\t\tcloseOnEscape: false,\n\t\tcloseOnClickOutside: false,\n\t\tdescription: '',\n\t\t// If guider would go off screen to the left or right, flip horizontally.\n\t\t// If guider would go off the top of the screen, flip vertically. If it would go off the bottom of the screen do nothing, since most pages scroll in the vertical direction.\n\t\t// It will be flipped both ways if it would be off-screen on two sides.\n\t\tflipToKeepOnScreen: false,\n\t\toffset: {\n\t\t\ttop: null,\n\t\t\tleft: null,\n\t\t},\n\t\t// Function taking three arguments, the guider, a legacy boolean for close\n\t\t// type (false for text close button, true for everything else), and a text\n\t\t// string for closeMethod ('xButton', 'escapeKey', 'clickOutside')\n\t\tonClose: null,\n\t\tonHide: null,\n\t\tonShow: null,\n\t\toverlay: false,\n\n\t\t// 1-12 follows an analog clock, 0 means centered. You can also use the string positions\n\t\t// listed below at guiders._offsetNameMapping, such as \"topRight\".\n\t\tposition: 0,\n\t\ttitle: '',\n\t\twidth: 400,\n\t\txButton: false, // this places a closer \"x\" button in the top right of the guider\n\t};\n\n\tguiders._htmlSkeleton = [\n\t\t'<div class=\"guider\">',\n\t\t' <div class=\"guider_content\">',\n\t\t' <h1 class=\"guider_title\"></h1>',\n\t\t' <div class=\"guider_close\"></div>',\n\t\t' <p class=\"guider_description\"></p>',\n\t\t' <div class=\"guider_buttons\"></div>',\n\t\t' </div>',\n\t\t' <div class=\"guider_arrow\">',\n\t\t' <div class=\"guider_arrow_inner_container\">',\n\t\t' <div class=\"guider_arrow_inner\"></div>',\n\t\t' </div>',\n\t\t' </div>',\n\t\t'</div>',\n\t].join( '' );\n\n\tguiders._arrowSize = 42; // This is the arrow's width and height.\n\tguiders._buttonElement = '<button></button>';\n\t// eslint-disable-next-line no-script-url\n\tguiders._buttonAttributes = { href: 'javascript:void(0);' };\n\tguiders._buttonClass = 'cdx-button';\n\tguiders._currentGuiderID = null;\n\tguiders._guiderInits = {}; // stores uncreated guiders indexed by id\n\tguiders._guiders = {}; // stores created guiders indexed by id\n\tguiders._lastCreatedGuiderID = null;\n\tguiders._scrollDuration = 750; // In milliseconds\n\n\t// See position above in guiders._defaultSettings\n\tguiders._offsetNameMapping = {\n\t\ttopLeft: 11,\n\t\ttop: 12,\n\t\ttopRight: 1,\n\t\trightTop: 2,\n\t\tright: 3,\n\t\trightBottom: 4,\n\t\tbottomRight: 5,\n\t\tbottom: 6,\n\t\tbottomLeft: 7,\n\t\tleftBottom: 8,\n\t\tleft: 9,\n\t\tleftTop: 10,\n\t};\n\tguiders._windowHeight = 0;\n\n\t// Handles a user-initiated close action (e.g. clicking close or hitting ESC)\n\t// isAlternativeClose is false for the text Close button, and true for everything else.\n\tguiders.handleOnClose = function ( myGuider, isAlternativeClose, closeMethod ) {\n\t\tif ( myGuider.onClose ) {\n\t\t\tmyGuider.onClose( myGuider, isAlternativeClose, closeMethod );\n\t\t}\n\n\t\tguiders.hideAll();\n\t};\n\n\tguiders._makeButtonListener = function ( onclickCallback ) {\n\t\treturn function ( evt ) {\n\t\t\tevt.preventDefault();\n\t\t\tonclickCallback.call( this, evt );\n\t\t};\n\t};\n\n\tguiders._addButtons = function ( myGuider ) {\n\t\t// Add buttons\n\t\tconst guiderButtonsContainer = myGuider.elem.find( '.guider_buttons' );\n\n\t\tif ( myGuider.buttons === null || myGuider.buttons.length === 0 ) {\n\t\t\tguiderButtonsContainer.remove();\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( let i = myGuider.buttons.length - 1; i >= 0; i-- ) {\n\t\t\tconst thisButton = myGuider.buttons[ i ];\n\t\t\tlet thisButtonHtml;\n\t\t\tif ( thisButton.hasIcon ) {\n\t\t\t\t// eslint-disable-next-line no-jquery/variable-pattern\n\t\t\t\tthisButtonHtml = $( '<span>' )\n\t\t\t\t\t.addClass( 'guider_button_icon' )\n\t\t\t\t\t.attr( 'aria-label', thisButton.name );\n\t\t\t} else {\n\t\t\t\tthisButtonHtml = thisButton.name;\n\t\t\t}\n\t\t\tconst $thisButtonElem = $(\n\t\t\t\tthisButton.buttonElement || guiders._buttonElement,\n\t\t\t\tObject.assign(\n\t\t\t\t\t{\n\t\t\t\t\t\tclass: guiders._buttonClass,\n\t\t\t\t\t\thtml: thisButtonHtml,\n\t\t\t\t\t},\n\t\t\t\t\tguiders._buttonAttributes,\n\t\t\t\t\tthisButton.html || {},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif ( typeof thisButton.classString !== 'undefined' && thisButton.classString !== null ) {\n\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\t$thisButtonElem.addClass( thisButton.classString );\n\t\t\t}\n\n\t\t\tguiderButtonsContainer.append( $thisButtonElem );\n\n\t\t\tif ( thisButton.onclick ) {\n\t\t\t\t$thisButtonElem.on( 'click', guiders._makeButtonListener( thisButton.onclick ) );\n\t\t\t}\n\t\t}\n\n\t\tif ( myGuider.buttonCustomHTML !== '' ) {\n\t\t\tconst $myCustomHTML = $( myGuider.buttonCustomHTML );\n\t\t\tmyGuider.elem.find( '.guider_buttons' ).append( $myCustomHTML );\n\t\t}\n\n\t\tif ( myGuider.buttons.length === 0 ) {\n\t\t\tguiderButtonsContainer.remove();\n\t\t}\n\t};\n\n\tguiders._addXButton = function ( myGuider ) {\n\t\tconst xButtonContainer = myGuider.elem.find( '.guider_close' );\n\t\tlet $xButton = $( '<button>' ).attr( {\n\t\t\tclass: 'cdx-button cdx-button--icon-only cdx-button--weight-quiet',\n\t\t\t'aria-label': mw.msg( 'guidedtour-close-button' ),\n\t\t} );\n\t\t$xButton = $xButton.append( $( '<span>' ).attr( { class: 'cdx-button__icon x_button__icon' } ) );\n\t\txButtonContainer.append( $xButton );\n\t\t$xButton.on( {\n\t\t\tclick: function () {\n\t\t\t\tguiders.handleOnClose( myGuider, true, 'xButton' );\n\t\t\t},\n\t\t} );\n\t};\n\n\tguiders._wireEscape = function ( myGuider ) {\n\t\t$( document ).on( 'keydown', ( event ) => {\n\t\t\tif ( event.keyCode === 27 || event.which === 27 ) {\n\t\t\t\tguiders.handleOnClose( myGuider, true, 'escapeKey' /* close by escape key */ );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t};\n\n\t// myGuider is passed though it's not currently used.\n\tguiders._unWireEscape = function ( /* myGuider */ ) {\n\t\t$( document ).off( 'keydown' );\n\t};\n\n\tguiders._wireClickOutside = function ( myGuider ) {\n\t\t$( document ).on( 'click.guiders', ( event ) => {\n\t\t\tif ( $( event.target ).closest( '.guider' ).length === 0 ) {\n\t\t\t\tguiders.handleOnClose( myGuider, true, 'clickOutside' /* close by clicking outside */ );\n\t\t\t\tif ( event.target.id === 'guider_overlay' ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t};\n\n\tguiders._unWireClickOutside = function () {\n\t\t$( document ).off( 'click.guiders' );\n\t};\n\n\t/**\n\t * Flips a position horizontally, vertically, both, or not all. This can be used\n\t * for various scenarios, such as handling right-to-left languages and flipping a position\n\t * if the original one would go off screen.\n\t *\n\t * It accepts both string (e.g. \"top\") and numeric (e.g. 12) positions.\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method getFlippedPosition\n\t * @param {string|number} position position as in guider settings object\n\t * @param {Object} options how to flip\n\t * @param {boolean} options.vertical true to flip vertical (optional, defaults false)\n\t * @param {boolean} options.horizontal true to flip vertical (optional, defaults false)\n\t * @return {number} position with requested flippings in numeric form\n\t */\n\tguiders.getFlippedPosition = function ( position, options ) {\n\t\tconst TOP_CLOCK = 12, HALF_CLOCK = 6;\n\n\t\tif ( !options.horizontal && !options.vertical ) {\n\t\t\treturn position;\n\t\t}\n\n\t\t// Convert to numeric if needed\n\t\tif ( guiders._offsetNameMapping[ position ] !== undefined ) {\n\t\t\tposition = guiders._offsetNameMapping[ position ];\n\t\t}\n\n\t\tposition = Number( position );\n\n\t\tif ( position === 0 ) {\n\t\t\t// Don't change center position.\n\t\t\treturn position;\n\t\t}\n\n\t\t// This math is all based on the analog clock model used for guiders positioning.\n\t\tif ( options.horizontal && !options.vertical ) {\n\t\t\tposition = TOP_CLOCK - position;\n\t\t} else if ( options.vertical && !options.horizontal ) {\n\t\t\tposition = HALF_CLOCK - position;\n\t\t} else if ( options.vertical && options.horizontal ) {\n\t\t\tposition = position + HALF_CLOCK;\n\t\t}\n\n\t\tif ( position < 1 ) {\n\t\t\tposition += TOP_CLOCK;\n\t\t} else if ( position > TOP_CLOCK ) {\n\t\t\tposition -= TOP_CLOCK;\n\t\t}\n\n\t\treturn position;\n\t};\n\n\t/**\n\t * Returns CSS for attaching a guider to its associated element\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method _getAttachCss\n\t * @param {jQuery} attachTo element to attach to\n\t * @param {Object} guider guider object\n\t * @param {number} position position for guider, using clock\n\t * model (0-12).\n\t * @return {Object} CSS properties for the attachment\n\t */\n\tguiders._getAttachCss = function ( attachTo, guider, position ) {\n\t\tconst myHeight = guider.elem.innerHeight();\n\t\tconst myWidth = guider.elem.innerWidth();\n\n\t\tif ( position === 0 ) {\n\t\t\t// The guider is positioned in the center of the screen.\n\t\t\treturn {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: ( $( window ).height() - myHeight ) / 3 + 'px',\n\t\t\t\tleft: ( $( window ).width() - myWidth ) / 2 + 'px',\n\t\t\t};\n\t\t}\n\n\t\t// Otherwise, the guider is positioned relative to the attachTo element.\n\t\tconst base = attachTo.offset();\n\t\tlet top = base.top;\n\t\tlet left = base.left;\n\n\t\t// topMarginOfBody corrects positioning if body has a top margin set on it.\n\t\tconst topMarginOfBody = $( 'body' ).outerHeight( true ) - $( 'body' ).outerHeight( false );\n\t\ttop -= topMarginOfBody;\n\n\t\tconst attachToHeight = attachTo.innerHeight();\n\t\tconst attachToWidth = attachTo.innerWidth();\n\n\t\tconst bufferOffset = 0.9 * guiders._arrowSize - 10;\n\n\t\t// offsetMap follows the form: [height, width]\n\t\tconst offsetMap = {\n\t\t\t1: [ -bufferOffset - myHeight, attachToWidth - myWidth ],\n\t\t\t2: [ 0, bufferOffset + attachToWidth ],\n\t\t\t3: [ attachToHeight / 2 - myHeight / 2, bufferOffset + attachToWidth ],\n\t\t\t4: [ attachToHeight - myHeight, bufferOffset + attachToWidth ],\n\t\t\t5: [ bufferOffset + attachToHeight, attachToWidth - myWidth ],\n\t\t\t6: [ bufferOffset + attachToHeight, attachToWidth / 2 - myWidth / 2 ],\n\t\t\t7: [ bufferOffset + attachToHeight, 0 ],\n\t\t\t8: [ attachToHeight - myHeight, -myWidth - bufferOffset ],\n\t\t\t9: [ attachToHeight / 2 - myHeight / 2, -myWidth - bufferOffset ],\n\t\t\t10: [ 0, -myWidth - bufferOffset ],\n\t\t\t11: [ -bufferOffset - myHeight, 0 ],\n\t\t\t12: [ -bufferOffset - myHeight, attachToWidth / 2 - myWidth / 2 ],\n\t\t};\n\t\tconst offset = offsetMap[ position ];\n\t\ttop += offset[ 0 ];\n\t\tleft += offset[ 1 ];\n\n\t\tlet positionType = 'absolute';\n\t\t// If the element you are attaching to is position: fixed, then we will make the guider\n\t\t// position: fixed as well.\n\t\tif ( attachTo.css( 'position' ) === 'fixed' ) {\n\t\t\tpositionType = 'fixed';\n\t\t\ttop -= $( window ).scrollTop();\n\t\t\tleft -= $( window ).scrollLeft();\n\t\t}\n\n\t\t// If you specify an additional offset parameter when you create the guider, it gets added here.\n\t\tif ( guider.offset.top !== null ) {\n\t\t\ttop += guider.offset.top;\n\t\t}\n\t\tif ( guider.offset.left !== null ) {\n\t\t\tleft += guider.offset.left;\n\t\t}\n\n\t\treturn {\n\t\t\tposition: positionType,\n\t\t\ttop: parseInt( top, 10 ),\n\t\t\tleft: parseInt( left, 10 ),\n\t\t};\n\t};\n\n\t/**\n\t * Gets element to attach to, wrapped by jQuery. Filters out elements that are not\n\t * :visible, such as (such as those with display: none).\n\t *\n\t * @private\n\t *\n\t * @param {Object} guider guider being attached\n\t *\n\t * @return {jQuery|null} jQuery node for element, or null for no match\n\t */\n\tguiders._getAttachTarget = function ( guider ) {\n\t\tconst $node = $( guider.attachTo ).filter( ':visible:first' );\n\n\t\treturn $node.length > 0 ? $node : null;\n\t};\n\n\t/**\n\t * Attaches a guider\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method _attach\n\t * @param {Object} myGuider guider to attach\n\t * @return {jQuery|undefined} jQuery node for guider's element if successful,\n\t * or undefined for invalid input.\n\t */\n\tguiders._attach = function ( myGuider ) {\n\t\tif ( typeof myGuider !== 'object' ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst $attachTarget = guiders._getAttachTarget( myGuider );\n\n\t\t// We keep a local position, separate from the originally requested one.\n\t\t// We alter this locally for auto-flip and missing elements.\n\t\t//\n\t\t// However, the DOM or window size may change later, and on each attach we want to start\n\t\t// with the originally requested position as the baseline.\n\t\tlet position = $attachTarget !== null ? myGuider.position : 0;\n\n\t\tlet css = guiders._getAttachCss( $attachTarget, myGuider, position );\n\n\t\tif ( myGuider.flipToKeepOnScreen ) {\n\t\t\tconst rightOfGuider = css.left + myGuider.width;\n\t\t\tconst flipVertically = css.top < 0;\n\t\t\tconst flipHorizontally = css.left < 0 || rightOfGuider > $( 'body' ).innerWidth();\n\t\t\tif ( flipVertically || flipHorizontally ) {\n\t\t\t\tposition = guiders.getFlippedPosition( position, {\n\t\t\t\t\tvertical: flipVertically,\n\t\t\t\t\thorizontal: flipHorizontally,\n\t\t\t\t} );\n\t\t\t\tcss = guiders._getAttachCss( $attachTarget, myGuider, position );\n\t\t\t}\n\t\t}\n\n\t\tguiders._styleArrow( myGuider, position );\n\t\tguiders._setupAnimations( myGuider, position );\n\t\treturn myGuider.elem.css( css );\n\t};\n\n\t/**\n\t * Gets action button element, wrapped by jQuery. Filters out elements that are not\n\t * :visible, such as (such as those with display: none).\n\t *\n\t * @private\n\t *\n\t * @param {Object} guider guider being attached\n\t *\n\t * @return {jQuery|null} jQuery node for element, or null for no match\n\t */\n\tguiders._getActionBtnTarget = function ( guider ) {\n\t\tconst $node = $( guider.actionBtn ).filter( ':visible:first' );\n\n\t\treturn $node.length > 0 ? $node : null;\n\t};\n\n\t/**\n\t * Returns the guider by ID.\n\t *\n\t * Add check to create and grab guider from inits if it exists there.\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method _guiderById\n\t * @param {string} id id of guider\n\t * @return {Object} guider object\n\t */\n\tguiders._guiderById = function ( id ) {\n\t\tlet myGuider;\n\n\t\tif ( typeof guiders._guiders[ id ] === 'undefined' ) {\n\t\t\tif ( typeof guiders._guiderInits[ id ] === 'undefined' ) {\n\t\t\t\tthrow new Error( 'Cannot find guider with id ' + id );\n\t\t\t}\n\t\t\tmyGuider = guiders._guiderInits[ id ];\n\t\t\tguiders.createGuider( myGuider );\n\t\t\tdelete guiders._guiderInits[ id ]; // prevents recursion\n\t\t\t// fall through ...\n\t\t}\n\t\treturn guiders._guiders[ id ];\n\t};\n\n\tguiders._showOverlay = function ( overlayClass ) {\n\t\t// FIXME: Use CSS transition\n\t\t// eslint-disable-next-line no-jquery/no-fade\n\t\t$( '#guider_overlay' ).fadeIn( 'fast' ).each( function () {\n\t\t\tif ( overlayClass ) {\n\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\t$( this ).addClass( overlayClass );\n\t\t\t}\n\t\t} );\n\t};\n\n\tguiders._hideOverlay = function () {\n\t\t// FIXME: Use CSS transition\n\t\t// eslint-disable-next-line no-jquery/no-fade\n\t\t$( '#guider_overlay' ).fadeOut( 'fast' ).removeClass();\n\t};\n\n\tguiders._initializeOverlay = function () {\n\t\tif ( $( '#guider_overlay' ).length === 0 ) {\n\t\t\t// FIXME: Stop needing this to have an ID alongside the class.\n\t\t\t// eslint-disable-next-line no-jquery/no-parse-html-literal\n\t\t\t$( '<div id=\"guider_overlay\">' ).addClass( 'guider_overlay' ).hide().appendTo( 'body' );\n\t\t}\n\t};\n\n\tguiders._styleArrow = function ( myGuider, position ) {\n\t\tconst $myGuiderArrow = $( myGuider.elem.find( '.guider_arrow' ) );\n\n\t\tposition = position || 0;\n\n\t\t// Remove possible old direction.\n\t\t// Position, and thus arrow, can change on resize due to flipToKeepOnScreen\n\t\t// Also, if an element is added to or removed from the DOM, the arrow may need to change on reposition.\n\t\t//\n\t\t// If there should be an arrow, the new one will be added below.\n\t\t$myGuiderArrow.removeClass( 'guider_arrow_down guider_arrow_left guider_arrow_up guider_arrow_right' );\n\n\t\t// No arrow for center position\n\t\tif ( position === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tconst newClass = {\n\t\t\t1: 'guider_arrow_down',\n\t\t\t2: 'guider_arrow_left',\n\t\t\t3: 'guider_arrow_left',\n\t\t\t4: 'guider_arrow_left',\n\t\t\t5: 'guider_arrow_up',\n\t\t\t6: 'guider_arrow_up',\n\t\t\t7: 'guider_arrow_up',\n\t\t\t8: 'guider_arrow_right',\n\t\t\t9: 'guider_arrow_right',\n\t\t\t10: 'guider_arrow_right',\n\t\t\t11: 'guider_arrow_down',\n\t\t\t12: 'guider_arrow_down',\n\t\t};\n\n\t\t// Classes documented above\n\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t$myGuiderArrow.addClass( newClass[ position ] );\n\n\t\tconst myHeight = myGuider.elem.innerHeight();\n\t\tconst myWidth = myGuider.elem.innerWidth();\n\t\tconst arrowOffset = guiders._arrowSize / 2;\n\t\tconst positionMap = {\n\t\t\t1: [ 'right', arrowOffset ],\n\t\t\t2: [ 'top', arrowOffset ],\n\t\t\t3: [ 'top', myHeight / 2 - arrowOffset ],\n\t\t\t4: [ 'bottom', arrowOffset ],\n\t\t\t5: [ 'right', arrowOffset ],\n\t\t\t6: [ 'left', myWidth / 2 - arrowOffset ],\n\t\t\t7: [ 'left', arrowOffset ],\n\t\t\t8: [ 'bottom', arrowOffset ],\n\t\t\t9: [ 'top', myHeight / 2 - arrowOffset ],\n\t\t\t10: [ 'top', arrowOffset ],\n\t\t\t11: [ 'left', arrowOffset ],\n\t\t\t12: [ 'left', myWidth / 2 - arrowOffset ],\n\t\t};\n\t\tconst arrowPosition = positionMap[ position ];\n\t\t$myGuiderArrow.css( arrowPosition[ 0 ], arrowPosition[ 1 ] + 'px' );\n\t};\n\n\t/**\n\t * Remove all animation classes\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method _removeAnimations\n\t * @param {Object} myGuider guider to remove animations from\n\t */\n\tguiders._removeAnimations = function ( myGuider ) {\n\t\tmyGuider.elem.removeClass( 'mwe-gt-fade-in-down mwe-gt-fade-in-up mwe-gt-fade-in-left mwe-gt-fade-in-right' );\n\t};\n\n\t/**\n\t * Add appropriate animation class relative to guider position\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method _setupAnimations\n\t * @param {Object} myGuider guider to add animation class to\n\t * @param {number} position guider attachment position\n\t */\n\tguiders._setupAnimations = function ( myGuider, position ) {\n\t\tconst classMap = {\n\t\t\t1: 'mwe-gt-fade-in-down',\n\t\t\t2: 'mwe-gt-fade-in-left',\n\t\t\t3: 'mwe-gt-fade-in-left',\n\t\t\t4: 'mwe-gt-fade-in-left',\n\t\t\t5: 'mwe-gt-fade-in-up',\n\t\t\t6: 'mwe-gt-fade-in-up',\n\t\t\t7: 'mwe-gt-fade-in-up',\n\t\t\t8: 'mwe-gt-fade-in-right',\n\t\t\t9: 'mwe-gt-fade-in-right',\n\t\t\t10: 'mwe-gt-fade-in-right',\n\t\t\t11: 'mwe-gt-fade-in-down',\n\t\t\t12: 'mwe-gt-fade-in-down',\n\t\t};\n\t\tguiders._removeAnimations( myGuider );\n\t\t// Assign animation class for myGuider\n\t\tif ( position !== 0 ) {\n\t\t\t// Classes documented above\n\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\tmyGuider.elem.addClass( classMap[ position ] );\n\t\t}\n\t};\n\n\tguiders.reposition = function () {\n\t\tconst currentGuider = guiders._guiders[ guiders._currentGuiderID ];\n\t\tguiders._attach( currentGuider );\n\t};\n\n\t/**\n\t * Shows the 'next' step\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method next\n\t */\n\tguiders.next = function () {\n\t\tguiders.doStep( 'next' );\n\t};\n\n\t/**\n\t * Shows the 'back' step\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method back\n\t */\n\tguiders.back = function () {\n\t\tguiders.doStep( 'back' );\n\t};\n\n\t/**\n\t * Move the guider directionally to the corresponding step. eg. next, back\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method doStep\n\t * @param {string} direction next or back\n\t */\n\tguiders.doStep = function ( direction ) {\n\t\tlet currentGuider, moveToGuiderId, myGuider, omitHidingOverlay, actionBtn;\n\t\ttry {\n\t\t\tcurrentGuider = guiders._guiderById( guiders._currentGuiderID ); // has check to make sure guider is initialized\n\t\t} catch ( err ) {\n\t\t\treturn;\n\t\t}\n\t\tcurrentGuider.elem.data( 'locked', true );\n\n\t\tif ( currentGuider[ direction ] ) {\n\t\t\tmoveToGuiderId = currentGuider[ direction ]();\n\t\t}\n\t\tmoveToGuiderId = moveToGuiderId || null;\n\n\t\tif ( moveToGuiderId !== null && moveToGuiderId !== '' ) {\n\t\t\tmyGuider = guiders._guiderById( moveToGuiderId );\n\t\t\tomitHidingOverlay = !!myGuider.overlay;\n\t\t\tguiders.hideAll( omitHidingOverlay, true );\n\t\t\tactionBtn = guiders._getActionBtnTarget( currentGuider );\n\t\t\tif ( actionBtn !== null && actionBtn !== '' ) {\n\t\t\t\tactionBtn.click();\n\t\t\t}\n\t\t\tguiders.show( moveToGuiderId );\n\t\t}\n\t};\n\n\t/**\n\t * This stores the guider but does no work on it.\n\t * It is an alternative to createGuider() that defers the actual setup work.\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method initGuider\n\t * @param {Object} passedSettings Settings\n\t */\n\tguiders.initGuider = function ( passedSettings ) {\n\t\tif ( passedSettings === null || passedSettings === undefined ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( !passedSettings.id ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._guiderInits[ passedSettings.id ] = passedSettings;\n\t};\n\n\t/**\n\t * Creates a guider\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method createGuider\n\t * @param {Object} passedSettings settings for the guider\n\t * @return {Object} guiders singleton\n\t */\n\tguiders.createGuider = function ( passedSettings ) {\n\t\tif ( passedSettings === null || passedSettings === undefined ) {\n\t\t\tpassedSettings = {};\n\t\t}\n\n\t\t// Extend those settings with passedSettings\n\t\tconst myGuider = Object.assign( {}, guiders._defaultSettings, passedSettings );\n\t\tmyGuider.id = myGuider.id || String( Math.floor( Math.random() * 1000 ) );\n\n\t\tconst $guiderElement = $( guiders._htmlSkeleton );\n\t\t// eslint-disable-next-line no-jquery/variable-pattern\n\t\tmyGuider.elem = $guiderElement;\n\t\tif ( typeof myGuider.classString !== 'undefined' && myGuider.classString !== null ) {\n\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\tmyGuider.elem.addClass( myGuider.classString );\n\t\t}\n\t\tmyGuider.elem.css( 'width', myGuider.width + 'px' );\n\n\t\tconst $guiderTitleContainer = $guiderElement.find( '.guider_title' );\n\t\t$guiderTitleContainer.html( myGuider.title );\n\n\t\t$guiderElement.find( '.guider_description' ).html( myGuider.description );\n\n\t\tguiders._addButtons( myGuider );\n\n\t\tif ( myGuider.xButton ) {\n\t\t\tguiders._addXButton( myGuider );\n\t\t}\n\n\t\t$guiderElement.hide();\n\t\t$guiderElement.appendTo( 'body' );\n\t\t$guiderElement.attr( 'id', myGuider.id );\n\n\t\t// If a string form (e.g. 'top') was passed, convert it to numeric (e.g. 12)\n\t\t// As an alternative to the clock model, you can also use keywords to position the myGuider.\n\t\tif ( guiders._offsetNameMapping[ myGuider.position ] ) {\n\t\t\tmyGuider.position = guiders._offsetNameMapping[ myGuider.position ];\n\t\t}\n\n\t\tguiders._initializeOverlay();\n\n\t\tguiders._guiders[ myGuider.id ] = myGuider;\n\t\tguiders._lastCreatedGuiderID = myGuider.id;\n\n\t\treturn guiders;\n\t};\n\n\t/**\n\t * Hides all guiders\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method hideAll\n\t * @param {boolean|undefined} omitHidingOverlay falsy to hide overlay,\n\t * true not to change it\n\t * @param {boolean} next true if caller will immediately show another guider\n\t * in place of the one being hidden (optional, defaults false)\n\t * @return {Object} guiders singleton\n\t */\n\tguiders.hideAll = function ( omitHidingOverlay, next ) {\n\t\tnext = next || false;\n\n\t\t$( '.guider:visible' ).each( ( index, elem ) => {\n\t\t\tconst myGuider = guiders._guiderById( $( elem ).attr( 'id' ) );\n\t\t\tif ( myGuider.onHide ) {\n\t\t\t\tmyGuider.onHide( myGuider, next );\n\t\t\t}\n\t\t} );\n\t\tguiders._unWireClickOutside();\n\t\t// FIXME: Use CSS transition\n\t\t// eslint-disable-next-line no-jquery/no-fade\n\t\t$( '.guider' ).fadeOut( 'fast' );\n\t\tif ( omitHidingOverlay !== true ) {\n\t\t\tguiders._hideOverlay();\n\t\t}\n\t\treturn guiders;\n\t};\n\n\t/**\n\t * Show a guider\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method show\n\t * @param {string} id id of guider to show. The default is the last guider created.\n\t * @return {undefined|boolean|Object} Undefined in case of error, return value\n\t * from the guider's onShow, if that is truthy, otherwise the guiders\n\t * singleton.\n\t */\n\tguiders.show = function ( id ) {\n\t\tif ( !id && guiders._lastCreatedGuiderID ) {\n\t\t\tid = guiders._lastCreatedGuiderID;\n\t\t}\n\n\t\tlet myGuider;\n\t\ttry {\n\t\t\tmyGuider = guiders._guiderById( id );\n\t\t} catch ( err ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// You can use an onShow function to take some action before the guider is shown.\n\t\tif ( myGuider.onShow ) {\n\t\t\t// if onShow returns something, assume this means you want to bypass the\n\t\t\t// rest of onShow.\n\t\t\tconst showReturn = myGuider.onShow( myGuider );\n\t\t\tif ( showReturn ) {\n\t\t\t\treturn showReturn;\n\t\t\t}\n\t\t}\n\t\t// handle overlay\n\t\tif ( myGuider.overlay ) {\n\t\t\tguiders._showOverlay( myGuider.overlay );\n\t\t}\n\t\t// bind esc = close action\n\t\tif ( myGuider.closeOnEscape ) {\n\t\t\tguiders._wireEscape( myGuider );\n\t\t} else {\n\t\t\tguiders._unWireEscape( myGuider );\n\t\t}\n\n\t\tif ( myGuider.closeOnClickOutside ) {\n\t\t\tguiders._wireClickOutside( myGuider );\n\t\t}\n\n\t\tguiders._attach( myGuider );\n\t\tmyGuider.elem.fadeIn( 'fast' ).data( 'locked', false );\n\t\tguiders._currentGuiderID = id;\n\n\t\tconst windowHeight = guiders._windowHeight = $( window ).height();\n\t\tconst scrollHeight = $( window ).scrollTop();\n\n\t\t// .offset().top returns invalid value (0) when position: absolute\n\t\tconst stylePosition = myGuider.elem.css( 'position' ) ? myGuider.elem.css( 'position' ).toLowerCase() : '';\n\t\tconst guiderOffsetTop = stylePosition === 'absolute' ?\n\t\t\tparseFloat( myGuider.elem.css( 'top' ) || 0 ) : myGuider.elem.offset().top;\n\n\t\tconst guiderElemHeight = myGuider.elem.height();\n\t\tconst isGuiderBelow = ( scrollHeight + windowHeight < guiderOffsetTop + guiderElemHeight ); /* we will need to scroll down */\n\t\tconst isGuiderAbove = ( guiderOffsetTop < scrollHeight ); /* we will need to scroll up */\n\t\tif ( myGuider.autoFocus ) {\n\t\t\tif ( isGuiderBelow || isGuiderAbove ) {\n\t\t\t\t// Sometimes the browser won't scroll if the person just clicked,\n\t\t\t\t// so let's do this in a setTimeout.\n\t\t\t\tguiders._removeAnimations( myGuider );\n\t\t\t\tsetTimeout( guiders.scrollToCurrent, 10 );\n\t\t\t}\n\t\t\t$( myGuider.elem ).find( '.cdx-button--action-progressive:first-child' ).trigger( 'focus' );\n\t\t}\n\n\t\t$( myGuider.elem ).trigger( 'guiders.show' );\n\n\t\t// Create (preload) next guider if it hasn't been created\n\t\tconst nextGuiderId = myGuider.next || null;\n\t\tif ( nextGuiderId !== null && nextGuiderId !== '' ) {\n\t\t\tconst nextGuiderData = guiders._guiderInits[ nextGuiderId ];\n\t\t\tif ( nextGuiderData ) {\n\t\t\t\t// Only attach if it exists and is :visible\n\t\t\t\tconst testInDom = guiders._getAttachTarget( nextGuiderData );\n\t\t\t\tif ( testInDom !== null ) {\n\t\t\t\t\tguiders.createGuider( nextGuiderData );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn guiders;\n\t};\n\n\t/**\n\t * Scroll to the current guider\n\t *\n\t * @memberof mw.libs.guiders#\n\t * @method scrollToCurrent\n\t */\n\tguiders.scrollToCurrent = function () {\n\t\tconst currentGuider = guiders._guiders[ guiders._currentGuiderID ];\n\t\tif ( typeof currentGuider === 'undefined' ) {\n\t\t\treturn;\n\t\t}\n\t\tconst windowHeight = guiders._windowHeight;\n\t\t// scrollHeight = $( window ).scrollTop();\n\t\tconst guiderOffset = currentGuider.elem.offset();\n\t\tconst guiderElemHeight = currentGuider.elem.height();\n\n\t\t// Scroll to the guider's position.\n\t\tconst scrollToHeight = Math.round( Math.max( guiderOffset.top + ( guiderElemHeight / 2 ) - ( windowHeight / 2 ), 0 ) );\n\t\t// Basic concept from https://github.com/yckart/jquery.scrollto.js/blob/master/jquery.scrollto.js\n\t\t$( 'html, body' ).animate( {\n\t\t\tscrollTop: scrollToHeight,\n\t\t}, guiders._scrollDuration );\n\t};\n\n\t// Change the bubble position after browser gets resized\n\tlet _resizing;\n\t$( window ).on( 'resize', () => {\n\t\tif ( typeof ( _resizing ) !== 'undefined' ) {\n\t\t\tclearTimeout( _resizing ); // Prevents seizures\n\t\t}\n\t\t_resizing = setTimeout( () => {\n\t\t\t_resizing = undefined;\n\t\t\tif ( typeof ( guiders ) !== 'undefined' ) {\n\t\t\t\tguiders.reposition();\n\t\t\t}\n\t\t}, 20 );\n\t} );\n\n\t$( () => {\n\t\tguiders.reposition();\n\t} );\n\n\treturn guiders;\n} ).call( this );\n","usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tours/firstedit.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tours/firsteditve.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tours/onshow.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tours/test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/modules/tours/uprightdownleft.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"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/qunit/.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/tests/qunit/ext.guidedTour.lib.tests.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'missingNameBuilder' is assigned a value but never used.","line":621,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":621,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'numericNameBuilder' is assigned a value but never used.","line":633,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":633,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tour' is assigned a value but never used.","line":1115,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":1115,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tour' is assigned a value but never used.","line":1124,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":1124,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tour' is assigned a value but never used.","line":1133,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":1133,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"comma-dangle","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":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"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 --- $ /usr/bin/npm ci --- stderr --- npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: @wmde/eslint-config-wikimedia-typescript@0.2.13 npm ERR! Found: eslint-config-wikimedia@0.30.0 npm ERR! node_modules/eslint-config-wikimedia npm ERR! dev eslint-config-wikimedia@"0.30.0" from the root project npm ERR! npm ERR! Could not resolve dependency: npm ERR! peer eslint-config-wikimedia@"^0.29.1" from @wmde/eslint-config-wikimedia-typescript@0.2.13 npm ERR! node_modules/@wmde/eslint-config-wikimedia-typescript npm ERR! dev @wmde/eslint-config-wikimedia-typescript@"^0.2.13" from the root project npm ERR! npm ERR! Conflicting peer dependency: eslint-config-wikimedia@0.29.1 npm ERR! node_modules/eslint-config-wikimedia npm ERR! peer eslint-config-wikimedia@"^0.29.1" from @wmde/eslint-config-wikimedia-typescript@0.2.13 npm ERR! node_modules/@wmde/eslint-config-wikimedia-typescript npm ERR! dev @wmde/eslint-config-wikimedia-typescript@"^0.2.13" from the root project npm ERR! npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force or --legacy-peer-deps npm ERR! to accept an incorrect (and potentially broken) dependency resolution. npm ERR! npm ERR! npm ERR! For a full report see: npm ERR! /cache/_logs/2025-07-01T01_49_18_175Z-eresolve-report.txt npm ERR! A complete log of this run can be found in: npm ERR! /cache/_logs/2025-07-01T01_49_18_175Z-debug-0.log --- stdout --- --- end --- Traceback (most recent call last): File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 2026, in main libup.run(args.repo, args.output, args.branch) File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 1962, in run self.npm_upgrade(plan) File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 1256, in npm_upgrade self.npm_test() File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 322, in npm_test self.check_call(["npm", "ci"]) File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/shell2.py", line 63, in check_call res.check_returncode() File "/usr/lib/python3.11/subprocess.py", line 502, in check_returncode raise CalledProcessError(self.returncode, self.args, self.stdout, subprocess.CalledProcessError: Command '['/usr/bin/npm', 'ci']' returned non-zero exit status 1.