From c8736c2972033c1f244d25e0b436b7656edc3843 Mon Sep 17 00:00:00 2001 From: Artur Androsovych Date: Mon, 9 Jul 2018 20:35:16 +0300 Subject: [PATCH] Add `is.asyncIterable` (#59) --- readme.md | 1 + source/index.ts | 1 + source/tests/test.ts | 16 ++++++++++++++++ tsconfig.json | 3 ++- 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 66f83b1..26031e8 100644 --- a/readme.md +++ b/readme.md @@ -209,6 +209,7 @@ Returns `true` if `value` is a [safe integer](https://developer.mozilla.org/en-U An object is plain if it's created by either `{}`, `new Object()`, or `Object.create(null)`. ##### .iterable(value) +##### .asyncIterable(value) ##### .class(value) Returns `true` for instances created by a ES2015 class. diff --git a/source/index.ts b/source/index.ts index ba5c0f7..868ec18 100644 --- a/source/index.ts +++ b/source/index.ts @@ -136,6 +136,7 @@ namespace is { // tslint:disable-line:no-namespace export const nullOrUndefined = (value: any): value is null | undefined => null_(value) || undefined(value); export const object = (value: any): value is object => !nullOrUndefined(value) && (function_(value) || isObject(value)); export const iterable = (value: any): value is IterableIterator => !nullOrUndefined(value) && function_(value[Symbol.iterator]); + export const asyncIterable = (value: any): value is AsyncIterableIterator => !nullOrUndefined(value) && function_(value[Symbol.asyncIterator]); export const generator = (value: any): value is Generator => iterable(value) && function_(value.next) && function_(value.throw); export const nativePromise = (value: any): value is Promise => diff --git a/source/tests/test.ts b/source/tests/test.ts index ae99c2c..a2d56ad 100644 --- a/source/tests/test.ts +++ b/source/tests/test.ts @@ -10,6 +10,7 @@ import ZenObservable from 'zen-observable'; import m from '..'; const isNode8orHigher = Number(process.versions.node.split('.')[0]) >= 8; +const isNode10orHigher = Number(process.versions.node.split('.')[0]) >= 10; class PromiseSubclassFixture extends Promise {} class ErrorSubclassFixture extends Error {} @@ -603,6 +604,21 @@ test('is.iterable', t => { t.false(m.iterable({})); }); +if (isNode10orHigher) { + test('is.asyncIterable', t => { + t.true(m.asyncIterable({ + [Symbol.asyncIterator]: () => {} // tslint:disable-line:no-empty + })); + + t.false(m.asyncIterable(null)); + t.false(m.asyncIterable(undefined)); + t.false(m.asyncIterable(0)); + t.false(m.asyncIterable(NaN)); + t.false(m.asyncIterable(Infinity)); + t.false(m.asyncIterable({})); + }); +} + test('is.class', t => { class Foo {} // tslint:disable-line const classDeclarations = [ diff --git a/tsconfig.json b/tsconfig.json index 2a1baca..f7d6fd1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,8 @@ "dom", "es2015", "es2016", - "es2017.sharedmemory" + "es2017.sharedmemory", + "esnext.asynciterable" ], "module": "commonjs", "moduleResolution": "node",