mediawiki/extensions/PageEncryption: main (log #1280961)

sourcepatches

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.
Source code is licensed under the AGPL.