From 844b43c9dfcc3caca36001e35466918d57136bcf Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 13 Dec 2018 16:52:55 +0100 Subject: [PATCH] Improve the `is.observable` check (#74) Fixes #72 --- package.json | 3 --- source/index.ts | 18 ++++++++++++++++-- source/tests/test.ts | 20 ++++++++++++-------- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 40dd260..c7b2983 100644 --- a/package.json +++ b/package.json @@ -43,9 +43,6 @@ "verify", "compare" ], - "dependencies": { - "symbol-observable": "^1.2.0" - }, "devDependencies": { "@sindresorhus/tsconfig": "^0.1.0", "@types/jsdom": "^11.12.0", diff --git a/source/index.ts b/source/index.ts index 31fdc6d..babe375 100644 --- a/source/index.ts +++ b/source/index.ts @@ -2,7 +2,6 @@ /// /// /// -import symbolObservable from 'symbol-observable'; import {URL} from 'url'; type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; @@ -278,7 +277,22 @@ namespace is { // tslint:disable-line:no-namespace export const domElement = (value: unknown): value is DomElement => object(value) && (value as DomElement).nodeType === NODE_TYPE_ELEMENT && string((value as DomElement).nodeName) && !plainObject(value) && DOM_PROPERTIES_TO_CHECK.every(property => property in (value as DomElement)); - export const observable = (value: unknown) => Boolean(value && (value as any)[symbolObservable] && value === (value as any)[symbolObservable]()); + export const observable = (value: unknown) => { + if (!value) { + return false; + } + + if ((value as any)[Symbol.observable] && value === (value as any)[Symbol.observable]()) { + return true; + } + + if ((value as any)['@@observable'] && value === (value as any)['@@observable']()) { + return true; + } + + return false; + }; + export const nodeStream = (value: unknown): value is NodeStream => !nullOrUndefined(value) && isObject(value) as unknown && function_((value as NodeStream).pipe) && !observable(value); export const infinite = (value: unknown) => value === Infinity || value === -Infinity; diff --git a/source/tests/test.ts b/source/tests/test.ts index 15bc9bf..cc4353e 100644 --- a/source/tests/test.ts +++ b/source/tests/test.ts @@ -345,6 +345,14 @@ const types = new Map([ document.createDocumentFragment() ] }], + ['observable', { + is: is.observable, + fixtures: [ + new Observable(), + new Subject(), + new ZenObservable(() => {}) // tslint:disable-line:no-empty + ] + }], ['nodeStream', { is: is.nodeStream, fixtures: [ @@ -359,14 +367,6 @@ const types = new Map([ new Stream.Writable() ] }], - ['observable', { - is: is.observable, - fixtures: [ - new Observable(), - new Subject(), - new ZenObservable(() => {}) // tslint:disable-line:no-empty - ] - }], ['infinite', { is: is.infinite, fixtures: [ @@ -761,6 +761,10 @@ test('is.domElement', t => { t.false(is.domElement({nodeType: 1, nodeName: 'div'})); }); +test('is.observable', t => { + testType(t, 'observable'); +}); + test('is.nodeStream', t => { testType(t, 'nodeStream'); });