Skip to content

Commit 3bf6f24

Browse files
committed
Support redux-observable ^
0.14.0
1 parent 8282f4b commit 3bf6f24

File tree

5 files changed

+177
-58
lines changed

5 files changed

+177
-58
lines changed

CHANGELOG.MD

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,26 @@
11
# Change Log
22

3+
# 1.1.0
4+
5+
* Update dependencies to work with redux-observable 0.14.*
6+
* Add ability to pass redux-observable Options into create epics
7+
8+
*note* If using the `dependencies` feature of redux-observable-options, you will need to use redux-observable 0.14.0 or greater.
9+
10+
11+
# Passing in dependencies
12+
13+
```ts
14+
class TestOne {
15+
@Epic() a = (action$, store, deps) => action$
16+
.ofType('TEST_A_IN')
17+
.mapTo({ type: 'TEST_A_OUT', payload: deps.foo() });
18+
}
19+
20+
const epicMiddleware = createEpics(epicOne, { dependencies: {
21+
foo: function() { return 'bar'; }
22+
}});
23+
```
324
# 1.0.0
425

526
## Breaking Change

package.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@
2626
"homepage": "https://github.com/angular-redux/redux-observable-decorator#readme",
2727
"peerDependencies": {
2828
"redux": "3.*",
29-
"redux-observable": " ^0.13.0"
29+
"redux-observable": "^0.13.0 || ^0.14.0"
3030
},
3131
"devDependencies": {
32-
"@angular/common": "^2.4.0",
33-
"@angular/compiler": "^2.4.0",
34-
"@angular/compiler-cli": "^2.4.0",
35-
"@angular/core": "^2.4.0",
36-
"@angular/platform-browser": "^2.4.0",
37-
"@angular/platform-browser-dynamic": "^2.4.0",
38-
"@angular/platform-server": "^2.4.0",
32+
"@angular/common": "4.0.0",
33+
"@angular/compiler": "4.0.0",
34+
"@angular/compiler-cli": "4.0.0",
35+
"@angular/core": "4.0.0",
36+
"@angular/platform-browser": "4.0.0",
37+
"@angular/platform-browser-dynamic": "4.0.0",
38+
"@angular/platform-server": "4.0.0",
3939
"@types/jasmine": "^2.5.38",
4040
"@types/node": "^6.0.52",
4141
"awesome-typescript-loader": "^3.0.0-beta.17",
@@ -51,16 +51,16 @@
5151
"karma-typescript-preprocessor": "^0.3.1",
5252
"karma-webpack": "^2.0.2",
5353
"redux": "^3.6.0",
54-
"redux-observable": "^0.13.0",
54+
"redux-observable": "^0.14.0",
5555
"reflect-metadata": "^0.1.8",
5656
"rimraf": "^2.5.4",
5757
"rxjs": "^5.0.1",
5858
"ts-loader": "^1.3.3",
5959
"tslint": "^4.1.1",
6060
"tslint-loader": "^3.3.0",
61-
"typescript": "latest",
61+
"typescript": "~2.2.0",
6262
"uglifyjs": "^2.4.10",
6363
"webpack": "^2.2.1",
64-
"zone.js": "^0.7.4"
64+
"zone.js": "^0.8.4"
6565
}
6666
}

spec/create-epics.spec.ts

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Epic, getEpicsMetadata, createEpics } from '../src/epic-decorator';
22
import { createStore, applyMiddleware } from 'redux';
33
import 'rxjs/add/operator/mapTo';
4-
4+
import { createEpicMiddleware } from 'redux-observable';
55
describe('createEpics', () => {
66
it('should create an for a decorated method', () => {
77
class Test {
@@ -92,4 +92,79 @@ describe('createEpics', () => {
9292

9393
expect(actual).toEqual(expected);
9494
});
95+
96+
it('should pass in the options object if one is provided', () => {
97+
class TestOneDep {
98+
@Epic() a = (action$, store, deps) => action$
99+
.ofType('TEST_A_IN')
100+
.mapTo({ type: 'TEST_A_OUT', payload: deps.foo() });
101+
}
102+
103+
class TestTwoDep {
104+
@Epic() d = (action$, store, deps) => action$
105+
.ofType('TEST_D_IN')
106+
.mapTo({ type: 'TEST_D_OUT', payload: deps.foo() });
107+
108+
}
109+
110+
const reducer = (state = [], action) => state.concat(action);
111+
const epicOne = new TestOneDep();
112+
const epicTwo = new TestTwoDep();
113+
114+
const epicMiddleware = createEpics(epicOne, epicTwo, {
115+
dependencies: {
116+
foo: function () { return 'bar'; },
117+
},
118+
}, );
119+
120+
const store = createStore(reducer, applyMiddleware(epicMiddleware));
121+
122+
const expected = [
123+
{ type: '@@redux/INIT' },
124+
{ type: 'TEST_A_IN' },
125+
{ type: 'TEST_A_OUT', payload: 'bar' },
126+
{ type: 'TEST_D_IN' },
127+
{ type: 'TEST_D_OUT', payload: 'bar' },
128+
];
129+
130+
store.dispatch({ type: 'TEST_A_IN' });
131+
store.dispatch({ type: 'TEST_D_IN' });
132+
133+
134+
const actual = store.getState();
135+
136+
expect(actual).toEqual(expected);
137+
});
138+
139+
it('should not pass in dependencies if no options provided', () => {
140+
class TestOneNoDep {
141+
@Epic() a = (action$, store, deps) => {
142+
console.log(store, deps);
143+
return action$.ofType('TEST_A_IN').mapTo({ type: 'TEST_A_OUT', payload: deps });
144+
}
145+
}
146+
147+
const reducer = (state = [], action) => state.concat(action);
148+
const epicOne = new TestOneNoDep();
149+
150+
151+
const epicMiddleware = createEpics(epicOne);
152+
153+
const store = createStore(reducer, applyMiddleware(epicMiddleware));
154+
155+
const expected = [
156+
{ type: '@@redux/INIT' },
157+
{ type: 'TEST_A_IN' },
158+
{ type: 'TEST_A_OUT', payload: undefined },
159+
160+
];
161+
162+
store.dispatch({ type: 'TEST_A_IN' });
163+
164+
165+
const actual = store.getState();
166+
expect(actual).toEqual(expected);
167+
});
168+
169+
95170
});

src/epic-decorator.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,29 @@ export function getEpicsMetadata(instance: any): EpicMetadata[] {
2626

2727
}
2828

29-
export function createEpics<T, S>(...instances: any[]): EpicMiddleware<T, S> {
29+
function isOptions(...instanceOrOptions) {
30+
31+
let option = instanceOrOptions[instanceOrOptions.length - 1];
32+
let keys = option ? Object.keys(option) : [];
33+
return keys.indexOf('dependencies') >= 0 || keys.indexOf('adapter') >= 0;
34+
35+
36+
}
37+
export function createEpics<T, S>(epic, ...epicsOrOptions): EpicMiddleware<T, S> {
38+
let instances;
39+
let options;
40+
if (isOptions(...epicsOrOptions)) {
41+
options = epicsOrOptions.slice(epicsOrOptions.length - 1, epicsOrOptions.length)[0];
42+
43+
}
44+
instances = [epic, ...epicsOrOptions];
45+
3046
const epicsMetaData = instances
3147
.map(instance => getEpicsMetadata(instance)
32-
.map(({propertyName}) => instance[propertyName]));
48+
.map(({ propertyName }) => instance[propertyName]));
3349

3450
const epics = [].concat(...epicsMetaData);
3551
const rootEpic = combineEpics<T, S>(...epics);
36-
return createEpicMiddleware<T, S>(rootEpic);
52+
return createEpicMiddleware<T, S>(rootEpic, options);
3753

3854
}

yarn.lock

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,52 @@
22
# yarn lockfile v1
33

44

5-
"@angular/common@^2.4.0":
6-
version "2.4.5"
7-
resolved "https://registry.yarnpkg.com/@angular/common/-/common-%3Cspan%20class="x x-first x-last">2.4.5.tgz#ada1a22b7ba01d1fdeb300115584478e031e9a4f"
5+
"@angular/common@4.0.0":
6+
version "4.0.0"
7+
resolved "https://registry.yarnpkg.com/@angular/common/-/common-%3Cspan%20class="x x-first x-last">4.0.0.tgz#ca18983222fdab4ecaa7a8b99eda6ff661e6dc92"
88

9-
"@angular/compiler-cli@^2.4.0":
10-
version "2.4.5"
11-
resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-%3Cspan%20class="x x-first x-last">2.4.5.tgz#efabbe10558b233dcdfe985af2bd2e84f1414c97"
9+
"@angular/compiler-cli@4.0.0":
10+
version "4.0.0"
11+
resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-%3Cspan%20class="x x-first x-last">4.0.0.tgz#35b2d40cd35135aecec4be659532148f5ac67da6"
1212
dependencies:
13-
"@angular/tsc-wrapped" "0.5.1"
13+
"@angular/tsc-wrapped" "4.0.0"
1414
minimist "^1.2.0"
1515
reflect-metadata "^0.1.2"
1616

17-
"@angular/compiler@^2.4.0":
18-
version "2.4.5"
19-
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-%3Cspan%20class="x x-first x-last">2.4.5.tgz#521da325e2e002398e8f9de52cfb03d303729e72"
17+
"@angular/compiler@4.0.0":
18+
version "4.0.0"
19+
resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-%3Cspan%20class="x x-first x-last">4.0.0.tgz#e1aa061a6f8ef269f9748af1a7bc290f9d37ed6c"
2020

21-
"@angular/core@^2.4.0":
22-
version "2.4.5"
23-
resolved "https://registry.yarnpkg.com/@angular/core/-/core-%3Cspan%20class="x x-first x-last">2.4.5.tgz#8b05156398afde9636e65527ffb61fc74236af5a"
21+
"@angular/core@4.0.0":
22+
version "4.0.0"
23+
resolved "https://registry.yarnpkg.com/@angular/core/-/core-%3Cspan%20class="x x-first x-last">4.0.0.tgz#fd877e074b29dfa9c63b96a21995fc7556d423a3"
2424

25-
"@angular/platform-browser-dynamic@^2.4.0":
26-
version "2.4.5"
27-
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-%3Cspan%20class="x x-first x-last">2.4.5.tgz#36fa975a8ee2dfe3f60bab561143974e6bdb1eff"
25+
"@angular/platform-browser-dynamic@4.0.0":
26+
version "4.0.0"
27+
resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-%3Cspan%20class="x x-first x-last">4.0.0.tgz#d1d9de80fe1e02735be89f512e0faf5a80d57fa5"
2828

29-
"@angular/platform-browser@^2.4.0":
30-
version "2.4.5"
31-
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-%3Cspan%20class="x x-first x-last">2.4.5.tgz#fa1bc891b1309bca83845787b9a08db36a787fee"
29+
"@angular/platform-browser@4.0.0":
30+
version "4.0.0"
31+
resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-%3Cspan%20class="x x-first x-last">4.0.0.tgz#512ae9ab19ccc25fa79027f44e291bcee236cd2b"
3232

33-
"@angular/platform-server@^2.4.0":
34-
version "2.4.5"
35-
resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-%3Cspan%20class="x x-first x-last">2.4.5.tgz#4322d6a3609603edf34101f286d47db8762a08bc"
33+
"@angular/platform-server@4.0.0":
34+
version "4.0.0"
35+
resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-%3Cspan%20class="x x-first x-last">4.0.0.tgz#d76d61787cd3be3ce8ed46043d6a8c82572f567d"
3636
dependencies:
37-
parse5 "^2.2.1"
37+
parse5 "^3.0.1"
38+
xhr2 "^0.1.4"
3839

39-
"@angular/tsc-wrapped@0.5.1":
40-
version "0.5.1"
41-
resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-%3Cspan%20class="x x-first x-last">0.5.1.tgz#7a69bec999eef41903dddaaccdc862cfcface52c"
40+
"@angular/tsc-wrapped@4.0.0":
41+
version "4.0.0"
42+
resolved "https://registry.yarnpkg.com/@angular/tsc-wrapped/-/tsc-wrapped-%3Cspan%20class="x x-first x-last">4.0.0.tgz#ea91eeda98029cdb0a4ac37d5e25d9d12a4333c1"
4243
dependencies:
43-
tsickle "^0.2"
44+
tsickle "^0.21.0"
4445

4546
"@types/jasmine@^2.5.38":
4647
version "2.5.41"
4748
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.5.41.tgz#d5e86161a0af80d52062b310a33ed65b051a0713"
4849

49-
"@types/node@^6.0.52":
50+
"@types/node@^6.0.46", "@types/node@^6.0.52":
5051
version "6.0.62"
5152
resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.62.tgz#85222c077b54f25b57417bb708b9f877bda37f89"
5253

@@ -2173,9 +2174,11 @@ parse-json@^2.1.0, parse-json@^2.2.0:
21732174
dependencies:
21742175
error-ex "^1.2.0"
21752176

2176-
parse5@^2.2.1:
2177-
version "2.2.3"
2178-
resolved "https://registry.yarnpkg.com/parse5/-/parse5-2.2.3.tgz#0c4fc41c1000c5e6b93d48b03f8083837834e9f6"
2177+
parse5@^3.0.1:
2178+
version "3.0.2"
2179+
resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510"
2180+
dependencies:
2181+
"@types/node" "^6.0.46"
21792182

21802183
21812184
version "0.0.3"
@@ -2406,9 +2409,9 @@ redent@^1.0.0:
24062409
indent-string "^2.1.0"
24072410
strip-indent "^1.0.1"
24082411

2409-
redux-observable@^0.13.0:
2410-
version "0.13.0"
2411-
resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-0.%3Cspan%20class="x x-first x-last">13.0.tgz#35b26c2cdbb71e499b31ca9961da0581c2973909"
2412+
redux-observable@^0.14.0:
2413+
version "0.14.1"
2414+
resolved "https://registry.yarnpkg.com/redux-observable/-/redux-observable-0.%3Cspan%20class="x x-first x-last">14.1.tgz#9f3d870c69388fdc427ded6770a3e326f3b69693"
24122415

24132416
redux@^3.6.0:
24142417
version "3.6.0"
@@ -2850,9 +2853,9 @@ ts-loader@^1.3.3:
28502853
object-assign "^4.1.0"
28512854
semver "^5.0.1"
28522855

2853-
tsickle@^0.2:
2854-
version "0.2.5"
2855-
resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.%3Cspan%20class="x x-first x-last">2.5.tgz#60d8e12462e6f8fbdac92d5f5fead2bf49085d82"
2856+
tsickle@^0.21.0:
2857+
version "0.21.6"
2858+
resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.%3Cspan%20class="x x-first x-last">21.6.tgz#53b01b979c5c13fdb13afb3fb958177e5991588d"
28562859
dependencies:
28572860
minimist "^1.2.0"
28582861
mkdirp "^0.5.1"
@@ -2906,9 +2909,9 @@ type-is@~1.6.14:
29062909
media-typer "0.3.0"
29072910
mime-types "~2.1.13"
29082911

2909-
typescript@^2.1.4, typescript@latest:
2910-
version "2.1.5"
2911-
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.%3Cspan%20class="x x-first x-last">1.5.tgz#6fe9479e00e01855247cea216e7561bafcdbcd4a"
2912+
typescript@^2.1.4, typescript@~2.2.0:
2913+
version "2.2.1"
2914+
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.%3Cspan%20class="x x-first x-last">2.1.tgz#4862b662b988a4c8ff691cc7969622d24db76ae9"
29122915

29132916
uglify-js@^2.6, uglify-js@^2.7.5:
29142917
version "2.7.5"
@@ -3148,6 +3151,10 @@ xdg-basedir@^2.0.0:
31483151
dependencies:
31493152
os-homedir "^1.0.0"
31503153

3154+
xhr2@^0.1.4:
3155+
version "0.1.4"
3156+
resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f"
3157+
31513158
31523159
version "1.5.3"
31533160
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
@@ -3201,6 +3208,6 @@ [email protected]:
32013208
version "0.1.2"
32023209
resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
32033210

3204-
zone.js@^0.7.4:
3205-
version "0.7.6"
3206-
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.%3Cspan%20class="x x-first x-last">7.6.tgz#fbbc39d3e0261d0986f1ba06306eb3aeb0d22009"
3211+
zone.js@^0.8.4:
3212+
version "0.8.5"
3213+
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.%3Cspan%20class="x x-first x-last">8.5.tgz#7906e017482cbff4c3f079c5c34305ce941f5ba2"

0 commit comments

Comments
 (0)