$ date
--- stdout ---
Fri May 1 09:40:35 UTC 2026
--- end ---
$ git clone file:///srv/git/mediawiki-services-cxserver.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 ---
7584ba0f46f15044de083cf4cd2088a6afe5f366 refs/heads/master
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"istanbul-lib-processinfo": {
"name": "istanbul-lib-processinfo",
"severity": "moderate",
"isDirect": false,
"via": [
"uuid"
],
"effects": [
"nyc"
],
"range": "*",
"nodes": [
"node_modules/istanbul-lib-processinfo"
],
"fixAvailable": {
"name": "nyc",
"version": "14.1.1",
"isSemVerMajor": true
}
},
"nyc": {
"name": "nyc",
"severity": "moderate",
"isDirect": true,
"via": [
"istanbul-lib-processinfo"
],
"effects": [],
"range": ">=15.0.0-alpha.0",
"nodes": [
"node_modules/nyc"
],
"fixAvailable": {
"name": "nyc",
"version": "14.1.1",
"isSemVerMajor": true
}
},
"swagger-router": {
"name": "swagger-router",
"severity": "moderate",
"isDirect": true,
"via": [
"uuid"
],
"effects": [],
"range": ">=0.7.4",
"nodes": [
"node_modules/swagger-router"
],
"fixAvailable": {
"name": "swagger-router",
"version": "0.7.3",
"isSemVerMajor": true
}
},
"uuid": {
"name": "uuid",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1116970,
"name": "uuid",
"dependency": "uuid",
"title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
"url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
"severity": "moderate",
"cwe": [
"CWE-787",
"CWE-1285"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<14.0.0"
}
],
"effects": [
"istanbul-lib-processinfo",
"swagger-router"
],
"range": "<14.0.0",
"nodes": [
"node_modules/swagger-router/node_modules/uuid",
"node_modules/uuid"
],
"fixAvailable": {
"name": "swagger-router",
"version": "0.7.3",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 4,
"high": 0,
"critical": 0,
"total": 4
},
"dependencies": {
"prod": 268,
"dev": 585,
"optional": 52,
"peer": 1,
"peerOptional": 0,
"total": 903
}
}
}
--- end ---
Upgrading n:eslint-config-wikimedia from 0.31.0 -> 0.32.3
$ /usr/bin/npm install
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN node_modules/@babel/eslint-parser
npm WARN dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN 29 more (@eslint-community/eslint-utils, ...)
npm WARN
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'cxserver@1.2.1',
npm WARN EBADENGINE required: { node: '>=24' },
npm WARN EBADENGINE current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
--- stdout ---
added 908 packages, and audited 909 packages in 16s
208 packages are looking for funding
run `npm fund` for details
4 moderate severity vulnerabilities
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 ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
$ ./node_modules/.bin/eslint . --fix
--- stdout ---
/src/repo/app.js
51:1 warning The type 'Express' is undefined jsdoc/no-undefined-types
83:34 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
89:25 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
264:9 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
265:10 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/bin/segment.js
17:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/Config.js
42:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
64:38 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
97:29 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/adaptation/TemplateParameterMapper.js
110:5 warning Mixed spaces and tabs no-mixed-spaces-and-tabs
110:7 warning Expected no linebreak before this expression implicit-arrow-linebreak
113:4 warning Mixed spaces and tabs no-mixed-spaces-and-tabs
/src/repo/lib/lineardoc/MwContextualizer.js
143:35 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
/src/repo/lib/logging.js
7:1 warning The type 'winston.Logger' is undefined jsdoc/no-undefined-types
/src/repo/lib/mw/MWPageLoader.js
19:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/suggestion/SectionSuggester.js
13:1 warning Missing JSDoc @param "dbPool" type jsdoc/require-param-type
/src/repo/lib/swagger-ui.js
26:9 warning Found readFile from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/translationunits/MWCategory.js
15:41 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/translationunits/MWFile.js
44:51 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/translationunits/MWImage.js
123:68 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/util.js
133:23 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/scripts/template-mapping.js
108:7 warning Found existsSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
114:14 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/spec.yaml
197:1 warning This line has a length of 139. Maximum allowed is 100 max-len
248:1 warning This line has a length of 139. Maximum allowed is 100 max-len
470:1 warning This line has a length of 109. Maximum allowed is 100 max-len
503:1 warning This line has a length of 216. Maximum allowed is 100 max-len
540:1 warning This line has a length of 110. Maximum allowed is 100 max-len
547:1 warning This line has a length of 216. Maximum allowed is 100 max-len
589:1 warning This line has a length of 106. Maximum allowed is 100 max-len
606:1 warning This line has a length of 134. Maximum allowed is 100 max-len
621:1 warning This line has a length of 109. Maximum allowed is 100 max-len
653:1 warning This line has a length of 106. Maximum allowed is 100 max-len
670:1 warning This line has a length of 134. Maximum allowed is 100 max-len
/src/repo/test/adaptation/SectionTest.js
31:20 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/features/app/spec.js
21:16 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
168:10 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
/src/repo/test/lineardoc/LinearDoc.test.js
28:22 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
32:24 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
36:26 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
78:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
101:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
156:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
249:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/mw/MWPageLoaderTest.js
37:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
46:5 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/mw/SectionWrap.test.js
17:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/segmentation/CXSegmenter.test.js
28:19 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
34:3 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/testutils.js
22:5 warning Found writeFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/translationunits/MWReference.test.js
38:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
55:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/utils/assert.js
8:40 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
✖ 53 problems (0 errors, 53 warnings)
--- end ---
$ ./node_modules/.bin/eslint . -f json
--- stdout ---
[{"filePath":"/src/repo/app.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'Express' is undefined.","line":51,"column":1,"nodeType":"Block","endLine":51,"endColumn":1},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":83,"column":34,"nodeType":"NewExpression","endLine":86,"endColumn":3},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":89,"column":25,"nodeType":"CallExpression","endLine":89,"endColumn":58},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":264,"column":9,"nodeType":"CallExpression","endLine":264,"endColumn":45},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":265,"column":10,"nodeType":"CallExpression","endLine":265,"endColumn":46}],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'compression_level' is not in camel case.","line":32,"column":2,"nodeType":"Identifier","messageId":"notCamelCase","endLine":32,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'log_header_whitelist' is not in camel case.","line":36,"column":2,"nodeType":"Identifier","messageId":"notCamelCase","endLine":36,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'log_header_whitelist' is not in camel case.","line":83,"column":11,"nodeType":"Identifier","messageId":"notCamelCase","endLine":83,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external Application\n */\n\nimport { createServer as createHTTPServer } from 'http';\nimport { createServer as createHTTPSServer } from 'https';\nimport { readFileSync } from 'fs';\nimport { inspect, promisify } from 'util';\nimport { randomUUID } from 'crypto';\nimport express from 'express';\nimport compression from 'compression';\nimport { load } from 'js-yaml';\nimport bodyParser from 'body-parser';\nimport addShutdown from 'http-shutdown';\nimport { createPool } from 'mysql';\nimport { HTTPError, responseTimeMetricsMiddleware } from './lib/util.js';\nimport MTClientError from './lib/mt/MTClientError.js';\nimport packageInfo from './package.json' with { type: 'json' };\nimport CXConfig from './lib/Config.js';\nimport PrometheusClient from './lib/metric.js';\nimport { logger } from './lib/logging.js';\nimport infoRoutes from './lib/routes/info.js';\nimport rootRoutes from './lib/routes/root.js';\nimport { router as v1Routes } from './lib/routes/v1.js';\nimport v2Routes from './lib/routes/v2.js';\n\nconst defaultConfig = {\n\tname: packageInfo.name,\n\tport: 8888,\n\tinterface: '0.0.0.0',\n\t// eslint-disable-next-line camelcase\n\tcompression_level: 3,\n\tcors: '*',\n\tcsp: \"default-src 'self'; object-src 'none'; media-src *; img-src *; style-src *; frame-ancestors 'self'\",\n\t// eslint-disable-next-line camelcase\n\tlog_header_whitelist: [\n\t\t'cache-control',\n\t\t'content-type',\n\t\t'content-length',\n\t\t'if-match',\n\t\t'user-agent',\n\t\t'x-request-id'\n\t],\n\tspecfile: './spec.yaml'\n};\n\n/**\n * Creates an express app and initialises it\n *\n * @param {Object} options the options to initialise the app with\n * @return {Express} the express app object\n */\nexport async function initApp( options ) {\n\tconst app = express();\n\n\toptions = Object.assign( {}, defaultConfig, options );\n\n\t// get the options and make them available in the app\n\tapp.logger = logger( options.name, options.logging );\n\tapp.logger.log( 'info', `Starting ${ options.name }` );\n\tapp.conf = options; // this app's config options\n\tapp.info = packageInfo; // this app's package info\n\tapp.metrics = new PrometheusClient( {\n\t\tcollectDefaultMetrics: true,\n\t\tstaticLabels: { service: options.name }\n\t} ); // the metrics\n\n\t// set outgoing proxy\n\tif ( app.conf.proxy ) {\n\t\tprocess.env.HTTP_PROXY = app.conf.proxy;\n\t\t// if there is a list of domains which should\n\t\t// not be proxied, set it\n\t\tif ( app.conf.no_proxy_list ) {\n\t\t\tif ( Array.isArray( app.conf.no_proxy_list ) ) {\n\t\t\t\tprocess.env.NO_PROXY = app.conf.no_proxy_list.join( ',' );\n\t\t\t} else {\n\t\t\t\tprocess.env.NO_PROXY = app.conf.no_proxy_list;\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line camelcase\n\tapp.conf.log_header_whitelist = new RegExp(\n\t\t`^(?:${ app.conf.log_header_whitelist.map( ( item ) => item.trim() ).join( '|' ) })$`,\n\t\t'i'\n\t);\n\n\ttry {\n\t\tapp.conf.spec = load( readFileSync( app.conf.specfile ) );\n\t} catch ( e ) {\n\t\tapp.logger.log( 'warn/spec', `Could not load the spec: ${ e }` );\n\t\tapp.conf.spec = {};\n\t}\n\n\t// set the CORS and CSP headers.\n\tapp.all( '*', ( req, res, next ) => {\n\t\tif ( app.conf.cors !== false ) {\n\t\t\tres.header( 'access-control-allow-origin', app.conf.cors );\n\t\t\tres.header(\n\t\t\t\t'access-control-allow-headers',\n\t\t\t\t'accept, authorization, x-requested-with, content-type, x-wikimedia-debug'\n\t\t\t);\n\t\t\tres.header( 'access-control-expose-headers', 'etag' );\n\t\t}\n\t\tif ( app.conf.csp !== false ) {\n\t\t\tres.header( 'x-xss-protection', '1; mode=block' );\n\t\t\tres.header( 'x-content-type-options', 'nosniff' );\n\t\t\tres.header( 'x-frame-options', 'SAMEORIGIN' );\n\t\t\tres.header( 'content-security-policy', app.conf.csp );\n\t\t\tres.header( 'x-content-security-policy', app.conf.csp );\n\t\t\tres.header( 'x-webkit-csp', app.conf.csp );\n\t\t}\n\n\t\tnext();\n\t} );\n\n\t// disable the X-Powered-By header\n\tapp.set( 'x-powered-by', false );\n\t// disable the ETag header.Yet to identify a valid need for cxserver.\n\tapp.set( 'etag', false );\n\t// enable compression\n\tapp.use(\n\t\tcompression( {\n\t\t\tlevel: app.conf.compression_level\n\t\t} )\n\t);\n\t// use the application/x-www-form-urlencoded parser\n\tapp.use(\n\t\tbodyParser.urlencoded( {\n\t\t\textended: true,\n\t\t\tlimit: 500000 // 0.5 megabyte\n\t\t} )\n\t);\n\t// use the JSON body parser\n\tapp.use(\n\t\tbodyParser.json( {\n\t\t\tlimit: 500000\n\t\t} )\n\t);\n\n\t// Add a middleware to log the response time\n\tapp.use( responseTimeMetricsMiddleware( app ) );\n\n\tapp.use( ( req, res, next ) => {\n\t\tapp.logger = app.logger.child( {\n\t\t\turl: {\n\t\t\t\tpath: req.url\n\t\t\t},\n\t\t\thttp: {\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: req.method,\n\t\t\t\t\tid: randomUUID()\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t\tnext();\n\t} );\n\n\tapp.use( '/', rootRoutes );\n\tapp.use( '/v1', v1Routes );\n\tapp.use( '/v2', v2Routes );\n\tapp.use( '/_info', infoRoutes );\n\tapp.get( '/metrics', async ( req, res ) => {\n\t\tres.set( 'Content-Type', app.metrics.client.register.contentType );\n\t\tres.end( await app.metrics.metrics() );\n\t} );\n\n\t// Catch and handle propagated errors\n\tapp.use( ( err, req, res, next ) => {\n\t\tif ( err.cause ) {\n\t\t\t// ECS doesn't support a \"cause\" field in error\n\t\t\t// Log the error to a custom field.\n\t\t\t// See: https://www.elastic.co/guide/en/ecs/current/ecs-custom-fields-in-ecs.html\n\t\t\terr.Cause = inspect( err, { depth: 4 } );\n\t\t}\n\n\t\tif ( err instanceof HTTPError ) {\n\t\t\t// For HTTPError, only log errors with 500+ status codes\n\t\t\tif ( err.status >= 500 ) {\n\t\t\t\tapp.logger.error( 'HTTP Error details:', err );\n\t\t\t}\n\t\t} else if ( err instanceof MTClientError ) {\n\t\t\tif ( err.status >= 500 ) {\n\t\t\t\tapp.logger.error( 'MT Client Error', err );\n\t\t\t}\n\t\t} else {\n\t\t\tapp.logger.error( 'Error details:', err );\n\t\t}\n\n\t\tif ( res.writableFinished ) {\n\t\t\t// response has been sent and we've logged the error\n\t\t\t// Avoid passing the error to Express error handler to have\n\t\t\t// it be logged again by Express in a format that's not supported.\n\t\t\t// See: T377966\n\t\t\treturn;\n\t\t}\n\n\t\tif ( res.headersSent ) {\n\t\t\t// Headers have been sent, but the response has not been flushed out.\n\t\t\t// Send the error to Express to log and flush the response.\n\t\t\treturn next( err );\n\t\t}\n\n\t\tres.status( err.status || 500 );\n\n\t\tres.json( {\n\t\t\terror: {\n\t\t\t\tmessage: err.message || 'Internal Server Error',\n\t\t\t\tstatus: err.status\n\t\t\t}\n\t\t} );\n\t} );\n\n\tconst config = new CXConfig( app );\n\tawait config.parseAndLoadConfig();\n\tapp.registry = config;\n\n\t// Initialize database connection pool for section mapping\n\tif ( app.conf.sectionmapping?.type === 'mysql' ) {\n\t\ttry {\n\t\t\tapp.dbPool = createPool( {\n\t\t\t\tconnectionLimit: 10,\n\t\t\t\thost: app.conf.sectionmapping.host,\n\t\t\t\tuser: app.conf.sectionmapping.user,\n\t\t\t\tpassword: app.conf.sectionmapping.password,\n\t\t\t\tdatabase: app.conf.sectionmapping.database,\n\t\t\t\tacquireTimeout: 60000,\n\t\t\t\ttimeout: 60000,\n\t\t\t\treconnect: true,\n\t\t\t\tmultipleStatements: false\n\t\t\t} );\n\n\t\t\tapp.logger.log(\n\t\t\t\t'info',\n\t\t\t\t'MySQL connection pool initialized for section mapping'\n\t\t\t);\n\n\t\t\t// Test the connection\n\t\t\tconst testQuery = promisify( app.dbPool.query ).bind( app.dbPool );\n\t\t\tawait testQuery( 'SELECT 1' );\n\t\t\tapp.logger.log( 'debug', 'Database connection pool test successful' );\n\t\t} catch ( error ) {\n\t\t\tapp.logger.error( 'Failed to initialize MySQL connection pool:', error );\n\t\t\t// Don't fail the entire app startup, just log the error\n\t\t}\n\t}\n\treturn app;\n}\n\n/**\n * Creates and starts the service's web server\n *\n * @param {Application} app the app object to use in the service\n * @return {Promise} a promise creating the web server\n */\nfunction createServer( app ) {\n\t// return a promise which creates an HTTP or HTTPS server,\n\t// attaches the app to it, and starts accepting\n\t// incoming client requests\n\tlet server;\n\tconst isHttps = app.conf.private_key && app.conf.certificate;\n\tif ( isHttps ) {\n\t\tconst credentials = {\n\t\t\tkey: readFileSync( app.conf.private_key ),\n\t\t\tcert: readFileSync( app.conf.certificate )\n\t\t};\n\t\tserver = createHTTPSServer( credentials, app );\n\t} else {\n\t\tserver = createHTTPServer( app );\n\t}\n\n\treturn new Promise( ( resolve ) => {\n\t\tserver = server.listen( app.conf.port, app.conf.interface, resolve );\n\t\tserver = addShutdown( server );\n\n\t\t// Add graceful database cleanup\n\t\tconst originalShutdown = server.shutdown;\n\t\tserver.shutdown = ( callback ) => {\n\t\t\tif ( app.dbPool ) {\n\t\t\t\tapp.dbPool.end( () => {\n\t\t\t\t\tapp.logger.log( 'info', 'MySQL connection pool closed gracefully' );\n\t\t\t\t\treturn originalShutdown.call( server, callback );\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\treturn originalShutdown.call( server, callback );\n\t\t\t}\n\t\t};\n\t} ).then( () => {\n\t\tapp.logger.log(\n\t\t\t'info',\n\t\t\t`Worker ${ process.pid } listening on http${ isHttps ? 's' : '' }://${ app.conf.interface || '*' }:${ app.conf.port }`\n\t\t);\n\t\treturn server;\n\t} );\n}\n\nexport default async function ( options ) {\n\tconst app = await initApp( options );\n\tcreateServer( app );\n\tprocess.on( 'unhandledRejection', ( reason /* promise */ ) => {\n\t\tapp.logger.error( 'Unhandled Promise Rejection', {\n\t\t\terror: reason,\n\t\t\tstack: reason.stack\n\t\t} );\n\t} );\n\treturn app;\n}\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/.eslintrc.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/bin/adapt.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":26,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":26,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/linear-reduce.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":12,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":12,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/linearize.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":13,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":13,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/mt.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":24,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":24,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":44,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":44,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":61,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":61,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/section-wrap.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":15,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":15,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/segment.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":17,"column":33,"nodeType":"CallExpression","endLine":17,"endColumn":89}],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":35,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":35,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/* eslint-disable n/no-process-exit */\n\nimport { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\nimport Segmenter from '../lib/segmentation/CXSegmenter.js';\nimport { Normalizer, Parser, MwContextualizer } from '../lib/lineardoc/index.js';\nconst dirname = import.meta.dirname;\n\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/g, '' ) );\n\treturn normalizer.getHtml();\n}\n\nfunction getParsedDoc( content ) {\n\tconst pageloaderConfig = load( readFileSync( dirname + '/../config/MWPageLoader.yaml' ) );\n\tconst parser = new Parser( new MwContextualizer(\n\t\t{ removableSections: pageloaderConfig.removableSections }\n\t), {\n\t\twrapSections: true\n\t} );\n\tparser.init();\n\tparser.write( content );\n\treturn parser.builder.doc;\n}\n\nconst inputHtml = readFileSync( '/dev/stdin', 'utf8' );\nif ( inputHtml.trim() === '' ) {\n\tconst script = process.argv[ 1 ];\n\tprocess.stderr.write(\n\t\t'Usage: node ' + script + ' < file\\n' +\n\t\t'Input must be wrapped in a block element such as <p>...</p> or <div>..</div>.\\n'\n\t);\n\tprocess.exit( 1 );\n\n}\nconst language = process.argv[ 2 ];\nconst parsedDoc = getParsedDoc( inputHtml );\nconst segmenter = new Segmenter();\nconst segmentedLinearDoc = segmenter.segment( parsedDoc, language );\nconst result = normalize( segmentedLinearDoc.getHtml() );\nprocess.stdout.write( result + '\\n' );\nprocess.stdout.write( '==Categories==\\n' );\nprocess.stdout.write( JSON.stringify( parsedDoc.categories, null, 2 ) + '\\n' );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/template-params.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/bin/translate.js","messages":[],"suppressedMessages":[{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":27,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":27,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"n/no-process-exit","severity":1,"message":"Don't use process.exit(); throw an error instead.","line":37,"column":2,"nodeType":"CallExpression","messageId":"noProcessExit","endLine":37,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/config.dev.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config.prod.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/Apertium.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/Elia.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/Google.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/JsonDict.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/LingoCloud.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/MWPageLoader.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/MinT.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/TestClient.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/languages.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/mt-defaults.wikimedia.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/config/transform.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/docker-compose.yaml","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/eslint.config.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/jsduck.categories.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/jsduck.config.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/lib/Adapter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/Config.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":42,"column":28,"nodeType":"CallExpression","endLine":42,"endColumn":67},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":64,"column":38,"nodeType":"CallExpression","endLine":64,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":97,"column":29,"nodeType":"CallExpression","endLine":97,"endColumn":59}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\n\nclass CXConfig {\n\tconstructor( app ) {\n\t\tthis.app = app;\n\t\tthis.logger = app.logger;\n\t\tthis.languages = null;\n\t\tthis.mt = {};\n\t}\n\n\tlog( level, info ) {\n\t\tif ( this.logger && this.logger.log ) {\n\t\t\tthis.logger.log( level, info );\n\t\t}\n\t}\n\n\tisObject( x ) {\n\t\treturn ( !!x ) && ( x.constructor === Object );\n\t}\n\n\tisString( x ) {\n\t\treturn typeof x === 'string' || x instanceof String;\n\t}\n\n\tasync parseAndLoadConfig() {\n\t\t// Supported languages\n\t\tthis.loadLanguageConf();\n\t\tthis.log( 'debug', `Found ${ this.languages?.length } languages from the configuration` );\n\t\t// Machine translation providers\n\t\tthis.mt = await this.loadServiceConf( this.app.conf.mt, 'mt' );\n\t\tthis.log( 'debug', `Found ${ Object.keys( this.mt ).length } MT providers` );\n\t}\n\n\tloadLanguageConf() {\n\t\tif ( Array.isArray( this.app.conf.languages ) ) {\n\t\t\t// Configuration is provided as an array\n\t\t\tthis.languages = this.app.conf.languages;\n\t\t} else if ( this.isString( this.app.conf.languages ) ) {\n\t\t\t// Configuration is provided in the named file\n\t\t\ttry {\n\t\t\t\tthis.languages = load( readFileSync( this.app.conf.languages ) );\n\t\t\t} catch ( e ) {\n\t\t\t\tthis.log( 'warn/spec', 'Could not load the languages registry: ' + e );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.log( 'error', 'Could not parse cxserver.conf.languages' );\n\t\t}\n\t}\n\n\tasync loadServiceConf( input, type ) {\n\t\tconst output = {};\n\t\tconst providers = Object.keys( input ).filter( ( item ) => item !== 'defaults' );\n\n\t\tfor ( const providerName of providers ) {\n\t\t\tconst languageRef = input[ providerName ].languages;\n\n\t\t\tif ( this.isObject( languageRef ) ) {\n\t\t\t\t// Language configuration is provided as an object\n\t\t\t\toutput[ providerName ] = languageRef;\n\t\t\t} else if ( this.isString( languageRef ) ) {\n\t\t\t\t// Language configuration is provided in the named file\n\t\t\t\ttry {\n\t\t\t\t\tconst providerLanguages = load( readFileSync( languageRef ) );\n\n\t\t\t\t\t// Allow hooking in JavaScript code to define the language pairs\n\t\t\t\t\tif ( providerLanguages.handler ) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst Handler = ( await import( '../config/' + providerLanguages.handler ) ).default;\n\t\t\t\t\t\t\toutput[ providerName ] = new Handler( providerLanguages ).languages;\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\tthis.log( 'error', `Could not load handler '${ providerLanguages.handler }': ${ e }` );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput[ providerName ] = providerLanguages;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tthis.log( 'error', `Could not load or parse file '${ languageRef }': ${ e }` );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.log( 'error', `Could not parse cxserver.conf.${ type }.${ providerName }` );\n\t\t\t}\n\t\t}\n\n\t\t// Handle \"default provider\" configuration separately\n\t\tif ( !input.defaults ) {\n\t\t\treturn output;\n\t\t}\n\n\t\tif ( Array.isArray( input.defaults ) ) {\n\t\t\t// \"Default provider\" configuration is provided as an array\n\t\t\toutput.defaults = input.defaults;\n\t\t} else if ( this.isString( input.defaults ) ) {\n\t\t\t// \"Default provider\" configuration is provided in the named file\n\t\t\ttry {\n\t\t\t\toutput.defaults = load( readFileSync( input.defaults ) );\n\t\t\t} catch ( e ) {\n\t\t\t\tthis.log( 'error', `Could not load or parse file '${ input.defaults }': ${ e }` );\n\t\t\t}\n\t\t} else {\n\t\t\tthis.log( 'error', `Could not parse cxserver.conf.${ type }.defaults` );\n\t\t}\n\n\t\treturn output;\n\t}\n\n\t/**\n\t * Return all language pairs.\n\t *\n\t * @return {Object} The languages, indexed by source language\n\t * pointing to a list of target languages.\n\t */\n\tget LanguagePairs() {\n\t\treturn {\n\t\t\tsource: this.languages,\n\t\t\ttarget: this.languages\n\t\t};\n\t}\n\n\tget MTPairs() {\n\t\treturn this.mt;\n\t}\n\n\t/**\n\t * Get the available toolset for the given language\n\t *\n\t * @param {string} language\n\t * @return {Object} The toolset for the given language\n\t */\n\tgetToolSetForLanguage( language ) {\n\t\tconst tools = { mt: this.mt },\n\t\t\tresult = { mt: {} };\n\n\t\tObject.keys( tools ).forEach( ( toolName ) => {\n\t\t\tconst tool = tools[ toolName ], providers = Object.keys( tool );\n\n\t\t\t// Go through default MTs for language pairs and filter out the pairs where\n\t\t\t// source language is equal to the language provided as param of this method.\n\t\t\t// Then, add target language and default MT to the result object.\n\t\t\tObject.keys( tool.defaults || {} )\n\t\t\t\t.filter( ( pair ) => pair.indexOf( language + '-' ) === 0 )\n\t\t\t\t.forEach( ( pair ) => {\n\t\t\t\t\tconst targetLanguage = pair.slice( language.length + 1 );\n\n\t\t\t\t\tresult[ toolName ][ targetLanguage ] =\n\t\t\t\t\t\tresult[ toolName ][ targetLanguage ] || [];\n\t\t\t\t\tresult[ toolName ][ targetLanguage ].push( tool.defaults[ pair ] );\n\t\t\t\t} );\n\n\t\t\tfor ( let i = 0, length = providers.length; i < length; i++ ) {\n\t\t\t\tconst provider = providers[ i ], languages = tool[ provider ][ language ];\n\n\t\t\t\tif ( !languages ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Add each target language to the result object as key\n\t\t\t\t// and push MT provider to the values array.\n\t\t\t\tfor ( let j = 0, langsLength = languages.length; j < langsLength; j++ ) {\n\t\t\t\t\tconst targetLanguage = languages[ j ],\n\t\t\t\t\t\tresults = result[ toolName ][ targetLanguage ];\n\n\t\t\t\t\tif ( !results ) {\n\t\t\t\t\t\tresult[ toolName ][ targetLanguage ] = [ provider ];\n\t\t\t\t\t} else if ( !results.includes( provider ) ) { // Don't duplicate providers\n\t\t\t\t\t\tresult[ toolName ][ targetLanguage ].push( provider );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get the available toolset for the given language pair\n\t *\n\t * @param {string} from source language\n\t * @param {string} to target language\n\t * @return {Object} the toolset (empty object if nothing available)\n\t */\n\tgetToolSet( from, to ) {\n\t\tconst result = {};\n\n\t\tif ( !to ) {\n\t\t\treturn this.getToolSetForLanguage( from );\n\t\t}\n\n\t\t// Known tools\n\t\tconst tools = { mt: this.mt };\n\n\t\tObject.keys( tools ).forEach( ( toolname ) => {\n\t\t\tlet defaultProvider;\n\t\t\tconst tool = tools[ toolname ];\n\t\t\tconst providers = Object.keys( tool );\n\t\t\t// If there is a default provider, add it to the beginning of array.\n\t\t\tif ( tool.defaults && tool.defaults[ from + '-' + to ] ) {\n\t\t\t\tdefaultProvider = tool.defaults[ from + '-' + to ];\n\t\t\t\tresult[ toolname ] = [ defaultProvider ];\n\t\t\t}\n\t\t\tfor ( let j = 0; j < providers.length; j++ ) {\n\t\t\t\tconst provider = tool[ providers[ j ] ];\n\t\t\t\tif ( provider[ from ] && provider[ from ].includes( to ) &&\n\t\t\t\t\tdefaultProvider !== providers[ j ]\n\t\t\t\t) {\n\t\t\t\t\tresult[ toolname ] = result[ toolname ] || [];\n\t\t\t\t\tresult[ toolname ].push( providers[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get the valid toolsets for the given language pair.\n\t * If the provider name is given, it is validated.\n\t * If provider name is not given, the first one that appears in the registry will be returned.\n\t * If not valid provider is found, the returns null.\n\t *\n\t * @param {string} from source language\n\t * @param {string} to target language\n\t * @param {string} serviceType Service type from the registry, such as 'mt' or 'dictionary'\n\t * @param {string} [providerName] If given, the provider is validated.\n\t * @return {string|null|boolean} Provider name\n\t */\n\tgetValidProvider( from, to, serviceType, providerName ) {\n\t\tconst toolset = this.getToolSet( from, to );\n\n\t\tif ( !toolset[ serviceType ] ) {\n\t\t\t// No tools found for this service for this language pair\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( providerName ) {\n\t\t\tif ( !toolset[ serviceType ].includes( providerName ) ) {\n\t\t\t\t// The requested provider doesn't appear in the registry,\n\t\t\t\t// so it's invalid\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// The provider is valid\n\t\t\treturn providerName;\n\t\t}\n\n\t\t// If provider not given, use the first one in the registry\n\t\treturn toolset[ serviceType ][ 0 ];\n\t}\n}\n\nexport default CXConfig;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TemplateParameterMapper.js","messages":[{"ruleId":"no-mixed-spaces-and-tabs","severity":1,"message":"Mixed spaces and tabs.","line":110,"column":5,"nodeType":"Program","messageId":"mixedSpacesAndTabs","endLine":110,"endColumn":7},{"ruleId":"implicit-arrow-linebreak","severity":1,"message":"Expected no linebreak before this expression.","line":110,"column":7,"nodeType":"Identifier","messageId":"unexpected","endLine":110,"endColumn":26},{"ruleId":"no-mixed-spaces-and-tabs","severity":1,"message":"Mixed spaces and tabs.","line":113,"column":4,"nodeType":"Program","messageId":"mixedSpacesAndTabs","endLine":113,"endColumn":6}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { getProp } from '../util.js';\n\nclass TemplateParameterMapper {\n\tconstructor( sourceParams, sourceTemplateData, targetTemplateData, mappingFromDatabase = {} ) {\n\t\tthis.sourceParams = sourceParams;\n\t\tthis.sourceTemplateData = sourceTemplateData;\n\t\tthis.targetTemplateData = targetTemplateData;\n\t\tthis.parameterMap = {};\n\t\tthis.parametersAreMapped = false;\n\t\tthis.mappingFromDatabase = mappingFromDatabase;\n\t}\n\n\tgetAdaptedParameters() {\n\t\tconst adaptedParameters = {};\n\t\tconst parameterMap = this.getParameterMap();\n\t\tfor ( const name in this.sourceParams ) {\n\t\t\tif ( name in parameterMap ) {\n\t\t\t\tadaptedParameters[ parameterMap[ name ] ] = this.sourceParams[ name ];\n\t\t\t}\n\t\t}\n\n\t\treturn adaptedParameters;\n\t}\n\n\tgetMandatoryParamsForTarget() {\n\t\tif ( !this.targetTemplateData.params ) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys( this.targetTemplateData.params ).filter(\n\t\t\t( paramName ) => this.targetTemplateData.params[ paramName ].required === true\n\t\t);\n\t}\n\n\tgetOptionalParamsForTarget() {\n\t\tif ( !this.targetTemplateData.params ) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Object.keys( this.targetTemplateData.params ).filter(\n\t\t\t( paramName ) => this.targetTemplateData.params[ paramName ].required === false\n\t\t);\n\t}\n\n\t/**\n\t * Find target template parameter mapping for all the parameters in source template.\n\t *\n\t * @return {Object} Object with mapping from each source param to param name in target template.\n\t */\n\tgetParameterMap() {\n\t\tif ( this.parametersAreMapped ) {\n\t\t\treturn this.parameterMap;\n\t\t}\n\n\t\tconst sourceCitoidMap = getProp( [ 'maps', 'citoid' ], this.sourceTemplateData ) || {};\n\t\tconst targetCitoidMap = getProp( [ 'maps', 'citoid' ], this.targetTemplateData ) || {};\n\n\t\tfor ( const name in this.sourceParams ) {\n\t\t\tif ( !isNaN( name ) ) {\n\t\t\t\t// Unnamed parameters, which are named 1, 2, 3...\n\t\t\t\tthis.parameterMap[ name ] = name;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !this.targetTemplateData.params ) {\n\t\t\t\t// No params in target template data definition\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Try to locate this source param in the source template data definition\n\t\t\tconst normalizedKey = name.trim().toLowerCase().replace( /[\\s+_-]+/g, '' );\n\t\t\tconst sourceTemplateParam = this.sourceTemplateData.params[ name ] ||\n\t\t\t\tthis.sourceTemplateData.params[ normalizedKey ];\n\t\t\tlet sourceAliases = sourceTemplateParam ? sourceTemplateParam.aliases : [];\n\n\t\t\tif ( !sourceTemplateParam ) {\n\t\t\t\t// The source param name can be in the aliases of other params in source\n\t\t\t\t// template data. If so find that param and add aliases to sourceAliases\n\t\t\t\tconst paramMatchingAlias = Object.keys( this.sourceTemplateData.params ).find(\n\t\t\t\t\t( key ) => ( this.sourceTemplateData.params[ key ].aliases || [] )\n\t\t\t\t\t\t.includes( name )\n\t\t\t\t);\n\t\t\t\tif ( paramMatchingAlias ) {\n\t\t\t\t\tsourceAliases.push( paramMatchingAlias );\n\t\t\t\t\tsourceAliases = sourceAliases.concat(\n\t\t\t\t\t\tthis.sourceTemplateData.params[ paramMatchingAlias ].aliases || []\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst sourceKeyAndAliases = new Set( sourceAliases );\n\t\t\tsourceKeyAndAliases.add( name );\n\t\t\tsourceKeyAndAliases.add( normalizedKey );\n\n\t\t\t// Search in the aliases for a match - case insensitive.\n\t\t\tfor ( const paramName in this.targetTemplateData.params ) {\n\t\t\t\tconst param = this.targetTemplateData.params[ paramName ];\n\n\t\t\t\tconst targetKeyAndAliases = new Set(\n\t\t\t\t\t[\n\t\t\t\t\t\t...( param.aliases || [] ),\n\t\t\t\t\t\tparamName,\n\t\t\t\t\t\t// The citoid map inside the template data has parameter name mapping.\n\t\t\t\t\t\t// consider each of those mapping as an alias to target params.\n\t\t\t\t\t\t...this.getNameAliasesFromCitoid( paramName, sourceCitoidMap ),\n\t\t\t\t\t\t...this.getNameAliasesFromCitoid( paramName, targetCitoidMap )\n\t\t\t\t\t]\n\t\t\t\t);\n\n\t\t\t\t// Find intersection of sourceKeyAndAliases and targetKeyAndAliases\n\t\t\t\tconst match = ( [ ...targetKeyAndAliases ].some( ( key ) =>\n\t\t\t\t\t// key can be integer or string.\n\t\t\t\t\t sourceKeyAndAliases.has(\n\t\t\t\t\t\t`${ key }`.trim().toLowerCase().replace( /[\\s+_-]+/g, '' )\n\t\t\t\t\t)\n\t\t\t\t ) );\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\t// Found a match\n\t\t\t\t\tthis.parameterMap[ name ] = paramName;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Still not found? Try templatemapping database\n\t\t\tif ( !this.parameterMap[ name ] && this.mappingFromDatabase[ name ] ) {\n\t\t\t\tthis.parameterMap[ name ] = this.mappingFromDatabase[ name ];\n\t\t\t}\n\t\t}\n\n\t\tthis.parametersAreMapped = true;\n\t\treturn this.parameterMap;\n\t}\n\n\t/**\n\t * For the given parameter name, get the aliases from the citoid map\n\t *\n\t * @param {string} paramName\n\t * @param {Object} citoidMap\n\t * @return {Set}\n\t */\n\tgetNameAliasesFromCitoid( paramName, citoidMap ) {\n\t\tconst aliases = new Set();\n\t\tconst citoidAliases = citoidMap[ paramName ];\n\t\tif ( !citoidAliases ) {\n\t\t\treturn aliases;\n\t\t}\n\t\tif ( !Array.isArray( citoidAliases ) ) {\n\t\t\taliases.add( citoidAliases );\n\t\t} else {\n\t\t\t// Sometimes citoid map values are nested arrays like\n\t\t\t// \"author\": [ [ \"first\", \"last\" ], [ \"first2\", \"last2\" ] ]\n\t\t\t// That is not a useful information to do parameter mapping.\n\t\t\tcitoidAliases\n\t\t\t\t.filter( ( alias ) => !Array.isArray( alias ) )\n\t\t\t\t.forEach( ( alias ) => aliases.add( alias ) );\n\t\t}\n\t\treturn aliases;\n\t}\n}\n\nexport default TemplateParameterMapper;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TemplateTransclusion.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TransclusionAdapter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/TransclusionFactory.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/adaptation/UnsupportedTransclusion.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/language-domain-mapping.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Builder.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Contextualizer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Doc.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/MwContextualizer.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":143,"column":35,"nodeType":"NewExpression","endLine":143,"endColumn":90}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import Contextualizer from './Contextualizer.js';\nimport { getProp } from './../util.js';\nconst contentBranchNodeNames = [ 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre', 'div', 'table', 'ol', 'ul', 'dl', 'figure', 'center', 'section' ];\n\n/**\n * Contextualizer for MediaWiki DOM HTML\n *\n * See https://www.mediawiki.org/wiki/Specs/HTML\n *\n * @class\n * @extends Contextualizer\n * @constructor\n */\nclass MwContextualizer extends Contextualizer {\n\t/**\n\t * @param {Object} config\n\t * @param {Object} config.removableSections containing array of classes and rdfa values.\n\t * Tags matching these classes or rdfa values will be marked as removable.\n\t * See config/MWPageLoader.yaml\n\t */\n\tconstructor( config ) {\n\t\tsuper( config );\n\t\t// Array holding transclusion fragment ids(about attribute values)\n\t\tthis.removableTransclusionFragments = [];\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tgetChildContext( tag ) {\n\t\tconst context = this.getContext(),\n\t\t\ttype = tag.attributes.typeof || tag.attributes.rel || '';\n\n\t\tif ( context === 'removable' || this.isRemovable( tag ) ) {\n\t\t\treturn 'removable';\n\t\t}\n\n\t\t// Any descendent of Transclusion/Placeholder is verbatim\n\t\tif ( context === 'verbatim' || type.match( /(^|\\s)(mw:Transclusion|mw:Placeholder)\\b/ ) ) {\n\t\t\treturn 'verbatim';\n\t\t}\n\n\t\t// Otherwise, figure is media\n\t\tif ( tag.name === 'figure' ) {\n\t\t\treturn 'media';\n\t\t}\n\n\t\tif ( tag.name === 'span' && type.match( /(^|\\s)(mw:File|mw:Image|mw:Video|mw:Audio)\\b/ ) ) {\n\t\t\treturn 'media-inline';\n\t\t}\n\n\t\t// Immediate childrens of body are sections\n\t\tif ( context === undefined && tag.name === 'body' ) {\n\t\t\treturn 'section';\n\t\t}\n\n\t\t// And figure//figcaption is contentBranch\n\t\tif ( ( context === 'media' || context === 'media-inline' ) && tag.name === 'figcaption' ) {\n\t\t\treturn 'contentBranch';\n\t\t}\n\n\t\t// And ContentBranchNodes are contentBranch\n\t\tif ( ( context === 'section' || context === undefined ) && contentBranchNodeNames.includes( tag.name ) ) {\n\t\t\treturn 'contentBranch';\n\t\t}\n\n\t\t// Else same as parent context\n\t\treturn context;\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tcanSegment() {\n\t\treturn this.getContext() === 'contentBranch';\n\t}\n\n\t/**\n\t * Check if the tag need to be ignored while parsing and hence removed.\n\t *\n\t * @param {Object} tag\n\t * @return {boolean}\n\t */\n\tisRemovable( tag ) {\n\t\tconst removableSections = this.config.removableSections;\n\t\tif ( !this.config.removableSections ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.removableTransclusionFragments.includes( tag.attributes.about ) ) {\n\t\t\t// Once a transclusion is removed, make sure their fragments also removed\n\t\t\t// even if the fragment does not match with removableSections configuration.\n\t\t\treturn true;\n\t\t}\n\n\t\tconst classList = tag.attributes.class ? tag.attributes.class.split( ' ' ) : [];\n\t\tfor ( let i = 0; i < removableSections.classes.length; i++ ) {\n\t\t\tif ( classList.includes( removableSections.classes[ i ] ) ) {\n\t\t\t\tif ( tag.attributes.about ) {\n\t\t\t\t\tthis.removableTransclusionFragments.push( tag.attributes.about );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tconst types = tag.attributes.typeof ? tag.attributes.typeof.split( ' ' ) : [];\n\t\tconst rels = tag.attributes.rel ? tag.attributes.rel.split( ' ' ) : [];\n\t\tconst rdfa = types.concat( rels );\n\t\tfor ( let i = 0; i < removableSections.rdfa.length; i++ ) {\n\t\t\t// Make sure that the rdfa value matches with removable section rdfa and does not\n\t\t\t// have other rdfas in same element.\n\t\t\tif ( rdfa.includes( removableSections.rdfa[ i ] && rdfa.length === 1 ) ) {\n\t\t\t\tif ( tag.attributes.about ) {\n\t\t\t\t\tthis.removableTransclusionFragments.push( tag.attributes.about );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tconst dataMW = tag.attributes[ 'data-mw' ];\n\t\tif ( !dataMW ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// See https://phabricator.wikimedia.org/T274133 for more info\n\t\tlet mwData = {};\n\t\ttry {\n\t\t\tmwData = JSON.parse( dataMW );\n\t\t} catch ( e ) {\n\t\t\treturn false;\n\t\t}\n\t\tconst templateName = getProp( [ 'parts', 0, 'template', 'target', 'wt' ], mwData );\n\t\tif ( !templateName ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor ( let i = 0; i < removableSections.templates.length; i++ ) {\n\t\t\tlet removableTemplateNameRegExp;\n\t\t\tconst removableTemplateName = removableSections.templates[ i ];\n\n\t\t\tif ( removableTemplateName[ 0 ] === '/' && removableTemplateName.slice( -1 ) === '/' ) {\n\t\t\t\t// A regular expression is given.\n\t\t\t\tremovableTemplateNameRegExp = new RegExp( removableTemplateName.slice( 1, -1 ), 'i' );\n\t\t\t}\n\n\t\t\tconst match = removableTemplateNameRegExp ?\n\t\t\t\ttemplateName.match( removableTemplateNameRegExp ) :\n\t\t\t\ttemplateName.toLowerCase() === removableTemplateName.toLowerCase();\n\n\t\t\tif ( match ) {\n\t\t\t\tif ( tag.attributes.about ) {\n\t\t\t\t\tthis.removableTransclusionFragments.push( tag.attributes.about );\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n}\n\nexport default MwContextualizer;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Normalizer.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Parser.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/TextBlock.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/TextChunk.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/Utils.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lineardoc/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/lllang-param-mapping.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/lib/logging.js","messages":[{"ruleId":"jsdoc/no-undefined-types","severity":1,"message":"The type 'winston.Logger' is undefined.","line":7,"column":1,"nodeType":"Block","endLine":7,"endColumn":1}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { createLogger, format as logFormat, transports as logTransports } from 'winston';\nimport { ecsFormat } from '@elastic/ecs-winston-format';\n\n/**\n * @param {string} serviceName Name of the service. Added to default metadata of the logger.\n * @param {Object} options WinstonLoggerOptions, not to be confused with winston.LoggerOptions\n * @return {winston.Logger}\n */\nconst createWinstonLogger = ( serviceName, options = {} ) => {\n\t// Uses spread operator to fill options\n\t// with defaults first and then override with config\n\toptions = {\n\t\t...{\n\t\t\tlevel: 'info',\n\t\t\tstacktrace: true,\n\t\t\tformat: 'json',\n\t\t\ttransports: [ { transport: 'Console' } ]\n\t\t},\n\t\t...options\n\t};\n\n\treturn createLogger( {\n\t\tlevel: options.level,\n\t\tformat: logFormat.combine(\n\t\t\t// Enable stacktrace for errors\n\t\t\tlogFormat.errors( { stack: options.stacktrace } ),\n\t\t\toptions.format === 'ecs' ?\n\t\t\t\tecsFormat( options.formatOptions ) :\n\t\t\t\tlogFormat[ options.format || 'json' ](\n\t\t\t\t\toptions.format ? options.formatOptions : undefined\n\t\t\t\t)\n\t\t),\n\t\tdefaultMeta: {\n\t\t\tservice: serviceName\n\t\t},\n\t\ttransports: ( options.transports || [] ).map(\n\t\t\t( { transport, options: transportOptions } ) => new logTransports[ transport ]( {\n\t\t\t\t...transportOptions,\n\t\t\t\t// Spread format separately so we can add on options as parameters\n\t\t\t\t...( transportOptions && transportOptions.format ?\n\t\t\t\t\t{\n\t\t\t\t\t\tformat: logFormat.combine(\n\t\t\t\t\t\t\tlogFormat.errors( { stack: options.stacktrace } ),\n\t\t\t\t\t\t\ttransportOptions.format === 'ecs' ?\n\t\t\t\t\t\t\t\tecsFormat( transportOptions.formatOptions ) :\n\t\t\t\t\t\t\t\tlogFormat[ transportOptions.format ](\n\t\t\t\t\t\t\t\t\ttransportOptions.formatOptions\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t} :\n\t\t\t\t\t{} )\n\t\t\t} )\n\t\t)\n\t} );\n};\n\nexport const logger = createWinstonLogger;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/metric.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Apertium.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Apertium.languagenames.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Elia.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'api_id' is not in camel case.","line":69,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":69,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'api_key' is not in camel case.","line":70,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":70,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'translation_engine' is not in camel case.","line":71,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":71,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'content_type' is not in camel case.","line":72,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":72,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'language_pair' is not in camel case.","line":73,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":73,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/Google.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/LingoCloud.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'request_id' is not in camel case.","line":52,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":52,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'trans_type' is not in camel case.","line":54,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":54,"endColumn":14,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/MTClient.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/MTClientError.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/MinT.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'source_language' is not in camel case.","line":46,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":46,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'target_language' is not in camel case.","line":48,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":48,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/TestClient.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/annotationmapper/LevenshteinDistance.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/annotationmapper/SubsequenceMatcher.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mt/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/BatchedAPIRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/MWApiRequestManager.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/MWPageLoader.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":19,"column":33,"nodeType":"CallExpression","endLine":19,"endColumn":92}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external MTClient\n */\n\nimport { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\nimport { Title } from 'mediawiki-title';\nimport { MwContextualizer, Parser } from '../lineardoc/index.js';\nimport CXSegmenter from '../segmentation/CXSegmenter.js';\nimport Adapter from '../Adapter.js';\nimport { getProp, HTTPError } from '../util.js';\nimport MWApiRequestManager from './MWApiRequestManager.js';\nimport ApiRequest from './MwApiRequest.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nclass MWPageLoader extends ApiRequest {\n\tconstructor( config ) {\n\t\tsuper( config );\n\t\tthis.pageloaderConfig = load( readFileSync( dirname + '/../../config/MWPageLoader.yaml' ) );\n\t}\n\n\t/**\n\t * @param {string} page The page title\n\t * @param {string} revision The revision id\n\t * @param {boolean} wrapSections Whether translatable sections should be wrapped in\n\t * <section> tag\n\t * @return {Promise}\n\t */\n\tgetPage( page, revision, wrapSections ) {\n\t\treturn this.fetch( page, revision ).then( ( response ) => {\n\t\t\tlet parsedDoc = this.getParsedDoc( response.body );\n\t\t\tif ( wrapSections ) {\n\t\t\t\tparsedDoc = parsedDoc.wrapSections();\n\t\t\t}\n\t\t\t// Extract category tags from source document.\n\t\t\tconst sourceCategoryTags = parsedDoc.categories;\n\t\t\tconst segmentedDoc = new CXSegmenter().segment( parsedDoc, this.sourceLanguage );\n\n\t\t\tif ( this.targetLanguage ) {\n\t\t\t\tconst api = new MWApiRequestManager( this.context, this.context.logger );\n\t\t\t\tconst adapter = new Adapter(\n\t\t\t\t\tthis.sourceLanguage, this.targetLanguage, api, this.context\n\t\t\t\t);\n\n\t\t\t\treturn this.adaptCategories( sourceCategoryTags, adapter ).then( ( categories ) => ( {\n\t\t\t\t\tcontent: segmentedDoc.getHtml(),\n\t\t\t\t\tcategories,\n\t\t\t\t\trevision: response.revision\n\t\t\t\t} ) );\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: segmentedDoc.getHtml(),\n\t\t\t\trevision: response.revision\n\t\t\t};\n\t\t} );\n\t}\n\n\t/**\n\t * @param {string} content\n\t * @param {boolean} wrapSections Whether translatable sections should be wrapped in\n\t * <section> tag\n\t * @return {Object}\n\t */\n\tgetParsedDoc( content, wrapSections ) {\n\t\tconst parser = new Parser( new MwContextualizer(\n\t\t\t{ removableSections: this.pageloaderConfig.removableSections }\n\t\t), {\n\t\t\twrapSections\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( content );\n\t\treturn parser.builder.doc;\n\t}\n\n\t/**\n\t * @param {string} page The page title\n\t * @param {string} revision The revision id\n\t * @return {Promise}\n\t */\n\tasync fetch( page, revision ) {\n\t\tlet path;\n\t\tconst domain = this.getDomain( this.sourceLanguage );\n\t\tconst mwApi = new MWApiRequestManager( this.context, this.context.logger );\n\t\tconst siteInfo = await mwApi.siteInfoRequest( this.sourceLanguage );\n\t\tconst titleObject = Title.newFromText( page, siteInfo );\n\t\t// Manual normalisation to always transform multi-word page titles to underscore-separated titles\n\t\tconst title = titleObject.getPrefixedDBKey();\n\n\t\tif ( revision ) {\n\t\t\tpath = `/revision/${ revision }/html`;\n\t\t} else {\n\t\t\tpath = `/page/${ encodeURIComponent( title ) }/html`;\n\t\t}\n\n\t\tconst restReq = {\n\t\t\theaders: {\n\t\t\t\t// See https://www.mediawiki.org/wiki/Specs/HTML/2.8.0\n\t\t\t\taccept: 'text/html; charset=utf-8; profile=\"https://www.mediawiki.org/wiki/Specs/HTML/2.8.0\"'\n\t\t\t}\n\t\t};\n\n\t\treturn this.restApiGet( domain, path, restReq ).then( async ( { statusCode, headers, body } ) => {\n\t\t\tif ( statusCode !== 200 ) {\n\t\t\t// there was an error when calling the upstream service, propagate that\n\t\t\t\tthrow new HTTPError( {\n\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\ttype: 'api_error',\n\t\t\t\t\tdetail: `Error while fetching page ${ this.sourceLanguage }:${ title }`\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbody: await body.text(),\n\t\t\t\trevision: headers[ 'content-revision-id' ]\n\t\t\t};\n\t\t} );\n\t}\n\n\tasync adaptCategories( sourceCategoryTags, adapter ) {\n\t\tconst categoryAdaptationRequests = [];\n\n\t\t// Deduplicate sourceCategoryTags based on their href\n\t\tsourceCategoryTags = [\n\t\t\t...new Map(\n\t\t\t\tsourceCategoryTags.map( ( tag ) => [ tag.attributes.href, tag ] )\n\t\t\t).values()\n\t\t];\n\n\t\tfor ( let i = 0; i < sourceCategoryTags.length; i++ ) {\n\t\t\tconst translationunit = adapter.getAdapter( sourceCategoryTags[ i ] );\n\t\t\tconst request = translationunit.adapt( sourceCategoryTags[ i ] ).then( ( adaptedCategory ) => JSON.parse( adaptedCategory.attributes[ 'data-cx' ] ) );\n\t\t\tcategoryAdaptationRequests.push( request );\n\t\t}\n\n\t\treturn await Promise.all( categoryAdaptationRequests );\n\t}\n\n\t/**\n\t * Given a source title and an MTClient instance, this method returns a promise resolving\n\t * to an object that contains the source language,the target language, the source title and\n\t * the suggested target title. The suggested title is fetched from Wikidata API, if it exists\n\t * for the given target language. If not, the source title is translated using the given MTClient\n\t * for that language pair, and this translation is returned as suggested target title.\n\t * Finally, if the translation fails too, the source title is returned as suggested target title.\n\t *\n\t * @param {string} sourceTitle Source wiki page title (in `this.sourceLanguage`).\n\t * @param {MTClient} mtClient Machine translation client used as a fallback when Wikidata does not provide a label/title in `this.targetLanguage`.\n\t * @return {Promise<{sourceLanguage: string, targetLanguage: string, sourceTitle: string, targetTitle: string}|null>}\n\t */\n\tasync fetchTargetTitle( sourceTitle, mtClient ) {\n\t\tconst api = new MWApiRequestManager( this.context, this.context.logger );\n\n\t\t// First attempt: check whether there is already an existing target-language page title for this source title\n\t\tconst targetInfo = await api.titlePairRequest( sourceTitle, this.sourceLanguage, this.targetLanguage );\n\n\t\t// If the target page exists, return it immediately.\n\t\t// This is the best result because it points to a real existing page title.\n\t\tif ( targetInfo && !targetInfo.missing ) {\n\t\t\treturn {\n\t\t\t\tsourceLanguage: this.sourceLanguage,\n\t\t\t\ttargetLanguage: this.targetLanguage,\n\t\t\t\tsourceTitle,\n\t\t\t\ttargetTitle: targetInfo.targetTitle\n\t\t\t};\n\t\t}\n\n\t\t// Fetch info about the source title in the source wiki,\n\t\t// primarily to extract its associated Wikidata item id (QID) from pageprops.\n\t\tconst sourceTitleInfo = await api.titleInfoRequest( sourceTitle, this.sourceLanguage );\n\n\t\t// Extract the Wikidata QID\n\t\tconst qid = getProp( [ 'pageprops', 'wikibase_item' ], sourceTitleInfo );\n\n\t\t// If there is no QID, the title is not connected to Wikidata, so no cross-language\n\t\t// lookup/label suggestion can be made. Return null.\n\t\tif ( !qid ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Ask Wikidata for the label in the target language.\n\t\t// If present, this is usually a better “natural” title suggestion than MT.\n\t\tconst wikidataLabel = await api.wikidataRequest( qid, this.targetLanguage );\n\n\t\t// Initialize the result with a conservative default: fall back to the original sourceTitle.\n\t\tconst result = {\n\t\t\tsourceLanguage: this.sourceLanguage,\n\t\t\ttargetLanguage: this.targetLanguage,\n\t\t\tsourceTitle,\n\t\t\ttargetTitle: sourceTitle\n\t\t};\n\n\t\t// Preferred: Use Wikidata label when available for the target language.\n\t\tif ( wikidataLabel ) {\n\t\t\tresult.targetTitle = wikidataLabel;\n\t\t} else {\n\t\t\t// Fallback: If Wikidata does not provide a label, try machine translation of the title.\n\t\t\tconst translatedLabel = await mtClient.translate(\n\t\t\t\tthis.sourceLanguage,\n\t\t\t\tthis.targetLanguage,\n\t\t\t\tsourceTitle,\n\t\t\t\t'text'\n\t\t\t);\n\n\t\t\t// If MT succeeded, use the translated title as the suggestion.\n\t\t\tif ( translatedLabel ) {\n\t\t\t\tresult.targetTitle = translatedLabel;\n\t\t\t}\n\t\t}\n\n\t\t// Return the chosen suggestion (existing target title > Wikidata label > MT translation > sourceTitle).\n\t\treturn result;\n\t}\n\n}\nexport default MWPageLoader;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/MwApiRequest.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'mwapi_tpl' is not in camel case.","line":167,"column":16,"nodeType":"Identifier","messageId":"notCamelCase","endLine":167,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'restbase_tpl' is not in camel case.","line":173,"column":16,"nodeType":"Identifier","messageId":"notCamelCase","endLine":173,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/PageMetadataRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/SectionTitlesAndTargetTitleRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/SectionTitlesRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/SiteInfoRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/TemplateDataRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/TitleInfoRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/TitlePairRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/mw/WikidataRequest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/info.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/root.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/v1.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/routes/v2.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/section-extractor.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/segmentation/CXSegmenter.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/suggestion/SectionSuggester.js","messages":[{"ruleId":"jsdoc/require-param-type","severity":1,"message":"Missing JSDoc @param \"dbPool\" type.","line":13,"column":1,"nodeType":"Block","endLine":13,"endColumn":1}],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'source_title' is not in camel case.","line":55,"column":14,"nodeType":"Identifier","messageId":"notCamelCase","endLine":55,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"camelcase","severity":2,"message":"Identifier 'target_title' is not in camel case.","line":59,"column":14,"nodeType":"Identifier","messageId":"notCamelCase","endLine":59,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '__LEAD_SECTION__'.","line":181,"column":4,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":181,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external MWApiRequestManager\n */\n\nimport { promisify } from 'util';\nimport { open } from 'sqlite';\nimport sqlite3 from 'sqlite3';\n\nclass SectionSuggester {\n\t/**\n\t * @param {MWApiRequestManager} api\n\t * @param {string} sectionMappingDatabaseConf Database configuration\n\t * @param dbPool\n\t */\n\tconstructor( api, sectionMappingDatabaseConf, dbPool = null ) {\n\t\tthis.api = api;\n\t\tthis.sectionMappingDatabaseConf = sectionMappingDatabaseConf;\n\t\tthis.dbPool = dbPool;\n\t\tif ( !this.sectionMappingDatabaseConf ) {\n\t\t\tthrow new Error( 'Section mapping database is not configured' );\n\t\t}\n\t}\n\n\t/**\n\t * @param {string} sourceLanguage Language code\n\t * @param {string} targetLanguage Page title\n\t * @param {string[]} sourceSections\n\t * @return {Promise<{source_title: string, target_title: string, frequency: number}[]>}\n\t */\n\tasync querySectionMapping( sourceLanguage, targetLanguage, sourceSections ) {\n\t\tif ( sourceSections.length === 0 ) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif ( this.sectionMappingDatabaseConf.type === 'mysql' ) {\n\t\t\tif ( !this.dbPool ) {\n\t\t\t\tthrow new Error( 'MySQL connection pool not available' );\n\t\t\t}\n\n\t\t\tconst queryStr = `SELECT source_title, target_title, frequency\n\t\t\t\tFROM titles\n\t\t\t\tWHERE source_language=?\n\t\t\t\tAND target_language=?\n\t\t\t\tAND source_title IN (${ sourceSections.map( () => '?' ).join( ',' ) })\n\t\t\t\tORDER BY source_title, frequency DESC\n\t\t\t`;\n\t\t\ttry {\n\t\t\t\tconst query = promisify( this.dbPool.query ).bind( this.dbPool );\n\t\t\t\tconst results = await query( queryStr, [ sourceLanguage, targetLanguage, ...sourceSections ] );\n\n\t\t\t\t// Handle buffer conversion for blob columns\n\t\t\t\tresults.forEach( ( result ) => {\n\t\t\t\t\tif ( Buffer.isBuffer( result.source_title ) ) {\n\t\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\t\tresult.source_title = result.source_title.toString();\n\t\t\t\t\t}\n\t\t\t\t\tif ( Buffer.isBuffer( result.target_title ) ) {\n\t\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\t\tresult.target_title = result.target_title.toString();\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\treturn results;\n\n\t\t\t} catch ( error ) {\n\t\t\t\tthrow new Error( `Database query failed: ${ error.message }`, { cause:\nerror } );\n\t\t\t}\n\t\t}\n\n\t\tif ( this.sectionMappingDatabaseConf.type === 'sqlite' ) {\n\t\t\tconst queryStr = `SELECT source_title, target_title, frequency\n\t\t\t\tFROM titles\n\t\t\t\tWHERE source_language=?\n\t\t\t\tAND target_language=?\n\t\t\t\tAND source_title IN (${ sourceSections.map( () => '?' ) })\n\t\t\t\tORDER BY source_title, frequency DESC\n\t\t\t\t`;\n\t\t\tconst connection = await open( {\n\t\t\t\tfilename: this.sectionMappingDatabaseConf.database,\n\t\t\t\tdriver: sqlite3.Database\n\t\t\t} );\n\t\t\treturn await connection.all( queryStr, [ sourceLanguage, targetLanguage, ...sourceSections ] );\n\t\t} else {\n\t\t\tthrow new Error( 'Section mapping database is not configured. sqlite or mysql database configuration required.' );\n\t\t}\n\t}\n\n\t/**\n\t * Get list of sections for the given page. Only top level sections are returned\n\t *\n\t * @param {string} language Language code\n\t * @param {string} title Page title\n\t * @return {string[]}\n\t */\n\tasync getSections( language, title ) {\n\t\tconst metadata = await this.api.pageMetadataRequest( language, title );\n\t\tif ( !metadata || !metadata.sections ) {\n\t\t\t// Page may not exist.\n\t\t\treturn [];\n\t\t}\n\t\tconst headerSections = metadata.sections.filter( ( entry ) => entry.toclevel === 1 ) || [];\n\t\treturn headerSections.map( ( section ) => section.line );\n\t}\n\n\t/**\n\t * Get section objects with byte offsets and page size for size calculation\n\t *\n\t * @param {string} language Language code\n\t * @param {string} title Page title\n\t * @return {Promise<{ sections: { title, byteoffset }[], pageSize: number }>} Object with sections array and pageSize: {sections: Object[], pageSize?: number}\n\t */\n\tasync getSectionObjectsWithPageSize( language, title ) {\n\t\tconst [ metadata, titleInfo ] = await Promise.all( [\n\t\t\tthis.api.pageMetadataRequest( language, title ),\n\t\t\tthis.api.titleInfoRequest( title, language )\n\t\t] );\n\n\t\tif ( !metadata?.sections || !titleInfo?.length ) {\n\t\t\treturn { sections: [], pageSize: undefined };\n\t\t}\n\n\t\tconst headerSections = metadata.sections.filter( ( entry ) => entry.toclevel === 1 ) || [];\n\t\tconst sections = headerSections.map( ( section ) => ( {\n\t\t\ttitle: section.line,\n\t\t\tbyteoffset: section.byteoffset || 0\n\t\t} ) );\n\n\t\treturn { sections, pageSize: titleInfo.length };\n\t}\n\n\t/**\n\t * Find the section titles mapping from the sqlite database prepared.\n\t *\n\t * @param {string} sourceLanguage Source language code\n\t * @param {string[]} sourceSections Array of source section titles\n\t * @param {string} targetLanguage Target language code\n\t * @return {Object} Object with key as source section title and value as array of candidate titles in target language.\n\t * This array will be in descending order of frequency. High frequency indicate better suggestion.\n\t */\n\tasync getSectionMapping( sourceLanguage, sourceSections, targetLanguage ) {\n\t\tconst mapping = {};\n\n\t\tconst results = await this.querySectionMapping( sourceLanguage, targetLanguage, sourceSections );\n\n\t\tlet maxFrequency = 0;\n\t\t// If there is no results, empty array will be returned.\n\t\tfor ( let i = 0; i < results.length; i++ ) {\n\t\t\tif ( !mapping[ results[ i ].source_title ] ) {\n\t\t\t\tmapping[ results[ i ].source_title ] = [];\n\t\t\t\t// First item will have maximum `frequency` as per the above query.\n\t\t\t\tmaxFrequency = results[ i ].frequency;\n\t\t\t}\n\n\t\t\tconst mappingsLength = mapping[ results[ i ].source_title ].length;\n\t\t\t// Reject results that has frequency less than half of max frequency, if we have mapping already.\n\t\t\t// This is to guard against entries in database that are probably typos, or unpopular relative to\n\t\t\t// most recommended translation.\n\t\t\tif ( mappingsLength > 0 && results[ i ].frequency < 100 && results[ i ].frequency < maxFrequency * 0.5 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmapping[ results[ i ].source_title ].push( results[ i ].target_title );\n\t\t}\n\t\treturn mapping;\n\t}\n\n\t/**\n\t * Calculate section sizes in bytes using consecutive section byte offsets\n\t *\n\t * @param {Object[]} sectionObjects Array of section objects with title and byteoffset\n\t * @param {number} totalContentSize Total page content size in bytes\n\t * @return {Object} Object mapping section titles to their sizes in bytes\n\t */\n\tcalculateSectionSizes( sectionObjects, totalContentSize ) {\n\t\tconst sectionSizes = {};\n\n\t\t// Add lead section\n\t\tif ( sectionObjects.length ) {\n\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\tsectionSizes.__LEAD_SECTION__ = sectionObjects[ 0 ].byteoffset;\n\t\t}\n\n\t\tfor ( let i = 0; i < sectionObjects.length; i++ ) {\n\t\t\tconst currentSection = sectionObjects[ i ];\n\t\t\tconst nextSection = sectionObjects[ i + 1 ];\n\n\t\t\tlet sectionSize;\n\t\t\tif ( nextSection ) {\n\t\t\t\tsectionSize = nextSection.byteoffset - currentSection.byteoffset;\n\t\t\t} else {\n\t\t\t\tsectionSize = totalContentSize - currentSection.byteoffset;\n\t\t\t}\n\n\t\t\tsectionSizes[ currentSection.title ] = Math.max( 0, sectionSize );\n\t\t}\n\n\t\treturn sectionSizes;\n\t}\n\n\t/**\n\t * @param {string} sourceLanguage Source language code\n\t * @param {string} sourceTitle Source title\n\t * @param {string} targetLanguage Target language code\n\t * @param {string[]} sourceSections Array of sections in source article\n\t * @param {string[]} targetSections Array of sections in target article\n\t * @return {Promise<{ present: Object, missing: Object }>}\n\t */\n\tasync getPresentAndMissingSections(\n\t\tsourceLanguage,\n\t\tsourceTitle,\n\t\ttargetLanguage,\n\t\tsourceSections,\n\t\ttargetSections\n\t) {\n\t\tconst missing = {};\n\t\tconst present = {};\n\n\t\tconst mapping = await this.getSectionMapping( sourceLanguage, sourceSections, targetLanguage );\n\n\t\tfor ( let i = 0; i < sourceSections.length; i++ ) {\n\t\t\tconst sourceSectionTitle = sourceSections[ i ];\n\t\t\tconst candidateTargetSectionTitles = [ ...mapping[ sourceSectionTitle ] || [], ...mapping[ sourceSectionTitle.toLowerCase() ] || [] ];\n\t\t\t// candidateTargetSectionTitles will be in decreasing order of frequencies\n\t\t\tfor ( let j = 0; j < candidateTargetSectionTitles.length; j++ ) {\n\t\t\t\tif ( targetSections.includes( candidateTargetSectionTitles[ j ] ) ) {\n\t\t\t\t\tpresent[ sourceSectionTitle ] = candidateTargetSectionTitles[ j ];\n\t\t\t\t\t// Found a matching section in target article.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !present[ sourceSectionTitle ] ) {\n\t\t\t\tif ( candidateTargetSectionTitles.length > 0 ) {\n\t\t\t\t\tmissing[ sourceSectionTitle ] = candidateTargetSectionTitles[ 0 ];\n\t\t\t\t} else if ( targetSections.length === 0 ) {\n\t\t\t\t\t// There is no sections in target article. So we are 100% sure that this\n\t\t\t\t\t// section is missing. Use sourceSectionTitle as fallback suggestion.\n\t\t\t\t\tmissing[ sourceSectionTitle ] = sourceSectionTitle;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( Object.keys( present ).length === targetSections.length ) {\n\t\t\t// All target sections were mapped to one of the source sections.\n\t\t\t// So, any remaining source section is surely missing in target article.\n\t\t\tfor ( let i = 0; i < sourceSections.length; i++ ) {\n\t\t\t\tconst sourceSectionTitle = sourceSections[ i ];\n\t\t\t\tif ( present[ sourceSectionTitle ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst candidates = mapping[ sourceSectionTitle ];\n\t\t\t\tmissing[ sourceSections[ i ] ] = candidates && candidates[ 0 ] || sourceSections[ i ];\n\t\t\t}\n\t\t}\n\n\t\t// As the last step, any section in sourceSections not present in `present`, add to `missing` if not present already.\n\t\tfor ( let i = 0; i < sourceSections.length; i++ ) {\n\t\t\tif ( !present[ sourceSections[ i ] ] && !missing[ sourceSections[ i ] ] ) {\n\t\t\t\tmissing[ sourceSections[ i ] ] = sourceSections[ i ];\n\t\t\t}\n\t\t}\n\n\t\treturn { present, missing };\n\t}\n\n\t/**\n\t * @param {string} language\n\t * @param {string} title\n\t * @return {Promise<{ sections: { title, byteoffset }[], pageSize: number }|null>}\n\t */\n\tasync getSectionSizes( language, title ) {\n\t\tconst sourceData = await this.getSectionObjectsWithPageSize( language, title );\n\t\tif ( sourceData.pageSize && sourceData.sections.length > 0 ) {\n\t\t\treturn this.calculateSectionSizes( sourceData.sections, sourceData.pageSize );\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\nexport default SectionSuggester;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/suggestion/SourceSuggester.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/suggestion/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/swagger-ui.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFile from package \"fs\" with non literal argument at index 0","line":26,"column":9,"nodeType":"CallExpression","endLine":26,"endColumn":32}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { getAbsoluteFSPath } from 'swagger-ui-dist';\nimport { HTTPError } from '../lib/util.js';\n\n// Swagger-ui-dist helpfully exporting the absolute path of its dist directory\nconst docRoot = `${ getAbsoluteFSPath() }/`;\nconst DOC_CSP = \"default-src 'none'; \" +\n\t\"script-src 'self' 'unsafe-inline'; connect-src *; \" +\n\t\"style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';\";\n\nfunction processRequest( app, req, res ) {\n\tconst reqPath = req.query.path || '/index.html';\n\tconst filePath = join( docRoot, reqPath );\n\n\t// Disallow relative paths.\n\t// Test relies on docRoot ending on a slash.\n\tif ( filePath.slice( 0, docRoot.length ) !== docRoot ) {\n\t\tthrow new HTTPError( {\n\t\t\tstatus: 404,\n\t\t\ttype: 'not_found',\n\t\t\tdetail: `${ reqPath } could not be found.`\n\t\t} );\n\t}\n\n\treturn fs.readFile( filePath )\n\t\t.then( ( body ) => {\n\t\t\tif ( reqPath === './swagger-initializer.js' ) {\n\t\t\t\tbody = body.toString()\n\t\t\t\t\t.replace( /\"https:\\/\\/petstore.swagger.io\\/v2\\/swagger.json\"/g,\n\t\t\t\t\t\t'\"/?spec\"' );\n\t\t\t}\n\t\t\tif ( reqPath === '/index.html' ) {\n\t\t\t\tbody = body.toString()\n\t\t\t\t\t.replace( /((?:src|href)=['\"])/g, '$1?doc&path=' )\n\t\t\t\t\t.replace( /<title>[^<]*<\\/title>/, `<title>${ app.info.name }</title>` );\n\t\t\t}\n\n\t\t\tlet contentType = 'text/html';\n\t\t\tif ( /\\.js$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'text/javascript';\n\t\t\t} else if ( /\\.png$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'image/png';\n\t\t\t} else if ( /\\.map$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'application/json';\n\t\t\t} else if ( /\\.ttf$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'application/x-font-ttf';\n\t\t\t} else if ( /\\.css$/.test( reqPath ) ) {\n\t\t\t\tcontentType = 'text/css';\n\t\t\t\tbody = body.toString()\n\t\t\t\t\t.replace( /\\.\\.\\/(images|fonts)\\//g, '?doc&path=$1/' )\n\t\t\t\t\t.replace( /sourceMappingURL=/, 'sourceMappingURL=/?doc&path=' );\n\t\t\t}\n\n\t\t\tres.setHeader( 'Content-Type', contentType );\n\t\t\tres.header( 'content-security-policy', DOC_CSP );\n\t\t\tres.header( 'x-content-security-policy', DOC_CSP );\n\t\t\tres.header( 'x-webkit-csp', DOC_CSP );\n\t\t\tres.send( body.toString() );\n\t\t} )\n\t\t.catch( { code: 'ENOENT' }, () => {\n\t\t\tres.status( 404 )\n\t\t\t\t.type( 'not_found' )\n\t\t\t\t.send( 'not found' );\n\t\t} );\n\n}\n\nexport default {\n\tprocessRequest\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWCategory.js","messages":[{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":15,"column":41,"nodeType":"Literal","endLine":15,"endColumn":64}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import TranslationUnit from './TranslationUnit.js';\n\nclass MWCategory extends TranslationUnit {\n\tasync adapt() {\n\t\tconst dataCX = { adapted: false };\n\t\tconst categoryTitle = this.node.attributes.href;\n\t\tconst titlePairInfo = await this.api.titlePairRequest(\n\t\t\tcategoryTitle, this.sourceLanguage, this.targetLanguage\n\t\t);\n\n\t\tdataCX.sourceTitle = titlePairInfo.sourceTitle;\n\t\tif ( titlePairInfo.targetTitle ) {\n\t\t\tlet adaptedTitle = titlePairInfo.targetTitle;\n\t\t\tconst namespaceAlias = await this.api.getNamespaceAlias( 'Category', this.targetLanguage );\n\t\t\tadaptedTitle = adaptedTitle.replace( /^(\\.\\.?\\/)*([^:]+)(:)/, '$1' + namespaceAlias + '$3' );\n\t\t\tthis.node.attributes.href = adaptedTitle;\n\n\t\t\tdataCX.adapted = true;\n\t\t\tdataCX.targetTitle = titlePairInfo.targetTitle;\n\t\t}\n\n\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\t\treturn this.node;\n\t}\n}\nMWCategory.matchTagNames = [ 'link' ];\nMWCategory.matchRdfaTypes = [ 'mw:PageProp/Category' ];\n\nexport default MWCategory;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWFile.js","messages":[{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":44,"column":51,"nodeType":"Literal","endLine":44,"endColumn":74}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import TranslationUnit from './TranslationUnit.js';\nconst CommonsFilePathPrefix = '//upload.wikimedia.org/wikipedia/commons/';\n/**\n * This class is an adapter for <img>, <video> and <audio> nodes in the content.\n * It changes the `File` namespace prefix for resources to corresponding namespace\n * in target URL, if the resource is refering the file from Wikimedia commons.\n *\n * The node will get a new attribute data-cx with adapted key as true or false\n * depending on whether the namespace change happened or not.\n */\nclass MWFile extends TranslationUnit {\n\n\t/**\n\t * Check if an file is coming from Commons or not. Uses the URL pattern of the common file\n\t * repository to determine whether the file is stored there.\n\t *\n\t * @param {string} fileSrc\n\t * @return {boolean}\n\t */\n\tisCommonsResource( fileSrc ) {\n\t\treturn fileSrc.includes( CommonsFilePathPrefix );\n\t}\n\n\tasync adapt() {\n\t\tconst dataCX = { adapted: true };\n\t\tconst sourceResource = this.node.attributes.resource;\n\t\tlet resourceURL = this.node.attributes.src || this.node.attributes.poster;\n\t\tif ( !resourceURL && this.node.children ) {\n\t\t\tconst textChunks = this.node.children.textChunks;\n\t\t\tfor ( let i = 0, len = textChunks.length; i < len; i++ ) {\n\t\t\t\tconst chunk = textChunks[ i ];\n\t\t\t\tif ( chunk.inlineContent && chunk.inlineContent.name === 'source' ) {\n\t\t\t\t\tresourceURL = chunk.inlineContent.attributes.src;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !resourceURL ) {\n\t\t\treturn this.node;\n\t\t}\n\n\t\tif ( this.isCommonsResource( resourceURL ) ) {\n\t\t\tconst namespaceAlias = await this.api.getNamespaceAlias( 'File', this.targetLanguage );\n\t\t\tconst targetResource = sourceResource.replace( /^(\\.\\.?\\/)*([^:]+)(:)/, '$1' + namespaceAlias + '$3' );\n\t\t\tthis.node.attributes.resource = targetResource;\n\t\t} else {\n\t\t\tdataCX.adapted = false;\n\t\t}\n\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\n\t\treturn this.node;\n\t}\n}\n\nMWFile.matchTagNames = [\n\t'video',\n\t'audio',\n\t'img'\n];\n\nexport default MWFile;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWGallery.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWImage.js","messages":[{"ruleId":"security/detect-unsafe-regex","severity":1,"message":"Unsafe Regular Expression","line":123,"column":68,"nodeType":"Literal","endLine":123,"endColumn":91}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { getDir } from '@wikimedia/language-data';\nimport TranslationUnit from './TranslationUnit.js';\nimport MWTemplate from './MWTemplate.js';\nconst CommonsFilePathPrefix = '//upload.wikimedia.org/wikipedia/commons/';\n\n/**\n * This class is an adapter for block images(<figure>) and inline images(<span>).\n * a) It changes the `File` namespace prefix for resources to corresponding namespace\n * in target URL, if the resource is refering the file from Wikimedia commons.\n * b) It flips the mw-halign-left or mw-halign-right classes depending language directionality\n * of source and target language\n * c) If the image is a link, the namespace in the link URL will be adapted for target language.\n *\n * The node will get a new attribute data-cx with adapted key as true or false\n * depending on whether the namespace change happened or not.\n */\nclass MWImage extends TranslationUnit {\n\tisInlineMediaWithCaption() {\n\t\t// Figure can also mean Video or Audio too. https://www.mediawiki.org/wiki/Specs/HTML/2.4.0#Audio/Video\n\t\treturn this.node.name === 'span' && this.node.attributes.typeof &&\n\t\t\tthis.node.attributes.typeof.match( /(^|\\s)(mw:File|mw:Image)\\b/ ) &&\n\t\t\tthis.node.attributes[ 'data-mw' ] &&\n\t\t\tJSON.parse( this.node.attributes[ 'data-mw' ] ).caption;\n\t}\n\n\t/**\n\t * Check if an image is coming from Commons or not. Uses the URL pattern of the common file\n\t * repository to determine whether the image is stored there.\n\t *\n\t * @param {string} imageSrc\n\t * @return {boolean}\n\t */\n\tisCommonsResource( imageSrc ) {\n\t\treturn imageSrc.includes( CommonsFilePathPrefix );\n\t}\n\n\t/**\n\t * Adapt the image's alignment settings for the target language.\n\t */\n\tadaptImageAlignment() {\n\n\t\tconst sourceDirection = getDir( this.sourceLanguage );\n\t\tconst targetDirection = getDir( this.targetLanguage );\n\n\t\tif ( sourceDirection === targetDirection ) {\n\t\t\t// Source and target languages has same directionality. Nothing to do\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !this.node.attributes.class ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst classes = this.node.attributes.class.split( ' ' );\n\t\t// If the image has an explicit alignment class in HTML, this means that it has explicit\n\t\t// alignment defined in wiki syntax. It must be explicitly flipped if the target language's\n\t\t// direction is different.\n\t\tconst leftIndex = classes.indexOf( 'mw-halign-left' );\n\t\tconst rightIndex = classes.indexOf( 'mw-halign-right' );\n\t\tif ( leftIndex > -1 ) {\n\t\t\tclasses[ leftIndex ] = 'mw-halign-right';\n\t\t} else if ( rightIndex > -1 ) {\n\t\t\tclasses[ rightIndex ] = 'mw-halign-left';\n\t\t}\n\n\t\tthis.node.attributes.class = classes.join( ' ' );\n\t}\n\n\tasync adapt() {\n\t\tlet imageLink, sourceImage;\n\n\t\tif ( this.node.attributes.typeof.includes( 'mw:Transclusion' ) ) {\n\t\t\t// Node has typeof=\"mw:Transclusion mw:File\"\n\t\t\t// The image is generated by a template. So template adaptation will take care of it.\n\t\t\t// Bug: T298592\n\t\t\tconst adapter = new MWTemplate(\n\t\t\t\tthis.node, this.sourceLanguage, this.targetLanguage, this.api, this.context\n\t\t\t);\n\t\t\treturn adapter.adapt();\n\t\t}\n\t\tconst dataCX = { adapted: false };\n\n\t\tif ( this.isInlineMediaWithCaption() ) {\n\t\t\t// The image caption is in data-mw attribute.\n\t\t\tif ( this.context.mtClient ) {\n\t\t\t\t// This is an inline image, Adapting the caption alone.\n\t\t\t\tconst caption = JSON.parse( this.node.attributes[ 'data-mw' ] ).caption;\n\t\t\t\tconst translatedCaption = await this.context.mtClient.translate(\n\t\t\t\t\tthis.sourceLanguage, this.targetLanguage, caption\n\t\t\t\t);\n\t\t\t\tthis.node.attributes[ 'data-mw' ] = JSON.stringify( { caption: translatedCaption } );\n\t\t\t}\n\t\t\tdataCX.adapted = true;\n\t\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\t\t\treturn this.node;\n\t\t}\n\n\t\t// The image is a block media or inline media without a caption.\n\n\t\tthis.adaptImageAlignment();\n\n\t\tif ( this.node.children ) {\n\t\t\tconst textChunks = this.node.children.textChunks;\n\t\t\tfor ( let i = 0, len = textChunks.length; i < len; i++ ) {\n\t\t\t\tconst chunk = this.node.children.textChunks[ i ];\n\t\t\t\tif ( chunk.tags[ 0 ] && chunk.tags[ 0 ].name === 'a' ) {\n\t\t\t\t\timageLink = chunk.tags[ 0 ];\n\t\t\t\t}\n\t\t\t\tif ( chunk.inlineContent && chunk.inlineContent.name === 'img' ) {\n\t\t\t\t\tsourceImage = chunk.inlineContent;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( !sourceImage ) {\n\t\t\t// This node is not a figure or span containing <img>. Could be audio or video\n\t\t\treturn this.node;\n\t\t}\n\n\t\tif ( sourceImage && this.isCommonsResource( sourceImage.attributes.src ) ) {\n\t\t\tconst namespaceAlias = await this.api.getNamespaceAlias( 'File', this.targetLanguage );\n\t\t\tconst targetResource = sourceImage.attributes.resource.replace( /^(\\.\\.?\\/)*([^:]+)(:)/, '$1' + namespaceAlias + '$3' );\n\n\t\t\t// Image does not have a link when it is created with \"link=\".\n\t\t\tif ( imageLink && imageLink.attributes.href ) {\n\t\t\t\timageLink.attributes.href = targetResource;\n\t\t\t}\n\t\t\tdataCX.adapted = true;\n\t\t}\n\n\t\tthis.node.attributes[ 'data-cx' ] = JSON.stringify( dataCX );\n\t\treturn this.node;\n\t}\n}\n\nMWImage.matchTagNames = [\n\t'figure',\n\t'span'\n];\n\nMWImage.matchRdfaTypes = [\n\t// mw:File(/.*)? will match figure or span containing images, video, and audio.\n\t// But in the adapt method we process only images. The <img>, <video> and <audio>\n\t// will be adapted by MWFile adapter module.\n\t'mw:File', 'mw:File/Thumb', 'mw:File/Frame', 'mw:File/Frameless',\n\t// TODO: Remove 'mw:Image(/.*)?' when version 2.4.0 of the content is no\n\t// longer supported\n\t'mw:Image', 'mw:Image/Thumb', 'mw:Image/Frame', 'mw:Image/Frameless'\n];\n\nexport default MWImage;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWLink.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWReference.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/MWTemplate.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/TranslationUnit.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/translationunits/index.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/lib/util.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":133,"column":23,"nodeType":"CallExpression","endLine":133,"endColumn":47}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * @external Application\n * @external Request\n * @external Router\n */\n\nimport { readFileSync } from 'fs';\nimport { load } from 'js-yaml';\nimport languageData from '@wikimedia/language-data';\n\n/**\n * Error instance wrapping HTTP error responses\n */\nclass HTTPError extends Error {\n\n\tconstructor( response ) {\n\t\tsuper();\n\t\tError.captureStackTrace( this, HTTPError );\n\n\t\tthis.name = this.constructor.name;\n\t\tthis.message = `${ response.status }`;\n\t\tif ( response.detail ) {\n\t\t\tthis.message += `: ${ response.detail }`;\n\t\t}\n\n\t\tif ( response.type ) {\n\t\t\tthis.message += `: ${ response.type }`;\n\t\t}\n\n\t\tObject.assign( this, response );\n\t}\n\n\t/**\n\t * @param {Response} httpResponse\n\t * @return {HTTPError}\n\t */\n\tstatic fromResponse( httpResponse ) {\n\t\treturn new HTTPError( {\n\t\t\tstatus: httpResponse.status,\n\t\t\ttype: 'api_error',\n\t\t\tdetail: `Error from URL: ${ httpResponse.url }; status: ${ httpResponse.statusText }`\n\t\t} );\n\t}\n}\n\nfunction responseTimeMetricsMiddleware( app ) {\n\t// Create a histogram metric for HTTP request duration\n\tconst requestDuration = {\n\t\ttype: 'Histogram',\n\t\tname: `${ app.conf.name }_express_router_request_duration_seconds`,\n\t\thelp: 'request duration handled by router in seconds',\n\t\tbuckets: [ 0.01, 0.05, 0.1, 0.3, 1 ],\n\t\tlabels: {\n\t\t\tnames: [ 'path', 'method', 'status' ]\n\t\t}\n\t};\n\t// Create the metric\n\t// This will return the existing metric if it already exists\n\tconst responseTimeMetric = app.metrics.makeMetric( requestDuration );\n\tapp.logger.info( 'responseTimeMetric', responseTimeMetric.labels );\n\treturn ( req, res, next ) => {\n\t\tconst start = process.hrtime();\n\t\tconst originalEnd = res.end;\n\n\t\tres.end = ( ...args ) => {\n\t\t\t// Calculate the duration\n\t\t\tconst diff = process.hrtime( start );\n\t\t\tconst duration = diff[ 0 ] + diff[ 1 ] / 1e9;\n\n\t\t\tconst path = req.route ? req.route.path : req.path;\n\t\t\t// Observe the duration\n\t\t\tresponseTimeMetric.observe(\n\t\t\t\t{\n\t\t\t\t\tmethod: req.method,\n\t\t\t\t\tpath: path,\n\t\t\t\t\tstatus: res.statusCode\n\t\t\t\t},\n\t\t\t\tduration\n\t\t\t);\n\t\t\t// Call the original end function\n\t\t\toriginalEnd.apply( res, args );\n\t\t};\n\t\t// Continue processing the request\n\t\tnext();\n\t};\n}\n\nfunction Deferred() {\n\tthis.promise = new Promise( ( ( resolve, reject ) => {\n\t\tthis.resolve = resolve;\n\t\tthis.reject = reject;\n\t} ) );\n\n\tthis.then = this.promise.then.bind( this.promise );\n\tthis.catch = this.promise.catch.bind( this.promise );\n}\n\n/**\n * Check if the given content is plain text or contains html tags.\n * The check is performed by looking for open and close tags.\n * If the content has HTML entities, this test will not identify it.\n *\n * @param {string} content The content to test\n * @return {boolean} Return true if the content is plain text\n */\nfunction isPlainText( content ) {\n\treturn !content || !content.trim() || !/<[a-zA-Z][\\s\\S]*>/i.test( content );\n}\n\n/**\n * Null safe object getter\n * Example: To access obj.a.b.c[0].d in null safe way,\n * use getProp(['a', 'b', 'c', 0, 'd'], obj )\n *\n * @param {string|number} path access path\n * @param {Object} obj Object\n * @return {Object|string|number|null}\n */\nfunction getProp( path, obj ) {\n\treturn path.reduce(\n\t\t( accumulator, currentValue ) => ( accumulator && accumulator[ currentValue ] ) ?\n\t\t\taccumulator[ currentValue ] :\n\t\t\tnull,\n\t\tobj\n\t);\n}\n\nfunction getConfig( confPath ) {\n\tif ( !confPath ) {\n\t\tconst dirname = new URL( '.', import.meta.url ).pathname;\n\t\tconfPath = `${ dirname }/../config.dev.yaml`;\n\t}\n\tconst config = load( readFileSync( confPath ) );\n\tif ( !config ) {\n\t\tthrow new Error( 'Failed to load config from path: ' + confPath );\n\t}\n\treturn config;\n}\n\n/**\n * Asserts that the language codes, if provided, are valid.\n *\n * @param {Response} res Response object\n * @param {...string} languages Language codes\n */\nfunction assertValidLanguageCodes( res, ...languages ) {\n\tfor ( const language of languages ) {\n\t\tif ( language === undefined ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( !languageData.isKnown( language ) ) {\n\t\t\tres.status( 400 ).end( `Invalid language code ${ language }` );\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nexport {\n\tHTTPError,\n\tgetConfig,\n\tresponseTimeMetricsMiddleware,\n\tgetProp,\n\tDeferred,\n\tisPlainText,\n\tassertValidLanguageCodes\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/scripts/SectionTitleAlignment/alignwithmt.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/scripts/template-mapping.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found existsSync from package \"fs\" with non literal argument at index 0","line":108,"column":7,"nodeType":"CallExpression","endLine":108,"endColumn":26},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":114,"column":14,"nodeType":"CallExpression","endLine":114,"endColumn":35}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { existsSync, readFileSync } from 'fs';\nimport { ArgumentParser } from 'argparse';\nimport { open } from 'sqlite';\nimport { Database } from 'sqlite3';\n\nasync function createTemplate( db, from, to, templateName ) {\n\tconst mapping = await db.get(\n\t\t`SELECT id FROM templates\n WHERE source_lang = ? AND target_lang = ? AND template = ?`,\n\t\tfrom, to, templateName\n\t);\n\tif ( mapping && mapping.template_mapping_id ) {\n\t\treturn mapping.template_mapping_id;\n\t}\n\tconst result = await db.run(\n\t\t`INSERT OR IGNORE INTO templates\n (source_lang, target_lang, template) VALUES(?,?,?)`,\n\t\tfrom, to, templateName\n\t);\n\treturn result.lastID;\n}\n\nasync function main( databaseFile, mapping, from, to ) {\n\tconst db = await open( { filename: databaseFile, driver: Database } );\n\n\tawait db.run(\n\t\t`CREATE TABLE IF NOT EXISTS templates (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n source_lang TEXT NOT NULL,\n target_lang TEXT NOT NULL,\n template TEXT NOT NULL,\n UNIQUE(source_lang, target_lang, template)\n )`\n\t);\n\tawait db.run(\n\t\t`CREATE TABLE IF NOT EXISTS mapping (\n template_mapping_id INTEGER NOT NULL,\n source_param TEXT NOT NULL,\n target_param TEXT NOT NULL,\n score REAL NOT NULL,\n FOREIGN KEY(template_mapping_id) REFERENCES templates(id),\n UNIQUE(template_mapping_id, source_param, target_param)\n )`\n\t);\n\n\tfor ( const templateName in mapping ) {\n\t\tconst mappingData = mapping[ templateName ];\n\t\tif ( !mappingData || !mappingData.length ) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst mappingId = await createTemplate( db, from, to, templateName );\n\t\tprocess.stdout.write( `${ mappingId } ${ from } -> ${ to } ${ templateName }\\n` );\n\t\tfor ( const index in mappingData ) {\n\t\t\tconst paramMapping = mappingData[ index ];\n\t\t\tif ( !mappingId || !paramMapping[ from ] || !paramMapping[ to ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst score = 1 - paramMapping.d;\n\t\t\tdb.run(\n\t\t\t\t`INSERT OR IGNORE INTO mapping\n (template_mapping_id, source_param, target_param, score)\n VALUES(?,?,?,?)`,\n\t\t\t\tmappingId, paramMapping[ from ], paramMapping[ to ], score\n\t\t\t);\n\t\t\tprocess.stdout.write( `\\t${ paramMapping[ from ] } -> ${ paramMapping[ to ] } (${ score })\\n` );\n\t\t}\n\t}\n\tawait db.close();\n}\n\nconst argparser = new ArgumentParser( {\n\tadd_help: true,\n\tdescription: 'Prepare template mapping database'\n} );\n\nargparser.add_argument(\n\t'-d', '--database',\n\t{\n\t\thelp: 'template mapping database file',\n\t\tdefault: 'templatemapping.db'\n\t}\n);\nargparser.add_argument(\n\t'-i', '--input',\n\t{\n\t\thelp: 'JSON file with mapping.',\n\t\trequired: true\n\t}\n);\nargparser.add_argument(\n\t'--from',\n\t{\n\t\thelp: 'Source language',\n\t\trequired: true\n\t}\n);\nargparser.add_argument(\n\t'--to',\n\t{\n\t\thelp: 'Target language',\n\t\trequired: true\n\t}\n);\nconst args = argparser.parse_args();\n\nconst input = args.input;\nif ( !existsSync( input ) ) {\n\tthrow new Error( `File ${ input } does not exist` );\n}\n\nmain(\n\targs.database,\n\tJSON.parse( readFileSync( input ) ),\n\targs.from,\n\targs.to\n);\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/server.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/spec.yaml","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 139. Maximum allowed is 100.","line":197,"column":1,"nodeType":"Program","messageId":"max","endLine":197,"endColumn":140},{"ruleId":"max-len","severity":1,"message":"This line has a length of 139. Maximum allowed is 100.","line":248,"column":1,"nodeType":"Program","messageId":"max","endLine":248,"endColumn":140},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":470,"column":1,"nodeType":"Program","messageId":"max","endLine":470,"endColumn":110},{"ruleId":"max-len","severity":1,"message":"This line has a length of 216. Maximum allowed is 100.","line":503,"column":1,"nodeType":"Program","messageId":"max","endLine":503,"endColumn":217},{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":540,"column":1,"nodeType":"Program","messageId":"max","endLine":540,"endColumn":111},{"ruleId":"max-len","severity":1,"message":"This line has a length of 216. Maximum allowed is 100.","line":547,"column":1,"nodeType":"Program","messageId":"max","endLine":547,"endColumn":217},{"ruleId":"max-len","severity":1,"message":"This line has a length of 106. Maximum allowed is 100.","line":589,"column":1,"nodeType":"Program","messageId":"max","endLine":589,"endColumn":107},{"ruleId":"max-len","severity":1,"message":"This line has a length of 134. Maximum allowed is 100.","line":606,"column":1,"nodeType":"Program","messageId":"max","endLine":606,"endColumn":135},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":621,"column":1,"nodeType":"Program","messageId":"max","endLine":621,"endColumn":110},{"ruleId":"max-len","severity":1,"message":"This line has a length of 106. Maximum allowed is 100.","line":653,"column":1,"nodeType":"Program","messageId":"max","endLine":653,"endColumn":107},{"ruleId":"max-len","severity":1,"message":"This line has a length of 134. Maximum allowed is 100.","line":670,"column":1,"nodeType":"Program","messageId":"max","endLine":670,"endColumn":135}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":11,"fixableErrorCount":0,"fixableWarningCount":0,"source":"openapi: 3.0.1\ninfo:\n version: 0.2.1\n title: Content translation service\n description: Content translation service for translating mediawiki pages between languages.\n termsOfService: https://wikimediafoundation.org/wiki/Terms_of_Use\n contact:\n name: the Wikimedia Language team\n url: https://www.mediawiki.org/wiki/Wikimedia_Language_engineering\n license:\n name: GPL-2.0-or-later\n url: http://opensource.org/licenses/GPL-2.0\nx-default-params:\n domain: en.wikipedia.org\n\npaths:\n # from routes/root.js\n /robots.txt:\n get:\n tags:\n - Root\n - Robots\n summary: Gets robots.txt\n responses:\n 200:\n description: Success\n content:\n text/plain:\n example:\n \"User-agent: * \\nDisallow: /\"\n x-amples:\n - title: robots.txt check\n request: {}\n response:\n status: 200\n /:\n get:\n tags:\n - Root\n summary: The root service end-point\n responses:\n 200:\n description: Success\n x-amples:\n - title: root with no query params\n request: {}\n response:\n status: 302\n - title: spec from root\n request:\n query:\n spec: true\n response:\n status: 200\n - title: doc from root\n request:\n query:\n doc: true\n response:\n status: 302\n - title: root with wrong query param\n request:\n query:\n fooo: true\n response:\n status: 302\n # from routes/v1.js\n /v1/page/{language}/{title}:\n get:\n tags:\n - Page content\n summary: Fetches segmented mediawiki page\n parameters:\n - $ref: \"#/components/parameters/language\"\n - $ref: \"#/components/parameters/title\"\n responses:\n 200:\n description: Page fetched successfully\n content:\n application/json:\n schema:\n type: object\n properties:\n sourceLanguage:\n type: string\n example: es\n title:\n type: string\n example: Albert Einstein\n revision:\n type: string\n example: 165157183\n segmentedContent:\n type: string\n example: lorem ipsum\n 404:\n description: Page not found\n x-amples:\n - title: Fetch enwiki protected page\n request:\n params:\n language: en\n title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n response:\n status: 200\n headers:\n content-type: application/json\n - title: Fetch protected page with multi-word title\n request:\n params:\n language: en\n title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n response:\n status: 200\n headers:\n content-type: application/json\n /v1/page/{language}/{title}/{revision}:\n get:\n tags:\n - Page content\n summary: Fetches segmented mediawiki page with revision\n parameters:\n - $ref: \"#/components/parameters/language\"\n - $ref: \"#/components/parameters/title\"\n - $ref: \"#/components/parameters/revision\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n sourceLanguage:\n type: string\n example: en\n title:\n type: string\n example: Albert Einstein\n revision:\n type: string\n example: 1234565\n segmentedContent:\n type: string\n example: lorem ipsum\n 404:\n description: Page not found\n x-amples:\n - title: Fetch enwiki protected page with revision\n request:\n params:\n language: en\n title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n revision: 1086816359\n response:\n status: 200\n headers:\n content-type: application/json\n /v1/mt/{from}/{to}:\n post:\n tags:\n - Machine translation\n summary: Fetches the machine translation. Some providers require an authorization header\n and it is forbidden to use them outside the Content Translation tool.\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n requestBody:\n content:\n application/json:\n schema:\n required:\n - html\n example:\n hello world:\n value: { html: <p>hello world</p> }\n\n responses:\n 200:\n description: Machine translation fetched successfully\n content:\n application/json:\n examples:\n hello world:\n value: { html: <p>Bonjour le monde</p> }\n 400:\n description: Invalid language code specified\n 500:\n description: Internal error\n x-amples:\n - title: Machine translate an HTML fragment using TestClient.\n request:\n params:\n from: en\n to: qqq\n body:\n html: <p><a href='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a href='Atomic number'>atomic number</a> 8.</p>\n response:\n status: 200\n body:\n contents: /.+/\n headers:\n content-type: application/json\n /v1/mt/{from}/{to}/{mtprovider}:\n post:\n tags:\n - Machine translation\n summary: Fetches the machine translation. Some providers require an authorization header\n and it is forbidden to use them outside the Content Translation tool.\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/mtprovider\"\n requestBody:\n content:\n application/json:\n schema:\n required:\n - html\n properties:\n html:\n type: string\n description: The HTML content to translate\n x-textarea: true\n examples:\n hello world:\n value: { html: <p>hello world</p> }\n Let's translate:\n value: { html: <p>Let's translate this paragraph.</p> }\n responses:\n 200:\n description: Machine translation fetched successfully\n content:\n application/json:\n examples:\n hello world:\n value: { html: <p>Bonjour le monde</p> }\n 400:\n description: Not found\n x-amples:\n - title: Machine translate an HTML fragment using TestClient.\n request:\n params:\n from: en\n to: qqq\n provider: TestClient\n body:\n html: <p><a href='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a href='Atomic number'>atomic number</a> 8.</p>\n response:\n status: 200\n body:\n contents: /.+/\n headers:\n content-type: application/json\n /v1/list/pair/{from}/{to}:\n get:\n tags:\n - Tools\n summary: Lists the tools for a given language pair\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n responses:\n 200:\n description: Lists the tools for a given language pair fetched successfully\n content:\n application/json:\n schema:\n type: object\n properties:\n mt:\n type: array\n items:\n type: string\n example: { mt: [ Google, Elia, MinT ] }\n 500:\n description: Internal error\n x-amples:\n - title: Get the tools between two language pairs\n request:\n params:\n from: en\n to: es\n response:\n status: 200\n headers:\n content-type: application/json\n /v1/list/languagepairs:\n get:\n tags:\n - Languages\n - Service information\n summary: Lists the language pairs supported by the server\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n sources:\n type: array\n items:\n type: string\n description: Source language code\n x-amples:\n - title: Get all the language pairs\n response:\n status: 200\n headers:\n content-type: application/json\n /v1/list/{tool}:\n get:\n tags:\n - Tools\n - Service information\n summary: Lists all language pairs that tool supports.\n parameters:\n - $ref: \"#/components/parameters/tool\"\n responses:\n 200:\n description: List of all language pairs\n content:\n application/json:\n schema:\n type: object\n properties:\n sources:\n type: object\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Get the MT tool between two language pairs\n request:\n params:\n tool: mt\n response:\n status: 200\n headers:\n content-type: application/json\n /v1/list/{tool}/{from}/{to}:\n get:\n tags:\n - Tools\n - Service information\n summary: Lists the providers for the tool in that language pair.\n parameters:\n - $ref: \"#/components/parameters/tool\"\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n responses:\n 200:\n description: List mt tools available for the language pairs\n content:\n application/json:\n schema:\n type: object\n properties:\n mt:\n type: array\n items:\n type: string\n example: { mt: [ Google, Elia, MinT ] }\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Get the MT tool between two language pairs\n request:\n params:\n from: en\n to: es\n tool: mt\n response:\n status: 200\n headers:\n content-type: application/json\n # from routes/v2.js\n /v2/page/{sourcelanguage}/{targetlanguage}/{title}:\n get:\n tags:\n - Page content\n summary: Fetches segmented mediawiki page\n parameters:\n - $ref: \"#/components/parameters/sourcelanguage\"\n - $ref: \"#/components/parameters/targetlanguage\"\n - $ref: \"#/components/parameters/title\"\n responses:\n 200:\n description: Success\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Translate enwiki protected page\n request:\n params:\n sourcelanguage: en\n targetlanguage: es\n title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n response:\n status: 200\n headers:\n content-type: application/json\n - title: Translate enwiki protected page with multi-word title\n request:\n params:\n sourcelanguage: en\n targetlanguage: es\n title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n response:\n status: 200\n headers:\n content-type: application/json\n /v2/page/{sourcelanguage}/{targetlanguage}/{title}/{revision}:\n get:\n tags:\n - Page content\n summary: Fetches segmented mediawiki page with revision\n parameters:\n - $ref: \"#/components/parameters/sourcelanguage\"\n - $ref: \"#/components/parameters/targetlanguage\"\n - $ref: \"#/components/parameters/title\"\n - $ref: \"#/components/parameters/revision\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n sourceLanguage:\n type: string\n example: en\n title:\n type: string\n example: es\n revision:\n type: string\n example: 1234565\n segmentedContent:\n type: string\n example: lorem ipsum\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Translate enwiki protected page with revision\n request:\n params:\n sourcelanguage: en\n targetlanguage: es\n title: User:BSitzmann_(WMF)/MCS/Test/Frankenstein\n revision: 1086816359\n response:\n status: 200\n headers:\n content-type: application/json\n /v2/translate/{from}/{to}:\n post:\n tags:\n - Machine translation\n description: Adapt the content for the target language wiki without performing any machine translation.\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n requestBody:\n content:\n application/json:\n schema:\n required:\n - html\n properties:\n html:\n type: string\n examples:\n hello world:\n value: { html: <p>hello world</p> }\n required: true\n responses:\n 200:\n description: Success\n 400:\n description: Invalid language code\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Machine translate an HTML fragment without provider, and an invalid language pair\n request:\n params:\n from: en\n to: qqq\n body:\n html: <p><a rel=\"mw:WikiLink\" href='./Oxygen' title='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a rel=\"mw:WikiLink\" href='./Atomic number' title='Atomic number'>atomic number</a> 8.</p>\n response:\n status: 400\n\n /v2/translate/{from}/{to}/{mtprovider}:\n post:\n tags:\n - Machine translation\n summary: Translate the given content from source language to target language.\n description: Also adapt the content for the target language wiki. Some machine translation\n providers require an authorization header and it is forbidden to use them outside the\n Content Translation tool.\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/mtprovider\"\n requestBody:\n content:\n application/json:\n schema:\n required:\n - html\n properties:\n html:\n type: string\n examples:\n hello world:\n value: { html: <p>hello world</p> }\n required: true\n responses:\n 200:\n description: Success\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.\n request:\n params:\n from: en\n to: qqq\n mtprovider: TestClient\n body:\n html: <p><a rel=\"mw:WikiLink\" href='./Oxygen' title='Oxygen'>Oxygen</a> is a chemical element with symbol O and <a rel=\"mw:WikiLink\" href='./Atomic number' title='Atomic number'>atomic number</a> 8.</p>\n response:\n status: 200\n body:\n contents: /.+/\n headers:\n content-type: application/json\n /v2/suggest/title/{title}/{from}/{to}:\n get:\n tags:\n - Suggestions\n summary: Suggest a target title for the given source title and language pairs\n parameters:\n - $ref: \"#/components/parameters/title\"\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n history:\n type: array\n items:\n type: string\n description: Suggested title\n example:\n items:\n - Histoire\n - Historique\n 403:\n description: Authentication error. The default MT provider for the given language pair\n needs authorization, and the given JWT is invalid.\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Return the target language link for the given source title and language pairs\n description: The invalid JWT key is not used, as default MT provider doesn't need authentication\n request:\n headers:\n authorization: Test-auth\n params:\n title: Limonero\n from: es\n to: ca\n response:\n status: 200\n body:\n sourceLanguage: es\n targetLanguage: ca\n sourceTitle: Limonero\n targetTitle: Llimoner\n headers:\n content-type: application/json\n - title: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid\n description: The invalid JWT key is used, as default MT provider needs authentication\n request:\n headers:\n authorization: Test-auth\n params:\n title: Lemon\n from: en\n to: el\n response:\n status: 403\n /v2/suggest/title/{title}/{from}/{to}/{mtprovider}:\n get:\n tags:\n - Suggestions\n summary: Suggest a target title for the given source title and language pairs with the given MT service\n parameters:\n - $ref: \"#/components/parameters/title\"\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/mtprovider\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n history:\n type: array\n items:\n type: string\n description: Suggested title\n example:\n items:\n - Histoire\n - Historique\n 403:\n description: Authentication error. The default MT provider for the given language pair\n needs authorization, and the given JWT is invalid.\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Return the target language link for the given source title and language pairs\n description: The invalid JWT key is not used, as default MT provider doesn't need authentication\n request:\n headers:\n authorization: Test-auth\n params:\n title: Limonero\n from: es\n to: ca\n response:\n status: 200\n body:\n sourceLanguage: es\n targetLanguage: ca\n sourceTitle: Limonero\n targetTitle: Llimoner\n headers:\n content-type: application/json\n - title: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid\n description: The invalid JWT key is used, as default MT provider needs authentication\n request:\n headers:\n authorization: Test-auth\n params:\n title: Lemon\n from: en\n to: el\n response:\n status: 403\n /v2/suggest/source/{title}/{to}:\n get:\n tags:\n - Suggestions\n summary: Suggest a source article to use for creating given article in given target language\n using translation\n parameters:\n - $ref: \"#/components/parameters/title\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/sourcelanguages\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n suggestions:\n type: array\n items:\n type: object\n properties:\n pageId:\n type: integer\n example: 736\n ns:\n type: integer\n example: 0\n title:\n type: string\n example: Albert Einstein\n pageprops:\n type: object\n properties:\n wikibase_item:\n type: string\n example: Q937\n thumbnail:\n type: object\n properties:\n source:\n type: string\n example: https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Einstein_1921_by_F_Schmutzer_-_restoration.jpg/80px-Einstein_1921_by_F_Schmutzer_-_restoration.jpg\n width:\n type: integer\n example: 80\n height:\n type: integer\n example: 105\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Suggest a source title to use for translation\n request:\n params:\n to: ca\n title: Paneer\n query:\n sourcelanguages: en\n response:\n status: 200\n body:\n suggestions: /^\\[.+\\]$/\n headers:\n content-type: application/json\n /v2/suggest/sections/titles/{from}/{to}:\n get:\n tags:\n - Suggestions\n summary: Suggest target section titles based on provided source section titles. Titles are\n provided as URL params under the key \"titles\"\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/titles\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n history:\n type: array\n items:\n type: string\n description: Suggested section title\n example:\n - Histoire\n - Historique\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Suggest target section titles for given source sections\n request:\n params:\n from: en\n to: es\n query:\n titles: References|Notes|External Links\n response:\n status: 200\n body:\n References: [ Referencias, Bibliografía ]\n Notes: [ Referencias, Notas ]\n External Links: [ Enlaces externos ]\n headers:\n content-type: application/json\n /v2/suggest/sections/{title}/{from}/{to}:\n get:\n tags:\n - Suggestions\n summary: Suggest sections to translate from a source article to its corresponding article\n in target language.\n parameters:\n - $ref: \"#/components/parameters/title\"\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/include_section_sizes\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n sections:\n type: object\n properties:\n sourceLanguage:\n type: string\n example: en\n sourceTitle:\n type: string\n example: Albert Einstein\n targetLanguage:\n type: string\n example: fr\n targetTitle:\n type: string\n example: Albert Einstein\n sourceSections:\n type: array\n items:\n type: string\n targetSections:\n type: array\n items:\n type: string\n present:\n type: object\n missing:\n type: object\n 404:\n description: Not Found\n 500:\n description: Server Error\n x-amples:\n - title: Suggest source sections to translate\n request:\n params:\n from: en\n to: ml\n title: Sitar\n response:\n status: 200\n body:\n sections:\n sourceLanguage: /.+/\n targetLanguage: /.+/\n sourceTitle: /.+/\n targetTitle: /.+/\n present: /.+/\n missing: /.+/\n headers:\n content-type: application/json\n /v2/suggest/sections/{from}/{to}:\n get:\n tags:\n - Suggestions\n summary: Suggest sections to translate from source articles to their corresponding articles\n in target language, for a given list of articles.\n parameters:\n - $ref: \"#/components/parameters/from\"\n - $ref: \"#/components/parameters/to\"\n - $ref: \"#/components/parameters/titles\"\n - $ref: \"#/components/parameters/include_section_sizes\"\n responses:\n 200:\n description: Success\n content:\n application/json:\n schema:\n type: object\n properties:\n results:\n type: array\n items:\n type: object\n properties:\n sourceLanguage:\n type: string\n example: en\n sourceTitle:\n type: string\n example: Albert Einstein\n targetLanguage:\n type: string\n example: fr\n targetTitle:\n type: string\n example: Albert Einstein\n sourceSections:\n type: array\n items:\n type: string\n targetSections:\n type: array\n items:\n type: string\n present:\n type: object\n missing:\n type: object\n 400:\n description: Invalid language code\n 500:\n description: Server Error\n x-amples:\n - title: Suggest source sections to translate for multiple titles\n request:\n params:\n from: en\n to: ml\n query:\n titles: Pizza|Spaghetti\n include_section_sizes: true\n response:\n status: 200\n body:\n results:\n - sourceLanguage: en\n targetLanguage: ml\n sourceTitle: Pizza\n targetTitle: /.+/\n sourceSections: /.+/\n targetSections: /.+/\n present: /.+/\n missing: /.+/\n sourceSectionSizes: /.+/\n - sourceLanguage: en\n targetLanguage: ml\n sourceTitle: Spaghetti\n targetTitle: /.+/\n sourceSections: /.+/\n targetSections: /.+/\n present: /.+/\n missing: /.+/\n sourceSectionSizes: /.+/\n headers:\n content-type: application/json\n\n # from routes/info.js\n /_info:\n get:\n tags:\n - Service information\n summary: Gets information about the service\n responses:\n 200:\n description: OK\n x-amples:\n - title: retrieve service info\n request: {}\n response:\n status: 200\n headers:\n content-type: application/json\n body:\n name: /.+/\n description: /.+/\n version: /.+/\n home: /.+/\n /_info/name:\n get:\n tags:\n - Service information\n - Service name\n summary: Gets the name of the service\n responses:\n 200:\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n name:\n type: string\n example: { name: cxserver }\n x-amples:\n - title: retrieve service name\n request: {}\n response:\n status: 200\n headers:\n content-type: application/json\n body:\n name: /.+/\n /_info/version:\n get:\n tags:\n - Service information\n - Service version\n summary: Gets the running version of the service\n responses:\n 200:\n description: OK\n content:\n application/json:\n schema:\n type: object\n properties:\n version:\n type: string\n example: { version: 1.2.1 }\n x-amples:\n - title: retrieve service version\n request: {}\n response:\n status: 200\n headers:\n content-type: application/json\n body:\n version: /.+/\n /_info/home:\n get:\n tags:\n - Service information\n - Service homepage\n summary: Redirects to the home page\n responses:\n 301:\n description: Redirect\n x-amples:\n - title: redirect to the home page\n request: {}\n response:\n status: 301\ncomponents:\n parameters:\n domain:\n in: path\n name: domain\n required: true\n schema:\n type: string\n description: |\n Project domain for the requested data.\n language:\n in: path\n name: language\n required: true\n schema:\n type: string\n examples:\n English:\n value: en\n Spanish:\n value: es\n description: |\n Valid language code\n revision:\n in: path\n name: revision\n required: true\n schema:\n type: string\n description: |\n Revision Id\n example:\n 1274260387:\n value: 1274260387\n title:\n in: path\n name: title\n required: true\n schema:\n type: string\n examples:\n Albert Einstein:\n value: Albert Einstein\n Roller Coaster:\n value: Roller coaster\n description: |\n Page title. Use underscores instead of spaces. Example: `Main_Page`\n spec:\n in: query\n name: spec\n required: false\n schema:\n type: string\n examples:\n spec:\n value: true\n doc:\n value: true\n fooo:\n value: true\n description: |\n Page title. Use underscores instead of spaces. Example: `Main_Page`\n prop:\n in: path\n name: prop\n required: true\n schema:\n type: string\n description: |\n Site info prop.\n from:\n name: from\n in: path\n description: The source language code\n examples:\n English:\n value: en\n Spanish:\n value: es\n schema:\n type: string\n required: true\n sourcelanguage:\n name: sourcelanguage\n in: path\n description: The source language code\n schema:\n type: string\n examples:\n English:\n value: en\n Spanish:\n value: es\n required: true\n to:\n name: to\n in: path\n description: The target language code\n schema:\n type: string\n examples:\n Spanish:\n value: es\n French:\n value: fr\n required: true\n targetlanguage:\n name: targetlanguage\n in: path\n description: The target language code\n schema:\n type: string\n examples:\n French:\n value: fr\n Spanish:\n value: es\n required: true\n titles:\n in: query\n name: titles\n description: List of source section titles separated by pipe (\"|\") delimiter, based\n on which target section suggestions will be given. Should be passed as array\n inside URL params (e.g. titles=test1|test2)\n schema:\n type: string\n required: true\n examples:\n History|Background:\n value: History|Background\n History:\n value: History\n Background:\n value: Background\n sourcelanguages:\n name: sourcelanguages\n in: query\n description: Comma-separated list of candidate source languages. By default English(en)\n is used as a source language unless that is the target language.\n schema:\n type: array\n items:\n type: string\n examples:\n en,es:\n value: en,es\n style: simple\n explode: true\n required: true\n word:\n name: word\n in: path\n description: The word to lookup\n schema:\n type: string\n required: true\n mtprovider:\n name: mtprovider\n in: path\n description: The machine translation provider id\n required: false\n schema:\n type: string\n enum:\n - MinT\n - Apertium\n examples:\n MinT:\n value: MinT\n tool:\n name: tool\n in: path\n description: The tool name\n schema:\n type: string\n enum:\n - mt\n examples:\n mt:\n value: mt\n required: true\n include_section_sizes:\n name: include_section_sizes\n in: query\n description: Whether to include section sizes in the response\n schema:\n type: boolean\n examples:\n true:\n value: true\n false:\n value: false\n required: false\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-len","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/AdaptationTest.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/AdaptationTests.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/AdaptationTests.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/SectionTest.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":31,"column":20,"nodeType":"CallExpression","endLine":31,"endColumn":80}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { before, describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { deepEqual } from 'node:assert/strict';\nimport { JSDOM } from 'jsdom';\nimport Adapter from '../../lib/Adapter.js';\nimport MWApiRequestManager from '../../lib/mw/MWApiRequestManager.js';\nimport { TestClient } from '../../lib/mt/index.js';\nimport { getConfig } from '../../lib/util.js';\nimport { initApp } from '../../app.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nconst testcase = {\n\tdesc: 'section has lot of templates, but all are fragments of main template',\n\tfrom: 'en',\n\tto: 'es',\n\tsource: 'section-1.html',\n\tadaptationCount: 1\n};\n\ndescribe( 'Adaptation tests', () => {\n\tlet app;\n\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t} );\n\n\tit( 'should adapt section when: ' + testcase.desc, async () => {\n\t\tconst api = new MWApiRequestManager( app );\n\t\tapp.mtClient = new TestClient( app );\n\t\tconst adapter = new Adapter( testcase.from, testcase.to, api, app );\n\t\tconst testData = readFileSync( dirname + '/data/' + testcase.source, 'utf8' );\n\t\tconst result = await adapter.adapt( testData );\n\t\tconst resultDom = new JSDOM( result.getHtml() );\n\t\tconst elementWithDataCX = resultDom.window.document.querySelectorAll( '[data-cx]' );\n\t\tdeepEqual( elementWithDataCX.length, testcase.adaptationCount );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/adaptation/TemplateParameterMapper.test.js","messages":[],"suppressedMessages":[{"ruleId":"camelcase","severity":2,"message":"Identifier 'name_with_a_tailing_space' is not in camel case.","line":48,"column":4,"nodeType":"Identifier","messageId":"notCamelCase","endLine":48,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/app/app.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/app/spec.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":21,"column":16,"nodeType":"CallExpression","endLine":21,"endColumn":40},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":168,"column":10,"nodeType":"NewExpression","endLine":168,"endColumn":47}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { before, describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport swaggerrouter from 'swagger-router';\nimport { load } from 'js-yaml';\nimport request from 'supertest';\nimport OpenAPISchemaValidator from 'openapi-schema-validator';\nimport { status as assertStatus, contentType, deepEqual, notDeepEqual } from '../../utils/assert.js';\nimport { getConfig } from '../../../lib/util.js';\nimport { initApp } from '../../../app.js';\n\nconst ValidatorClass = OpenAPISchemaValidator.default;\nconst validator = new ValidatorClass( { version: 3 } );\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction staticSpecLoad() {\n\n\tlet spec;\n\tconst myService = getConfig();\n\tconst specPath = `${ dirname }/../../../${ myService.spec ? myService.spec : 'spec.yaml' }`;\n\n\ttry {\n\t\tspec = load( readFileSync( specPath ) );\n\t} catch ( e ) {\n\t\tthrow new Error( `Cannot load spec file: ${ specPath }` );\n\t}\n\n\treturn spec;\n\n}\n\nfunction validateExamples( pathStr, defParams, mSpec ) {\n\n\tconst uri = new swaggerrouter.URI( pathStr, {}, true );\n\n\tif ( !mSpec ) {\n\t\ttry {\n\t\t\turi.expand( defParams );\n\t\t\treturn true;\n\t\t} catch ( e ) {\n\t\t\tthrow new Error( `Missing parameter for route ${ pathStr } : ${ e.message }` );\n\t\t}\n\t}\n\n\tif ( !Array.isArray( mSpec ) ) {\n\t\tthrow new Error( `Route ${ pathStr } : x-amples must be an array!` );\n\t}\n\n\tmSpec.forEach( ( ex, idx ) => {\n\t\tif ( !ex.title ) {\n\t\t\tthrow new Error( `Route ${ pathStr }, example ${ idx }: title missing!` );\n\t\t}\n\t\tex.request = ex.request || {};\n\t\ttry {\n\t\t\turi.expand( Object.assign( {}, defParams, ex.request.params || {} ) );\n\t\t} catch ( e ) {\n\t\t\tthrow new Error(\n\t\t\t\t`Route ${ pathStr }, example ${ idx } (${ ex.title }): missing parameter: ${ e.message }`\n\t\t\t);\n\t\t}\n\t} );\n\n\treturn true;\n\n}\n\nfunction constructTestCase( title, path, method, req, response ) {\n\n\treturn {\n\t\ttitle,\n\t\trequest: {\n\t\t\turi: '/' + ( path[ 0 ] === '/' ? path.slice( 1 ) : path ),\n\t\t\tmethod,\n\t\t\theaders: req.headers || { 'Content-Type': 'application/json' },\n\t\t\tquery: req.query,\n\t\t\tbody: req.body,\n\t\t\tfollowRedirect: false\n\t\t},\n\t\tresponse: {\n\t\t\tstatus: response.status || 200,\n\t\t\theaders: response.headers || {},\n\t\t\tbody: response.body\n\t\t}\n\t};\n\n}\n\nfunction constructTests( paths, defParams ) {\n\n\tconst ret = [];\n\n\tObject.keys( paths ).forEach( ( pathStr ) => {\n\t\tObject.keys( paths[ pathStr ] ).forEach( ( method ) => {\n\t\t\tconst p = paths[ pathStr ][ method ];\n\t\t\tif ( {}.hasOwnProperty.call( p, 'x-monitor' ) && !p[ 'x-monitor' ] ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst uri = new swaggerrouter.URI( pathStr, {}, true );\n\t\t\tif ( !p[ 'x-amples' ] ) {\n\t\t\t\tret.push( constructTestCase(\n\t\t\t\t\tpathStr,\n\t\t\t\t\turi.toString( { params: defParams } ),\n\t\t\t\t\tmethod,\n\t\t\t\t\t{},\n\t\t\t\t\t{}\n\t\t\t\t) );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tp[ 'x-amples' ].forEach( ( ex ) => {\n\t\t\t\tex.request = ex.request || {};\n\t\t\t\tret.push( constructTestCase(\n\t\t\t\t\tex.title,\n\t\t\t\t\turi.toString( {\n\t\t\t\t\t\tparams: Object.assign( {}, defParams, ex.request.params || {} )\n\t\t\t\t\t} ),\n\t\t\t\t\tmethod,\n\t\t\t\t\tex.request,\n\t\t\t\t\tex.response || {}\n\t\t\t\t) );\n\t\t\t} );\n\t\t} );\n\t} );\n\n\treturn ret;\n\n}\n\nfunction cmp( result, expected, errMsg ) {\n\n\tif ( expected === null || expected === undefined ) {\n\t\t// nothing to expect, so we can return\n\t\treturn true;\n\t}\n\tif ( result === null || result === undefined ) {\n\t\tresult = '';\n\t}\n\n\tif ( expected.constructor === Object ) {\n\t\tObject.keys( expected ).forEach( ( key ) => {\n\t\t\tconst val = expected[ key ];\n\t\t\tdeepEqual( {}.hasOwnProperty.call( result, key ), true,\n\t\t\t\t`Body field ${ key } not found in response!` );\n\t\t\tcmp( result[ key ], val, `${ key } body field mismatch!` );\n\t\t} );\n\t\treturn true;\n\t} else if ( expected.constructor === Array ) {\n\t\tif ( result.constructor !== Array ) {\n\t\t\tdeepEqual( result, expected, errMsg );\n\t\t\treturn true;\n\t\t}\n\t\t// only one item in expected - compare them all\n\t\tif ( expected.length === 1 && result.length > 1 ) {\n\t\t\tresult.forEach( ( item ) => {\n\t\t\t\tcmp( item, expected[ 0 ], errMsg );\n\t\t\t} );\n\t\t\treturn true;\n\t\t}\n\t\t// more than one item expected, check them one by one\n\t\tif ( expected.length !== result.length ) {\n\t\t\tdeepEqual( result, expected, errMsg );\n\t\t\treturn true;\n\t\t}\n\t\texpected.forEach( ( item, idx ) => {\n\t\t\tcmp( result[ idx ], item, errMsg );\n\t\t} );\n\t\treturn true;\n\t}\n\n\tif ( expected.length > 1 && expected[ 0 ] === '/' && expected[ expected.length - 1 ] === '/' ) {\n\t\tif ( ( new RegExp( expected.slice( 1, -1 ) ) ).test( result ) ) {\n\t\t\treturn true;\n\t\t}\n\t} else if ( expected.length === 0 && result.length === 0 ) {\n\t\treturn true;\n\t} else if ( result === expected || result.startsWith( expected ) ) {\n\t\treturn true;\n\t}\n\n\tdeepEqual( result, expected, errMsg );\n\treturn true;\n\n}\n\nasync function validateTestResponse( testCase, response ) {\n\n\tconst expRes = testCase.response;\n\tif ( response.statusCode === 500 ) {\n\t\tconsole.error( response );\n\t}\n\t// check the status\n\tdeepEqual( response.statusCode, expRes.status, 'Status mismatch!' );\n\n\t// check the headers\n\tObject.keys( expRes.headers ).forEach( ( key ) => {\n\t\tconst val = expRes.headers[ key ];\n\t\tdeepEqual( !!response.headers[ key ], true,\n\t\t\t`Header ${ key } not found in response!` );\n\t\tcmp( response.headers[ key ], val, `${ key } header mismatch!` );\n\t} );\n\n\t// check the body\n\tif ( !expRes.body ) {\n\t\treturn true;\n\t}\n\tlet body = await response.body || '';\n\tif ( Buffer.isBuffer( body ) ) {\n\t\tbody = body.toString();\n\t}\n\tif ( expRes.body.constructor !== body.constructor ) {\n\t\tif ( expRes.body.constructor === String ) {\n\t\t\tbody = JSON.stringify( body );\n\t\t} else {\n\t\t\tbody = JSON.parse( body );\n\t\t}\n\t}\n\t// check that the body type is the same\n\tif ( expRes.body.constructor !== body.constructor ) {\n\t\tthrow new Error(\n\t\t\t`Expected body type ${ expRes.body.constructor } but got ${ body.constructor }`\n\t\t);\n\t}\n\n\t// compare the bodies\n\tcmp( body, expRes.body, 'Body mismatch!' );\n\n\treturn true;\n\n}\n\ndescribe( 'Swagger spec', async () => {\n\tlet app;\n\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t} );\n\n\t// the variable holding the spec\n\tlet spec = staticSpecLoad();\n\t// default params, if given\n\tlet defParams = spec[ 'x-default-params' ] || {};\n\n\tit( 'get the spec', async () => {\n\t\tconst response = await request( app ).get( '?spec' );\n\n\t\tconst data = await response.body;\n\t\tassertStatus( response, 200 );\n\t\tcontentType( response, 'application/json; charset=utf-8' );\n\t\tnotDeepEqual( data, undefined, 'No body received!' );\n\t\tspec = data;\n\t} );\n\n\tit( 'should expose valid OpenAPI spec', async () => {\n\t\tconst response = await request( app ).get( '?spec' );\n\t\tconst data = await response.body;\n\t\tdeepEqual( { errors: [] }, validator.validate( data ), 'Spec must have no validation errors' );\n\n\t} );\n\n\tit( 'spec validation', () => {\n\t\tif ( spec[ 'x-default-params' ] ) {\n\t\t\tdefParams = spec[ 'x-default-params' ];\n\t\t}\n\t\t// check the high-level attributes\n\t\t[ 'info', 'openapi', 'paths' ].forEach( ( prop ) => {\n\t\t\tdeepEqual( !!spec[ prop ], true, `No ${ prop } field present!` );\n\t\t} );\n\t\t// no paths - no love\n\t\tdeepEqual( !!Object.keys( spec.paths ), true, 'No paths given in the spec!' );\n\t\t// now check each path\n\t\tObject.keys( spec.paths ).forEach( ( pathStr ) => {\n\t\t\tdeepEqual( !!pathStr, true, 'A path cannot have a length of zero!' );\n\t\t\tconst path = spec.paths[ pathStr ];\n\t\t\tdeepEqual( !!Object.keys( path ), true, `No methods defined for path: ${ pathStr }` );\n\t\t\tObject.keys( path ).forEach( ( method ) => {\n\t\t\t\tconst mSpec = path[ method ];\n\t\t\t\tif ( {}.hasOwnProperty.call( mSpec, 'x-monitor' ) && !mSpec[ 'x-monitor' ] ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvalidateExamples( pathStr, defParams, mSpec[ 'x-amples' ] );\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'routes', async () => {\n\t\tconstructTests( spec.paths, defParams ).forEach( ( testCase ) => {\n\t\t\tit( testCase.title, async () => {\n\t\t\t\tlet uri = testCase.request.uri;\n\t\t\t\tlet response;\n\t\t\t\tconst options = {\n\t\t\t\t\tmethod: testCase.request.method.toUpperCase(),\n\t\t\t\t\theaders: testCase.request.headers,\n\t\t\t\t\tredirect: 'manual'\n\t\t\t\t};\n\t\t\t\tif ( options.method === 'POST' && testCase.request.body ) {\n\t\t\t\t\toptions.body = JSON.stringify( testCase.request.body );\n\n\t\t\t\t\tresponse = await request( app ).post( uri ).send( options.body ).set( 'Content-Type', 'application/json' )\n\t\t\t\t\t\t.set( 'Accept', 'application/json' );\n\t\t\t\t} else {\n\t\t\t\t\turi = `${ uri }?${ new URLSearchParams( testCase.request.query ).toString() }`;\n\t\t\t\t\tresponse = await request( app ).get( uri, options );\n\t\t\t\t}\n\n\t\t\t\tconst result = await validateTestResponse( testCase, response );\n\n\t\t\t\treturn result;\n\t\t\t} );\n\t\t} );\n\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/info/info.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/v1/page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/features/v2/page.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/lineardoc/LinearDoc.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":28,"column":22,"nodeType":"CallExpression","endLine":28,"endColumn":59},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":32,"column":24,"nodeType":"CallExpression","endLine":32,"endColumn":61},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":36,"column":26,"nodeType":"CallExpression","endLine":36,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":78,"column":28,"nodeType":"CallExpression","endLine":78,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":101,"column":28,"nodeType":"CallExpression","endLine":101,"endColumn":65},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":156,"column":27,"nodeType":"CallExpression","endLine":159,"endColumn":5},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":249,"column":28,"nodeType":"CallExpression","endLine":249,"endColumn":65}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":7,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport assert from 'node:assert/strict';\nimport { deepEqual } from '../utils/assert.js';\nimport {\n\tMwContextualizer,\n\tNormalizer,\n\tParser\n} from '../../lib/lineardoc/index.js';\nimport { isIgnorableBlock } from '../../lib/lineardoc/Utils.js';\nimport transTests from './translate.test.json' with { type: 'json' };\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /(\\r\\n|\\n|\\t|\\r)/gm, '' ) );\n\treturn normalizer.getHtml();\n}\n\ndescribe( 'LinearDoc', () => {\n\tit( 'should be possible to linearise all kind of HTML inputs', () => {\n\t\tconst numTests = 8;\n\t\tfor ( let i = 1; i <= numTests; i++ ) {\n\t\t\tconst testXhtmlFile = dirname + '/data/test' + i + '.xhtml';\n\t\t\tconst resultXmlFile = dirname + '/data/test' + i + '-result.xml';\n\t\t\tconst resultXhtmlFile = dirname + '/data/test' + i + '-result.xhtml';\n\t\t\tconst testXhtml = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t\t/^\\s+|\\s+$/,\n\t\t\t\t''\n\t\t\t);\n\t\t\tconst expectedXml = readFileSync( resultXmlFile, 'utf8' ).replace(\n\t\t\t\t/^\\s+|\\s+$/,\n\t\t\t\t''\n\t\t\t);\n\t\t\tconst expectedXhtml = readFileSync( resultXhtmlFile, 'utf8' ).replace(\n\t\t\t\t/^\\s+|\\s+$/,\n\t\t\t\t''\n\t\t\t);\n\t\t\tconst parser = new Parser( new MwContextualizer() );\n\t\t\tparser.init();\n\t\t\tparser.write( testXhtml );\n\t\t\tassert.ok(\n\t\t\t\t!isIgnorableBlock( parser.builder.doc ),\n\t\t\t\t'Not a section with block template'\n\t\t\t);\n\t\t\tdeepEqual(\n\t\t\t\tnormalize( parser.builder.doc.dumpXml() ),\n\t\t\t\tnormalize( expectedXml ),\n\t\t\t\t'Linearised structure'\n\t\t\t);\n\t\t\tdeepEqual(\n\t\t\t\tnormalize( parser.builder.doc.getHtml() ),\n\t\t\t\tnormalize( expectedXhtml ),\n\t\t\t\t'Reconstructed XHTML'\n\t\t\t);\n\t\t}\n\t} );\n\n\tit( 'should be possible to reconstruct the HTML from LinearDoc', () => {\n\t\tfor ( let i = 0, len = transTests.length; i < len; i++ ) {\n\t\t\tconst test = transTests[ i ];\n\t\t\tconst parser = new Parser( new MwContextualizer() );\n\t\t\tparser.init();\n\t\t\tparser.write( '<div>' + test.source + '</div>' );\n\t\t\tconst textBlock1 = parser.builder.doc.items[ 1 ].item;\n\t\t\tdeepEqual( textBlock1.getHtml(), test.source, 'Reconstructed source HTML' );\n\t\t\tconst textBlock2 = textBlock1.translateTags(\n\t\t\t\ttest.targetText,\n\t\t\t\ttest.rangeMappings\n\t\t\t);\n\t\t\tdeepEqual( textBlock2.getHtml(), test.expect, 'Translated HTML' );\n\t\t}\n\t} );\n\n\tit( 'should be possible to reduce and expand a document', () => {\n\t\tconst testXhtmlFile = dirname + '/data/test-figure-inline.html';\n\t\tconst contentForReduce = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t/^\\s+|\\s+$/,\n\t\t\t''\n\t\t);\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( contentForReduce );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t16,\n\t\t\t'Attributes for 16 tags extracted.'\n\t\t);\n\t\tconst expandedDoc = reducedDoc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( contentForReduce ),\n\t\t\t'Restored the original html after reduce and expand.'\n\t\t);\n\t} );\n\n\tit( 'test HTML compaction roundtrip with inline chunks', () => {\n\t\tconst testXhtmlFile = dirname + '/data/test-chunks-inline.html';\n\t\tconst contentForReduce = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t/^\\s+|\\s+$/,\n\t\t\t''\n\t\t);\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( contentForReduce );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t22,\n\t\t\t'Attributes for 22 tags extracted.'\n\t\t);\n\t\tconst expandedDoc = reducedDoc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( contentForReduce ),\n\t\t\t'Restored the original html after reduce and expand.'\n\t\t);\n\t} );\n\n\tit( 'test HTML expand with external attributes inserted', () => {\n\t\tconst corruptedDoc = `<p id=\"1\">\n\t\t\t<b id=\"2\" onclick=\"doSomething();\">Externally inserted attribute.</b>\n\t\t\t<a href=\"navigateThere();\">Externally inserted tag</a>\n\t\t\t<span id=\"mwEz\">Element with only id attribute is fine.</span>\n\t\t\t</p>`;\n\t\tconst sanitizedExpandedDoc = `<p class=\"paragraph\" id=\"mwEq\">\n\t\t\t<b class=\"bold\" id=\"mwEs\">Externally inserted attribute.</b>\n\t\t\t<a>Externally inserted tag</a>\n\t\t\t<span id=\"mwEz\">Element with only id attribute is fine.</span>\n\t\t\t</p>`;\n\t\tconst extractedData = {\n\t\t\t1: { attributes: { id: 'mwEq', class: 'paragraph' } },\n\t\t\t2: { attributes: { id: 'mwEs', class: 'bold' } }\n\t\t};\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( corruptedDoc );\n\t\tconst expandedDoc = parser.builder.doc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( sanitizedExpandedDoc ),\n\t\t\t'Expanded the corrupted document by removing all externally inserted attributes.'\n\t\t);\n\t} );\n\n\tit( 'test if the content is block level template', () => {\n\t\tconst testFiles = [\n\t\t\t'/data/test-block-template-section-1.html',\n\t\t\t'/data/test-block-template-section-2.html',\n\t\t\t'/data/test-block-template-section-3.html',\n\t\t\t'/data/test-block-template-section-4.html'\n\t\t];\n\t\tfor ( let i = 0; i < testFiles.length; i++ ) {\n\t\t\tconst contentForTest = readFileSync(\n\t\t\t\tdirname + testFiles[ i ],\n\t\t\t\t'utf8'\n\t\t\t).replace( /^\\s+|\\s+$/, '' );\n\t\t\tconst parser = new Parser( new MwContextualizer() );\n\t\t\tparser.init();\n\t\t\tparser.write( contentForTest );\n\t\t\tassert.ok(\n\t\t\t\tisIgnorableBlock( parser.builder.doc ),\n\t\t\t\t`File ${ testFiles[ i ] } is section with block template`\n\t\t\t);\n\t\t}\n\t} );\n\n\tit( 'test HTML compaction roundtrip with inline style content', () => {\n\t\tconst sourceDoc = `<section><p>\n\t\t<a href=\"Our title\">ABC</a>\n\t\t<style> a { background: url(https://en.wikipedia.org/css-background); } </style>\n\t\t<script>original script</script>\n\t\t<script type=\"module\" src=\"main.js\"></script>\n\t\t<span id=\"mwKJ\" typeof=\"mw:Entity\">–</span>\n\t\t</p>\n\t\t</section>`;\n\n\t\tconst expectedReducedDoc = `<section><p>\n\t\t<a id=\"1\">ABC</a>\n\t\t<style id=\"2\"></style>\n\t\t<script id=\"3\"></script>\n\t\t<script id=\"4\"></script>\n\t\t<span id=\"5\">–</span>\n\t\t</p>\n\t\t</section>`;\n\t\t// MT result from external MT service. Assuming that it altered the style and script content.\n\t\tconst corruptedMTInput = `<section><p>\n\t\t<a id=\"1\" href=\"Their title\">abc</a>\n\t\t<style id=\"2\"> a { background: url(https://leaking.via/css-background); } </style>\n\t\t<script id=\"3\">Corrupted script</script>\n\t\t<script id=\"4\" src=\"https://bad.via/main.js\"></script>\n\t\t<span id=\"5\">©</span>\n\t\t</p>\n\t\t</section>`;\n\t\t// Expected final output after fixing all external modification\n\t\tconst sanitizedExpandedDoc = `<section><p>\n\t\t<a href=\"Our title\">abc</a>\n\t\t<style> a { background: url(https://en.wikipedia.org/css-background); } </style>\n\t\t<script>original script</script>\n\t\t<script type=\"module\" src=\"main.js\"></script>\n\t\t<span id=\"mwKJ\" typeof=\"mw:Entity\">–</span>\n\t\t</p>\n\t\t</section>`;\n\t\tlet parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tdeepEqual(\n\t\t\tnormalize( reducedDoc.getHtml() ),\n\t\t\tnormalize( expectedReducedDoc ),\n\t\t\t'Expanded the corrupted document by removing all externally inserted attributes.'\n\t\t);\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t5,\n\t\t\t'Attributes for 2 tags extracted.'\n\t\t);\n\t\tdeepEqual(\n\t\t\t!!extractedData[ '2' ].content,\n\t\t\ttrue,\n\t\t\t'Content extracted for style tag'\n\t\t);\n\t\tdeepEqual(\n\t\t\t!!extractedData[ '3' ].content,\n\t\t\ttrue,\n\t\t\t'Content extracted for script tag'\n\t\t);\n\t\tdeepEqual(\n\t\t\t!!extractedData[ '5' ].content,\n\t\t\ttrue,\n\t\t\t'Content extracted for tag with mw:Entity'\n\t\t);\n\t\tparser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( corruptedMTInput );\n\t\tconst expandedDoc = parser.builder.doc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( sanitizedExpandedDoc ),\n\t\t\t'Expanded the corrupted document by ignoring modified style and script content'\n\t\t);\n\t} );\n\n\tit( 'test HTML compaction roundtrip with template with empty content', () => {\n\t\tconst testXhtmlFile =\n\t\t\tdirname + '/data/text-inline-template-empty-content.html';\n\t\tconst contentForReduce = readFileSync( testXhtmlFile, 'utf8' ).replace(\n\t\t\t/^\\s+|\\s+$/,\n\t\t\t''\n\t\t);\n\t\tconst parser = new Parser( new MwContextualizer() );\n\t\tparser.init();\n\t\tparser.write( contentForReduce );\n\t\tconst { reducedDoc, extractedData } = parser.builder.doc.reduce();\n\t\tconst reducedParser = new Parser( new MwContextualizer() );\n\t\treducedParser.init();\n\t\treducedParser.write( reducedDoc.getHtml() );\n\t\tdeepEqual(\n\t\t\tObject.keys( extractedData ).length,\n\t\t\t6,\n\t\t\t'Attributes for 6 tags extracted.'\n\t\t);\n\t\tconst expandedDoc = reducedParser.builder.doc.expand( extractedData );\n\t\tdeepEqual(\n\t\t\tnormalize( expandedDoc.getHtml() ),\n\t\t\tnormalize( contentForReduce ),\n\t\t\t'Restored the original html after reduce and expand.'\n\t\t);\n\t} );\n\n\tit( 'test getRootItem for ignoring blockspaces', () => {\n\t\tconst sourceDoc = `<section data-mw-section-id=\"25\" id=\"mwArE\">\n\t\t<p id=\"mwArI\">Sestak voted for the <a rel=\"mw:WikiLink\" href=\"./Improving_Head_Start_Act\"\n\t\t\t\ttitle=\"Improving Head Start Act\" id=\"mwArM\" class=\"new\">Improving Head Start Act</a> and the <a\n\t\t\t\trel=\"mw:WikiLink\" href=\"./College_Cost_Reduction_and_Access_Act\"\n\t\t\t\ttitle=\"College Cost Reduction and Access Act\" id=\"mwArQ\"\n\t\t\t\tclass=\"new\">College Cost Reduction and Access Act</a>.\n\t\t\t</p>\n\t\t</section>`;\n\n\t\tconst parser = new Parser( new MwContextualizer(), {\n\t\t\tisolateSegments: true\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst rootItem = parser.builder.doc.getRootItem();\n\t\tdeepEqual(\n\t\t\trootItem.name,\n\t\t\t'p',\n\t\t\t'getRootItem should ignore the blockspaces in the beginning of the document'\n\t\t);\n\t} );\n\n\tit( 'test getRootItem for not ignoring non-whitespace content in textblock', () => {\n\t\tconst sourceDoc = `<p id=\"mwFg\">The tensor product of <span about=\"#mwt10\" class=\"texhtml \"\n\t\tdata-mw=\"{}\" id=\"mwFw\" typeof=\"mw:Transclusion\"><i>V</i></span> and.\n\t\t</p>`;\n\n\t\tconst parser = new Parser( new MwContextualizer(), {\n\t\t\tisolateSegments: true\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst parsedDoc = parser.builder.doc;\n\t\tconst textblock = parsedDoc.items.find( ( item ) => item.type === 'textblock' );\n\t\tconst rootItem = textblock.item.getRootItem();\n\t\tdeepEqual(\n\t\t\trootItem,\n\t\t\tnull,\n\t\t\t'getRootItem of textblock should consider non-whitespace content inside its textchunks'\n\t\t);\n\t} );\n\n\tit( 'test getRootItem for ignoring whitespace content in textblock', () => {\n\t\tconst sourceDoc = `<p id=\"mwFg\">\n\t\t <span about=\"#mwt10\" class=\"texhtml \"\n\t\tdata-mw=\"{}\" id=\"mwFw\" typeof=\"mw:Transclusion\"><i>V</i></span> and.\n\t\t</p>`;\n\n\t\tconst parser = new Parser( new MwContextualizer(), {\n\t\t\tisolateSegments: true\n\t\t} );\n\t\tparser.init();\n\t\tparser.write( sourceDoc );\n\t\tconst parsedDoc = parser.builder.doc;\n\t\tconst textblock = parsedDoc.items.find( ( item ) => item.type === 'textblock' );\n\t\tconst rootItem = textblock.item.getRootItem();\n\t\tdeepEqual(\n\t\t\trootItem.name,\n\t\t\t'span',\n\t\t\t'getRootItem of textblock should ignore whitespace content inside its textchunks'\n\t\t);\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/lineardoc/translate.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Apertium.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Elia.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Google.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/LingCloud.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/MTClient.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/Template.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mt/transform.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/MWPageLoaderTest.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":37,"column":27,"nodeType":"CallExpression","endLine":37,"endColumn":83},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":46,"column":5,"nodeType":"CallExpression","endLine":46,"endColumn":61}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { before, describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { each } from 'async';\nimport { deepEqual } from '../utils/assert.js';\nimport { getConfig } from '../../lib/util.js';\nimport { Normalizer } from '../../lib/lineardoc/index.js';\nimport MWPageLoader from '../../lib/mw/MWPageLoader.js';\nimport { initApp } from '../../app.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/gm, '' ) );\n\treturn normalizer.getHtml();\n}\n\nconst tests = [\n\t{\n\t\tdesc: 'Add data-section-number attribute to every CX section',\n\t\tsource: 'test-data-section-number.html',\n\t\tsourceLanguage: 'en',\n\t\ttargetLanguage: 'es',\n\t\tresult: 'result-data-section-number.html'\n\t}\n];\ndescribe( 'MWPageLoader tests', () => {\n\tlet app;\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t} );\n\n\teach( tests, ( test ) => {\n\t\tit( 'Test: ' + test.desc, () => {\n\t\t\t// Fake the actual MWPageLoader fetch call\n\t\t\tMWPageLoader.prototype.fetch = () => {\n\t\t\t\tconst sourceContent = readFileSync( dirname + '/data/' + test.source, 'utf8' );\n\t\t\t\treturn Promise.resolve( { body: sourceContent } );\n\t\t\t};\n\t\t\tconst pageloader = new MWPageLoader( {\n\t\t\t\tcontext: app,\n\t\t\t\tsourceLanguage: test.sourceLanguage,\n\t\t\t\ttargetLanguage: test.targetLanguage\n\t\t\t} );\n\t\t\tconst expectedResultData = normalize(\n\t\t\t\treadFileSync( dirname + '/data/' + test.result, 'utf8' )\n\t\t\t);\n\t\t\treturn pageloader.getPage( 'mockPage', null, true ).then( ( processedPageContent ) => {\n\t\t\t\tdeepEqual( normalize( processedPageContent.content ), expectedResultData, test.desc );\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/SectionWrap.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":17,"column":33,"nodeType":"CallExpression","endLine":17,"endColumn":92}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { forEach } from 'async';\nimport { load } from 'js-yaml';\nimport { deepEqual } from '../utils/assert.js';\nimport { MwContextualizer, Normalizer, Parser } from '../../lib/lineardoc/index.js';\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/g, '' ) );\n\treturn normalizer.getHtml();\n}\n\nfunction getParsedDoc( content ) {\n\tconst pageloaderConfig = load( readFileSync( dirname + '/../../config/MWPageLoader.yaml' ) );\n\tconst parser = new Parser( new MwContextualizer(\n\t\t{ removableSections: pageloaderConfig.removableSections }\n\t), {\n\t\twrapSections: true\n\t} );\n\tparser.init();\n\tparser.write( content );\n\treturn parser.builder.doc;\n}\n\nconst sourceHTML = `<body>\n\t<section data-mw-section-id=\"0\">\n\t<p id=\"mwAb\">Paragraph <b>bold</b> <a href=\"/wiki/Title\">Title</a>.</p>\n\t</section>\n\t<section data-mw-section-id=\"1\">\n\t<h3>Heading</h3>\n\t<table><tr><td>data</td></tr></table>\n\t<div id=\"mwAc\">Content<div>innerdiv</div></div>\n\t</section>\n\t<section data-mw-section-id=\"2\">\n\t<p>Content<div>Div in paragraph</div></p>\n\t<ol><li>Item</li><li>Item</li></ol></section>\n\t<section data-mw-section-id=\"3\">\n\t<div typeof=\"mw:Transclusion\" about=\"#mwt1\" data-mw=\"{}\">Block template</div>\n\t</section>\n\t<section data-mw-section-id=\"4\">\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt2\" data-mw=\"{}\">Some text content</span>\n\t<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n\t</section>\n\t<section data-mw-section-id=\"5\">\n\t<p>An inline <span typeof=\"mw:Transclusion\" about=\"#mwt3\" data-mw=\"{}\">template</span></p>\n\t</section>\n\t<section data-mw-section-id=\"6\">\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt4\" data-mw=\"{}\">Template 4: Some text content</span>\n\t<table about=\"#mwt4\"><tr><td>Template 4: value</td></tr></table>\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt5\" data-mw=\"{}\">Template 5: Some text content</span>\n\t<table about=\"#mwt5\"><tr><td>Template 5: value</td></tr></table>\n\t</section>\n\t<figure class=\"mw-default-size mw-halign-right\" id=\"mweA\" typeof=\"mw:File/Thumb\">\n\t<a href=\"./File:PriestleyFuseli.jpg\" id=\"mweQ\">\n\t<img alt=\"Alt text\" data-file-height=\"587\" data-file-type=\"bitmap\" data-file-width=\"457\" height=\"218\" id=\"mweg\" resource=\"./File:PriestleyFuseli.jpg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/170px-PriestleyFuseli.jpg\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/340px-PriestleyFuseli.jpg 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/255px-PriestleyFuseli.jpg 1.5x\" width=\"170\" /></a>\n\t<figcaption id=\"mwew\">\n\t<a href=\"./Joseph_Priestley\" id=\"mwfA\" rel=\"mw:WikiLink\" title=\"Joseph Priestley\">Joseph Priestley</a> is usually given priority in the discovery.\n\t</figcaption>\n\t</figure>\n\t<dl id=\"mwAW8\">\n\t<dd id=\"mwAXA\">3 Fe + 4 H<sub id=\"mwAXE\">2</sub></dd>\n\t</dl>\n\t<link href=\"./Category:Category1\" id=\"mwCKQ\" rel=\"mw:PageProp/Category\" />\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:All_stub_articles\" about=\"#mwt8\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"nervous-system-drug-stub\",\"href\":\"./Template:Nervous-system-drug-stub\"},\"params\":{},\"i\":0}}]}'\n\tid=\"mwJg\" />\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:Nervous_system_drug_stubs\" about=\"#mwt8\" />\n\t<table class=\"plainlinks stub\" role=\"presentation\" style=\"background:transparent\" about=\"#mwt8\" id=\"mwJw\">\n\t<tbody></tbody>\n\t</table>\n\t<span id=\"empty_inline_annotation_transclusion\" about=\"#mwt335\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"anchor\",\"href\":\"./Template:Anchor\"},\"params\":{\"1\":{\"wt\":\"partial pressure\"}},\"i\":0}}]}'></span>\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:Wikipedia_indefinitely_move-protected_pages#Oxygen\" about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"pp-move-indef\",\"href\":\"./Template:Pp-move-indef\"},\"params\":{},\"i\":0}}]}' id=\"mwBg\" />\n\t<section data-mw-section-id=\"61\">\n\t<div role=\"navigation\" class=\"navbox\" about=\"#mwt61\" typeof=\"mw:Transclusion\" data-mw=\"{}\">\n\tSection to be removed from output based on the navbox class\n\t</div>\n\t<link rel=\"mw:PageProp/Category\" href=\"./Category:Food_preparation\" about=\"#mwt61\">\n\t<span about=\"#mwt61\">Fragment 2</span>\n\t</section>\n\t</body>`;\n\nconst expectedSectionWrappedHTML = `<body>\n\t<section rel=\"cx:Section\"><p id=\"mwAb\">Paragraph <b>bold</b> <a href=\"/wiki/Title\">Title</a>.</p></section>\n\t<section rel=\"cx:Section\"><h3>Heading</h3></section>\n\t<section rel=\"cx:Section\"><table><tr><td>data</td></tr></table></section>\n\t<section rel=\"cx:Section\"><div id=\"mwAc\">Content<div>innerdiv</div></div></section>\n\t<section rel=\"cx:Section\"><p>Content<div>Div in paragraph</div></p></section>\n\t<section rel=\"cx:Section\"><ol><li>Item</li><li>Item</li></ol></section>\n\t<section rel=\"cx:Section\">\n\t<div typeof=\"mw:Transclusion\" about=\"#mwt1\" data-mw=\"{}\">Block template</div>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<span typeof=\"mw:Transclusion\" about=\"#mwt2\" data-mw='{}'>Some text content</span>\n\t<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<p>An inline <span about=\"#mwt3\" data-mw=\"{}\" typeof=\"mw:Transclusion\">template</span></p>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<span about=\"#mwt4\" data-mw=\"{}\" typeof=\"mw:Transclusion\">Template 4: Some text content</span>\n\t<table about=\"#mwt4\"><tr><td>Template 4: value</td></tr></table>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<span about=\"#mwt5\" data-mw=\"{}\" typeof=\"mw:Transclusion\">Template 5: Some text content</span>\n\t<table about=\"#mwt5\"><tr><td>Template 5: value</td></tr></table>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<figure class=\"mw-default-size mw-halign-right\" id=\"mweA\" typeof=\"mw:File/Thumb\" rel=\"cx:Figure\">\n\t<a href=\"./File:PriestleyFuseli.jpg\" id=\"mweQ\"><img alt=\"Alt text\" data-file-height=\"587\" data-file-type=\"bitmap\" data-file-width=\"457\" height=\"218\" id=\"mweg\" resource=\"./File:PriestleyFuseli.jpg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/170px-PriestleyFuseli.jpg\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/340px-PriestleyFuseli.jpg 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/PriestleyFuseli.jpg/255px-PriestleyFuseli.jpg 1.5x\" width=\"170\" /></a>\n\t<figcaption id=\"mwew\">\n\t<a href=\"./Joseph_Priestley\" id=\"mwfA\" rel=\"mw:WikiLink\" title=\"Joseph Priestley\">Joseph Priestley</a> is usually given priority in the discovery.\n\t</figcaption>\n\t</figure>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<dl id=\"mwAW8\">\n\t<dd id=\"mwAXA\">3 Fe + 4 H<sub id=\"mwAXE\">2</sub></dd>\n\t</dl>\n\t</section>\n\t</body>`;\n\nconst sectionWithCategories = `\n\t<body class=\"mw-content-ltr sitedir-ltr ltr mw-body-content parsoid-body mediawiki mw-parser-output\" dir=\"ltr\" id=\"mwAA\" lang=\"en\">\n\t<section data-mw-section-id=\"0\">\n\t<p id=\"mwAdo\">\n\n\t<span about=\"#mwt87\" class=\"noviewer\" data-mw=\"{"parts":[{"template":{"target":{"wt":"Commonscat-inline","href":"./Template:Commonscat-inline"},"params":{"1":{"wt":"Attack aircraft"}},"i":0}}]}\" id=\"mwAds\" typeof=\"mw:Transclusion mw:Image\">\n\t<a href=\"./File:Commons-logo.svg\">\n\t<link href=\"./Category:Articles with inline\" about=\"#mwt87\" id=\"mwAd8\" rel=\"mw:PageProp/Category\" />\n\t<img alt=\"\" data-file-height=\"1376\" data-file-type=\"drawing\" data-file-width=\"1024\" height=\"16\" resource=\"./File:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/12px-Commons-logo.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/24px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/18px-Commons-logo.svg.png 1.5x\" width=\"12\" />\n\t</a>\n\t</span>\n\t<span about=\"#mwt87\"> Media related to </span>\n\t<a about=\"#mwt87\" class=\"cx-link\" data-linkid=\"440\" href=\"https://commons.wikimedia.org/wiki/Category:Attack%20aircraft\" rel=\"mw:WikiLink/Interwiki\" title=\"commons:Category:Attack aircraft\">Attack aircraft</a>\n\t<span about=\"#mwt87\"> at Wikimedia Commons</span>\n\t</span>\n\t</p>\n\n\t<p>Another para</p>\n\t<link href=\"./Category:Fighter_aircraft\" id=\"mwAd4\" rel=\"mw:PageProp/Category\" />\n\t<link href=\"./Category:Attack_aircraft#%20\" id=\"mwAd8\" rel=\"mw:PageProp/Category\" />\n\n\t</section>\n\t</body>`;\n\nconst sectionWithCategoriesExpectedHtml = `\n\t<body class=\"mw-content-ltr sitedir-ltr ltr mw-body-content parsoid-body mediawiki mw-parser-output\" dir=\"ltr\" id=\"mwAA\" lang=\"en\">\n\t<section rel=\"cx:Section\">\n\n\t<p id=\"mwAdo\">\n\t<span about=\"#mwt87\" class=\"noviewer\" data-mw=\"{"parts":[{"template":{"target":{"wt":"Commonscat-inline","href":"./Template:Commonscat-inline"},"params":{"1":{"wt":"Attack aircraft"}},"i":0}}]}\" id=\"mwAds\" typeof=\"mw:Transclusion mw:Image\">\n\t<a href=\"./File:Commons-logo.svg\">\n\t<link about=\"#mwt87\" href=\"./Category:Articles with inline\" id=\"mwAd8\" rel=\"mw:PageProp/Category\" />\n\t<img alt=\"\" data-file-height=\"1376\" data-file-type=\"drawing\" data-file-width=\"1024\" height=\"16\" resource=\"./File:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/12px-Commons-logo.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/24px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/en/thumb/4/4a/Commons-logo.svg/18px-Commons-logo.svg.png 1.5x\" width=\"12\" />\n\t</a>\n\t</span><span about=\"#mwt87\"> Media related to </span>\n\t<a about=\"#mwt87\" class=\"cx-link\" data-linkid=\"440\" href=\"https://commons.wikimedia.org/wiki/Category:Attack%20aircraft\" rel=\"mw:WikiLink/Interwiki\" title=\"commons:Category:Attack aircraft\">Attack aircraft</a>\n\t<span about=\"#mwt87\"> at Wikimedia Commons</span></span>\n\t</p>\n\t</section>\n\n\t<section rel=\"cx:Section\">\n\t<p>Another para</p>\n\t</section>\n\t</body>`;\n\nconst nestedSectionsWithTransclusion = `\n\t<body>\n\t<section data-mw-section-id=\"2\" id=\"mwVw\">\n\t<p id=\"mw5Q\">\n\t<span about=\"#mwt216\" typeof=\"mw:Transclusion\" data-mw=\"{}\" id=\"mw7Q\">10,000</span>\n\t<span typeof=\"mw:Entity\" about=\"#mwt216\"> </span>\n\t<span about=\"#mwt216\">m (33,000</span>\n\t<span about=\"#mwt216\">mi)</span> in the\n\t</p>\n\t<section data-mw-section-id=\"3\" id=\"mwXw\">\n\t<h3>Heading</h3>\n\t<p id=\"mw6Q\">Para1</p>\n\t<p>Para2</p>\n\t</section>\n\t</section>\n\t</body>`;\n\nconst nestedSectionsWithTransclusionExpected = `\n\t<body>\n\t<section rel=\"cx:Section\">\n\t<p id=\"mw5Q\">\n\t<span about=\"#mwt216\" data-mw=\"{}\" id=\"mw7Q\" typeof=\"mw:Transclusion\">10,000</span>\n\t<span about=\"#mwt216\" typeof=\"mw:Entity\"> </span>\n\t<span about=\"#mwt216\">m (33,000</span>\n\t<span about=\"#mwt216\">mi)</span> in the</p>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<h3>Heading</h3>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<p id=\"mw6Q\">Para1</p>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t<p>Para2</p>\n\t</section>\n\t</body>`;\n\nconst sectionWithBlankTemplate = `\n<body>\n<section data-mw-section-id=\"0\" id=\"mwAQ\">\n<div class=\"shortdescription nomobile noexcerpt noprint searchaux\" style=\"display:none\" about=\"#mwt3\" typeof=\"mw:Transclusion\" data-mw=\"{}\" id=\"mwAw\">City in Virovitica-Podravina, Croatia</div>\n<link rel=\"mw:PageProp/Category\" href=\"./Category:Articles_with_short_description\" about=\"#mwt3\">\n<table class=\"infobox\" id=\"mwBV\"></table>\n</section>\n</body>`;\n\nconst sectionWithBlankTemplateExpected = `\n<body>\n<section rel=\"cx:Section\">\n<div about=\"#mwt3\" class=\"shortdescription nomobile noexcerpt noprint searchaux\" data-mw=\"{}\" id=\"mwAw\" style=\"display:none\" typeof=\"mw:Transclusion\">City in Virovitica-Podravina, Croatia</div>\n<link about=\"#mwt3\" href=\"./Category:Articles_with_short_description\" rel=\"mw:PageProp/Category\"></link>\n</section>\n<section rel=\"cx:Section\">\n<table class=\"infobox\" id=\"mwBV\"></table></section>\n</body>`;\n\nconst wholeBodySource = `\n<html>\n<head></head>\n<body id=\"mwAA\" lang=\"en\" >\n<section data-mw-section-id=\"1\" id=\"mwAQ\">\n<div typeof=\"mw:Transclusion\" about=\"#mwt2\" data-mw=\"{}\" id=\"mwAw\">Some text content</div>\n<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n</section>\n<section data-mw-section-id=\"2\" id=\"mwAQ\">\n<span typeof=\"mw:Transclusion\" about=\"#mwt3\" data-mw=\"{}\" id=\"mwAw\">Some text content</span>\n<table about=\"#mwt3\"><tr><td>used value</td></tr></table>\n</section>\n</body>\n</html>`;\n\nconst wholeBodyResult = `\n<html>\n<head></head>\n<body id=\"mwAA\" lang=\"en\">\n<section rel=\"cx:Section\">\n<div about=\"#mwt2\" data-mw=\"{}\" id=\"mwAw\" typeof=\"mw:Transclusion\">Some text content</div>\n<table about=\"#mwt2\"><tr><td>used value</td></tr></table>\n</section>\n<section rel=\"cx:Section\">\n<span about=\"#mwt3\" data-mw=\"{}\" id=\"mwAw\" typeof=\"mw:Transclusion\">Some text content</span>\n<table about=\"#mwt3\"><tr><td>used value</td></tr></table>\n</section>\n</body>\n</html>`;\n\nconst sectionWithMeta = `\n<body id=\"mwAA\" lang=\"he\">\n<section data-mw-section-id=\"0\" id=\"mwAQ\">\n<meta property=\"mw:PageProp/displaytitle\" content=\"פלמינג: האיש שרצה להיות בונד\" id=\"mwAg\" />\n<table class=\"infobox\" style=\"width: 270px; font-size: 95%;\" about=\"#mwt2\" typeof=\"mw:Transclusion\" data-mw='{}' id=\"mwAw\">\n\t<caption style=\"background: #C6C9FF; border:1px solid #aaaaaa; border-bottom:0px;\">פלמינג: האיש שרצה להיות\n\t\tבונד<br />Fleming: The Man Who Would Be Bond</caption>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td colspan=\"2\" style=\"text-align:center\"></td>\n\t\t</tr>\n\t</tbody>\n</table>\n<link rel=\"mw:PageProp/Category\" href=\"./קטגוריה:ויקינתונים_-_השוואת_ערכים:_חסר\" about=\"#mwt2\" />\n<p id=\"mwBQ\"><b id=\"mwBg\">פלמינג: האיש שרצה להיות בונד</b></p>\n</section>\n</body>\n`;\n\nconst sectionWithMetaResult = `\n<body id=\"mwAA\" lang=\"he\">\n<section rel=\"cx:Section\">\n<meta content=\"פלמינג: האיש שרצה להיות בונד\" id=\"mwAg\" property=\"mw:PageProp/displaytitle\" />\n</section>\n<section rel=\"cx:Section\">\n<table about=\"#mwt2\" class=\"infobox\" data-mw=\"{}\" id=\"mwAw\" style=\"width: 270px; font-size: 95%;\" typeof=\"mw:Transclusion\">\n<caption style=\"background: #C6C9FF; border:1px solid #aaaaaa; border-bottom:0px;\">פלמינג: האיש שרצה להיותבונד\n<br />Fleming: The Man Who Would Be Bond</caption>\n<tbody>\n<tr><td colspan=\"2\" style=\"text-align:center\"></td></tr></tbody>\n</table><link about=\"#mwt2\" href=\"./קטגוריה:ויקינתונים_-_השוואת_ערכים:_חסר\" rel=\"mw:PageProp/Category\" />\n</section>\n<section rel=\"cx:Section\">\n<p id=\"mwBQ\"><b id=\"mwBg\">פלמינג: האיש שרצה להיות בונד</b>\n</p>\n</section>\n</body>\"\n`;\n\nconst sectionWithFigureInlineTemplate = `\n<html>\n\t<body>\n\t<h2 id=\"Enlaces_externos\">Enlaces externos</h2>\n\t<ul id=\"mwASA\">\n\t\t<li id=\"mwASE\"><a rel=\"mw:ExtLink\"\n\t\t\t\thref=\"http://www.portaloaca.com/historia/otroshistoria/94-la-leyenda-de-la-mano-negra.html\"\n\t\t\t\tclass=\"external text\" id=\"mwASI\">La leyenda de La Mano Negra</a></li>\n\t</ul>\n\t<span about=\"#mwt92\" typeof=\"mw:Transclusion\"\n\t\tdata-mw=\"{"parts":[{"template":{"target":{"wt":"commonscat","href":"./Plantilla:Commonscat"},"params":{"1":{"wt":"La Mano Negra"}},"i":0}},"\\\\n\\\\n[[Categoría:Historia de la provincia de Cádiz]]\\\\n[[Categoría:Derecho de Andalucía]]\\\\n[[Categoría:Casos judiciales de España]]\\\\n[[Categoría:Sociedades secretas]]\\\\n[[Categoría:Reinado de Alfonso XII]]\\\\n[[Categoría:Casos judiciales anarquistas]]\\\\n[[Categoría:Teorías conspirativas]]\\\\n[[Categoría:Historia del anarquismo]]\\\\n[[Categoría:Anarquismo en España]]\\\\n[[Categoría:España en 1882]]\\\\n[[Categoría:España en 1883]]\\\\n[[Categoría:España en 1884]]\\\\n[[Categoría:Política en 1882]]\\\\n[[Categoría:Política en 1883]]\\\\n[[Categoría:Política en 1884]]\\\\n[[Categoría:Atentados anarquistas]]"]}\"\n\t\tid=\"mwASk\">\n\t</span>\n\t<ul about=\"#mwt92\">\n\t\t<li>\n\t\t\t<span typeof=\"mw:Image\">\n\t\t\t<span>\n\t\t\t\t<img alt=\"\" resource=\"./Archivo:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/15px-Commons-logo.svg.png\" data-file-width=\"1024\" data-file-height=\"1376\" data-file-type=\"drawing\" height=\"20\" width=\"15\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/23px-Commons-logo.svg.png 1.5x\">\n\t\t\t</span>\n\t\t\t</span>\n\t\t\t<a rel=\"mw:WikiLink\" href=\"./Wikimedia_Commons\" title=\"Wikimedia Commons\">Wikimedia Commons</a> alberga una categoría multimedia sobre<b><a rel=\"mw:WikiLink/Interwiki\" href=\"https://commons.wikimedia.org/wiki/Category:La%20Mano%20Negra\" title=\"commons:Category:La Mano Negra\">La Mano Negra</a></b>.\n\t\t\t<link rel=\"mw:PageProp/Category\" href=\"./Categoría:Historia_de_la_provincia_de_Cádiz\">\n\t\t\t<link rel=\"mw:PageProp/Category\" href=\"./Categoría:Derecho_de_Andalucía\">\n\t\t</li>\n\t</ul>\n</body>\n</html>\n`;\n\nconst sectionWithFigureInlineTemplateResult = `\n<html>\n<body>\n\t<section rel=\"cx:Section\">\n\t<h2 id=\"Enlaces_externos\">Enlaces externos</h2>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t\t<ul id=\"mwASA\">\n\t\t\t<li id=\"mwASE\">\n\t\t\t\t<a class=\"external text\" href=\"http://www.portaloaca.com/historia/otroshistoria/94-la-leyenda-de-la-mano-negra.html\" id=\"mwASI\" rel=\"mw:ExtLink\">La leyenda de La Mano Negra</a>\n\t\t\t</li>\n\t\t</ul>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t\t<span about=\"#mwt92\" data-mw=\"{"parts":[{"template":{"target":{"wt":"commonscat","href":"./Plantilla:Commonscat"},"params":{"1":{"wt":"La Mano Negra"}},"i":0}},"\\\\n\\\\n[[Categoría:Historia de la provincia de Cádiz]]\\\\n[[Categoría:Derecho de Andalucía]]\\\\n[[Categoría:Casos judiciales de España]]\\\\n[[Categoría:Sociedades secretas]]\\\\n[[Categoría:Reinado de Alfonso XII]]\\\\n[[Categoría:Casos judiciales anarquistas]]\\\\n[[Categoría:Teorías conspirativas]]\\\\n[[Categoría:Historia del anarquismo]]\\\\n[[Categoría:Anarquismo en España]]\\\\n[[Categoría:España en 1882]]\\\\n[[Categoría:España en 1883]]\\\\n[[Categoría:España en 1884]]\\\\n[[Categoría:Política en 1882]]\\\\n[[Categoría:Política en 1883]]\\\\n[[Categoría:Política en 1884]]\\\\n[[Categoría:Atentados anarquistas]]"]}\" id=\"mwASk\" typeof=\"mw:Transclusion\"></span>\n\t\t<ul about=\"#mwt92\">\n\t\t\t<li>\n\t\t\t\t<span typeof=\"mw:Image\">\n\t\t\t\t<span>\n\t\t\t\t\t<img alt=\"\" data-file-height=\"1376\" data-file-type=\"drawing\" data-file-width=\"1024\" height=\"20\" resource=\"./Archivo:Commons-logo.svg\" src=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/15px-Commons-logo.svg.png\" srcset=\"//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/30px-Commons-logo.svg.png 2x, //upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/23px-Commons-logo.svg.png 1.5x\" width=\"15\"></img>\n\t\t\t\t</span>\n\t\t\t\t</span>\n\t\t\t\t<a href=\"./Wikimedia_Commons\" rel=\"mw:WikiLink\" title=\"Wikimedia Commons\">Wikimedia Commons</a> alberga una categoría multimedia sobre<b><a href=\"https://commons.wikimedia.org/wiki/Category:La%20Mano%20Negra\" rel=\"mw:WikiLink/Interwiki\" title=\"commons:Category:La Mano Negra\">La Mano Negra</a></b>.\n\t\t\t</li>\n\t\t</ul>\n\t</section>\n</body>\n</html>\n`;\n\nconst sectionWithIgnorableTransclusionFragment = `\n<body>\n\t<section data-mw-section-id=\"0\" id=\"mwAQ\">\n\t\t<span about=\"#mwt4\" typeof=\"mw:Transclusion\"\n\t\t\tdata-mw=\"{"parts":[{"template":{"target":{"wt":"Generations Sidebar","href":"./Template:Generations_Sidebar"},"params":{},"i":0}}]}\"\n\t\t\tid=\"mwCA\">\n\t\t</span>\n\t\t<table class=\"vertical-navbox nowraplinks plainlist\"\n\t\t\tabout=\"#mwt4\" id=\"mwCQ\">\n\t\t\t<tbody>\n\t\t\t</tbody>\n\t\t</table>\n\t</section>\n\t<section data-mw-section-id=\"1\" id=\"mwFg\">\n\t\t<h2 id=\"Terminology\">Terminology</h2>\n\t</section>\n</body>\n`;\nconst sectionWithIgnorableTransclusionFragmentResult = `\n<body>\n\t<section rel=\"cx:Section\">\n\t\t<span about=\"#mwt4\" typeof=\"mw:Transclusion\"\n\t\t\tdata-mw=\"{"parts":[{"template":{"target":{"wt":"Generations Sidebar","href":"./Template:Generations_Sidebar"},"params":{},"i":0}}]}\"\n\t\t\tid=\"mwCA\">\n\t\t</span>\n\t</section>\n\t<section rel=\"cx:Section\">\n\t\t<h2 id=\"Terminology\">Terminology</h2>\n\t</section>\n</body>\n`;\n\nconst sectionWithTemplateAndTemplateStyles = `\n<body>\n\t<section data-mw-section-id=\"0\" id=\"mwAQ\">\n\t<ul>\n\t<li>\n\t\t<link rel=\"mw-deduplicated-inline-style\" href=\"mw-data:TemplateStyles:r886058088\" about=\"#mwt79\"\n\t\ttypeof=\"mw:Extension/templatestyles mw:Transclusion\"\n\t\tdata-mw=\"{"parts":[{"template":{"target":{"wt":"ISBN","href":"./Template:ISBN"},"params":{"1":{"wt":"0-7100-9224-5"}},"i":0}}]}\"\n\t\tid=\"mwAQE\">\n\n\t\t<a rel=\"mw:WikiLink\" href=\"./International_Standard_Book_Number\"\n\t\ttitle=\"International Standard Book Number\" about=\"#mwt79\">ISBN</a>\n\n\t\t<span typeof=\"mw:Entity\"\n\t\tabout=\"#mwt79\"> </span>\n\n\t\t<a rel=\"mw:WikiLink\" href=\"./Special:BookSources/0-7100-9224-5\"\n\t\ttitle=\"Special:BookSources/0-7100-9224-5\" about=\"#mwt79\" id=\"mwAQI\">0-7100-9224-5</a>\n\n\t</li>\n\t</ul>\n\t</section>\n</body>\n`;\n\nconst sectionWithTemplateAndTemplateStylesResult = `\n<body>\n\t<section rel=\"cx:Section\">\n\t<ul>\n\t<li>\n\t\t<link rel=\"mw-deduplicated-inline-style\" href=\"mw-data:TemplateStyles:r886058088\" about=\"#mwt79\"\n\t\ttypeof=\"mw:Extension/templatestyles mw:Transclusion\"\n\t\tdata-mw=\"{"parts":[{"template":{"target":{"wt":"ISBN","href":"./Template:ISBN"},"params":{"1":{"wt":"0-7100-9224-5"}},"i":0}}]}\"\n\t\tid=\"mwAQE\">\n\t\t</link>\n\t\t<a rel=\"mw:WikiLink\" href=\"./International_Standard_Book_Number\"\n\t\ttitle=\"International Standard Book Number\" about=\"#mwt79\">ISBN</a>\n\n\t\t<span typeof=\"mw:Entity\"\n\t\tabout=\"#mwt79\"> </span>\n\n\t\t<a rel=\"mw:WikiLink\" href=\"./Special:BookSources/0-7100-9224-5\"\n\t\ttitle=\"Special:BookSources/0-7100-9224-5\" about=\"#mwt79\" id=\"mwAQI\">0-7100-9224-5</a>\n\n\t</li>\n\t</ul>\n\t</section>\n</body>\n`;\n\nconst tests = [\n\t{\n\t\tdesc: 'section has common pattern of elements',\n\t\tsource: sourceHTML,\n\t\tresult: expectedSectionWrappedHTML,\n\t\tcategories: 1\n\t},\n\t{\n\t\tdesc: 'section has categories to be extracted',\n\t\tsource: sectionWithCategories,\n\t\tresult: sectionWithCategoriesExpectedHtml,\n\t\tcategories: 2\n\t},\n\t{\n\t\tdesc: 'content has nested sections and tricky transclusion context',\n\t\tsource: nestedSectionsWithTransclusion,\n\t\tresult: nestedSectionsWithTransclusionExpected,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'content has blank template and then an unrelated table',\n\t\tsource: sectionWithBlankTemplate,\n\t\tresult: sectionWithBlankTemplateExpected,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'content is complete page content with html, head tags and body having two templates with fragments',\n\t\tsource: wholeBodySource,\n\t\tresult: wholeBodyResult,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'Content has self closing meta tag',\n\t\tsource: sectionWithMeta,\n\t\tresult: sectionWithMetaResult,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'Content has template fragments and one fragment is a section candidate. Section has categories too',\n\t\tsource: sectionWithFigureInlineTemplate,\n\t\tresult: sectionWithFigureInlineTemplateResult,\n\t\tcategories: 2\n\t},\n\t{\n\t\tdesc: 'Content has transclusion and one of its fragment get removed since it is ignorable.',\n\t\tsource: sectionWithIgnorableTransclusionFragment,\n\t\tresult: sectionWithIgnorableTransclusionFragmentResult,\n\t\tcategories: 0\n\t},\n\t{\n\t\tdesc: 'Content has transclusion and same element is removable templatestyle. So do not remove',\n\t\tsource: sectionWithTemplateAndTemplateStyles,\n\t\tresult: sectionWithTemplateAndTemplateStylesResult,\n\t\tcategories: 0\n\t}\n];\n\ndescribe( 'Section wrap tests', () => {\n\tforEach( tests, ( test ) => {\n\t\tconst parsedDoc = getParsedDoc( test.source );\n\t\tconst wrappedSectionDoc = parsedDoc.wrapSections();\n\t\tconst result = normalize( wrappedSectionDoc.getHtml() );\n\t\tconst expectedResultData = normalize( test.result );\n\t\tit( 'should parse correctly when ' + test.desc, () => {\n\t\t\tdeepEqual( result, expectedResultData );\n\t\t} );\n\t\tit( 'should extract correct number of categories when ' + test.desc, () => {\n\t\t\tdeepEqual( parsedDoc.categories.length, test.categories );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/TitlePairRequest.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-loop-func","severity":2,"message":"Function declared in a loop contains unsafe references to variable(s) 'api'.","line":30,"column":68,"nodeType":"ArrowFunctionExpression","messageId":"unsafeRefs","endLine":37,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/TitlePairTests.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/mw/TitlePairTests.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/section-extractor.test.js","messages":[],"suppressedMessages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":15,"column":44,"nodeType":"CallExpression","endLine":15,"endColumn":121,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/segmentation/CXSegmenter.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":28,"column":19,"nodeType":"CallExpression","endLine":28,"endColumn":75},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":34,"column":3,"nodeType":"CallExpression","endLine":34,"endColumn":59}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { describe, it } from 'node:test';\nimport { readFileSync } from 'fs';\nimport { deepEqual } from '../utils/assert.js';\nimport {\n\tMwContextualizer,\n\tNormalizer,\n\tParser\n} from '../../lib/lineardoc/index.js';\nimport Segmenter from '../../lib/segmentation/CXSegmenter.js';\nimport allTests from './SegmentationTests.json' with { type: 'json' };\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\nfunction normalize( html ) {\n\tconst normalizer = new Normalizer();\n\tnormalizer.init();\n\tnormalizer.write( html.replace( /[\\t\\r\\n]+/gm, '' ) );\n\treturn normalizer.getHtml();\n}\n\nfunction getParsedDoc( content ) {\n\tconst parser = new Parser( new MwContextualizer() );\n\tparser.init();\n\tparser.write( content );\n\treturn parser.builder.doc;\n}\n\nfunction runTest( test, lang ) {\n\tconst testData = readFileSync( dirname + '/data/' + test.source, 'utf8' );\n\tconst parsedDoc = getParsedDoc( testData );\n\tconst segmenter = new Segmenter();\n\tconst segmentedLinearDoc = segmenter.segment( parsedDoc, lang );\n\tconst result = normalize( segmentedLinearDoc.getHtml() );\n\tconst expectedResultData = normalize(\n\t\treadFileSync( dirname + '/data/' + test.result, 'utf8' )\n\t);\n\tit( 'should not have any errors when: ' + test.desc, () => {\n\t\tdeepEqual( result, expectedResultData, test.source + ': ' + test.desc || '' );\n\t} );\n}\n\nfor ( const lang in allTests ) {\n\tdescribe( 'Segmentation tests for ' + lang, () => {\n\t\tconst tests = allTests[ lang ];\n\t\tconst len = tests.length;\n\t\tfor ( let i = 0; i < len; i++ ) {\n\t\t\tif ( tests[ i ].skip ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trunTest( tests[ i ], lang );\n\t\t}\n\t} );\n}\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/segmentation/SegmentationTests.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/suggestions/SectionSuggestion.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/testutils.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found writeFileSync from package \"fs\" with non literal argument at index 0","line":22,"column":5,"nodeType":"CallExpression","endLine":22,"endColumn":65}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { existsSync, writeFileSync } from 'fs';\n\nclass TestUtils {\n\tconstructor( api ) {\n\t\tthis.api = api;\n\t}\n\n\tsetup( mocks ) {\n\t\tthis.api.clearCaches();\n\t\tthis.api.setRequestCache( new Map() );\n\t\tif ( existsSync( 'DUMPREQUESTS' ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.api.loadCachedRequests( mocks );\n\t\tthis.api.enableOfflineMode();\n\t}\n\n\tdump( filename ) {\n\t\tif ( existsSync( 'DUMPREQUESTS' ) ) {\n\t\t\tthis.api.dumpCachedRequests().then( ( result ) => {\n\t\t\t\twriteFileSync( filename, JSON.stringify( result, null, 4 ) );\n\t\t\t\tthis.api.clearCaches();\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.api.clearCaches();\n\t\t}\n\t}\n}\n\nexport default TestUtils;\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWLink.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWLink.test.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWLink.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWReference.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWReference.test.js","messages":[{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":38,"column":21,"nodeType":"CallExpression","endLine":38,"endColumn":77},{"ruleId":"security/detect-non-literal-fs-filename","severity":1,"message":"Found readFileSync from package \"fs\" with non literal argument at index 0","line":55,"column":27,"nodeType":"CallExpression","endLine":58,"endColumn":6}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import { after, before, describe, it } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { readFileSync } from 'fs';\nimport { each } from 'async';\nimport { JSDOM } from 'jsdom';\nimport Adapter from '../../lib/Adapter.js';\nimport MWApiRequestManager from '../../lib/mw/MWApiRequestManager.js';\nimport TestClient from '../../lib/mt/TestClient.js';\nimport TestUtils from '../testutils.js';\nimport { deepEqual } from '../utils/assert.js';\nimport { getConfig } from '../../lib/util.js';\nimport { initApp } from '../../app.js';\n\nimport mocks from './MWReference.mocks.json' with { type: 'json' };\nimport tests from './MWReference.test.json' with { type: 'json' };\n\nconst dirname = new URL( '.', import.meta.url ).pathname;\ndescribe( 'Reference adaptation', () => {\n\tlet app, api, mocker;\n\n\tbefore( async () => {\n\t\tapp = await initApp( getConfig() );\n\t\tapi = new MWApiRequestManager( app );\n\t\tmocker = new TestUtils( api );\n\t\tmocker.setup( mocks );\n\t} );\n\n\tafter( () => {\n\t\tmocker.dump( dirname + '/MWReference.mocks.json' );\n\t} );\n\n\teach( tests, ( test, done ) => {\n\t\tit( test.desc, () => {\n\t\t\tapp.mtClient = new TestClient( app );\n\t\t\tapp.reduce = true;\n\t\t\tconst adapter = new Adapter( test.from, test.to, api, app );\n\t\t\tif ( typeof test.source === 'string' ) {\n\t\t\t\tconst content = readFileSync( dirname + '/data/' + test.source, 'utf8' );\n\t\t\t\tconst sourceDom = new JSDOM( content );\n\t\t\t\tconst sourceDomAttributes = sourceDom.window.document.querySelector(\n\t\t\t\t\t'[typeof=\"mw:Extension/ref\"]'\n\t\t\t\t).attributes;\n\t\t\t\ttest.source = {\n\t\t\t\t\tname: 'span',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\tid: sourceDomAttributes.getNamedItem( 'id' ).value,\n\t\t\t\t\t\t'data-mw': sourceDomAttributes.getNamedItem( 'data-mw' ).value,\n\t\t\t\t\t\trel: 'dc:references',\n\t\t\t\t\t\ttypeof: 'mw:Extension/ref',\n\t\t\t\t\t\tclass: 'mw-ref'\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tif ( typeof test.result === 'string' ) {\n\t\t\t\tconst resultContent = readFileSync(\n\t\t\t\t\tdirname + '/data/' + test.result,\n\t\t\t\t\t'utf8'\n\t\t\t\t);\n\t\t\t\tconst resultDom = new JSDOM( resultContent );\n\t\t\t\tconst resultsDomAttributes = resultDom.window.document.querySelector(\n\t\t\t\t\t'[typeof=\"mw:Extension/ref\"]'\n\t\t\t\t).attributes;\n\t\t\t\ttest.result = {\n\t\t\t\t\tname: 'span',\n\t\t\t\t\tattributes: {\n\t\t\t\t\t\t'data-cx': JSON.parse(\n\t\t\t\t\t\t\tresultsDomAttributes.getNamedItem( 'data-cx' ).value\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\t\t\tassert.ok( adapter, 'There is an adapter for references' );\n\t\t\tconst translationunit = adapter.getAdapter( test.source );\n\t\t\tassert.ok( translationunit, 'There is an translationunit for content' );\n\n\t\t\treturn translationunit.adapt( test.source ).then( ( adaptedNode ) => {\n\t\t\t\tconst actualDataCX = JSON.parse( adaptedNode.attributes[ 'data-cx' ] );\n\t\t\t\tconst expectedDataCX = test.result.attributes[ 'data-cx' ];\n\t\t\t\tdeepEqual( actualDataCX, expectedDataCX, 'data-cx matches' );\n\n\t\t\t\tif ( test.result.attributes[ 'data-mw' ] ) {\n\t\t\t\t\tconst expectedDataMW = test.result.attributes[ 'data-mw' ];\n\t\t\t\t\tconst actualDataMW = JSON.parse( adaptedNode.attributes[ 'data-mw' ] );\n\t\t\t\t\tdeepEqual( actualDataMW, expectedDataMW, 'data-mw matches' );\n\t\t\t\t}\n\n\t\t\t\tdone( null );\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWReference.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWTemplate.mocks.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWTemplate.test.js","messages":[],"suppressedMessages":[{"ruleId":"no-loop-func","severity":2,"message":"Function declared in a loop contains unsafe references to variable(s) 'app', 'app', 'api', 'app'.","line":30,"column":32,"nodeType":"ArrowFunctionExpression","messageId":"unsafeRefs","endLine":52,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/test/translationunits/MWTemplate.test.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]}]},{"filePath":"/src/repo/test/utils/assert.js","messages":[{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":8,"column":40,"nodeType":"NewExpression","endLine":8,"endColumn":62}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"import assert from 'node:assert/strict';\nconst { JSDOM } = await import( 'jsdom' );\n\nfunction deepEqual( result, expected, message ) {\n\n\ttry {\n\t\tif ( typeof expected === 'string' ) {\n\t\t\tassert.ok( result === expected || ( new RegExp( expected ).test( result ) ) );\n\t\t} else {\n\t\t\tassert.deepEqual( result, expected, message );\n\t\t}\n\t} catch ( e ) {\n\t\tconsole.log( 'Expected:\\n' + JSON.stringify( expected, null, 2 ) );\n\t\tconsole.log( 'Result:\\n' + JSON.stringify( result, null, 2 ) );\n\t\tthrow e;\n\t}\n\n}\n\n/**\n * Asserts whether the return status was as expected\n *\n * @param {Object} res\n * @param {string} expected\n */\nfunction status( res, expected ) {\n\n\tassert.deepEqual( res.status, expected,\n\t\t'Expected status to be ' + expected + ', but was ' + res.status );\n\n}\n\n/**\n * Asserts whether content type was as expected\n *\n * @param {Object} res\n * @param {string} expected\n */\nfunction contentType( res, expected ) {\n\n\tconst actual = res.headers[ 'content-type' ];\n\tassert.deepEqual( actual, expected,\n\t\t'Expected content-type to be ' + expected + ', but was ' + actual );\n\n}\n\nfunction notDeepEqual( result, expected, message ) {\n\n\ttry {\n\t\tassert.notDeepEqual( result, expected, message );\n\t} catch ( e ) {\n\t\tconsole.log( 'Not expected:\\n' + JSON.stringify( expected, null, 2 ) );\n\t\tconsole.log( 'Result:\\n' + JSON.stringify( result, null, 2 ) );\n\t\tthrow e;\n\t}\n\n}\n\nfunction fails( promise, onRejected ) {\n\n\tlet failed = false;\n\n\tfunction trackFailure( e ) {\n\t\tfailed = true;\n\t\treturn onRejected( e );\n\t}\n\n\tfunction check() {\n\t\tif ( !failed ) {\n\t\t\tthrow new Error( 'expected error was not thrown' );\n\t\t}\n\t}\n\n\treturn promise.catch( trackFailure ).then( check );\n\n}\n\nfunction compareHTML( actual, expected, message ) {\n\tconst domActual = new JSDOM( actual ).window.document.body;\n\tconst domExpected = new JSDOM( expected ).window.document.body;\n\tconst result = domActual.isEqualNode( domExpected );\n\tif ( result === false ) {\n\t\t// The DOM nodes are not equal, so do a deepEqual to output the actual/expected content\n\t\tassert.deepEqual( actual, expected, message || 'HTML content does not match' );\n\t} else {\n\t\tassert.deepEqual( result, true, message || 'HTML content does not match' );\n\t}\n}\n\nexport {\n\tdeepEqual,\n\tnotDeepEqual,\n\tfails,\n\tstatus,\n\tcontentType,\n\tcompareHTML\n};\n","usedDeprecatedRules":[{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"implicit-arrow-linebreak","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]
--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN node_modules/@babel/eslint-parser
npm WARN dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN 29 more (@eslint-community/eslint-utils, ...)
npm WARN
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'cxserver@1.2.1',
npm WARN EBADENGINE required: { node: '>=24' },
npm WARN EBADENGINE current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
--- stdout ---
added 908 packages, and audited 909 packages in 15s
208 packages are looking for funding
run `npm fund` for details
4 moderate severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
--- end ---
$ /usr/bin/npm test
--- stdout ---
> cxserver@1.2.1 test
> npm run lint && npm run unittest
> cxserver@1.2.1 lint
> eslint .
/src/repo/app.js
51:1 warning The type 'Express' is undefined jsdoc/no-undefined-types
83:34 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
89:25 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
264:9 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
265:10 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/bin/segment.js
17:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/Config.js
42:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
64:38 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
97:29 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/adaptation/TemplateParameterMapper.js
110:5 warning Mixed spaces and tabs no-mixed-spaces-and-tabs
110:7 warning Expected no linebreak before this expression implicit-arrow-linebreak
113:4 warning Mixed spaces and tabs no-mixed-spaces-and-tabs
/src/repo/lib/lineardoc/MwContextualizer.js
143:35 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
/src/repo/lib/logging.js
7:1 warning The type 'winston.Logger' is undefined jsdoc/no-undefined-types
/src/repo/lib/mw/MWPageLoader.js
19:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/suggestion/SectionSuggester.js
13:1 warning Missing JSDoc @param "dbPool" type jsdoc/require-param-type
/src/repo/lib/swagger-ui.js
26:9 warning Found readFile from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/translationunits/MWCategory.js
15:41 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/translationunits/MWFile.js
44:51 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/translationunits/MWImage.js
123:68 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/util.js
133:23 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/scripts/template-mapping.js
108:7 warning Found existsSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
114:14 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/spec.yaml
197:1 warning This line has a length of 139. Maximum allowed is 100 max-len
248:1 warning This line has a length of 139. Maximum allowed is 100 max-len
470:1 warning This line has a length of 109. Maximum allowed is 100 max-len
503:1 warning This line has a length of 216. Maximum allowed is 100 max-len
540:1 warning This line has a length of 110. Maximum allowed is 100 max-len
547:1 warning This line has a length of 216. Maximum allowed is 100 max-len
589:1 warning This line has a length of 106. Maximum allowed is 100 max-len
606:1 warning This line has a length of 134. Maximum allowed is 100 max-len
621:1 warning This line has a length of 109. Maximum allowed is 100 max-len
653:1 warning This line has a length of 106. Maximum allowed is 100 max-len
670:1 warning This line has a length of 134. Maximum allowed is 100 max-len
/src/repo/test/adaptation/SectionTest.js
31:20 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/features/app/spec.js
21:16 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
168:10 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
/src/repo/test/lineardoc/LinearDoc.test.js
28:22 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
32:24 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
36:26 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
78:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
101:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
156:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
249:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/mw/MWPageLoaderTest.js
37:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
46:5 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/mw/SectionWrap.test.js
17:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/segmentation/CXSegmenter.test.js
28:19 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
34:3 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/testutils.js
22:5 warning Found writeFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/translationunits/MWReference.test.js
38:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
55:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/utils/assert.js
8:40 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
✖ 53 problems (0 errors, 53 warnings)
> cxserver@1.2.1 unittest
> NODE_ENV=test node --test
TAP version 13
# {"@timestamp":"2026-05-01T09:42:10.580Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.636Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.638Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.668Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.711Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Oxygen\\",\\"id\\":\\"mwAA\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.749Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Atomic number\\",\\"id\\":\\"mwAB\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# Subtest: Adaptation tests
# Subtest: Link adaptation basic test
ok 1 - Link adaptation basic test
---
duration_ms: 389.903906
...
# Subtest: Link adaptation - Full paragraph and relative links
ok 2 - Link adaptation - Full paragraph and relative links
---
duration_ms: 61.367859
...
# Subtest: Image adaptation basic test
ok 3 - Image adaptation basic test
---
duration_ms: 135.465088
...
# Subtest: Image adaptation - Inline image with span tag
ok 4 - Image adaptation - Inline image with span tag
---
duration_ms: 33.700354
...
# Subtest: Image adaptation - Inline image with span tag
ok 5 - Image adaptation - Inline image with span tag
---
duration_ms: 14.691099
...
# Subtest: Image adaptation - Source and target language directions differs
ok 6 - Image adaptation - Source and target language directions differs
---
duration_ms: 92.79191
...
# Subtest: Image adaptation - Image is not in commons
ok 7 - Image adaptation - Image is not in commons
---
duration_ms: 32.242688
...
# Subtest: Gallery adaptation
ok 8 - Gallery adaptation
---
duration_ms: 32.699999
...
# Subtest: Reference adaptation test without a reference template
ok 9 - Reference adaptation test without a reference template
---
duration_ms: 24.063211
...
# Subtest: Reference adaptation test where the content is reference and template at same time
ok 10 - Reference adaptation test where the content is reference and template at same time
---
duration_ms: 40.199552
...
# Subtest: Reference adaptation test where source and target has no template data. Must use template mapping database
ok 11 - Reference adaptation test where source and target has no template data. Must use template mapping database
---
duration_ms: 101.6028
...
# Subtest: Style tags holding template definition should not be ignored and used for template adaptation
ok 12 - Style tags holding template definition should not be ignored and used for template adaptation
---
duration_ms: 32.055284
...
# Subtest: Audio adaptation
ok 13 - Audio adaptation
---
duration_ms: 32.652635
...
# Subtest: Audio adaptation when audio is not in Commons
ok 14 - Audio adaptation when audio is not in Commons
---
duration_ms: 12.204403
...
# Subtest: Video adaptation
ok 15 - Video adaptation
---
duration_ms: 12.275376
...
# Subtest: Inline Video adaptation
ok 16 - Inline Video adaptation
---
duration_ms: 22.243996
...
1..16
ok 1 - Adaptation tests
---
duration_ms: 1212.351478
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:10.540Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.612Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.613Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:10.629Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Adaptation tests
# Subtest: should adapt section when: section has lot of templates, but all are fragments of main template
ok 1 - should adapt section when: section has lot of templates, but all are fragments of main template
---
duration_ms: 580.548712
...
1..1
ok 2 - Adaptation tests
---
duration_ms: 685.035547
type: 'suite'
...
# Subtest: Template parameter mapping test
# Subtest: should not have any errors while mapping params
ok 1 - should not have any errors while mapping params
---
duration_ms: 8.991018
...
1..1
ok 3 - Template parameter mapping test
---
duration_ms: 10.733645
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:11.833Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:11.885Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:11.898Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:11.917Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: express app
# Subtest: should get robots.txt
ok 1 - should get robots.txt
---
duration_ms: 28.925545
...
# Subtest: should set CORS headers
ok 2 - should set CORS headers
---
duration_ms: 6.466792
...
# Subtest: should set CSP headers
ok 3 - should set CSP headers
---
duration_ms: 4.55869
...
1..3
ok 4 - express app
---
duration_ms: 140.190973
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:13.465Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.501Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.503Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.528Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Swagger spec
# Subtest: get the spec
ok 1 - get the spec
---
duration_ms: 46.54607
...
# Subtest: should expose valid OpenAPI spec
ok 2 - should expose valid OpenAPI spec
---
duration_ms: 43.218021
...
# Subtest: spec validation
ok 3 - spec validation
---
duration_ms: 1.458283
...
# Subtest: routes
# Subtest: robots.txt check
ok 1 - robots.txt check
---
duration_ms: 14.807715
...
# Subtest: root with no query params
ok 2 - root with no query params
---
duration_ms: 5.099606
...
# Subtest: spec from root
ok 3 - spec from root
---
duration_ms: 10.956847
...
# Subtest: doc from root
ok 4 - doc from root
---
duration_ms: 3.741228
...
# Subtest: root with wrong query param
ok 5 - root with wrong query param
---
duration_ms: 3.482492
...
# {"@timestamp":"2026-05-01T09:42:13.670Z","ecs.version":"8.10.0","http":{"request":{"id":"14384a56-2130-4110-b2e3-cd4a2c4ce89e","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:13.961Z","ecs.version":"8.10.0","http":{"request":{"id":"14384a56-2130-4110-b2e3-cd4a2c4ce89e","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Fetch enwiki protected page
ok 6 - Fetch enwiki protected page
---
duration_ms: 310.369219
...
# {"@timestamp":"2026-05-01T09:42:13.977Z","ecs.version":"8.10.0","http":{"request":{"id":"c7813e23-f364-4235-ab21-b1fd79b91b3d","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:14.157Z","ecs.version":"8.10.0","http":{"request":{"id":"c7813e23-f364-4235-ab21-b1fd79b91b3d","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Fetch protected page with multi-word title
ok 7 - Fetch protected page with multi-word title
---
duration_ms: 191.510218
...
# {"@timestamp":"2026-05-01T09:42:14.177Z","ecs.version":"8.10.0","http":{"request":{"id":"d8efe5eb-abaf-4e63-8fe9-bbd3ddc5a7b9","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:42:14.277Z","ecs.version":"8.10.0","http":{"request":{"id":"d8efe5eb-abaf-4e63-8fe9-bbd3ddc5a7b9","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# Subtest: Fetch enwiki protected page with revision
ok 8 - Fetch enwiki protected page with revision
---
duration_ms: 121.28374
...
# Subtest: Machine translate an HTML fragment using TestClient.
ok 9 - Machine translate an HTML fragment using TestClient.
---
duration_ms: 241.596122
...
# Subtest: Machine translate an HTML fragment using TestClient.
ok 10 - Machine translate an HTML fragment using TestClient.
---
duration_ms: 37.971173
...
# Subtest: Get the tools between two language pairs
ok 11 - Get the tools between two language pairs
---
duration_ms: 3.640462
...
# Subtest: Get all the language pairs
ok 12 - Get all the language pairs
---
duration_ms: 4.761193
...
# Subtest: Get the MT tool between two language pairs
ok 13 - Get the MT tool between two language pairs
---
duration_ms: 21.59651
...
# Subtest: Get the MT tool between two language pairs
ok 14 - Get the MT tool between two language pairs
---
duration_ms: 3.882056
...
# {"@timestamp":"2026-05-01T09:42:14.603Z","ecs.version":"8.10.0","http":{"request":{"id":"58993971-bbc4-40fa-899c-5432cf671b74","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:14.735Z","ecs.version":"8.10.0","http":{"request":{"id":"58993971-bbc4-40fa-899c-5432cf671b74","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Translate enwiki protected page
ok 15 - Translate enwiki protected page
---
duration_ms: 151.129029
...
# {"@timestamp":"2026-05-01T09:42:14.754Z","ecs.version":"8.10.0","http":{"request":{"id":"73e6829e-6cd5-4c3f-b46a-4270348ed181","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:42:14.899Z","ecs.version":"8.10.0","http":{"request":{"id":"73e6829e-6cd5-4c3f-b46a-4270348ed181","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Translate enwiki protected page with multi-word title
ok 16 - Translate enwiki protected page with multi-word title
---
duration_ms: 159.596231
...
# {"@timestamp":"2026-05-01T09:42:14.914Z","ecs.version":"8.10.0","http":{"request":{"id":"f72a5c2c-b007-4121-a944-deb3348b41b0","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:42:15.038Z","ecs.version":"8.10.0","http":{"request":{"id":"f72a5c2c-b007-4121-a944-deb3348b41b0","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# Subtest: Translate enwiki protected page with revision
ok 17 - Translate enwiki protected page with revision
---
duration_ms: 137.33826
...
# Subtest: Machine translate an HTML fragment without provider, and an invalid language pair
ok 18 - Machine translate an HTML fragment without provider, and an invalid language pair
---
duration_ms: 5.804622
...
# Subtest: Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
ok 19 - Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
---
duration_ms: 216.04186
...
# Subtest: Return the target language link for the given source title and language pairs
ok 20 - Return the target language link for the given source title and language pairs
---
duration_ms: 150.334219
...
# Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
ok 21 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
---
duration_ms: 27.317275
...
# Subtest: Return the target language link for the given source title and language pairs
ok 22 - Return the target language link for the given source title and language pairs
---
duration_ms: 3.874338
...
# Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
ok 23 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
---
duration_ms: 3.492988
...
# {"@timestamp":"2026-05-01T09:42:15.469Z","ecs.version":"8.10.0","http":{"request":{"id":"3b0d2efe-603e-48df-87bb-cddededd848f","method":"GET"}},"log.level":"debug","message":"Attempting Paneer in en","service":"cxserver-dev","url":{"path":"/v2/suggest/source/Paneer/ca?sourcelanguages=en"}}
# Subtest: Suggest a source title to use for translation
ok 24 - Suggest a source title to use for translation
---
duration_ms: 85.483061
...
# Subtest: Suggest target section titles for given source sections
ok 25 - Suggest target section titles for given source sections
---
duration_ms: 45.043509
...
# Subtest: Suggest source sections to translate
ok 26 - Suggest source sections to translate
---
duration_ms: 143.332354
...
# Subtest: Suggest source sections to translate for multiple titles
ok 27 - Suggest source sections to translate for multiple titles
---
duration_ms: 269.235192
...
# Subtest: retrieve service info
ok 28 - retrieve service info
---
duration_ms: 4.244553
...
# Subtest: retrieve service name
ok 29 - retrieve service name
---
duration_ms: 3.035343
...
# Subtest: retrieve service version
ok 30 - retrieve service version
---
duration_ms: 2.438756
...
# Subtest: redirect to the home page
ok 31 - redirect to the home page
---
duration_ms: 2.326207
...
1..31
ok 4 - routes
---
duration_ms: 2399.841405
type: 'suite'
...
1..4
ok 5 - Swagger spec
---
duration_ms: 2587.66735
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:13.856Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.899Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.914Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:13.931Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: service information
# Subtest: should get the service name
ok 1 - should get the service name
---
duration_ms: 30.229081
...
# Subtest: should get the service version
ok 2 - should get the service version
---
duration_ms: 5.764241
...
# Subtest: should redirect to the service home page
ok 3 - should redirect to the service home page
---
duration_ms: 5.762646
...
# Subtest: should get the service info
ok 4 - should get the service info
---
duration_ms: 3.825606
...
1..4
ok 6 - service information
---
duration_ms: 135.869351
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:14.037Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.093Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.094Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.124Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:14.149Z","ecs.version":"8.10.0","http":{"request":{"id":"e45259f5-397e-41f8-a4fb-1e8c66d324ca","method":"GET"}},"log.level":"debug","message":"Getting page en:Oxygen","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# {"@timestamp":"2026-05-01T09:42:14.921Z","ecs.version":"8.10.0","http":{"request":{"id":"e45259f5-397e-41f8-a4fb-1e8c66d324ca","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# Subtest: v1 api - page gets
# Subtest: should get the whole page body
ok 1 - should get the whole page body
---
duration_ms: 836.999651
...
# Subtest: should throw a 404 for a non-existent page
ok 2 - should throw a 404 for a non-existent page
---
duration_ms: 7.502937
...
1..2
ok 7 - v1 api - page gets
---
duration_ms: 946.005225
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:15.983Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.084Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.099Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.122Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:16.159Z","ecs.version":"8.10.0","http":{"request":{"id":"4421255a-fe34-4ff6-8cf4-8099265b918d","method":"GET"}},"log.level":"debug","message":"Getting page en:Pickling for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# {"@timestamp":"2026-05-01T09:42:16.744Z","ecs.version":"8.10.0","http":{"request":{"id":"4421255a-fe34-4ff6-8cf4-8099265b918d","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# Subtest: v2 api - page gets
# Subtest: should get the whole page body
ok 1 - should get the whole page body
---
duration_ms: 630.326456
...
# {"@timestamp":"2026-05-01T09:42:16.769Z","ecs.version":"8.10.0","http":{"request":{"id":"33217623-f10a-462f-8397-7b35aeb1f21e","method":"GET"}},"log.level":"debug","message":"Getting page en:Wikipedia_content_translation_system for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Wikipedia_content_translation_system"}}
# Subtest: should throw a 404 for a non-existent page
ok 2 - should throw a 404 for a non-existent page
---
duration_ms: 55.861783
...
1..2
ok 8 - v2 api - page gets
---
duration_ms: 852.352593
type: 'suite'
...
# Subtest: LinearDoc
# Subtest: should be possible to linearise all kind of HTML inputs
ok 1 - should be possible to linearise all kind of HTML inputs
---
duration_ms: 39.724259
...
# Subtest: should be possible to reconstruct the HTML from LinearDoc
ok 2 - should be possible to reconstruct the HTML from LinearDoc
---
duration_ms: 2.045054
...
# Subtest: should be possible to reduce and expand a document
ok 3 - should be possible to reduce and expand a document
---
duration_ms: 6.644689
...
# Subtest: test HTML compaction roundtrip with inline chunks
ok 4 - test HTML compaction roundtrip with inline chunks
---
duration_ms: 6.515482
...
# Subtest: test HTML expand with external attributes inserted
ok 5 - test HTML expand with external attributes inserted
---
duration_ms: 0.674868
...
# Subtest: test if the content is block level template
ok 6 - test if the content is block level template
---
duration_ms: 97.471306
...
# Subtest: test HTML compaction roundtrip with inline style content
ok 7 - test HTML compaction roundtrip with inline style content
---
duration_ms: 1.669955
...
# Subtest: test HTML compaction roundtrip with template with empty content
ok 8 - test HTML compaction roundtrip with template with empty content
---
duration_ms: 2.801907
...
# Subtest: test getRootItem for ignoring blockspaces
ok 9 - test getRootItem for ignoring blockspaces
---
duration_ms: 0.812025
...
# Subtest: test getRootItem for not ignoring non-whitespace content in textblock
ok 10 - test getRootItem for not ignoring non-whitespace content in textblock
---
duration_ms: 0.54348
...
# Subtest: test getRootItem for ignoring whitespace content in textblock
ok 11 - test getRootItem for ignoring whitespace content in textblock
---
duration_ms: 0.417392
...
1..11
ok 9 - LinearDoc
---
duration_ms: 161.852263
type: 'suite'
...
# Subtest: Apertium machine translation
# Subtest: Test: All caps words
ok 1 - Test: All caps words
---
duration_ms: 205.688775
...
# Subtest: Test: Title caps one-to-many
ok 2 - Test: Title caps one-to-many
---
duration_ms: 25.393848
...
# Subtest: Test: Reordering with nested tags
ok 3 - Test: Reordering with nested tags
---
duration_ms: 32.487539
...
# Subtest: Test: Many-to-one with nested tags
ok 4 - Test: Many-to-one with nested tags
---
duration_ms: 45.488092
...
# Subtest: Test: Reordering at either ends of a tag
ok 5 - Test: Reordering at either ends of a tag
---
duration_ms: 33.016349
...
# Subtest: Test: Identical tags separated by whitespace
ok 6 - Test: Identical tags separated by whitespace
---
duration_ms: 33.17927
...
# Subtest: Test: Non-identical links separated by whitespace
ok 7 - Test: Non-identical links separated by whitespace
---
duration_ms: 20.917903
...
# Subtest: Test: Find longest match among multiple matches
ok 8 - Test: Find longest match among multiple matches
---
duration_ms: 39.791454
...
# Subtest: Test: Do not translate content inside the style tags
ok 9 - Test: Do not translate content inside the style tags
---
duration_ms: 58.285397
...
1..9
ok 10 - Apertium machine translation
---
duration_ms: 496.811472
type: 'suite'
...
# Subtest: Elia machine translation
# Subtest: Should fail because of wrong key
ok 1 - Should fail because of wrong key
---
duration_ms: 17.929724
...
1..1
ok 11 - Elia machine translation
---
duration_ms: 19.500111
type: 'suite'
...
# Subtest: Google machine translation
# Subtest: Should fail because of wrong key
ok 1 - Should fail because of wrong key
---
duration_ms: 11.269713
...
1..1
ok 12 - Google machine translation
---
duration_ms: 12.922493
type: 'suite'
...
# Subtest: LingoCloud machine translation
# Subtest: Should fail because of wrong key
ok 1 - Should fail because of wrong key
---
duration_ms: 6.971333
...
1..1
ok 13 - LingoCloud machine translation
---
duration_ms: 8.546665
type: 'suite'
...
# Subtest: Machine translation with wrapped html result
# Subtest: Should throw error
ok 1 - Should throw error
---
duration_ms: 12.111979
...
1..1
ok 14 - Machine translation with wrapped html result
---
duration_ms: 13.702698
type: 'suite'
...
# Subtest: Machine translation result with extra spaces
# Subtest: Should be cleaned up
ok 1 - Should be cleaned up
---
duration_ms: 166.635472
...
1..1
ok 15 - Machine translation result with extra spaces
---
duration_ms: 166.926648
type: 'suite'
...
# Subtest: Subsequence match finding
# Subtest: Should return correct range mapping
ok 1 - Should return correct range mapping
---
duration_ms: 2.203292
...
1..1
ok 16 - Subsequence match finding
---
duration_ms: 2.512157
type: 'suite'
...
# Subtest: Template translation
# Subtest: should not translate the fragement contents.
ok 1 - should not translate the fragement contents.
---
duration_ms: 166.228745
...
1..1
ok 17 - Template translation
---
duration_ms: 167.877066
type: 'suite'
...
# Subtest: Config transform tests
# Subtest: Simple cross product of languages
ok 1 - Simple cross product of languages
---
duration_ms: 2.61046
...
# Subtest: Do not translate between two variants of English
ok 2 - Do not translate between two variants of English
---
duration_ms: 0.31403
...
# Subtest: Exclude "notAsTarget" languages
ok 3 - Exclude "notAsTarget" languages
---
duration_ms: 0.189567
...
# Subtest: Handle pairs in the configuration
ok 4 - Handle pairs in the configuration
---
duration_ms: 0.427531
...
1..4
ok 18 - Config transform tests
---
duration_ms: 5.520206
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:21.078Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.115Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.117Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.132Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: MWPageLoader tests
# Subtest: Test: Add data-section-number attribute to every CX section
ok 1 - Test: Add data-section-number attribute to every CX section
---
duration_ms: 20.947733
...
1..1
ok 19 - MWPageLoader tests
---
duration_ms: 89.280138
type: 'suite'
...
# Subtest: Section wrap tests
# Subtest: should parse correctly when section has common pattern of elements
ok 1 - should parse correctly when section has common pattern of elements
---
duration_ms: 2.159355
...
# Subtest: should extract correct number of categories when section has common pattern of elements
ok 2 - should extract correct number of categories when section has common pattern of elements
---
duration_ms: 4.022886
...
# Subtest: should parse correctly when section has categories to be extracted
ok 3 - should parse correctly when section has categories to be extracted
---
duration_ms: 0.167173
...
# Subtest: should extract correct number of categories when section has categories to be extracted
ok 4 - should extract correct number of categories when section has categories to be extracted
---
duration_ms: 0.127381
...
# Subtest: should parse correctly when content has nested sections and tricky transclusion context
ok 5 - should parse correctly when content has nested sections and tricky transclusion context
---
duration_ms: 0.130254
...
# Subtest: should extract correct number of categories when content has nested sections and tricky transclusion context
ok 6 - should extract correct number of categories when content has nested sections and tricky transclusion context
---
duration_ms: 0.120237
...
# Subtest: should parse correctly when content has blank template and then an unrelated table
ok 7 - should parse correctly when content has blank template and then an unrelated table
---
duration_ms: 0.289269
...
# Subtest: should extract correct number of categories when content has blank template and then an unrelated table
ok 8 - should extract correct number of categories when content has blank template and then an unrelated table
---
duration_ms: 0.135639
...
# Subtest: should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
ok 9 - should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
---
duration_ms: 0.35575
...
# Subtest: should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
ok 10 - should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
---
duration_ms: 0.283289
...
# Subtest: should parse correctly when Content has self closing meta tag
ok 11 - should parse correctly when Content has self closing meta tag
---
duration_ms: 0.149796
...
# Subtest: should extract correct number of categories when Content has self closing meta tag
ok 12 - should extract correct number of categories when Content has self closing meta tag
---
duration_ms: 0.133826
...
# Subtest: should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
ok 13 - should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
---
duration_ms: 0.220005
...
# Subtest: should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
ok 14 - should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
---
duration_ms: 0.137099
...
# Subtest: should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
ok 15 - should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
---
duration_ms: 0.275931
...
# Subtest: should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
ok 16 - should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
---
duration_ms: 0.166398
...
# Subtest: should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
ok 17 - should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
---
duration_ms: 0.131854
...
# Subtest: should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
ok 18 - should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
---
duration_ms: 0.340702
...
1..18
ok 20 - Section wrap tests
---
duration_ms: 12.141984
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:21.204Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.278Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.279Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:21.312Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Title pair tests
# Subtest: should adapt the title when: Corresponding title exist in target language
ok 1 - should adapt the title when: Corresponding title exist in target language
---
duration_ms: 132.94168
...
# Subtest: should adapt the title when: Corresponding title exist in target language
ok 2 - should adapt the title when: Corresponding title exist in target language
---
duration_ms: 0.722752
...
# Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization
ok 3 - should adapt the title when: Corresponding title exist in target language and given title need normalization
---
duration_ms: 0.275336
...
# Subtest: should adapt the title when: Corresponding title does not exist in target language and given title need normalization
ok 4 - should adapt the title when: Corresponding title does not exist in target language and given title need normalization
---
duration_ms: 0.285915
...
# Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
ok 5 - should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
---
duration_ms: 0.231463
...
# Subtest: should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
ok 6 - should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
---
duration_ms: 0.732006
...
# Subtest: should have the queue size 50
ok 7 - should have the queue size 50
---
duration_ms: 2.468699
...
1..7
ok 21 - Title pair tests
---
duration_ms: 232.911561
...
# Subtest: Section extractor tests
# Subtest: should extract section titles correctly
ok 1 - should extract section titles correctly
---
duration_ms: 4.284761
...
# Subtest: should extract section sizes correctly
ok 2 - should extract section sizes correctly
---
duration_ms: 71.728811
...
# Subtest: should extract section titles correctly
ok 3 - should extract section titles correctly
---
duration_ms: 1.180289
...
# Subtest: should extract section sizes correctly
ok 4 - should extract section sizes correctly
---
duration_ms: 28.898565
...
1..4
ok 22 - Section extractor tests
---
duration_ms: 108.315989
type: 'suite'
...
# Subtest: Segmentation tests for am
# Subtest: should not have any errors when: Amharic segmentation - basic test
ok 1 - should not have any errors when: Amharic segmentation - basic test
---
duration_ms: 1.356922
...
1..1
ok 23 - Segmentation tests for am
---
duration_ms: 3.056171
type: 'suite'
...
# Subtest: Segmentation tests for en
# Subtest: should not have any errors when: Simple paragraph test
ok 1 - should not have any errors when: Simple paragraph test
---
duration_ms: 0.571923
...
# Subtest: should not have any errors when: Sentence ending with )
ok 2 - should not have any errors when: Sentence ending with )
---
duration_ms: 0.182652
...
# Subtest: should not have any errors when: Exclamation, punctuation test
ok 3 - should not have any errors when: Exclamation, punctuation test
---
duration_ms: 0.154136
...
# Subtest: should not have any errors when: Multiple sentences
ok 4 - should not have any errors when: Multiple sentences
---
duration_ms: 0.147755
...
# Subtest: should not have any errors when: Multiple sections - div, h1, paragraph
ok 5 - should not have any errors when: Multiple sections - div, h1, paragraph
---
duration_ms: 0.155606
...
# Subtest: should not have any errors when: Sentence starting with a link
ok 6 - should not have any errors when: Sentence starting with a link
---
duration_ms: 0.146707
...
# Subtest: should not have any errors when: Sentence starting with a link and ending with a link
ok 7 - should not have any errors when: Sentence starting with a link and ending with a link
---
duration_ms: 0.238476
...
# Subtest: should not have any errors when: Figure
ok 8 - should not have any errors when: Figure
---
duration_ms: 0.413891
...
# Subtest: should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
ok 9 - should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
---
duration_ms: 0.229352
...
# Subtest: should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
ok 10 - should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
---
duration_ms: 0.139231
...
# Subtest: should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
ok 11 - should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
---
duration_ms: 0.247899
...
# Subtest: should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
ok 12 - should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
---
duration_ms: 0.170352
...
# Subtest: should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
ok 13 - should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
---
duration_ms: 0.313095
...
# Subtest: should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
ok 14 - should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
---
duration_ms: 0.162825
...
# Subtest: should not have any errors when: Paragraph from Debian article- repeating references
ok 15 - should not have any errors when: Paragraph from Debian article- repeating references
---
duration_ms: 0.126301
...
# Subtest: should not have any errors when: References after closing bracket and period.
ok 16 - should not have any errors when: References after closing bracket and period.
---
duration_ms: 0.140668
...
# Subtest: should not have any errors when: Three sentences in a single text node
ok 17 - should not have any errors when: Three sentences in a single text node
---
duration_ms: 0.302207
...
# Subtest: should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
ok 18 - should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
---
duration_ms: 0.172272
...
# Subtest: should not have any errors when: Sentences ending with abbreviations
ok 19 - should not have any errors when: Sentences ending with abbreviations
---
duration_ms: 0.102049
...
# Subtest: should not have any errors when: link element inside span element
ok 20 - should not have any errors when: link element inside span element
---
duration_ms: 0.092243
...
# Subtest: should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
ok 21 - should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
---
duration_ms: 0.105992
...
# Subtest: should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
ok 22 - should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
---
duration_ms: 0.082876
...
# Subtest: should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
ok 23 - should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
---
duration_ms: 0.076536
...
# Subtest: should not have any errors when: Figure-inline inside a transclusions
ok 24 - should not have any errors when: Figure-inline inside a transclusions
---
duration_ms: 0.103401
...
# Subtest: should not have any errors when: Video tag in figure tag
ok 25 - should not have any errors when: Video tag in figure tag
---
duration_ms: 0.099199
...
# Subtest: should not have any errors when: Audio tag in figure tag
ok 26 - should not have any errors when: Audio tag in figure tag
---
duration_ms: 0.078092
...
# Subtest: should not have any errors when: Audio tag in figure-inline tag
ok 27 - should not have any errors when: Audio tag in figure-inline tag
---
duration_ms: 0.083263
...
# Subtest: should not have any errors when: Video tag in figure-inline tag
ok 28 - should not have any errors when: Video tag in figure-inline tag
---
duration_ms: 0.076698
...
# Subtest: should not have any errors when: Do not segment content inside block templates
ok 29 - should not have any errors when: Do not segment content inside block templates
---
duration_ms: 0.078233
...
# Subtest: should not have any errors when: about attribute alone does not initiate a transclusion context
ok 30 - should not have any errors when: about attribute alone does not initiate a transclusion context
---
duration_ms: 0.085035
...
# Subtest: should not have any errors when: Do not consider style tag with transclusion as block tag
ok 31 - should not have any errors when: Do not consider style tag with transclusion as block tag
---
duration_ms: 0.223064
...
# Subtest: should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
ok 32 - should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
---
duration_ms: 0.188718
...
# Subtest: should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
ok 33 - should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
---
duration_ms: 0.096988
...
1..33
ok 24 - Segmentation tests for en
---
duration_ms: 7.369053
type: 'suite'
...
# Subtest: Segmentation tests for de
# Subtest: should not have any errors when: Avoid segmenting inside a transclusion textblock
ok 1 - should not have any errors when: Avoid segmenting inside a transclusion textblock
---
duration_ms: 0.126388
...
1..1
ok 25 - Segmentation tests for de
---
duration_ms: 0.295698
type: 'suite'
...
# Subtest: Segmentation tests for hi
# Subtest: should not have any errors when: Hindi segmentation - basic test
ok 1 - should not have any errors when: Hindi segmentation - basic test
---
duration_ms: 0.139679
...
1..1
ok 26 - Segmentation tests for hi
---
duration_ms: 0.258384
type: 'suite'
...
# Subtest: Segmentation tests for hy
# Subtest: should not have any errors when: Armenian segmentation - basic test
ok 1 - should not have any errors when: Armenian segmentation - basic test
---
duration_ms: 0.122048
...
1..1
ok 27 - Segmentation tests for hy
---
duration_ms: 0.21363
type: 'suite'
...
# Subtest: Segmentation tests for ja
# Subtest: should not have any errors when: Japanese segmentation - basic test
ok 1 - should not have any errors when: Japanese segmentation - basic test
---
duration_ms: 0.090336
...
1..1
ok 28 - Segmentation tests for ja
---
duration_ms: 0.16138
type: 'suite'
...
# Subtest: Segmentation tests for zh
# Subtest: should not have any errors when: Chinese segmentation - basic test
ok 1 - should not have any errors when: Chinese segmentation - basic test
---
duration_ms: 0.096104
...
1..1
ok 29 - Segmentation tests for zh
---
duration_ms: 0.167958
type: 'suite'
...
# Subtest: Segmentation tests for pa
# Subtest: should not have any errors when: Punjabi segmentation - basic test
ok 1 - should not have any errors when: Punjabi segmentation - basic test
---
duration_ms: 2.902978
...
1..1
ok 30 - Segmentation tests for pa
---
duration_ms: 2.998725
type: 'suite'
...
# Subtest: SectionSuggester tests
# Subtest: should find present and missing sections
ok 1 - should find present and missing sections
---
duration_ms: 20.011264
...
1..1
ok 31 - SectionSuggester tests
---
duration_ms: 23.239286
type: 'suite'
...
# Subtest: /src/repo/test/testutils.js
ok 23 - /src/repo/test/testutils.js
---
duration_ms: 141.622207
...
# {"@timestamp":"2026-05-01T09:42:23.844Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:23.895Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:23.897Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:23.929Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Link Adaptation tests
# Subtest: Basic test
ok 1 - Basic test
---
duration_ms: 169.777219
...
# Subtest: Space in the title
ok 2 - Space in the title
---
duration_ms: 0.718959
...
# Subtest: Relative URL
ok 3 - Relative URL
---
duration_ms: 0.431823
...
# Subtest: Title with parenthesis
ok 4 - Title with parenthesis
---
duration_ms: 0.603363
...
# Subtest: Target title does not exist
ok 5 - Target title does not exist
---
duration_ms: 0.49259
...
# Subtest: Title with translation from Wikidata label
ok 6 - Title with translation from Wikidata label
---
duration_ms: 0.582805
...
# Subtest: ISBN Link adaptation
ok 7 - ISBN Link adaptation
---
duration_ms: 0.538681
...
1..7
ok 33 - Link Adaptation tests
---
duration_ms: 284.212403
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:24.414Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.454Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.455Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.473Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.488Z","ecs.version":"8.10.0","log.level":"debug","message":"Not-adapting a reference node without data-mw.body.html: trncttm-2","service":"cxserver-dev"}
# Subtest: Reference adaptation
# Subtest: Adapting a reference with plain text content
ok 1 - Adapting a reference with plain text content
---
duration_ms: 3.929719
...
# Subtest: Adapting a reference with plain text content, sup tag
ok 2 - Adapting a reference with plain text content, sup tag
---
duration_ms: 0.414128
...
# Subtest: Adapting a reference with html content, sup tag
ok 3 - Adapting a reference with html content, sup tag
---
duration_ms: 0.249269
...
# Subtest: Not adapting a reference with no data-mw.body
ok 4 - Not adapting a reference with no data-mw.body
---
duration_ms: 0.543718
...
# Subtest: Partially adapting a reference with named reference
ok 5 - Partially adapting a reference with named reference
---
duration_ms: 0.425102
...
# {"@timestamp":"2026-05-01T09:42:24.923Z","ecs.version":"8.10.0","log.level":"error","message":"Not-adapting a template node with non-JSON data-mw: CITEREFGazette57855","service":"cxserver-dev"}
# Subtest: Mark the reference adaptation failed when the content defined in template not adapted
ok 6 - Mark the reference adaptation failed when the content defined in template not adapted
---
duration_ms: 383.800802
...
# Subtest: Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
ok 7 - Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
---
duration_ms: 64.358615
...
# Subtest: Partial reference adaptation, when mandatory params are not transferred successfully
ok 8 - Partial reference adaptation, when mandatory params are not transferred successfully
---
duration_ms: 165.207187
...
1..8
ok 34 - Reference adaptation
---
duration_ms: 703.38567
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:42:24.638Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.681Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.682Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:42:24.707Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Template adaptation
# Subtest: Template with no equivalents
ok 1 - Template with no equivalents
---
duration_ms: 157.993252
...
# Subtest: Babel template
ok 2 - Babel template
---
duration_ms: 85.647235
...
# Subtest: Cite web template
ok 3 - Cite web template
---
duration_ms: 134.708453
...
# Subtest: Multi-part template for columns
ok 4 - Multi-part template for columns
---
duration_ms: 98.235565
...
# Subtest: Template with equivalents, but target template data missing, no params mapped
ok 5 - Template with equivalents, but target template data missing, no params mapped
---
duration_ms: 60.256199
...
# Subtest: Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
ok 6 - Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
---
duration_ms: 94.593325
...
# Subtest: Template with equivalents, all mandatory params mapped
ok 7 - Template with equivalents, all mandatory params mapped
---
duration_ms: 69.022398
...
# Subtest: Images that are generated by templates
ok 8 - Images that are generated by templates
---
duration_ms: 11.533888
...
1..8
ok 35 - Template adaptation
---
duration_ms: 793.515578
...
# Subtest: /src/repo/test/utils/assert.js
ok 27 - /src/repo/test/utils/assert.js
---
duration_ms: 1309.317484
...
1..36
# tests 192
# suites 33
# pass 192
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 17154.658598
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"istanbul-lib-processinfo": {
"name": "istanbul-lib-processinfo",
"severity": "moderate",
"isDirect": false,
"via": [
"uuid"
],
"effects": [
"nyc"
],
"range": "*",
"nodes": [
"node_modules/istanbul-lib-processinfo"
],
"fixAvailable": {
"name": "nyc",
"version": "14.1.1",
"isSemVerMajor": true
}
},
"nyc": {
"name": "nyc",
"severity": "moderate",
"isDirect": true,
"via": [
"istanbul-lib-processinfo"
],
"effects": [],
"range": ">=15.0.0-alpha.0",
"nodes": [
"node_modules/nyc"
],
"fixAvailable": {
"name": "nyc",
"version": "14.1.1",
"isSemVerMajor": true
}
},
"swagger-router": {
"name": "swagger-router",
"severity": "moderate",
"isDirect": true,
"via": [
"uuid"
],
"effects": [],
"range": ">=0.7.4",
"nodes": [
"node_modules/swagger-router"
],
"fixAvailable": {
"name": "swagger-router",
"version": "0.7.3",
"isSemVerMajor": true
}
},
"uuid": {
"name": "uuid",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1116970,
"name": "uuid",
"dependency": "uuid",
"title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
"url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
"severity": "moderate",
"cwe": [
"CWE-787",
"CWE-1285"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<14.0.0"
}
],
"effects": [
"istanbul-lib-processinfo",
"swagger-router"
],
"range": "<14.0.0",
"nodes": [
"node_modules/swagger-router/node_modules/uuid",
"node_modules/uuid"
],
"fixAvailable": {
"name": "swagger-router",
"version": "0.7.3",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 4,
"high": 0,
"critical": 0,
"total": 4
},
"dependencies": {
"prod": 268,
"dev": 595,
"optional": 52,
"peer": 2,
"peerOptional": 0,
"total": 913
}
}
}
--- end ---
Attempting to npm audit fix
$ /usr/bin/npm audit fix --dry-run --only=dev --json
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN node_modules/@babel/eslint-parser
npm WARN dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN 29 more (@eslint-community/eslint-utils, ...)
npm WARN
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'cxserver@1.2.1',
npm WARN EBADENGINE required: { node: '>=24' },
npm WARN EBADENGINE current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---
{
"added": 5,
"removed": 0,
"changed": 0,
"audited": 914,
"funding": 208,
"audit": {
"auditReportVersion": 2,
"vulnerabilities": {
"istanbul-lib-processinfo": {
"name": "istanbul-lib-processinfo",
"severity": "moderate",
"isDirect": false,
"via": [
"uuid"
],
"effects": [
"nyc"
],
"range": "*",
"nodes": [
"node_modules/istanbul-lib-processinfo"
],
"fixAvailable": {
"name": "nyc",
"version": "14.1.1",
"isSemVerMajor": true
}
},
"nyc": {
"name": "nyc",
"severity": "moderate",
"isDirect": true,
"via": [
"istanbul-lib-processinfo"
],
"effects": [],
"range": ">=15.0.0-alpha.0",
"nodes": [
"node_modules/nyc"
],
"fixAvailable": {
"name": "nyc",
"version": "14.1.1",
"isSemVerMajor": true
}
},
"swagger-router": {
"name": "swagger-router",
"severity": "moderate",
"isDirect": true,
"via": [
"uuid"
],
"effects": [],
"range": ">=0.7.4",
"nodes": [
"node_modules/swagger-router"
],
"fixAvailable": {
"name": "swagger-router",
"version": "0.7.3",
"isSemVerMajor": true
}
},
"uuid": {
"name": "uuid",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1116970,
"name": "uuid",
"dependency": "uuid",
"title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided",
"url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq",
"severity": "moderate",
"cwe": [
"CWE-787",
"CWE-1285"
],
"cvss": {
"score": 0,
"vectorString": null
},
"range": "<14.0.0"
}
],
"effects": [
"istanbul-lib-processinfo",
"swagger-router"
],
"range": "<14.0.0",
"nodes": [
"node_modules/swagger-router/node_modules/uuid",
"node_modules/uuid"
],
"fixAvailable": {
"name": "swagger-router",
"version": "0.7.3",
"isSemVerMajor": true
}
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 4,
"high": 0,
"critical": 0,
"total": 4
},
"dependencies": {
"prod": 268,
"dev": 595,
"optional": 52,
"peer": 2,
"peerOptional": 0,
"total": 913
}
}
}
}
--- end ---
{"added": 5, "removed": 0, "changed": 0, "audited": 914, "funding": 208, "audit": {"auditReportVersion": 2, "vulnerabilities": {"istanbul-lib-processinfo": {"name": "istanbul-lib-processinfo", "severity": "moderate", "isDirect": false, "via": ["uuid"], "effects": ["nyc"], "range": "*", "nodes": ["node_modules/istanbul-lib-processinfo"], "fixAvailable": {"name": "nyc", "version": "14.1.1", "isSemVerMajor": true}}, "nyc": {"name": "nyc", "severity": "moderate", "isDirect": true, "via": ["istanbul-lib-processinfo"], "effects": [], "range": ">=15.0.0-alpha.0", "nodes": ["node_modules/nyc"], "fixAvailable": {"name": "nyc", "version": "14.1.1", "isSemVerMajor": true}}, "swagger-router": {"name": "swagger-router", "severity": "moderate", "isDirect": true, "via": ["uuid"], "effects": [], "range": ">=0.7.4", "nodes": ["node_modules/swagger-router"], "fixAvailable": {"name": "swagger-router", "version": "0.7.3", "isSemVerMajor": true}}, "uuid": {"name": "uuid", "severity": "moderate", "isDirect": false, "via": [{"source": 1116970, "name": "uuid", "dependency": "uuid", "title": "uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided", "url": "https://github.com/advisories/GHSA-w5hq-g745-h8pq", "severity": "moderate", "cwe": ["CWE-787", "CWE-1285"], "cvss": {"score": 0, "vectorString": null}, "range": "<14.0.0"}], "effects": ["istanbul-lib-processinfo", "swagger-router"], "range": "<14.0.0", "nodes": ["node_modules/swagger-router/node_modules/uuid", "node_modules/uuid"], "fixAvailable": {"name": "swagger-router", "version": "0.7.3", "isSemVerMajor": true}}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 4, "high": 0, "critical": 0, "total": 4}, "dependencies": {"prod": 268, "dev": 595, "optional": 52, "peer": 2, "peerOptional": 0, "total": 913}}}}
$ /usr/bin/npm audit fix --only=dev
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN node_modules/@babel/eslint-parser
npm WARN dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN 29 more (@eslint-community/eslint-utils, ...)
npm WARN
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'cxserver@1.2.1',
npm WARN EBADENGINE required: { node: '>=24' },
npm WARN EBADENGINE current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
--- stdout ---
up to date, audited 909 packages in 3s
208 packages are looking for funding
run `npm fund` for details
# npm audit report
uuid <14.0.0
Severity: moderate
uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided - https://github.com/advisories/GHSA-w5hq-g745-h8pq
fix available via `npm audit fix --force`
Will install swagger-router@0.7.3, which is a breaking change
node_modules/swagger-router/node_modules/uuid
node_modules/uuid
istanbul-lib-processinfo *
Depends on vulnerable versions of uuid
node_modules/istanbul-lib-processinfo
nyc >=15.0.0-alpha.0
Depends on vulnerable versions of istanbul-lib-processinfo
node_modules/nyc
swagger-router >=0.7.4
Depends on vulnerable versions of uuid
node_modules/swagger-router
4 moderate severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
--- end ---
Verifying that tests still pass
$ /usr/bin/npm ci
--- stderr ---
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: eslint-plugin-wdio@9.27.1
npm WARN Found: eslint@8.57.1
npm WARN node_modules/eslint
npm WARN peer eslint@"^7.5.0 || ^8.0.0 || ^9.0.0" from @babel/eslint-parser@7.28.6
npm WARN node_modules/@babel/eslint-parser
npm WARN dev @babel/eslint-parser@"^7.25.9" from the root project
npm WARN 29 more (@eslint-community/eslint-utils, ...)
npm WARN
npm WARN Could not resolve dependency:
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN
npm WARN Conflicting peer dependency: eslint@9.39.4
npm WARN node_modules/eslint
npm WARN peer eslint@"^9.39.2" from eslint-plugin-wdio@9.27.1
npm WARN node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio
npm WARN eslint-plugin-wdio@"^9.16.2" from eslint-config-wikimedia@0.32.3
npm WARN node_modules/eslint-config-wikimedia
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE package: 'cxserver@1.2.1',
npm WARN EBADENGINE required: { node: '>=24' },
npm WARN EBADENGINE current: { node: 'v20.19.2', npm: '9.2.0' }
npm WARN EBADENGINE }
npm WARN deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm WARN deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm WARN deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
npm WARN deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.
--- stdout ---
added 908 packages, and audited 909 packages in 14s
208 packages are looking for funding
run `npm fund` for details
4 moderate severity vulnerabilities
To address all issues (including breaking changes), run:
npm audit fix --force
Run `npm audit` for details.
--- end ---
$ /usr/bin/npm test
--- stdout ---
> cxserver@1.2.1 test
> npm run lint && npm run unittest
> cxserver@1.2.1 lint
> eslint .
/src/repo/app.js
51:1 warning The type 'Express' is undefined jsdoc/no-undefined-types
83:34 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
89:25 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
264:9 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
265:10 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/bin/segment.js
17:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/Config.js
42:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
64:38 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
97:29 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/adaptation/TemplateParameterMapper.js
110:5 warning Mixed spaces and tabs no-mixed-spaces-and-tabs
110:7 warning Expected no linebreak before this expression implicit-arrow-linebreak
113:4 warning Mixed spaces and tabs no-mixed-spaces-and-tabs
/src/repo/lib/lineardoc/MwContextualizer.js
143:35 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
/src/repo/lib/logging.js
7:1 warning The type 'winston.Logger' is undefined jsdoc/no-undefined-types
/src/repo/lib/mw/MWPageLoader.js
19:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/suggestion/SectionSuggester.js
13:1 warning Missing JSDoc @param "dbPool" type jsdoc/require-param-type
/src/repo/lib/swagger-ui.js
26:9 warning Found readFile from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/lib/translationunits/MWCategory.js
15:41 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/translationunits/MWFile.js
44:51 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/translationunits/MWImage.js
123:68 warning Unsafe Regular Expression security/detect-unsafe-regex
/src/repo/lib/util.js
133:23 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/scripts/template-mapping.js
108:7 warning Found existsSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
114:14 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/spec.yaml
197:1 warning This line has a length of 139. Maximum allowed is 100 max-len
248:1 warning This line has a length of 139. Maximum allowed is 100 max-len
470:1 warning This line has a length of 109. Maximum allowed is 100 max-len
503:1 warning This line has a length of 216. Maximum allowed is 100 max-len
540:1 warning This line has a length of 110. Maximum allowed is 100 max-len
547:1 warning This line has a length of 216. Maximum allowed is 100 max-len
589:1 warning This line has a length of 106. Maximum allowed is 100 max-len
606:1 warning This line has a length of 134. Maximum allowed is 100 max-len
621:1 warning This line has a length of 109. Maximum allowed is 100 max-len
653:1 warning This line has a length of 106. Maximum allowed is 100 max-len
670:1 warning This line has a length of 134. Maximum allowed is 100 max-len
/src/repo/test/adaptation/SectionTest.js
31:20 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/features/app/spec.js
21:16 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
168:10 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
/src/repo/test/lineardoc/LinearDoc.test.js
28:22 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
32:24 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
36:26 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
78:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
101:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
156:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
249:28 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/mw/MWPageLoaderTest.js
37:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
46:5 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/mw/SectionWrap.test.js
17:33 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/segmentation/CXSegmenter.test.js
28:19 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
34:3 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/testutils.js
22:5 warning Found writeFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/translationunits/MWReference.test.js
38:21 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
55:27 warning Found readFileSync from package "fs" with non literal argument at index 0 security/detect-non-literal-fs-filename
/src/repo/test/utils/assert.js
8:40 warning Found non-literal argument to RegExp Constructor security/detect-non-literal-regexp
✖ 53 problems (0 errors, 53 warnings)
> cxserver@1.2.1 unittest
> NODE_ENV=test node --test
TAP version 13
# {"@timestamp":"2026-05-01T09:43:11.166Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.206Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.207Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.224Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.268Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Oxygen\\",\\"id\\":\\"mwAA\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.307Z","ecs.version":"8.10.0","log.level":"debug","message":"No title for the MWLink: {\\"name\\":\\"a\\",\\"attributes\\":{\\"rel\\":\\"mw:WikiLink\\",\\"href\\":\\"Atomic number\\",\\"id\\":\\"mwAB\\",\\"data-cx\\":\\"{\\\\\\"adapted\\\\\\":false}\\"},\\"isSelfClosing\\":false}","service":"cxserver-dev"}
# Subtest: Adaptation tests
# Subtest: Link adaptation basic test
ok 1 - Link adaptation basic test
---
duration_ms: 320.102282
...
# Subtest: Link adaptation - Full paragraph and relative links
ok 2 - Link adaptation - Full paragraph and relative links
---
duration_ms: 52.958164
...
# Subtest: Image adaptation basic test
ok 3 - Image adaptation basic test
---
duration_ms: 122.409692
...
# Subtest: Image adaptation - Inline image with span tag
ok 4 - Image adaptation - Inline image with span tag
---
duration_ms: 12.641026
...
# Subtest: Image adaptation - Inline image with span tag
ok 5 - Image adaptation - Inline image with span tag
---
duration_ms: 12.593045
...
# Subtest: Image adaptation - Source and target language directions differs
ok 6 - Image adaptation - Source and target language directions differs
---
duration_ms: 81.213612
...
# Subtest: Image adaptation - Image is not in commons
ok 7 - Image adaptation - Image is not in commons
---
duration_ms: 33.051248
...
# Subtest: Gallery adaptation
ok 8 - Gallery adaptation
---
duration_ms: 34.29466
...
# Subtest: Reference adaptation test without a reference template
ok 9 - Reference adaptation test without a reference template
---
duration_ms: 28.489825
...
# Subtest: Reference adaptation test where the content is reference and template at same time
ok 10 - Reference adaptation test where the content is reference and template at same time
---
duration_ms: 58.993234
...
# Subtest: Reference adaptation test where source and target has no template data. Must use template mapping database
ok 11 - Reference adaptation test where source and target has no template data. Must use template mapping database
---
duration_ms: 112.947367
...
# Subtest: Style tags holding template definition should not be ignored and used for template adaptation
ok 12 - Style tags holding template definition should not be ignored and used for template adaptation
---
duration_ms: 35.007194
...
# Subtest: Audio adaptation
ok 13 - Audio adaptation
---
duration_ms: 35.97644
...
# Subtest: Audio adaptation when audio is not in Commons
ok 14 - Audio adaptation when audio is not in Commons
---
duration_ms: 11.506014
...
# Subtest: Video adaptation
ok 15 - Video adaptation
---
duration_ms: 10.601221
...
# Subtest: Inline Video adaptation
ok 16 - Inline Video adaptation
---
duration_ms: 17.317457
...
1..16
ok 1 - Adaptation tests
---
duration_ms: 1092.083664
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:10.983Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.025Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.026Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:11.042Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Adaptation tests
# Subtest: should adapt section when: section has lot of templates, but all are fragments of main template
ok 1 - should adapt section when: section has lot of templates, but all are fragments of main template
---
duration_ms: 603.075672
...
1..1
ok 2 - Adaptation tests
---
duration_ms: 681.703978
type: 'suite'
...
# Subtest: Template parameter mapping test
# Subtest: should not have any errors while mapping params
ok 1 - should not have any errors while mapping params
---
duration_ms: 3.313312
...
1..1
ok 3 - Template parameter mapping test
---
duration_ms: 5.148343
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:12.261Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:12.295Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:12.296Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:12.322Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: express app
# Subtest: should get robots.txt
ok 1 - should get robots.txt
---
duration_ms: 27.87808
...
# Subtest: should set CORS headers
ok 2 - should set CORS headers
---
duration_ms: 5.956314
...
# Subtest: should set CSP headers
ok 3 - should set CSP headers
---
duration_ms: 4.438329
...
1..3
ok 4 - express app
---
duration_ms: 127.993835
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:13.874Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:13.914Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:13.915Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:13.938Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Swagger spec
# Subtest: get the spec
ok 1 - get the spec
---
duration_ms: 36.884949
...
# Subtest: should expose valid OpenAPI spec
ok 2 - should expose valid OpenAPI spec
---
duration_ms: 20.655719
...
# Subtest: spec validation
ok 3 - spec validation
---
duration_ms: 1.234115
...
# Subtest: routes
# Subtest: robots.txt check
ok 1 - robots.txt check
---
duration_ms: 13.643165
...
# Subtest: root with no query params
ok 2 - root with no query params
---
duration_ms: 4.524081
...
# Subtest: spec from root
ok 3 - spec from root
---
duration_ms: 10.036845
...
# Subtest: doc from root
ok 4 - doc from root
---
duration_ms: 3.896152
...
# Subtest: root with wrong query param
ok 5 - root with wrong query param
---
duration_ms: 3.616671
...
# {"@timestamp":"2026-05-01T09:43:14.044Z","ecs.version":"8.10.0","http":{"request":{"id":"3949058f-116e-4119-8f31-ff8bdacffef8","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:14.317Z","ecs.version":"8.10.0","http":{"request":{"id":"3949058f-116e-4119-8f31-ff8bdacffef8","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Fetch enwiki protected page
ok 6 - Fetch enwiki protected page
---
duration_ms: 288.435357
...
# {"@timestamp":"2026-05-01T09:43:14.327Z","ecs.version":"8.10.0","http":{"request":{"id":"9a82ffc0-0bc9-46d0-bb3f-9ec2f027c779","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:14.490Z","ecs.version":"8.10.0","http":{"request":{"id":"9a82ffc0-0bc9-46d0-bb3f-9ec2f027c779","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Fetch protected page with multi-word title
ok 7 - Fetch protected page with multi-word title
---
duration_ms: 185.910056
...
# {"@timestamp":"2026-05-01T09:43:14.520Z","ecs.version":"8.10.0","http":{"request":{"id":"3cfea52c-a1c9-4e8b-9998-32e753373bc3","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:43:14.652Z","ecs.version":"8.10.0","http":{"request":{"id":"3cfea52c-a1c9-4e8b-9998-32e753373bc3","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# Subtest: Fetch enwiki protected page with revision
ok 8 - Fetch enwiki protected page with revision
---
duration_ms: 151.025373
...
# Subtest: Machine translate an HTML fragment using TestClient.
ok 9 - Machine translate an HTML fragment using TestClient.
---
duration_ms: 200.852092
...
# Subtest: Machine translate an HTML fragment using TestClient.
ok 10 - Machine translate an HTML fragment using TestClient.
---
duration_ms: 22.113105
...
# Subtest: Get the tools between two language pairs
ok 11 - Get the tools between two language pairs
---
duration_ms: 3.542301
...
# Subtest: Get all the language pairs
ok 12 - Get all the language pairs
---
duration_ms: 23.648224
...
# Subtest: Get the MT tool between two language pairs
ok 13 - Get the MT tool between two language pairs
---
duration_ms: 21.005569
...
# Subtest: Get the MT tool between two language pairs
ok 14 - Get the MT tool between two language pairs
---
duration_ms: 3.427232
...
# {"@timestamp":"2026-05-01T09:43:14.940Z","ecs.version":"8.10.0","http":{"request":{"id":"65fa7f3f-74c4-47b1-9653-0f0ef2bef97a","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:15.166Z","ecs.version":"8.10.0","http":{"request":{"id":"65fa7f3f-74c4-47b1-9653-0f0ef2bef97a","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Translate enwiki protected page
ok 15 - Translate enwiki protected page
---
duration_ms: 238.369478
...
# {"@timestamp":"2026-05-01T09:43:15.180Z","ecs.version":"8.10.0","http":{"request":{"id":"1897a990-883f-4955-b2a5-d0388c18c66b","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# {"@timestamp":"2026-05-01T09:43:15.306Z","ecs.version":"8.10.0","http":{"request":{"id":"1897a990-883f-4955-b2a5-d0388c18c66b","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein"}}
# Subtest: Translate enwiki protected page with multi-word title
ok 16 - Translate enwiki protected page with multi-word title
---
duration_ms: 146.4453
...
# {"@timestamp":"2026-05-01T09:43:15.325Z","ecs.version":"8.10.0","http":{"request":{"id":"99f2035d-01fa-4180-b073-f4bf5ddc34e3","method":"GET"}},"log.level":"debug","message":"Getting page en:User:BSitzmann_(WMF)/MCS/Test/Frankenstein for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# {"@timestamp":"2026-05-01T09:43:15.456Z","ecs.version":"8.10.0","http":{"request":{"id":"99f2035d-01fa-4180-b073-f4bf5ddc34e3","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/User%3ABSitzmann_(WMF)%2FMCS%2FTest%2FFrankenstein/1086816359"}}
# Subtest: Translate enwiki protected page with revision
ok 17 - Translate enwiki protected page with revision
---
duration_ms: 141.314842
...
# Subtest: Machine translate an HTML fragment without provider, and an invalid language pair
ok 18 - Machine translate an HTML fragment without provider, and an invalid language pair
---
duration_ms: 9.947823
...
# Subtest: Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
ok 19 - Machine translate an HTML fragment using TestClient, adapt the links to target language wiki.
---
duration_ms: 205.375953
...
# Subtest: Return the target language link for the given source title and language pairs
ok 20 - Return the target language link for the given source title and language pairs
---
duration_ms: 170.026003
...
# Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
ok 21 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
---
duration_ms: 18.282562
...
# Subtest: Return the target language link for the given source title and language pairs
ok 22 - Return the target language link for the given source title and language pairs
---
duration_ms: 17.309207
...
# Subtest: Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
ok 23 - Return an authentication error HTTP status code, when default MT requires authentication and the given JWT is invalid
---
duration_ms: 14.696614
...
# {"@timestamp":"2026-05-01T09:43:15.905Z","ecs.version":"8.10.0","http":{"request":{"id":"74f55bf1-88a5-4b38-8761-e7cfb7c617b2","method":"GET"}},"log.level":"debug","message":"Attempting Paneer in en","service":"cxserver-dev","url":{"path":"/v2/suggest/source/Paneer/ca?sourcelanguages=en"}}
# Subtest: Suggest a source title to use for translation
ok 24 - Suggest a source title to use for translation
---
duration_ms: 72.983581
...
# Subtest: Suggest target section titles for given source sections
ok 25 - Suggest target section titles for given source sections
---
duration_ms: 45.665244
...
# Subtest: Suggest source sections to translate
ok 26 - Suggest source sections to translate
---
duration_ms: 153.894998
...
# Subtest: Suggest source sections to translate for multiple titles
ok 27 - Suggest source sections to translate for multiple titles
---
duration_ms: 237.458335
...
# Subtest: retrieve service info
ok 28 - retrieve service info
---
duration_ms: 2.658962
...
# Subtest: retrieve service name
ok 29 - retrieve service name
---
duration_ms: 2.147046
...
# Subtest: retrieve service version
ok 30 - retrieve service version
---
duration_ms: 6.354363
...
# Subtest: redirect to the home page
ok 31 - redirect to the home page
---
duration_ms: 2.258099
...
1..31
ok 4 - routes
---
duration_ms: 2424.217472
type: 'suite'
...
1..4
ok 5 - Swagger spec
---
duration_ms: 2558.257344
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:14.231Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.278Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.280Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.300Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: service information
# Subtest: should get the service name
ok 1 - should get the service name
---
duration_ms: 33.950369
...
# Subtest: should get the service version
ok 2 - should get the service version
---
duration_ms: 6.595729
...
# Subtest: should redirect to the service home page
ok 3 - should redirect to the service home page
---
duration_ms: 5.867637
...
# Subtest: should get the service info
ok 4 - should get the service info
---
duration_ms: 4.543441
...
1..4
ok 6 - service information
---
duration_ms: 134.737766
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:14.113Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.147Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.149Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.182Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:14.209Z","ecs.version":"8.10.0","http":{"request":{"id":"60a7592e-e2f5-4988-b28f-a572c6b2e7f4","method":"GET"}},"log.level":"debug","message":"Getting page en:Oxygen","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# {"@timestamp":"2026-05-01T09:43:14.871Z","ecs.version":"8.10.0","http":{"request":{"id":"60a7592e-e2f5-4988-b28f-a572c6b2e7f4","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v1/page/en/Oxygen"}}
# Subtest: v1 api - page gets
# Subtest: should get the whole page body
ok 1 - should get the whole page body
---
duration_ms: 749.606755
...
# Subtest: should throw a 404 for a non-existent page
ok 2 - should throw a 404 for a non-existent page
---
duration_ms: 10.745014
...
1..2
ok 7 - v1 api - page gets
---
duration_ms: 845.520817
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:16.206Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.257Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.259Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.286Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:16.313Z","ecs.version":"8.10.0","http":{"request":{"id":"3b3d32f5-2e77-4a54-9cb0-7b3544182cf0","method":"GET"}},"log.level":"debug","message":"Getting page en:Pickling for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# {"@timestamp":"2026-05-01T09:43:16.856Z","ecs.version":"8.10.0","http":{"request":{"id":"3b3d32f5-2e77-4a54-9cb0-7b3544182cf0","method":"GET"}},"log.level":"debug","message":"Page sent","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Pickling"}}
# Subtest: v2 api - page gets
# Subtest: should get the whole page body
ok 1 - should get the whole page body
---
duration_ms: 589.149523
...
# {"@timestamp":"2026-05-01T09:43:16.885Z","ecs.version":"8.10.0","http":{"request":{"id":"7e37fca3-b8c5-4593-baf0-df2b63856057","method":"GET"}},"log.level":"debug","message":"Getting page en:Wikipedia_content_translation_system for es","service":"cxserver-dev","url":{"path":"/v2/page/en/es/Wikipedia_content_translation_system"}}
# Subtest: should throw a 404 for a non-existent page
ok 2 - should throw a 404 for a non-existent page
---
duration_ms: 78.265758
...
1..2
ok 8 - v2 api - page gets
---
duration_ms: 762.112291
type: 'suite'
...
# Subtest: LinearDoc
# Subtest: should be possible to linearise all kind of HTML inputs
ok 1 - should be possible to linearise all kind of HTML inputs
---
duration_ms: 37.887681
...
# Subtest: should be possible to reconstruct the HTML from LinearDoc
ok 2 - should be possible to reconstruct the HTML from LinearDoc
---
duration_ms: 2.24283
...
# Subtest: should be possible to reduce and expand a document
ok 3 - should be possible to reduce and expand a document
---
duration_ms: 5.694701
...
# Subtest: test HTML compaction roundtrip with inline chunks
ok 4 - test HTML compaction roundtrip with inline chunks
---
duration_ms: 4.362816
...
# Subtest: test HTML expand with external attributes inserted
ok 5 - test HTML expand with external attributes inserted
---
duration_ms: 0.723845
...
# Subtest: test if the content is block level template
ok 6 - test if the content is block level template
---
duration_ms: 98.55765
...
# Subtest: test HTML compaction roundtrip with inline style content
ok 7 - test HTML compaction roundtrip with inline style content
---
duration_ms: 1.996364
...
# Subtest: test HTML compaction roundtrip with template with empty content
ok 8 - test HTML compaction roundtrip with template with empty content
---
duration_ms: 3.246923
...
# Subtest: test getRootItem for ignoring blockspaces
ok 9 - test getRootItem for ignoring blockspaces
---
duration_ms: 0.807435
...
# Subtest: test getRootItem for not ignoring non-whitespace content in textblock
ok 10 - test getRootItem for not ignoring non-whitespace content in textblock
---
duration_ms: 0.540174
...
# Subtest: test getRootItem for ignoring whitespace content in textblock
ok 11 - test getRootItem for ignoring whitespace content in textblock
---
duration_ms: 0.529952
...
1..11
ok 9 - LinearDoc
---
duration_ms: 159.254892
type: 'suite'
...
# Subtest: Apertium machine translation
# Subtest: Test: All caps words
ok 1 - Test: All caps words
---
duration_ms: 243.484364
...
# Subtest: Test: Title caps one-to-many
ok 2 - Test: Title caps one-to-many
---
duration_ms: 25.638732
...
# Subtest: Test: Reordering with nested tags
ok 3 - Test: Reordering with nested tags
---
duration_ms: 38.91448
...
# Subtest: Test: Many-to-one with nested tags
ok 4 - Test: Many-to-one with nested tags
---
duration_ms: 45.12346
...
# Subtest: Test: Reordering at either ends of a tag
ok 5 - Test: Reordering at either ends of a tag
---
duration_ms: 25.913137
...
# Subtest: Test: Identical tags separated by whitespace
ok 6 - Test: Identical tags separated by whitespace
---
duration_ms: 32.822137
...
# Subtest: Test: Non-identical links separated by whitespace
ok 7 - Test: Non-identical links separated by whitespace
---
duration_ms: 25.856245
...
# Subtest: Test: Find longest match among multiple matches
ok 8 - Test: Find longest match among multiple matches
---
duration_ms: 57.782219
...
# Subtest: Test: Do not translate content inside the style tags
ok 9 - Test: Do not translate content inside the style tags
---
duration_ms: 67.464117
...
1..9
ok 10 - Apertium machine translation
---
duration_ms: 565.68264
type: 'suite'
...
# Subtest: Elia machine translation
# Subtest: Should fail because of wrong key
ok 1 - Should fail because of wrong key
---
duration_ms: 6.741771
...
1..1
ok 11 - Elia machine translation
---
duration_ms: 8.429059
type: 'suite'
...
# Subtest: Google machine translation
# Subtest: Should fail because of wrong key
ok 1 - Should fail because of wrong key
---
duration_ms: 12.36026
...
1..1
ok 12 - Google machine translation
---
duration_ms: 14.250183
type: 'suite'
...
# Subtest: LingoCloud machine translation
# Subtest: Should fail because of wrong key
ok 1 - Should fail because of wrong key
---
duration_ms: 7.185099
...
1..1
ok 13 - LingoCloud machine translation
---
duration_ms: 8.942631
type: 'suite'
...
# Subtest: Machine translation with wrapped html result
# Subtest: Should throw error
ok 1 - Should throw error
---
duration_ms: 12.175438
...
1..1
ok 14 - Machine translation with wrapped html result
---
duration_ms: 19.348526
type: 'suite'
...
# Subtest: Machine translation result with extra spaces
# Subtest: Should be cleaned up
ok 1 - Should be cleaned up
---
duration_ms: 169.960817
...
1..1
ok 15 - Machine translation result with extra spaces
---
duration_ms: 170.257698
type: 'suite'
...
# Subtest: Subsequence match finding
# Subtest: Should return correct range mapping
ok 1 - Should return correct range mapping
---
duration_ms: 2.895419
...
1..1
ok 16 - Subsequence match finding
---
duration_ms: 3.164481
type: 'suite'
...
# Subtest: Template translation
# Subtest: should not translate the fragement contents.
ok 1 - should not translate the fragement contents.
---
duration_ms: 162.587617
...
1..1
ok 17 - Template translation
---
duration_ms: 164.164973
type: 'suite'
...
# Subtest: Config transform tests
# Subtest: Simple cross product of languages
ok 1 - Simple cross product of languages
---
duration_ms: 2.522064
...
# Subtest: Do not translate between two variants of English
ok 2 - Do not translate between two variants of English
---
duration_ms: 0.30369
...
# Subtest: Exclude "notAsTarget" languages
ok 3 - Exclude "notAsTarget" languages
---
duration_ms: 0.19448
...
# Subtest: Handle pairs in the configuration
ok 4 - Handle pairs in the configuration
---
duration_ms: 0.406894
...
1..4
ok 18 - Config transform tests
---
duration_ms: 5.341817
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:21.282Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.332Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.333Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.360Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: MWPageLoader tests
# Subtest: Test: Add data-section-number attribute to every CX section
ok 1 - Test: Add data-section-number attribute to every CX section
---
duration_ms: 23.174851
...
1..1
ok 19 - MWPageLoader tests
---
duration_ms: 119.164421
type: 'suite'
...
# Subtest: Section wrap tests
# Subtest: should parse correctly when section has common pattern of elements
ok 1 - should parse correctly when section has common pattern of elements
---
duration_ms: 2.178895
...
# Subtest: should extract correct number of categories when section has common pattern of elements
ok 2 - should extract correct number of categories when section has common pattern of elements
---
duration_ms: 1.282766
...
# Subtest: should parse correctly when section has categories to be extracted
ok 3 - should parse correctly when section has categories to be extracted
---
duration_ms: 0.165579
...
# Subtest: should extract correct number of categories when section has categories to be extracted
ok 4 - should extract correct number of categories when section has categories to be extracted
---
duration_ms: 0.151157
...
# Subtest: should parse correctly when content has nested sections and tricky transclusion context
ok 5 - should parse correctly when content has nested sections and tricky transclusion context
---
duration_ms: 0.144244
...
# Subtest: should extract correct number of categories when content has nested sections and tricky transclusion context
ok 6 - should extract correct number of categories when content has nested sections and tricky transclusion context
---
duration_ms: 0.144624
...
# Subtest: should parse correctly when content has blank template and then an unrelated table
ok 7 - should parse correctly when content has blank template and then an unrelated table
---
duration_ms: 0.310476
...
# Subtest: should extract correct number of categories when content has blank template and then an unrelated table
ok 8 - should extract correct number of categories when content has blank template and then an unrelated table
---
duration_ms: 0.161236
...
# Subtest: should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
ok 9 - should parse correctly when content is complete page content with html, head tags and body having two templates with fragments
---
duration_ms: 0.427975
...
# Subtest: should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
ok 10 - should extract correct number of categories when content is complete page content with html, head tags and body having two templates with fragments
---
duration_ms: 0.348858
...
# Subtest: should parse correctly when Content has self closing meta tag
ok 11 - should parse correctly when Content has self closing meta tag
---
duration_ms: 0.182198
...
# Subtest: should extract correct number of categories when Content has self closing meta tag
ok 12 - should extract correct number of categories when Content has self closing meta tag
---
duration_ms: 0.17191
...
# Subtest: should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
ok 13 - should parse correctly when Content has template fragments and one fragment is a section candidate. Section has categories too
---
duration_ms: 0.206786
...
# Subtest: should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
ok 14 - should extract correct number of categories when Content has template fragments and one fragment is a section candidate. Section has categories too
---
duration_ms: 0.137682
...
# Subtest: should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
ok 15 - should parse correctly when Content has transclusion and one of its fragment get removed since it is ignorable.
---
duration_ms: 0.266765
...
# Subtest: should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
ok 16 - should extract correct number of categories when Content has transclusion and one of its fragment get removed since it is ignorable.
---
duration_ms: 0.130011
...
# Subtest: should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
ok 17 - should parse correctly when Content has transclusion and same element is removable templatestyle. So do not remove
---
duration_ms: 0.122431
...
# Subtest: should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
ok 18 - should extract correct number of categories when Content has transclusion and same element is removable templatestyle. So do not remove
---
duration_ms: 0.343116
...
1..18
ok 20 - Section wrap tests
---
duration_ms: 9.865666
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:21.520Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.579Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.588Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:21.614Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Title pair tests
# Subtest: should adapt the title when: Corresponding title exist in target language
ok 1 - should adapt the title when: Corresponding title exist in target language
---
duration_ms: 157.74141
...
# Subtest: should adapt the title when: Corresponding title exist in target language
ok 2 - should adapt the title when: Corresponding title exist in target language
---
duration_ms: 0.658877
...
# Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization
ok 3 - should adapt the title when: Corresponding title exist in target language and given title need normalization
---
duration_ms: 0.254332
...
# Subtest: should adapt the title when: Corresponding title does not exist in target language and given title need normalization
ok 4 - should adapt the title when: Corresponding title does not exist in target language and given title need normalization
---
duration_ms: 0.230443
...
# Subtest: should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
ok 5 - should adapt the title when: Corresponding title exist in target language and given title need normalization, has parenthesis
---
duration_ms: 0.200256
...
# Subtest: should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
ok 6 - should adapt the title when: Source title is percentage encoded, but should not throw error, should return corresponding title
---
duration_ms: 0.689983
...
# Subtest: should have the queue size 50
ok 7 - should have the queue size 50
---
duration_ms: 2.0558
...
1..7
ok 21 - Title pair tests
---
duration_ms: 250.184312
...
# Subtest: Section extractor tests
# Subtest: should extract section titles correctly
ok 1 - should extract section titles correctly
---
duration_ms: 4.481718
...
# Subtest: should extract section sizes correctly
ok 2 - should extract section sizes correctly
---
duration_ms: 83.892711
...
# Subtest: should extract section titles correctly
ok 3 - should extract section titles correctly
---
duration_ms: 1.123293
...
# Subtest: should extract section sizes correctly
ok 4 - should extract section sizes correctly
---
duration_ms: 31.412927
...
1..4
ok 22 - Section extractor tests
---
duration_ms: 123.2928
type: 'suite'
...
# Subtest: Segmentation tests for am
# Subtest: should not have any errors when: Amharic segmentation - basic test
ok 1 - should not have any errors when: Amharic segmentation - basic test
---
duration_ms: 1.364059
...
1..1
ok 23 - Segmentation tests for am
---
duration_ms: 3.076444
type: 'suite'
...
# Subtest: Segmentation tests for en
# Subtest: should not have any errors when: Simple paragraph test
ok 1 - should not have any errors when: Simple paragraph test
---
duration_ms: 0.5536
...
# Subtest: should not have any errors when: Sentence ending with )
ok 2 - should not have any errors when: Sentence ending with )
---
duration_ms: 0.162626
...
# Subtest: should not have any errors when: Exclamation, punctuation test
ok 3 - should not have any errors when: Exclamation, punctuation test
---
duration_ms: 0.142218
...
# Subtest: should not have any errors when: Multiple sentences
ok 4 - should not have any errors when: Multiple sentences
---
duration_ms: 0.131005
...
# Subtest: should not have any errors when: Multiple sections - div, h1, paragraph
ok 5 - should not have any errors when: Multiple sections - div, h1, paragraph
---
duration_ms: 0.140867
...
# Subtest: should not have any errors when: Sentence starting with a link
ok 6 - should not have any errors when: Sentence starting with a link
---
duration_ms: 0.128166
...
# Subtest: should not have any errors when: Sentence starting with a link and ending with a link
ok 7 - should not have any errors when: Sentence starting with a link and ending with a link
---
duration_ms: 0.228483
...
# Subtest: should not have any errors when: Figure
ok 8 - should not have any errors when: Figure
---
duration_ms: 0.314178
...
# Subtest: should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
ok 9 - should not have any errors when: References can appear after period without space. Example: Hydrogen is a gas.[1] It is ...
---
duration_ms: 0.182783
...
# Subtest: should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
ok 10 - should not have any errors when: References can appear after period without space, repeated. Example: Hydrogen is a gas.[1][2][3] It is ...
---
duration_ms: 0.186984
...
# Subtest: should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
ok 11 - should not have any errors when: References can appear inside a sentence. Example: Hydrogen is a gas[1] and it is ...
---
duration_ms: 0.307646
...
# Subtest: should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
ok 12 - should not have any errors when: References can appear inside a sentence. Example:Hydrogen's atomic number is one. Hydrogen is a gas[1] and it is ..... Test the flags are reset properly
---
duration_ms: 0.140006
...
# Subtest: should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
ok 13 - should not have any errors when: References can appear repeated inside a sentence. Example: Hydrogen is a gas[1][2][3] and it is ...
---
duration_ms: 0.259445
...
# Subtest: should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
ok 14 - should not have any errors when: References can appear after period and space. Example: Hydrogen is a gas. [1] It is ...
---
duration_ms: 0.179164
...
# Subtest: should not have any errors when: Paragraph from Debian article- repeating references
ok 15 - should not have any errors when: Paragraph from Debian article- repeating references
---
duration_ms: 0.144277
...
# Subtest: should not have any errors when: References after closing bracket and period.
ok 16 - should not have any errors when: References after closing bracket and period.
---
duration_ms: 0.118121
...
# Subtest: should not have any errors when: Three sentences in a single text node
ok 17 - should not have any errors when: Three sentences in a single text node
---
duration_ms: 0.297588
...
# Subtest: should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
ok 18 - should not have any errors when: Paragraph ending with reference and already having reference in between. The second reference should not be identified as repeating reference. If identified as repeating reference, 7 letters from last word will be missing.
---
duration_ms: 0.148807
...
# Subtest: should not have any errors when: Sentences ending with abbreviations
ok 19 - should not have any errors when: Sentences ending with abbreviations
---
duration_ms: 0.102006
...
# Subtest: should not have any errors when: link element inside span element
ok 20 - should not have any errors when: link element inside span element
---
duration_ms: 0.095156
...
# Subtest: should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
ok 21 - should not have any errors when: Do not break inside of links with abbreviations. Example: Carl E. Wieman. See https://phabricator.wikimedia.org/T99504
---
duration_ms: 0.093443
...
# Subtest: should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
ok 22 - should not have any errors when: A non-segmentable text chunk inside a textblock should not mark the whole text chunk non-segmentable
---
duration_ms: 0.083945
...
# Subtest: should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
ok 23 - should not have any errors when: Figure-inline segmentation. Do not violate the MediaWiki DOM spec https://www.mediawiki.org/wiki/Specs/HTML\#Images
---
duration_ms: 0.079214
...
# Subtest: should not have any errors when: Figure-inline inside a transclusions
ok 24 - should not have any errors when: Figure-inline inside a transclusions
---
duration_ms: 0.078708
...
# Subtest: should not have any errors when: Video tag in figure tag
ok 25 - should not have any errors when: Video tag in figure tag
---
duration_ms: 0.081835
...
# Subtest: should not have any errors when: Audio tag in figure tag
ok 26 - should not have any errors when: Audio tag in figure tag
---
duration_ms: 0.07778
...
# Subtest: should not have any errors when: Audio tag in figure-inline tag
ok 27 - should not have any errors when: Audio tag in figure-inline tag
---
duration_ms: 0.079217
...
# Subtest: should not have any errors when: Video tag in figure-inline tag
ok 28 - should not have any errors when: Video tag in figure-inline tag
---
duration_ms: 0.078728
...
# Subtest: should not have any errors when: Do not segment content inside block templates
ok 29 - should not have any errors when: Do not segment content inside block templates
---
duration_ms: 0.080611
...
# Subtest: should not have any errors when: about attribute alone does not initiate a transclusion context
ok 30 - should not have any errors when: about attribute alone does not initiate a transclusion context
---
duration_ms: 0.087484
...
# Subtest: should not have any errors when: Do not consider style tag with transclusion as block tag
ok 31 - should not have any errors when: Do not consider style tag with transclusion as block tag
---
duration_ms: 0.199341
...
# Subtest: should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
ok 32 - should not have any errors when: Sections with singe paragraph and a transclusion based reference at th end - T283513
---
duration_ms: 0.188024
...
# Subtest: should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
ok 33 - should not have any errors when: Handle abbreviations such as Brown v. Board of education - T338689
---
duration_ms: 0.139667
...
1..33
ok 24 - Segmentation tests for en
---
duration_ms: 6.92017
type: 'suite'
...
# Subtest: Segmentation tests for de
# Subtest: should not have any errors when: Avoid segmenting inside a transclusion textblock
ok 1 - should not have any errors when: Avoid segmenting inside a transclusion textblock
---
duration_ms: 0.130365
...
1..1
ok 25 - Segmentation tests for de
---
duration_ms: 0.301786
type: 'suite'
...
# Subtest: Segmentation tests for hi
# Subtest: should not have any errors when: Hindi segmentation - basic test
ok 1 - should not have any errors when: Hindi segmentation - basic test
---
duration_ms: 0.112459
...
1..1
ok 26 - Segmentation tests for hi
---
duration_ms: 0.198559
type: 'suite'
...
# Subtest: Segmentation tests for hy
# Subtest: should not have any errors when: Armenian segmentation - basic test
ok 1 - should not have any errors when: Armenian segmentation - basic test
---
duration_ms: 0.159218
...
1..1
ok 27 - Segmentation tests for hy
---
duration_ms: 0.248794
type: 'suite'
...
# Subtest: Segmentation tests for ja
# Subtest: should not have any errors when: Japanese segmentation - basic test
ok 1 - should not have any errors when: Japanese segmentation - basic test
---
duration_ms: 0.109806
...
1..1
ok 28 - Segmentation tests for ja
---
duration_ms: 0.193951
type: 'suite'
...
# Subtest: Segmentation tests for zh
# Subtest: should not have any errors when: Chinese segmentation - basic test
ok 1 - should not have any errors when: Chinese segmentation - basic test
---
duration_ms: 0.120532
...
1..1
ok 29 - Segmentation tests for zh
---
duration_ms: 0.200393
type: 'suite'
...
# Subtest: Segmentation tests for pa
# Subtest: should not have any errors when: Punjabi segmentation - basic test
ok 1 - should not have any errors when: Punjabi segmentation - basic test
---
duration_ms: 0.156684
...
1..1
ok 30 - Segmentation tests for pa
---
duration_ms: 0.241397
type: 'suite'
...
# Subtest: SectionSuggester tests
# Subtest: should find present and missing sections
ok 1 - should find present and missing sections
---
duration_ms: 22.345322
...
1..1
ok 31 - SectionSuggester tests
---
duration_ms: 24.42431
type: 'suite'
...
# Subtest: /src/repo/test/testutils.js
ok 23 - /src/repo/test/testutils.js
---
duration_ms: 173.315886
...
# {"@timestamp":"2026-05-01T09:43:24.451Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.512Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.513Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.529Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Link Adaptation tests
# Subtest: Basic test
ok 1 - Basic test
---
duration_ms: 167.390806
...
# Subtest: Space in the title
ok 2 - Space in the title
---
duration_ms: 1.655559
...
# Subtest: Relative URL
ok 3 - Relative URL
---
duration_ms: 0.916309
...
# Subtest: Title with parenthesis
ok 4 - Title with parenthesis
---
duration_ms: 1.09805
...
# Subtest: Target title does not exist
ok 5 - Target title does not exist
---
duration_ms: 0.775195
...
# Subtest: Title with translation from Wikidata label
ok 6 - Title with translation from Wikidata label
---
duration_ms: 1.209641
...
# Subtest: ISBN Link adaptation
ok 7 - ISBN Link adaptation
---
duration_ms: 0.856749
...
1..7
ok 33 - Link Adaptation tests
---
duration_ms: 281.757843
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:24.483Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.521Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.523Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.547Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:24.563Z","ecs.version":"8.10.0","log.level":"debug","message":"Not-adapting a reference node without data-mw.body.html: trncttm-2","service":"cxserver-dev"}
# Subtest: Reference adaptation
# Subtest: Adapting a reference with plain text content
ok 1 - Adapting a reference with plain text content
---
duration_ms: 3.76379
...
# Subtest: Adapting a reference with plain text content, sup tag
ok 2 - Adapting a reference with plain text content, sup tag
---
duration_ms: 0.432672
...
# Subtest: Adapting a reference with html content, sup tag
ok 3 - Adapting a reference with html content, sup tag
---
duration_ms: 0.250304
...
# Subtest: Not adapting a reference with no data-mw.body
ok 4 - Not adapting a reference with no data-mw.body
---
duration_ms: 0.525715
...
# Subtest: Partially adapting a reference with named reference
ok 5 - Partially adapting a reference with named reference
---
duration_ms: 0.428022
...
# {"@timestamp":"2026-05-01T09:43:24.987Z","ecs.version":"8.10.0","log.level":"error","message":"Not-adapting a template node with non-JSON data-mw: CITEREFGazette57855","service":"cxserver-dev"}
# Subtest: Mark the reference adaptation failed when the content defined in template not adapted
ok 6 - Mark the reference adaptation failed when the content defined in template not adapted
---
duration_ms: 394.552868
...
# Subtest: Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
ok 7 - Mark the reference adaptation failed when the content defined in template and it is unsupported by CXserver
---
duration_ms: 61.316277
...
# Subtest: Partial reference adaptation, when mandatory params are not transferred successfully
ok 8 - Partial reference adaptation, when mandatory params are not transferred successfully
---
duration_ms: 142.870596
...
1..8
ok 34 - Reference adaptation
---
duration_ms: 693.823181
type: 'suite'
...
# {"@timestamp":"2026-05-01T09:43:25.182Z","ecs.version":"8.10.0","log.level":"info","message":"Starting cxserver-dev","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:25.220Z","ecs.version":"8.10.0","log.level":"info","message":"responseTimeMetric","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:25.221Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 349 languages from the configuration","service":"cxserver-dev"}
# {"@timestamp":"2026-05-01T09:43:25.242Z","ecs.version":"8.10.0","log.level":"debug","message":"Found 6 MT providers","service":"cxserver-dev"}
# Subtest: Template adaptation
# Subtest: Template with no equivalents
ok 1 - Template with no equivalents
---
duration_ms: 144.478053
...
# Subtest: Babel template
ok 2 - Babel template
---
duration_ms: 83.80104
...
# Subtest: Cite web template
ok 3 - Cite web template
---
duration_ms: 147.578488
...
# Subtest: Multi-part template for columns
ok 4 - Multi-part template for columns
---
duration_ms: 93.596665
...
# Subtest: Template with equivalents, but target template data missing, no params mapped
ok 5 - Template with equivalents, but target template data missing, no params mapped
---
duration_ms: 69.422872
...
# Subtest: Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
ok 6 - Equivalent template exist, templatedata exists only for source language. Use that as hint for extracting params from template source code in target language
---
duration_ms: 65.338738
...
# Subtest: Template with equivalents, all mandatory params mapped
ok 7 - Template with equivalents, all mandatory params mapped
---
duration_ms: 81.662192
...
# Subtest: Images that are generated by templates
ok 8 - Images that are generated by templates
---
duration_ms: 5.008036
...
1..8
ok 35 - Template adaptation
---
duration_ms: 755.224473
...
# Subtest: /src/repo/test/utils/assert.js
ok 27 - /src/repo/test/utils/assert.js
---
duration_ms: 1168.385622
...
1..36
# tests 192
# suites 33
# pass 192
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 16973.687429
--- end ---
$ package-lock-lint /src/repo/package-lock.json
--- stdout ---
Checking /src/repo/package-lock.json
--- end ---
build: Updating eslint-config-wikimedia to 0.32.3
$ git add .
--- stdout ---
--- end ---
$ git commit -F /tmp/tmpxyt8v5iu
--- stdout ---
[master 1445c9b] build: Updating eslint-config-wikimedia to 0.32.3
2 files changed, 339 insertions(+), 268 deletions(-)
--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 1445c9b1d85c3603ecc65373a967b439cc820bdc Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Fri, 1 May 2026 09:43:26 +0000
Subject: [PATCH] build: Updating eslint-config-wikimedia to 0.32.3
Change-Id: I2abb15ddbaa321fc49e934e8e81ea5b32ad1feea
---
package-lock.json | 605 ++++++++++++++++++++++++++--------------------
package.json | 2 +-
2 files changed, 339 insertions(+), 268 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 782fd3a..bc0b1d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -45,7 +45,7 @@
"@eslint/js": "^9.34.0",
"argparse": "^2.0.1",
"async": "^3.2.3",
- "eslint-config-wikimedia": "0.31.0",
+ "eslint-config-wikimedia": "0.32.3",
"eslint-plugin-import": "^2.31.0",
"globals": "^15.12.0",
"nodemon": "^3.0.1",
@@ -1833,35 +1833,28 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.43.1",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz",
- "integrity": "sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==",
+ "version": "0.76.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.76.0.tgz",
+ "integrity": "sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@types/eslint": "^8.56.5",
- "@types/estree": "^1.0.5",
- "@typescript-eslint/types": "^7.2.0",
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.46.0",
"comment-parser": "1.4.1",
- "esquery": "^1.5.0",
- "jsdoc-type-pratt-parser": "~4.0.0"
+ "esquery": "^1.6.0",
+ "jsdoc-type-pratt-parser": "~6.10.0"
},
"engines": {
- "node": ">=16"
+ "node": ">=20.11.0"
}
},
- "node_modules/@es-joy/jsdoccomment/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
- "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
"dev": true,
- "license": "MIT",
"engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "node": ">=10"
}
},
"node_modules/@eslint-community/eslint-utils": {
@@ -2201,11 +2194,10 @@
}
},
"node_modules/@mdn/browser-compat-data": {
- "version": "5.7.6",
- "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz",
- "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==",
- "dev": true,
- "license": "CC0-1.0"
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.5.tgz",
+ "integrity": "sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==",
+ "dev": true
},
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
@@ -2364,6 +2356,18 @@
"hasInstallScript": true,
"license": "Apache-2.0"
},
+ "node_modules/@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@so-ric/colorspace": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
@@ -2407,30 +2411,11 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@types/eslint": {
- "version": "8.56.12",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz",
- "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/@types/json5": {
"version": "0.0.29",
@@ -2443,8 +2428,7 @@
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
"integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/@types/triple-beam": {
"version": "1.3.5",
@@ -2460,17 +2444,16 @@
"optional": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.1.tgz",
- "integrity": "sha512-9XNTlo7P7RJxbVeICaIIIEipqxLKguyh+3UbXuT2XQuFp6d8VOeDEGuz5IiX0dgZo8CiI6aOFLg4e8cF71SFVg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+ "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/type-utils": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/type-utils": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"graphemer": "^1.4.0",
"ignore": "^7.0.0",
"natural-compare": "^1.4.0",
@@ -2484,22 +2467,21 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.35.1",
+ "@typescript-eslint/parser": "^8.46.0",
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
- "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1"
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2510,7 +2492,7 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -2518,22 +2500,20 @@
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.1.tgz",
- "integrity": "sha512-3MyiDfrfLeK06bi/g9DqJxP5pV74LNv4rFTyvGDmT3x2p1yp1lOd+qYZfiRPIOf/oON+WRZR5wxxuF85qOar+w==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4"
},
"engines": {
@@ -2545,18 +2525,17 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.1.tgz",
- "integrity": "sha512-VYxn/5LOpVxADAuP3NrnxxHYfzVtQzLKeldIhDhzC8UHaiQvYlXvKuVho1qLduFbJjjy5U5bkGwa3rUGUb1Q6Q==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.35.1",
- "@typescript-eslint/types": "^8.35.1",
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
"debug": "^4.3.4"
},
"engines": {
@@ -2567,18 +2546,17 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.1.tgz",
- "integrity": "sha512-s/Bpd4i7ht2934nG+UoSPlYXd08KYz3bmjLEb7Ye1UVob0d1ENiT3lY8bsCmik4RqfSbPw9xJJHbugpPpP5JUg==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1"
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2589,11 +2567,10 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.1.tgz",
- "integrity": "sha512-K5/U9VmT9dTHoNowWZpz+/TObS3xqC5h0xAIjXPw+MNcKV9qg6eSatEnmeAwkjHijhACH0/N7bkhKvbt1+DXWQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -2602,18 +2579,18 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.1.tgz",
- "integrity": "sha512-HOrUBlfVRz5W2LIKpXzZoy6VTZzMu2n8q9C2V/cFngIC5U1nStJgv0tMV4sZPzdf4wQm9/ToWUFPMN9Vq9VJQQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+ "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.35.1",
- "@typescript-eslint/utils": "8.35.1",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/utils": "8.46.0",
"debug": "^4.3.4",
"ts-api-utils": "^2.1.0"
},
@@ -2626,20 +2603,19 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.1.tgz",
- "integrity": "sha512-lhnwatFmOFcazAsUm3ZnZFpXSxiwoa1Lj50HphnDe1Et01NF4+hrdXONSUHIcbVu2eFb1bAf+5yjXkGVkXBKAQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+ "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/typescript-estree": "8.35.1"
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2650,15 +2626,14 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.1.tgz",
- "integrity": "sha512-q/O04vVnKHfrrhNAscndAn1tuQhIkwqnaW+eu5waD5IPts2eX1dgJxgqcPx5BX109/qAz7IG6VrEPTOYKCNfRQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -2668,16 +2643,15 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.1.tgz",
- "integrity": "sha512-Vvpuvj4tBxIka7cPs6Y1uvM7gJgdF5Uu9F+mBJBPY4MhvjrjWGK4H0lVgLJd/8PWZ23FTqsaJaLEkBCFUk8Y9g==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.35.1",
- "@typescript-eslint/tsconfig-utils": "8.35.1",
- "@typescript-eslint/types": "8.35.1",
- "@typescript-eslint/visitor-keys": "8.35.1",
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
@@ -2693,7 +2667,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.9.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -2701,7 +2675,6 @@
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
"integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -2711,7 +2684,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
"dev": true,
- "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.2"
},
@@ -2727,7 +2699,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -2942,13 +2913,12 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.35.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.1.tgz",
- "integrity": "sha512-VRwixir4zBWCSTP/ljEo091lbpypz57PoeAQ9imjG+vbeof9LplljsL1mos4ccG6H9IjfrVGM359RozUnuFhpw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.35.1",
+ "@typescript-eslint/types": "8.46.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -2964,7 +2934,6 @@
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
- "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -3199,7 +3168,6 @@
"resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
"integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=14"
}
@@ -3350,11 +3318,16 @@
"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.8.1.tgz",
"integrity": "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@mdn/browser-compat-data": "^5.6.19"
}
},
+ "node_modules/ast-metadata-inferer/node_modules/@mdn/browser-compat-data": {
+ "version": "5.7.6",
+ "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.7.6.tgz",
+ "integrity": "sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==",
+ "dev": true
+ },
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
@@ -3684,7 +3657,6 @@
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
"integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=6"
},
@@ -3983,7 +3955,6 @@
"url": "https://github.com/sponsors/sibiraj-s"
}
],
- "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -3993,7 +3964,6 @@
"resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz",
"integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"escape-string-regexp": "^1.0.5"
},
@@ -4006,7 +3976,6 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.8.0"
}
@@ -4135,7 +4104,6 @@
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 12.0.0"
}
@@ -4691,7 +4659,6 @@
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
"integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
@@ -4964,35 +4931,114 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.31.0.tgz",
- "integrity": "sha512-Z/t/zGPdxs/ehxb0EM6THNWAzueT7GtuqzjUvmBpkxcTKzZPJEXWnnpswdj/hgv8Ce8PIeDp0zwQxR4e3c9CIw==",
+ "version": "0.32.3",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.32.3.tgz",
+ "integrity": "sha512-Ekz2/ozpCCjQl3VbC6dW7ChqoW7FRilLDxmJ+FJOZhIxxzZSZR5QqQOAGWSZAlG1ONkZbYV/TPwGLWZcrNxyaA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@stylistic/eslint-plugin": "^3.1.0",
- "@typescript-eslint/eslint-plugin": "8.35.1",
- "@typescript-eslint/parser": "8.35.1",
+ "@typescript-eslint/eslint-plugin": "8.46.0",
+ "@typescript-eslint/parser": "8.46.0",
"browserslist-config-wikimedia": "^0.7.0",
"eslint": "^8.57.0",
- "eslint-plugin-compat": "^4.2.0",
- "eslint-plugin-es-x": "^7.6.0",
- "eslint-plugin-jest": "^28.5.0",
- "eslint-plugin-jsdoc": "48.2.5",
+ "eslint-plugin-compat": "^6.0.2",
+ "eslint-plugin-es-x": "^8.7.0",
+ "eslint-plugin-jest": "^29.0.1",
+ "eslint-plugin-jsdoc": "61.3.0",
"eslint-plugin-json-es": "^1.6.0",
- "eslint-plugin-mediawiki": "^0.7.0",
- "eslint-plugin-mocha": "^10.4.3",
- "eslint-plugin-n": "^17.7.0",
+ "eslint-plugin-mediawiki": "^0.8.2",
+ "eslint-plugin-mocha": "^10.5.0",
+ "eslint-plugin-n": "^17.23.1",
"eslint-plugin-no-jquery": "^3.1.1",
- "eslint-plugin-qunit": "^8.1.1",
- "eslint-plugin-security": "^1.7.1",
- "eslint-plugin-unicorn": "^53.0.0",
- "eslint-plugin-vue": "^9.26.0",
- "eslint-plugin-wdio": "^8.24.12",
- "eslint-plugin-yml": "^1.14.0"
+ "eslint-plugin-qunit": "^8.2.5",
+ "eslint-plugin-security": "^3.0.1",
+ "eslint-plugin-unicorn": "^56.0.1",
+ "eslint-plugin-vue": "^9.33.0",
+ "eslint-plugin-wdio": "^9.16.2",
+ "eslint-plugin-yml": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=20 <25"
+ }
+ },
+ "node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-es-x": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-8.7.0.tgz",
+ "integrity": "sha512-Du5Sb067sjqzmglaPhsfcEQgE1EYfL8sko+4jOMcAB/XKGoCxntSrOmTYuVzswA1rzM9+MZwH6+GOp0G3/wVCg==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/ota-meshi",
+ "https://opencollective.com/eslint"
+ ],
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.12.1",
+ "eslint-compat-utils": "^0.6.3"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8"
+ }
+ },
+ "node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-es-x/node_modules/eslint-compat-utils": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz",
+ "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.4"
},
"engines": {
- "node": ">=18 <25"
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/eslint-config-wikimedia/node_modules/eslint-plugin-wdio": {
+ "version": "9.27.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-9.27.1.tgz",
+ "integrity": "sha512-p/e1nKlb4tGFHv06DJh8ChuoJnQJGrj2ed/RrFQrX3Q3Kx0+GcRYWjyWMhO4DIA1DjU+7JEr957IPanHmz7UHw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.20.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.39.2",
+ "globals": "^16.5.0",
+ "typescript-eslint": "^8.54.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript-eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-config-wikimedia/node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint-config-wikimedia/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/eslint-import-resolver-node": {
@@ -5070,25 +5116,24 @@
}
},
"node_modules/eslint-plugin-compat": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-4.2.0.tgz",
- "integrity": "sha512-RDKSYD0maWy5r7zb5cWQS+uSPc26mgOzdORJ8hxILmWM7S/Ncwky7BcAtXVY5iRbKjBdHsWU8Yg7hfoZjtkv7w==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-compat/-/eslint-plugin-compat-6.2.1.tgz",
+ "integrity": "sha512-gLKqUH+lQcCL+HzsROUjBDvakc5Zaga51Y4ZAkPCXc41pzKBfyluqTr2j8zOx8QQQb7zyglu1LVoL5aSNWf2SQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@mdn/browser-compat-data": "^5.3.13",
- "ast-metadata-inferer": "^0.8.0",
- "browserslist": "^4.21.10",
- "caniuse-lite": "^1.0.30001524",
+ "@mdn/browser-compat-data": "^6.1.1",
+ "ast-metadata-inferer": "^0.8.1",
+ "browserslist": "^4.25.2",
"find-up": "^5.0.0",
+ "globals": "^15.7.0",
"lodash.memoize": "^4.1.2",
- "semver": "^7.5.4"
+ "semver": "^7.6.2"
},
"engines": {
- "node": ">=14.x"
+ "node": ">=18.x"
},
"peerDependencies": {
- "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
}
},
"node_modules/eslint-plugin-compat/node_modules/semver": {
@@ -5096,7 +5141,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -5184,21 +5228,21 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "28.14.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz",
- "integrity": "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ==",
+ "version": "29.15.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz",
+ "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
},
"engines": {
- "node": "^16.10.0 || ^18.12.0 || >=20.0.0"
+ "node": "^20.12.0 || ^22.0.0 || >=24.0.0"
},
"peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0",
- "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
- "jest": "*"
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "jest": "*",
+ "typescript": ">=4.8.4 <7.0.0"
},
"peerDependenciesMeta": {
"@typescript-eslint/eslint-plugin": {
@@ -5206,28 +5250,35 @@
},
"jest": {
"optional": true
+ },
+ "typescript": {
+ "optional": true
}
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "48.2.5",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.5.tgz",
- "integrity": "sha512-ZeTfKV474W1N9niWfawpwsXGu+ZoMXu4417eBROX31d7ZuOk8zyG66SO77DpJ2+A9Wa2scw/jRqBPnnQo7VbcQ==",
+ "version": "61.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.3.0.tgz",
+ "integrity": "sha512-E4m/5J5lrasd63Z74q4CCZ4PFnywnnrcvA7zZ98802NPhrZKKTp5NH+XAT+afcjXp2ps2/OQF5gPSWCT2XFCJg==",
"dev": true,
- "license": "BSD-3-Clause",
"dependencies": {
- "@es-joy/jsdoccomment": "~0.43.0",
+ "@es-joy/jsdoccomment": "~0.76.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
- "debug": "^4.3.4",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "esquery": "^1.5.0",
- "is-builtin-module": "^3.2.1",
- "semver": "^7.6.1",
- "spdx-expression-parse": "^4.0.0"
+ "espree": "^10.4.0",
+ "esquery": "^1.6.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^2.0.0",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=20.11.0"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
@@ -5238,7 +5289,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -5292,11 +5342,10 @@
}
},
"node_modules/eslint-plugin-mediawiki": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.7.1.tgz",
- "integrity": "sha512-C/OfySlkkjHJrZl1ieHlL8AyebgrppyX49DUYEVXk7n0qu7dD/vuOnzeQz28H2MkUVj3GnoFSUxqbczG6IUwwg==",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.8.2.tgz",
+ "integrity": "sha512-ydYrpkzm8IVVDQA96QPF3HnFd2xjkIEh7gixD2gvOqUbUZF0p36LtpWXOFAlPWAvHLePWbNNTD5ovd3d4hEtog==",
"dev": true,
- "license": "MIT",
"dependencies": {
"upath": "^2.0.1"
},
@@ -5419,29 +5468,33 @@
}
},
"node_modules/eslint-plugin-security": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz",
- "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-3.0.1.tgz",
+ "integrity": "sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"safe-regex": "^2.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-plugin-unicorn": {
- "version": "53.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-53.0.0.tgz",
- "integrity": "sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==",
+ "version": "56.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz",
+ "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==",
"dev": true,
- "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.24.5",
+ "@babel/helper-validator-identifier": "^7.24.7",
"@eslint-community/eslint-utils": "^4.4.0",
- "@eslint/eslintrc": "^3.0.2",
"ci-info": "^4.0.0",
"clean-regexp": "^1.0.0",
- "core-js-compat": "^3.37.0",
- "esquery": "^1.5.0",
+ "core-js-compat": "^3.38.1",
+ "esquery": "^1.6.0",
+ "globals": "^15.9.0",
"indent-string": "^4.0.0",
"is-builtin-module": "^3.2.1",
"jsesc": "^3.0.2",
@@ -5449,7 +5502,7 @@
"read-pkg-up": "^7.0.1",
"regexp-tree": "^0.1.27",
"regjsparser": "^0.10.0",
- "semver": "^7.6.1",
+ "semver": "^7.6.3",
"strip-indent": "^3.0.0"
},
"engines": {
@@ -5467,7 +5520,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -5540,16 +5592,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-plugin-wdio": {
- "version": "8.37.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.37.0.tgz",
- "integrity": "sha512-X217zXxSqj1IPWu3bxN7D/xEUmNk7Jg5lBf2JwYH3mCogaqL2tnHZnwt0EQ5D9oEejfEl2+4zqHSzhXq1X7F2A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^16.13 || >=18"
- }
- },
"node_modules/eslint-plugin-yml": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.19.1.tgz",
@@ -6043,7 +6085,6 @@
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
@@ -6060,7 +6101,6 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
- "license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -6777,8 +6817,7 @@
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true,
- "license": "ISC"
+ "dev": true
},
"node_modules/html-encoding-sniffer": {
"version": "6.0.0",
@@ -6792,6 +6831,22 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ]
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -7034,8 +7089,7 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/is-async-function": {
"version": "2.1.1",
@@ -7108,7 +7162,6 @@
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
"integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"builtin-modules": "^3.3.0"
},
@@ -7657,13 +7710,12 @@
}
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
- "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-6.10.0.tgz",
+ "integrity": "sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==",
"dev": true,
- "license": "MIT",
"engines": {
- "node": ">=12.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/jsdom": {
@@ -7748,8 +7800,7 @@
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
@@ -7867,8 +7918,7 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/locate-path": {
"version": "6.0.0",
@@ -7947,8 +7997,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/lodash.merge": {
"version": "4.6.2",
@@ -8080,7 +8129,6 @@
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">= 8"
}
@@ -8099,7 +8147,6 @@
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"braces": "^3.0.3",
"picomatch": "^2.3.1"
@@ -8113,7 +8160,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -8180,7 +8226,6 @@
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
"integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -8654,7 +8699,6 @@
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
"dev": true,
- "license": "BSD-2-Clause",
"dependencies": {
"hosted-git-info": "^2.1.4",
"resolve": "^1.10.0",
@@ -8667,7 +8711,6 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
- "license": "ISC",
"bin": {
"semver": "bin/semver"
}
@@ -8881,6 +8924,12 @@
"node": ">=6"
}
},
+ "node_modules/object-deep-merge": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true
+ },
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
@@ -9196,12 +9245,20 @@
"node": ">=6"
}
},
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
+ "dev": true,
+ "dependencies": {
+ "parse-statements": "1.0.11"
+ }
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
@@ -9215,6 +9272,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true
+ },
"node_modules/parse5": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz",
@@ -9400,7 +9463,6 @@
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
"integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -9643,7 +9705,6 @@
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@types/normalize-package-data": "^2.4.0",
"normalize-package-data": "^2.5.0",
@@ -9659,7 +9720,6 @@
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
"integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"find-up": "^4.1.0",
"read-pkg": "^5.2.0",
@@ -9677,7 +9737,6 @@
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -9691,7 +9750,6 @@
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -9704,7 +9762,6 @@
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
- "license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
@@ -9720,7 +9777,6 @@
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -9733,7 +9789,6 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
"dev": true,
- "license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=8"
}
@@ -9833,7 +9888,6 @@
"resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
"integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
"dev": true,
- "license": "MIT",
"bin": {
"regexp-tree": "bin/regexp-tree"
}
@@ -9902,7 +9956,6 @@
"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz",
"integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==",
"dev": true,
- "license": "BSD-2-Clause",
"dependencies": {
"jsesc": "~0.5.0"
},
@@ -9967,6 +10020,18 @@
"node": ">=0.10.5"
}
},
+ "node_modules/reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.12",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
@@ -10137,7 +10202,6 @@
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz",
"integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==",
"dev": true,
- "license": "MIT",
"dependencies": {
"regexp-tree": "~0.1.1"
}
@@ -10659,7 +10723,6 @@
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
"integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
@@ -10670,7 +10733,6 @@
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
@@ -10680,15 +10742,13 @@
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
"integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
- "dev": true,
- "license": "CC-BY-3.0"
+ "dev": true
},
"node_modules/spdx-expression-parse": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
@@ -10698,8 +10758,7 @@
"version": "3.0.23",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
"integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
- "dev": true,
- "license": "CC0-1.0"
+ "dev": true
},
"node_modules/sprintf-js": {
"version": "1.0.3",
@@ -10909,7 +10968,6 @@
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
"integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"min-indent": "^1.0.0"
},
@@ -11249,6 +11307,22 @@
"node": ">=8.0"
}
},
+ "node_modules/to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -11634,7 +11708,6 @@
"resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
"integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=4",
"yarn": "*"
@@ -11711,7 +11784,6 @@
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
- "license": "Apache-2.0",
"dependencies": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
@@ -11722,7 +11794,6 @@
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
"integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
diff --git a/package.json b/package.json
index 31cc9f6..055ce6c 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,7 @@
"@eslint/js": "^9.34.0",
"argparse": "^2.0.1",
"async": "^3.2.3",
- "eslint-config-wikimedia": "0.31.0",
+ "eslint-config-wikimedia": "0.32.3",
"eslint-plugin-import": "^2.31.0",
"globals": "^15.12.0",
"nodemon": "^3.0.1",
--
2.47.3
--- end ---