From 45b2da01eda8a345718c03fc92b4c1fd61df8311 Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Mon, 9 Sep 2024 12:16:52 -0400 Subject: [PATCH 1/7] Batch coverage report data sent to 'combineCoverage' using number of keys as the batching mechanism. This is to prevent very large objects being sent across processes all at once. Objects of sufficient size have been causing timeouts during this transition. --- support.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/support.js b/support.js index 81697ca3..86fc7cda 100644 --- a/support.js +++ b/support.js @@ -14,12 +14,23 @@ dayjs.extend(duration) const sendCoverage = (coverage, pathname = '/') => { logMessage(`Saving code coverage for **${pathname}**`) - const totalCoverage = filterFilesFromCoverage(coverage) + let totalCoverage = filterFilesFromCoverage(coverage) - // stringify coverage object for speed - cy.task('combineCoverage', JSON.stringify(totalCoverage), { - log: false - }) + const keys = Object.keys(totalCoverage) + const batchSize = 500; + + for (let i = 0; i < keys.length; i += batchSize) { + const batchKeys = keys.slice(i, i + batchSize) + const batchCoverage = {} + + batchKeys.forEach(key => { + batchCoverage[key] = totalCoverage[key] + }) + + cy.task('combineCoverage', JSON.stringify(batchCoverage), { + log:false + }) + } } /** From 450291957ee948dd47634876d22094dc8a905f24 Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Mon, 9 Sep 2024 12:21:41 -0400 Subject: [PATCH 2/7] Update let back to const - this was a typo --- support.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support.js b/support.js index 86fc7cda..957810a2 100644 --- a/support.js +++ b/support.js @@ -14,7 +14,7 @@ dayjs.extend(duration) const sendCoverage = (coverage, pathname = '/') => { logMessage(`Saving code coverage for **${pathname}**`) - let totalCoverage = filterFilesFromCoverage(coverage) + const totalCoverage = filterFilesFromCoverage(coverage) const keys = Object.keys(totalCoverage) const batchSize = 500; From 98fdf484114ec9578227e52abb0e479adbbe2743 Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Mon, 9 Sep 2024 12:25:09 -0400 Subject: [PATCH 3/7] Prettier format --- support.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/support.js b/support.js index 957810a2..574d9325 100644 --- a/support.js +++ b/support.js @@ -17,18 +17,18 @@ const sendCoverage = (coverage, pathname = '/') => { const totalCoverage = filterFilesFromCoverage(coverage) const keys = Object.keys(totalCoverage) - const batchSize = 500; + const batchSize = 500 for (let i = 0; i < keys.length; i += batchSize) { const batchKeys = keys.slice(i, i + batchSize) const batchCoverage = {} - batchKeys.forEach(key => { + batchKeys.forEach((key) => { batchCoverage[key] = totalCoverage[key] }) cy.task('combineCoverage', JSON.stringify(batchCoverage), { - log:false + log: false }) } } From cdeb3483d4fdd7cd1bebee940bfa29e470ca595e Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Thu, 26 Sep 2024 15:13:17 -0400 Subject: [PATCH 4/7] Add support function to retrieve and validate 'batch send coverage' environment variable --- support-utils.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/support-utils.js b/support-utils.js index 6007c5cc..6f2a43f1 100644 --- a/support-utils.js +++ b/support-utils.js @@ -148,7 +148,19 @@ function fixSourcePaths(coverage) { }) } +/** + * Validates and returns the configured batch size for + * sending coverage to the backend + */ +function getSendCoverageBatchSize() { + const batchSize = Cypress.env('sendCoverageBatchSize') + const parsedBatchSize = parseInt(batchSize) + const isValid = !isNaN(parsedBatchSize) && parsedBatchSize > 0 + return isValid ? parsedBatchSize : null +} + module.exports = { fixSourcePaths, - filterFilesFromCoverage + filterFilesFromCoverage, + getSendCoverageBatchSize } From 339deb390cca4085f10521126592f7353b7e1961 Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Thu, 26 Sep 2024 15:14:08 -0400 Subject: [PATCH 5/7] Batch coverage sending only if the environment variable 'sendCoverageBatchSize' is set and valid --- support.js | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/support.js b/support.js index 097dca36..dcec2092 100644 --- a/support.js +++ b/support.js @@ -3,7 +3,10 @@ const dayjs = require('dayjs') var duration = require('dayjs/plugin/duration') -const { filterFilesFromCoverage } = require('./support-utils') +const { + filterFilesFromCoverage, + getSendCoverageBatchSize +} = require('./support-utils') dayjs.extend(duration) @@ -16,8 +19,24 @@ const sendCoverage = (coverage, pathname = '/') => { const totalCoverage = filterFilesFromCoverage(coverage) + const envBatchSize = getSendCoverageBatchSize() + const keys = Object.keys(totalCoverage) + + if (envBatchSize && envBatchSize < keys.length) { + sendBatchCoverage(totalCoverage, envBatchSize) + } else { + cy.task('combineCoverage', JSON.stringify(totalCoverage), { + log: false + }) + } +} + +/** + * Sends collected code coverage object to the backend code + * in batches via "cy.task". + */ +const sendBatchCoverage = (totalCoverage, batchSize) => { const keys = Object.keys(totalCoverage) - const batchSize = 500 for (let i = 0; i < keys.length; i += batchSize) { const batchKeys = keys.slice(i, i + batchSize) From a0589b47453e5c98292ecf3c5e72c0d614338eb6 Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Tue, 1 Oct 2024 11:34:41 -0400 Subject: [PATCH 6/7] Add README instructions for using the batching environment variable --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 75f5ede6..3b11182b 100644 --- a/README.md +++ b/README.md @@ -549,7 +549,7 @@ Deeply nested objects will sometimes have `[object Object]` values printed. You DEBUG_DEPTH=10 DEBUG=code-coverage npm run dev ``` -### Common issues +## Common issues Common issue: [not instrumenting your application when running Cypress](#instrument-your-application). @@ -557,6 +557,13 @@ If the plugin worked before in version X but stopped after upgrading to version If you decide to open an issue in this repository, please fill in all information the [issue template](https://github.com/cypress-io/code-coverage/blob/master/.github/ISSUE_TEMPLATE/bug_report.md) asks for. The issues most likely to be resolved have debug logs, screenshots, and hopefully public repository links so we can try running the tests ourselves. +### Coverage reporting timeouts + +If the plugin times out when sending coverage report data to be merged, this may be due to a very large +report being sent across processes. You can batch the report by setting the `sendCoverageBatchSize` environment +variable in your `cypress.config.js` file's 'env' section. Assign the variable an integer value representing +the number of report keys to send per batch. + ## Contributing You can test changes locally by running tests and confirming that the code coverage has been calculated and saved. From 60797e52e714ca755f99b87131eaff28d5860235 Mon Sep 17 00:00:00 2001 From: Andrew Antes Date: Wed, 2 Oct 2024 13:15:03 -0400 Subject: [PATCH 7/7] Add test-app package for testing usage of the sendCoverageBatchSize environment variable --- .circleci/config.yml | 2 + test-apps/batch-send-coverage/.babelrc | 3 + test-apps/batch-send-coverage/README.md | 4 + .../batch-send-coverage/cypress.config.js | 14 + .../cypress/e2e/spec.cy.js | 24 + .../cypress/plugins/index.js | 4 + .../cypress/support/commands.js | 1 + .../cypress/support/e2e.js | 1 + test-apps/batch-send-coverage/index.html | 17 + test-apps/batch-send-coverage/main.js | 3 + .../batch-send-coverage/package-lock.json | 656 ++++++++++++++++++ test-apps/batch-send-coverage/package.json | 21 + test-apps/batch-send-coverage/second.js | 7 + test-apps/batch-send-coverage/third.js | 1 + 14 files changed, 758 insertions(+) create mode 100644 test-apps/batch-send-coverage/.babelrc create mode 100644 test-apps/batch-send-coverage/README.md create mode 100644 test-apps/batch-send-coverage/cypress.config.js create mode 100644 test-apps/batch-send-coverage/cypress/e2e/spec.cy.js create mode 100644 test-apps/batch-send-coverage/cypress/plugins/index.js create mode 100644 test-apps/batch-send-coverage/cypress/support/commands.js create mode 100644 test-apps/batch-send-coverage/cypress/support/e2e.js create mode 100644 test-apps/batch-send-coverage/index.html create mode 100644 test-apps/batch-send-coverage/main.js create mode 100644 test-apps/batch-send-coverage/package-lock.json create mode 100644 test-apps/batch-send-coverage/package.json create mode 100644 test-apps/batch-send-coverage/second.js create mode 100644 test-apps/batch-send-coverage/third.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 023f9cb0..c68d0561 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -146,6 +146,7 @@ workflows: jobname: - all-files - backend + - batch-send-coverage - before-all-visit - before-each-visit - cra-e2e-and-ct @@ -174,6 +175,7 @@ workflows: - test-code-coverage-plugin - test-all-files - test-backend + - test-batch-send-coverage - test-before-all-visit - test-before-each-visit - test-cra-e2e-and-ct diff --git a/test-apps/batch-send-coverage/.babelrc b/test-apps/batch-send-coverage/.babelrc new file mode 100644 index 00000000..7a016cf8 --- /dev/null +++ b/test-apps/batch-send-coverage/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["istanbul"] +} diff --git a/test-apps/batch-send-coverage/README.md b/test-apps/batch-send-coverage/README.md new file mode 100644 index 00000000..50e4494a --- /dev/null +++ b/test-apps/batch-send-coverage/README.md @@ -0,0 +1,4 @@ +# Test Case: Batch Send Coverage +This test app tests that all expected files are covered when using +the `sendCoverageBatchSize` environment variable in the Cypress +configuration file. diff --git a/test-apps/batch-send-coverage/cypress.config.js b/test-apps/batch-send-coverage/cypress.config.js new file mode 100644 index 00000000..7a336321 --- /dev/null +++ b/test-apps/batch-send-coverage/cypress.config.js @@ -0,0 +1,14 @@ +const { defineConfig } = require('cypress') + +module.exports = defineConfig({ + fixturesFolder: false, + env: { + sendCoverageBatchSize: 1 + }, + e2e: { + setupNodeEvents(on, config) { + return require('./cypress/plugins/index.js')(on, config) + }, + baseUrl: 'http://localhost:1234' + } +}) diff --git a/test-apps/batch-send-coverage/cypress/e2e/spec.cy.js b/test-apps/batch-send-coverage/cypress/e2e/spec.cy.js new file mode 100644 index 00000000..f78611ad --- /dev/null +++ b/test-apps/batch-send-coverage/cypress/e2e/spec.cy.js @@ -0,0 +1,24 @@ +/// +it('works', () => { + cy.visit('/') + cy.contains('Page body') + + cy.window() + .invoke('reverse', 'super') + .should('equal', 'repus') + + cy.window() + .invoke('numsTimesTwo', [1, 2, 3]) + .should('deep.equal', [2, 4, 6]) + + cy.window() + .invoke('add', 2, 3) + .should('equal', 5) + + cy.window() + .invoke('sub', 5, 2) + .should('equal', 3) + + // application's code should be instrumented + cy.window().should('have.property', '__coverage__') +}) diff --git a/test-apps/batch-send-coverage/cypress/plugins/index.js b/test-apps/batch-send-coverage/cypress/plugins/index.js new file mode 100644 index 00000000..101311b6 --- /dev/null +++ b/test-apps/batch-send-coverage/cypress/plugins/index.js @@ -0,0 +1,4 @@ +module.exports = (on, config) => { + require('@cypress/code-coverage/task')(on, config) + return config +} diff --git a/test-apps/batch-send-coverage/cypress/support/commands.js b/test-apps/batch-send-coverage/cypress/support/commands.js new file mode 100644 index 00000000..cc6040de --- /dev/null +++ b/test-apps/batch-send-coverage/cypress/support/commands.js @@ -0,0 +1 @@ +import '@cypress/code-coverage/support' diff --git a/test-apps/batch-send-coverage/cypress/support/e2e.js b/test-apps/batch-send-coverage/cypress/support/e2e.js new file mode 100644 index 00000000..b5c578c9 --- /dev/null +++ b/test-apps/batch-send-coverage/cypress/support/e2e.js @@ -0,0 +1 @@ +require('./commands') diff --git a/test-apps/batch-send-coverage/index.html b/test-apps/batch-send-coverage/index.html new file mode 100644 index 00000000..77686748 --- /dev/null +++ b/test-apps/batch-send-coverage/index.html @@ -0,0 +1,17 @@ + + Page body + + + + // use functions creates in "main.js" + if (add(2, 3) !== 5) { + throw new Error('wrong addition') + } + if (sub(2, 3) !== -1) { + throw new Error('wrong subtraction') + } + if (reverse('foo') !== 'oof') { + throw new Error('wrong string reverse') + } + + diff --git a/test-apps/batch-send-coverage/main.js b/test-apps/batch-send-coverage/main.js new file mode 100644 index 00000000..5dd69be2 --- /dev/null +++ b/test-apps/batch-send-coverage/main.js @@ -0,0 +1,3 @@ +window.add = (a, b) => a + b + +window.sub = (a, b) => a - b diff --git a/test-apps/batch-send-coverage/package-lock.json b/test-apps/batch-send-coverage/package-lock.json new file mode 100644 index 00000000..9afe2cc9 --- /dev/null +++ b/test-apps/batch-send-coverage/package-lock.json @@ -0,0 +1,656 @@ +{ + "name": "example-all-files", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "example-all-files", + "devDependencies": { + "@babel/core": "^7.22.15" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==", + "dev": true, + "license": "ISC" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "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" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/test-apps/batch-send-coverage/package.json b/test-apps/batch-send-coverage/package.json new file mode 100644 index 00000000..96ff4bda --- /dev/null +++ b/test-apps/batch-send-coverage/package.json @@ -0,0 +1,21 @@ +{ + "name": "example-all-files", + "description": "Report all files", + "private": true, + "scripts": { + "cy:run": "cypress run", + "start": "parcel serve index.html", + "start:windows": "npx bin-up parcel serve index.html", + "pretest": "rimraf .nyc_output .cache coverage dist", + "test": "DEBUG=code-coverage DEBUG_DEPTH=10 start-test 1234 cy:run", + "coverage:verify": "npx nyc report --check-coverage true --lines 100", + "coverage:check-files": "check-coverage main.js second.js third.js cypress.config.js --from coverage/coverage-final.json" + }, + "nyc": { + "all": true, + "include": "*.js" + }, + "devDependencies": { + "@babel/core": "^7.22.15" + } +} diff --git a/test-apps/batch-send-coverage/second.js b/test-apps/batch-send-coverage/second.js new file mode 100644 index 00000000..494a0c5f --- /dev/null +++ b/test-apps/batch-send-coverage/second.js @@ -0,0 +1,7 @@ +// this file should be excluded from the final coverage numbers +// using "nyc.exclude" list in package.json +window.reverse = s => + s + .split('') + .reverse() + .join('') diff --git a/test-apps/batch-send-coverage/third.js b/test-apps/batch-send-coverage/third.js new file mode 100644 index 00000000..c13f28df --- /dev/null +++ b/test-apps/batch-send-coverage/third.js @@ -0,0 +1 @@ +window.numsTimesTwo = nums => nums.map(n => n * 2) \ No newline at end of file