diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..6cbf35e --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,20 @@ +name: publish + +on: + release: + types: [created] + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + - run: yarn install + - run: yarn run build + - run: yarn run test + - run: yarn publish + env: + NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..e551c99 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,21 @@ +name: test + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + - run: yarn install + - run: yarn run build + - run: yarn run test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..c997ffd --- /dev/null +++ b/.npmignore @@ -0,0 +1,5 @@ +src +tests +rollup.config.js +tsconfig.json +.github diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..22c7dcb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Philip Ahlberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package.json b/package.json new file mode 100644 index 0000000..07b5f51 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "conveyorbelt", + "version": "0.1.0", + "author": "Philip Ahlberg ", + "description": "An iterator utility library", + "license": "MIT", + "main": "dist/index.mjs", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "keywords": [], + "homepage": "https://github.com/philipahlberg/conveyorbelt#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/philipahlberg/conveyorbelt.git" + }, + "bugs": { + "url": "https://github.com/philipahlberg/conveyorbelt/issues" + }, + "scripts": { + "build": "rollup -c rollup.config.js", + "test": "windtunnel test tests/index.mjs" + }, + "dependencies": {}, + "devDependencies": { + "@rollup/plugin-node-resolve": "^8.4.0", + "@rollup/plugin-typescript": "^5.0.2", + "@types/node": "^14.0.27", + "@windtunnel/assert": "^0.4.0", + "@windtunnel/cli": "^0.4.0", + "rollup": "^2.23.0", + "tslib": "^2.0.0", + "typescript": "^3.9.7" + }, + "peerDependencies": {}, + "optionalDependencies": {} +} diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..efd3ef9 --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,27 @@ +import module from 'module'; +import resolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; +import pkg from './package.json'; + +const dependencies = Object.keys(pkg.dependencies); +const peerDependencies = Object.keys(pkg.peerDependencies); + +export default { + input: 'src/index.ts', + output: { + dir: 'dist', + format: 'esm', + entryFileNames: '[name].mjs', + }, + plugins: [ + typescript(), + resolve({ + preferBuiltins: true, + }), + ], + external: [ + ...module.builtinModules, + ...dependencies, + ...peerDependencies, + ], +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..aaa8c16 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,240 @@ +class Iter implements Iterable { + private source: Iterable; + + constructor(source: Iterable) { + this.source = source; + } + + *[Symbol.iterator](): Iterator { + for (const item of this.source) { + yield item; + } + } + + all(fn: (item: T) => boolean): boolean { + return all(fn, this.source); + } + + any(fn: (item: T) => boolean): boolean { + return any(fn, this.source); + } + + chain(iterable: Iterable): Iterable { + return new Iter(chain(this.source, iterable)); + } + + count(): bigint { + return count(this.source); + } + + enumerate(): Iterable<[bigint, T]> { + return new Iter(enumerate(this.source)); + } + + filter(fn: (item: T) => boolean): Iterable { + return new Iter(filter(fn, this.source)); + } + + find(fn: (item: T) => boolean): T | null { + return find(fn, this.source); + } + + fold(fn: (state: S, item: T) => S, initial: S): S { + return fold(fn, initial, this.source); + } + + first(): T | null { + return first(this.source); + } + + last(): T | null { + return last(this.source); + } + + map(fn: (item: T) => B): Iterable { + return new Iter(map(fn, this.source)); + } + + nth(n: number): T | null { + return nth(n, this.source); + } + + skip(n: number): Iterable { + return new Iter(skip(n, this.source)); + } + + skipWhile(fn: (item: T) => boolean): Iterable { + return new Iter(skipWhile(fn, this.source)); + } + + take(n: number): Iterable { + return new Iter(take(n, this.source)); + } + + takeWhile(fn: (item: T) => boolean): Iterable { + return new Iter(takeWhile(fn, this.source)); + } + + collect(): T[] { + return [...this.source]; + } +} + +class Wrap implements Iterable { + private source: Iterator; + + constructor(source: Iterator) { + this.source = source; + } + + [Symbol.iterator]() { + return this.source; + } +} + +const wrap = (iterator: Iterator): Iterable => { + return new Wrap(iterator); +}; + +function all(fn: (item: T) => boolean, iterable: Iterable): boolean { + for (const item of iterable) { + if (!fn(item)) { + return false; + } + } + return true; +} + +function any(fn: (item: T) => boolean, iterable: Iterable): boolean { + for (const item of iterable) { + if (fn(item)) { + return true; + } + } + return false; +} + +function* chain(a: Iterable, b: Iterable): Iterable { + yield* a; + yield* b; +} + +function count(iterable: Iterable): bigint { + let n = 0n; + for (const _ of iterable) { + n = n + 1n; + } + return n; +} + +function* enumerate(iterable: Iterable): Iterable<[bigint, T]> { + let i = 0n; + for (const item of iterable) { + yield [i, item]; + i = i + 1n; + } +} + +function* filter(fn: (item: T) => boolean, iterable: Iterable): Iterable { + for (const item of iterable) { + if (fn(item)) { + yield item; + } + } +} + +function find(fn: (item: T) => boolean, iterable: Iterable): T | null { + for (const item of iterable) { + if (fn(item)) { + return item; + } + } + return null; +} + +function fold(fn: (state: S, item: T) => S, initial: S, iterable: Iterable): S { + let state: S = initial; + for (const item of iterable) { + state = fn(state, item); + } + return state; +} + +function first(iterable: Iterable): T | null { + for (const item of iterable) { + return item; + } + return null; +} + +function last(iterable: Iterable): T | null { + let last: T | null = null; + for (const item of iterable) { + last = item; + } + return last; +} + +function* map(fn: (item: T) => B, iterable: Iterable): Iterable { + for (const item of iterable) { + yield fn(item); + } +} + +function nth(n: number, iterable: Iterable): T | null { + for (const item of iterable) { + if (n === 0) { + return item; + } + n = n - 1; + } + return null; +} + +function* skip(n: number, iterable: Iterable): Iterable { + const iterator = iterable[Symbol.iterator](); + while (n > 0) { + iterator.next(); + n = n - 1; + } + yield* wrap(iterator); +} + +function* skipWhile(fn: (item: T) => boolean, iterable: Iterable): Iterable { + const iterator = iterable[Symbol.iterator](); + let value: T; + while (true) { + const next = iterator.next(); + value = next.value; + if (next.done || !fn(next.value)) { + break; + } + } + yield value; + yield* wrap(iterator); +} + +function* take(n: number, iterable: Iterable): Iterable { + for (const item of iterable) { + if (n > 0) { + yield item; + } else { + break; + } + n = n - 1; + } +} + +function* takeWhile(fn: (item: T) => boolean, iterable: Iterable): Iterable { + for (const item of iterable) { + if (fn(item)) { + yield item; + } else { + break; + } + } +} + +export const iter = (iterable: Iterable): Iterable => { + return new Iter(iterable); +}; diff --git a/tests/index.mjs b/tests/index.mjs new file mode 100644 index 0000000..ec2d268 --- /dev/null +++ b/tests/index.mjs @@ -0,0 +1,177 @@ +import { assertEqual } from '@windtunnel/assert'; +import { iter } from '../dist/index.mjs'; + +export function testAllTrue() { + const it = iter([1, 2, 3, 4]); + const res = it.all((v) => v > 0); + assertEqual(res, true); +} + +export function testAllFalse() { + const it = iter([1, 2, 3, 4]); + const res = it.all((v) => v > 1); + assertEqual(res, false); +} + +export function testAllEmpty() { + const it = iter([]); + const res = it.all((v) => false); + assertEqual(res, true); +} + +export function testAnyTrue() { + const it = iter([1, 2, 3, 4]); + const res = it.all((v) => v > 0); + assertEqual(res, true); +} + +export function testAnyFalse() { + const it = iter([1, 2, 3, 4]); + const res = it.all((v) => v > 1); + assertEqual(res, false); +} + +export function testAnyEmpty() { + const it = iter([]); + const res = it.all((v) => v > 0); + assertEqual(res, true); +} + +export function testChain() { + const it = iter([1, 2, 3, 4]); + const res = it.chain([5, 6, 7, 8]); + assertEqual(res.collect(), [ + 1, 2, 3, 4, 5, 6, 7, 8, + ]); +} + +export function testCount() { + const it = iter([1, 2, 3, 4]); + const res = it.count(); + assertEqual(res, 4n); +} + +export function testEnumerate() { + const it = iter([1, 2, 3, 4]); + const res = it.enumerate(); + assertEqual(res.collect(), [ + [0n, 1], + [1n, 2], + [2n, 3], + [3n, 4], + ]); +} + +export function testFilter() { + const it = iter([1, 2, 3, 4]); + const res = it.filter((v) => (v & 1) === 1); + assertEqual(res.collect(), [1, 3]); +} + +export function testFind() { + const it = iter([1, 2, 3, 4]); + const res = it.find((v) => (v & 1) === 0); + assertEqual(res, 2); +} + +export function testFindEmpty() { + const it = iter([]); + const res = it.find((v) => (v & 1) === 0); + assertEqual(res, null); +} + +export function testFindNone() { + const it = iter([1, 2, 3, 4]); + const res = it.find((v) => v > 4); + assertEqual(res, null); +} + +export function testFold() { + const it = iter([1, 2, 3, 4]); + const res = it.fold((sum, v) => sum + v, 0); + assertEqual(res, 10); +} + +export function testFirst() { + const it = iter([1, 2, 3, 4]); + const res = it.first(); + assertEqual(res, 1); +} + +export function testFirstEmpty() { + const it = iter([]); + const res = it.first(); + assertEqual(res, null); +} + +export function testLast() { + const it = iter([1, 2, 3, 4]); + const res = it.last(); + assertEqual(res, 4); +} + +export function testLastEmpty() { + const it = iter([]); + const res = it.last(); + assertEqual(res, null); +} + +export function testMap() { + const it = iter([1, 2, 3, 4]); + const res = it.map((v) => v * 2); + assertEqual(res.collect(), [2, 4, 6, 8]); +} + +export function testNth() { + const it = iter([1, 2, 3, 4]); + const res = it.nth(1); + assertEqual(res, 2); +} + +export function testSkipN() { + const it = iter([1, 2, 3, 4]); + const res = it.skip(2); + assertEqual(res.collect(), [3, 4]); +} + +export function testSkipZero() { + const it = iter([1, 2, 3, 4]); + const res = it.skip(0); + assertEqual(res.collect(), [1, 2, 3, 4]); +} + +export function testSkipTooMany() { + const it = iter([1, 2, 3, 4]); + const res = it.skip(5); + assertEqual(res.collect(), []); +} + +export function testSkipWhile() { + const it = iter([1, 2, 3, 4]); + const res = it.skipWhile((v) => v < 3); + assertEqual(res.collect(), [3, 4]); +} + +export function testTakeN() { + const it = iter([1, 2, 3, 4]); + const res = it.take(2); + assertEqual(res.collect(), [1, 2]); +} + +export function testTakeZero() { + const it = iter([1, 2, 3, 4]); + const res = it.take(0); + assertEqual(res.collect(), []); +} + +export function testTakeTooMany() { + const it = iter([1, 2, 3, 4]); + const res = it.take(5); + assertEqual(res.collect(), [1, 2, 3, 4]); +} + +export function testTakeWhile() { + const it = iter([1, 2, 3, 4]); + const res = it.takeWhile((v) => v < 3); + assertEqual(res.collect(), [1, 2]); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7d43f66 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "target": "ES2020", + "module": "ES2020", + "moduleResolution": "node", + "lib": [ + "ES2015", + "ES2016", + "ES2017", + "ES2018", + "ES2019", + "ES2020" + ], + "declaration": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "importHelpers": true + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..4805252 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,144 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@rollup/plugin-node-resolve@^8.4.0": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz#261d79a680e9dc3d86761c14462f24126ba83575" + integrity sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deep-freeze "^0.0.1" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.17.0" + +"@rollup/plugin-typescript@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-5.0.2.tgz#e879b73354851868b805bbd43f15c229123b8a71" + integrity sha512-CkS028Itwjqm1uLbFVfpJgtVtnNvZ+og/m6UlNRR5wOOnNTWPcVQzOu5xGdEX+WWJxdvWIqUq2uR/RBt2ZipWg== + dependencies: + "@rollup/pluginutils" "^3.0.1" + resolve "^1.14.1" + +"@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/node@*", "@types/node@^14.0.27": + version "14.0.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" + integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@windtunnel/assert@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@windtunnel/assert/-/assert-0.4.0.tgz#c2b43c52eb42fa4f3d7197a58ec44ef2a75a1ec1" + integrity sha512-pzcFSfarme3nj2+jo5N+pwPmJ12b1umT/7/NAziKCaoUgmSbywMRx7R9UHa1P002zWYQnBf+DpnpJ+omWcz5lg== + +"@windtunnel/cli@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@windtunnel/cli/-/cli-0.4.0.tgz#9e421cfc1c78015136293dd29a40c6e7a4390253" + integrity sha512-5iqHhv+/yaTDGGIxfXm/JIqhIAxBrUsXcpGael8Dg96roBalcoo/6eSYUQgyoyh4Y3t3lhlj+O6eZBD8kZ8/7Q== + dependencies: + "@windtunnel/colors" "0.4.0" + "@windtunnel/core" "0.4.0" + +"@windtunnel/colors@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@windtunnel/colors/-/colors-0.4.0.tgz#d0d86744096605f462f52185592d5fe8b72fb076" + integrity sha512-KmfeXryvA5ISahFP3983Mvu/hkjyS8mL0DsXirK35qSs5CiQG8YzjxE9nrz9KK1wRPhg0QynjO+csrzHoFl9TA== + +"@windtunnel/core@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@windtunnel/core/-/core-0.4.0.tgz#c709fd4e308f7fcb77fc38bfc691955d6c6556d1" + integrity sha512-rZqXZC+vM/X5QznJriNQYU03I+sX8afMKZ1I3PFzSYrxmsrdxLvgdDHTynHN0sMdDwudmxrgf7TU1o25CD/otw== + dependencies: + nurburgring "^0.1.1" + +builtin-modules@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" + integrity sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw== + +deep-freeze@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= + +nurburgring@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/nurburgring/-/nurburgring-0.1.1.tgz#00c997b293d52672ecdd34ede4ec141d3175ebe1" + integrity sha512-RYzdzc8F5jj2FCTs9g+4voE+sYZ8tIhCuhLtfHla1pIUmQ3I1jptJSyzNXSIZPbGJEuUJJs4024NXj4YDR3nZg== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +resolve@^1.14.1, resolve@^1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +rollup@^2.23.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.23.0.tgz#b7ab1fee0c0e60132fd0553c4df1e9cdacfada9d" + integrity sha512-vLNmZFUGVwrnqNAJ/BvuLk1MtWzu4IuoqsH9UWK5AIdO3rt8/CSiJNvPvCIvfzrbNsqKbNzPAG1V2O4eTe2XZg== + optionalDependencies: + fsevents "~2.1.2" + +tslib@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" + integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== + +typescript@^3.9.7: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==