From 6783c1c49625b04f1740ce877cbe4d431978cdc2 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Mon, 6 Feb 2017 22:12:12 +0200 Subject: [PATCH 1/2] redo RxJS 5 support with adapters --- examples/wikistream/src/index.js | 3 + package.json | 2 +- .../mapActionCreators-test.js.snap | 27 +- .../__snapshots__/rxConnect-test.js.snap | 133 +++++++++- src/__tests__/mapActionCreators-test.js | 58 +++-- src/__tests__/rxConnect-test.js | 235 ++++++++++-------- src/mapActionCreators.js | 12 +- src/observable.js | 8 - src/rx4Adapter.js | 18 ++ src/rx5Adapter.js | 21 ++ src/rxConnect.js | 33 +-- webpack.config.js | 27 +- 12 files changed, 391 insertions(+), 186 deletions(-) delete mode 100644 src/observable.js create mode 100644 src/rx4Adapter.js create mode 100644 src/rx5Adapter.js diff --git a/examples/wikistream/src/index.js b/examples/wikistream/src/index.js index d8c343a..820e145 100644 --- a/examples/wikistream/src/index.js +++ b/examples/wikistream/src/index.js @@ -4,8 +4,11 @@ import "babel-polyfill"; import React from "react"; import ReactDOM from "react-dom"; import { rxConnect, ofActions } from "rx-connect"; +import rx5Adapter from "../../../lib/rx5Adapter"; import Rx from "rxjs"; +rxConnect.adapter = rx5Adapter; + import { ofWikiChanges } from "./wikiChangesObservable"; const CHANNELS = [ diff --git a/package.json b/package.json index 53aa246..7bd4734 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "clean": "rimraf lib dist", "lint": "eslint src", - "build:lib": "babel src --out-dir lib", + "build:lib": "babel src --ignore __tests__ --out-dir lib", "build:umd": "cross-env NODE_ENV=development webpack src/index.js dist/rx-connect.js", "build:umd:min": "cross-env NODE_ENV=production webpack src/index.js dist/rx-connect.min.js", "build": "npm run build:lib && npm run build:umd && npm run build:umd:min", diff --git a/src/__tests__/__snapshots__/mapActionCreators-test.js.snap b/src/__tests__/__snapshots__/mapActionCreators-test.js.snap index 3c69bc3..c81dfad 100644 --- a/src/__tests__/__snapshots__/mapActionCreators-test.js.snap +++ b/src/__tests__/__snapshots__/mapActionCreators-test.js.snap @@ -1,4 +1,4 @@ -exports[`test creates FuncSubject-like action 1`] = ` +exports[`RxJS 4 creates FuncSubject-like action 1`] = ` Array [ 1, 2, @@ -6,14 +6,35 @@ Array [ ] `; -exports[`test passes non-observables as is 1`] = ` +exports[`RxJS 4 passes non-observables as is 1`] = ` Object { "a": 123, "b": "hi!", } `; -exports[`test strips dollar sign from Observable property names 1`] = ` +exports[`RxJS 4 strips dollar sign from Observable property names 1`] = ` +Object { + "a": [Function], +} +`; + +exports[`RxJS 5 creates FuncSubject-like action 1`] = ` +Array [ + 1, + 2, + 3, +] +`; + +exports[`RxJS 5 passes non-observables as is 1`] = ` +Object { + "a": 123, + "b": "hi!", +} +`; + +exports[`RxJS 5 strips dollar sign from Observable property names 1`] = ` Object { "a": [Function], } diff --git a/src/__tests__/__snapshots__/rxConnect-test.js.snap b/src/__tests__/__snapshots__/rxConnect-test.js.snap index db809ed..2a69b95 100644 --- a/src/__tests__/__snapshots__/rxConnect-test.js.snap +++ b/src/__tests__/__snapshots__/rxConnect-test.js.snap @@ -1,54 +1,54 @@ -exports[`test accepts function-based mutations 1`] = ` +exports[`RxJS 4 accepts function-based mutations 1`] = `
123
`; -exports[`test ignores not connect properties 1`] = `
`; +exports[`RxJS 4 ignores not connect properties 1`] = `
`; -exports[`test noDebounce 1`] = ` +exports[`RxJS 4 noDebounce 1`] = `
0
`; -exports[`test noDebounce 2`] = ` +exports[`RxJS 4 noDebounce 2`] = `
1
`; -exports[`test passes children automatically 1`] = ` +exports[`RxJS 4 passes children automatically 1`] = `
Hello, RxConnect!
`; -exports[`test passes properties as Observable 1`] = ` +exports[`RxJS 4 passes properties as Observable 1`] = `
123
`; -exports[`test receives new props 1`] = ` +exports[`RxJS 4 receives new props 1`] = `
15
`; -exports[`test receives new props 2`] = ` +exports[`RxJS 4 receives new props 2`] = `
15
`; -exports[`test receives new props 3`] = ` +exports[`RxJS 4 receives new props 3`] = `
-15
`; -exports[`test throws an error if mutation is neither an object or function 1`] = ` +exports[`RxJS 4 throws an error if mutation is neither an object or function 1`] = ` Array [ "Mutation must be a plain object or function. Check rxConnect of Component. Got: ", Array [ @@ -57,21 +57,128 @@ Array [ ] `; -exports[`test works with Array 1`] = ` +exports[`RxJS 4 throws an error if selector is neither an Observable or function 1`] = ` +Array [ + "Selector must be a function or an Observable. Check rxConnect of Component. Got: ", + undefined, +] +`; + +exports[`RxJS 4 throws an error if selector returns non-Observable 1`] = ` +Array [ + "Selector must return an Observable or an iterator of observables. Check rxConnect of Component. Got: ", + undefined, +] +`; + +exports[`RxJS 4 works with Array 1`] = ` +
+ 123 + bar +
+`; + +exports[`RxJS 4 works with Generator 1`] = ` +
+ 123 + bar +
+`; + +exports[`RxJS 4 works with Observable 1`] = ` +
+ 123 +
+`; + +exports[`RxJS 5 accepts function-based mutations 1`] = ` +
+ 123 +
+`; + +exports[`RxJS 5 ignores not connect properties 1`] = `
`; + +exports[`RxJS 5 noDebounce 1`] = ` +
+ 0 +
+`; + +exports[`RxJS 5 noDebounce 2`] = ` +
+ 1 +
+`; + +exports[`RxJS 5 passes children automatically 1`] = ` +
+ Hello, RxConnect! +
+`; + +exports[`RxJS 5 passes properties as Observable 1`] = ` +
+ 123 +
+`; + +exports[`RxJS 5 receives new props 1`] = ` +
+ 15 +
+`; + +exports[`RxJS 5 receives new props 2`] = ` +
+ 15 +
+`; + +exports[`RxJS 5 receives new props 3`] = ` +
+ -15 +
+`; + +exports[`RxJS 5 throws an error if mutation is neither an object or function 1`] = ` +Array [ + "Mutation must be a plain object or function. Check rxConnect of Component. Got: ", + Array [ + 123, + ], +] +`; + +exports[`RxJS 5 throws an error if selector is neither an Observable or function 1`] = ` +Array [ + "Selector must be a function or an Observable. Check rxConnect of Component. Got: ", + undefined, +] +`; + +exports[`RxJS 5 throws an error if selector returns non-Observable 1`] = ` +Array [ + "Selector must return an Observable or an iterator of observables. Check rxConnect of Component. Got: ", + undefined, +] +`; + +exports[`RxJS 5 works with Array 1`] = `
123 bar
`; -exports[`test works with Generator 1`] = ` +exports[`RxJS 5 works with Generator 1`] = `
123 bar
`; -exports[`test works with Observable 1`] = ` +exports[`RxJS 5 works with Observable 1`] = `
123
diff --git a/src/__tests__/mapActionCreators-test.js b/src/__tests__/mapActionCreators-test.js index 72e0c08..05fc8bd 100644 --- a/src/__tests__/mapActionCreators-test.js +++ b/src/__tests__/mapActionCreators-test.js @@ -1,30 +1,46 @@ -import Rx from "rx"; -import { mapActionCreators } from "../"; +import { mapActionCreators, rxConnect } from "../"; +import rx5Adapter from "../rx5Adapter"; +import { getAdapter } from "../rxConnect"; -test("passes non-observables as is", async () => { - const props = await mapActionCreators({ a: 123, b: "hi!" }).toPromise(); +const suites = { + "RxJS 4": () => {}, + "RxJS 5": () => rxConnect.adapter = rx5Adapter +} - expect(props).toMatchSnapshot(); -}); +Object.entries(suites).forEach(([ name, initializer ]) => describe(name, () => { + let Rx; + beforeEach(() => { + initializer(); + const adapter = getAdapter(); + Rx = adapter.Rx; + }); -test("strips dollar sign from Observable property names", async () => { - const actions = { - a$: new Rx.Subject() - }; + it("passes non-observables as is", async () => { + const props = await mapActionCreators({ a: 123, b: "hi!" }).toPromise(); - const props = await mapActionCreators(actions).toPromise(); + expect(props).toMatchSnapshot(); + }); - expect(props).toMatchSnapshot(); -}); + it("strips dollar sign from Observable property names", async () => { + const actions = { + a$: new Rx.Subject() + }; -test("creates FuncSubject-like action", async () => { - const actions = { - a$: new Rx.BehaviorSubject() - }; + const props = await mapActionCreators(actions).toPromise(); - const props = await mapActionCreators(actions).toPromise(); + expect(props).toMatchSnapshot(); + }); - props.a(1, 2, 3); + it("creates FuncSubject-like action", async () => { + const actions = { + a$: new Rx.BehaviorSubject() + }; - expect(actions.a$.getValue()).toMatchSnapshot(); -}); + const props = await mapActionCreators(actions).toPromise(); + + props.a(1, 2, 3); + + expect(actions.a$.getValue()).toMatchSnapshot(); + }); + +})); diff --git a/src/__tests__/rxConnect-test.js b/src/__tests__/rxConnect-test.js index b1635f2..3e1aec5 100644 --- a/src/__tests__/rxConnect-test.js +++ b/src/__tests__/rxConnect-test.js @@ -1,158 +1,195 @@ import React from "react"; -import Rx from "rx"; import renderer from "react-test-renderer"; import { rxConnect } from "../"; +import rx5Adapter from "../rx5Adapter"; +import { getAdapter } from "../rxConnect"; -test("works with Observable", () => { - const props$ = Rx.Observable.of({ a: 123 }); +const suites = { + "RxJS 4": () => {}, + "RxJS 5": () => rxConnect.adapter = rx5Adapter +} - const Component = rxConnect(props$)(({ a }) =>
{a}
); +Object.entries(suites).forEach(([ name, initializer ]) => describe(name, () => { + let Rx; + beforeEach(() => { + initializer(); + const adapter = getAdapter(); + Rx = adapter.Rx; + }); - const tree = renderer.create().toJSON(); + it("works with Observable", () => { + const props$ = Rx.Observable.of({ a: 123 }); - expect(tree).toMatchSnapshot(); -}); + const Component = rxConnect(props$)(({ a }) =>
{a}
); -test("works with Array", () => { - const props$ = () => [ - Rx.Observable.of({ a: 123 }), - Rx.Observable.of({ foo: "bar" }), - ]; + const tree = renderer.create().toJSON(); - const Component = rxConnect(props$)(({ a, foo }) =>
{a}{foo}
); + expect(tree).toMatchSnapshot(); + }); - const tree = renderer.create().toJSON(); + it("works with Array", () => { + const props$ = () => [ + Rx.Observable.of({ a: 123 }), + Rx.Observable.of({ foo: "bar" }), + ]; - expect(tree).toMatchSnapshot(); -}); + const Component = rxConnect(props$)(({ a, foo }) =>
{a}{foo}
); -test("works with Generator", () => { - const props$ = function* () { - yield Rx.Observable.of({ a: 123 }); - yield Rx.Observable.of({ foo: "bar" }); - }; + const tree = renderer.create().toJSON(); - const Component = rxConnect(props$)(({ a, foo }) =>
{a}{foo}
); + expect(tree).toMatchSnapshot(); + }); - const tree = renderer.create().toJSON(); + it("works with Generator", () => { + const props$ = function* () { + yield Rx.Observable.of({ a: 123 }); + yield Rx.Observable.of({ foo: "bar" }); + }; - expect(tree).toMatchSnapshot(); -}); + const Component = rxConnect(props$)(({ a, foo }) =>
{a}{foo}
); -test("passes properties as Observable", () => { - const connector = props$ => props$.pluck("someProp").map(a => ({ a })); + const tree = renderer.create().toJSON(); - const Component = rxConnect(connector)(({ a }) =>
{a}
); + expect(tree).toMatchSnapshot(); + }); - const tree = renderer.create().toJSON(); + it("passes properties as Observable", () => { + const connector = props$ => props$.pluck("someProp").map(a => ({ a })); - expect(tree).toMatchSnapshot(); -}); + const Component = rxConnect(connector)(({ a }) =>
{a}
); -test("passes children automatically", () => { - const Component = rxConnect(Rx.Observable.of({}))(({ children }) =>
{children}
); + const tree = renderer.create().toJSON(); - const tree = renderer.create(Hello, RxConnect!).toJSON(); + expect(tree).toMatchSnapshot(); + }); - expect(tree).toMatchSnapshot(); -}); + it("passes children automatically", () => { + const Component = rxConnect(Rx.Observable.of({}))(({ children }) =>
{children}
); -test("ignores not connect properties", () => { - const Component = rxConnect(Rx.Observable.of({ }))(({ a }) =>
{a}
); + const tree = renderer.create(Hello, RxConnect!).toJSON(); - const tree = renderer.create().toJSON(); + expect(tree).toMatchSnapshot(); + }); - expect(tree).toMatchSnapshot(); -}); + it("ignores not connect properties", () => { + const Component = rxConnect(Rx.Observable.of({ }))(({ a }) =>
{a}
); -test("accepts function-based mutations", () => { - const Component = rxConnect(Rx.Observable.of(() => ({ a: 123 })))(({ a }) =>
{a}
); + const tree = renderer.create().toJSON(); - const tree = renderer.create().toJSON(); + expect(tree).toMatchSnapshot(); + }); - expect(tree).toMatchSnapshot(); -}); + it("accepts function-based mutations", () => { + const Component = rxConnect(Rx.Observable.of(() => ({ a: 123 })))(({ a }) =>
{a}
); -test("throws an error if mutation is neither an object or function", () => { - // eslint-disable-next-line no-console - console.error = jest.genMockFn(); + const tree = renderer.create().toJSON(); - const Component = rxConnect(Rx.Observable.of([ 123 ]))(({ a }) =>
{a}
); - renderer.create().toJSON(); + expect(tree).toMatchSnapshot(); + }); - // eslint-disable-next-line no-console - expect(console.error.mock.calls[0]).toMatchSnapshot(); -}); + it("throws an error if mutation is neither an object or function", () => { + // eslint-disable-next-line no-console + console.error = jest.genMockFn(); -test("receives new props", async () => { - const connector = props$ => props$.map(({ a, b }) => ({ a: a + b })); + const Component = rxConnect(Rx.Observable.of([ 123 ]))(({ a }) =>
{a}
); + renderer.create().toJSON(); - const Component = rxConnect(connector)(({ a }) =>
{a}
); + // eslint-disable-next-line no-console + expect(console.error.mock.calls[0]).toMatchSnapshot(); + }); - class Parent extends React.Component { - state = { - a: 10, - b: 5 - }; + it("throws an error if selector is neither an Observable or function", () => { + // eslint-disable-next-line no-console + console.error = jest.genMockFn(); + + const Component = rxConnect(undefined)(({ a }) =>
{a}
); + renderer.create().toJSON(); + + // eslint-disable-next-line no-console + expect(console.error.mock.calls[0]).toMatchSnapshot(); + }); + + it("throws an error if selector returns non-Observable", () => { + // eslint-disable-next-line no-console + console.error = jest.genMockFn(); + + const Component = rxConnect(() => undefined)(({ a }) =>
{a}
); + renderer.create().toJSON(); - render() { - return + // eslint-disable-next-line no-console + expect(console.error.mock.calls[0]).toMatchSnapshot(); + }); + + it("receives new props", async () => { + const connector = props$ => props$.map(({ a, b }) => ({ a: a + b })); + + const Component = rxConnect(connector)(({ a }) =>
{a}
); + + class Parent extends React.Component { + state = { + a: 10, + b: 5 + }; + + render() { + return + } } - } - const parent = renderer.create(); + const parent = renderer.create(); - // 15 - expect(parent.toJSON()).toMatchSnapshot(); + // 15 + expect(parent.toJSON()).toMatchSnapshot(); - parent.getInstance().setState({ a: -5 }); + parent.getInstance().setState({ a: -5 }); - // Still 15 because of debouncing - expect(parent.toJSON()).toMatchSnapshot(); + // Still 15 because of debouncing + expect(parent.toJSON()).toMatchSnapshot(); - parent.getInstance().setState({ b: -10 }); + parent.getInstance().setState({ b: -10 }); - // Skip 1 frame because of debounce - await Rx.Observable.interval(0).take(1).toPromise(); + // Skip 1 frame because of debounce + await Rx.Observable.interval(0).take(1).toPromise(); - expect(parent.toJSON()).toMatchSnapshot(); -}); + expect(parent.toJSON()).toMatchSnapshot(); + }); -test("noDebounce", () => { - const Component = rxConnect(props$ => props$, { noDebounce: true })(({ i }) =>
{i}
); + it("noDebounce", () => { + const Component = rxConnect(props$ => props$, { noDebounce: true })(({ i }) =>
{i}
); - class Parent extends React.Component { - state = { - i: 0 - }; + class Parent extends React.Component { + state = { + i: 0 + }; - render() { - return + render() { + return + } } - } - const parent = renderer.create(); + const parent = renderer.create(); - expect(parent.toJSON()).toMatchSnapshot(); + expect(parent.toJSON()).toMatchSnapshot(); - parent.getInstance().setState({ i: 1 }); + parent.getInstance().setState({ i: 1 }); - expect(parent.toJSON()).toMatchSnapshot(); -}) + expect(parent.toJSON()).toMatchSnapshot(); + }) -test("handles unmount", () => { - const props$ = new Rx.ReplaySubject(); + it("handles unmount", () => { + const props$ = new Rx.ReplaySubject(); - expect(props$.hasObservers()).toBeFalsy(); + expect(props$.observers).toHaveLength(0); - const Component = rxConnect(props$)(({ a }) =>
{a}
); + const Component = rxConnect(props$)(({ a }) =>
{a}
); - const node = renderer.create(); + const node = renderer.create(); - expect(props$.hasObservers()).toBeTruthy(); + expect(props$.observers).toHaveLength(1); - node.unmount(); + node.unmount(); - expect(props$.hasObservers()).toBeFalsy(); -}); + expect(props$.observers).toHaveLength(0); + }); +})); diff --git a/src/mapActionCreators.js b/src/mapActionCreators.js index bcc65d4..fd25c57 100644 --- a/src/mapActionCreators.js +++ b/src/mapActionCreators.js @@ -1,4 +1,4 @@ -import Rx from "./observable"; +import { getAdapter } from "./rxConnect"; export function ofActions(actions) { return this.of( @@ -9,12 +9,8 @@ export function ofActions(actions) { if (key.endsWith("$")) { result[key.slice(0, -1)] = (...args) => { - if(action.onNext) { - action.onNext(args); - } else { - action.next(args); - } - }; + getAdapter().next(action, args); + } } else { result[key] = action; } @@ -27,5 +23,5 @@ export function ofActions(actions) { } export default function mapActionCreators(actions) { - return Rx.Observable::ofActions(actions); + return getAdapter().Rx.Observable::ofActions(actions); } diff --git a/src/observable.js b/src/observable.js deleted file mode 100644 index 5694ba2..0000000 --- a/src/observable.js +++ /dev/null @@ -1,8 +0,0 @@ -let rx; -try { - rx = require("rx"); -} catch (e) { - rx = require("rxjs"); -} - -export default rx; diff --git a/src/rx4Adapter.js b/src/rx4Adapter.js new file mode 100644 index 0000000..f24e6ee --- /dev/null +++ b/src/rx4Adapter.js @@ -0,0 +1,18 @@ +import Rx from "rx"; + +export default { + + Rx, + + next(o, value) { + o.onNext(value); + }, + + isObservable(obj) { + return obj && Rx.Observable.isObservable(obj); + }, + + unsubscribe(subscription) { + subscription.dispose(); + } +} diff --git a/src/rx5Adapter.js b/src/rx5Adapter.js new file mode 100644 index 0000000..01c43c4 --- /dev/null +++ b/src/rx5Adapter.js @@ -0,0 +1,21 @@ +import Rx from "rxjs"; +import ObservableSymbol from "symbol-observable"; + +export default { + + description: "RX5", + + Rx, + + next(o, value) { + o.next(value); + }, + + isObservable(obj) { + return obj && typeof obj[ObservableSymbol] === 'function'; + }, + + unsubscribe(subscription) { + subscription.unsubscribe(); + } +} diff --git a/src/rxConnect.js b/src/rxConnect.js index dbd0056..e037091 100644 --- a/src/rxConnect.js +++ b/src/rxConnect.js @@ -1,7 +1,5 @@ import React from "react"; import isPlainObject from "lodash.isplainobject"; -import Rx from "./observable"; -import ObservableSymbol from "symbol-observable"; const DEFAULT_OPTIONS = { noDebounce: false @@ -15,11 +13,11 @@ function isObservable(obj) { return false; } - if (Rx.Observable.isObservable) { - return Rx.Observable.isObservable(obj); - } + return getAdapter().isObservable(obj); +} - return typeof obj[ObservableSymbol] === 'function'; +export function getAdapter() { + return rxConnect.adapter || require("./rx4Adapter"); } export default function rxConnect(selector, options = DEFAULT_OPTIONS) { @@ -36,24 +34,31 @@ export default function rxConnect(selector, options = DEFAULT_OPTIONS) { constructor(props) { super(props); - this.props$ = new Rx.BehaviorSubject(props); + this.props$ = new (getAdapter().Rx.BehaviorSubject)(props); } componentWillMount() { + const Rx = getAdapter().Rx; this.shouldDebounce = false; let mutations$ = selector; if(!isObservable(mutations$)) { - mutations$ = selector(this.props$); + if (typeof selector === 'function') { + mutations$ = selector(this.props$); + } else { + // eslint-disable-next-line no-console + console.error(`Selector must be a function or an Observable. Check rxConnect of ${getDisplayName(WrappedComponent)}. Got: `, selector); + return; + } } if(!isObservable(mutations$)) { // eslint-disable-next-line no-undef - if (typeof mutations$[Symbol.iterator] === 'function') { + if (mutations$ && typeof mutations$[Symbol.iterator] === 'function') { mutations$ = Rx.Observable.merge(...mutations$); } else { // eslint-disable-next-line no-console - console.error(`Selector must return an Observable, an iterator of observables. Got: `, mutations$); + console.error(`Selector must return an Observable or an iterator of observables. Check rxConnect of ${getDisplayName(WrappedComponent)}. Got: `, mutations$); return; } } @@ -84,15 +89,11 @@ export default function rxConnect(selector, options = DEFAULT_OPTIONS) { } componentWillUnmount() { - this.stateSubscription.dispose(); + getAdapter().unsubscribe(this.stateSubscription); } componentWillReceiveProps(nextProps) { - if (this.props$.onNext) { - this.props$.onNext(nextProps); - } else { - this.props$.next(nextProps); - } + getAdapter().next(this.props$, nextProps); } render() { diff --git a/webpack.config.js b/webpack.config.js index 47893c1..dc503d8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -17,10 +17,18 @@ var rxExternal = { amd: 'rx' } +var rxjsExternal = { + root: 'RxJS', + commonjs2: 'rxjs', + commonjs: 'rxjs', + amd: 'rxjs' +} + var config = { externals: { 'react': reactExternal, - 'rx': rxExternal + 'rx': rxExternal, + 'rxjs': rxjsExternal }, output: { library: "RxConnect", @@ -49,22 +57,7 @@ var config = { new webpack.DefinePlugin({ "process.env.NODE_ENV": JSON.stringify(env) }) - ], - devServer: { - port: 3000, - proxy: { - '/rc': { - target: "https://stream.wikimedia.org/", - secure: true, - changeOrigin: true - }, - '/socket.io/1/': { - target: "https://stream.wikimedia.org/", - secure: true, - changeOrigin: true - } - } - } + ] }; if (env === "production") { From 01436a6eaefa5c79ac11ab55b1c46c800d07bf0f Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Tue, 7 Feb 2017 08:35:34 +0200 Subject: [PATCH 2/2] remove description from Rx5 adapter --- src/rx5Adapter.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/rx5Adapter.js b/src/rx5Adapter.js index 01c43c4..9718d99 100644 --- a/src/rx5Adapter.js +++ b/src/rx5Adapter.js @@ -3,8 +3,6 @@ import ObservableSymbol from "symbol-observable"; export default { - description: "RX5", - Rx, next(o, value) {