Skip to content

Commit 96521de

Browse files
authored
Merge pull request #17 from kouhin/feature/release/v2.3.0
Release/v2.3.0
2 parents 491a04f + 106bad6 commit 96521de

File tree

5 files changed

+653
-533
lines changed

5 files changed

+653
-533
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
redux-memoize
22
=============
33

4+
[![Greenkeeper badge](https://badges.greenkeeper.io/kouhin/redux-memoize.svg)](https://greenkeeper.io/)
5+
46
Memoize action creator for [redux](http://redux.js.org), and let you dispatch common/thunk/promise/async action whenever you want to, without worrying about duplication.
57

68
[![CircleCI](https://img.shields.io/circleci/project/github/kouhin/redux-memoize.svg)](https://circleci.com/gh/kouhin/redux-memoize/tree/develop)
@@ -161,6 +163,7 @@ Create a redux [middleware](http://redux.js.org/docs/advanced/Middleware.html).
161163
- _Object_: Default opts for memorize().
162164
- **Default**: `{ ttl:0, enabled: true, isEqual: lodash.isEqual }`]. **ttl is REQUIRED, You SHOULD set a ttl > 0 in millisecond**
163165
- There is another options `disableTTL`. The default value is `true` on server and `false` on browser. By default, cached action creator will not be evicted by setTimeout with TTL on server in order to prevent memory leak. You can enable it for test purpose.
166+
- You can pass a customized cache by `cache` instead of default cache `new WeakMap()`.
164167

165168
#### Returns
166169

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "redux-memoize",
3-
"version": "2.2.0",
3+
"version": "2.3.0",
44
"description": "Memoize action creator for redux, and let you dispatch common/thunk/promise/async action whenever you want to, without worrying about duplication",
55
"main": "lib/index.js",
66
"directories": {
@@ -44,13 +44,15 @@
4444
"babel-cli": "^6.23.0",
4545
"babel-core": "^6.23.1",
4646
"babel-eslint": "^7.1.1",
47+
"babel-jest": "^20.0.3",
4748
"babel-plugin-transform-runtime": "^6.23.0",
4849
"babel-preset-env": "^1.2.1",
4950
"babel-preset-stage-0": "^6.22.0",
5051
"chai": "^3.5.0",
51-
"eslint-config-airbnb-deps": "^14.1.0",
52+
"eslint": "^3.19.0",
53+
"eslint-config-airbnb-deps": "^15.0.1",
5254
"eslint-plugin-babel": "^4.1.1",
53-
"jest": "^19.0.2",
55+
"jest": "^20.0.3",
5456
"redux": "^3.6.0",
5557
"redux-thunk": "^2.2.0",
5658
"rimraf": "^2.6.1"

src/index.js

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default function createMemoizeMiddleware(options = {}) {
3737
...globalOptions
3838
} = options;
3939

40-
const cache = new Map();
40+
const cache = options.cache || new WeakMap();
4141
const middleware = ({ dispatch, getState }) => next => (action) => {
4242
if (typeof action === 'object' && action.type === ACTION_TYPE) {
4343
const { fn, args } = action.payload;
@@ -74,16 +74,7 @@ export default function createMemoizeMiddleware(options = {}) {
7474
}
7575
return next(action);
7676
};
77-
middleware.getAll = () => {
78-
const result = [];
79-
const cacheValues = Array.from(cache.values());
80-
cacheValues.forEach((fnCache) => {
81-
Array.from(fnCache.values()).forEach((value) => {
82-
result.push(value);
83-
});
84-
});
85-
return result;
86-
};
77+
middleware.cache = cache;
8778
return middleware;
8879
}
8980

test/middleware.spec.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@ function configureStore(reducer) {
1010
)(createStore)(reducer);
1111
}
1212

13+
function getAll(cache) {
14+
const result = [];
15+
const cacheValues = Array.from(cache.values());
16+
cacheValues.forEach((fnCache) => {
17+
Array.from(fnCache.values()).forEach((value) => {
18+
result.push(value);
19+
});
20+
});
21+
return result;
22+
}
23+
1324
describe('memoize', () => {
1425
function actionCreator() {
1526
return {
@@ -208,7 +219,7 @@ describe('unit test', () => {
208219
};
209220
});
210221

211-
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200 });
222+
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200, cache: new Map() });
212223

213224
const store = applyMiddleware(
214225
memoizeMiddleware,
@@ -223,8 +234,8 @@ describe('unit test', () => {
223234
expect(typeof result3.then).toBe('function');
224235
expect(result1 === result3).toBeTruthy();
225236
expect(result1 === result2).not.toBeTruthy();
226-
expect(memoizeMiddleware.getAll().length).toBe(2);
227-
Promise.all(memoizeMiddleware.getAll())
237+
expect(getAll(memoizeMiddleware.cache).length).toBe(2);
238+
Promise.all(getAll(memoizeMiddleware.cache))
228239
.then(() => {
229240
expect(thunkCreatorCalled).toBe(2);
230241
expect(store.getState()).toBe(5);
@@ -247,7 +258,11 @@ describe('unit test', () => {
247258
payload: num,
248259
}));
249260

250-
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200, disableTTL: false });
261+
const memoizeMiddleware = createMemoizeMiddleware({
262+
ttl: 200,
263+
disableTTL: false,
264+
cache: new Map(),
265+
});
251266

252267
const store = applyMiddleware(
253268
memoizeMiddleware,
@@ -262,7 +277,7 @@ describe('unit test', () => {
262277
expect(typeof result3.then).toBe('function');
263278
expect(result1 === result3).toBeTruthy();
264279
expect(result1 === result2).not.toBeTruthy();
265-
expect(memoizeMiddleware.getAll().length).toBe(2);
280+
expect(getAll(memoizeMiddleware.cache).length).toBe(2);
266281
expect(store.getState()).toBe(5);
267282
new Promise((resolve) => {
268283
setTimeout(() => {
@@ -314,6 +329,7 @@ describe('unit test', () => {
314329
const memoizeMiddleware = createMemoizeMiddleware({
315330
disableTTL: false,
316331
ttl: 50,
332+
cache: new Map(),
317333
});
318334

319335
const store = applyMiddleware(
@@ -329,7 +345,7 @@ describe('unit test', () => {
329345
expect(typeof result3.then).toBe('function');
330346
expect(result1 === result3).toBeTruthy();
331347
expect(result1 === result2).not.toBeTruthy();
332-
expect(memoizeMiddleware.getAll().length).toBe(2);
348+
expect(getAll(memoizeMiddleware.cache).length).toBe(2);
333349
expect(store.getState()).toBe(5);
334350
new Promise((resolve) => {
335351
setTimeout(() => {
@@ -393,7 +409,7 @@ describe('unit test', () => {
393409
};
394410
});
395411

396-
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200 });
412+
const memoizeMiddleware = createMemoizeMiddleware({ ttl: 200, cache: new Map() });
397413

398414
const store = applyMiddleware(
399415
thunkMiddleware,
@@ -409,8 +425,8 @@ describe('unit test', () => {
409425
expect(typeof result3.then).toBe('function');
410426
expect(result1 === result3).toBeTruthy();
411427
expect(result1 === result2).not.toBeTruthy();
412-
expect(memoizeMiddleware.getAll().length).toBe(2);
413-
Promise.all(memoizeMiddleware.getAll())
428+
expect(getAll(memoizeMiddleware.cache).length).toBe(2);
429+
Promise.all(getAll(memoizeMiddleware.cache))
414430
.then(() => {
415431
expect(thunkCreatorCalled).toBe(2);
416432
expect(thunkCalled).toBe(2);

0 commit comments

Comments
 (0)