From e872262ac83b1d71f2d8d8f4068c4b445f7aa791 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 13 Dec 2018 00:49:19 +0100 Subject: [PATCH] Improve the `is.observable` check 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 5ef42c7..83e4713 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 37e775b..cc1c7ed 100644 --- a/source/index.ts +++ b/source/index.ts @@ -2,7 +2,6 @@ /// /// /// -import symbolObservable from 'symbol-observable'; type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; type Primitive = null | undefined | string | number | boolean | Symbol; @@ -264,7 +263,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 98cb287..05dbc11 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: [ @@ -751,6 +751,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'); });