From 4b3799feeb3b4060ac9b859953dc0b5bf1bf92f4 Mon Sep 17 00:00:00 2001 From: Francis Gulotta Date: Thu, 2 Jul 2020 22:03:55 -0400 Subject: [PATCH] Add c8 for code coverage reporting fail on less than 95% coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increase coverage to meet these standards I’m so close to 100% but testing some of these possible error conditions is beyond what I can figure out tonight. I feel like the possible state machine of errors that SI can see is larger than the errors that can actually be produced. If I could prove that I could have less code, but since I can’t I’m going to have to rely on reason instead of tests to prove it. Also reporting of coverage sucks on node 10, it’s less than the other versions, so I disabled it. --- .github/workflows/test.yml | 4 + .gitignore | 3 +- .npmignore | 1 + lib/batch-test.ts | 16 +- lib/flat-map-test.ts | 8 + lib/flat-map.ts | 2 +- lib/from-stream-test.ts | 22 ++ lib/from-stream.ts | 2 +- lib/get-iterator-test.ts | 5 + lib/parallel-flat-map-test.ts | 9 + lib/reduce-test.ts | 5 + lib/reduce.ts | 2 +- lib/take.ts | 4 +- lib/write-to-stream-test.ts | 9 + lib/write-to-stream.ts | 6 - package-lock.json | 377 ++++++++++++++++++++++++++++++++++ package.json | 4 +- 17 files changed, 454 insertions(+), 25 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f61a7eb1..1d1357b9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,3 +20,7 @@ jobs: npm test env: CI: true + - name: Check Coverage Levels + if: ${{ matrix.node-version != '10.x' }} + run: | + npm run check-coverage diff --git a/.gitignore b/.gitignore index 302fca87..2866d237 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -node_modules +coverage dist dist-ts +node_modules diff --git a/.npmignore b/.npmignore index 59429518..455148e2 100644 --- a/.npmignore +++ b/.npmignore @@ -5,6 +5,7 @@ api-extractor.json benchmark budle-types.js +coverage dist-ts lib package-lock.json diff --git a/lib/batch-test.ts b/lib/batch-test.ts index 0114aa9a..b2088bbf 100644 --- a/lib/batch-test.ts +++ b/lib/batch-test.ts @@ -21,26 +21,18 @@ function* numbers(max: number) { describe('batch', () => { it('batches async iterators', async () => { const batches: number[][] = [] - for await (const numberBatch of batch(5, asyncNumbers(10))) { - assert.equal(numberBatch.length, 5) + for await (const numberBatch of batch(5, asyncNumbers(11))) { batches.push(numberBatch) } - assert.deepEqual(batches, [ - [1, 2, 3, 4, 5], - [6, 7, 8, 9, 10], - ]) + assert.deepEqual(batches, [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11]]) }) it('batches sync iterators', async () => { const batches: number[][] = [] - for await (const numberBatch of batch(5, numbers(10))) { - assert.equal(numberBatch.length, 5) + for await (const numberBatch of batch(5, numbers(11))) { batches.push(numberBatch) } - assert.deepEqual(batches, [ - [1, 2, 3, 4, 5], - [6, 7, 8, 9, 10], - ]) + assert.deepEqual(batches, [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11]]) }) it('is curryable', async () => { diff --git a/lib/flat-map-test.ts b/lib/flat-map-test.ts index 5191d96d..29f3992c 100644 --- a/lib/flat-map-test.ts +++ b/lib/flat-map-test.ts @@ -27,4 +27,12 @@ describe('flatmap', () => { } assert.deepEqual(numbers, [1, 2, 3, 4, 5, 6, 7, 8]) }) + it('curries', async () => { + const numbers: number[] = [] + const mapNothing = flatMap(i => i) + for await (const num of mapNothing([1, 2, [3, 4, 5, 6], 7, [8]])) { + numbers.push(num as any) + } + assert.deepEqual(numbers, [1, 2, 3, 4, 5, 6, 7, 8]) + }) }) diff --git a/lib/flat-map.ts b/lib/flat-map.ts index 3341e4f3..2902746f 100644 --- a/lib/flat-map.ts +++ b/lib/flat-map.ts @@ -8,7 +8,7 @@ export function flatMap(func: (data: T) => FlatMapValue): (iterable: An export function flatMap(func: (data: T) => FlatMapValue, iterable: AnyIterable): AsyncGenerator export function flatMap(func: (data: T) => FlatMapValue, iterable?: AnyIterable) { if (iterable === undefined) { - return (curriedIterable: AnyIterable) => flatMap(func, curriedIterable) + return curriedIterable => flatMap(func, curriedIterable) } return filter(i => i !== undefined && i !== null, flatten(map(func, iterable))) } diff --git a/lib/from-stream-test.ts b/lib/from-stream-test.ts index 2fd02ece..1edebf81 100644 --- a/lib/from-stream-test.ts +++ b/lib/from-stream-test.ts @@ -2,6 +2,17 @@ import { assert } from 'chai' import { fromStream } from '.' import { PassThrough } from 'stream' +const once = func => { + let called = false + return (...args) => { + if (called) { + return + } + called = true + return func(...args) + } +} + describe('fromStream', () => { it('takes a stream and returns an async iterable', async () => { const stream = new PassThrough({ objectMode: true }) @@ -11,6 +22,17 @@ describe('fromStream', () => { assert.equal(value, 1) } }) + it('takes an old stream and returns an async iterable', async () => { + const stream = new PassThrough({ objectMode: true }) + stream[Symbol.asyncIterator] = undefined as any + stream.write(1) + const itr = fromStream(stream)[Symbol.asyncIterator]() + assert.deepEqual(await itr.next(), { value: 1, done: false }) + const next = itr.next() + stream.end() + assert.deepEqual(await next, { value: undefined, done: true }) + }) + it('iterates empty streams', async () => { const stream = new PassThrough({ objectMode: true }) stream.end() diff --git a/lib/from-stream.ts b/lib/from-stream.ts index 9453a676..3b92df16 100644 --- a/lib/from-stream.ts +++ b/lib/from-stream.ts @@ -20,7 +20,7 @@ async function* _fromStream(stream: ReadableStreamish) { continue } if ((stream as any)._readableState.ended) { - return + break } await onceReadable(stream) } diff --git a/lib/get-iterator-test.ts b/lib/get-iterator-test.ts index 21baa56a..df243eb1 100644 --- a/lib/get-iterator-test.ts +++ b/lib/get-iterator-test.ts @@ -46,4 +46,9 @@ describe('getIterator', () => { value: 1, }) }) + it("throws if it's not an iterator", () => { + assert.throw(() => { + getIterator(4 as any) + }) + }) }) diff --git a/lib/parallel-flat-map-test.ts b/lib/parallel-flat-map-test.ts index 1a7bacf1..047cdda6 100644 --- a/lib/parallel-flat-map-test.ts +++ b/lib/parallel-flat-map-test.ts @@ -41,6 +41,15 @@ describe('parallelFlatMap', () => { } assert.deepEqual(values, ['1', '2', '3']) }) + it('lets you curry a function and then fill the contract', async () => { + const values: any[] = [] + const doubleTime = parallelFlatMap(2) + const stringParallelFlatMap = doubleTime(asyncStringArr, [1, 2, 3]) + for await (const val of stringParallelFlatMap) { + values.push(val) + } + assert.deepEqual(values, ['1', '2', '3']) + }) it('runs concurrent mapping operations', async () => { let mapCount = 0 const counter = () => mapCount++ diff --git a/lib/reduce-test.ts b/lib/reduce-test.ts index 36a3d917..1ab52448 100644 --- a/lib/reduce-test.ts +++ b/lib/reduce-test.ts @@ -31,4 +31,9 @@ describe('reduce', () => { const addZero = addAble(0) assert.equal(await addZero([1, 2, 3]), 6) }) + it('supports an undefined start after currying', async () => { + const reduceAdd = reduce((num1?: number, num2?: number) => (num1 || 0) + (num2 || 0)) + const addZero = reduceAdd(undefined, [1, 2, 3]) + assert.equal(await addZero, 6) + }) }) diff --git a/lib/reduce.ts b/lib/reduce.ts index 3915f93a..9e1feee8 100644 --- a/lib/reduce.ts +++ b/lib/reduce.ts @@ -19,7 +19,7 @@ export function reduce(func: (acc: B, value: T) => B, start: B, iterable: export function reduce(func: (acc: B, value: T) => B, start?: B, iterable?: AnyIterable) { if (start === undefined) { return (curriedStart: B, curriedIterable?: AnyIterable) => - curriedIterable ? reduce(func, curriedStart, curriedIterable) : reduce(func, curriedStart) + curriedIterable ? _reduce(func, curriedStart, curriedIterable) : reduce(func, curriedStart) } if (iterable === undefined) { return (curriedIterable: AnyIterable) => reduce(func, start, curriedIterable) diff --git a/lib/take.ts b/lib/take.ts index 35dcfd02..66cec894 100644 --- a/lib/take.ts +++ b/lib/take.ts @@ -7,7 +7,7 @@ async function* _take(count: number, iterable: AsyncIterable) { yield await val taken++ if (taken >= count) { - return + break } } } @@ -18,7 +18,7 @@ function* _syncTake(count: number, iterable: Iterable) { yield val taken++ if (taken >= count) { - return + break } } } diff --git a/lib/write-to-stream-test.ts b/lib/write-to-stream-test.ts index da689862..48a3584e 100644 --- a/lib/write-to-stream-test.ts +++ b/lib/write-to-stream-test.ts @@ -12,6 +12,15 @@ describe('writeToStream', () => { assert.equal(stream.read(), 2) assert.equal(stream.read(), 3) }) + it('curries', async () => { + const values = [1, 2, 3] + const stream = new PassThrough({ highWaterMark: 4, objectMode: true }) + const streamWrite = writeToStream(stream) + await streamWrite(values) + assert.equal(stream.read(), 1) + assert.equal(stream.read(), 2) + assert.equal(stream.read(), 3) + }) it('respects backpressure', async () => { let lastYield = 0 function* values() { diff --git a/lib/write-to-stream.ts b/lib/write-to-stream.ts index 0f63f3f3..39f8938c 100644 --- a/lib/write-to-stream.ts +++ b/lib/write-to-stream.ts @@ -7,12 +7,6 @@ export interface WritableStreamish { removeListener: any } -function once(event: string, stream: WritableStreamish): Promise { - return new Promise(resolve => { - stream.once(event, resolve) - }) -} - async function _writeToStream(stream: WritableStreamish, iterable: AnyIterable): Promise { let lastError = null let errCb: NullOrFunction = null diff --git a/package-lock.json b/package-lock.json index 709e5cd5..f116cf53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,28 @@ "js-tokens": "^4.0.0" } }, + "@babel/runtime-corejs3": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.4.tgz", + "integrity": "sha512-BFlgP2SoLO9HJX9WBwN67gHWMBhDX/eDz64Jajd6mR/UAUzqrNMm99d4qHnVaKscAElZoFiPv+JpR/Siud5lXw==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@microsoft/api-extractor": { "version": "7.8.15", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.8.15.tgz", @@ -117,6 +139,24 @@ "integrity": "sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw==", "dev": true }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/is-windows": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/is-windows/-/is-windows-1.0.0.tgz", + "integrity": "sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, "@types/mocha": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", @@ -267,6 +307,160 @@ "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", "dev": true }, + "c8": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.2.0.tgz", + "integrity": "sha512-6ZnvGem2HkcOnfRflVojBHKqGj5JGxoSSYvk8U9qF87WYbq3vpdjAQPE+Gr0jxpTaAM/N3nxx30TIWB5u0PhWw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.2", + "find-up": "^4.0.0", + "foreground-child": "^2.0.0", + "furi": "^2.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.0.2", + "rimraf": "^3.0.0", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^4.1.2", + "yargs": "^15.0.0", + "yargs-parser": "^18.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "decamelize": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", + "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", + "dev": true, + "requires": { + "xregexp": "^4.2.4" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.0.tgz", + "integrity": "sha512-D3fRFnZwLWp8jVAAhPZBsmeIHY8tTsb8ItV9KaAaopmC6wde2u6Yw29JBIZHXw14kgkRnYmDgmQU4FVMDlIsWw==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^3.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + } + } + } + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -403,12 +597,38 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -575,6 +795,16 @@ "is-buffer": "~2.0.3" } }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -605,6 +835,16 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "furi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/furi/-/furi-2.0.0.tgz", + "integrity": "sha512-uKuNsaU0WVaK/vmvj23wW1bicOFfyqSsAIH71bRZx8kA4Xj+YCHin7CJKJJjkIsmxYaPFLk9ljmjEyB7xF7WvQ==", + "dev": true, + "requires": { + "@types/is-windows": "^1.0.0", + "is-windows": "^1.0.2" + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -679,6 +919,12 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -797,6 +1043,12 @@ "has-symbols": "^1.0.1" } }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -809,6 +1061,33 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "iterate-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", @@ -904,6 +1183,23 @@ "chalk": "^2.4.2" } }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1048,6 +1344,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -1121,6 +1423,12 @@ "picomatch": "^2.0.7" } }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1142,6 +1450,15 @@ "path-parse": "^1.0.6" } }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "rollup": { "version": "2.18.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.18.2.tgz", @@ -1197,6 +1514,27 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1290,6 +1628,17 @@ } } }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -1444,6 +1793,25 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "validator": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz", @@ -1525,6 +1893,15 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 755ad793..9a74df01 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "runkitExampleFilename": "example.js", "scripts": { "test": "npm run unit-test && npm run lint", - "unit-test": "mocha", + "unit-test": "c8 -r html -r text mocha", + "check-coverage": "c8 check-coverage --lines 95 --functions 95 --branches 95", "lint": "tsc && tslint lib/*.ts", "format": "tslint lib/*.ts --fix", "build": "tsc -p tsconfig-build.json && rollup -c && api-extractor run --local --verbose", @@ -46,6 +47,7 @@ "@types/node": "^14.0.14", "benchmark": "^2.1.4", "bluestream": "^10.3.3", + "c8": "^7.2.0", "chai": "^4.2.0", "mocha": "^8.0.1", "prettier": "^2.0.5",