diff --git a/index.js b/index.js index ba9c1d0..af09ab4 100644 --- a/index.js +++ b/index.js @@ -6,12 +6,13 @@ module.exports = value => { } // eslint-disable-next-line no-use-extend-native/no-use-extend-native - if (value[Symbol.observable] && value === value[Symbol.observable]()) { - return true; + if (typeof Symbol.observable === 'symbol' && typeof value[Symbol.observable] === 'function') { + // eslint-disable-next-line no-use-extend-native/no-use-extend-native + return value === value[Symbol.observable](); } - if (value['@@observable'] && value === value['@@observable']()) { - return true; + if (typeof value['@@observable'] === 'function') { + return value === value['@@observable'](); } return false; diff --git a/test.js b/test/main.js similarity index 94% rename from test.js rename to test/main.js index 38b5271..d217643 100644 --- a/test.js +++ b/test/main.js @@ -4,7 +4,7 @@ import {of as rxOf} from 'rxjs'; import * as most from 'most'; import {Stream as xstream} from 'xstream'; import {IndefiniteObservable} from 'indefinite-observable'; -import isObservable from '.'; +import isObservable from '..'; test('main', t => { t.true(isObservable(zenObservable.of(1))); diff --git a/test/strict.js b/test/strict.js new file mode 100644 index 0000000..78f9f8a --- /dev/null +++ b/test/strict.js @@ -0,0 +1,20 @@ +import test from 'ava'; +import isObservable from '..'; + +const fake1 = {'@@observable': true}; +const fake2 = {undefined: true}; +const fake3 = { + undefined() { + return this; + } +}; + +test('strict', t => { + // Symbol.observable is defined via AVA + delete Symbol.observable; + // eslint-disable-next-line no-use-extend-native/no-use-extend-native + t.is(Symbol.observable, undefined); + t.false(isObservable(fake1)); + t.false(isObservable(fake2)); + t.false(isObservable(fake3)); +});