mediawiki/extensions/ReadingLists: main (log #971911)

sourcepatches

This run took 47 seconds.

$ date
--- stdout ---
Sat Mar 25 20:46:46 UTC 2023

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-ReadingLists.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 ---
a09925d1c08e009030faab3bbad8503f2a9ec2c4 refs/heads/master

--- end ---
$ /usr/bin/npm audit --json --legacy-peer-deps
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 373,
      "dev": 314,
      "optional": 1,
      "peer": 0,
      "peerOptional": 0,
      "total": 687
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No lock file found. Updating dependencies instead of installing from lock file. Use composer update over composer install if you do not have a lock file.
Loading composer repositories with package information
Info from https://repo.packagist.org: #StandWithUkraine
Updating dependencies
Lock file operations: 36 installs, 0 updates, 0 removals
  - Locking composer/pcre (3.1.0)
  - Locking composer/semver (3.3.2)
  - Locking composer/spdx-licenses (1.5.7)
  - Locking composer/xdebug-handler (3.0.3)
  - Locking doctrine/deprecations (v1.0.0)
  - Locking felixfbecker/advanced-json-rpc (v3.2.1)
  - Locking mediawiki/mediawiki-codesniffer (v41.0.0)
  - Locking mediawiki/mediawiki-phan-config (0.12.0)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking mediawiki/phan-taint-check-plugin (4.0.0)
  - Locking microsoft/tolerant-php-parser (v0.1.1)
  - Locking netresearch/jsonmapper (v4.1.0)
  - Locking phan/phan (5.4.1)
  - 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 phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.3.0)
  - Locking phpdocumentor/type-resolver (1.7.0)
  - Locking phpstan/phpdoc-parser (1.16.1)
  - Locking psr/container (1.1.2)
  - Locking psr/log (1.1.4)
  - Locking sabre/event (5.1.4)
  - Locking squizlabs/php_codesniffer (3.7.2)
  - Locking symfony/console (v5.4.21)
  - Locking symfony/deprecation-contracts (v2.5.2)
  - Locking symfony/polyfill-ctype (v1.27.0)
  - Locking symfony/polyfill-intl-grapheme (v1.27.0)
  - Locking symfony/polyfill-intl-normalizer (v1.27.0)
  - Locking symfony/polyfill-mbstring (v1.27.0)
  - Locking symfony/polyfill-php73 (v1.27.0)
  - Locking symfony/polyfill-php80 (v1.27.0)
  - Locking symfony/service-contracts (v2.5.2)
  - Locking symfony/string (v5.4.21)
  - Locking tysonandre/var_representation_polyfill (0.1.3)
  - Locking webmozart/assert (1.11.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 36 installs, 0 updates, 0 removals
    0 [>---------------------------]    0 [->--------------------------]    0 [--->------------------------]  - Installing composer/pcre (3.1.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.27.0): Extracting archive
  - Installing squizlabs/php_codesniffer (3.7.2): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.27.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.7): Extracting archive
  - Installing composer/semver (3.3.2): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v41.0.0): Extracting archive
  - Installing tysonandre/var_representation_polyfill (0.1.3): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.27.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.27.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.27.0): Extracting archive
  - Installing symfony/string (v5.4.21): Extracting archive
  - Installing symfony/deprecation-contracts (v2.5.2): Extracting archive
  - Installing psr/container (1.1.2): Extracting archive
  - Installing symfony/service-contracts (v2.5.2): Extracting archive
  - Installing symfony/polyfill-php73 (v1.27.0): Extracting archive
  - Installing symfony/console (v5.4.21): Extracting archive
  - Installing sabre/event (5.1.4): Extracting archive
  - Installing netresearch/jsonmapper (v4.1.0): Extracting archive
  - Installing microsoft/tolerant-php-parser (v0.1.1): Extracting archive
  - Installing webmozart/assert (1.11.0): Extracting archive
  - Installing phpstan/phpdoc-parser (1.16.1): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing doctrine/deprecations (v1.0.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.7.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
  - Installing felixfbecker/advanced-json-rpc (v3.2.1): Extracting archive
  - Installing psr/log (1.1.4): Extracting archive
  - Installing composer/xdebug-handler (3.0.3): Extracting archive
  - Installing phan/phan (5.4.1): Extracting archive
  - Installing mediawiki/phan-taint-check-plugin (4.0.0): Extracting archive
  - Installing mediawiki/mediawiki-phan-config (0.12.0): 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/27 [>---------------------------]   0%
 10/27 [==========>-----------------]  37%
 20/27 [====================>-------]  74%
 27/27 [============================] 100%4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
14 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.22.1 -> 0.24.0
Upgrading n:grunt from 1.5.3 -> 1.6.1
Upgrading n:stylelint-config-wikimedia from 0.13.1 -> 0.14.0
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated w3c-hr-time@1.0.2: Use your platform's native performance.now() and performance.timeOrigin.
npm WARN deprecated core-js@3.22.5: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
--- stdout ---

added 678 packages, and audited 679 packages in 7s

81 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.0.0 --save-exact
--- stdout ---

up to date, audited 679 packages in 1s

81 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 i18n/roa-tara.json i18n/rki.json i18n/api/sh.json i18n/api/lb.json i18n/api/el.json i18n/tr.json i18n/diq.json jest.config.js i18n/api/es.json i18n/sms.json i18n/ilo.json i18n/btm.json resources/readinglist.scripts/index.js i18n/api/tet.json jest.setup.js i18n/kab.json i18n/pt-br.json i18n/bs.json i18n/api/he.json i18n/id.json i18n/api/scn.json i18n/tl.json i18n/api/ko.json i18n/api/is.json i18n/api/ar.json i18n/api/ast.json i18n/xmf.json i18n/api/pt.json i18n/api/sv.json i18n/sk.json tests/jest/readinglist.scripts/api.test.js i18n/api/pl.json i18n/ce.json i18n/bg.json i18n/ru.json i18n/sr-ec.json i18n/cy.json i18n/api/ce.json i18n/he.json i18n/sa.json i18n/api/fa.json i18n/api/eu.json i18n/api/sl.json i18n/api/pt-br.json i18n/api/ia.json i18n/pl.json i18n/el.json i18n/eo.json i18n/krc.json i18n/zh-hant.json i18n/fr.json i18n/ur.json i18n/pnb.json i18n/sv.json i18n/it.json i18n/eu.json i18n/se.json i18n/api/tr.json i18n/io.json i18n/da.json i18n/syl.json resources/readinglist.scripts/views/IntermediateState.vue i18n/nb.json i18n/api/hu.json i18n/api/ku-latn.json i18n/api/my.json i18n/fi.json i18n/ca.json i18n/pt.json i18n/ml.json i18n/yue.json i18n/cs.json i18n/gl.json composer.json i18n/sl.json i18n/api/ru.json sql/tables.json resources/readinglist.scripts/config.json resources/readinglist.scripts/special.js i18n/be.json i18n/ja.json i18n/qqq.json i18n/api/sms.json i18n/ext.json package-lock.json i18n/api/en.json i18n/de.json i18n/nn.json i18n/ks-arab.json i18n/es.json i18n/api/uk.json i18n/nl.json i18n/api/ur.json package.json i18n/api/nb.json i18n/rw.json i18n/hi.json i18n/ast.json extension.json i18n/api/cs.json i18n/en.json i18n/api/gl.json i18n/my.json i18n/api/fr.json i18n/api/kab.json i18n/be-tarask.json i18n/mk.json i18n/api/de.json i18n/api/roa-tara.json i18n/kaa.json i18n/skr-arab.json i18n/api/zh-hant.json i18n/api/da.json i18n/ko.json i18n/yi.json Gruntfile.js i18n/sh.json i18n/ia.json i18n/ne.json resources/readinglist.scripts/utils.js i18n/fa.json i18n/lv.json i18n/vi.json i18n/api/ja.json i18n/api/qqq.json i18n/bn.json i18n/si.json i18n/scn.json i18n/api/sd.json i18n/uk.json i18n/lb.json i18n/api/it.json i18n/hu.json i18n/ar.json i18n/api/zh-hans.json i18n/zh-hans.json i18n/api/mk.json resources/readinglist.scripts/views/ReadingListPage.vue resources/readinglist.scripts/api.js i18n/ku-latn.json --fix
--- stdout ---

/src/repo/jest.config.js
  0:0  warning  File ignored because of a matching ignore pattern. Use "--no-ignore" to override

/src/repo/jest.setup.js
  0:0  warning  File ignored because of a matching ignore pattern. Use "--no-ignore" to override

/src/repo/resources/readinglist.scripts/api.js
  282:1  warning  This line has a length of 113. Maximum allowed is 100  max-len

/src/repo/resources/readinglist.scripts/views/IntermediateState.vue
  30:1  warning  This line has a length of 123. Maximum allowed is 100   max-len
  31:1  warning  This line has a length of 2764. Maximum allowed is 100  max-len

/src/repo/resources/readinglist.scripts/views/ReadingListPage.vue
   21:15  warning  'v-html' directive can lead to XSS attack                  vue/no-v-html
   27:1   warning  This line has a length of 113. Maximum allowed is 100      max-len
   35:1   warning  This line has a length of 109. Maximum allowed is 100      max-len
   44:1   warning  This line has a length of 113. Maximum allowed is 100      max-len
   51:1   warning  This line has a length of 109. Maximum allowed is 100      max-len
  126:0   warning  The type 'Card' is undefined                               jsdoc/no-undefined-types
  179:3   warning  Prop 'initialTitles' requires default value to be set      vue/require-default-prop
  191:3   warning  Prop 'initialCollection' requires default value to be set  vue/require-default-prop
  197:13  error    ES2016 'Array.prototype.includes' method is forbidden      es-x/no-array-prototype-includes
  197:13  warning  Boolean prop should only be defaulted to false             vue/no-boolean-default
  201:13  error    ES2016 'Array.prototype.includes' method is forbidden      es-x/no-array-prototype-includes
  201:13  warning  Boolean prop should only be defaulted to false             vue/no-boolean-default
  201:64  error    ES2016 'Array.prototype.includes' method is forbidden      es-x/no-array-prototype-includes
  244:11  warning  'getReadingListUrl' is not defined                         no-undef

✖ 19 problems (3 errors, 16 warnings)


--- end ---
$ ./node_modules/.bin/eslint i18n/roa-tara.json i18n/rki.json i18n/api/sh.json i18n/api/lb.json i18n/api/el.json i18n/tr.json i18n/diq.json jest.config.js i18n/api/es.json i18n/sms.json i18n/ilo.json i18n/btm.json resources/readinglist.scripts/index.js i18n/api/tet.json jest.setup.js i18n/kab.json i18n/pt-br.json i18n/bs.json i18n/api/he.json i18n/id.json i18n/api/scn.json i18n/tl.json i18n/api/ko.json i18n/api/is.json i18n/api/ar.json i18n/api/ast.json i18n/xmf.json i18n/api/pt.json i18n/api/sv.json i18n/sk.json tests/jest/readinglist.scripts/api.test.js i18n/api/pl.json i18n/ce.json i18n/bg.json i18n/ru.json i18n/sr-ec.json i18n/cy.json i18n/api/ce.json i18n/he.json i18n/sa.json i18n/api/fa.json i18n/api/eu.json i18n/api/sl.json i18n/api/pt-br.json i18n/api/ia.json i18n/pl.json i18n/el.json i18n/eo.json i18n/krc.json i18n/zh-hant.json i18n/fr.json i18n/ur.json i18n/pnb.json i18n/sv.json i18n/it.json i18n/eu.json i18n/se.json i18n/api/tr.json i18n/io.json i18n/da.json i18n/syl.json resources/readinglist.scripts/views/IntermediateState.vue i18n/nb.json i18n/api/hu.json i18n/api/ku-latn.json i18n/api/my.json i18n/fi.json i18n/ca.json i18n/pt.json i18n/ml.json i18n/yue.json i18n/cs.json i18n/gl.json composer.json i18n/sl.json i18n/api/ru.json sql/tables.json resources/readinglist.scripts/config.json resources/readinglist.scripts/special.js i18n/be.json i18n/ja.json i18n/qqq.json i18n/api/sms.json i18n/ext.json package-lock.json i18n/api/en.json i18n/de.json i18n/nn.json i18n/ks-arab.json i18n/es.json i18n/api/uk.json i18n/nl.json i18n/api/ur.json package.json i18n/api/nb.json i18n/rw.json i18n/hi.json i18n/ast.json extension.json i18n/api/cs.json i18n/en.json i18n/api/gl.json i18n/my.json i18n/api/fr.json i18n/api/kab.json i18n/be-tarask.json i18n/mk.json i18n/api/de.json i18n/api/roa-tara.json i18n/kaa.json i18n/skr-arab.json i18n/api/zh-hant.json i18n/api/da.json i18n/ko.json i18n/yi.json Gruntfile.js i18n/sh.json i18n/ia.json i18n/ne.json resources/readinglist.scripts/utils.js i18n/fa.json i18n/lv.json i18n/vi.json i18n/api/ja.json i18n/api/qqq.json i18n/bn.json i18n/si.json i18n/scn.json i18n/api/sd.json i18n/uk.json i18n/lb.json i18n/api/it.json i18n/hu.json i18n/ar.json i18n/api/zh-hans.json i18n/zh-hans.json i18n/api/mk.json resources/readinglist.scripts/views/ReadingListPage.vue resources/readinglist.scripts/api.js i18n/ku-latn.json -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ar.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ast.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ce.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/cs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/da.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/el.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/es.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/eu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/fa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/fr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/gl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/he.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/hu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ia.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/is.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/it.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ja.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/kab.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ko.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ku-latn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/lb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/mk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/my.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/nb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/pl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/pt-br.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/pt.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/roa-tara.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ru.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/scn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/sd.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/sh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/sl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/sms.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/sv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/tet.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/tr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/uk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/ur.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/zh-hans.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/api/zh-hant.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ar.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ast.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/be-tarask.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/be.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bg.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/bs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/btm.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ca.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ce.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/cs.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/cy.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/da.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/diq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/el.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/eo.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/es.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/eu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ext.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/fr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/gl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/he.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/hu.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ia.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/id.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ilo.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/io.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/it.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ja.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/kaa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/kab.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ko.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/krc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ks-arab.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ku-latn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/lv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/mk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ml.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/my.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ne.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/nn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pnb.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pt-br.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/pt.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/rki.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/roa-tara.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ru.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/rw.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sa.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/scn.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/se.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sh.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/si.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/skr-arab.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sms.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sr-ec.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/sv.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/syl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tl.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/tr.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/uk.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/ur.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/vi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/xmf.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/yi.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/yue.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zh-hans.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/i18n/zh-hant.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/jest.config.js","messages":[{"fatal":false,"severity":1,"message":"File ignored because of a matching ignore pattern. Use \"--no-ignore\" to override."}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/jest.setup.js","messages":[{"fatal":false,"severity":1,"message":"File ignored because of a matching ignore pattern. Use \"--no-ignore\" to override."}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/api.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 113. Maximum allowed is 100.","line":282,"column":1,"nodeType":"Program","messageId":"max","endLine":282,"endColumn":105}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"const DEFAULT_READING_LIST_NAME = mw.msg( 'readinglists-default-title' );\nconst DEFAULT_READING_LIST_DESCRIPTION = mw.msg( 'readinglists-default-description' );\nconst { getReadingListUrl } = require( './utils.js' );\nconst config = require( './config.json' );\nconst api = new mw.Api();\n\n/**\n * @typedef ApiQueryResponseReadingListEntry\n * @property {string} title\n */\n\n/**\n * @typedef {Object} ImportedList\n * @property {string} name\n * @property {string} description\n * @param {ProjectTitleMap|ProjectTitleMap} list\n */\n\n/**\n * @typedef ApiQueryResponseReadingListEntryItem\n * @property {string} title\n * @property {number} id\n */\n\n/**\n * @typedef ApiQueryResponseReadingListItem\n * @property {number} id\n * @property {string} name\n * @property {string} description\n * @property {boolean} default whether it is the default\n */\n\n/**\n * @typedef ApiQueryResponsePage\n * @property {string} title\n */\n\n/**\n * @typedef ApiQueryResponseReadingListsQuery\n * @property {ApiQueryResponseReadingListItem[]} readinglists\n */\n\n/**\n * @typedef ApiQueryResponseReadingListQuery\n * @property {ApiQueryResponseReadingListEntryItem[]} readinglistentries\n */\n\n/**\n * @typedef  ApiQueryResponseTitlesQuery\n * @property {ApiQueryResponsePage[]} pages\n */\n\n/**\n * @typedef ApiQueryResponseReadingListEntries\n * @property {ApiQueryResponseReadingListQuery} query\n */\n\n/**\n * @typedef ApiQueryError\n * @property {number} code\n */\n\n/**\n * @typedef ApiQueryResponseReadingLists\n * @property {ApiQueryResponseReadingListsQuery} query\n * @property {ApiQueryError} [error]\n */\n\n/**\n * @typedef ApiQueryResponseTitles\n * @property {ApiQueryResponseTitlesQuery} query\n */\n\n/**\n * @typedef Card\n * @property {number} [id]\n * @property {string} url\n * @property {string} [ownerName]\n * @property {string} name\n * @property {string} [description]\n */\n\n/**\n * Converts API response to WVUI compatible response.\n *\n * @param {ApiQueryResponseReadingListItem} collection from API response\n * @param {string} ownerName of collection\n * @return {Card} modified collection\n */\nconst readingListToCard = ( collection, ownerName ) => {\n\tconst description = collection.default ?\n\t\tDEFAULT_READING_LIST_DESCRIPTION : collection.description;\n\tconst name = collection.default ? DEFAULT_READING_LIST_NAME : collection.name;\n\tconst url = getReadingListUrl( ownerName, collection.id, name );\n\treturn Object.assign( {}, collection, { ownerName, name, description, url } );\n};\n\n/**\n * @param {string} project\n * @return {boolean}\n */\nconst isLanguageCode = ( project ) => {\n\tconst hasProtocol = project.indexOf( '//' ) > -1;\n\treturn !hasProtocol && project.indexOf( '.' ) === -1 && project.indexOf( ':' ) === -1;\n};\n\n/**\n * From a project identifier work out which API to use.\n *\n * @param {string} project\n * @return {string}\n */\nfunction getProjectHost( project ) {\n\tconst isLang = isLanguageCode( project );\n\tconst hasProtocol = project.indexOf( '//' ) > -1;\n\tif ( config.ReadingListsDeveloperMode ) {\n\t\tif ( project.indexOf( 'localhost' ) > -1 ) {\n\t\t\treturn 'https://en.wikipedia.org';\n\t\t} else if ( isLang ) {\n\t\t\treturn `https://${project}.wikipedia.org`;\n\t\t} else {\n\t\t\treturn hasProtocol ? project : `//${project}`;\n\t\t}\n\t}\n\tif ( isLang ) {\n\t\treturn `https://${project}.${window.location.host.split( '.' ).slice( 1 ).join( '.' )}`;\n\t} else {\n\t\treturn hasProtocol ? project : `//${project}`;\n\t}\n}\n\n/**\n * @param {string} project\n * @return {function( ApiQueryResponsePage ): Card}\n */\nconst transformPage = ( project ) => {\n\treturn ( page ) => {\n\t\treturn Object.assign( page, {\n\t\t\tproject: getProjectHost( project ),\n\t\t\t// T320293\n\t\t\turl: `${getProjectHost( project )}${new mw.Title( page.title ).getUrl()}`,\n\t\t\tthumbnail: page.thumbnail ? {\n\t\t\t\twidth: page.thumbnail.width,\n\t\t\t\theight: page.thumbnail.height,\n\t\t\t\turl: page.thumbnail.source\n\t\t\t} : null\n\t\t} );\n\t};\n};\n\n/**\n * Sets up the reading list feature for new users who have never used it before.\n *\n * @return {jQuery.Promise<any>}\n */\nfunction setupCollections() {\n\treturn api.postWithToken( 'csrf', {\n\t\taction: 'readinglists',\n\t\tcommand: 'setup'\n\t} );\n}\n\n/**\n *\n * @param {string} ownerName (username)\n * @param {number[]} marked a list of collection IDs which have a certain title\n * @return {Promise<Card[]>}\n */\nfunction getCollections( ownerName, marked ) {\n\treturn new Promise( ( resolve, reject ) => {\n\t\tapi.get( {\n\t\t\taction: 'query',\n\t\t\tformat: 'json',\n\t\t\trldir: 'descending',\n\t\t\trlsort: 'updated',\n\t\t\tmeta: 'readinglists',\n\t\t\tformatversion: 2\n\t\t} ).then( function ( /** @type {ApiQueryResponseReadingLists} */ data ) {\n\t\t\tresolve(\n\t\t\t\t( data.query.readinglists || [] ).map( ( collection ) =>\n\t\t\t\t\treadingListToCard( collection, ownerName, marked ) )\n\t\t\t);\n\t\t}, function ( /** @type {string} */ err ) {\n\t\t\t// setup a reading list and try again.\n\t\t\tif ( err === 'readinglists-db-error-not-set-up' ) {\n\t\t\t\tsetupCollections().then( () => getCollections( ownerName, marked ) )\n\t\t\t\t\t.then( ( /** @type {Card[]} */ collections ) => resolve( collections ) );\n\t\t\t} else {\n\t\t\t\treject( err );\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Gets pages on a given reading list\n *\n * @param {string} ownerName\n * @param {number} id of collection\n * @return {jQuery.Promise<Card>}\n */\nfunction getCollectionMeta( ownerName, id ) {\n\treturn api.get( { action: 'query', format: 'json', meta: 'readinglists', rllist: id, formatversion: 2 } )\n\t\t.then( function ( /** @type {ApiQueryResponseReadingLists} */ data ) {\n\t\t\tif ( data.error && data.error.code ) {\n\t\t\t\tthrow new Error( `Error: ${data.error.code}` );\n\t\t\t}\n\t\t\treturn readingListToCard(\n\t\t\t\tdata.query.readinglists[ 0 ],\n\t\t\t\townerName,\n\t\t\t\t[]\n\t\t\t);\n\t\t} );\n}\n\n/**\n * @typedef {Object.<string, string[]>} ProjectTitleMap\n * @typedef {Object.<string, number[]>} ProjectIDMap\n */\n\n/**\n * Gets pages on a given reading list\n *\n * @param {ProjectTitleMap|ProjectIDMap} projectMap\n * @return {jQuery.Promise<any>}\n */\nfunction getPagesFromProjectMap( projectMap ) {\n\tconst projects = Object.keys( projectMap );\n\tconst promises = [];\n\tfor ( let i = 0; i < projects.length; i++ ) {\n\t\tpromises.push( getPagesFromPageIdentifiers( projects[ i ], projectMap[ projects[ i ] ] ) );\n\t}\n\treturn Promise.all( promises ).then( ( args ) => {\n\t\treturn Array.prototype.concat.apply( [], args );\n\t} );\n}\n\n/**\n * From a project identifier work out which API to use.\n *\n * @param {string} project\n * @return {string}\n */\nfunction getProjectApiUrl( project ) {\n\tif ( config.ReadingListsDeveloperMode ) {\n\t\treturn `${getProjectHost( project )}/w/api.php`;\n\t}\n\treturn `${getProjectHost( project )}${mw.config.get( 'wgScriptPath' )}/api.php`;\n}\n\n/**\n *\n * @param {string} project e.g. 'http://localhost:8888' or language code e.g. 'en'\n * @param {number[]|string[]} pageidsOrPageTitles\n * @return {jQuery.Promise<any>}\n */\nfunction getThumbnailsAndDescriptions( project, pageidsOrPageTitles ) {\n\tconst isPageIds = pageidsOrPageTitles[ 0 ] && typeof pageidsOrPageTitles[ 0 ] === 'number';\n\tconst pageids = isPageIds ? pageidsOrPageTitles : undefined;\n\tconst titles = isPageIds ? undefined : pageidsOrPageTitles;\n\n\tconst ajaxOptions = {\n\t\turl: `${getProjectApiUrl( project )}`\n\t};\n\n\tconst filterOutMissingPagesIfIDsPassed = ( page ) => {\n\t\treturn isPageIds ? !page.missing : true;\n\t};\n\n\treturn pageidsOrPageTitles.length ? api.get( {\n\t\taction: 'query',\n\t\tformat: 'json',\n\t\torigin: '*',\n\t\tformatversion: 2,\n\t\tprop: 'pageimages|description',\n\t\tpageids,\n\t\ttitles,\n\t\tpiprop: 'thumbnail',\n\t\tpithumbsize: 200\n\t}, ajaxOptions ).then( function ( /** @type {ApiQueryResponseTitles} */ pageData ) {\n\t\treturn pageData && pageData.query ?\n\t\t\tpageData.query.pages.filter( filterOutMissingPagesIfIDsPassed ).map( transformPage( project ) ) : [];\n\t} ) : Promise.resolve( [] );\n}\n/**\n * Gets pages from a given project and list of pageids\n *\n * @param {string} project\n * @param {number[]|string[]} pageids\n * @return {jQuery.Promise<any>}\n */\nfunction getPagesFromPageIdentifiers( project, pageids ) {\n\tconst LIMIT = 50;\n\tif ( pageids.length > LIMIT ) {\n\t\tconst promises = [];\n\t\tfor ( let i = 0; i < pageids.length; i += LIMIT ) {\n\t\t\tpromises.push( getPagesFromPageIdentifiers( project, pageids.slice( i, i + LIMIT ) ) );\n\t\t}\n\t\treturn Promise.all( promises ).then( ( args ) => {\n\t\t\treturn Array.prototype.concat.apply( [], args );\n\t\t} );\n\t}\n\tif ( pageids.length > 250 ) {\n\t\treturn Promise.reject( 'readinglists-import-size-error' );\n\t}\n\treturn getThumbnailsAndDescriptions( project, pageids );\n}\n\n/**\n * @param {ApiQueryResponsePage} pages\n * @return {ProjectTitleMap}\n */\nfunction toProjectTitlesMap( pages ) {\n\tconst /** @type {ProjectTitleMap} */projectTitleMap = {};\n\tpages.forEach( ( page ) => {\n\t\tif ( !projectTitleMap[ page.project ] ) {\n\t\t\tprojectTitleMap[ page.project ] = [];\n\t\t}\n\t\tprojectTitleMap[ page.project ].push( page.title );\n\t} );\n\treturn projectTitleMap;\n}\n\n/**\n * @param {ApiQueryResponsePage} pages\n * @return {jQuery.Promise<any>}\n */\nfunction getPagesFromReadingListPages( pages ) {\n\treturn getPagesFromProjectMap( toProjectTitlesMap( pages ) );\n}\n\n/**\n * Gets pages on a given reading list\n *\n * @param {number} collectionId\n * @return {jQuery.Promise<any>}\n */\nfunction getPages( collectionId ) {\n\treturn api.get( {\n\t\taction: 'query',\n\t\tformat: 'json',\n\t\tformatversion: 2,\n\t\tlist: 'readinglistentries',\n\t\trlelimit: 100,\n\t\trlelists: collectionId\n\t} ).then( ( /** @type {ApiQueryResponseReadingListEntries} */data ) => {\n\t\tconst readinglistpages = data.query.readinglistentries;\n\t\treturn getPagesFromReadingListPages(\n\t\t\treadinglistpages\n\t\t).then( function ( /** @type {ApiQueryResponsePage} */ pages ) {\n\t\t\t// make sure project is passed down.\n\t\t\treturn pages.map( ( page, /** @type {number} */ i ) =>\n\t\t\t\tObject.assign( readinglistpages[ i ], page ) );\n\t\t}, () => {\n\t\t\treturn Promise.reject( 'readinglistentries-error' );\n\t\t} );\n\t} );\n}\n\n/**\n * @param {string} name\n * @param {string} description\n * @param {ProjectTitleMap|ProjectTitleMap} list\n * @return {string}\n */\nfunction toBase64( name, description, list ) {\n\treturn btoa( JSON.stringify( { name, description, list } ) );\n}\n\n/**\n * @param {ImportedList} importedList\n * @return {ImportedList}\n */\nfunction normalizeImportedData( importedList ) {\n\tObject.keys( importedList.list ).forEach( ( key ) => {\n\t\t// If encounter a language code (no protocol or subdomain) assume Wikipedia\n\t\tif ( isLanguageCode( key ) ) {\n\t\t\timportedList.list[ `https://${key}.wikipedia.org` ] = importedList.list[ key ];\n\t\t\tdelete importedList.list[ key ];\n\t\t}\n\t} );\n\treturn importedList;\n}\n\n/**\n * @param {string} data\n * @return {Object}\n */\nfunction fromBase64( data ) {\n\treturn normalizeImportedData( JSON.parse( atob( data ) ) );\n}\n\nmodule.exports = {\n\ttest: {\n\t\treadingListToCard,\n\t\tgetProjectHost,\n\t\tgetProjectApiUrl\n\t},\n\tfromBase64,\n\ttoBase64,\n\tgetPages,\n\tgetCollectionMeta,\n\tgetCollections,\n\tgetPagesFromProjectMap\n};\n","usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/config.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/special.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/utils.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/views/IntermediateState.vue","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 123. Maximum allowed is 100.","line":30,"column":1,"nodeType":"Program","messageId":"max","endLine":30,"endColumn":121},{"ruleId":"max-len","severity":1,"message":"This line has a length of 2764. Maximum allowed is 100.","line":31,"column":1,"nodeType":"Program","messageId":"max","endLine":31,"endColumn":2762}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"<template>\n\t<div class=\"readinglist-pending\">\n\t\t{{ message }}\n\t</div>\n</template>\n\n<script>\n// @vue/component\nmodule.exports = {\n\tname: 'IntermediateState',\n\tprops: {\n\t\tmessage: {\n\t\t\ttype: String,\n\t\t\tdefault: mw.msg( 'readinglists-loading' )\n\t\t}\n\t}\n};\n</script>\n\n<style lang=\"less\">\n.readinglist-pending {\n\tbackground-repeat: repeat;\n\ttext-transform: uppercase;\n\tfont-size: 0.8em;\n\tfont-weight: bold;\n\tcolor: #999;\n\tline-height: 3em;\n\tpadding-left: 0.4em;\n\tbox-shadow: inset 0 0 0 0.1em #fff;\n\ttransition: border 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 ), box-shadow 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );\n\tbackground-image: url( data:image/gif;base64,R0lGODlhGAAYAKIGAP7+/vv7+/Ly8u/v7+7u7v///////wAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAGACwAAAAAGAAYAAADU0hKAvUwvjCWbTIXahfWEdcxDgiJ3Wdu1UiUK5quUzuqoHzBuZ3yGp0HmBEqcEHfjmYkMZXDp8sZgx6JkiayaKWatFhJd1uckrPWcygdXrvUJ1sCACH5BAUAAAYALAAAAAAYABgAAANTSLokUDBKGAZbbupSr8qb1HlgSFnkY55eo67jVZoxM4c189IoubKtmyaH2W2IH+OwJ1NOkK4fVPhk2pwia1GqTXJbUVg3zANTs2asZHwWpX+cQQIAIfkEBQAABgAsAAAAABgAGAAAA1E4tLwCJcoZQ2uP6hLUJdk2dR8IiRL5hSjnXSyqwmc7Y7X84m21MzHRrZET/oA9V8nUGwKLGqcDSpEybcdpM3vVLYNRLrgqpo7K2685hcaqkwkAIfkEBQAABgAsAAAAABgAGAAAA1RYFUP+TgBFq2IQSstxjhNnNR+xiVVQmiF6kdnpLrDWul58o7k9vyUZrvYQ8oigHy24E/UgzQ4yonwWo6kp62dNzrrbr9YoXZEt4HPWjKWk20CmKwEAIfkEBQAABgAsAAAAABgAGAAAA1NYWjH08Amwam0xTstxlhR3OR+xiYv3nahCrmHLlGbcqpqN4hB7vzmZggcSMoA9nYhYMzJ9O2RRyCQoO1KJM9uUVaFYGtjyvY7E5hR3fC6x1WhRAgAh+QQFAAAGACwAAAAAGAAYAAADVFi6FUMwQgGYVU5Kem3WU9UtH8iN2AMSJ1pq7fhuoquaNXrDubyyvc4shCLtIjHZkVhsLIFN5yopfFIvQ2gze/U8CUHsVxDNam2/rjEdZpjVKTYjAQAh+QQFAAAGACwAAAAAGAAYAAADU1i6G0MwQgGYVU5Kem3WU9U1D0hwI1aCaPqxortq7fjSsT1veXfzqcUuUrOZTj3fEBlUmYrKZ/LyCzULVWYzC6Uuu57vNHwcM7KnKxpMOrKdUkUCACH5BAUAAAYALAAAAAAYABgAAANTWLqsMSTKKEC7b856W9aU1S0fyI0OBBInWmrt+G6iq5q1fMN5N0sx346GSq1YPcwQmLwsQ0XHMShcUZXWpud53WajhR8SLO4yytozN016EthGawIAIfkEBQAABgAsAAAAABgAGAAAA1MoUNzOYZBJ53o41ipwltukeI4WEiMJgWGqmu31sptLwrV805zu4T3V6oTyfYi2H4+SPJ6aDyDTiFmKqFEktmSFRrvbhrQoHMbKhbGX+wybc+hxAgAh+QQFAAAGACwAAAAAGAAYAAADVEgqUP7QhaHqajFPW1nWFEd4H7SJBFZKoSisz+mqpcyRq23hdXvTH10HCEKNiBHhBVZQHplOXtC3Q5qoQyh2CYtaIdsn1CidosrFGbO5RSfb35gvAQAh+QQFAAAGACwAAAAAGAAYAAADU0iqAvUwvjCWbTIXahfWEdcRHzhVY2mKnQqynWOeIzPTtZvBl7yiKd8L2BJqeB7jjti7IRlKyZMUDTGTzis0W6Nyc1XIVJfRep1dslSrtoJvG1QCACH5BAUAAAYALAAAAAAYABgAAANSSLoqUDBKGAZbbupSb3ub1HlZGI1XaXIWCa4oo5ox9tJteof1sm+9xoqS0w2DhBmwKPtNkEoN1Cli2o7WD9ajhWWT1NM3+hyHiVzwlkuemIecBAAh+QQFAAAGACwAAAAAGAAYAAADUxhD3CygyEnlcg3WXQLOEUcpH6GJE/mdaHdhLKrCYTs7sXiDrbQ/NdkLF9QNHUXO79FzlUzJyhLam+Y21ujoyLNxgdUv1fu8SsXmbVmbQrN97l4CACH5BAUAAAYALAAAAAAYABgAAANSWBpD/k4ARetq8EnLWdYTV3kfsYkV9p3oUpphW5AZ29KQjeKgfJU6ES8Su6lyxd2x5xvCfLPlIymURqDOpywbtHCpXqvW+OqOxGbKt4kGn8vuBAAh+QQFAAAGACwAAAAAGAAYAAADU1iqMfTwCbBqbTFOy3GWFHc5H7GJi/edaKFmbEuuYeuWZt2+UIzyIBtjptH9iD2jCJgTupBBIdO3hDalVoKykxU4mddddzvCUS3gc7mkTo2xZmUCACH5BAUAAAYALAAAAAAYABgAAANTWLoaQzBCAZhtT0Z6rdNb1S0fSHAjZp5iWoKom8Ht+GqxPeP1uEs52yrYuYVSpN+kV1SykCoatGBcTqtPKJZ42TK7TsLXExZcy+PkMB2VIrHZQgIAIfkEBQAABgAsAAAAABgAGAAAA1RYuhxDMEIBmFVOSnpt1lPVLR/IjdgDEidaau34bqKrmrV8w3k3RzHfjoZaDIE934qVvPyYxdQqKJw2PUdo9El1ZrtYa7TAvTayBDMJLRg/tbYlJwEAIfkEBQAABgAsAAAAABgAGAAAA1IItdwbg8gphbsFUioUZtpWeV8WiURXPqeorqFLfvH2ljU3Y/l00y3b7tIbrUyo1NBRVB6bv09Qd8wko7yp8al1clFYYjfMHC/L4HOjSF6bq80EACH5BAUAAAYALAAAAAAYABgAAANTSALV/i0MQqtiMEtrcX4bRwkfFIpL6Zxcqhas5apxNZf16OGTeL2wHmr3yf1exltR2CJqmDKnCWqTgqg6YAF7RPq6NKxy6Rs/y9YrWpszT9fAWgIAOw== );\n}\n</style>\n","usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/resources/readinglist.scripts/views/ReadingListPage.vue","messages":[{"ruleId":"vue/no-v-html","severity":1,"message":"'v-html' directive can lead to XSS attack.","line":21,"column":15,"nodeType":"VAttribute","endLine":21,"endColumn":37},{"ruleId":"max-len","severity":1,"message":"This line has a length of 113. Maximum allowed is 100.","line":27,"column":1,"nodeType":"Program","messageId":"max","endLine":27,"endColumn":84},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":35,"column":1,"nodeType":"Program","messageId":"max","endLine":35,"endColumn":80},{"ruleId":"max-len","severity":1,"message":"This line has a length of 113. Maximum allowed is 100.","line":44,"column":1,"nodeType":"Program","messageId":"max","endLine":44,"endColumn":84},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":51,"column":1,"nodeType":"Program","messageId":"max","endLine":51,"endColumn":80},{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Card' is undefined.","line":126,"column":null,"nodeType":"Block","endLine":126,"endColumn":null},{"ruleId":"vue/require-default-prop","severity":1,"message":"Prop 'initialTitles' requires default value to be set.","line":179,"column":3,"nodeType":"Property","messageId":"missingDefault","endLine":182,"endColumn":4},{"ruleId":"vue/require-default-prop","severity":1,"message":"Prop 'initialCollection' requires default value to be set.","line":191,"column":3,"nodeType":"Property","messageId":"missingDefault","endLine":194,"endColumn":4},{"ruleId":"es-x/no-array-prototype-includes","severity":2,"message":"ES2016 'Array.prototype.includes' method is forbidden.","line":197,"column":13,"nodeType":"MemberExpression","messageId":"forbidden","endLine":197,"endColumn":48},{"ruleId":"vue/no-boolean-default","severity":1,"message":"Boolean prop should only be defaulted to false.","line":197,"column":13,"nodeType":"CallExpression","endLine":197,"endColumn":61},{"ruleId":"es-x/no-array-prototype-includes","severity":2,"message":"ES2016 'Array.prototype.includes' method is forbidden.","line":201,"column":13,"nodeType":"MemberExpression","messageId":"forbidden","endLine":201,"endColumn":48},{"ruleId":"vue/no-boolean-default","severity":1,"message":"Boolean prop should only be defaulted to false.","line":201,"column":13,"nodeType":"LogicalExpression","endLine":201,"endColumn":109},{"ruleId":"es-x/no-array-prototype-includes","severity":2,"message":"ES2016 'Array.prototype.includes' method is forbidden.","line":201,"column":64,"nodeType":"MemberExpression","messageId":"forbidden","endLine":201,"endColumn":99},{"ruleId":"no-undef","severity":1,"message":"'getReadingListUrl' is not defined.","line":244,"column":11,"nodeType":"Identifier","messageId":"undef","endLine":244,"endColumn":28}],"suppressedMessages":[{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":120,"column":15,"nodeType":"CallExpression","endLine":120,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":282,"column":13,"nodeType":"CallExpression","endLine":282,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":3,"fatalErrorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"<template>\n\t<div class=\"readinglist-page\">\n\t\t<div class=\"readinglist-collection\">\n\t\t\t<div class=\"readinglist-collection-summary\">\n\t\t\t\t<div v-if=\"showMeta\">\n\t\t\t\t\t<h1 v-if=\"viewTitle\">\n\t\t\t\t\t\t{{ viewTitle }}\n\t\t\t\t\t</h1>\n\t\t\t\t\t<p class=\"readinglist-collection-description\">\n\t\t\t\t\t\t&nbsp;{{ viewDescription }}\n\t\t\t\t\t</p>\n\t\t\t\t\t<cdx-button v-if=\"!showDisclaimer\" @click=\"clickImportList\">\n\t\t\t\t\t\t{{ shareLabel }}\n\t\t\t\t\t</cdx-button>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"showDisclaimer\">\n\t\t\t\t\t{{ disclaimer }}\n\t\t\t\t\t<div v-if=\"hasApp\">\n\t\t\t\t\t\t<ol>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<span v-html=\"importMessage\"></span>\n\t\t\t\t\t\t\t\t<div v-if=\"isAndroid && androidDownloadLink\">\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\t\t\t:href=\"androidDownloadLink\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"app_store_images_sprite svg-badge_google_play_store\"></span>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-else-if=\"isIOS && iosDownloadLink\">\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\t\t\t:href=\"iosDownloadLink\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"app_store_images_sprite svg-badge_ios_app_store\"></span>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\tv-if=\"androidDownloadLink\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\t\t\t:href=\"androidDownloadLink\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"app_store_images_sprite svg-badge_google_play_store\"></span>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\tv-if=\"iosDownloadLink\"\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t\t\t\t\t\t\t:href=\"iosDownloadLink\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"app_store_images_sprite svg-badge_ios_app_store\"></span>\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t{{ importButtonHint }}\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<cdx-button\n\t\t\t\t\t\t\t\t\t\taction=\"progressive\"\n\t\t\t\t\t\t\t\t\t\tweight=\"primary\"\n\t\t\t\t\t\t\t\t\t\t@click=\"clickDeepLink\">\n\t\t\t\t\t\t\t\t\t\t{{ importButtonLabel }}\n\t\t\t\t\t\t\t\t\t</cdx-button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ol>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t{{ noAppMessage }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if=\"errorCode\">\n\t\t\t\t<cdx-message type=\"error\">\n\t\t\t\t\t{{ errorMessage }}\n\t\t\t\t</cdx-message>\n\t\t\t</div>\n\t\t\t<div v-if=\"loaded && !errorCode\">\n\t\t\t\t<div :class=\"readingListClass\">\n\t\t\t\t\t<div v-if=\"cards.length\" class=\"readinglist-list__container\">\n\t\t\t\t\t\t<cdx-card\n\t\t\t\t\t\t\tv-for=\"( card ) in cards\"\n\t\t\t\t\t\t\t:key=\"card.id\"\n\t\t\t\t\t\t\t:url=\"card.url\"\n\t\t\t\t\t\t\t:force-thumbnail=\"true\"\n\t\t\t\t\t\t\t:thumbnail=\"card.thumbnail\"\n\t\t\t\t\t\t\t@click=\"clickCard\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<template #title>\n\t\t\t\t\t\t\t\t{{ card.title }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template #description>\n\t\t\t\t\t\t\t\t{{ card.description }}\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</cdx-card>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t{{ emptyMessage }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-if=\"!loaded\">\n\t\t\t\t<intermediate-state></intermediate-state>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nconst { CdxCard, CdxMessage, CdxButton } = require( '@wikimedia/codex' );\nconst { ReadingListiOSAppDownloadLink,\n\tReadingListAndroidAppDownloadLink } = require( '../config.json' );\nconst READING_LIST_SPECIAL_PAGE_NAME = 'Special:ReadingLists';\nconst READING_LISTS_NAME_PLURAL = mw.msg( 'special-tab-readinglists-short' );\nconst READING_LIST_TITLE = mw.msg( 'readinglists-special-title' );\nconst HOME_URL = ( new mw.Title( 'ReadingLists', -1 ) ).getUrl();\n\nconst getEnabledMessage = ( key, params ) => {\n\t// eslint-disable-next-line mediawiki/msg-doc\n\tconst text = mw.msg( key, params );\n\treturn text === '-' ? '' : text;\n};\n\n/**\n * @param {number} id\n * @return {Card}\n */\nfunction getCard( { id, url, name, description, title, thumbnail, project } ) {\n\treturn {\n\t\tloaded: false,\n\t\tid,\n\t\turl,\n\t\tproject,\n\t\t// If it's a list, name\n\t\t// If it's a page on the list, title\n\t\ttitle: name || title,\n\t\tdescription,\n\t\tthumbnail\n\t};\n}\n\n// @vue/component\nmodule.exports = {\n\tname: 'ReadingListPage',\n\tcomponents: {\n\t\tCdxButton,\n\t\tCdxCard,\n\t\tCdxMessage,\n\t\tIntermediateState: require( './IntermediateState.vue' )\n\t},\n\tprops: {\n\t\tiosDownloadLink: {\n\t\t\ttype: String,\n\t\t\tdefault: ReadingListiOSAppDownloadLink\n\t\t},\n\t\tanonymizedPreviews: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tandroidDownloadLink: {\n\t\t\ttype: String,\n\t\t\tdefault: ReadingListAndroidAppDownloadLink\n\t\t},\n\t\tisImport: {\n\t\t\ttype: Boolean\n\t\t},\n\t\tapi: {\n\t\t\ttype: Object,\n\t\t\trequired: true\n\t\t},\n\t\tdisclaimer: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tusername: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tinitialTitles: {\n\t\t\ttype: Object,\n\t\t\trequired: false\n\t\t},\n\t\tinitialName: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tinitialDescription: {\n\t\t\ttype: String,\n\t\t\tdefault: ''\n\t\t},\n\t\tinitialCollection: {\n\t\t\ttype: Number,\n\t\t\trequired: false\n\t\t},\n\t\tisAndroid: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: window.navigator.userAgent.includes( 'Android' )\n\t\t},\n\t\tisIOS: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: window.navigator.userAgent.includes( 'iPhone' ) || window.navigator.userAgent.includes( 'iPad' )\n\t\t}\n\t},\n\tdata: function () {\n\t\treturn {\n\t\t\tshowDisclaimer: this.disclaimer !== '',\n\t\t\tignore: [],\n\t\t\ttitlesToLoad: this.initialTitles,\n\t\t\tloaded: false,\n\t\t\tinitialized: false,\n\t\t\tcards: [],\n\t\t\tname: this.initialName,\n\t\t\tdescription: this.initialDescription,\n\t\t\tcollection: this.initialCollection,\n\t\t\terrorCode: 0\n\t\t};\n\t},\n\tcomputed: {\n\t\tshowMeta() {\n\t\t\treturn this.showDisclaimer ? !this.anonymizedPreviews : true;\n\t\t},\n\t\treadingListClass() {\n\t\t\treturn {\n\t\t\t\t'readinglist-list--hidden': this.anonymizedPreviews && this.showDisclaimer,\n\t\t\t\t'readinglist-list': true\n\t\t\t};\n\t\t},\n\t\thasApp: function () {\n\t\t\treturn (\n\t\t\t\tthis.iosDownloadLink || this.androidDownloadLink\n\t\t\t);\n\t\t},\n\t\tshareUrl: function () {\n\t\t\treturn HOME_URL;\n\t\t},\n\t\tgetHomeUrl: function () {\n\t\t\treturn HOME_URL;\n\t\t},\n\t\tviewDescription: function () {\n\t\t\treturn this.description ||\n\t\t\t\t( this.collection ? '' : mw.msg( 'readinglists-description' ) );\n\t\t},\n\t\treadingListUrl: function () {\n\t\t\treturn getReadingListUrl( mw.user.getName() );\n\t\t},\n\t\tviewTitle: function () {\n\t\t\treturn this.name || mw.msg( 'special-tab-readinglists-short' );\n\t\t},\n\t\tnoAppMessage() {\n\t\t\treturn getEnabledMessage( 'readinglists-import-app-misconfigured' );\n\t\t},\n\t\timportMessage() {\n\t\t\tif ( this.isIOS && this.iosDownloadLink ) {\n\t\t\t\treturn getEnabledMessage( 'readinglists-import-app-with-link', this.iosDownloadLink );\n\t\t\t} else if ( this.isAndroid && this.androidDownloadLink ) {\n\t\t\t\treturn getEnabledMessage( 'readinglists-import-app-with-link', this.androidDownloadLink );\n\t\t\t} else {\n\t\t\t\treturn getEnabledMessage( 'readinglists-import-app' );\n\t\t\t}\n\t\t},\n\t\tshareLabel() {\n\t\t\treturn mw.msg( 'readinglists-export' );\n\t\t},\n\t\timportButtonLabel() {\n\t\t\treturn mw.msg( 'readinglists-import-button-label' );\n\t\t},\n\t\timportButtonHint() {\n\t\t\treturn mw.msg( 'readinglists-import-button-hint' );\n\t\t},\n\t\temptyMessage: function () {\n\t\t\treturn this.collection ?\n\t\t\t\tmw.msg( 'readinglists-list-empty-message' ) :\n\t\t\t\tmw.msg( 'readinglists-empty-message' );\n\t\t},\n\t\terrorMessage: function () {\n\t\t\tswitch ( this.errorCode ) {\n\t\t\t\tcase 'readinglists-import-error':\n\t\t\t\tcase 'readinglists-db-error-no-such-list':\n\t\t\t\tcase 'readinglists-db-error-list-deleted':\n\t\t\t\tcase 'readinglists-import-size-error':\n\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\treturn mw.msg( this.errorCode, this.collection );\n\t\t\t\tdefault:\n\t\t\t\t\treturn 'An unknown error occurred (' + this.errorCode + ')';\n\t\t\t}\n\t\t}\n\t},\n\tmethods: {\n\t\tclickImportList: function () {\n\t\t\tconst list = {};\n\t\t\tthis.cards.forEach( ( card ) => {\n\t\t\t\tif ( !list[ card.project ] ) {\n\t\t\t\t\tlist[ card.project ] = [];\n\t\t\t\t}\n\t\t\t\tlist[ card.project ].push( card.title );\n\t\t\t} );\n\t\t\twindow.location.search = `?limport=${this.api.toBase64( this.name, this.description, list )}`;\n\t\t},\n\t\tclickDeepLink: function () {\n\t\t\ttry {\n\t\t\t\twindow.location.protocol = 'wikipedia';\n\t\t\t\tsetTimeout( () => mw.notify( mw.msg( 'readinglists-import-app-launch-hint' ) ), 1000 );\n\t\t\t} catch ( e ) {\n\t\t\t\t// User does not have the app installed.\n\t\t\t}\n\t\t},\n\t\tclickCard: function ( ev ) {\n\t\t\t// If we are navigating to a list, navigate internally\n\t\t\tif ( !this.collection ) {\n\t\t\t\tthis.navigate( ev.currentTarget.getAttribute( 'href' ), null );\n\t\t\t\tev.preventDefault();\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Can be used externally to navigate to the home page.\n\t\t */\n\t\tnavigateHome: function () {\n\t\t\tthis.navigate( HOME_URL, READING_LIST_TITLE );\n\t\t},\n\t\tgetUrlFromHref: function ( href ) {\n\t\t\tconst query = href.split( '?' )[ 1 ];\n\t\t\tconst titleInQuery = query ? query.replace( /title=(.*)(&|$)/, '$1' ) : false;\n\t\t\tif ( titleInQuery ) {\n\t\t\t\treturn '/wiki/' + titleInQuery;\n\t\t\t} else {\n\t\t\t\treturn href;\n\t\t\t}\n\t\t},\n\t\tgetState: function () {\n\t\t\treturn {\n\t\t\t\tname: this.name,\n\t\t\t\tdescription: this.description,\n\t\t\t\tcollection: this.collection\n\t\t\t};\n\t\t},\n\t\tload: function () {\n\t\t\tif ( this.loaded ) {\n\t\t\t\tif ( this.errorCode || !this.username ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst state = this.getState();\n\t\t\t\tdocument.title = this.name ||\n\t\t\t\t\tREADING_LISTS_NAME_PLURAL;\n\t\t\t\twindow.history.replaceState(\n\t\t\t\t\tstate,\n\t\t\t\t\tnull,\n\t\t\t\t\tthis.collection ?\n\t\t\t\t\t\tmw.util.getUrl( `${READING_LIST_SPECIAL_PAGE_NAME}/${this.username}/${this.collection}/${this.name}` ) :\n\t\t\t\t\t\tmw.util.getUrl( `${READING_LIST_SPECIAL_PAGE_NAME}/${this.username}` )\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.titlesToLoad ) {\n\t\t\t\tif ( this.anonymizedPreviews ) {\n\t\t\t\t\tthis.collection = -1;\n\t\t\t\t\tthis.cards = [];\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\tthis.titlesToLoad = undefined;\n\t\t\t\t} else {\n\t\t\t\t\tthis.api.getPagesFromProjectMap( this.titlesToLoad ).then( ( pages ) => {\n\t\t\t\t\t\tthis.collection = -1;\n\t\t\t\t\t\tthis.cards = pages.map( ( page ) => getCard( page ) );\n\t\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\t\tthis.titlesToLoad = undefined;\n\t\t\t\t\t}, ( err ) => {\n\t\t\t\t\t\tthis.errorCode = err;\n\t\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\t\tthis.titlesToLoad = undefined;\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} else if ( this.collection ) {\n\t\t\t\tthis.api.getCollectionMeta( this.username, this.collection ).then( ( meta ) => {\n\t\t\t\t\tthis.api.getPages( this.collection ).then( ( pages ) => {\n\t\t\t\t\t\tthis.cards = pages.map( ( collection ) => getCard( collection ) );\n\t\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\t\tthis.name = meta.name;\n\t\t\t\t\t\tthis.description = meta.description;\n\t\t\t\t\t} );\n\t\t\t\t}, function ( code ) {\n\t\t\t\t\tthis.collection = undefined;\n\t\t\t\t\tthis.errorCode = code;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t}.bind( this ) );\n\t\t\t} else if ( this.username ) {\n\t\t\t\tthis.api.getCollections( this.username, [] ).then( function ( collections ) {\n\t\t\t\t\tthis.cards = collections.map( ( collection ) => getCard( collection ) );\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t}.bind( this ) );\n\t\t\t} else {\n\t\t\t\tthis.errorCode = 'readinglists-import-error';\n\t\t\t\tthis.loaded = true;\n\t\t\t}\n\t\t},\n\t\treset: function () {\n\t\t\tthis.errorCode = 0;\n\t\t\tthis.name = '';\n\t\t\tthis.description = '';\n\t\t\tthis.cards = [];\n\t\t\tthis.collection = false;\n\t\t\tthis.loaded = false;\n\t\t},\n\t\tnavigate: function ( url, title ) {\n\t\t\tthis.showDisclaimer = false;\n\t\t\tconst articlePathPrefix = mw.config.get( 'wgArticlePath' ).replace( '$1', '' );\n\t\t\tthis.reset();\n\t\t\tconst params = url.split( articlePathPrefix )[ 1 ];\n\t\t\tconst paramArray = params.split( '/' ).slice( 1 );\n\t\t\t// <username>/<id>/<name>\n\t\t\tthis.collection = paramArray[ 1 ];\n\t\t\tthis.name = paramArray[ 2 ] ?\n\t\t\t\tdecodeURIComponent( paramArray[ 2 ].replace( /_/g, ' ' ) ) : '';\n\n\t\t\thistory.pushState(\n\t\t\t\tthis.getState(),\n\t\t\t\ttitle,\n\t\t\t\turl\n\t\t\t);\n\t\t}\n\t},\n\tupdated: function () {\n\t\tthis.load();\n\t},\n\tmounted: function () {\n\t\tthis.load();\n\t\twindow.addEventListener( 'popstate', function ( ev ) {\n\t\t\tif ( ev.state ) {\n\t\t\t\tthis.reset();\n\t\t\t\tObject.keys( ev.state ).forEach( function ( key ) {\n\t\t\t\t\tthis[ key ] = ev.state[ key ];\n\t\t\t\t}.bind( this ) );\n\t\t\t}\n\t\t}.bind( this ) );\n\t}\n};\n</script>\n\n<style lang=\"less\">\n.readinglist-list__container {\n\t.cdx-card {\n\t\tmargin-bottom: 1em;\n\t}\n}\n\n.readinglist-collection {\n\t// stylelint-disable-next-line declaration-property-unit-disallowed-list\n\tfont-size: 16px;\n\n\t&-summary {\n\t\tmargin: 7px 0 10px 0;\n\n\t\th1 {\n\t\t\tborder-bottom: 0;\n\t\t\tmargin-top: 0;\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n\n\t&-description {\n\t\tmargin-bottom: 24px;\n\t}\n\n\tp {\n\t\tmargin-top: 16px;\n\t}\n\n\tol {\n\t\tmargin-top: 16px;\n\t\tpadding-left: 0;\n\t\tlist-style: inside decimal;\n\t}\n}\n\n.readinglist-list--hidden {\n\tdisplay: none;\n}\n\n.app_store_images_sprite {\n\tbackground-image: linear-gradient( transparent, transparent ), url( images/sprite.svg );\n\tbackground-repeat: no-repeat;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.svg-badge_google_play_store {\n\tbackground-position: 0 -541px;\n\twidth: 124px;\n\theight: 38px;\n}\n\n.svg-badge_ios_app_store {\n\tbackground-position: 0 -579px;\n\twidth: 110px;\n\theight: 38px;\n}\n</style>\n","usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/sql/tables.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]},{"filePath":"/src/repo/tests/jest/readinglist.scripts/api.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"no-new-require","replacedBy":[]}]}]

--- end ---
$ ./node_modules/.bin/grunt stylelint
--- stdout ---
Running "stylelint:all" (stylelint) task
>> Linted 3 files without errors

Done.

--- end ---
$ /usr/bin/npm ci --legacy-peer-deps
--- stderr ---
npm WARN deprecated w3c-hr-time@1.0.2: Use your platform's native performance.now() and performance.timeOrigin.
npm WARN deprecated core-js@3.22.5: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
--- stdout ---

added 678 packages, and audited 679 packages in 5s

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

found 0 vulnerabilities

--- end ---
$ /usr/bin/npm test
--- stdout ---

> test
> grunt test && npm run test:unit

Running "eslint:all" (eslint) task

/src/repo/jest.config.js
  0:0  warning  File ignored because of a matching ignore pattern. Use "--no-ignore" to override

/src/repo/jest.setup.js
  0:0  warning  File ignored because of a matching ignore pattern. Use "--no-ignore" to override

/src/repo/resources/readinglist.scripts/api.js
  282:1  warning  This line has a length of 113. Maximum allowed is 100  max-len

/src/repo/resources/readinglist.scripts/views/IntermediateState.vue
  30:1  warning  This line has a length of 123. Maximum allowed is 100   max-len
  31:1  warning  This line has a length of 2764. Maximum allowed is 100  max-len

/src/repo/resources/readinglist.scripts/views/ReadingListPage.vue
   21:15  warning  'v-html' directive can lead to XSS attack                  vue/no-v-html
   27:1   warning  This line has a length of 113. Maximum allowed is 100      max-len
   35:1   warning  This line has a length of 109. Maximum allowed is 100      max-len
   44:1   warning  This line has a length of 113. Maximum allowed is 100      max-len
   51:1   warning  This line has a length of 109. Maximum allowed is 100      max-len
  126:0   warning  The type 'Card' is undefined                               jsdoc/no-undefined-types
  179:3   warning  Prop 'initialTitles' requires default value to be set      vue/require-default-prop
  191:3   warning  Prop 'initialCollection' requires default value to be set  vue/require-default-prop
  197:13  error    ES2016 'Array.prototype.includes' method is forbidden      es-x/no-array-prototype-includes
  197:13  warning  Boolean prop should only be defaulted to false             vue/no-boolean-default
  201:13  error    ES2016 'Array.prototype.includes' method is forbidden      es-x/no-array-prototype-includes
  201:13  warning  Boolean prop should only be defaulted to false             vue/no-boolean-default
  201:64  error    ES2016 'Array.prototype.includes' method is forbidden      es-x/no-array-prototype-includes
  244:11  warning  'getReadingListUrl' is not defined                         no-undef

✖ 19 problems (3 errors, 16 warnings)

Warning: Task "eslint:all" failed. Use --force to continue.

Aborted due to warnings.

--- end ---
Traceback (most recent call last):
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1400, in main
    libup.run(args.repo, args.output, args.branch)
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1338, in run
    self.npm_upgrade(plan)
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 1049, in npm_upgrade
    self.npm_test()
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/__init__.py", line 287, in npm_test
    self.check_call(['npm', 'test'])
  File "/venv/lib/python3.9/site-packages/runner-0.1.0-py3.9.egg/runner/shell2.py", line 54, in check_call
    res.check_returncode()
  File "/usr/lib/python3.9/subprocess.py", line 460, 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.