mediawiki/extensions/MobileFrontend: main (log #2408359)

sourcepatches

This run took 119 seconds.

$ date
--- stdout ---
Mon Mar 23 17:01:32 UTC 2026

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-MobileFrontend.git /src/repo --depth=1 -b master
--- stderr ---
Cloning into '/src/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 ---
a52bcc82582f25e8b1a9adb5525a92aba165152a refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {
    "@tootallnate/once": {
      "name": "@tootallnate/once",
      "severity": "low",
      "isDirect": false,
      "via": [
        {
          "source": 1113977,
          "name": "@tootallnate/once",
          "dependency": "@tootallnate/once",
          "title": "@tootallnate/once vulnerable to Incorrect Control Flow Scoping",
          "url": "https://github.com/advisories/GHSA-vpq2-c234-7xj6",
          "severity": "low",
          "cwe": [
            "CWE-705"
          ],
          "cvss": {
            "score": 3.3,
            "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": "<3.0.1"
        }
      ],
      "effects": [
        "http-proxy-agent"
      ],
      "range": "<3.0.1",
      "nodes": [
        "node_modules/@tootallnate/once"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "@wikimedia/mw-node-qunit": {
      "name": "@wikimedia/mw-node-qunit",
      "severity": "low",
      "isDirect": true,
      "via": [
        "jsdom"
      ],
      "effects": [],
      "range": ">=6.3.0",
      "nodes": [
        "node_modules/@wikimedia/mw-node-qunit"
      ],
      "fixAvailable": {
        "name": "@wikimedia/mw-node-qunit",
        "version": "6.2.1",
        "isSemVerMajor": true
      }
    },
    "ajv": {
      "name": "ajv",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1113714,
          "name": "ajv",
          "dependency": "ajv",
          "title": "ajv has ReDoS when using `$data` option",
          "url": "https://github.com/advisories/GHSA-2g4f-4pwh-qvx6",
          "severity": "moderate",
          "cwe": [
            "CWE-400",
            "CWE-1333"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<6.14.0"
        }
      ],
      "effects": [],
      "range": "<6.14.0",
      "nodes": [
        "node_modules/ajv"
      ],
      "fixAvailable": true
    },
    "brace-expansion": {
      "name": "brace-expansion",
      "severity": "low",
      "isDirect": false,
      "via": [
        {
          "source": 1105443,
          "name": "brace-expansion",
          "dependency": "brace-expansion",
          "title": "brace-expansion Regular Expression Denial of Service vulnerability",
          "url": "https://github.com/advisories/GHSA-v6h2-p8h4-qcjw",
          "severity": "low",
          "cwe": [
            "CWE-400"
          ],
          "cvss": {
            "score": 3.1,
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": ">=1.0.0 <=1.1.11"
        }
      ],
      "effects": [],
      "range": "1.0.0 - 1.1.11",
      "nodes": [
        "node_modules/brace-expansion"
      ],
      "fixAvailable": true
    },
    "cross-spawn": {
      "name": "cross-spawn",
      "severity": "high",
      "isDirect": false,
      "via": [
        {
          "source": 1104663,
          "name": "cross-spawn",
          "dependency": "cross-spawn",
          "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn",
          "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275",
          "severity": "high",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": "<6.0.6"
        }
      ],
      "effects": [
        "pre-commit"
      ],
      "range": "<6.0.6",
      "nodes": [
        "node_modules/pre-commit/node_modules/cross-spawn"
      ],
      "fixAvailable": {
        "name": "pre-commit",
        "version": "1.0.10",
        "isSemVerMajor": true
      }
    },
    "flatted": {
      "name": "flatted",
      "severity": "high",
      "isDirect": false,
      "via": [
        {
          "source": 1114526,
          "name": "flatted",
          "dependency": "flatted",
          "title": "flatted vulnerable to unbounded recursion DoS in parse() revive phase",
          "url": "https://github.com/advisories/GHSA-25h7-pfq9-p65f",
          "severity": "high",
          "cwe": [
            "CWE-674"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": "<3.4.0"
        },
        {
          "source": 1114934,
          "name": "flatted",
          "dependency": "flatted",
          "title": "Prototype Pollution via parse() in NodeJS flatted",
          "url": "https://github.com/advisories/GHSA-rf6f-7fwh-wjgh",
          "severity": "high",
          "cwe": [
            "CWE-1321"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<=3.4.1"
        }
      ],
      "effects": [],
      "range": "<=3.4.1",
      "nodes": [
        "node_modules/flatted"
      ],
      "fixAvailable": true
    },
    "form-data": {
      "name": "form-data",
      "severity": "critical",
      "isDirect": false,
      "via": [
        {
          "source": 1109540,
          "name": "form-data",
          "dependency": "form-data",
          "title": "form-data uses unsafe random function in form-data for choosing boundary",
          "url": "https://github.com/advisories/GHSA-fjxv-7rqg-78g4",
          "severity": "critical",
          "cwe": [
            "CWE-330"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<2.5.4"
        }
      ],
      "effects": [
        "request"
      ],
      "range": "<2.5.4",
      "nodes": [
        "node_modules/form-data"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "http-proxy-agent": {
      "name": "http-proxy-agent",
      "severity": "low",
      "isDirect": false,
      "via": [
        "@tootallnate/once"
      ],
      "effects": [
        "jsdom"
      ],
      "range": "4.0.1 - 5.0.0",
      "nodes": [
        "node_modules/http-proxy-agent"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "jsdom": {
      "name": "jsdom",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "http-proxy-agent",
        "request",
        "tough-cookie"
      ],
      "effects": [
        "@wikimedia/mw-node-qunit"
      ],
      "range": "0.1.20 || 0.2.0 - 22.1.0",
      "nodes": [
        "node_modules/@wikimedia/mw-node-qunit/node_modules/jsdom",
        "node_modules/jsdom"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "less": {
      "name": "less",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        "request"
      ],
      "effects": [],
      "range": "1.4.0-b1 - 2.6.1 || 2.7.2 - 3.11.3",
      "nodes": [
        "node_modules/less"
      ],
      "fixAvailable": {
        "name": "less",
        "version": "3.13.1",
        "isSemVerMajor": false
      }
    },
    "minimatch": {
      "name": "minimatch",
      "severity": "high",
      "isDirect": false,
      "via": [
        {
          "source": 1113459,
          "name": "minimatch",
          "dependency": "minimatch",
          "title": "minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern",
          "url": "https://github.com/advisories/GHSA-3ppc-4f35-3m26",
          "severity": "high",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<3.1.3"
        },
        {
          "source": 1113465,
          "name": "minimatch",
          "dependency": "minimatch",
          "title": "minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern",
          "url": "https://github.com/advisories/GHSA-3ppc-4f35-3m26",
          "severity": "high",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": ">=9.0.0 <9.0.6"
        },
        {
          "source": 1113538,
          "name": "minimatch",
          "dependency": "minimatch",
          "title": "minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments",
          "url": "https://github.com/advisories/GHSA-7r86-cg39-jmmj",
          "severity": "high",
          "cwe": [
            "CWE-407"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": "<3.1.3"
        },
        {
          "source": 1113544,
          "name": "minimatch",
          "dependency": "minimatch",
          "title": "minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments",
          "url": "https://github.com/advisories/GHSA-7r86-cg39-jmmj",
          "severity": "high",
          "cwe": [
            "CWE-407"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": ">=9.0.0 <9.0.7"
        },
        {
          "source": 1113546,
          "name": "minimatch",
          "dependency": "minimatch",
          "title": "minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions",
          "url": "https://github.com/advisories/GHSA-23c5-xmqv-rm74",
          "severity": "high",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": "<3.1.4"
        },
        {
          "source": 1113552,
          "name": "minimatch",
          "dependency": "minimatch",
          "title": "minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions",
          "url": "https://github.com/advisories/GHSA-23c5-xmqv-rm74",
          "severity": "high",
          "cwe": [
            "CWE-1333"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": ">=9.0.0 <9.0.7"
        }
      ],
      "effects": [],
      "range": "<=3.1.3 || 9.0.0 - 9.0.6",
      "nodes": [
        "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch",
        "node_modules/@typescript-eslint/utils/node_modules/minimatch",
        "node_modules/minimatch"
      ],
      "fixAvailable": true
    },
    "pre-commit": {
      "name": "pre-commit",
      "severity": "high",
      "isDirect": true,
      "via": [
        "cross-spawn"
      ],
      "effects": [],
      "range": ">=1.1.0",
      "nodes": [
        "node_modules/pre-commit"
      ],
      "fixAvailable": {
        "name": "pre-commit",
        "version": "1.0.10",
        "isSemVerMajor": true
      }
    },
    "qs": {
      "name": "qs",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1113719,
          "name": "qs",
          "dependency": "qs",
          "title": "qs's arrayLimit bypass in its bracket notation allows DoS via memory exhaustion",
          "url": "https://github.com/advisories/GHSA-6rw7-vpxm-498p",
          "severity": "moderate",
          "cwe": [
            "CWE-20"
          ],
          "cvss": {
            "score": 3.7,
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L"
          },
          "range": "<6.14.1"
        }
      ],
      "effects": [
        "request"
      ],
      "range": "<6.14.1",
      "nodes": [
        "node_modules/qs"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "request": {
      "name": "request",
      "severity": "critical",
      "isDirect": false,
      "via": [
        {
          "source": 1096727,
          "name": "request",
          "dependency": "request",
          "title": "Server-Side Request Forgery in Request",
          "url": "https://github.com/advisories/GHSA-p8p7-x288-28g6",
          "severity": "moderate",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 6.1,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
          },
          "range": "<=2.88.2"
        },
        "form-data",
        "qs",
        "tough-cookie"
      ],
      "effects": [
        "jsdom",
        "less",
        "request-promise-core",
        "request-promise-native"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "request-promise-core": {
      "name": "request-promise-core",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "request"
      ],
      "effects": [
        "request-promise-native"
      ],
      "range": "*",
      "nodes": [
        "node_modules/request-promise-core"
      ],
      "fixAvailable": true
    },
    "request-promise-native": {
      "name": "request-promise-native",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        "request",
        "request-promise-core",
        "tough-cookie"
      ],
      "effects": [],
      "range": ">=1.0.0",
      "nodes": [
        "node_modules/request-promise-native"
      ],
      "fixAvailable": true
    },
    "serialize-javascript": {
      "name": "serialize-javascript",
      "severity": "high",
      "isDirect": false,
      "via": [
        {
          "source": 1113686,
          "name": "serialize-javascript",
          "dependency": "serialize-javascript",
          "title": "Serialize JavaScript is Vulnerable to RCE via RegExp.flags and Date.prototype.toISOString()",
          "url": "https://github.com/advisories/GHSA-5c6j-r48x-rmvq",
          "severity": "high",
          "cwe": [
            "CWE-96"
          ],
          "cvss": {
            "score": 8.1,
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H"
          },
          "range": "<=7.0.2"
        }
      ],
      "effects": [
        "terser-webpack-plugin"
      ],
      "range": "<=7.0.2",
      "nodes": [
        "node_modules/serialize-javascript"
      ],
      "fixAvailable": true
    },
    "svgo": {
      "name": "svgo",
      "severity": "high",
      "isDirect": true,
      "via": [
        {
          "source": 1114151,
          "name": "svgo",
          "dependency": "svgo",
          "title": "SVGO DoS through entity expansion in DOCTYPE (Billion Laughs)",
          "url": "https://github.com/advisories/GHSA-xpqw-6gx7-v673",
          "severity": "high",
          "cwe": [
            "CWE-776"
          ],
          "cvss": {
            "score": 7.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
          },
          "range": ">=3.0.0 <3.3.3"
        }
      ],
      "effects": [],
      "range": "3.0.0 - 3.3.2",
      "nodes": [
        "node_modules/svgo"
      ],
      "fixAvailable": {
        "name": "svgo",
        "version": "3.3.3",
        "isSemVerMajor": false
      }
    },
    "terser-webpack-plugin": {
      "name": "terser-webpack-plugin",
      "severity": "high",
      "isDirect": false,
      "via": [
        "serialize-javascript"
      ],
      "effects": [],
      "range": "<=5.3.16",
      "nodes": [
        "node_modules/terser-webpack-plugin"
      ],
      "fixAvailable": true
    },
    "tough-cookie": {
      "name": "tough-cookie",
      "severity": "moderate",
      "isDirect": false,
      "via": [
        {
          "source": 1097682,
          "name": "tough-cookie",
          "dependency": "tough-cookie",
          "title": "tough-cookie Prototype Pollution vulnerability",
          "url": "https://github.com/advisories/GHSA-72xf-g2v4-qvf3",
          "severity": "moderate",
          "cwe": [
            "CWE-1321"
          ],
          "cvss": {
            "score": 6.5,
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N"
          },
          "range": "<4.1.3"
        }
      ],
      "effects": [
        "jsdom",
        "request",
        "request-promise-native"
      ],
      "range": "<4.1.3",
      "nodes": [
        "node_modules/tough-cookie"
      ],
      "fixAvailable": {
        "name": "jsdom",
        "version": "29.0.1",
        "isSemVerMajor": true
      }
    },
    "underscore": {
      "name": "underscore",
      "severity": "high",
      "isDirect": false,
      "via": [
        {
          "source": 1113950,
          "name": "underscore",
          "dependency": "underscore",
          "title": "Underscore has unlimited recursion in _.flatten and _.isEqual, potential for DoS attack",
          "url": "https://github.com/advisories/GHSA-qpx9-hpmf-5gmw",
          "severity": "high",
          "cwe": [
            "CWE-674",
            "CWE-770"
          ],
          "cvss": {
            "score": 0,
            "vectorString": null
          },
          "range": "<=1.13.7"
        }
      ],
      "effects": [],
      "range": "<=1.13.7",
      "nodes": [
        "node_modules/underscore"
      ],
      "fixAvailable": true
    },
    "webpack": {
      "name": "webpack",
      "severity": "moderate",
      "isDirect": true,
      "via": [
        {
          "source": 1099351,
          "name": "webpack",
          "dependency": "webpack",
          "title": "Webpack's AutoPublicPathRuntimeModule has a DOM Clobbering Gadget that leads to XSS",
          "url": "https://github.com/advisories/GHSA-4vvj-4cpr-p986",
          "severity": "moderate",
          "cwe": [
            "CWE-79"
          ],
          "cvss": {
            "score": 6.4,
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:L/A:H"
          },
          "range": ">=5.0.0-alpha.0 <5.94.0"
        },
        {
          "source": 1113041,
          "name": "webpack",
          "dependency": "webpack",
          "title": "webpack buildHttp: allowedUris allow-list bypass via URL userinfo (@) leading to build-time SSRF behavior",
          "url": "https://github.com/advisories/GHSA-8fgc-7cc6-rx7x",
          "severity": "low",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 3.7,
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N"
          },
          "range": ">=5.49.0 <=5.104.0"
        },
        {
          "source": 1113042,
          "name": "webpack",
          "dependency": "webpack",
          "title": "webpack buildHttp HttpUriPlugin allowedUris bypass via HTTP redirects → SSRF + cache persistence",
          "url": "https://github.com/advisories/GHSA-38r7-794h-5758",
          "severity": "low",
          "cwe": [
            "CWE-918"
          ],
          "cvss": {
            "score": 3.7,
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:N"
          },
          "range": ">=5.49.0 <5.104.0"
        }
      ],
      "effects": [],
      "range": "5.0.0-alpha.0 - 5.104.0",
      "nodes": [
        "node_modules/webpack"
      ],
      "fixAvailable": {
        "name": "webpack",
        "version": "5.105.4",
        "isSemVerMajor": false
      }
    }
  },
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 4,
      "moderate": 8,
      "high": 8,
      "critical": 2,
      "total": 22
    },
    "dependencies": {
      "prod": 1,
      "dev": 977,
      "optional": 8,
      "peer": 1,
      "peerOptional": 0,
      "total": 977
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 38 installs, 0 updates, 0 removals
  - Locking composer/pcre (3.3.2)
  - Locking composer/semver (3.4.4)
  - Locking composer/spdx-licenses (1.5.9)
  - Locking composer/xdebug-handler (3.0.5)
  - Locking danog/advanced-json-rpc (v3.2.3)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.2.0)
  - Locking doctrine/deprecations (1.1.6)
  - Locking mediawiki/mediawiki-codesniffer (v48.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.20.0)
  - Locking mediawiki/minus-x (1.1.3)
  - Locking mediawiki/phan-taint-check-plugin (9.1.0)
  - Locking netresearch/jsonmapper (v5.0.1)
  - Locking phan/phan (6.0.2)
  - Locking phan/tolerant-php-parser (v0.2.0)
  - Locking phan/var_representation_polyfill (0.1.4)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.4.0)
  - Locking phpcsstandards/phpcsextra (1.4.0)
  - Locking phpcsstandards/phpcsutils (1.1.1)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (6.0.3)
  - Locking phpdocumentor/type-resolver (2.0.0)
  - Locking phpstan/phpdoc-parser (2.3.2)
  - Locking psr/container (2.0.2)
  - Locking psr/log (3.0.2)
  - Locking sabre/event (6.0.1)
  - Locking squizlabs/php_codesniffer (3.13.2)
  - Locking symfony/console (v7.4.7)
  - Locking symfony/deprecation-contracts (v3.6.0)
  - Locking symfony/polyfill-ctype (v1.33.0)
  - Locking symfony/polyfill-intl-grapheme (v1.33.0)
  - Locking symfony/polyfill-intl-normalizer (v1.33.0)
  - Locking symfony/polyfill-mbstring (v1.33.0)
  - Locking symfony/service-contracts (v3.6.1)
  - Locking symfony/string (v8.0.6)
  - Locking webmozart/assert (2.1.6)
  - Locking wikimedia/idle-dom (v2.1.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 38 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]
  - Installing squizlabs/php_codesniffer (3.13.2): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.2.0): Extracting archive
  - Installing composer/pcre (3.3.2): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.1.1): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.4.0): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.33.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.9): Extracting archive
  - Installing composer/semver (3.4.4): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v48.0.0): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.33.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.33.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.33.0): Extracting archive
  - Installing symfony/string (v8.0.6): Extracting archive
  - Installing symfony/deprecation-contracts (v3.6.0): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.6.1): Extracting archive
  - Installing symfony/console (v7.4.7): Extracting archive
  - Installing sabre/event (6.0.1): Extracting archive
  - Installing phan/var_representation_polyfill (0.1.4): Extracting archive
  - Installing phan/tolerant-php-parser (v0.2.0): Extracting archive
  - Installing netresearch/jsonmapper (v5.0.1): Extracting archive
  - Installing webmozart/assert (2.1.6): Extracting archive
  - Installing phpstan/phpdoc-parser (2.3.2): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (1.1.6): Extracting archive
  - Installing phpdocumentor/type-resolver (2.0.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (6.0.3): Extracting archive
  - Installing danog/advanced-json-rpc (v3.2.3): Extracting archive
  - Installing psr/log (3.0.2): Extracting archive
  - Installing composer/xdebug-handler (3.0.5): Extracting archive
  - Installing phan/phan (6.0.2): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (9.1.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.20.0): Extracting archive
  - Installing mediawiki/minus-x (1.1.3): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.4.0): Extracting archive
  - Installing wikimedia/idle-dom (v2.1.0): Extracting archive
  0/36 [>---------------------------]   0%
 28/36 [=====================>------]  77%
 36/36 [============================] 100%
1 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
16 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Upgrading n:jsdoc from 4.0.3 -> 4.0.5
$ /usr/bin/npm install
--- stderr ---
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: undefined,
npm WARN EBADENGINE   required: { node: '20.19.5' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

added 973 packages, and audited 974 packages in 27s

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

22 vulnerabilities (4 low, 8 moderate, 8 high, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: undefined,
npm WARN EBADENGINE   required: { node: '20.19.5' },
npm WARN EBADENGINE   current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---

added 973 packages, and audited 974 packages in 30s

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

22 vulnerabilities (4 low, 8 moderate, 8 high, 2 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

--- end ---
$ /usr/bin/npm test
--- stderr ---
The "se" translation has 4 translations with trailing whitespace:
* mobile-frontend-editor-disabled
* mobile-frontend-editor-error-preview
* mobile-frontend-user-page-describe-yourself
* tag-advanced_mobile_edit
ERROR: Coverage for lines (54.05%) does not meet global threshold (65%)
ERROR: Coverage for functions (50.15%) does not meet global threshold (62%)
ERROR: Coverage for branches (43.93%) does not meet global threshold (51%)
ERROR: Coverage for statements (54.12%) does not meet global threshold (65%)
--- stdout ---

> test
> npm -s run lint && bash ./dev-scripts/svg_check.sh && npm -s run coverage && npm -s run test:bundle && npm -s run jsdoc

Checked 1 message directory.

/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js
  293:1  warning  This line has a length of 103. Maximum allowed is 100  max-len

/src/repo/src/mobile.languages.structured/LanguageSearcher.js
  8:1  warning  This line has a length of 106. Maximum allowed is 100  max-len

/src/repo/src/mobile.mediaViewer/ImageCarousel.js
  42:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/src/mobile.startup/CtaDrawer.js
  34:1  warning  This line has a length of 118. Maximum allowed is 100  max-len

/src/repo/src/mobile.startup/OverlayManager.js
  363:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  364:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  365:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/tests/node-qunit/importable.test.js
  69:4  warning  Found non-literal argument in require  security/detect-non-literal-require

/src/repo/tests/node-qunit/mobile.startup/CtaDrawer.test.js
   87:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp
  108:12  warning  Found non-literal argument to RegExp Constructor  security/detect-non-literal-regexp

/src/repo/tests/node-qunit/mobile.startup/PageHTMLParser.test.js
  207:1  warning  This line has a length of 111. Maximum allowed is 100  max-len
  214:1  warning  This line has a length of 108. Maximum allowed is 100  max-len

✖ 12 problems (0 errors, 12 warnings)

TAP version 13
not ok 1 MobileFrontend imports > All our code is importable in headless Node.js
  ---
  message: |+
    There were no errors when importing any of the modules:
    
    src/mobile.editor.overlay/BlockMessageDetails.js
    src/mobile.editor.overlay/blockMessageDrawer.js
    src/mobile.editor.overlay/EditorOverlayBase.js
    src/mobile.editor.overlay/SourceEditorOverlay.js
    src/mobile.editor.overlay/VisualEditorOverlay.js
  severity: failed
  actual  : 5
  expected: 0
  ...
not ok 2 MobileFrontend mobile.editor.overlay/BlockMessageDetails > renders block reason
  ---
  message: "beforeEach failed on renders block reason: Cannot read properties of undefined (reading 'Button')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Button')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/BlockMessageDetails.js:3:29)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/BlockMessageDetails.test.js:12:30)
  ...
  ---
  message: |+
    Died on test #2: this.BlockMessageDetails is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: this.BlockMessageDetails is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/BlockMessageDetails.test.js:23:20)
  ...
not ok 3 MobileFrontend mobile.editor.overlay/BlockMessageDetails > does not render block reason if it is empty
  ---
  message: "beforeEach failed on does not render block reason if it is empty: Cannot read properties of undefined (reading 'Button')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Button')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/BlockMessageDetails.js:3:29)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/BlockMessageDetails.test.js:12:30)
  ...
  ---
  message: |+
    Died on test #2: this.BlockMessageDetails is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: this.BlockMessageDetails is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/BlockMessageDetails.test.js:44:20)
  ...
not ok 4 MobileFrontend mobile.editor.overlay/EditorGateway > #getContent (no section)
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:227:17)
  ...
not ok 5 MobileFrontend mobile.editor.overlay/EditorGateway > #getContent
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:243:17)
  ...
not ok 6 MobileFrontend mobile.editor.overlay/EditorGateway > #getContent, missing section
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:259:26)
  ...
ok 7 MobileFrontend mobile.editor.overlay/EditorGateway > #getBlockInfo
not ok 8 MobileFrontend mobile.editor.overlay/EditorGateway > #save, success
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:296:17)
  ...
not ok 9 MobileFrontend mobile.editor.overlay/EditorGateway > #save, success with editor interface
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:320:17)
  ...
not ok 10 MobileFrontend mobile.editor.overlay/EditorGateway > #save, new page
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:345:17)
  ...
not ok 11 MobileFrontend mobile.editor.overlay/EditorGateway > #save, submit CAPTCHA
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:371:17)
  ...
not ok 12 MobileFrontend mobile.editor.overlay/EditorGateway > #save, request failure
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:397:17)
  ...
not ok 13 MobileFrontend mobile.editor.overlay/EditorGateway > #save, API failure
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:414:17)
  ...
not ok 14 MobileFrontend mobile.editor.overlay/EditorGateway > #save, CAPTCHA response with image URL
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:433:17)
  ...
not ok 15 MobileFrontend mobile.editor.overlay/EditorGateway > #save, AbuseFilter warning
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:460:17)
  ...
not ok 16 MobileFrontend mobile.editor.overlay/EditorGateway > #save, AbuseFilter disallow
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:485:17)
  ...
not ok 17 MobileFrontend mobile.editor.overlay/EditorGateway > #save, AbuseFilter other
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:510:17)
  ...
not ok 18 MobileFrontend mobile.editor.overlay/EditorGateway > #save, extension errors
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:535:17)
  ...
not ok 19 MobileFrontend mobile.editor.overlay/EditorGateway > #save, read-only error
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:567:10)
  ...
not ok 20 MobileFrontend mobile.editor.overlay/EditorGateway > #save, unknown errors
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:585:17)
  ...
not ok 21 MobileFrontend mobile.editor.overlay/EditorGateway > #save, without changes
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:603:17)
  ...
not ok 22 MobileFrontend mobile.editor.overlay/EditorGateway > #EditorGateway
  ---
  message: |+
    Died on test #1: Cannot read properties of undefined (reading 'extend')
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'extend')
        at EditorGateway.getPreview (/src/repo/src/mobile.editor.overlay/EditorGateway.js:250:8)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:626:17)
  ...
not ok 23 MobileFrontend mobile.editor.overlay/EditorGateway > #EditorGateway, check without sectionLine
  ---
  message: |+
    Died on test #1: Cannot read properties of undefined (reading 'extend')
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'extend')
        at EditorGateway.getPreview (/src/repo/src/mobile.editor.overlay/EditorGateway.js:250:8)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:648:17)
  ...
not ok 24 MobileFrontend mobile.editor.overlay/EditorGateway > #EditorGateway, check with sectionLine
  ---
  message: |+
    Died on test #1: Cannot read properties of undefined (reading 'extend')
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'extend')
        at EditorGateway.getPreview (/src/repo/src/mobile.editor.overlay/EditorGateway.js:250:8)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:662:17)
  ...
not ok 25 MobileFrontend mobile.editor.overlay/EditorGateway > #save, when token has expired
  ---
  message: |+
    Died on test #1: actionParams is not a function
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: actionParams is not a function
        at EditorGateway.getContent (/src/repo/src/mobile.editor.overlay/EditorGateway.js:82:14)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/EditorGateway.test.js:676:17)
  ...
not ok 26 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > #initialize, blocked user
  ---
  message: "beforeEach failed on #initialize, blocked user: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
  ---
  message: |+
    Died on test #2: SourceEditorOverlay is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: SourceEditorOverlay is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:107:2)
  ...
not ok 27 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > #initialize, with given page and section
  ---
  message: "beforeEach failed on #initialize, with given page and section: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
  ---
  message: |+
    Died on test #2: SourceEditorOverlay is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: SourceEditorOverlay is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:127:24)
  ...
not ok 28 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > #initialize, without a section
  ---
  message: "beforeEach failed on #initialize, without a section: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
  ---
  message: |+
    Died on test #2: SourceEditorOverlay is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: SourceEditorOverlay is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:144:24)
  ...
not ok 29 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > #preview
  ---
  message: "beforeEach failed on #preview: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
  ---
  message: |+
    Died on test #2: SourceEditorOverlay is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: SourceEditorOverlay is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:156:24)
  ...
not ok 30 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > #initialize, as anonymous
  ---
  message: "beforeEach failed on #initialize, as anonymous: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
  ---
  message: |+
    Died on test #2: SourceEditorOverlay is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: SourceEditorOverlay is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:169:24)
  ...
not ok 31 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > #initialize, as anonymous Growth experiment treatment group
  ---
  message: "beforeEach failed on #initialize, as anonymous Growth experiment treatment group: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
  ---
  message: |+
    Died on test #2: SourceEditorOverlay is not a constructor
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: SourceEditorOverlay is not a constructor
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:189:24)
  ...
not ok 32 MobileFrontend mobile.editor.overlay/SourceEditorOverlay > SourceEditorSaveEventHookPayload
  ---
  message: "beforeEach failed on SourceEditorSaveEventHookPayload: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/SourceEditorOverlay.test.js:30:25)
  ...
not ok 33 MobileFrontend mobile.editor.overlay/blockMessageDrawer > blockMessageDrawer
  ---
  message: "beforeEach failed on blockMessageDrawer: Cannot read properties of undefined (reading 'Overlay')"
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Overlay')
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/EditorOverlayBase.js:7:25)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.<anonymous> (/src/repo/src/mobile.editor.overlay/SourceEditorOverlay.js:2:22)
        at Module._compile (node:internal/modules/cjs/loader:1529:14)
        at Module.replacementCompile (/src/repo/node_modules/append-transform/index.js:60:13)
        at Module._compile (/src/repo/node_modules/pirates/lib/index.js:117:24)
        at Module._extensions..js (node:internal/modules/cjs/loader:1613:10)
        at newLoader (/src/repo/node_modules/pirates/lib/index.js:121:7)
        at Object.<anonymous> (/src/repo/node_modules/append-transform/index.js:64:4)
        at Module.load (node:internal/modules/cjs/loader:1275:32)
        at Function.Module._load (node:internal/modules/cjs/loader:1096:12)
        at Module.require (node:internal/modules/cjs/loader:1298:19)
        at require (node:internal/modules/helpers:182:18)
        at Object.beforeEach (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:35:25)
  ...
  ---
  message: "Promise rejected during \"blockMessageDrawer\": blockMessageDrawer is not a function"
  severity: failed
  stack: |
    TypeError: blockMessageDrawer is not a function
        at call (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:93:17)
        at s (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1)
        at Generator._invoke (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1)
        at Generator.next (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1)
        at asyncGeneratorStep (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1)
        at _next (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1)
        at /src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1
        at new Promise (<anonymous>)
        at Object.apply (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:2:1)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/blockMessageDrawer.test.js:109:2)
  ...
ok 34 MobileFrontend mobile.editor.overlay/identifyLeadParagraph > identifyLeadParagraph
not ok 35 MobileFrontend mobile.editor.overlay/parseBlockInfo > parseBlockInfo
  ---
  message: |+
    Died on test #1: Cannot read properties of undefined (reading 'Deferred')
        at Object.test (/src/repo/node_modules/qunit/qunit/qunit.js:3345:5)
  severity: failed
  stack: |
    TypeError: Cannot read properties of undefined (reading 'Deferred')
        at parseBlockInfo (/src/repo/src/mobile.editor.overlay/parseBlockInfo.js:67:33)
        at forEach (/src/repo/tests/node-qunit/mobile.editor.overlay/parseBlockInfo.test.js:245:22)
        at Array.forEach (<anonymous>)
        at Object.<anonymous> (/src/repo/tests/node-qunit/mobile.editor.overlay/parseBlockInfo.test.js:243:8)
  ...
ok 36 MobileFrontend Toggler.js > Mobile mode - Toggle section
ok 37 MobileFrontend Toggler.js > Mobile mode - Clicking a hash link to reveal an already open section
ok 38 MobileFrontend Toggler.js > Mobile mode - Reveal element
ok 39 MobileFrontend Toggler.js > Mobile mode - Clicking hash links
ok 40 MobileFrontend Toggler.js > Mobile mode - Tap event toggles section
ok 41 MobileFrontend Toggler.js > Accessibility - Verify ARIA attributes
ok 42 MobileFrontend Toggler.js > Tablet mode - Open by default
ok 43 MobileFrontend Toggler.js > Tablet mode - Open by default 2
ok 44 MobileFrontend Toggler.js > Accessibility - Pressing space/ enter toggles a heading
ok 45 MobileFrontend Toggler.js > Clicking a link within a heading isn't triggering a toggle
ok 46 MobileFrontend Toggler.js > MobileFrontend toggle.js - T320753: Presence of class disables toggling.
ok 47 MobileFrontend editorLoadingOverlay.js > editorLoadingOverlay calls the callbacks
ok 48 MobileFrontend lazyLoadedImages > initNative
ok 49 MobileFrontend sectionCollapsing.js > init() - article pages
ok 50 MobileFrontend sectionCollapsing.js > init() - article pages on tablet page
ok 51 MobileFrontend sectionCollapsing.js > init() - talk pages
ok 52 MobileFrontend sectionCollapsing.js > init() - expands section when hash fragment targets element inside
ok 53 MobileFrontend sectionCollapsing.js > init() - expands section when hash fragment targets heading
ok 54 MobileFrontend sectionCollapsing.js > init() - responds to hashchange events
ok 55 MobileFrontend sectionCollapsing.js > init() - no errors when hash targets non-existent element
ok 56 MobileFrontend LanguageSearcher.js > renders output
ok 57 MobileFrontend LanguageSearcher.js > saves the language count when link is clicked
ok 58 MobileFrontend LanguageSearcher.js > without variants, input event filters languages
ok 59 MobileFrontend LanguageSearcher.js > with variants, input event filters languages
ok 60 MobileFrontend mobile.languages.structured/util.test.js > #getFrequentlyUsedLanguages
ok 61 MobileFrontend mobile.languages.structured/util.test.js > #saveLanguageUsageCount
ok 62 MobileFrontend mobile.languages.structured/util.test.js > #getStructuredLanguages
ok 63 MobileFrontend mobile.languages.structured/util.test.js > #getStructuredLanguages device language
ok 64 MobileFrontend mobile.languages.structured/util.test.js > #getStructuredLanguages variants
ok 65 MobileFrontend mobile.mediaViewer/ImageCarousel.js > Shows details bar and image with successful api response
ok 66 MobileFrontend mobile.mediaViewer/ImageCarousel.js > Shows error message with failed api response
ok 67 MobileFrontend mobile.mediaViewer/ImageCarousel.js > Toggling of details is disabled when overlay has load failure
ok 68 MobileFrontend mobile.mediaViewer/ImageCarousel.js > Toggling of details is enabled when overlay loads successfully
ok 69 MobileFrontend mobile.mediaViewer/ImageGateway > #findSizeBucket
ok 70 MobileFrontend mobile.mediaViewer/ImageGateway > ImageGateway#getThumb (missing page)
ok 71 mobile.special.mobileoptions.scripts > addClientPreferencesToForm (named user)
ok 72 MobileFrontend ScrollEndEventEmitter.js > initializes properly
ok 73 MobileFrontend ScrollEndEventEmitter.js > emits scroll end event
ok 74 MobileFrontend ScrollEndEventEmitter.js > doesn't emit when disabled
ok 75 MobileFrontend WatchList.js > In watched mode
ok 76 MobileFrontend WatchListGateway.js > loadWatchlist() loads results from the first page
ok 77 MobileFrontend WatchListGateway.js > loadWatchlist() loads results from the second page from last item of first
ok 78 MobileFrontend WatchListGateway.js > loadWatchlist() doesn't throw an error when no pages are returned
ok 79 MobileFrontend WatchListGateway.js > loadWatchlist() marks pages as new if necessary
ok 80 MobileFrontend Watchstar.js > Render a watchstar
ok 81 MobileFrontend: WatchstarGateway.js > getStatuses(nonempty)
ok 82 MobileFrontend: WatchstarGateway.js > getStatuses(empty)
ok 83 MobileFrontend: WatchstarGateway.js > getStatusesByID(nonempty)
ok 84 MobileFrontend: WatchstarGateway.js > getStatusesByID(empty)
ok 85 MobileFrontend: WatchstarGateway.js > getStatusesByTitle(nonempty)
ok 86 MobileFrontend: WatchstarGateway.js > getStatusesByTitle(empty)
ok 87 MobileFrontend: WatchstarGateway.js > _unmarshalGetResponse(nonempty)
ok 88 MobileFrontend: WatchstarGateway.js > _unmarshalGetResponse(empty)
ok 89 MobileFrontend mobile.special.watchlist.scripts/WatchstarPageList > Watchlist status check if no ids
ok 90 MobileFrontend mobile.special.watchlist.scripts/WatchstarPageList > Checks watchlist status once
ok 91 MobileFrontend extendSearchParams.js > it throws if the feature is invalid
ok 92 MobileFrontend extendSearchParams.js > it extends the parameters
ok 93 MobileFrontend extendSearchParams.js > it doesn't include Wikibase-specific parameters if the feature is disabled
ok 94 MobileFrontend extendSearchParams.js > it adds the MobileFrontend configuration to given terms types
ok 95 MobileFrontend extendSearchParams.js > it prioritizes MobileFrontend configuration
ok 96 MobileFrontend extendSearchParams.js > it is variadic
ok 97 MobileFrontend pageJSONParser > .parse()
ok 98 MobileFrontend Browser.js > isIos()
ok 99 MobileFrontend Browser.js > Methods are cached
ok 100 MobileFrontend Browser.js > isWideScreen()
ok 101 MobileFrontend Browser.js > supportsTouchEvents()
ok 102 MobileFrontend Button.js > creates a link if passed href option
ok 103 MobileFrontend Button.js > does not add href attribute when not a link
ok 104 MobileFrontend CtaDrawer.js > redirectParams() > empty props, default URL
ok 105 MobileFrontend CtaDrawer.js > redirectParams() > empty props, nondefault URL
ok 106 MobileFrontend CtaDrawer.js > redirectParams() > nonempty props
ok 107 MobileFrontend CtaDrawer.js > signUpParams() > empty props
ok 108 MobileFrontend CtaDrawer.js > signUpParams() > nonempty props
ok 109 MobileFrontend CtaDrawer.js > HTML > defaults
ok 110 MobileFrontend CtaDrawer.js > HTML > overrides
ok 111 MobileFrontend Drawer.js > visible on show()
ok 112 MobileFrontend Drawer.js > accepts onShow and events
ok 113 MobileFrontend Drawer.js > hidden on hide()
ok 114 MobileFrontend Drawer.js > hidden on mask click
ok 115 MobileFrontend Drawer.js > HTML is valid
ok 116 MobileFrontend Icon.js > getIconClasses generates icon classes using icon
ok 117 MobileFrontend Icon.js > getIconClasses generates icon classes using custom icon prefix
ok 118 MobileFrontend Icon.js > getRotationClasses returns rotation classes
ok 119 MobileFrontend Icon.js > getGlyphClassName uses icon prefix
ok 120 MobileFrontend Icon.js > getGlyphClassName does not use icon prefix if not provided
ok 121 MobileFrontend Icon.js > adds small classes
ok 122 MobileFrontend IconButton.js > creates a link if passed href option
ok 123 MobileFrontend IconButton.js > does not add href attribute when not a link
ok 124 MobileFrontend IconButton.js > adds disabled attribute when a button
ok 125 MobileFrontend IconButton.js > does not add disabled attribute when not a button
ok 126 MobileFrontend IconButton.js > adds additional classes
ok 127 MobileFrontend: Overlay.js > Simple overlay
ok 128 MobileFrontend: Overlay.js > #make
ok 129 MobileFrontend: Overlay.js > HTML overlay
ok 130 MobileFrontend: Overlay.js > headerActions property
ok 131 MobileFrontend: Overlay.js > onBeforeExit
ok 132 MobileFrontend: Overlay.js > Close overlay
ok 133 MobileFrontend mobile.startup/OverlayManager > #getSingleton (hash present and overlay not managed)
ok 134 MobileFrontend mobile.startup/OverlayManager > #getSingleton (hash present and overlay managed)
ok 135 MobileFrontend mobile.startup/OverlayManager > #getSingleton
ok 136 MobileFrontend mobile.startup/OverlayManager > #add
ok 137 MobileFrontend mobile.startup/OverlayManager > #show
ok 138 MobileFrontend mobile.startup/OverlayManager > #add, with current path
ok 139 MobileFrontend mobile.startup/OverlayManager > #add, with string literal (matching)
ok 140 MobileFrontend mobile.startup/OverlayManager > #add, with string literal (not matching)
ok 141 MobileFrontend mobile.startup/OverlayManager > #replaceCurrent
ok 142 MobileFrontend mobile.startup/OverlayManager > route with params
ok 143 MobileFrontend mobile.startup/OverlayManager > hide when route changes
ok 144 MobileFrontend mobile.startup/OverlayManager > go back (change route) if overlay hidden but not by route change
ok 145 MobileFrontend mobile.startup/OverlayManager > go back if overlayManager still matches
ok 146 MobileFrontend mobile.startup/OverlayManager > go back if overlayManager still matches (non-regex)
ok 147 MobileFrontend mobile.startup/OverlayManager > do not go back (change route) if overlay hidden by change in route
ok 148 MobileFrontend mobile.startup/OverlayManager > preventDefault called when you cancel an exit request
ok 149 MobileFrontend mobile.startup/OverlayManager > Browser back can be overidden
ok 150 MobileFrontend mobile.startup/OverlayManager > stacked overlays
ok 151 MobileFrontend mobile.startup/OverlayManager > prevent route change
ok 152 MobileFrontend mobile.startup/OverlayManager > stack increases and decreases at right times
ok 153 MobileFrontend mobile.startup/OverlayManager > replace overlay when route event path is equal to current path
ok 154 MobileFrontend Page.js > #isMainPage
ok 155 MobileFrontend PageHTMLParser.js > #findInSectionLead
ok 156 MobileFrontend PageHTMLParser.js > #getThumbnail
ok 157 MobileFrontend PageHTMLParser.js > #getThumbnails
ok 158 MobileFrontend PageHTMLParser.js > #getLanguages
ok 159 MobileFrontend PageHTMLParser.js > #getLanguages (no hyphen)
ok 160 MobileFrontend PageHTMLParser.js > #getLanguages (T349000)
ok 161 MobileFrontend Section.js > initialize with options
ok 162 MobileFrontend Section.js > initialize with subsections
ok 163 MobileFrontend mobile.startup/View > View
ok 164 MobileFrontend mobile.startup/View > View, jQuery proxy functions
ok 165 MobileFrontend mobile.startup/View > View#preRender
ok 166 MobileFrontend mobile.startup/View > View#postRender
ok 167 MobileFrontend mobile.startup/View > View#delegateEvents
ok 168 MobileFrontend mobile.startup/View > View#render (with isTemplateMode)
ok 169 MobileFrontend mobile.startup/View > View#render events (with isTemplateMode)
ok 170 MobileFrontend mobile.startup/View > View with className option
ok 171 MobileFrontend mobile.startup/View > View.make()
ok 172 MobileFrontend icons.js > #cancel()
ok 173 MobileFrontend icons.js > #cancel(variant)
ok 174 MobileFrontend icons.js > #cancel(, props)
ok 175 MobileFrontend icons.js > #spinner(props)
ok 176 MobileFrontend icons.js > #spinner()
ok 177 MobileFrontend getDeviceLanguage > returns language code of device in lowercase
ok 178 MobileFrontend languageOverlay.js > #constructor
ok 179 MobileFrontend lazyImageLoader.js > #queryPlaceholders() empty
ok 180 MobileFrontend lazyImageLoader.js > #queryPlaceholders() nonempty
ok 181 MobileFrontend lazyImageLoader.js > #loadImage() copy attributes
ok 182 MobileFrontend lazyImageLoader.js > #loadImage() loaded
ok 183 MobileFrontend lazyImageLoader.js > #loadImage() load error
ok 184 MobileFrontend lazyImageLoader.js > #loadImages() empty
ok 185 MobileFrontend lazyImageLoader.js > #loadImages() nonempty
ok 186 MobileFrontend lazyImageLoader.js > #loadImages() plural
ok 187 MobileFrontend lazyImageLoader.js > #loadImages() one fails to load, one succeeds
ok 188 MobileFrontend ModuleLoader > #require
ok 189 MobileFrontend ModuleLoader > #define
ok 190 MobileFrontend promisedView.js > #constructor happyView
ok 191 MobileFrontend promisedView.js > #constructor when promise rejects but not to a sadView
ok 192 MobileFrontend promisedView.js > #constructor when promise rejects to a sadView
ok 193 MobileFrontend ReferencesHtmlScraperGateway.test.js > getReference() checking good reference
ok 194 MobileFrontend ReferencesHtmlScraperGateway.test.js > getReference() checking bad reference
ok 195 MobileFrontend ReferencesHtmlScraperGateway.test.js > getReference() adds an extra class for external links
ok 196 MobileFrontend: references > Bad reference not shown
ok 197 MobileFrontend: references > Good reference causes render
ok 198 MobileFrontend: references > Reference failure renders error in drawer
ok 199 MobileFrontend: references > makeOnNestedReferenceClickHandler runs when associated with link
ok 200 MobileFrontend time.js > timeAgo()
ok 201 MobileFrontend util.js > Promise.all() success
ok 202 MobileFrontend util.js > Promise.all() reject
ok 203 MobileFrontend util.js > escapeSelector()
ok 204 MobileFrontend util.js > docReady()
ok 205 MobileFrontend util.js > Deferred() - resolve
ok 206 MobileFrontend util.js > Deferred() - reject
ok 207 MobileFrontend util.js > getDocument()
ok 208 MobileFrontend util.js > getWindow()
ok 209 MobileFrontend util.js > parseHTML()
ok 210 MobileFrontend util.js > extend()
1..210
# pass 177
# skip 0
# todo 0
# fail 33
--------------------------------------|---------|----------|---------|---------|--------------------
File                                  | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s  
--------------------------------------|---------|----------|---------|---------|--------------------
All files                             |   54.12 |    43.93 |   50.15 |   54.05 |                    
 mobile.editor.overlay                |   10.65 |     7.16 |    8.74 |   10.61 |                    
  BlockMessageDetails.js              |    3.63 |        0 |       0 |     3.7 | 4-210              
  EditorGateway.js                    |      30 |    16.12 |   31.25 |   30.33 | ...,97-234,266-299 
  EditorOverlayBase.js                |    1.09 |        0 |       0 |    1.09 | 10-886             
  SourceEditorOverlay.js              |    0.78 |        0 |       0 |    0.79 | 3-807              
  SourceEditorSaveEventHookPayload.js |     100 |      100 |     100 |     100 |                    
  VisualEditorOverlay.js              |    1.65 |        0 |       0 |    1.65 | 4-345              
  blockMessageDrawer.js               |    2.94 |        0 |       0 |    3.12 | 2-93               
  identifyLeadParagraph.js            |   94.11 |    83.33 |     100 |   93.75 | 23                 
  parseBlockInfo.js                   |   73.33 |       60 |   66.66 |   73.33 | 27,43,48,78-86     
  saveFailureMessage.js               |   11.11 |        0 |       0 |   11.11 | 12-28              
  setPreferredEditor.js               |      20 |        0 |       0 |      20 | 7-12               
 mobile.init                          |   45.22 |    30.33 |   36.45 |    45.2 |                    
  Toggler.js                          |   85.26 |    67.85 |      80 |   86.17 | ...244-250,268,292 
  editor.js                           |    6.63 |        0 |       0 |    6.63 | 33-576,581-591     
  editorLoadingOverlay.js             |   69.69 |       50 |    62.5 |   69.69 | 38,43,59-74        
  fakeToolbar.js                      |     100 |      100 |     100 |     100 |                    
  isCollapsedByDefault.js             |     100 |      100 |     100 |     100 |                    
  lazyLoadedImages.js                 |   21.42 |        0 |      10 |   21.42 | 18-87,99-100,104   
  sectionCollapsing.js                |   86.95 |    68.42 |   88.23 |   86.81 | ...268,291,312-313 
  toggling.js                         |    5.55 |        0 |       0 |    5.55 | 3-54               
 mobile.languages.structured          |   89.38 |    81.66 |    87.5 |   89.28 |                    
  LanguageSearcher.js                 |   89.79 |       95 |   81.81 |   89.79 | 149-156            
  mobile.languages.structured.js      |     100 |      100 |     100 |     100 |                    
  rtlLanguages.js                     |     100 |      100 |     100 |     100 |                    
  util.js                             |   88.33 |       75 |    92.3 |   88.13 | ...137-139,170,180 
 mobile.mediaViewer                   |   80.29 |       52 |      80 |   80.88 |                    
  ImageCarousel.js                    |   77.35 |    41.66 |      75 |   78.09 | ...324-325,332,351 
  ImageGateway.js                     |   94.73 |    78.57 |     100 |   94.73 | 44                 
  LoadErrorMessage.js                 |   83.33 |      100 |   83.33 |   83.33 | 73-75              
 mobile.special.watchlist.scripts     |   87.55 |    72.94 |   84.74 |   87.43 |                    
  PageList.js                         |     100 |       50 |     100 |     100 | 52                 
  ScrollEndEventEmitter.js            |   79.31 |       60 |   88.88 |   78.57 | 116-122            
  WatchList.js                        |      70 |       50 |   45.45 |      70 | 37,41,85-114       
  WatchListGateway.js                 |   96.55 |     87.5 |     100 |   96.42 | 51                 
  WatchstarGateway.js                 |   81.81 |       80 |      90 |   81.81 | 105-112            
  WatchstarPageList.js                |      95 |       75 |     100 |      95 | 93,122             
  extendSearchParams.js               |     100 |       75 |     100 |     100 | 30,57              
  pageJSONParser.js                   |   91.66 |    81.25 |     100 |   91.66 | 32                 
  watchstar.js                        |   84.21 |       50 |      50 |   84.21 | 27-30              
 mobile.startup                       |   80.42 |    73.16 |   71.02 |   80.38 |                    
  Anchor.js                           |     100 |      100 |     100 |     100 |                    
  Browser.js                          |   96.77 |    93.75 |     100 |   96.66 | 70                 
  Button.js                           |   94.73 |       80 |     100 |   94.73 | 67                 
  CtaDrawer.js                        |     100 |      100 |     100 |     100 |                    
  Drawer.js                           |   95.34 |      100 |   83.33 |   95.23 | 34-35              
  Icon.js                             |   94.59 |     87.5 |     100 |   94.59 | 44-46              
  IconButton.js                       |     100 |     87.5 |     100 |     100 | 52-55              
  LanguageInfo.js                     |   15.78 |        0 |       0 |   16.66 | 14-61              
  MessageBox.js                       |   42.85 |      100 |       0 |   42.85 | 13-36              
  Overlay.js                          |   82.14 |       70 |   63.15 |   82.14 | ...221-222,250-263 
  OverlayManager.js                   |   98.07 |    94.73 |   95.23 |   98.97 | 46                 
  Page.js                             |   34.61 |    57.14 |   33.33 |   34.61 | ...146-155,174-181 
  PageHTMLParser.js                   |   95.38 |    93.33 |    92.3 |   95.31 | 43,88,231          
  Section.js                          |     100 |      100 |     100 |     100 |                    
  Skin.js                             |      20 |        0 |       0 |      20 | 24-116,126-133     
  Thumbnail.js                        |    87.5 |      100 |      80 |    87.5 | 44                 
  View.js                             |   91.42 |    78.57 |   86.95 |    91.3 | ...199,338,515-516 
  actionParams.js                     |     100 |       50 |     100 |     100 | 17                 
  currentPage.js                      |   18.18 |        0 |       0 |   18.18 | 17-44              
  currentPageHTMLParser.js            |   83.33 |       50 |     100 |   83.33 | 19                 
  eventBusSingleton.js                |     100 |      100 |     100 |     100 |                    
  headers.js                          |   81.81 |    85.71 |      50 |   81.81 | 41,78-114          
  icons.js                            |   96.15 |    81.25 |   83.33 |   96.15 | 31                 
  loadingOverlay.js                   |      50 |      100 |       0 |      50 | 13-18              
  mobile.startup.js                   |   82.35 |      100 |       0 |   82.35 | 110-210            
  moduleLoader.js                     |   71.42 |       50 |   66.66 |   71.42 | 41-43,70-90        
  moduleLoaderSingleton.js            |     100 |      100 |     100 |     100 |                    
  promisedView.js                     |     100 |      100 |     100 |     100 |                    
  showOnPageReload.js                 |   41.66 |       25 |      50 |   41.66 | 14-16,39-46        
  time.js                             |   24.24 |     9.09 |   16.66 |   24.24 | 32-144             
  util.js                             |   94.11 |    66.66 |    92.3 |   94.11 | 17                 
 mobile.startup/languageOverlay       |   79.31 |      100 |   54.54 |   81.48 |                    
  getDeviceLanguage.js                |     100 |      100 |     100 |     100 |                    
  languageInfoOverlay.js              |   54.54 |      100 |       0 |      60 | 15-39              
  languageOverlay.js                  |   93.33 |      100 |   83.33 |   92.85 | 33                 
 mobile.startup/lazyImages            |   93.75 |       85 |     100 |   93.75 |                    
  lazyImageLoader.js                  |   93.75 |       85 |     100 |   93.75 | 63,70              
 mobile.startup/mediaViewer           |   63.63 |      100 |       0 |   63.63 |                    
  overlay.js                          |   63.63 |      100 |       0 |   63.63 | 22-39              
 mobile.startup/references            |   82.75 |       75 |   73.33 |   82.75 |                    
  ReferencesGateway.js                |     100 |      100 |      50 |     100 |                    
  ReferencesHtmlScraperGateway.js     |   94.73 |     87.5 |     100 |   94.73 | 38                 
  references.js                       |   74.28 |    68.75 |   66.66 |   74.28 | 56,69,135-148      
--------------------------------------|---------|----------|---------|---------|--------------------

--- end ---
Traceback (most recent call last):
  File "/venv/lib/python3.13/site-packages/runner/__init__.py", line 1268, in main
    libup.run()
    ~~~~~~~~~^^
  File "/venv/lib/python3.13/site-packages/runner/__init__.py", line 1202, in run
    self.npm_upgrade(plan)
    ~~~~~~~~~~~~~~~~^^^^^^
  File "/venv/lib/python3.13/site-packages/runner/__init__.py", line 1064, in npm_upgrade
    self.npm_test()
    ~~~~~~~~~~~~~^^
  File "/venv/lib/python3.13/site-packages/runner/__init__.py", line 289, in npm_test
    self.check_call(["npm", "test"])
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/venv/lib/python3.13/site-packages/runner/shell2.py", line 66, in check_call
    res.check_returncode()
    ~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/subprocess.py", line 508, in check_returncode
    raise CalledProcessError(self.returncode, self.args, self.stdout,
                             self.stderr)
subprocess.CalledProcessError: Command '['/usr/bin/npm', 'test']' returned non-zero exit status 1.
Source code is licensed under the AGPL.