This run took 47 seconds.
$ date --- stdout --- Fri Apr 19 04:04:06 UTC 2024 --- end --- $ git clone file:///srv/git/mediawiki-extensions-PageEncryption.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 --- d4606fd761da38941bce7fedbe5a659635fbe33b refs/heads/master --- end --- $ /usr/bin/npm audit --json --- stdout --- { "auditReportVersion": 2, "vulnerabilities": { "eslint-plugin-compat": { "name": "eslint-plugin-compat", "severity": "moderate", "isDirect": false, "via": [ "semver" ], "effects": [], "range": "3.6.0-0 - 4.1.4", "nodes": [ "node_modules/eslint-plugin-compat" ], "fixAvailable": true }, "postcss": { "name": "postcss", "severity": "moderate", "isDirect": false, "via": [ { "source": 1094544, "name": "postcss", "dependency": "postcss", "title": "PostCSS line return parsing error", "url": "https://github.com/advisories/GHSA-7fh5-64p2-3v2j", "severity": "moderate", "cwe": [ "CWE-74", "CWE-144" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N" }, "range": "<8.4.31" } ], "effects": [], "range": "<8.4.31", "nodes": [ "node_modules/postcss" ], "fixAvailable": true }, "semver": { "name": "semver", "severity": "moderate", "isDirect": false, "via": [ { "source": 1096482, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": ">=7.0.0 <7.5.2" }, { "source": 1096483, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": "<5.7.2" }, { "source": 1096484, "name": "semver", "dependency": "semver", "title": "semver vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-c2qf-rxjj-qqgw", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": ">=6.0.0 <6.3.1" } ], "effects": [ "eslint-plugin-compat" ], "range": "<=5.7.1 || 6.0.0 - 6.3.0 || 7.0.0 - 7.5.1", "nodes": [ "node_modules/eslint-plugin-jsdoc/node_modules/semver", "node_modules/eslint-plugin-node/node_modules/semver", "node_modules/normalize-package-data/node_modules/semver", "node_modules/semver" ], "fixAvailable": true }, "word-wrap": { "name": "word-wrap", "severity": "moderate", "isDirect": false, "via": [ { "source": 1095091, "name": "word-wrap", "dependency": "word-wrap", "title": "word-wrap vulnerable to Regular Expression Denial of Service", "url": "https://github.com/advisories/GHSA-j8xg-fqg3-53r7", "severity": "moderate", "cwe": [ "CWE-1333" ], "cvss": { "score": 5.3, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" }, "range": "<1.2.4" } ], "effects": [], "range": "<1.2.4", "nodes": [ "node_modules/word-wrap" ], "fixAvailable": true } }, "metadata": { "vulnerabilities": { "info": 0, "low": 0, "moderate": 4, "high": 0, "critical": 0, "total": 4 }, "dependencies": { "prod": 1, "dev": 391, "optional": 0, "peer": 0, "peerOptional": 0, "total": 391 } } } --- 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: 21 installs, 0 updates, 0 removals - Locking composer/semver (3.3.2) - Locking composer/spdx-licenses (1.5.8) - Locking defuse/php-encryption (v2.4.0) - Locking mediawiki/mediawiki-codesniffer (v41.0.0) - Locking mediawiki/minus-x (1.1.1) - Locking paragonie/random_compat (v9.99.100) - Locking php-parallel-lint/php-console-color (v1.0.1) - Locking php-parallel-lint/php-console-highlighter (v1.0.0) - Locking php-parallel-lint/php-parallel-lint (v1.3.2) - Locking psr/container (2.0.2) - Locking squizlabs/php_codesniffer (3.7.2) - Locking symfony/console (v5.4.36) - Locking symfony/deprecation-contracts (v3.4.0) - Locking symfony/polyfill-ctype (v1.29.0) - Locking symfony/polyfill-intl-grapheme (v1.29.0) - Locking symfony/polyfill-intl-normalizer (v1.29.0) - Locking symfony/polyfill-mbstring (v1.29.0) - Locking symfony/polyfill-php73 (v1.29.0) - Locking symfony/polyfill-php80 (v1.29.0) - Locking symfony/service-contracts (v3.4.2) - Locking symfony/string (v6.4.4) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 21 installs, 0 updates, 0 removals 0 [>---------------------------] 0 [->--------------------------] - Installing paragonie/random_compat (v9.99.100): Extracting archive - Installing defuse/php-encryption (v2.4.0): Extracting archive - Installing symfony/polyfill-php80 (v1.29.0): Extracting archive - Installing squizlabs/php_codesniffer (3.7.2): Extracting archive - Installing symfony/polyfill-mbstring (v1.29.0): Extracting archive - Installing composer/spdx-licenses (1.5.8): Extracting archive - Installing composer/semver (3.3.2): Extracting archive - Installing mediawiki/mediawiki-codesniffer (v41.0.0): Extracting archive - Installing symfony/polyfill-intl-normalizer (v1.29.0): Extracting archive - Installing symfony/polyfill-intl-grapheme (v1.29.0): Extracting archive - Installing symfony/polyfill-ctype (v1.29.0): Extracting archive - Installing symfony/string (v6.4.4): Extracting archive - Installing psr/container (2.0.2): Extracting archive - Installing symfony/service-contracts (v3.4.2): Extracting archive - Installing symfony/polyfill-php73 (v1.29.0): Extracting archive - Installing symfony/deprecation-contracts (v3.4.0): Extracting archive - Installing symfony/console (v5.4.36): Extracting archive - Installing mediawiki/minus-x (1.1.1): Extracting archive - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive 0/21 [>---------------------------] 0% 20/21 [==========================>-] 95% 21/21 [============================] 100% 5 package suggestions were added by new dependencies, use `composer suggest` to see details. Generating autoload files 13 packages you are using are looking for funding. Use the `composer fund` command to find out more! --- stdout --- --- end --- Upgrading n:eslint-config-wikimedia from 0.24.0 -> 0.27.0 Upgrading n:grunt-banana-checker from 0.10.0 -> 0.11.1 Upgrading n:grunt-eslint from 24.0.0 -> 24.3.0 Upgrading n:grunt-stylelint from 0.18.0 -> 0.19.0 Upgrading n:stylelint-config-wikimedia from 0.14.0 -> 0.16.1 $ /usr/bin/npm install --- stderr --- npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin --- stdout --- added 427 packages, and audited 428 packages in 9s 93 packages are looking for funding run `npm fund` for details found 0 vulnerabilities --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact --- stdout --- up to date, audited 428 packages in 838ms 93 packages are looking for funding run `npm fund` for details found 0 vulnerabilities --- end --- $ package-lock-lint package-lock.json --- stdout --- Checking package-lock.json --- end --- $ ./node_modules/.bin/eslint resources/PageEncryptionPasswordValidator.js resources/PageEncryptionPassword.js resources/PageEncryptionPermissions.js gitinfo.json i18n/en.json package-lock.json extension.json composer.json i18n/qqq.json package.json Gruntfile.js --fix --- stdout --- /src/repo/resources/PageEncryptionPassword.js 25:6 error 'CookieName' is assigned a value but never used no-unused-vars 89:3 error Expected an assignment or function call and instead saw an expression no-unused-expressions 95:6 error Unexpected use of comma operator no-sequences 231:8 error 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 234:9 error 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 235:5 error Unexpected console statement no-console 235:18 error 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 249:24 error 'PageEncryptionPasswordValidator' is not defined no-undef 250:42 error 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 264:8 error Unreachable code no-unreachable 286:8 error 'password' is already defined no-redeclare 286:8 error 'password' declared on line 231 column 8 is used outside of binding context block-scoped-var 291:14 error 'password' declared on line 231 column 8 is used outside of binding context block-scoped-var 291:14 error 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 303:6 error Expected a 'break' statement before 'case' no-fallthrough 330:13 error Unexpected console statement no-console 340:10 error Unexpected console statement no-console 344:1 warning This line has a length of 101. Maximum allowed is 100 max-len 358:3 error Unreachable code no-unreachable 382:5 error Unexpected tab character no-tabs 383:5 error Unexpected tab character no-tabs 384:5 error Unexpected tab character no-tabs 411:5 error Unexpected tab character no-tabs 414:11 error 'isEncryptedNamespace' is defined but never used no-unused-vars /src/repo/resources/PageEncryptionPasswordValidator.js 18:1 warning Invalid JSDoc tag name "ingroup" jsdoc/check-tag-names 24:7 error 'PageEncryptionPasswordValidator' is assigned a value but never used no-unused-vars 25:6 error 'conf' is already defined no-redeclare 71:21 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 78:21 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 97:20 error 'str' is defined but never used no-unused-vars /src/repo/resources/PageEncryptionPermissions.js 23:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector 27:4 error navigator.clipboard() is not supported in Safari 11.1, iOS Safari 11.3-11.4 compat/compat 28:5 error Unexpected alert no-alert 37:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector 41:4 error navigator.clipboard() is not supported in Safari 11.1, iOS Safari 11.3-11.4 compat/compat 42:5 error Unexpected alert no-alert 75:3 error 'canManagePermissions' is not defined no-undef 105:8 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector ✖ 38 problems (31 errors, 7 warnings) --- end --- $ ./node_modules/.bin/eslint resources/PageEncryptionPasswordValidator.js resources/PageEncryptionPassword.js resources/PageEncryptionPermissions.js gitinfo.json i18n/en.json package-lock.json extension.json composer.json i18n/qqq.json package.json Gruntfile.js -f json --- stdout --- [{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"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/gitinfo.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":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/PageEncryptionPassword.js","messages":[{"ruleId":"no-unused-vars","severity":2,"message":"'CookieName' is assigned a value but never used.","line":25,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":16},{"ruleId":"no-unused-expressions","severity":2,"message":"Expected an assignment or function call and instead saw an expression.","line":89,"column":3,"nodeType":"ExpressionStatement","messageId":"unusedExpression","endLine":100,"endColumn":9},{"ruleId":"no-sequences","severity":2,"message":"Unexpected use of comma operator.","line":95,"column":6,"nodeType":"SequenceExpression","messageId":"unexpectedCommaExpression","endLine":95,"endColumn":7},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 286 column 8 is used outside of binding context.","line":231,"column":8,"nodeType":"Identifier","messageId":"outOfScope","endLine":231,"endColumn":16},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 286 column 8 is used outside of binding context.","line":234,"column":9,"nodeType":"Identifier","messageId":"outOfScope","endLine":234,"endColumn":17},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":235,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":235,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[6379,6427],"text":""},"desc":"Remove the console.log()."}]},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 286 column 8 is used outside of binding context.","line":235,"column":18,"nodeType":"Identifier","messageId":"outOfScope","endLine":235,"endColumn":26},{"ruleId":"no-undef","severity":2,"message":"'PageEncryptionPasswordValidator' is not defined.","line":249,"column":24,"nodeType":"Identifier","messageId":"undef","endLine":249,"endColumn":55},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 286 column 8 is used outside of binding context.","line":250,"column":42,"nodeType":"Identifier","messageId":"outOfScope","endLine":250,"endColumn":50},{"ruleId":"no-unreachable","severity":2,"message":"Unreachable code.","line":264,"column":8,"nodeType":"BreakStatement","messageId":"unreachableCode","endLine":264,"endColumn":14},{"ruleId":"no-redeclare","severity":2,"message":"'password' is already defined.","line":286,"column":8,"nodeType":"Identifier","messageId":"redeclared","endLine":286,"endColumn":16},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 231 column 8 is used outside of binding context.","line":286,"column":8,"nodeType":"Identifier","messageId":"outOfScope","endLine":286,"endColumn":16},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 231 column 8 is used outside of binding context.","line":291,"column":14,"nodeType":"Identifier","messageId":"outOfScope","endLine":291,"endColumn":22},{"ruleId":"block-scoped-var","severity":2,"message":"'password' declared on line 286 column 8 is used outside of binding context.","line":291,"column":14,"nodeType":"Identifier","messageId":"outOfScope","endLine":291,"endColumn":22},{"ruleId":"no-fallthrough","severity":2,"message":"Expected a 'break' statement before 'case'.","line":303,"column":6,"nodeType":"SwitchCase","messageId":"case","endLine":353,"endColumn":11},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":330,"column":13,"nodeType":"MemberExpression","messageId":"unexpected","endLine":330,"endColumn":24,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[8989,9029],"text":""},"desc":"Remove the console.log()."}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":340,"column":10,"nodeType":"MemberExpression","messageId":"unexpected","endLine":340,"endColumn":21,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[9204,9230],"text":""},"desc":"Remove the console.log()."}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 101. Maximum allowed is 100.","line":344,"column":1,"nodeType":"Program","messageId":"max","endLine":344,"endColumn":72},{"ruleId":"no-unreachable","severity":2,"message":"Unreachable code.","line":358,"column":3,"nodeType":"ReturnStatement","messageId":"unreachableCode","endLine":360,"endColumn":7},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":382,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":382,"endColumn":6},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":383,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":383,"endColumn":6},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":384,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":384,"endColumn":6},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":411,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":411,"endColumn":6},{"ruleId":"no-unused-vars","severity":2,"message":"'isEncryptedNamespace' is defined but never used.","line":414,"column":11,"nodeType":"Identifier","messageId":"unusedVar","endLine":414,"endColumn":31}],"suppressedMessages":[],"errorCount":23,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension PageEncryption.\n *\n * PageEncryption is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * PageEncryption is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with PageEncryption. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n$( function () {\n\tvar WindowManager;\n\tvar DialogName = 'Dialog';\n\tvar CookieName = 'pageencryption-userkey';\n\tvar Model = {};\n\tvar EncryptedNamespace = 2246;\n\tvar PasswordInputField;\n\tvar PasswordConfirmationInputField;\n\tvar MessageWidget;\n\tvar KeyRecordIsSet = mw.config.get( 'pageencryption-protected-key-isSet' );\n\tvar UserkeyCookieIsSet = mw.config.get( 'pageencryption-userkey-cookie-isSet' );\n\tvar Booklet;\n\n\t// console.log(mw.config);\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = DialogName;\n\tProcessDialog.static.title = 'PageEncryption';\n\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tfunction PageOneLayout( name, config ) {\n\t\tPageOneLayout.super.call( this, name, config );\n\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\tvar passwordInput = new OO.ui.TextInputWidget( {\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-password' ),\n\t\t\tvalue: '',\n\t\t\trequired: true,\n\t\t\ttype: 'password'\n\t\t} );\n\n\t\tPasswordInputField = new OO.ui.FieldLayout( passwordInput, {\n\t\t\tlabel: '',\n\t\t\talign: 'top'\n\t\t} );\n\n\t\tModel.passwordInput = passwordInput;\n\n\t\tvar passwordConfirmationInput = new OO.ui.TextInputWidget( {\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-password-confirmation' ),\n\t\t\tvalue: '',\n\t\t\trequired: true,\n\t\t\ttype: 'password'\n\t\t} );\n\n\t\tModel.passwordConfirmationInput = passwordConfirmationInput;\n\n\t\t( PasswordConfirmationInputField = new OO.ui.FieldLayout(\n\t\t\tpasswordConfirmationInput,\n\t\t\t{\n\t\t\t\tlabel: '',\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t) ),\n\t\t( MessageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\t// inline: true,\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-field-password' )\n\t\t} ) );\n\n\t\t// MessageWidget.toggle(false)\n\t\tfieldset.addItems( [\n\t\t\tMessageWidget,\n\n\t\t\tPasswordInputField,\n\t\t\tPasswordConfirmationInputField\n\t\t] );\n\n\t\tthis.$element.append( fieldset.$element );\n\t}\n\tOO.inheritClass( PageOneLayout, OO.ui.PageLayout );\n\tPageOneLayout.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel( 'Page One' );\n\t};\n\n\tfunction messageButton() {\n\t\tvar buttonGoBack = new OO.ui.ButtonWidget( {\n\t\t\tframed: false,\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-goback' ),\n\t\t\tclasses: [ 'pageencryption-button-goback' ]\n\t\t} );\n\n\t\tbuttonGoBack.on( 'click', function () {\n\t\t\tBooklet.setPage( 'two' );\n\n\t\t\t// MessageWidget resides on page one\n\t\t\tMessageWidget.setType( 'info' );\n\t\t\tMessageWidget.setLabel(\n\t\t\t\tmw.msg( 'pageencryption-jsmodule-dialog-field-password' )\n\t\t\t);\n\t\t} );\n\n\t\treturn new OO.ui.HtmlSnippet(\n\t\t\t$( '<span>' ).append(\n\t\t\t\tmw.msg( 'pageencryption-jsmodule-dialog-field-password-reset' ) + ' ',\n\t\t\t\tbuttonGoBack.$element\n\t\t\t)\n\t\t);\n\t}\n\n\tfunction PageTwoLayout( name, config ) {\n\t\tPageTwoLayout.super.call( this, name, config );\n\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\tvar enterPasswordInput = new OO.ui.TextInputWidget( {\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-password' ),\n\t\t\tvalue: '',\n\t\t\trequired: true,\n\t\t\ttype: 'password'\n\t\t} );\n\n\t\tvar buttonLostPassword = new OO.ui.ButtonWidget( {\n\t\t\tframed: false,\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-lost-password' ),\n\t\t\tclasses: [ 'pageencryption-button-lost-password' ]\n\t\t} );\n\n\t\tbuttonLostPassword.on( 'click', function () {\n\t\t\tBooklet.setPage( 'one' );\n\t\t\tMessageWidget.setType( 'error' );\n\t\t\tMessageWidget.setLabel( messageButton() );\n\t\t} );\n\n\t\tvar enterPasswordInputField = new OO.ui.FieldLayout( enterPasswordInput, {\n\t\t\tlabel: '',\n\t\t\talign: 'top',\n\t\t\thelpInline: true,\n\t\t\tclasses: [ 'pageencryption-field-password' ],\n\t\t\thelp: new OO.ui.HtmlSnippet( buttonLostPassword.$element )\n\t\t} );\n\n\t\tModel.enterPasswordInput = enterPasswordInput;\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: mw.msg( 'pageencryption-jsmodule-dialog-field-password-reenter' )\n\t\t} );\n\n\t\t// MessageWidget.toggle(false)\n\t\tfieldset.addItems( [ messageWidget, enterPasswordInputField ] );\n\n\t\tthis.$element.append( fieldset.$element );\n\t}\n\tOO.inheritClass( PageTwoLayout, OO.ui.PageLayout );\n\tPageTwoLayout.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel( 'Page Two' );\n\t};\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\n\t\tvar page1 = new PageOneLayout( 'one' ),\n\t\t\tpage2 = new PageTwoLayout( 'two' );\n\n\t\tBooklet = new OO.ui.BookletLayout( {\n\t\t\toutlined: false,\n\t\t\texpanded: true,\n\t\t\tshowMenu: false\n\t\t} );\n\n\t\tBooklet.addPages( [ page1, page2 ] );\n\n\t\tBooklet.setPage( !KeyRecordIsSet ? 'one' : 'two' );\n\n\t\tvar content = new OO.ui.PanelLayout( {\n\t\t\t$content: Booklet.$element,\n\t\t\tpadded: true,\n\t\t\texpanded: true\n\t\t} );\n\n\t\tthis.$body.append( content.$element );\n\t};\n\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\treturn 300;\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif ( !action || action === 'delete' ) {\n\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\n\t\t// or use Booklet.getCurrentPage().name\n\t\tif ( !KeyRecordIsSet ) {\n\t\t\tvar password = Model.passwordInput.getValue();\n\t\t\tvar passwordConfirm = Model.passwordConfirmationInput.getValue();\n\n\t\t\tif ( password !== passwordConfirm ) {\n\t\t\t\tconsole.log( password + ',' + passwordConfirm );\n\n\t\t\t\tPasswordInputField.setErrors( [] );\n\n\t\t\t\tPasswordConfirmationInputField.setErrors( [\n\t\t\t\t\tmw.msg( 'pageencryption-jsmodule-dialog-password-error-nomatch' )\n\t\t\t\t] );\n\n\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\tthis,\n\t\t\t\t\taction\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tvar validator = new PageEncryptionPasswordValidator();\n\t\t\tvar errors = validator.checkPassword( password );\n\t\t\tvar conf = validator.getConf();\n\n\t\t\tif ( errors.length ) {\n\t\t\t\tvar errorsMessages = [];\n\n\t\t\t\tfor ( var error of errors ) {\n\t\t\t\t\tvar args = [ 'pageencryption-jsmodule-dialog-password-error-' + error ];\n\t\t\t\t\tswitch ( error ) {\n\t\t\t\t\t\tcase 'length':\n\t\t\t\t\t\t\targs.push( conf.minSize );\n\t\t\t\t\t\t\targs.push( conf.maxSize );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'special':\n\t\t\t\t\t\t\targs.push( conf.specialCharacters );\n\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'prohibited':\n\t\t\t\t\t\t\targs.push( conf.prohibitedCharacters );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\terrorsMessages.push( mw.msg.apply( null, args ) );\n\t\t\t\t}\n\t\t\t\tPasswordInputField.setErrors( errorsMessages );\n\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\tthis,\n\t\t\t\t\taction\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tPasswordInputField.setErrors( [] );\n\t\t\tPasswordConfirmationInputField.setErrors( [] );\n\t\t} else {\n\t\t\tvar password = Model.enterPasswordInput.getValue();\n\t\t}\n\n\t\tvar payload = {\n\t\t\taction: 'pageencryption-set-encryption-key',\n\t\t\tpassword: password,\n\t\t\t'reset-key': Booklet.getCurrentPage().name === 'one' ? 1 : 0\n\t\t};\n\n\t\t// https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs#Action_sets\n\t\treturn ProcessDialog.super.prototype.getActionProcess\n\t\t\t.call( this, action )\n\t\t\t.first( function () {\n\t\t\t\tswitch ( action ) {\n\t\t\t\t\tcase 'save':\n\n\t\t\t\t\t// eslint-disable no-fallthrough\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\tvar callApi = function ( postData, resolve, reject ) {\n\t\t\t\t\t\t\t// console.log(\"postData\", postData);\n\n\t\t\t\t\t\t\tnew mw.Api()\n\t\t\t\t\t\t\t\t.postWithToken( 'csrf', postData )\n\t\t\t\t\t\t\t\t.done( function ( res ) {\n\t\t\t\t\t\t\t\t\t// console.log(\"res\", res);\n\t\t\t\t\t\t\t\t\tif ( !( 'pageencryption-set-encryption-key' in res ) ) {\n\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.Error( res, {\n\t\t\t\t\t\t\t\t\t\t\t\trecoverable: true,\n\t\t\t\t\t\t\t\t\t\t\t\twarning: false\n\t\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tvar value = res[ 'pageencryption-set-encryption-key' ];\n\t\t\t\t\t\t\t\t\t\tif ( value.message !== null ) {\n\t\t\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.Error( value.message, {\n\t\t\t\t\t\t\t\t\t\t\t\t\trecoverable: true,\n\t\t\t\t\t\t\t\t\t\t\t\t\twarning: false\n\t\t\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tif ( value.action === 'new-record' ) {\n\t\t\t\t\t\t\t\t\t\t\t\t// @TODO show popup\n\t\t\t\t\t\t\t\t\t\t\t\tconsole.log( value[ 'protected-key' ] );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tWindowManager.removeWindows( [ DialogName ] );\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// resolve();\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.fail( function ( res ) {\n\t\t\t\t\t\t\t\t\tconsole.log( 'res', res );\n\t\t\t\t\t\t\t\t\tvar msg = res;\n\t\t\t\t\t\t\t\t\t// https://doc.wikimedia.org/oojs-ui/master/js/source/Error.html#OO-ui-Error-method-constructor\n\t\t\t\t\t\t\t\t\treject(\n\t\t\t\t\t\t\t\t\t\tnew OO.ui.Error( msg, { recoverable: true, warning: false } )\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\tmw.loader.using( 'mediawiki.api', function () {\n\t\t\t\t\t\t\t\tcallApi( payload, resolve, reject );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} ); // promise\n\t\t\t\t}\n\t\t\t\t// return false;\n\t\t\t}, this ); // .next\n\n\t\treturn new OO.ui.Process( function () {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\t/*\n\tProcessDialog.prototype.getTeardownProcess = function (data) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call(this, data)\n\t\t\t.first(function () {\n\t\t\t\tconsole.log(\"ProcessDialog\");\n\t\t\t\tremoveActiveWindow();\n\t\t\t}, this);\n\t};\n*/\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\t// ProcessDialog.prototype.getBodyHeight = function () {\n\t// \t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t// \t// this.page1.content.$element.outerHeight( true );\n\t// \treturn window.innerHeight - 100;\n\t// };\n\n\tfunction createWindowManager() {\n\t\tvar windowManager = new OO.ui.WindowManager( {\n\t\t\tclasses: [ 'pageencryption-ooui-window' ]\n\t\t} );\n\t\t$( document.body ).append( windowManager.$element );\n\n\t\treturn windowManager;\n\t}\n\n\tfunction openDialog() {\n\t\tvar processDialog = new ProcessDialog( {\n\t\t\tsize: 'medium',\n\t\t\tclasses: []\n\t\t} );\n\n\t\tWindowManager = createWindowManager();\n\n\t\tWindowManager.addWindows( [ processDialog ] );\n\n\t\tWindowManager.openWindow( processDialog );\n\t}\n\n\t// *** httpOnly cookies cannot be accessed client-side\n\t// function userKeyIsSet() {\n\t// \treturn mw.cookie.get(CookieName, mw.config.get(\"pageencryption-wgCookiePrefix\"));\n\t// }\n\n\tfunction isEncryptedNamespace() {\n\t\treturn mw.config.get( 'wgNamespaceNumber' ) === EncryptedNamespace;\n\t}\n\n\tif (\n\t\tmw.config.get( 'pageencryption-user-is-editor' ) &&\n\t\t( !KeyRecordIsSet || !UserkeyCookieIsSet )\n\t) {\n\t\topenDialog();\n\t}\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/PageEncryptionPasswordValidator.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc tag name \"ingroup\".","line":18,"column":1,"nodeType":"Block","endLine":18,"endColumn":1},{"ruleId":"no-unused-vars","severity":2,"message":"'PageEncryptionPasswordValidator' is assigned a value but never used.","line":24,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":24,"endColumn":38},{"ruleId":"no-redeclare","severity":2,"message":"'conf' is already defined.","line":25,"column":6,"nodeType":"Identifier","messageId":"redeclared","endLine":25,"endColumn":10},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":71,"column":21,"nodeType":"NewExpression","endLine":71,"endColumn":80},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":78,"column":21,"nodeType":"NewExpression","endLine":80,"endColumn":4},{"ruleId":"no-unused-vars","severity":2,"message":"'str' is defined but never used.","line":97,"column":20,"nodeType":"Identifier","messageId":"unusedVar","endLine":97,"endColumn":23}],"suppressedMessages":[],"errorCount":3,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension PageEncryption.\n *\n * PageEncryption is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * PageEncryption is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with PageEncryption. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @ingroup extensions\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n// @credits https://github.com/briannippert/Password-Validator/blob/master/PasswordValidatorv2.js\nconst PageEncryptionPasswordValidator = function ( conf ) {\n\tvar conf = $.extend(\n\t\t{\n\t\t\tminSize: 5,\n\t\t\tmaxSize: 15,\n\t\t\tlengthConfigured: true,\n\t\t\tuppercaseConfigured: true,\n\t\t\tdigitConfigured: true,\n\t\t\tspecialConfigured: true,\n\t\t\tprohibitedConfigured: true,\n\t\t\tspecialCharacters: [ '_', '#', '%', '*', '@' ],\n\t\t\tprohibitedCharacters: [ '$', '&', '=', '!' ]\n\t\t},\n\t\tconf || {}\n\t);\n\n\tfunction checkPassword( value ) {\n\t\tvar length = conf.lengthConfigured ? checkLength( value ) : true;\n\t\tvar upper = conf.uppercaseConfigured ? checkUpperCase( value ) : true;\n\t\tvar digit = conf.digitConfigured ? checkDigit( value ) : true;\n\t\tvar special = conf.specialConfigured ? checkSpecialCharacters( value ) : true;\n\t\tvar prohibited = conf.prohibitedConfigured ?\n\t\t\tcheckProhibitedCharacter( value ) :\n\t\t\ttrue;\n\n\t\tvar errors = [];\n\t\tif ( !length ) {\n\t\t\terrors.push( 'length' );\n\t\t}\n\t\tif ( !upper ) {\n\t\t\terrors.push( 'uppercase' );\n\t\t}\n\t\tif ( !digit ) {\n\t\t\terrors.push( 'digit' );\n\t\t}\n\t\tif ( !special ) {\n\t\t\terrors.push( 'special' );\n\t\t}\n\t\tif ( prohibited ) {\n\t\t\terrors.push( 'prohibited' );\n\t\t}\n\n\t\treturn errors;\n\t}\n\n\tfunction checkSpecialCharacters( str ) {\n\t\t// var specialChar = new RegExp(\"[_\\\\-#%*\\\\+]\");\n\t\tvar specialChar = new RegExp( '[' + conf.specialCharacters.join( '' ) + ']' );\n\n\t\treturn specialChar.test( str );\n\t}\n\n\tfunction checkProhibitedCharacter( str ) {\n\t\t// var specialChar = new RegExp(\"[$&=!@]\");//= /[$&=!@]/;\n\t\tvar specialChar = new RegExp(\n\t\t\t'[' + conf.prohibitedCharacters.join( '' ) + ']'\n\t\t);\n\n\t\treturn specialChar.test( str );\n\t}\n\n\tfunction checkDigit( str ) {\n\t\treturn /\\d/.test( str );\n\t}\n\n\tfunction checkUpperCase( str ) {\n\t\treturn /[^A-Z]/.test( str );\n\t}\n\n\tfunction checkLength( str ) {\n\t\treturn str.length >= conf.minSize && str.length <= conf.maxSize;\n\t}\n\n\tfunction getConf( str ) {\n\t\treturn conf;\n\t}\n\n\treturn {\n\t\tcheckPassword,\n\t\tgetConf\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/PageEncryptionPermissions.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":23,"column":2,"nodeType":"CallExpression","endLine":23,"endColumn":64},{"ruleId":"compat/compat","severity":2,"message":"navigator.clipboard() is not supported in Safari 11.1, iOS Safari 11.3-11.4","line":27,"column":4,"nodeType":"MemberExpression","endLine":27,"endColumn":23},{"ruleId":"no-alert","severity":2,"message":"Unexpected alert.","line":28,"column":5,"nodeType":"CallExpression","messageId":"unexpected","endLine":32,"endColumn":6},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":37,"column":2,"nodeType":"CallExpression","endLine":37,"endColumn":69},{"ruleId":"compat/compat","severity":2,"message":"navigator.clipboard() is not supported in Safari 11.1, iOS Safari 11.3-11.4","line":41,"column":4,"nodeType":"MemberExpression","endLine":41,"endColumn":23},{"ruleId":"no-alert","severity":2,"message":"Unexpected alert.","line":42,"column":5,"nodeType":"CallExpression","messageId":"unexpected","endLine":46,"endColumn":6},{"ruleId":"no-undef","severity":2,"message":"'canManagePermissions' is not defined.","line":75,"column":3,"nodeType":"Identifier","messageId":"undef","endLine":75,"endColumn":23},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":105,"column":8,"nodeType":"CallExpression","endLine":105,"endColumn":43}],"suppressedMessages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":52,"column":2,"nodeType":"CallExpression","endLine":52,"endColumn":63,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'val' is defined but never used.","line":55,"column":14,"nodeType":"Identifier","messageId":"unusedVar","endLine":55,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":58,"column":11,"nodeType":"CallExpression","messageId":"unexpected","endLine":58,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":63,"column":5,"nodeType":"CallExpression","endLine":65,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-parse-html-literal","severity":2,"message":"Prefer DOM building to parsing HTML literals","line":107,"column":9,"nodeType":"CallExpression","endLine":107,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-class-state","severity":2,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":111,"column":10,"nodeType":"CallExpression","endLine":113,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":5,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension PageOwnership.\n *\n * PageOwnership is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * PageOwnership is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with PageOwnership. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n$( function () {\n\t$( '.pageencryption-managepermissions-pager-button-show-url' ).on(\n\t\t'click',\n\n\t\tfunction () {\n\t\t\tnavigator.clipboard.writeText( $( this ).data( 'url' ) ).then( () => {\n\t\t\t\talert(\n\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t'pageencryption-jsmodule-managepermissions-copied-to-clipboard'\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t);\n\n\t$( '.pageencryption-managepermissions-pager-button-show-password' ).on(\n\t\t'click',\n\n\t\tfunction () {\n\t\t\tnavigator.clipboard.writeText( $( this ).data( 'password' ) ).then( () => {\n\t\t\t\talert(\n\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t'pageencryption-jsmodule-managepermissions-copied-to-clipboard'\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t);\n\n\t// eslint-disable-next-line no-jquery/no-global-selector\n\t$( '#pageencryption-form-permissions button[type=\"submit\"]' ).on(\n\t\t'click',\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tfunction ( val ) {\n\t\t\tif ( $( this ).val() === 'delete' ) {\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\tif ( !confirm( mw.msg( 'pageencryption-jsmodule-deleteitemconfirm' ) ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-jquery/no-sizzle\n\t\t\t\t$( this )\n\t\t\t\t\t.closest( 'form' )\n\t\t\t\t\t.find( ':input' )\n\t\t\t\t\t.each( function ( i, el ) {\n\t\t\t\t\t\t$( el ).removeAttr( 'required' );\n\t\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t);\n\n\t// display every 3 days\n\tif (\n\t\tcanManagePermissions &&\n\t\t!mw.cookie.get( 'pageencryption-check-latest-version' )\n\t) {\n\t\tmw.loader.using( 'mediawiki.api', function () {\n\t\t\tnew mw.Api()\n\t\t\t\t.postWithToken( 'csrf', {\n\t\t\t\t\taction: 'pageencryption-check-latest-version'\n\t\t\t\t} )\n\t\t\t\t.done( function ( res ) {\n\t\t\t\t\tif ( 'pageencryption-check-latest-version' in res ) {\n\t\t\t\t\t\tif ( res[ 'pageencryption-check-latest-version' ].result === 2 ) {\n\t\t\t\t\t\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t\t'pageencryption-jsmodule-managepermissions-outdated-version'\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t// *** this does not work before ooui v0.43.0\n\t\t\t\t\t\t\t\tshowClose: true\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tvar closeFunction = function () {\n\t\t\t\t\t\t\t\tvar three_days = 3 * 86400;\n\t\t\t\t\t\t\t\tmw.cookie.set( 'pageencryption-check-latest-version', true, {\n\t\t\t\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\t\t\t\texpires: three_days\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t$( messageWidget.$element ).parent().remove();\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tmessageWidget.on( 'close', closeFunction );\n\t\t\t\t\t\t\t$( '#pageencryption-panel-layout' ).first().prepend(\n\t\t\t\t\t\t\t\t// eslint-disable-next-line no-jquery/no-parse-html-literal\n\t\t\t\t\t\t\t\t$( '<div><br/></div>' ).prepend( messageWidget.$element )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t// eslint-disable-next-line no-jquery/no-class-state\n\t\t\t\t\t\t\t\t!messageWidget.$element.hasClass(\n\t\t\t\t\t\t\t\t\t'oo-ui-messageWidget-showClose'\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tmessageWidget.$element.addClass(\n\t\t\t\t\t\t\t\t\t'oo-ui-messageWidget-showClose'\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tvar closeButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t\t\t\t\tclasses: [ 'oo-ui-messageWidget-close' ],\n\t\t\t\t\t\t\t\t\tframed: false,\n\t\t\t\t\t\t\t\t\ticon: 'close',\n\t\t\t\t\t\t\t\t\tlabel: OO.ui.msg( 'ooui-popup-widget-close-button-aria-label' ),\n\t\t\t\t\t\t\t\t\tinvisibleLabel: true\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\tcloseButton.on( 'click', closeFunction );\n\t\t\t\t\t\t\t\tmessageWidget.$element.append( closeButton.$element );\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\t\t} );\n\t}\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"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 --- $ ./node_modules/.bin/grunt stylelint --- stdout --- Running "stylelint:all" (stylelint) task resources/style.css 1:1 ✖ Needless disable for "color-named" --report-needless-disables 21:1 ✖ Expected "#mw-indicator-pageencryption a" to have no more than 0 ID selectors selector-max-id 22:5 ✖ Expected indentation of 1 tab stylistic/indentation 22:27 ✖ Expected single space after "(" stylistic/function-parentheses-space-inside 22:102 ✖ Expected single space before ")" stylistic/function-parentheses-space-inside 23:5 ✖ Expected indentation of 1 tab stylistic/indentation 24:5 ✖ Expected indentation of 1 tab stylistic/indentation 25:5 ✖ Expected indentation of 1 tab stylistic/indentation 26:5 ✖ Expected indentation of 1 tab stylistic/indentation 27:5 ✖ Expected indentation of 1 tab stylistic/indentation 28:5 ✖ Expected indentation of 1 tab stylistic/indentation 28:18 ✖ Unexpected unit "px" for property "line-height" declaration-property-unit-disallowed-list 31:61 ✖ Expected newline after "," stylistic/selector-list-comma-newline-after 63:1 ✖ Expected no more than 1 empty line stylistic/max-empty-lines 14 problems (14 errors, 0 warnings) ⚠ 14 warnings Warning: Task "stylelint:all" failed. Use --force to continue. Aborted due to warnings. --- end --- $ ./node_modules/.bin/stylelint resources/style.css --fix --- stdout --- resources/style.css 1:1 ✖ Needless disable for "color-named" --report-needless-disables 21:1 ✖ Expected "#mw-indicator-pageencryption a" to have no more than 0 ID selectors selector-max-id 28:18 ✖ Unexpected unit "px" for property "line-height" declaration-property-unit-disallowed-list 3 problems (3 errors, 0 warnings) --- end --- $ ./node_modules/.bin/stylelint resources/style.css -f json --- stdout --- [{"source":"/src/repo/resources/style.css","deprecations":[],"invalidOptionWarnings":[],"parseErrors":[],"errored":true,"warnings":[{"line":32,"column":2,"endLine":32,"endColumn":3,"rule":"stylistic/indentation","severity":"error","text":"Expected indentation of 0 tabs (stylistic/indentation)"},{"line":28,"column":15,"endLine":28,"endColumn":19,"rule":"declaration-property-unit-disallowed-list","severity":"error","text":"Unexpected unit \"px\" for property \"line-height\" (declaration-property-unit-disallowed-list)"},{"line":21,"column":1,"endLine":21,"endColumn":31,"rule":"selector-max-id","severity":"error","text":"Expected \"#mw-indicator-pageencryption a\" to have no more than 0 ID selectors (selector-max-id)"},{"text":"Needless disable for \"color-named\"","rule":"--report-needless-disables","line":1,"column":1,"endLine":1,"endColumn":35,"severity":"error"}]}] --- end --- Removing stylelint-disable (x1) from /src/repo/resources/style.css $ /usr/bin/npm ci --- stderr --- npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin --- stdout --- added 427 packages, and audited 428 packages in 4s 93 packages are looking for funding run `npm fund` for details found 0 vulnerabilities --- end --- $ /usr/bin/npm test --- stdout --- > test > grunt test Running "eslint:all" (eslint) task /src/repo/resources/PageEncryptionPassword.js 25:6 warning 'CookieName' is assigned a value but never used no-unused-vars 89:3 warning Expected an assignment or function call and instead saw an expression no-unused-expressions 95:6 warning Unexpected use of comma operator no-sequences 231:8 warning 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 234:9 warning 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 235:5 warning Unexpected console statement no-console 235:18 warning 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 249:24 warning 'PageEncryptionPasswordValidator' is not defined no-undef 250:42 warning 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 264:8 warning Unreachable code no-unreachable 286:8 warning 'password' is already defined no-redeclare 286:8 warning 'password' declared on line 231 column 8 is used outside of binding context block-scoped-var 291:14 warning 'password' declared on line 231 column 8 is used outside of binding context block-scoped-var 291:14 warning 'password' declared on line 286 column 8 is used outside of binding context block-scoped-var 303:6 warning Expected a 'break' statement before 'case' no-fallthrough 330:13 warning Unexpected console statement no-console 340:10 warning Unexpected console statement no-console 344:1 warning This line has a length of 101. Maximum allowed is 100 max-len 358:3 warning Unreachable code no-unreachable 382:5 warning Unexpected tab character no-tabs 383:5 warning Unexpected tab character no-tabs 384:5 warning Unexpected tab character no-tabs 411:5 warning Unexpected tab character no-tabs 414:11 warning 'isEncryptedNamespace' is defined but never used no-unused-vars /src/repo/resources/PageEncryptionPasswordValidator.js 18:1 warning Invalid JSDoc tag name "ingroup" jsdoc/check-tag-names 24:7 warning 'PageEncryptionPasswordValidator' is assigned a value but never used no-unused-vars 25:6 warning 'conf' is already defined no-redeclare 71:21 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 78:21 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp 97:20 warning 'str' is defined but never used no-unused-vars /src/repo/resources/PageEncryptionPermissions.js 23:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector 27:4 warning navigator.clipboard() is not supported in Safari 11.1, iOS Safari 11.3-11.4 compat/compat 28:5 warning Unexpected alert no-alert 37:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector 41:4 warning navigator.clipboard() is not supported in Safari 11.1, iOS Safari 11.3-11.4 compat/compat 42:5 warning Unexpected alert no-alert 75:3 warning 'canManagePermissions' is not defined no-undef 105:8 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector ✖ 38 problems (0 errors, 38 warnings) Running "stylelint:all" (stylelint) task >> Linted 1 files without errors Running "banana:PageEncryption" (banana) task >> 64 messages lack documentation in qqq.json. >> Message "pageencryption-extension-desc" lacks documentation in qqq.json. >> Message "specialpages-group-pageencryption" lacks documentation in qqq.json. >> Message "pageencryption" lacks documentation in qqq.json. >> Message "pageencryptionpermissions" lacks documentation in qqq.json. >> Message "apihelp-pageencryption-check-latest-version-example-1" lacks documentation in qqq.json. >> Message "apihelp-pageencryption-check-latest-version-summary" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-managepermissions-outdated-version" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password-error-length" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password-error-digit" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password-error-special" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password-error-prohibited" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-goback" lacks documentation in qqq.json. >> Message "pageencryption-navigation" lacks documentation in qqq.json. >> Message "pageencryption-sidebar-section" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-button-password-copytoclipboard" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-button-url-copytoclipboard" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-preamble" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-fieldset-permissions-main" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-scope-label" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-expiration_date-label" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-expiration_date-help" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-button-submit" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-button-delete" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-managepermissions-copied-to-clipboard" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-description-specific" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-button-addpermission-legend" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-button-addpermission" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-table-empty" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-returnlink" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-return" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-created_by" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-page" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-revision" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-access_type" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-password" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-expiration_date" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-viewed" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-header-actions" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-search-legend" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-search-created_by-label" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-search-page-label" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-search-submit" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-button-edit" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-pager-button-revoke" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-access_type-options-symmetric_key" lacks documentation in qqq.json. >> Message "pageencryption-managepermissions-form-access_type-options-asymmetric_key" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-save" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-cancel" lacks documentation in qqq.json. >> Message "pageencryption-sitenotice-encrypted-page" lacks documentation in qqq.json. >> Message "pageencryption-sitenotice-missing-table" lacks documentation in qqq.json. >> Message "pageencryption-sitenotice-decryption-failed" lacks documentation in qqq.json. >> Message "pageencryption-sitenotice-decryption-from-access-code" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-field-password" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password-error-nomatch" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-field-password-reenter" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-field-password-reset" lacks documentation in qqq.json. >> Message "pageencryption-error-message-password-doesnotmatch" lacks documentation in qqq.json. >> Message "pageencryption-error-message-cannot-set-cookie" lacks documentation in qqq.json. >> Message "pageencryption-error-message-cannot-save-encryptionkey" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-field-password_" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-dialog-password-confirmation" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-deleteitemconfirm" lacks documentation in qqq.json. >> Message "pageencryption-jsmodule-lost-password" lacks documentation in qqq.json. Warning: Task "banana:PageEncryption" failed. Use --force to continue. Aborted due to warnings. --- end --- Traceback (most recent call last): File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 1534, 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 1472, in run self.npm_upgrade(plan) File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 1057, in npm_upgrade self.npm_test() File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/__init__.py", line 297, in npm_test self.check_call(['npm', 'test']) File "/venv/lib/python3.11/site-packages/runner-0.1.0-py3.11.egg/runner/shell2.py", line 54, 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', 'test']' returned non-zero exit status 3.