diff --git a/src/__tests__/createAction-test.js b/src/__tests__/createAction-test.js index e9c39bda..80c457ab 100644 --- a/src/__tests__/createAction-test.js +++ b/src/__tests__/createAction-test.js @@ -4,19 +4,25 @@ import isPlainObject from 'lodash.isplainobject'; describe('createAction()', () => { describe('resulting action creator', () => { const type = 'TYPE'; - const actionCreator = createAction(type, b => b); - const foobar = { foo: 'bar' }; - const action = actionCreator(foobar); it('returns plain object', () => { + const actionCreator = createAction(type, b => b); + const foobar = { foo: 'bar' }; + const action = actionCreator(foobar); expect(isPlainObject(action)).to.be.true; }); it('uses return value as payload', () => { + const actionCreator = createAction(type, b => b); + const foobar = { foo: 'bar' }; + const action = actionCreator(foobar); expect(action.payload).to.equal(foobar); }); it('has no extraneous keys', () => { + const actionCreator = createAction(type, b => b); + const foobar = { foo: 'bar' }; + const action = actionCreator(foobar); expect(action).to.deep.equal({ type, payload: foobar @@ -24,10 +30,26 @@ describe('createAction()', () => { }); it('uses identity function if actionCreator is not a function', () => { - expect(createAction(type)(foobar)).to.deep.equal({ + const actionCreator = createAction(type); + const foobar = { foo: 'bar' }; + const action = actionCreator(foobar); + expect(action).to.deep.equal({ type, payload: foobar }); }); + + it('accepts a second parameter for adding meta to object', () => { + const actionCreator = createAction(type, null, ({ cid }) => ({ cid })); + const foobar = { foo: 'bar', cid: 5 }; + const action = actionCreator(foobar); + expect(action).to.deep.equal({ + type, + payload: foobar, + meta: { + cid: 5 + } + }); + }); }); }); diff --git a/src/createAction.js b/src/createAction.js index 278246e1..0fc59298 100644 --- a/src/createAction.js +++ b/src/createAction.js @@ -2,13 +2,19 @@ function identity(t) { return t; } -export default function createAction(type, actionCreator) { +export default function createAction(type, actionCreator, metaCreator) { const finalActionCreator = typeof actionCreator === 'function' ? actionCreator : identity; - return (...args) => ({ - type, - payload: finalActionCreator(...args) - }); + return (...args) => { + const action = { + type, + payload: finalActionCreator(...args) + }; + + if (typeof metaCreator === 'function') action.meta = metaCreator(...args); + + return action; + }; }