diff --git a/.babelrc b/.babelrc index cea6528..81cba26 100644 --- a/.babelrc +++ b/.babelrc @@ -1,20 +1,3 @@ { - "presets": ["@babel/env"], - "env": { - "production-esm": { - "presets": [["@babel/env", { "modules": false }]] - }, - "test": { - "presets": [ - [ - "@babel/env", - { - "targets": { - "node": "current" - } - } - ] - ] - } - } + "presets": ["@babel/typescript", "@babel/env"] } diff --git a/.eslintrc.json b/.eslintrc.json index 548c93a..8672451 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,9 @@ { - "extends": "wojtekmaj" + "extends": [ + "wojtekmaj", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint"] } diff --git a/package.json b/package.json index f3fb40f..6785e45 100644 --- a/package.json +++ b/package.json @@ -4,19 +4,21 @@ "description": "A collection of array-related async utilities.", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", - "source": "src/index.js", + "source": "src/index.ts", + "types": "src/index.ts", "sideEffects": false, "scripts": { "build": "yarn build-esm && yarn build-cjs", - "build-esm": "BABEL_ENV=production-esm babel src -d dist/esm --ignore \"**/*.spec.js\"", - "build-cjs": "BABEL_ENV=production-cjs babel src -d dist/cjs --ignore \"**/*.spec.js\"", + "build-esm": "tsc --project tsconfig.build.json --outDir dist/esm --module esnext", + "build-cjs": "tsc --project tsconfig.build.json --outDir dist/cjs --module commonjs", "clean": "rimraf dist", "jest": "jest", "lint": "eslint src", "postinstall": "husky install", "prepack": "yarn clean && yarn build", "prettier": "prettier --check . --cache", - "test": "yarn lint && yarn prettier && yarn jest" + "test": "yarn lint && yarn tsc && yarn prettier && yarn jest", + "tsc": "tsc --noEmit" }, "keywords": [ "array", @@ -30,16 +32,20 @@ }, "license": "MIT", "devDependencies": { - "@babel/cli": "^7.15.0", "@babel/core": "^7.15.0", "@babel/preset-env": "^7.15.0", + "@babel/preset-typescript": "^7.18.6", + "@types/jest": "^29.0.0", + "@typescript-eslint/eslint-plugin": "^5.41.0", + "@typescript-eslint/parser": "^5.44.0", "eslint": "^8.26.0", "eslint-config-wojtekmaj": "^0.7.1", "husky": "^8.0.0", "jest": "^29.0.0", "prettier": "^2.7.0", "pretty-quick": "^3.1.0", - "rimraf": "^3.0.0" + "rimraf": "^3.0.0", + "typescript": "^4.9.4" }, "resolutions": { "semver@7.0.0": "^7.0.0" diff --git a/src/every.spec.js b/src/every.spec.ts similarity index 70% rename from src/every.spec.js rename to src/every.spec.ts index 6522baf..0c92f60 100644 --- a/src/every.spec.js +++ b/src/every.spec.ts @@ -9,12 +9,12 @@ import { throws, } from '../test-utils'; -function largerOrEqualThanZero(x) { +function largerOrEqualThanZero(x: number) { return x >= 0; } -function largerOrEqualThanZeroInRandomTime(x) { - return new Promise((resolve) => +function largerOrEqualThanZeroInRandomTime(x: number) { + return new Promise((resolve) => setTimeout(() => { resolve(x >= 0); }, Math.random() * 100), @@ -115,4 +115,41 @@ describe('asyncEvery()', () => { await expect(() => asyncEvery(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type boolean given function that returns type Promise', async () => { + // @ts-expect-no-error + const result: boolean = await asyncEvery(inputArr, largerOrEqualThanZeroInRandomTime); + + expect(typeof result).toBe('boolean'); + }); + + it('returns type true given function that returns type Promise', async () => { + async function trueInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(true); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: true = await asyncEvery(inputArr, trueInRandomTime); + + expect(result).toBe(true); + }); + + it('returns type false given function that returns type Promise', async () => { + async function falseInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(false); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: false = await asyncEvery(inputArr, falseInRandomTime); + + expect(result).toBe(false); + }); }); diff --git a/src/every.js b/src/every.ts similarity index 52% rename from src/every.js rename to src/every.ts index 34109bd..e2b8383 100644 --- a/src/every.js +++ b/src/every.ts @@ -1,12 +1,27 @@ import asyncForEach from './forEach'; -export default function asyncEvery(arr, fn) { - let resolved; +function asyncEvery( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncEvery( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncEvery( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncEvery( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + let resolved: boolean; return new Promise((resolve, reject) => { asyncForEach( arr, (cur, idx, arr2) => - new Promise((resolve2, reject2) => { + new Promise((resolve2, reject2) => { if (resolved) { return; } @@ -31,3 +46,5 @@ export default function asyncEvery(arr, fn) { }); }); } + +export default asyncEvery; diff --git a/src/every_strict.js b/src/every_strict.js deleted file mode 100644 index cfeaf3c..0000000 --- a/src/every_strict.js +++ /dev/null @@ -1,33 +0,0 @@ -import asyncForEachStrict from './forEach_strict'; - -export default function asyncEveryStrict(arr, fn) { - let resolved; - return new Promise((resolve, reject) => { - asyncForEachStrict( - arr, - (cur, idx, arr2) => - new Promise((resolve2, reject2) => { - if (resolved) { - return; - } - fn(cur, idx, arr2) - .then((result) => { - if (!result) { - resolve(false); - resolved = true; - } - resolve2(); - }) - .catch(reject2); - }), - ) - .then(() => { - resolve(true); - resolved = true; - }) - .catch((error) => { - reject(error); - resolved = true; - }); - }); -} diff --git a/src/every_strict.spec.js b/src/every_strict.spec.ts similarity index 76% rename from src/every_strict.spec.js rename to src/every_strict.spec.ts index 4f0c61c..a2e055c 100644 --- a/src/every_strict.spec.js +++ b/src/every_strict.spec.ts @@ -12,12 +12,12 @@ import { throws, } from '../test-utils'; -function largerOrEqualThanZero(x) { +function largerOrEqualThanZero(x: number) { return x >= 0; } -function largerOrEqualThanZeroInRandomTime(x) { - return new Promise((resolve) => +function largerOrEqualThanZeroInRandomTime(x: number) { + return new Promise((resolve) => setTimeout(() => { resolve(x >= 0); }, Math.random() * 100), @@ -26,7 +26,7 @@ function largerOrEqualThanZeroInRandomTime(x) { describe('asyncEveryStrict()', () => { it('example from README works as described', async () => { - const indexes = []; + const indexes: number[] = []; const largerThanZero = await asyncEveryStrict([1, 2, 3], async (el, index) => { indexes.push(index); @@ -150,4 +150,41 @@ describe('asyncEveryStrict()', () => { await expect(() => asyncEveryStrict(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type boolean given function that returns type Promise', async () => { + // @ts-expect-no-error + const result: boolean = await asyncEveryStrict(inputArr, largerOrEqualThanZeroInRandomTime); + + expect(typeof result).toBe('boolean'); + }); + + it('returns type true given function that returns type Promise', async () => { + async function trueInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(true); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: true = await asyncEveryStrict(inputArr, trueInRandomTime); + + expect(result).toBe(true); + }); + + it('returns type false given function that returns type Promise', async () => { + async function falseInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(false); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: false = await asyncEveryStrict(inputArr, falseInRandomTime); + + expect(result).toBe(false); + }); }); diff --git a/src/every_strict.ts b/src/every_strict.ts new file mode 100644 index 0000000..c8aed67 --- /dev/null +++ b/src/every_strict.ts @@ -0,0 +1,50 @@ +import asyncForEachStrict from './forEach_strict'; + +function asyncEveryStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncEveryStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncEveryStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncEveryStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + let resolved: boolean; + return new Promise((resolve, reject) => { + asyncForEachStrict( + arr, + (cur, idx, arr2) => + new Promise((resolve2, reject2) => { + if (resolved) { + return; + } + fn(cur, idx, arr2) + .then((result) => { + if (!result) { + resolve(false); + resolved = true; + } + resolve2(); + }) + .catch(reject2); + }), + ) + .then(() => { + resolve(true); + resolved = true; + }) + .catch((error) => { + reject(error); + resolved = true; + }); + }); +} + +export default asyncEveryStrict; diff --git a/src/filter.js b/src/filter.js deleted file mode 100644 index 9627d61..0000000 --- a/src/filter.js +++ /dev/null @@ -1,20 +0,0 @@ -import asyncForEach from './forEach'; - -export default function asyncFilter(arr, fn) { - const result = []; - - return asyncForEach( - arr, - (cur, idx, arr2) => - new Promise((resolve, reject) => { - fn(cur, idx, arr2) - .then((cond) => { - if (cond) { - result[idx] = cur; - } - resolve(); - }) - .catch(reject); - }), - ).then(() => result.filter((cur, idx) => idx in result)); -} diff --git a/src/filter.spec.js b/src/filter.spec.ts similarity index 80% rename from src/filter.spec.js rename to src/filter.spec.ts index 5c5f55e..8044660 100644 --- a/src/filter.spec.js +++ b/src/filter.spec.ts @@ -87,4 +87,22 @@ describe('asyncFilter()', () => { await expect(() => asyncFilter(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type T[] given function that returns type Promise', async () => { + // @ts-expect-no-error + const result: number[] = await asyncFilter(inputArr, largerThanTwoInRandomTime); + }); + + it('returns type never[] given function that returns type Promise', async () => { + async function falseInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(false); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: never[] = await asyncFilter(inputArr, falseInRandomTime); + }); }); diff --git a/src/filter.ts b/src/filter.ts new file mode 100644 index 0000000..b7fcbe8 --- /dev/null +++ b/src/filter.ts @@ -0,0 +1,33 @@ +import asyncForEach from './forEach'; + +function asyncFilter( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncFilter( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncFilter( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + const result: T[] = []; + + return asyncForEach( + arr, + (cur, idx, arr2) => + new Promise((resolve, reject) => { + fn(cur, idx, arr2) + .then((cond) => { + if (cond) { + result[idx] = cur; + } + resolve(); + }) + .catch(reject); + }), + ).then(() => result.filter((cur, idx) => idx in result)); +} + +export default asyncFilter; diff --git a/src/filter_strict.js b/src/filter_strict.js deleted file mode 100644 index ded890f..0000000 --- a/src/filter_strict.js +++ /dev/null @@ -1,20 +0,0 @@ -import asyncForEachStrict from './forEach_strict'; - -export default function asyncFilterStrict(arr, fn) { - const result = []; - - return asyncForEachStrict( - arr, - (cur, idx, arr2) => - new Promise((resolve, reject) => { - fn(cur, idx, arr2) - .then((cond) => { - if (cond) { - result[idx] = cur; - } - resolve(); - }) - .catch(reject); - }), - ).then(() => result.filter((cur, idx) => idx in result)); -} diff --git a/src/filter_strict.spec.js b/src/filter_strict.spec.ts similarity index 83% rename from src/filter_strict.spec.js rename to src/filter_strict.spec.ts index 67e9e12..6c649c3 100644 --- a/src/filter_strict.spec.js +++ b/src/filter_strict.spec.ts @@ -14,7 +14,7 @@ import { describe('asyncFilterStrict()', () => { it('example from README works as described', async () => { - const indexes = []; + const indexes: number[] = []; const asyncFilteredArr = await asyncFilterStrict([1, 2, 3], async (el, index) => { indexes.push(index); @@ -116,4 +116,22 @@ describe('asyncFilterStrict()', () => { await expect(() => asyncFilterStrict(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type T[] given function that returns type Promise', async () => { + // @ts-expect-no-error + const result: number[] = await asyncFilterStrict(inputArr, largerThanTwoInRandomTime); + }); + + it('returns type never[] given function that returns type Promise', async () => { + async function falseInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(false); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: never[] = await asyncFilterStrict(inputArr, falseInRandomTime); + }); }); diff --git a/src/filter_strict.ts b/src/filter_strict.ts new file mode 100644 index 0000000..d18b7e5 --- /dev/null +++ b/src/filter_strict.ts @@ -0,0 +1,33 @@ +import asyncForEachStrict from './forEach_strict'; + +function asyncFilterStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncFilterStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncFilterStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + const result: T[] = []; + + return asyncForEachStrict( + arr, + (cur, idx, arr2) => + new Promise((resolve, reject) => { + fn(cur, idx, arr2) + .then((cond) => { + if (cond) { + result[idx] = cur; + } + resolve(); + }) + .catch(reject); + }), + ).then(() => result.filter((cur, idx) => idx in result)); +} + +export default asyncFilterStrict; diff --git a/src/forEach.spec.js b/src/forEach.spec.ts similarity index 100% rename from src/forEach.spec.js rename to src/forEach.spec.ts diff --git a/src/forEach.js b/src/forEach.ts similarity index 54% rename from src/forEach.js rename to src/forEach.ts index 5faec7f..2f103ae 100644 --- a/src/forEach.js +++ b/src/forEach.ts @@ -1,6 +1,9 @@ import asyncMap from './map'; -export default function asyncForEach(arr, fn) { +export default function asyncForEach( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { return new Promise((resolve, reject) => { asyncMap(arr, fn) .then(() => resolve()) diff --git a/src/forEach_strict.spec.js b/src/forEach_strict.spec.ts similarity index 99% rename from src/forEach_strict.spec.js rename to src/forEach_strict.spec.ts index 202bbbd..0de08ad 100644 --- a/src/forEach_strict.spec.js +++ b/src/forEach_strict.spec.ts @@ -12,7 +12,7 @@ import { describe('asyncForEachStrict()', () => { it('example from README works as described', async () => { const consoleLog = jest.fn(); - const indexes = []; + const indexes: number[] = []; await asyncForEachStrict([1, 2, 3], async (el, index) => { indexes.push(index); diff --git a/src/forEach_strict.js b/src/forEach_strict.ts similarity index 56% rename from src/forEach_strict.js rename to src/forEach_strict.ts index 7d68e81..f0e2924 100644 --- a/src/forEach_strict.js +++ b/src/forEach_strict.ts @@ -1,6 +1,9 @@ import asyncMapStrict from './map_strict'; -export default function asyncForEachStrict(arr, fn) { +export default function asyncForEachStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { return new Promise((resolve, reject) => { asyncMapStrict(arr, fn) .then(() => resolve()) diff --git a/src/index.spec.js b/src/index.spec.ts similarity index 100% rename from src/index.spec.js rename to src/index.spec.ts diff --git a/src/index.js b/src/index.ts similarity index 100% rename from src/index.js rename to src/index.ts diff --git a/src/map.js b/src/map.js deleted file mode 100644 index a98fcc9..0000000 --- a/src/map.js +++ /dev/null @@ -1,5 +0,0 @@ -export default function asyncMap(arr, fn) { - return new Promise((resolve, reject) => { - Promise.all(arr.map(fn)).then(resolve).catch(reject); - }); -} diff --git a/src/map.spec.js b/src/map.spec.ts similarity index 84% rename from src/map.spec.js rename to src/map.spec.ts index 2bb9f5f..db5e19a 100644 --- a/src/map.spec.js +++ b/src/map.spec.ts @@ -88,4 +88,19 @@ describe('asyncMap()', () => { await expect(() => asyncMap(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type true[] given function that returns type Promise', async () => { + async function stringInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve('foo'); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: string[] = await asyncMap([1, 2, 3], stringInRandomTime); + + expect(result).toEqual(['foo', 'foo', 'foo']); + }); }); diff --git a/src/map.ts b/src/map.ts new file mode 100644 index 0000000..ce46e69 --- /dev/null +++ b/src/map.ts @@ -0,0 +1,8 @@ +export default function asyncMap( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + return new Promise((resolve, reject) => { + Promise.all(arr.map(fn)).then(resolve).catch(reject); + }); +} diff --git a/src/map_strict.spec.js b/src/map_strict.spec.ts similarity index 87% rename from src/map_strict.spec.js rename to src/map_strict.spec.ts index 3ecd9e1..4965c6b 100644 --- a/src/map_strict.spec.js +++ b/src/map_strict.spec.ts @@ -14,7 +14,7 @@ import { describe('asyncMapStrict()', () => { it('example from README works as described', async () => { - const indexes = []; + const indexes: number[] = []; const asyncMappedArr = await asyncMapStrict([1, 2, 3], async (el, index) => { indexes.push(index); @@ -116,4 +116,19 @@ describe('asyncMapStrict()', () => { await expect(() => asyncMapStrict(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type true[] given function that returns type Promise', async () => { + async function stringInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve('foo'); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: string[] = await asyncMapStrict([1, 2, 3], stringInRandomTime); + + expect(result).toEqual(['foo', 'foo', 'foo']); + }); }); diff --git a/src/map_strict.js b/src/map_strict.ts similarity index 68% rename from src/map_strict.js rename to src/map_strict.ts index 46ba32c..8383804 100644 --- a/src/map_strict.js +++ b/src/map_strict.ts @@ -1,6 +1,9 @@ -export default function asyncMapStrict(arr, fn) { +export default function asyncMapStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { return new Promise((resolve, reject) => { - const result = []; + const result: U[] = []; arr .reduce( (promise, cur, idx) => diff --git a/src/reduce.js b/src/reduce.js deleted file mode 100644 index 4538736..0000000 --- a/src/reduce.js +++ /dev/null @@ -1,24 +0,0 @@ -import asyncForEachStrict from './forEach_strict'; - -export default function asyncReduce(arr, fn, initialValue) { - let temp = initialValue; - - return new Promise((resolve, reject) => { - asyncForEachStrict( - arr, - (cur, idx) => - new Promise((resolve2, reject2) => { - fn(temp, cur, idx) - .then((result) => { - temp = result; - resolve2(); - }) - .catch(reject2); - }), - ) - .then(() => { - resolve(temp); - }) - .catch(reject); - }); -} diff --git a/src/reduce.spec.js b/src/reduce.spec.ts similarity index 100% rename from src/reduce.spec.js rename to src/reduce.spec.ts diff --git a/src/reduce.ts b/src/reduce.ts new file mode 100644 index 0000000..55d6c8a --- /dev/null +++ b/src/reduce.ts @@ -0,0 +1,44 @@ +import asyncForEachStrict from './forEach_strict'; + +function asyncReduce( + arr: T[], + fn: (previousValue: T, currentValue: T, currentIndex: number) => Promise, +): Promise; +function asyncReduce( + arr: T[], + fn: (previousValue: T, currentValue: T, currentIndex: number) => Promise, + initialValue: T, +): Promise; +function asyncReduce( + arr: T[], + fn: (previousValue: U, currentValue: T, currentIndex: number) => Promise, + initialValue: U, +): Promise; +function asyncReduce( + arr: T[], + fn: (previousValue: T | U | undefined, currentValue: T, currentIndex: number) => Promise, + initialValue?: T | U, +): Promise { + let temp = initialValue; + + return new Promise((resolve, reject) => { + asyncForEachStrict( + arr, + (cur, idx) => + new Promise((resolve2, reject2) => { + fn(temp, cur, idx) + .then((result) => { + temp = result; + resolve2(); + }) + .catch(reject2); + }), + ) + .then(() => { + resolve(temp); + }) + .catch(reject); + }); +} + +export default asyncReduce; diff --git a/src/some.spec.js b/src/some.spec.ts similarity index 73% rename from src/some.spec.js rename to src/some.spec.ts index 3229f59..0654736 100644 --- a/src/some.spec.js +++ b/src/some.spec.ts @@ -105,4 +105,41 @@ describe('asyncSome()', () => { await expect(() => asyncSome(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type boolean given function that returns type Promise', async () => { + // @ts-expect-no-error + const result: boolean = await asyncSome(inputArr, largerThanOneHundredInRandomTime); + + expect(typeof result).toBe('boolean'); + }); + + it('returns type true given function that returns type Promise', async () => { + async function trueInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(true); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: true = await asyncSome(inputArr, trueInRandomTime); + + expect(result).toBe(true); + }); + + it('returns type false given function that returns type Promise', async () => { + async function falseInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(false); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: false = await asyncSome(inputArr, falseInRandomTime); + + expect(result).toBe(false); + }); }); diff --git a/src/some.js b/src/some.ts similarity index 52% rename from src/some.js rename to src/some.ts index a4c57db..8735972 100644 --- a/src/some.js +++ b/src/some.ts @@ -1,12 +1,27 @@ import asyncForEach from './forEach'; -export default function asyncSome(arr, fn) { - let resolved; +function asyncSome( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncSome( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncSome( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncSome( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + let resolved: boolean; return new Promise((resolve, reject) => { asyncForEach( arr, (cur, idx, arr2) => - new Promise((resolve2, reject2) => { + new Promise((resolve2, reject2) => { if (resolved) { return; } @@ -31,3 +46,5 @@ export default function asyncSome(arr, fn) { }); }); } + +export default asyncSome; diff --git a/src/some_strict.spec.js b/src/some_strict.spec.ts similarity index 77% rename from src/some_strict.spec.js rename to src/some_strict.spec.ts index d659bdb..1d43331 100644 --- a/src/some_strict.spec.js +++ b/src/some_strict.spec.ts @@ -18,7 +18,7 @@ const firstElementLargerThanTwo = inputArr.findIndex(largerThanTwo); describe('asyncSomeStrict()', () => { it('example from README works as described', async () => { - const indexes = []; + const indexes: number[] = []; const largerThanZero = await asyncSomeStrict([1, 2, 3], async (el, index) => { indexes.push(index); @@ -136,4 +136,41 @@ describe('asyncSomeStrict()', () => { await expect(() => asyncSomeStrict(inputArr, mapper)).rejects.toThrow('Some error'); }); + + it('returns type boolean given function that returns type Promise', async () => { + // @ts-expect-no-error + const result: boolean = await asyncSomeStrict(inputArr, largerThanOneHundredInRandomTime); + + expect(typeof result).toBe('boolean'); + }); + + it('returns type true given function that returns type Promise', async () => { + async function trueInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(true); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: true = await asyncSomeStrict(inputArr, trueInRandomTime); + + expect(result).toBe(true); + }); + + it('returns type false given function that returns type Promise', async () => { + async function falseInRandomTime() { + return new Promise((resolve) => + setTimeout(() => { + resolve(false); + }, Math.random() * 100), + ); + } + + // @ts-expect-no-error + const result: false = await asyncSomeStrict(inputArr, falseInRandomTime); + + expect(result).toBe(false); + }); }); diff --git a/src/some_strict.js b/src/some_strict.ts similarity index 52% rename from src/some_strict.js rename to src/some_strict.ts index 1c101b1..a0043ba 100644 --- a/src/some_strict.js +++ b/src/some_strict.ts @@ -1,12 +1,27 @@ import asyncForEachStrict from './forEach_strict'; -export default function asyncSomeStrict(arr, fn) { - let resolved; +function asyncSomeStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncSomeStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncSomeStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise; +function asyncSomeStrict( + arr: T[], + fn: (cur: T, idx: number, arr: T[]) => Promise, +): Promise { + let resolved: boolean; return new Promise((resolve, reject) => { asyncForEachStrict( arr, (cur, idx, arr2) => - new Promise((resolve2, reject2) => { + new Promise((resolve2, reject2) => { if (resolved) { return; } @@ -31,3 +46,5 @@ export default function asyncSomeStrict(arr, fn) { }); }); } + +export default asyncSomeStrict; diff --git a/test-utils.js b/test-utils.ts similarity index 56% rename from test-utils.js rename to test-utils.ts index 0d55324..9352304 100644 --- a/test-utils.js +++ b/test-utils.ts @@ -3,7 +3,7 @@ export function getRandomTime() { } export function getTimer() { - let startTime; + let startTime: Date; function start() { startTime = new Date(); @@ -12,54 +12,57 @@ export function getTimer() { function stop() { const endTime = new Date(); - return endTime - startTime; + return endTime.getTime() - startTime.getTime(); } return { start, stop }; } -export function makeDelayed(fn, delay = getRandomTime()) { - return function delayedFunction(x) { +export function makeDelayed( + fn: (...args: T) => R, + delay = getRandomTime(), +): (...args: T) => Promise { + return function delayedFunction(...args) { return new Promise((resolve) => setTimeout(() => { - resolve(fn(x)); + resolve(fn(...args)); }, delay), ); }; } -export function duplicate(x) { +export function duplicate(x: number) { return x * 2; } export const duplicateInRandomTime = makeDelayed(duplicate); -export function largerThanTwo(x) { +export function largerThanTwo(x: Number) { return x > 2; } export const largerThanTwoInRandomTime = makeDelayed(largerThanTwo); -export function largerThanOneHundred(x) { +export function largerThanOneHundred(x: number) { return x > 100; } export const largerThanOneHundredInRandomTime = makeDelayed(largerThanOneHundred); -export function makePushDuplicate() { - const arr = []; +export function makePushDuplicate(): [number[], (x: number) => void] { + const arr: number[] = []; - function pushDuplicate(x) { + function pushDuplicate(x: number) { arr.push(x * 2); } return [arr, pushDuplicate]; } -export function makePushDuplicateInRandomTime() { - const arr = []; +export function makePushDuplicateInRandomTime(): [number[], (x: number) => Promise] { + const arr: number[] = []; - async function pushDuplicate(x) { + async function pushDuplicate(x: number) { arr.push(await duplicateInRandomTime(x)); } diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..5417c7d --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.spec.ts"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1a17339 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "importsNotUsedAsValues": "error", + "isolatedModules": true, + "moduleResolution": "node", + "noUncheckedIndexedAccess": true, + "outDir": "dist", + "strict": true, + "strictNullChecks": true, + "target": "es5" + }, + "include": ["src"] +} diff --git a/yarn.lock b/yarn.lock index 8646e33..d5a42e0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,33 +15,6 @@ __metadata: languageName: node linkType: hard -"@babel/cli@npm:^7.15.0": - version: 7.20.7 - resolution: "@babel/cli@npm:7.20.7" - dependencies: - "@jridgewell/trace-mapping": ^0.3.8 - "@nicolo-ribaudo/chokidar-2": 2.1.8-no-fsevents.3 - chokidar: ^3.4.0 - commander: ^4.0.1 - convert-source-map: ^1.1.0 - fs-readdir-recursive: ^1.1.0 - glob: ^7.2.0 - make-dir: ^2.1.0 - slash: ^2.0.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - dependenciesMeta: - "@nicolo-ribaudo/chokidar-2": - optional: true - chokidar: - optional: true - bin: - babel: ./bin/babel.js - babel-external-helpers: ./bin/babel-external-helpers.js - checksum: 162d9645b82925cfd0a40162bbe2ed0014b215478165091c6cf9eed1fc89ceb0c462d37f4b0be48b5dc5453be33c96af092e290328deef788f18c2ae4e6618e3 - languageName: node - linkType: hard - "@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.18.6": version: 7.18.6 resolution: "@babel/code-frame@npm:7.18.6" @@ -786,7 +759,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.7.2": +"@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.7.2": version: 7.20.0 resolution: "@babel/plugin-syntax-typescript@npm:7.20.0" dependencies: @@ -1153,6 +1126,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.18.6": + version: 7.20.7 + resolution: "@babel/plugin-transform-typescript@npm:7.20.7" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.20.7 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-typescript": ^7.20.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ca569a1b8001e7e8971874656091789c6b3209f155c91c56bce82b545e43d09d156b4fcf2f0dfcdf7911a2c546c7090c2aff167a5692443f6f0382b358c233e0 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.18.10": version: 7.18.10 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.18.10" @@ -1276,6 +1262,19 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/preset-typescript@npm:7.18.6" + dependencies: + "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-validator-option": ^7.18.6 + "@babel/plugin-transform-typescript": ^7.18.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7fe0da5103eb72d3cf39cf3e138a794c8cdd19c0b38e3e101507eef519c46a87a0d6d0e8bc9e28a13ea2364001ebe7430b9d75758aab4c3c3a8db9a487b9dc7c + languageName: node + linkType: hard + "@babel/runtime-corejs3@npm:^7.10.2": version: 7.20.7 resolution: "@babel/runtime-corejs3@npm:7.20.7" @@ -1683,7 +1682,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.8, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.17 resolution: "@jridgewell/trace-mapping@npm:0.3.17" dependencies: @@ -1693,13 +1692,6 @@ __metadata: languageName: node linkType: hard -"@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3": - version: 2.1.8-no-fsevents.3 - resolution: "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3" - checksum: ee55cc9241aeea7eb94b8a8551bfa4246c56c53bc71ecda0a2104018fcc328ba5723b33686bdf9cc65d4df4ae65e8016b89e0bbdeb94e0309fe91bb9ced42344 - languageName: node - linkType: hard - "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1710,14 +1702,14 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.stat@npm:2.0.5": +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -1854,6 +1846,23 @@ __metadata: languageName: node linkType: hard +"@types/jest@npm:^29.0.0": + version: 29.4.0 + resolution: "@types/jest@npm:29.4.0" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: 23760282362a252e6690314584d83a47512d4cd61663e957ed3398ecf98195fe931c45606ee2f9def12f8ed7d8aa102d492ec42d26facdaf8b78094a31e6568e + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.9": + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d + languageName: node + linkType: hard + "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -1882,6 +1891,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.3.12": + version: 7.3.13 + resolution: "@types/semver@npm:7.3.13" + checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.1 resolution: "@types/stack-utils@npm:2.0.1" @@ -1905,13 +1921,136 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:^5.41.0": + version: 5.49.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.49.0" + dependencies: + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/type-utils": 5.49.0 + "@typescript-eslint/utils": 5.49.0 + debug: ^4.3.4 + ignore: ^5.2.0 + natural-compare-lite: ^1.4.0 + regexpp: ^3.2.0 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 15423cd9fde1ac3f8ba34526a07e537464e70463f1af784be5567fdc78e5745352fa0a2c3be0c13d066bc4b9720b5fa438d64647f624d29722eb4f158c039dcc + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.44.0": + version: 5.49.0 + resolution: "@typescript-eslint/parser@npm:5.49.0" + dependencies: + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/typescript-estree": 5.49.0 + debug: ^4.3.4 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 87b3760cfc29b3edd3d28fe0d5e9e5a3833d60398d7779ecc657b9e3bfec624cd464176e26b24b0761fb79cc88daddae19560340f91119c4856b91f9663594dd + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/scope-manager@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/visitor-keys": 5.49.0 + checksum: 466047e24ff8a4195f14aadde39375f22891bdaced09e58c89f2c32af0aa4a0d87e71a5f006f6ab76858e6f30c4b764b1e0ef7bc26713bb78add30638108c45f + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/type-utils@npm:5.49.0" + dependencies: + "@typescript-eslint/typescript-estree": 5.49.0 + "@typescript-eslint/utils": 5.49.0 + debug: ^4.3.4 + tsutils: ^3.21.0 + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 9dcee0a21cfdb3549e2305120535af5ab2c5d0cafdd410827e79d7548f8fc4e7da7cbb77a4338ade8b8b8aaf246fee56b919f1857931bbe2ac5df2fbb5e62ee6 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/types@npm:5.49.0" + checksum: 41f72a043007fc3f3356b5a38d7bfa54871545b4a309810a062f044cff25122413a9660ce6d83d1221762f60d067351d020b0cb68f7e1279817f53e77ce8f33d + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/visitor-keys": 5.49.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: f331af9f0ef3ce3157c421b8cc727dec5aa0a60add305aa4c676a02c63ec07799105268af192c5ed193a682b7ed804564d29d49bdbd2019678e495d80e65e29a + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/utils@npm:5.49.0" + dependencies: + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.49.0 + "@typescript-eslint/types": 5.49.0 + "@typescript-eslint/typescript-estree": 5.49.0 + eslint-scope: ^5.1.1 + eslint-utils: ^3.0.0 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 8218c566637d5104dfb2346216f8cb4c244f31c2a39e261aafe554b8abd48bd630a0d0807a0a8d776af8f9d9914c8776d86abf0a523049f3c5619c498a7e5b1e + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.49.0": + version: 5.49.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.49.0" + dependencies: + "@typescript-eslint/types": 5.49.0 + eslint-visitor-keys: ^3.3.0 + checksum: 46dc7bc713e8825d1fccba521fdf7c6e2f8829e491c2afd44dbe4105c6432e3c3dfe7e1ecb221401269d639264bb4af77b60a7b65521fcff9ab02cd31d8ef782 + languageName: node + linkType: hard + "@wojtekmaj/async-array-utils@workspace:.": version: 0.0.0-use.local resolution: "@wojtekmaj/async-array-utils@workspace:." dependencies: - "@babel/cli": ^7.15.0 "@babel/core": ^7.15.0 "@babel/preset-env": ^7.15.0 + "@babel/preset-typescript": ^7.18.6 + "@types/jest": ^29.0.0 + "@typescript-eslint/eslint-plugin": ^5.41.0 + "@typescript-eslint/parser": ^5.44.0 eslint: ^8.26.0 eslint-config-wojtekmaj: ^0.7.1 husky: ^8.0.0 @@ -1919,6 +2058,7 @@ __metadata: prettier: ^2.7.0 pretty-quick: ^3.1.0 rimraf: ^3.0.0 + typescript: ^4.9.4 languageName: unknown linkType: soft @@ -2030,7 +2170,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.0.3": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -2294,13 +2434,6 @@ __metadata: languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -2320,7 +2453,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": +"braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: @@ -2461,25 +2594,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.0": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -2574,13 +2688,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^4.0.1": - version: 4.1.1 - resolution: "commander@npm:4.1.1" - checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -2595,7 +2702,7 @@ __metadata: languageName: node linkType: hard -"convert-source-map@npm:^1.1.0, convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": +"convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 @@ -2643,7 +2750,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -2732,6 +2839,15 @@ __metadata: languageName: node linkType: hard +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: ^4.0.0 + checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + languageName: node + linkType: hard + "doctrine@npm:^2.1.0": version: 2.1.0 resolution: "doctrine@npm:2.1.0" @@ -3016,6 +3132,16 @@ __metadata: languageName: node linkType: hard +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + "eslint-scope@npm:^7.1.1": version: 7.1.1 resolution: "eslint-scope@npm:7.1.1" @@ -3139,6 +3265,13 @@ __metadata: languageName: node linkType: hard +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -3194,7 +3327,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.3.1": +"expect@npm:^29.0.0, expect@npm:^29.3.1": version: 29.3.1 resolution: "expect@npm:29.3.1" dependencies: @@ -3214,6 +3347,19 @@ __metadata: languageName: node linkType: hard +"fast-glob@npm:^3.2.9": + version: 3.2.12 + resolution: "fast-glob@npm:3.2.12" + dependencies: + "@nodelib/fs.stat": ^2.0.2 + "@nodelib/fs.walk": ^1.2.3 + glob-parent: ^5.1.2 + merge2: ^1.3.0 + micromatch: ^4.0.4 + checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + languageName: node + linkType: hard + "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -3310,13 +3456,6 @@ __metadata: languageName: node linkType: hard -"fs-readdir-recursive@npm:^1.1.0": - version: 1.1.0 - resolution: "fs-readdir-recursive@npm:1.1.0" - checksum: 29d50f3d2128391c7fc9fd051c8b7ea45bcc8aa84daf31ef52b17218e20bfd2bd34d02382742801954cc8d1905832b68227f6b680a666ce525d8b6b75068ad1e - languageName: node - linkType: hard - "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -3324,7 +3463,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:^2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: @@ -3334,7 +3473,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7" dependencies: @@ -3443,6 +3582,15 @@ __metadata: languageName: node linkType: hard +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: ^4.0.1 + checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + languageName: node + linkType: hard + "glob-parent@npm:^6.0.2": version: 6.0.2 resolution: "glob-parent@npm:6.0.2" @@ -3452,16 +3600,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0": +"glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -3504,6 +3643,20 @@ __metadata: languageName: node linkType: hard +"globby@npm:^11.1.0": + version: 11.1.0 + resolution: "globby@npm:11.1.0" + dependencies: + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + languageName: node + linkType: hard + "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -3766,15 +3919,6 @@ __metadata: languageName: node linkType: hard -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c - languageName: node - linkType: hard - "is-boolean-object@npm:^1.1.0": version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" @@ -3831,7 +3975,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -4652,16 +4796,6 @@ __metadata: languageName: node linkType: hard -"make-dir@npm:^2.1.0": - version: 2.1.0 - resolution: "make-dir@npm:2.1.0" - dependencies: - pify: ^4.0.1 - semver: ^5.6.0 - checksum: 043548886bfaf1820323c6a2997e6d2fa51ccc2586ac14e6f14634f7458b4db2daf15f8c310e2a0abd3e0cddc64df1890d8fc7263033602c47bb12cbfcf86aab - languageName: node - linkType: hard - "make-dir@npm:^3.0.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -4711,6 +4845,13 @@ __metadata: languageName: node linkType: hard +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + "micromatch@npm:^4.0.4": version: 4.0.5 resolution: "micromatch@npm:4.0.5" @@ -4882,6 +5023,13 @@ __metadata: languageName: node linkType: hard +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -4941,7 +5089,7 @@ __metadata: languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 @@ -5178,6 +5326,13 @@ __metadata: languageName: node linkType: hard +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + languageName: node + linkType: hard + "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -5185,20 +5340,13 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 9c4e34278cb09987685fa5ef81499c82546c033713518f6441778fbec623fc708777fe8ac633097c72d88470d5963094076c7305cafc7ad340aae27cfacd856b - languageName: node - linkType: hard - "pirates@npm:^4.0.4": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -5231,7 +5379,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.3.1": +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.3.1": version: 29.3.1 resolution: "pretty-format@npm:29.3.1" dependencies: @@ -5347,15 +5495,6 @@ __metadata: languageName: node linkType: hard -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 - languageName: node - linkType: hard - "regenerate-unicode-properties@npm:^10.1.0": version: 10.1.0 resolution: "regenerate-unicode-properties@npm:10.1.0" @@ -5586,15 +5725,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^5.6.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf - languageName: node - linkType: hard - "semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" @@ -5604,7 +5734,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5": +"semver@npm:^7.3.5, semver@npm:^7.3.7": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -5663,13 +5793,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^2.0.0": - version: 2.0.0 - resolution: "slash@npm:2.0.0" - checksum: 512d4350735375bd11647233cb0e2f93beca6f53441015eea241fe784d8068281c3987fbaa93e7ef1c38df68d9c60013045c92837423c69115297d6169aa85e6 - languageName: node - linkType: hard - "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -5953,6 +6076,24 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: ^1.8.1 + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -5983,6 +6124,26 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^4.9.4": + version: 4.9.4 + resolution: "typescript@npm:4.9.4" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: e782fb9e0031cb258a80000f6c13530288c6d63f1177ed43f770533fdc15740d271554cdae86701c1dd2c83b082cea808b07e97fd68b38a172a83dbf9e0d0ef9 + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.9.4#~builtin": + version: 4.9.4 + resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=ddd1e8" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 37f6e2c3c5e2aa5934b85b0fddbf32eeac8b1bacf3a5b51d01946936d03f5377fe86255d4e5a4ae628fd0cd553386355ad362c57f13b4635064400f3e8e05b9d + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2"