Flux Standard Action creation with schema validation.
npm install --save fsa-creator
This module started as a fork of redux-actions by Andrew Clark. It focuses in the creation of actions with handy specifications of mapping functions and schema validation.
payloadSpec
and metaSpec
are mapping function specifications for payload
and meta
properties, respectively.
Returns an action creator function with following signature:
payloadInput
and metaInput
are the input of the respective mapping function.
A mapping function specification can be:
The property (payload
or meta
) will be omitted.
A mapping function will be used.
Example:
let actionCreator = createAction('ACTION', arg => '(u' + arg + 'u)');
expect(actionCreator('.')).to.deep.equal({
type: 'ACTION',
payload: '(u.u)'
});
The identity function will be used.
Example:
let increment = createAction('INCREMENT', true);
// same as
increment = createAction('INCREMENT', amount => amount);
expect(increment(42)).to.deep.equal({
type: 'INCREMENT',
payload: 42
});
A validated identity function will be used. JSONSchema v4 validation powered by is-my-json-valid.
Example:
let actionCreator = createAction('ACTION', {
required: true,
type: 'object',
properties: {
hello: {
required: true,
type: 'string',
description: 'A greeting'
}
}
});
expect(actionCreator()).to.deep.equal({
type: 'ACTION',
error: true,
payload: new Error('payload is required')
});
expect(actionCreator({})).to.deep.equal({
type: 'ACTION',
error: true,
payload: new Error('payload.hello is required')
});
expect(actionCreator({hello: 123})).to.deep.equal({
type: 'ACTION',
error: true,
payload: new Error('payload.hello is the wrong type')
});
expect(actionCreator({hello: 'world'})).to.deep.equal({
type: 'ACTION',
payload: {hello: 'world'}
});
A property extraction function will be used. This is thought to be used as a fast way of document expected properties, without defining a schema (yet).
Example:
let actionCreator = createAction('ACTION', ['prop1', 'prop3']);
expect(actionCreator({prop1: 1, prop2: 2, prop3: 3})).to.deep.equal({
type: 'ACTION',
payload: {
prop1: 1,
prop3: 3
}
});
NOTE: The more correct name for createAction
function probably is createActionCreator()
, but that seems a bit redundant.