From 4b3a55fdfe01bb477d3cc549bafdc0d5754b50c9 Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Mon, 19 Feb 2024 10:12:49 -0800 Subject: [PATCH 1/7] chore: consolidate changes --- .github/workflows/ci-tests.yml | 20 ++- .github/workflows/pr-tests.yml | 76 +++++++++++ .gitignore | 6 +- ci/clean-coverage.js | 8 ++ ci/format-branch-coverage-changes.js | 44 +++++++ ci/run-coverage-on-branch-changes.js | 21 ++++ package-lock.json | 153 +++++++++++++++++++++++ package.json | 19 ++- packages/cache-memory/package.json | 7 +- packages/core/package.json | 5 +- packages/featureserver/package.json | 5 +- packages/logger/package.json | 5 +- packages/output-geoservices/package.json | 4 +- packages/winnow/package.json | 6 +- 14 files changed, 354 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/pr-tests.yml create mode 100644 ci/clean-coverage.js create mode 100644 ci/format-branch-coverage-changes.js create mode 100644 ci/run-coverage-on-branch-changes.js diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index f28849d12..d9bfc08a9 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -1,17 +1,8 @@ -name: CI tests +name: Master CI Tests on: push: branches: [ master ] - pull_request: - branches: - - master - - beta - paths: - - "./.github/**.yml" - - "**/packages/**.js" - - "**/packages/**/package.json" - - "test/**/*.js" jobs: pr-tests: @@ -24,7 +15,14 @@ jobs: # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - - uses: actions/checkout@v3 + - name: Checkout actions + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: | + git checkout -b master origin/master + git checkout - + - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml new file mode 100644 index 000000000..6b0eea3c6 --- /dev/null +++ b/.github/workflows/pr-tests.yml @@ -0,0 +1,76 @@ +name: PR CI + +on: + pull_request: + branches: + - master + - beta + paths: + - "./.github/**.yml" + - "**/packages/**.js" + - "**/packages/**/package.json" + - "test/**/*.js" + +jobs: + pr-tests: + name: Install, lint, test + runs-on: ${{ matrix.os }} + strategy: + matrix: + node-version: [18.x] + os: [ubuntu-latest, windows-latest] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - name: Checkout actions + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: | + git checkout -b master origin/master + git checkout - + + - uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Install npm 7 + run: npm i -g npm@7 --registry=https://registry.npmjs.org + + - name: Install + run: npm ci + + - name: Lint + run: npm run lint:ci + + - name: Unit tests + run: npm test --workspaces + + - name: E2E tests + run: npm run test:e2e + + - name: Run Coverage + if: ${{ matrix.os == 'ubuntu-latest' }} + run: npm run clean:cov && npm run test:cov:changes && npm run cov:md + + - name: Run Coverage + if: ${{ matrix.os == 'ubuntu-latest' }} + run: cat coverage_changes/coverage-summary.json + + - name: Find previous coverage comment + if: ${{ matrix.os == 'ubuntu-latest' }} + uses: peter-evans/find-comment@v1 + id: findcomment + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: Coverage Report + + - name: Create or update comment + if: ${{ matrix.os == 'ubuntu-latest' }} + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.findcomment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body-path: ci/branch-coverage-changes.md + edit-mode: replace diff --git a/.gitignore b/.gitignore index 034b0b011..072d28d28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,13 @@ node_modules coverage coverage_unit +coverage_changes +coverage.json .nyc_output .nyc_output_unit +.nyc_output_changes .vscode **/.DS_Store .env -.npmrc \ No newline at end of file +.npmrc +ci/branch-coverage-changes.md \ No newline at end of file diff --git a/ci/clean-coverage.js b/ci/clean-coverage.js new file mode 100644 index 000000000..579f5f8bc --- /dev/null +++ b/ci/clean-coverage.js @@ -0,0 +1,8 @@ +const shell = require('shelljs'); + +shell.rm('-rf', 'coverage'); +shell.rm('-rf', 'coverage_unit'); +shell.rm('-rf', 'coverage_changes'); +shell.rm('-rf', '.nyc_output'); +shell.rm('-rf', '.nyc_output_unit'); +shell.rm('-rf', '.nyc_output_changes'); \ No newline at end of file diff --git a/ci/format-branch-coverage-changes.js b/ci/format-branch-coverage-changes.js new file mode 100644 index 000000000..207b0b669 --- /dev/null +++ b/ci/format-branch-coverage-changes.js @@ -0,0 +1,44 @@ +const { writeFileSync } = require('fs'); +const json2md = require('json2md'); +const coverageSummary = require('../coverage_changes/coverage-summary.json'); + +const rows = Object.entries(coverageSummary) + .filter(([filePath]) => { + return filePath !== 'total'; + }) + .map(([filePath, value]) => { + const packagePath = filePath.split('packages')[1]; + return [ + `packages${packagePath}`, + getValue(value.statements), + getValue(value.branches), + getValue(value.functions), + getValue(value.lines), + ]; + }); + +const headers = ['File Path', 'Statements', 'Branches', 'Functions', 'Lines']; +const markdown = json2md([{ h2: 'Coverage Report'}, { table: { headers, rows } }]); +const aligned = markdown.replace('| --------- | ---------- | -------- | --------- | ----- |', '| :--------- | ----------: | --------: | ---------: | -----: |'); +writeFileSync('ci/branch-coverage-changes.md', aligned, 'utf8'); + +function getValue(input) { + if (input.pct === 100) { + return `${input.pct} ![green](https://github.com/koopjs/koop/assets/4369192/fd82d4b7-7f6e-448c-a56c-82ac6781a629)`; + } + + if (input.pct > 90) { + return `${input.pct} ![yellow-green](https://github.com/koopjs/koop/assets/4369192/683b2df8-7379-4e4f-bb36-f5e20b2631d6)`; + } + + if (input.pct > 80) { + return `${input.pct} ![yellow](https://github.com/koopjs/koop/assets/4369192/d5214a5c-c5a9-4449-82ca-8a4e922ef9ef)`; + } + + if (input.pct > 70) { + return `${input.pct} ![orange](https://github.com/koopjs/koop/assets/4369192/8651f10c-e986-491d-8b51-bc559aac88a2)`; + } + + return `${input.pct} ![red](https://github.com/koopjs/koop/assets/4369192/83e9c13e-0548-4b97-a116-6e49f77a8f38)`; +} + diff --git a/ci/run-coverage-on-branch-changes.js b/ci/run-coverage-on-branch-changes.js new file mode 100644 index 000000000..c491fa829 --- /dev/null +++ b/ci/run-coverage-on-branch-changes.js @@ -0,0 +1,21 @@ +const shell = require('shelljs'); +const git = require('simple-git'); + +git().diffSummary(['--name-only', '--relative', 'origin/master']) + .then(summary => { + const {files} = summary; + const srcFiles = files.filter(({ file }) => { + return file.endsWith('.js') && !file.endsWith('spec.js'); + }).map(({ file }) => { + return `-n ${file}`; + }); + + if (srcFiles.length === 0) { + process.exit(); + } + + const cmd = `nyc -r=json-summary --report-dir=coverage_changes --temp-dir=.nyc_output_changes ${srcFiles.join(' ')} npm run test:quiet`; + shell.exec(cmd); + }); + +//console.log(diff) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3fb2119ae..4ff187c3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,11 +36,14 @@ "husky": "^8.0.3", "jest": "^29.7.0", "jest-coverage-badges-ng": "^1.0.1", + "json2md": "^2.0.1", "lerna": "^8.1.2", "lerna-changelog": "^2.2.0", "lint-staged": "^15.2.2", "nyc": "^15.1.0", "prettier": "^3.2.5", + "shelljs": "^0.8.5", + "simple-git": "^3.22.0", "snyk": "^1.1280.0", "supertest": "^6.3.4" } @@ -2996,6 +2999,21 @@ "resolved": "packages/winnow", "link": true }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "node_modules/@lerna/create": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.2.tgz", @@ -9976,6 +9994,12 @@ "node": ">=8" } }, + "node_modules/indento": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz", + "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==", + "dev": true + }, "node_modules/infer-owner": { "version": "1.0.4", "dev": true, @@ -10173,6 +10197,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/ip": { "version": "2.0.0", "dev": true, @@ -12618,6 +12651,15 @@ "dev": true, "license": "ISC" }, + "node_modules/json2md": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.1.tgz", + "integrity": "sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==", + "dev": true, + "dependencies": { + "indento": "^1.1.13" + } + }, "node_modules/json5": { "version": "2.2.3", "license": "MIT", @@ -18424,6 +18466,18 @@ "node": ">=8.10.0" } }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/redent": { "version": "3.0.0", "dev": true, @@ -18928,6 +18982,23 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/should": { "version": "13.2.3", "dev": true, @@ -19182,6 +19253,21 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "dev": true, + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/simple-statistics": { "version": "7.8.3", "license": "ISC", @@ -23994,6 +24080,21 @@ "wkt-parser": "^1.3.3" } }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "requires": { + "debug": "^4.1.1" + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true + }, "@lerna/create": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.2.tgz", @@ -28910,6 +29011,12 @@ "version": "4.0.0", "dev": true }, + "indento": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz", + "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==", + "dev": true + }, "infer-owner": { "version": "1.0.4", "dev": true @@ -29056,6 +29163,12 @@ "side-channel": "^1.0.4" } }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, "ip": { "version": "2.0.0", "dev": true @@ -30750,6 +30863,15 @@ "version": "5.0.1", "dev": true }, + "json2md": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.1.tgz", + "integrity": "sha512-VbwmZ83qmUfKBS2pUOHlzNKEZFPBeJSbzEok3trMYyboZUgdHNn1XZfc1uT8UZs1GHCrmRUBXCfqw4YmmQuOhw==", + "dev": true, + "requires": { + "indento": "^1.1.13" + } + }, "json5": { "version": "2.2.3" }, @@ -34790,6 +34912,15 @@ "picomatch": "^2.2.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, "redent": { "version": "3.0.0", "dev": true, @@ -35121,6 +35252,17 @@ "version": "3.0.0", "dev": true }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "should": { "version": "13.2.3", "dev": true, @@ -35302,6 +35444,17 @@ "simple-concat": "^1.0.0" } }, + "simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "dev": true, + "requires": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + } + }, "simple-statistics": { "version": "7.8.3" }, diff --git a/package.json b/package.json index 88bdd7b8c..bd36aa025 100644 --- a/package.json +++ b/package.json @@ -11,18 +11,24 @@ "commit": "cz", "precommit": "lint-staged && npm test --workspaces", "test": "npm test --workspaces", - "test:cov": "npm run test:cov --workspaces && npm run cov:compile && npm run cov:report", + "test:cov": "npm run test:cov --workspaces --silent && npm run cov:compile:full && npm run cov:report:full", "test:cov:unit": "npm run test:cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", - "cov:compile": "nyc merge packages/cache-memory/.nyc_output .nyc_output/cache-memory.json && nyc merge packages/featureserver/.nyc_output .nyc_output/featureserver.json && nyc merge packages/core/.nyc_output .nyc_output/core.json && nyc merge packages/logger/.nyc_output .nyc_output/logger.json && cp packages/output-geoservices/coverage/coverage-final.json .nyc_output/output-geoservices.json && nyc merge packages/winnow/.nyc_output .nyc_output/winnow.json", - "cov:compile:unit": "nyc merge packages/cache-memory/.nyc_output .nyc_output_unit/cache-memory.json && nyc merge packages/featureserver/.nyc_output_unit .nyc_output_unit/featureserver.json && nyc merge packages/core/.nyc_output .nyc_output_unit/core.json && nyc merge packages/logger/.nyc_output .nyc_output_unit/logger.json && cp packages/output-geoservices/coverage/coverage-final.json .nyc_output_unit/output-geoservices.json && nyc merge packages/winnow/.nyc_output_unit .nyc_output_unit/winnow.json", - "cov:report": "nyc report --reporter=html", + "test:cov:changes": "npm run test:cov:changes --workspaces --silent && npm run cov:compile:changes && npm run cov:report:changes", + "cov:compile": "nyc merge packages/cache-memory/$OUT_DIR $OUT_DIR/cache-memory.json 2>/dev/null || : && nyc merge packages/featureserver/$OUT_DIR $OUT_DIR/featureserver.json 2>/dev/null || : && nyc merge packages/core/$OUT_DIR $OUT_DIR/core.json 2>/dev/null || : && nyc merge packages/logger/$OUT_DIR $OUT_DIR/logger.json 2>/dev/null || : && cp packages/output-geoservices/$GEO_DIR/coverage-final.json $OUT_DIR/output-geoservices.json 2>/dev/null || : && nyc merge packages/winnow/$OUT_DIR $OUT_DIR/winnow.json 2>/dev/null || :", + "cov:compile:full": "OUT_DIR=.nyc_output GEO_DIR=coverage npm run cov:compile --silent", + "cov:compile:unit": "OUT_DIR=.nyc_output_unit GEO_DIR=coverage npm run cov:compile", + "cov:compile:changes": "OUT_DIR=.nyc_output_changes GEO_DIR=coverage_changes npm run cov:compile", + "cov:report:full": "nyc report --reporter=html", "cov:report:unit": "nyc report --temp-dir=.nyc_output_unit --report-dir=coverage_unit --reporter=html", + "cov:report:changes": "nyc report --temp-dir=.nyc_output_changes --report-dir=coverage_changes --reporter=json-summary", "test:e2e": "cross-env SUPPRESS_NO_CONFIG_WARNING=true DATA_DIR=./test/provider-data jest", "version": "changeset version", "release:npm": "changeset publish", "release:github": "node gh-release.js", "changeset:add": "changeset", - "demo": "node demo/index.js" + "demo": "node demo/index.js", + "clean:cov": "node ci/clean-coverage.js && npm run clean:cov --workspaces", + "cov:md": "node ci/format-branch-coverage-changes.js" }, "repository": { "type": "git", @@ -62,11 +68,14 @@ "husky": "^8.0.3", "jest": "^29.7.0", "jest-coverage-badges-ng": "^1.0.1", + "json2md": "^2.0.1", "lerna": "^8.1.2", "lerna-changelog": "^2.2.0", "lint-staged": "^15.2.2", "nyc": "^15.1.0", "prettier": "^3.2.5", + "shelljs": "^0.8.5", + "simple-git": "^3.22.0", "snyk": "^1.1280.0", "supertest": "^6.3.4" }, diff --git a/packages/cache-memory/package.json b/packages/cache-memory/package.json index 109f7181b..65c0539b6 100644 --- a/packages/cache-memory/package.json +++ b/packages/cache-memory/package.json @@ -4,10 +4,13 @@ "description": "An in-memory cache for KOop", "main": "src/index.js", "scripts": { - "test": "tape src/**/*.spec.js | tap-spec", + "test": "tape src/**/*.spec.js | tap-spec > /dev/null", "test:cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", "test:cov": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg" + "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "test:quiet": "npm test > /dev/null", + "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "clean:cov": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", diff --git a/packages/core/package.json b/packages/core/package.json index ca1443fa8..c2136d498 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -70,6 +70,9 @@ "test": "mocha '**/*.spec.js' ", "test:cov:unit": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", "test:cov": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg" + "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "test:quiet": "npm test > /dev/null", + "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "clean:cov": "node ../../ci/clean-coverage.js" } } diff --git a/packages/featureserver/package.json b/packages/featureserver/package.json index 24abce5a7..9e8fe7f56 100644 --- a/packages/featureserver/package.json +++ b/packages/featureserver/package.json @@ -12,7 +12,10 @@ "test:cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", "test:cov:unit:loc": "nyc -r=html --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg" + "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", + "test:quiet": "npm test > /dev/null", + "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "clean:cov": "node ../../ci/clean-coverage.js" }, "contributors": [ { diff --git a/packages/logger/package.json b/packages/logger/package.json index 1a27be24d..2dc2693f9 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -7,7 +7,10 @@ "test": "tape src/**/*.spec.js | tap-spec", "test:cov": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", "test:cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg" + "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "test:quiet": "npm test > /dev/null", + "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "clean:cov": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", diff --git a/packages/output-geoservices/package.json b/packages/output-geoservices/package.json index 1f8c2dd6b..f2d83de5a 100644 --- a/packages/output-geoservices/package.json +++ b/packages/output-geoservices/package.json @@ -7,7 +7,9 @@ "test": "jest", "test:cov:unit": "jest --coverage && npm run cov:badge", "test:cov": "jest --coverage && npm run cov:badge", - "cov:badge": "coverage-badges --output ./coverage.svg" + "cov:badge": "coverage-badges --output ./coverage.svg", + "test:cov:changes": "jest --coverage --changedSince=master --coverageDirectory=coverage_changes --silent > /dev/null", + "clean:cov": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", diff --git a/packages/winnow/package.json b/packages/winnow/package.json index 4af240819..e8839c38a 100644 --- a/packages/winnow/package.json +++ b/packages/winnow/package.json @@ -10,11 +10,13 @@ "test": "tape **/*.spec.js | tap-spec", "test:cov": "nyc -r=json-summary tape '**/*.spec.js' | tap-spec && npm run cov:badge && npm run test:cov:unit", "test:cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", - "test:cov:unit:loc": "nyc -r=html --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", "cov:badge": "coverage-badges-cli --output ./coverage.svg", "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", "benchmark": "node benchmark/index.js", - "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt" + "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt", + "test:quiet": "npm test > /dev/null", + "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "clean:cov": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", From 4a0f31256bbab0108ccccbfa842a9775c4dc0ae3 Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Mon, 19 Feb 2024 11:11:51 -0800 Subject: [PATCH 2/7] chore: clean up package scripts --- .github/workflows/pr-tests.yml | 2 +- package.json | 16 ++++++++-------- packages/cache-memory/package.json | 10 +++++----- packages/core/package.json | 10 +++++----- packages/featureserver/package.json | 13 ++++++------- packages/logger/package.json | 10 +++++----- packages/output-geoservices/package.json | 8 ++++---- packages/winnow/package.json | 12 ++++++------ 8 files changed, 40 insertions(+), 41 deletions(-) diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 6b0eea3c6..f9c1dafd7 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -51,7 +51,7 @@ jobs: - name: Run Coverage if: ${{ matrix.os == 'ubuntu-latest' }} - run: npm run clean:cov && npm run test:cov:changes && npm run cov:md + run: npm run cov:clean && mkdir .nyc_output_changes && npm run cov:changes && npm run cov:changes:2:md - name: Run Coverage if: ${{ matrix.os == 'ubuntu-latest' }} diff --git a/package.json b/package.json index bd36aa025..0d0785402 100644 --- a/package.json +++ b/package.json @@ -11,24 +11,24 @@ "commit": "cz", "precommit": "lint-staged && npm test --workspaces", "test": "npm test --workspaces", - "test:cov": "npm run test:cov --workspaces --silent && npm run cov:compile:full && npm run cov:report:full", - "test:cov:unit": "npm run test:cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", - "test:cov:changes": "npm run test:cov:changes --workspaces --silent && npm run cov:compile:changes && npm run cov:report:changes", - "cov:compile": "nyc merge packages/cache-memory/$OUT_DIR $OUT_DIR/cache-memory.json 2>/dev/null || : && nyc merge packages/featureserver/$OUT_DIR $OUT_DIR/featureserver.json 2>/dev/null || : && nyc merge packages/core/$OUT_DIR $OUT_DIR/core.json 2>/dev/null || : && nyc merge packages/logger/$OUT_DIR $OUT_DIR/logger.json 2>/dev/null || : && cp packages/output-geoservices/$GEO_DIR/coverage-final.json $OUT_DIR/output-geoservices.json 2>/dev/null || : && nyc merge packages/winnow/$OUT_DIR $OUT_DIR/winnow.json 2>/dev/null || :", + "test:e2e": "cross-env SUPPRESS_NO_CONFIG_WARNING=true DATA_DIR=./test/provider-data jest", + "cov:full": "npm run cov:full --workspaces --silent && npm run cov:compile:full && npm run cov:report:full", + "cov:unit": "npm run cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", + "cov:changes": "npm run cov:changes --workspaces --silent && npm run cov:compile:changes && npm run cov:report:changes", + "cov:compile": "rm -rf .nyc_output_changes && nyc merge packages/cache-memory/$OUT_DIR $OUT_DIR/cache-memory.json 2>/dev/null || : && nyc merge packages/featureserver/$OUT_DIR $OUT_DIR/featureserver.json 2>/dev/null || : && nyc merge packages/core/$OUT_DIR $OUT_DIR/core.json 2>/dev/null || : && nyc merge packages/logger/$OUT_DIR $OUT_DIR/logger.json 2>/dev/null || : && cp packages/output-geoservices/$GEO_DIR/coverage-final.json $OUT_DIR/output-geoservices.json 2>/dev/null || : && nyc merge packages/winnow/$OUT_DIR $OUT_DIR/winnow.json 2>/dev/null || :", "cov:compile:full": "OUT_DIR=.nyc_output GEO_DIR=coverage npm run cov:compile --silent", "cov:compile:unit": "OUT_DIR=.nyc_output_unit GEO_DIR=coverage npm run cov:compile", "cov:compile:changes": "OUT_DIR=.nyc_output_changes GEO_DIR=coverage_changes npm run cov:compile", "cov:report:full": "nyc report --reporter=html", "cov:report:unit": "nyc report --temp-dir=.nyc_output_unit --report-dir=coverage_unit --reporter=html", "cov:report:changes": "nyc report --temp-dir=.nyc_output_changes --report-dir=coverage_changes --reporter=json-summary", - "test:e2e": "cross-env SUPPRESS_NO_CONFIG_WARNING=true DATA_DIR=./test/provider-data jest", + "cov:clean": "node ci/clean-coverage.js && npm run cov:clean --workspaces", + "cov:changes:2:md": "node ci/format-branch-coverage-changes.js", "version": "changeset version", "release:npm": "changeset publish", "release:github": "node gh-release.js", "changeset:add": "changeset", - "demo": "node demo/index.js", - "clean:cov": "node ci/clean-coverage.js && npm run clean:cov --workspaces", - "cov:md": "node ci/format-branch-coverage-changes.js" + "demo": "node demo/index.js" }, "repository": { "type": "git", diff --git a/packages/cache-memory/package.json b/packages/cache-memory/package.json index 65c0539b6..3278c1ae5 100644 --- a/packages/cache-memory/package.json +++ b/packages/cache-memory/package.json @@ -5,12 +5,12 @@ "main": "src/index.js", "scripts": { "test": "tape src/**/*.spec.js | tap-spec > /dev/null", - "test:cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "test:cov": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", "test:quiet": "npm test > /dev/null", - "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "clean:cov": "node ../../ci/clean-coverage.js" + "cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", + "cov:full": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", + "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "cov:clean": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", diff --git a/packages/core/package.json b/packages/core/package.json index c2136d498..4431cd1bf 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -68,11 +68,11 @@ }, "scripts": { "test": "mocha '**/*.spec.js' ", - "test:cov:unit": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "test:cov": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", "test:quiet": "npm test > /dev/null", - "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "clean:cov": "node ../../ci/clean-coverage.js" + "cov:unit": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", + "cov:full": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", + "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "cov:clean": "node ../../ci/clean-coverage.js" } } diff --git a/packages/featureserver/package.json b/packages/featureserver/package.json index 9e8fe7f56..28f63669f 100644 --- a/packages/featureserver/package.json +++ b/packages/featureserver/package.json @@ -8,14 +8,13 @@ }, "scripts": { "test": "mocha '**/*.spec.js' --recursive -t 5000", - "test:cov": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge && npm run test:cov:unit", - "test:cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", - "test:cov:unit:loc": "nyc -r=html --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", "test:quiet": "npm test > /dev/null", - "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "clean:cov": "node ../../ci/clean-coverage.js" + "cov:full": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge:full && npm run cov:unit", + "cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", + "cov:badge:full": "coverage-badges-cli --output ./coverage.svg", + "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", + "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "cov:clean": "node ../../ci/clean-coverage.js" }, "contributors": [ { diff --git a/packages/logger/package.json b/packages/logger/package.json index 2dc2693f9..9fa4061c9 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -5,12 +5,12 @@ "main": "src/index.js", "scripts": { "test": "tape src/**/*.spec.js | tap-spec", - "test:cov": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "test:cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", "test:quiet": "npm test > /dev/null", - "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "clean:cov": "node ../../ci/clean-coverage.js" + "cov:full": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", + "cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", + "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "cov:clean": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", diff --git a/packages/output-geoservices/package.json b/packages/output-geoservices/package.json index f2d83de5a..2822a34c4 100644 --- a/packages/output-geoservices/package.json +++ b/packages/output-geoservices/package.json @@ -5,11 +5,11 @@ "main": "src/index.js", "scripts": { "test": "jest", - "test:cov:unit": "jest --coverage && npm run cov:badge", - "test:cov": "jest --coverage && npm run cov:badge", + "cov:unit": "jest --coverage && npm run cov:badge", + "cov:full": "jest --coverage && npm run cov:badge", "cov:badge": "coverage-badges --output ./coverage.svg", - "test:cov:changes": "jest --coverage --changedSince=master --coverageDirectory=coverage_changes --silent > /dev/null", - "clean:cov": "node ../../ci/clean-coverage.js" + "cov:changes": "jest --coverage --changedSince=master --coverageDirectory=coverage_changes --silent > /dev/null", + "cov:clean": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", diff --git a/packages/winnow/package.json b/packages/winnow/package.json index e8839c38a..3ced15e70 100644 --- a/packages/winnow/package.json +++ b/packages/winnow/package.json @@ -8,15 +8,15 @@ }, "scripts": { "test": "tape **/*.spec.js | tap-spec", - "test:cov": "nyc -r=json-summary tape '**/*.spec.js' | tap-spec && npm run cov:badge && npm run test:cov:unit", - "test:cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", + "test:quiet": "npm test > /dev/null", + "cov:full": "nyc -r=json-summary tape '**/*.spec.js' | tap-spec && npm run cov:badge:full && npm run test:cov:unit", + "cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", + "cov:badge:full": "coverage-badges-cli --output ./coverage.svg", "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", "benchmark": "node benchmark/index.js", "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt", - "test:quiet": "npm test > /dev/null", - "test:cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "clean:cov": "node ../../ci/clean-coverage.js" + "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", + "cov:clean": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", From 9db2ca1de79fd6594fd543b2a61595cd642ecd96 Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Mon, 19 Feb 2024 11:23:29 -0800 Subject: [PATCH 3/7] chore: fix workflow --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0d0785402..9e560c2a0 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,10 @@ "cov:full": "npm run cov:full --workspaces --silent && npm run cov:compile:full && npm run cov:report:full", "cov:unit": "npm run cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", "cov:changes": "npm run cov:changes --workspaces --silent && npm run cov:compile:changes && npm run cov:report:changes", - "cov:compile": "rm -rf .nyc_output_changes && nyc merge packages/cache-memory/$OUT_DIR $OUT_DIR/cache-memory.json 2>/dev/null || : && nyc merge packages/featureserver/$OUT_DIR $OUT_DIR/featureserver.json 2>/dev/null || : && nyc merge packages/core/$OUT_DIR $OUT_DIR/core.json 2>/dev/null || : && nyc merge packages/logger/$OUT_DIR $OUT_DIR/logger.json 2>/dev/null || : && cp packages/output-geoservices/$GEO_DIR/coverage-final.json $OUT_DIR/output-geoservices.json 2>/dev/null || : && nyc merge packages/winnow/$OUT_DIR $OUT_DIR/winnow.json 2>/dev/null || :", + "cov:compile": "nyc merge packages/cache-memory/$OUT_DIR $OUT_DIR/cache-memory.json 2>/dev/null || : && nyc merge packages/featureserver/$OUT_DIR $OUT_DIR/featureserver.json 2>/dev/null || : && nyc merge packages/core/$OUT_DIR $OUT_DIR/core.json 2>/dev/null || : && nyc merge packages/logger/$OUT_DIR $OUT_DIR/logger.json 2>/dev/null || : && cp packages/output-geoservices/$GEO_DIR/coverage-final.json $OUT_DIR/output-geoservices.json 2>/dev/null || : && nyc merge packages/winnow/$OUT_DIR $OUT_DIR/winnow.json 2>/dev/null || :", "cov:compile:full": "OUT_DIR=.nyc_output GEO_DIR=coverage npm run cov:compile --silent", "cov:compile:unit": "OUT_DIR=.nyc_output_unit GEO_DIR=coverage npm run cov:compile", - "cov:compile:changes": "OUT_DIR=.nyc_output_changes GEO_DIR=coverage_changes npm run cov:compile", + "cov:compile:changes": "npm run cov:clean && mkdir .nyc_output_changes && OUT_DIR=.nyc_output_changes GEO_DIR=coverage_changes npm run cov:compile", "cov:report:full": "nyc report --reporter=html", "cov:report:unit": "nyc report --temp-dir=.nyc_output_unit --report-dir=coverage_unit --reporter=html", "cov:report:changes": "nyc report --temp-dir=.nyc_output_changes --report-dir=coverage_changes --reporter=json-summary", From 0ed7c826f9104728000bed9bf29af17d3af034ef Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Mon, 19 Feb 2024 11:43:52 -0800 Subject: [PATCH 4/7] chore: test quiet option --- .github/workflows/pr-tests.yml | 2 +- package.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index f9c1dafd7..9b68c12ba 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -44,7 +44,7 @@ jobs: run: npm run lint:ci - name: Unit tests - run: npm test --workspaces + run: npm test:quiet - name: E2E tests run: npm run test:e2e diff --git a/package.json b/package.json index 9e560c2a0..dd7b37684 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "commit": "cz", "precommit": "lint-staged && npm test --workspaces", "test": "npm test --workspaces", + "test:quiet": "npm test:quiet --workspaces", "test:e2e": "cross-env SUPPRESS_NO_CONFIG_WARNING=true DATA_DIR=./test/provider-data jest", "cov:full": "npm run cov:full --workspaces --silent && npm run cov:compile:full && npm run cov:report:full", "cov:unit": "npm run cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", From 1db07b5087953a9b0c689eb537c068293125f92b Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Fri, 23 Feb 2024 11:00:10 -0800 Subject: [PATCH 5/7] chore: consolidate ci scripts --- .coverage_json/coverage-summary.json | 145 +++++++++++++++++++++++ .github/workflows/pr-tests.yml | 8 +- .gitignore | 12 +- ci/clean-coverage.js | 9 +- ci/format-branch-coverage-changes.js | 74 ++++++++---- ci/merge-coverage-changes.js | 35 ++++++ ci/run-coverage-on-branch-changes.js | 51 ++++++-- ci/run-report-on-branch-changes.js | 9 ++ ci/run-test-coverage-analysis.js | 45 +++++++ jest.config.js | 2 +- package-lock.json | 12 +- package.json | 20 ++-- packages/cache-memory/package.json | 8 +- packages/core/package.json | 8 +- packages/featureserver/coverage-unit.svg | 8 +- packages/featureserver/coverage.svg | 8 +- packages/featureserver/package.json | 8 +- packages/logger/package.json | 8 +- packages/output-geoservices/coverage.svg | 14 +-- packages/output-geoservices/package.json | 20 ++-- packages/winnow/coverage-unit.svg | 14 +-- packages/winnow/package.json | 8 +- 22 files changed, 391 insertions(+), 135 deletions(-) create mode 100644 .coverage_json/coverage-summary.json create mode 100644 ci/merge-coverage-changes.js create mode 100644 ci/run-report-on-branch-changes.js create mode 100644 ci/run-test-coverage-analysis.js diff --git a/.coverage_json/coverage-summary.json b/.coverage_json/coverage-summary.json new file mode 100644 index 000000000..bd96d8ab5 --- /dev/null +++ b/.coverage_json/coverage-summary.json @@ -0,0 +1,145 @@ +{"total": {"lines":{"total":2755,"covered":2399,"skipped":0,"pct":87.07},"statements":{"total":2846,"covered":2460,"skipped":0,"pct":86.43},"functions":{"total":514,"covered":440,"skipped":0,"pct":85.6},"branches":{"total":1648,"covered":1263,"skipped":0,"pct":76.63},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/cache-memory/src/index.js": {"lines":{"total":23,"covered":23,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/index.js": {"lines":{"total":56,"covered":56,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":56,"covered":56,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/extend-controller.js": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/extend-model.js": {"lines":{"total":113,"covered":113,"skipped":0,"pct":100},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":115,"covered":115,"skipped":0,"pct":100},"branches":{"total":75,"covered":75,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/index.js": {"lines":{"total":57,"covered":57,"skipped":0,"pct":100},"functions":{"total":10,"covered":10,"skipped":0,"pct":100},"statements":{"total":57,"covered":57,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/provider-route.js": {"lines":{"total":17,"covered":17,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/helpers/compose-route-path.js": {"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":18,"covered":18,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/helpers/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/core/src/data-provider/helpers/route-joiner.js": {"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/index.js": {"lines":{"total":3,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":3,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/layer-metadata.js": {"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/layers-metadata.js": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/log-manager.js": {"lines":{"total":12,"covered":5,"skipped":0,"pct":41.66},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":12,"covered":5,"skipped":0,"pct":41.66},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/metadata-defaults.js": {"lines":{"total":29,"covered":28,"skipped":0,"pct":96.55},"functions":{"total":9,"covered":8,"skipped":0,"pct":88.88},"statements":{"total":29,"covered":28,"skipped":0,"pct":96.55},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/queryRelatedRecords.js": {"lines":{"total":26,"covered":4,"skipped":0,"pct":15.38},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":27,"covered":4,"skipped":0,"pct":14.81},"branches":{"total":16,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/rest-info-route-handler.js": {"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/route.js": {"lines":{"total":56,"covered":48,"skipped":0,"pct":85.71},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":56,"covered":48,"skipped":0,"pct":85.71},"branches":{"total":34,"covered":26,"skipped":0,"pct":76.47}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/server-info-route-handler.js": {"lines":{"total":54,"covered":53,"skipped":0,"pct":98.14},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":54,"covered":53,"skipped":0,"pct":98.14},"branches":{"total":46,"covered":46,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/generate-renderer/color-ramp.js": {"lines":{"total":23,"covered":23,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":21,"covered":21,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/generate-renderer/create-symbol.js": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/generate-renderer/index.js": {"lines":{"total":42,"covered":42,"skipped":0,"pct":100},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":43,"covered":43,"skipped":0,"pct":100},"branches":{"total":17,"covered":17,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/generate-renderer/validate-classification-definition.js": {"lines":{"total":32,"covered":32,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":32,"covered":32,"skipped":0,"pct":100},"branches":{"total":18,"covered":18,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/data-type-utils.js": {"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":16,"covered":16,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/errors.js": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/esri-units-lookup.js": {"lines":{"total":13,"covered":12,"skipped":0,"pct":92.3},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":13,"covered":12,"skipped":0,"pct":92.3},"branches":{"total":16,"covered":15,"skipped":0,"pct":93.75}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/feature-layer-metadata.js": {"lines":{"total":49,"covered":46,"skipped":0,"pct":93.87},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":49,"covered":46,"skipped":0,"pct":93.87},"branches":{"total":19,"covered":14,"skipped":0,"pct":73.68}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/get-collection-crs.js": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":15,"covered":15,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/get-geometry-type-from-geojson.js": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/get-spatial-reference.js": {"lines":{"total":11,"covered":10,"skipped":0,"pct":90.9},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":13,"covered":11,"skipped":0,"pct":84.61},"branches":{"total":14,"covered":11,"skipped":0,"pct":78.57}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/is-geojson-table.js": {"lines":{"total":9,"covered":8,"skipped":0,"pct":88.88},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":12,"covered":7,"skipped":0,"pct":58.33}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/normalize-extent.js": {"lines":{"total":21,"covered":21,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/normalize-input-data.js": {"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":13,"covered":13,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/normalize-request-params.js": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":16,"covered":16,"skipped":0,"pct":100},"branches":{"total":9,"covered":9,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/normalize-spatial-reference.js": {"lines":{"total":43,"covered":43,"skipped":0,"pct":100},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":46,"covered":45,"skipped":0,"pct":97.82},"branches":{"total":34,"covered":31,"skipped":0,"pct":91.17}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/renderers.js": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/server-metadata.js": {"lines":{"total":25,"covered":25,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/table-layer-metadata.js": {"lines":{"total":58,"covered":57,"skipped":0,"pct":98.27},"functions":{"total":15,"covered":15,"skipped":0,"pct":100},"statements":{"total":58,"covered":57,"skipped":0,"pct":98.27},"branches":{"total":44,"covered":35,"skipped":0,"pct":79.54}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/validate-inputs.js": {"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":24,"covered":24,"skipped":0,"pct":100},"branches":{"total":9,"covered":8,"skipped":0,"pct":88.88}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/constants.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/esri-type-utils.js": {"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/field-classes.js": {"lines":{"total":51,"covered":50,"skipped":0,"pct":98.03},"functions":{"total":9,"covered":9,"skipped":0,"pct":100},"statements":{"total":51,"covered":50,"skipped":0,"pct":98.03},"branches":{"total":20,"covered":17,"skipped":0,"pct":85}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/fields.js": {"lines":{"total":33,"covered":32,"skipped":0,"pct":96.96},"functions":{"total":13,"covered":13,"skipped":0,"pct":100},"statements":{"total":35,"covered":34,"skipped":0,"pct":97.14},"branches":{"total":24,"covered":22,"skipped":0,"pct":91.66}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/index.js": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/layer-fields.js": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/query-fields.js": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":6,"covered":4,"skipped":0,"pct":66.66}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/helpers/fields/statistics-fields.js": {"lines":{"total":35,"covered":34,"skipped":0,"pct":97.14},"functions":{"total":14,"covered":14,"skipped":0,"pct":100},"statements":{"total":37,"covered":36,"skipped":0,"pct":97.29},"branches":{"total":25,"covered":20,"skipped":0,"pct":80}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/filter-and-transform.js": {"lines":{"total":30,"covered":30,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":30,"covered":30,"skipped":0,"pct":100},"branches":{"total":17,"covered":16,"skipped":0,"pct":94.11}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/index.js": {"lines":{"total":44,"covered":44,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":44,"covered":44,"skipped":0,"pct":100},"branches":{"total":35,"covered":33,"skipped":0,"pct":94.28}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/log-provider-data-warnings.js": {"lines":{"total":36,"covered":35,"skipped":0,"pct":97.22},"functions":{"total":11,"covered":11,"skipped":0,"pct":100},"statements":{"total":36,"covered":35,"skipped":0,"pct":97.22},"branches":{"total":47,"covered":46,"skipped":0,"pct":97.87}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/render-count-and-extent.js": {"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/render-features.js": {"lines":{"total":21,"covered":17,"skipped":0,"pct":80.95},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":17,"skipped":0,"pct":80.95},"branches":{"total":25,"covered":17,"skipped":0,"pct":68}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/render-precalculated-statistics.js": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/render-statistics.js": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/query/validate-query-request-parameters.js": {"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/general-response-handler.js": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/query-response-handler.js": {"lines":{"total":10,"covered":10,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":10,"covered":10,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-callback.js": {"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pretty-json.js": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/get-geometry-transform.js": {"lines":{"total":25,"covered":25,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/index.js": {"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/transform-features-for-pbf.js": {"lines":{"total":17,"covered":17,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-attributes.js": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/featureserver/src/response-handlers/helpers/send-pbf/transform-to-pbf-geometry.js": {"lines":{"total":66,"covered":66,"skipped":0,"pct":100},"functions":{"total":22,"covered":22,"skipped":0,"pct":100},"statements":{"total":69,"covered":69,"skipped":0,"pct":100},"branches":{"total":22,"covered":22,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/logger/src/index.js": {"lines":{"total":31,"covered":12,"skipped":0,"pct":38.7},"functions":{"total":5,"covered":2,"skipped":0,"pct":40},"statements":{"total":32,"covered":12,"skipped":0,"pct":37.5},"branches":{"total":22,"covered":7,"skipped":0,"pct":31.81}} +,"/Users/rich9620/projects/koop/packages/output-geoservices/src/index.js": {"lines":{"total":252,"covered":249,"skipped":0,"pct":98.8},"functions":{"total":16,"covered":15,"skipped":0,"pct":93.75},"statements":{"total":252,"covered":249,"skipped":0,"pct":98.8},"branches":{"total":51,"covered":51,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/errors.js": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":2,"covered":1,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/winnow/src/index.js": {"lines":{"total":4,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":4,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/log-manager.js": {"lines":{"total":10,"covered":4,"skipped":0,"pct":40},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":10,"covered":4,"skipped":0,"pct":40},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/calculate-class-breaks/calculate-std-dev-intervals.js": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":17,"covered":17,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/calculate-class-breaks/filter-and-validate-classification-features.js": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/calculate-class-breaks/index.js": {"lines":{"total":31,"covered":28,"skipped":0,"pct":90.32},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":31,"covered":28,"skipped":0,"pct":90.32},"branches":{"total":20,"covered":16,"skipped":0,"pct":80}} +,"/Users/rich9620/projects/koop/packages/winnow/src/calculate-class-breaks/normalize-classification-values.js": {"lines":{"total":49,"covered":49,"skipped":0,"pct":100},"functions":{"total":11,"covered":11,"skipped":0,"pct":100},"statements":{"total":49,"covered":49,"skipped":0,"pct":100},"branches":{"total":36,"covered":34,"skipped":0,"pct":94.44}} +,"/Users/rich9620/projects/koop/packages/winnow/src/calculate-class-breaks/transform-class-breaks-to-ranges.js": {"lines":{"total":28,"covered":28,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":30,"covered":29,"skipped":0,"pct":96.66},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filter-and-transform.js": {"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":18,"covered":18,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/prepare-filter-and-transform.js": {"lines":{"total":15,"covered":15,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":19,"covered":18,"skipped":0,"pct":94.73},"branches":{"total":18,"covered":17,"skipped":0,"pct":94.44}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/contains.js": {"lines":{"total":7,"covered":3,"skipped":0,"pct":42.85},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":9,"covered":3,"skipped":0,"pct":33.33},"branches":{"total":10,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/envelope-intersects.js": {"lines":{"total":17,"covered":5,"skipped":0,"pct":29.41},"functions":{"total":3,"covered":0,"skipped":0,"pct":0},"statements":{"total":20,"covered":5,"skipped":0,"pct":25},"branches":{"total":17,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/hashed-objectid-comparator.js": {"lines":{"total":21,"covered":3,"skipped":0,"pct":14.28},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":21,"covered":3,"skipped":0,"pct":14.28},"branches":{"total":26,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/intersects.js": {"lines":{"total":11,"covered":4,"skipped":0,"pct":36.36},"functions":{"total":2,"covered":0,"skipped":0,"pct":0},"statements":{"total":14,"covered":4,"skipped":0,"pct":28.57},"branches":{"total":16,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/filters/within.js": {"lines":{"total":7,"covered":7,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":9,"covered":8,"skipped":0,"pct":88.88}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/helpers/create-integer-hash.js": {"lines":{"total":4,"covered":2,"skipped":0,"pct":50},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":4,"covered":2,"skipped":0,"pct":50},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/helpers/hash-fixture.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/helpers/hash-function.js": {"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":9,"skipped":0,"pct":81.81},"branches":{"total":2,"covered":1,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/helpers/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/project.js": {"lines":{"total":11,"covered":3,"skipped":0,"pct":27.27},"functions":{"total":2,"covered":0,"skipped":0,"pct":0},"statements":{"total":13,"covered":3,"skipped":0,"pct":23.07},"branches":{"total":8,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/reduce-precision.js": {"lines":{"total":9,"covered":2,"skipped":0,"pct":22.22},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":11,"covered":2,"skipped":0,"pct":18.18},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/select-fields-to-esri-attributes.js": {"lines":{"total":6,"covered":3,"skipped":0,"pct":50},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":6,"covered":3,"skipped":0,"pct":50},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/select-fields.js": {"lines":{"total":4,"covered":2,"skipped":0,"pct":50},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":4,"covered":2,"skipped":0,"pct":50},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-esri-attributes.js": {"lines":{"total":23,"covered":4,"skipped":0,"pct":17.39},"functions":{"total":5,"covered":0,"skipped":0,"pct":0},"statements":{"total":23,"covered":4,"skipped":0,"pct":17.39},"branches":{"total":19,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-esri-geometry.js": {"lines":{"total":7,"covered":3,"skipped":0,"pct":42.85},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":9,"covered":3,"skipped":0,"pct":33.33},"branches":{"total":7,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-geohash.js": {"lines":{"total":9,"covered":3,"skipped":0,"pct":33.33},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":10,"covered":3,"skipped":0,"pct":30},"branches":{"total":10,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/filter-and-transform/transforms/to-hash.js": {"lines":{"total":4,"covered":1,"skipped":0,"pct":25},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":5,"covered":1,"skipped":0,"pct":20},"branches":{"total":3,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/helpers/project-coordinates.js": {"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":9,"covered":8,"skipped":0,"pct":88.88}} +,"/Users/rich9620/projects/koop/packages/winnow/src/helpers/transform-coordinates.js": {"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":5,"covered":5,"skipped":0,"pct":100},"branches":{"total":3,"covered":2,"skipped":0,"pct":66.66}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/aggregates.js": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/classification.js": {"lines":{"total":24,"covered":22,"skipped":0,"pct":91.66},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":24,"covered":22,"skipped":0,"pct":91.66},"branches":{"total":21,"covered":17,"skipped":0,"pct":80.95}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/collection.js": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":16,"covered":15,"skipped":0,"pct":93.75},"branches":{"total":11,"covered":9,"skipped":0,"pct":81.81}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/date-fields.js": {"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/fields.js": {"lines":{"total":10,"covered":10,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/geometry-filter-spatial-reference.js": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/geometry-filter.js": {"lines":{"total":32,"covered":31,"skipped":0,"pct":96.87},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":26,"covered":22,"skipped":0,"pct":84.61}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/group-by.js": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/id-field.js": {"lines":{"total":20,"covered":20,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":20,"covered":20,"skipped":0,"pct":100},"branches":{"total":21,"covered":20,"skipped":0,"pct":95.23}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/index.js": {"lines":{"total":23,"covered":23,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/limit.js": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":15,"covered":15,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/object-ids.js": {"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/offset.js": {"lines":{"total":2,"covered":2,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":2,"covered":2,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/order.js": {"lines":{"total":5,"covered":5,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":6,"covered":6,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/output-data-spatial-reference.js": {"lines":{"total":10,"covered":10,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":10,"covered":10,"skipped":0,"pct":100},"branches":{"total":14,"covered":14,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/source-data-spatial-reference.js": {"lines":{"total":10,"covered":9,"skipped":0,"pct":90},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":10,"skipped":0,"pct":90.9},"branches":{"total":10,"covered":8,"skipped":0,"pct":80}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/spatial-predicate.js": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/spatial-reference.js": {"lines":{"total":47,"covered":47,"skipped":0,"pct":100},"functions":{"total":9,"covered":9,"skipped":0,"pct":100},"statements":{"total":52,"covered":51,"skipped":0,"pct":98.07},"branches":{"total":34,"covered":32,"skipped":0,"pct":94.11}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/where.js": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":16,"covered":16,"skipped":0,"pct":100},"branches":{"total":9,"covered":9,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/detect-esri-field-type.js": {"lines":{"total":11,"covered":8,"skipped":0,"pct":72.72},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":11,"covered":8,"skipped":0,"pct":72.72},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/get-collection-crs.js": {"lines":{"total":15,"covered":14,"skipped":0,"pct":93.33},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":15,"covered":14,"skipped":0,"pct":93.33},"branches":{"total":6,"covered":5,"skipped":0,"pct":83.33}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/normalize-query-options/helpers/normalize-array.js": {"lines":{"total":3,"covered":3,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":6,"covered":6,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/classification-query.js": {"lines":{"total":18,"covered":16,"skipped":0,"pct":88.88},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":19,"covered":17,"skipped":0,"pct":89.47},"branches":{"total":10,"covered":8,"skipped":0,"pct":80}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/index.js": {"lines":{"total":1,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/normalize-query-input.js": {"lines":{"total":19,"covered":19,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":23,"covered":23,"skipped":0,"pct":100},"branches":{"total":19,"covered":19,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/package-features.js": {"lines":{"total":13,"covered":11,"skipped":0,"pct":84.61},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":11,"skipped":0,"pct":84.61},"branches":{"total":18,"covered":12,"skipped":0,"pct":66.66}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/prepare-query.js": {"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":24,"covered":24,"skipped":0,"pct":100},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/query.js": {"lines":{"total":18,"covered":18,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":19,"covered":19,"skipped":0,"pct":100},"branches":{"total":5,"covered":4,"skipped":0,"pct":80}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/standard-query.js": {"lines":{"total":17,"covered":16,"skipped":0,"pct":94.11},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":18,"covered":17,"skipped":0,"pct":94.44},"branches":{"total":9,"covered":7,"skipped":0,"pct":77.77}} +,"/Users/rich9620/projects/koop/packages/winnow/src/query/unique-value-query.js": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":5,"covered":4,"skipped":0,"pct":80}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/create-sql-params.js": {"lines":{"total":13,"covered":13,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":16,"covered":13,"skipped":0,"pct":81.25}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/create-sql-string.js": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":12,"covered":12,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/group-by.js": {"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":7,"covered":7,"skipped":0,"pct":100},"branches":{"total":5,"covered":5,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/index.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/is-different-crs.js": {"lines":{"total":2,"covered":2,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":2,"covered":2,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/order-by.js": {"lines":{"total":12,"covered":12,"skipped":0,"pct":100},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":13,"covered":13,"skipped":0,"pct":100},"branches":{"total":10,"covered":10,"skipped":0,"pct":100}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/aggregation-select.js": {"lines":{"total":12,"covered":10,"skipped":0,"pct":83.33},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":13,"covered":11,"skipped":0,"pct":84.61},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/fields-select-fragment.js": {"lines":{"total":16,"covered":1,"skipped":0,"pct":6.25},"functions":{"total":4,"covered":0,"skipped":0,"pct":0},"statements":{"total":17,"covered":1,"skipped":0,"pct":5.88},"branches":{"total":14,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/geometry-select-fragment.js": {"lines":{"total":16,"covered":2,"skipped":0,"pct":12.5},"functions":{"total":2,"covered":0,"skipped":0,"pct":0},"statements":{"total":16,"covered":2,"skipped":0,"pct":12.5},"branches":{"total":11,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/select/index.js": {"lines":{"total":12,"covered":6,"skipped":0,"pct":50},"functions":{"total":2,"covered":1,"skipped":0,"pct":50},"statements":{"total":12,"covered":6,"skipped":0,"pct":50},"branches":{"total":7,"covered":1,"skipped":0,"pct":14.28}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/where-builder/index.js": {"lines":{"total":78,"covered":10,"skipped":0,"pct":12.82},"functions":{"total":17,"covered":0,"skipped":0,"pct":0},"statements":{"total":78,"covered":10,"skipped":0,"pct":12.82},"branches":{"total":50,"covered":0,"skipped":0,"pct":0}} +,"/Users/rich9620/projects/koop/packages/winnow/src/sql-query-builder/where-builder/to-json-where.js": {"lines":{"total":51,"covered":3,"skipped":0,"pct":5.88},"functions":{"total":15,"covered":0,"skipped":0,"pct":0},"statements":{"total":55,"covered":3,"skipped":0,"pct":5.45},"branches":{"total":30,"covered":0,"skipped":0,"pct":0}} +} diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 9b68c12ba..5f06f07fe 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -51,11 +51,7 @@ jobs: - name: Run Coverage if: ${{ matrix.os == 'ubuntu-latest' }} - run: npm run cov:clean && mkdir .nyc_output_changes && npm run cov:changes && npm run cov:changes:2:md - - - name: Run Coverage - if: ${{ matrix.os == 'ubuntu-latest' }} - run: cat coverage_changes/coverage-summary.json + run: npm run cov:changes:json && npm run cov:changes:2:md - name: Find previous coverage comment if: ${{ matrix.os == 'ubuntu-latest' }} @@ -72,5 +68,5 @@ jobs: with: comment-id: ${{ steps.findcomment.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} - body-path: ci/branch-coverage-changes.md + body-path: .branch-coverage-changes.md edit-mode: replace diff --git a/.gitignore b/.gitignore index 072d28d28..81ba244aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,9 @@ node_modules -coverage -coverage_unit -coverage_changes -coverage.json -.nyc_output -.nyc_output_unit -.nyc_output_changes +.coverage_html +.coverage_changes_json +.coverage .vscode **/.DS_Store .env .npmrc -ci/branch-coverage-changes.md \ No newline at end of file +.branch-coverage-changes.md \ No newline at end of file diff --git a/ci/clean-coverage.js b/ci/clean-coverage.js index 579f5f8bc..a0d2c6129 100644 --- a/ci/clean-coverage.js +++ b/ci/clean-coverage.js @@ -1,8 +1,5 @@ const shell = require('shelljs'); -shell.rm('-rf', 'coverage'); -shell.rm('-rf', 'coverage_unit'); -shell.rm('-rf', 'coverage_changes'); -shell.rm('-rf', '.nyc_output'); -shell.rm('-rf', '.nyc_output_unit'); -shell.rm('-rf', '.nyc_output_changes'); \ No newline at end of file +shell.rm('-rf', './**/.coverage'); +shell.rm('-rf', '.coverage'); +shell.rm('.branch-coverage-changes.md'); \ No newline at end of file diff --git a/ci/format-branch-coverage-changes.js b/ci/format-branch-coverage-changes.js index 207b0b669..b7ba423ec 100644 --- a/ci/format-branch-coverage-changes.js +++ b/ci/format-branch-coverage-changes.js @@ -1,44 +1,74 @@ -const { writeFileSync } = require('fs'); +const { writeFileSync, existsSync } = require('fs'); const json2md = require('json2md'); -const coverageSummary = require('../coverage_changes/coverage-summary.json'); +const coverageSummary = require('../.coverage_json/coverage-summary.json'); +const markdownFilePath = '.branch-coverage-changes.md'; -const rows = Object.entries(coverageSummary) +if (!existsSync('../.coverage_changes_json/coverage-summary.json')) { + writeFileSync(markdownFilePath, `## Coverage Report (change vs master) + No changes. + `, 'utf8'); + return; +} + +const coverageChangesSummary = require('../.coverage_changes_json/coverage-summary.json'); +const rows = Object.entries(coverageChangesSummary) .filter(([filePath]) => { return filePath !== 'total'; }) - .map(([filePath, value]) => { + .map(([filePath, changesCoverage]) => { + const masterCoverage = coverageSummary[filePath]; const packagePath = filePath.split('packages')[1]; return [ `packages${packagePath}`, - getValue(value.statements), - getValue(value.branches), - getValue(value.functions), - getValue(value.lines), + formatCovComparison(changesCoverage.statements.pct, masterCoverage.statements.pct), + formatCovComparison(changesCoverage.branches.pct, masterCoverage.branches.pct), + formatCovComparison(changesCoverage.functions.pct, masterCoverage.functions.pct), + formatCovComparison(changesCoverage.lines.pct, masterCoverage.lines.pct) ]; }); const headers = ['File Path', 'Statements', 'Branches', 'Functions', 'Lines']; -const markdown = json2md([{ h2: 'Coverage Report'}, { table: { headers, rows } }]); -const aligned = markdown.replace('| --------- | ---------- | -------- | --------- | ----- |', '| :--------- | ----------: | --------: | ---------: | -----: |'); -writeFileSync('ci/branch-coverage-changes.md', aligned, 'utf8'); -function getValue(input) { - if (input.pct === 100) { - return `${input.pct} ![green](https://github.com/koopjs/koop/assets/4369192/fd82d4b7-7f6e-448c-a56c-82ac6781a629)`; +const table = json2md([ + { h2: 'Coverage Report (change vs master)' }, + { table: { headers, rows } }, +]); + +const alignedTable = table.replace( + '| --------- | ---------- | -------- | --------- | ----- |', + '| :--------- | ----------: | --------: | ---------: | -----: |', +); + +const markdown = `[g-img]: https://github.com/koopjs/koop/assets/4369192/fd82d4b7-7f6e-448c-a56c-82ac6781a629 +[yg-img]: https://github.com/koopjs/koop/assets/4369192/683b2df8-7379-4e4f-bb36-f5e20b2631d6 +[y-img]: https://github.com/koopjs/koop/assets/4369192/d5214a5c-c5a9-4449-82ca-8a4e922ef9ef +[o-img]: https://github.com/koopjs/koop/assets/4369192/8651f10c-e986-491d-8b51-bc559aac88a2 +[r-img]: https://github.com/koopjs/koop/assets/4369192/a37a56ac-228d-40d9-8ebc-804dbbf08355 + +${alignedTable}`; + +writeFileSync(markdownFilePath, markdown, 'utf8'); + +function formatCovComparison(changePct, mainPct) { + return `${formatCovPct(changePct)} vs ${formatCovPct(mainPct)}`; +} + +function formatCovPct(pct) { + if (pct === 100) { + return `${pct} ![green][g-img]`; } - if (input.pct > 90) { - return `${input.pct} ![yellow-green](https://github.com/koopjs/koop/assets/4369192/683b2df8-7379-4e4f-bb36-f5e20b2631d6)`; + if (pct > 90) { + return `${pct} ![yellowGreen][yg-img]`; } - if (input.pct > 80) { - return `${input.pct} ![yellow](https://github.com/koopjs/koop/assets/4369192/d5214a5c-c5a9-4449-82ca-8a4e922ef9ef)`; + if (pct > 80) { + return `${pct} ![yellow][y-img]`; } - if (input.pct > 70) { - return `${input.pct} ![orange](https://github.com/koopjs/koop/assets/4369192/8651f10c-e986-491d-8b51-bc559aac88a2)`; + if (pct > 70) { + return `${pct} ![orange][o-img]`; } - return `${input.pct} ![red](https://github.com/koopjs/koop/assets/4369192/83e9c13e-0548-4b97-a116-6e49f77a8f38)`; + return `${pct} ![red][r-img]`; } - diff --git a/ci/merge-coverage-changes.js b/ci/merge-coverage-changes.js new file mode 100644 index 000000000..ae7f10544 --- /dev/null +++ b/ci/merge-coverage-changes.js @@ -0,0 +1,35 @@ +const { workspaces } = require('../package.json'); +const shell = require('shelljs'); +const fs = require('fs'); +const path = require('path'); +const yargs = require('yargs/yargs'); +const { hideBin } = require('yargs/helpers'); +const argv = yargs(hideBin(process.argv)).argv; +const context = argv.context || 'all'; + +workspaces.forEach((workspace) => { + process.chdir(workspace); + const package = workspace.split(path.sep).pop(); + + const coverageDir = path.join('.coverage', context); + + if (!fs.existsSync(coverageDir)) { + process.chdir('../..'); + return; + } + + console.log(`Package "${package}":`); + process.stdout.write(` - merging ${context} test coverage results...`); + shell.exec(getCmd(package, coverageDir)); + process.stdout.write('completed.\n\n'); + process.chdir('../..'); +}); + +function getCmd(package, coverageDir) { + const destination = path.join('..', '..', coverageDir); + if(package === 'output-geoservices') { + return `cp ${coverageDir}/coverage-final.json ${destination}/output-geoservices.json > /dev/null`; + } + + return `npx nyc merge ${coverageDir}/analysis ${destination}/${package}.json > /dev/null`; +} \ No newline at end of file diff --git a/ci/run-coverage-on-branch-changes.js b/ci/run-coverage-on-branch-changes.js index c491fa829..b0f77ff4e 100644 --- a/ci/run-coverage-on-branch-changes.js +++ b/ci/run-coverage-on-branch-changes.js @@ -1,9 +1,17 @@ const shell = require('shelljs'); const git = require('simple-git'); +const path = require('path'); + +const { workspaces } = require('../package.json'); + +async function execute () { + for (let i = 0; i < workspaces.length; i++) { + const workspace = workspaces[i]; + process.chdir(workspace); + const package = workspace.split(path.sep).pop(); + + const {files} = await git().diffSummary(['--name-only', '--relative', 'origin/master']); -git().diffSummary(['--name-only', '--relative', 'origin/master']) - .then(summary => { - const {files} = summary; const srcFiles = files.filter(({ file }) => { return file.endsWith('.js') && !file.endsWith('spec.js'); }).map(({ file }) => { @@ -11,11 +19,38 @@ git().diffSummary(['--name-only', '--relative', 'origin/master']) }); if (srcFiles.length === 0) { - process.exit(); + process.chdir('../..'); + continue; } - const cmd = `nyc -r=json-summary --report-dir=coverage_changes --temp-dir=.nyc_output_changes ${srcFiles.join(' ')} npm run test:quiet`; - shell.exec(cmd); - }); + console.log(`Package "${package}":`); + process.stdout.write(' - running branch-changes test coverage...'); + shell.exec(getCovCmd(package, srcFiles)); + process.stdout.write('completed.\n\n'); + process.chdir('../..'); + } +} + +execute().then(() => { + process.exit(); +}).catch(error => { + console.error(error); + process.exit(1); +}); + + +function getCovCmd(package, srcFiles) { + if (package === 'output-geoservices') { + return 'npm test -- --coverage --changedSince=master --coverageDirectory=.coverage/changes --reporters --silent > /dev/null'; + } + + return `npx nyc -r=json --report-dir=.coverage/changes --temp-dir=.coverage/changes/analysis ${srcFiles.join(' ')} ${getTestCmd(package)}`; +} + +function getTestCmd(package) { + if (package === 'featureserver' || package === 'winnow') { + return 'npm run test:unit > /dev/null'; + } -//console.log(diff) \ No newline at end of file + return 'npm run test > /dev/null'; +} \ No newline at end of file diff --git a/ci/run-report-on-branch-changes.js b/ci/run-report-on-branch-changes.js new file mode 100644 index 000000000..0c7c4bb1f --- /dev/null +++ b/ci/run-report-on-branch-changes.js @@ -0,0 +1,9 @@ +const shell = require('shelljs'); +const fs = require('fs'); + +if (!fs.existsSync('.coverage/changes')) { + console.log('No changes to report!'); + return; +} + +shell.exec('nyc report --temp-dir=.coverage/changes --reporter=json-summary --report-dir=.coverage_changes_json'); diff --git a/ci/run-test-coverage-analysis.js b/ci/run-test-coverage-analysis.js new file mode 100644 index 000000000..e72923e5b --- /dev/null +++ b/ci/run-test-coverage-analysis.js @@ -0,0 +1,45 @@ + +const { workspaces } = require('../package.json'); +const shell = require('shelljs'); +const path = require('path'); +const yargs = require('yargs/yargs'); +const { hideBin } = require('yargs/helpers'); +const argv = yargs(hideBin(process.argv)).argv; +const context = argv.context || 'all'; + +workspaces.forEach((workspace) => { + process.chdir(workspace); + const package = workspace.split(path.sep).pop(); + console.log(`Package "${package}":`); + process.stdout.write(` - running ${context} test coverage...`); + shell.exec(getCovCmd(package, context)); + process.stdout.write('completed.\n'); + process.stdout.write(` - generating ${context} test coverage badge...`); + shell.exec(getBadgeCmd(package, context)); + process.stdout.write('completed.\n\n'); + process.chdir('../..'); +}); + +function getCovCmd(package, context) { + if (package === 'output-geoservices') { + return 'npm test -- --coverage --coverageDirectory=.coverage/all --reporters --silent > /dev/null'; + } + + return `npx cross-env SUPPRESS_NO_CONFIG_WARNING=true nyc -r=json-summary -r=json --report-dir=.coverage/all --temp-dir=.coverage/all/analysis ${getTestCmd(package, context)}`; +} + +function getBadgeCmd(package, context) { + if (context === 'unit' && (package === 'featureserver' || package === 'winnow')) { + return 'npx coverage-badges-cli --source .coverage/all/coverage-summary.json --output ./coverage-unit.svg > /dev/null'; + } + + return 'npx coverage-badges-cli --source .coverage/all/coverage-summary.json --output ./coverage.svg > /dev/null'; +} + +function getTestCmd(package, context) { + if (context === 'unit' && (package === 'featureserver' || package === 'winnow')) { + return 'npm run test:unit > /dev/null'; + } + + return 'npm run test > /dev/null'; +} \ No newline at end of file diff --git a/jest.config.js b/jest.config.js index 4b9b1ef70..e3267a8f7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -107,7 +107,7 @@ const config = { // projects: undefined, // Use this configuration option to add custom reporters to Jest - // reporters: undefined, + //reporters: [], // Automatically reset mock state before every test // resetMocks: false, diff --git a/package-lock.json b/package-lock.json index 4ff187c3b..41cd8aad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,8 @@ "shelljs": "^0.8.5", "simple-git": "^3.22.0", "snyk": "^1.1280.0", - "supertest": "^6.3.4" + "supertest": "^6.3.4", + "yargs": "^17.7.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -10861,9 +10862,10 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -29574,7 +29576,9 @@ } }, "istanbul-reports": { - "version": "3.1.5", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", diff --git a/package.json b/package.json index dd7b37684..8e8670c3b 100644 --- a/package.json +++ b/package.json @@ -11,19 +11,12 @@ "commit": "cz", "precommit": "lint-staged && npm test --workspaces", "test": "npm test --workspaces", - "test:quiet": "npm test:quiet --workspaces", "test:e2e": "cross-env SUPPRESS_NO_CONFIG_WARNING=true DATA_DIR=./test/provider-data jest", - "cov:full": "npm run cov:full --workspaces --silent && npm run cov:compile:full && npm run cov:report:full", - "cov:unit": "npm run cov:unit --workspaces && npm run cov:compile:unit && npm run cov:report:unit", - "cov:changes": "npm run cov:changes --workspaces --silent && npm run cov:compile:changes && npm run cov:report:changes", - "cov:compile": "nyc merge packages/cache-memory/$OUT_DIR $OUT_DIR/cache-memory.json 2>/dev/null || : && nyc merge packages/featureserver/$OUT_DIR $OUT_DIR/featureserver.json 2>/dev/null || : && nyc merge packages/core/$OUT_DIR $OUT_DIR/core.json 2>/dev/null || : && nyc merge packages/logger/$OUT_DIR $OUT_DIR/logger.json 2>/dev/null || : && cp packages/output-geoservices/$GEO_DIR/coverage-final.json $OUT_DIR/output-geoservices.json 2>/dev/null || : && nyc merge packages/winnow/$OUT_DIR $OUT_DIR/winnow.json 2>/dev/null || :", - "cov:compile:full": "OUT_DIR=.nyc_output GEO_DIR=coverage npm run cov:compile --silent", - "cov:compile:unit": "OUT_DIR=.nyc_output_unit GEO_DIR=coverage npm run cov:compile", - "cov:compile:changes": "npm run cov:clean && mkdir .nyc_output_changes && OUT_DIR=.nyc_output_changes GEO_DIR=coverage_changes npm run cov:compile", - "cov:report:full": "nyc report --reporter=html", - "cov:report:unit": "nyc report --temp-dir=.nyc_output_unit --report-dir=coverage_unit --reporter=html", - "cov:report:changes": "nyc report --temp-dir=.nyc_output_changes --report-dir=coverage_changes --reporter=json-summary", - "cov:clean": "node ci/clean-coverage.js && npm run cov:clean --workspaces", + "cov:all:html": "node ci/run-test-coverage-analysis && node ci/merge-coverage-changes && nyc report --temp-dir=.coverage/all --reporter=html --report-dir=.coverage_html", + "cov:unit:html": "node ci/run-test-coverage-analysis --context=unit && node ci/merge-coverage-changes --context=unit && nyc report --temp-dir=.coverage/all --reporter=html --report-dir=.coverage_html", + "cov:unit:json": "node ci/run-test-coverage-analysis --context=unit && node ci/merge-coverage-changes && nyc report --temp-dir=.coverage/all --reporter=json-summary --report-dir=.coverage_json", + "cov:changes:json": "npm run cov:clean && node ci/run-coverage-on-branch-changes.js && node ci/merge-coverage-changes --context=changes && node ci/run-report-on-branch-changes", + "cov:clean": "node ci/clean-coverage", "cov:changes:2:md": "node ci/format-branch-coverage-changes.js", "version": "changeset version", "release:npm": "changeset publish", @@ -78,7 +71,8 @@ "shelljs": "^0.8.5", "simple-git": "^3.22.0", "snyk": "^1.1280.0", - "supertest": "^6.3.4" + "supertest": "^6.3.4", + "yargs": "^17.7.2" }, "config": { "commitizen": { diff --git a/packages/cache-memory/package.json b/packages/cache-memory/package.json index 3278c1ae5..a009b165d 100644 --- a/packages/cache-memory/package.json +++ b/packages/cache-memory/package.json @@ -4,13 +4,7 @@ "description": "An in-memory cache for KOop", "main": "src/index.js", "scripts": { - "test": "tape src/**/*.spec.js | tap-spec > /dev/null", - "test:quiet": "npm test > /dev/null", - "cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:full": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "cov:clean": "node ../../ci/clean-coverage.js" + "test": "tape src/**/*.spec.js | tap-spec" }, "repository": { "type": "git", diff --git a/packages/core/package.json b/packages/core/package.json index 4431cd1bf..0a2813320 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -67,12 +67,6 @@ "url": "git://github.com/koopjs/koop.git" }, "scripts": { - "test": "mocha '**/*.spec.js' ", - "test:quiet": "npm test > /dev/null", - "cov:unit": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "cov:full": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "cov:clean": "node ../../ci/clean-coverage.js" + "test": "mocha '**/*.spec.js' " } } diff --git a/packages/featureserver/coverage-unit.svg b/packages/featureserver/coverage-unit.svg index 142927d86..ae249abde 100644 --- a/packages/featureserver/coverage-unit.svg +++ b/packages/featureserver/coverage-unit.svg @@ -1,5 +1,5 @@ - - coverage: 94.93% + + coverage: 94.85% @@ -13,8 +13,8 @@ \ No newline at end of file diff --git a/packages/featureserver/coverage.svg b/packages/featureserver/coverage.svg index c08c6584c..f74388684 100644 --- a/packages/featureserver/coverage.svg +++ b/packages/featureserver/coverage.svg @@ -1,5 +1,5 @@ - - coverage: 98.11% + + coverage: 98.02% @@ -13,8 +13,8 @@ \ No newline at end of file diff --git a/packages/featureserver/package.json b/packages/featureserver/package.json index 28f63669f..9b01c04e1 100644 --- a/packages/featureserver/package.json +++ b/packages/featureserver/package.json @@ -8,13 +8,7 @@ }, "scripts": { "test": "mocha '**/*.spec.js' --recursive -t 5000", - "test:quiet": "npm test > /dev/null", - "cov:full": "nyc -r=json-summary mocha '**/*.spec.js' && npm run cov:badge:full && npm run cov:unit", - "cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit mocha 'src/**/*.spec.js' && npm run cov:badge:unit", - "cov:badge:full": "coverage-badges-cli --output ./coverage.svg", - "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", - "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "cov:clean": "node ../../ci/clean-coverage.js" + "test:unit": "mocha 'src/**/*.spec.js' --recursive -t 5000" }, "contributors": [ { diff --git a/packages/logger/package.json b/packages/logger/package.json index 9fa4061c9..e3c7d6505 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -4,13 +4,7 @@ "description": "A shared logger for Koop", "main": "src/index.js", "scripts": { - "test": "tape src/**/*.spec.js | tap-spec", - "test:quiet": "npm test > /dev/null", - "cov:full": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:unit": "nyc -r=json-summary tape './src/**/*.spec.js' | tap-spec && npm run cov:badge", - "cov:badge": "coverage-badges-cli --output ./coverage.svg", - "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "cov:clean": "node ../../ci/clean-coverage.js" + "test": "tape src/**/*.spec.js | tap-spec" }, "repository": { "type": "git", diff --git a/packages/output-geoservices/coverage.svg b/packages/output-geoservices/coverage.svg index 4354a36ca..9c5c368c2 100644 --- a/packages/output-geoservices/coverage.svg +++ b/packages/output-geoservices/coverage.svg @@ -1,20 +1,20 @@ - - coverage: 100% + + coverage: 98.8% - + - - + + \ No newline at end of file diff --git a/packages/output-geoservices/package.json b/packages/output-geoservices/package.json index 2822a34c4..2568caa9e 100644 --- a/packages/output-geoservices/package.json +++ b/packages/output-geoservices/package.json @@ -4,12 +4,7 @@ "description": "Wraps FeatureServer as a Koop output plugin", "main": "src/index.js", "scripts": { - "test": "jest", - "cov:unit": "jest --coverage && npm run cov:badge", - "cov:full": "jest --coverage && npm run cov:badge", - "cov:badge": "coverage-badges --output ./coverage.svg", - "cov:changes": "jest --coverage --changedSince=master --coverageDirectory=coverage_changes --silent > /dev/null", - "cov:clean": "node ../../ci/clean-coverage.js" + "test": "jest" }, "repository": { "type": "git", @@ -38,11 +33,16 @@ "@koopjs/logger": "5.0.0" }, "jest": { + "coverageProvider": "v8", + + "coverageDirectory": ".coverage", + "coverageReporters": [ - "json-summary", - "json", - "text", - "lcov" + "json", "json-summary" + ], + + "testMatch": [ + "/src/**/*.spec.[jt]s?(x)" ] } } diff --git a/packages/winnow/coverage-unit.svg b/packages/winnow/coverage-unit.svg index 2f18fe687..f2e73d2ed 100644 --- a/packages/winnow/coverage-unit.svg +++ b/packages/winnow/coverage-unit.svg @@ -1,20 +1,20 @@ - - coverage: 96.6% + + coverage: 72.17% - + - - + + \ No newline at end of file diff --git a/packages/winnow/package.json b/packages/winnow/package.json index 3ced15e70..974ab2645 100644 --- a/packages/winnow/package.json +++ b/packages/winnow/package.json @@ -8,15 +8,9 @@ }, "scripts": { "test": "tape **/*.spec.js | tap-spec", - "test:quiet": "npm test > /dev/null", - "cov:full": "nyc -r=json-summary tape '**/*.spec.js' | tap-spec && npm run cov:badge:full && npm run test:cov:unit", - "cov:unit": "nyc -r=json-summary --report-dir=coverage_unit --temp-dir=.nyc_output_unit tape 'src/**/*.spec.js' | tap-spec && npm run cov:badge:unit", - "cov:badge:full": "coverage-badges-cli --output ./coverage.svg", - "cov:badge:unit": "coverage-badges-cli --source coverage_unit/coverage-summary.json --output ./coverage-unit.svg", + "test:unit": "tape src/**/*.spec.js | tap-spec", "benchmark": "node benchmark/index.js", "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt", - "cov:changes": "node ../../ci/run-coverage-on-branch-changes.js", - "cov:clean": "node ../../ci/clean-coverage.js" }, "repository": { "type": "git", From 4e3e78b307f6c500fb2163853bec300f2582a6d1 Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Fri, 23 Feb 2024 11:11:05 -0800 Subject: [PATCH 6/7] chore: syntax error --- .github/workflows/pr-tests.yml | 2 +- packages/winnow/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-tests.yml b/.github/workflows/pr-tests.yml index 5f06f07fe..8ca89e071 100644 --- a/.github/workflows/pr-tests.yml +++ b/.github/workflows/pr-tests.yml @@ -44,7 +44,7 @@ jobs: run: npm run lint:ci - name: Unit tests - run: npm test:quiet + run: npm test - name: E2E tests run: npm run test:e2e diff --git a/packages/winnow/package.json b/packages/winnow/package.json index 974ab2645..41fed149e 100644 --- a/packages/winnow/package.json +++ b/packages/winnow/package.json @@ -10,7 +10,7 @@ "test": "tape **/*.spec.js | tap-spec", "test:unit": "tape src/**/*.spec.js | tap-spec", "benchmark": "node benchmark/index.js", - "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt", + "benchmark:ci": "node benchmark/index.js | tee benchmark-result.txt" }, "repository": { "type": "git", From 212d7cad338792954d56d9ef9dc39a34d2f33e6f Mon Sep 17 00:00:00 2001 From: Rich Gwozdz Date: Fri, 23 Feb 2024 17:55:36 -0800 Subject: [PATCH 7/7] chore: update release action --- .github/workflows/release.yml | 3 +++ packages/featureserver/coverage-unit.svg | 8 ++++---- packages/featureserver/coverage.svg | 8 ++++---- packages/output-geoservices/coverage.svg | 14 +++++++------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4c6888a84..988b198ad 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,6 +44,9 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Update coverage badges and report + run: npm run cov:unit:json + - name: Commit version and changelog updates run: "git add --all && git commit -m 'chore: version and changelog' --no-verify" diff --git a/packages/featureserver/coverage-unit.svg b/packages/featureserver/coverage-unit.svg index ae249abde..142927d86 100644 --- a/packages/featureserver/coverage-unit.svg +++ b/packages/featureserver/coverage-unit.svg @@ -1,5 +1,5 @@ - - coverage: 94.85% + + coverage: 94.93% @@ -13,8 +13,8 @@ \ No newline at end of file diff --git a/packages/featureserver/coverage.svg b/packages/featureserver/coverage.svg index f74388684..c08c6584c 100644 --- a/packages/featureserver/coverage.svg +++ b/packages/featureserver/coverage.svg @@ -1,5 +1,5 @@ - - coverage: 98.02% + + coverage: 98.11% @@ -13,8 +13,8 @@ \ No newline at end of file diff --git a/packages/output-geoservices/coverage.svg b/packages/output-geoservices/coverage.svg index 9c5c368c2..4354a36ca 100644 --- a/packages/output-geoservices/coverage.svg +++ b/packages/output-geoservices/coverage.svg @@ -1,20 +1,20 @@ - - coverage: 98.8% + + coverage: 100% - + - - + + \ No newline at end of file