Skip to content

Commit

Permalink
3.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
svagi committed Apr 9, 2018
1 parent ce8419a commit a9789ca
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 206 deletions.
128 changes: 32 additions & 96 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,110 +1,46 @@
'use strict';

exports.__esModule = true;
exports.prefixType = prefixType;
exports.createAction = createAction;
exports.DEFAULT_SETTINGS = undefined;
exports.createActionType = createActionType;
exports.createRoutine = createRoutine;

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
var _reduxActions = require('redux-actions');

/**
* redux-routines
*/
var identity = function identity(f) {
return f;
};

var TRIGGER = exports.TRIGGER = 'TRIGGER';
var REQUEST = exports.REQUEST = 'REQUEST';
var SUCCESS = exports.SUCCESS = 'SUCCESS';
var FAILURE = exports.FAILURE = 'FAILURE';
var FULFILL = exports.FULFILL = 'FULFILL';
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /**
* redux-routines
*/

function prefixType(prefix, type) {
if (typeof prefix !== 'string') {
throw new Error('Invalid routine prefix. It should be string.');
}
return prefix + '_' + type;
}
// Default routine settings
var DEFAULT_SETTINGS = exports.DEFAULT_SETTINGS = {
separator: '/',
stages: ['TRIGGER', 'REQUEST', 'SUCCESS', 'FAILURE', 'FULFILL']
};

function createAction(type, payload) {
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
// Routine action type factory
function createActionType(prefix, stage, separator) {
if (typeof prefix !== 'string' || typeof stage !== 'string') {
throw new Error('Invalid routine prefix or stage. It should be string.');
}

return Object.assign.apply(Object, [{}].concat(args, [{ type: type, payload: payload }]));
return '' + prefix + separator + stage;
}

function createRoutine(prefix) {
var enhancer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity;

var routine = {
TRIGGER: prefixType(prefix, TRIGGER),
REQUEST: prefixType(prefix, REQUEST),
SUCCESS: prefixType(prefix, SUCCESS),
FAILURE: prefixType(prefix, FAILURE),
FULFILL: prefixType(prefix, FULFILL),
state: {
trigger: false,
request: false,
success: false,
failure: false,
fulfill: false
},
trigger: function trigger(payload) {
routine.state.trigger = true;

for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}

return enhancer(createAction.apply(undefined, [routine.TRIGGER, payload].concat(_toConsumableArray(args))));
},
request: function request(payload) {
routine.state.request = true;

for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
args[_key3 - 1] = arguments[_key3];
}
// Routine factory
function createRoutine(prefix, payloadCreator, metaCreator, settings) {
var _Object$assign = Object.assign({}, DEFAULT_SETTINGS, settings),
stages = _Object$assign.stages,
separator = _Object$assign.separator;

return enhancer(createAction.apply(undefined, [routine.REQUEST, payload].concat(_toConsumableArray(args))));
},
success: function success(payload) {
routine.state.success = true;
routine.state.failure = false;

for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
args[_key4 - 1] = arguments[_key4];
}

return enhancer(createAction.apply(undefined, [routine.SUCCESS, payload].concat(_toConsumableArray(args))));
},
failure: function failure(payload) {
routine.state.success = false;
routine.state.failure = true;

for (var _len5 = arguments.length, args = Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
args[_key5 - 1] = arguments[_key5];
}

return enhancer(createAction.apply(undefined, [routine.FAILURE, payload].concat(_toConsumableArray(args))));
},
fulfill: function fulfill(payload) {
routine.state.fulfill = true;

for (var _len6 = arguments.length, args = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
args[_key6 - 1] = arguments[_key6];
}

return enhancer(createAction.apply(undefined, [routine.FULFILL, payload].concat(_toConsumableArray(args))));
}
var createRoutineAction = function createRoutineAction(stage) {
var type = createActionType(prefix, stage, separator);
return (0, _reduxActions.createAction)(type, payloadCreator, metaCreator);
};
function call(payload) {
for (var _len7 = arguments.length, args = Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {
args[_key7 - 1] = arguments[_key7];
}
return stages.reduce(function (routine, stage) {
var _Object$assign2;

return routine.trigger.apply(routine, [payload].concat(args));
}
return Object.assign(call, routine);
}
var actionCreator = createRoutineAction(stage);
return Object.assign(routine, (_Object$assign2 = {}, _defineProperty(_Object$assign2, stage.toLowerCase(), actionCreator), _defineProperty(_Object$assign2, stage.toUpperCase(), actionCreator.toString()), _Object$assign2));
}, createRoutineAction(stages[0]));
}

exports.default = createRoutine;
189 changes: 80 additions & 109 deletions lib/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,151 +5,122 @@ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol

var _index = require('./index');

var stages = _index.DEFAULT_SETTINGS.stages;


describe('createRoutine', function () {
it('should be a function', function () {
var routine = (0, _index.createRoutine)('test');
expect(typeof routine === 'undefined' ? 'undefined' : _typeof(routine)).toBe('function');
});
it('should have initial state', function () {
var _createRoutine = (0, _index.createRoutine)('test'),
state = _createRoutine.state;

expect(state.trigger).toBe(false);
expect(state.request).toBe(false);
expect(state.success).toBe(false);
expect(state.failure).toBe(false);
expect(state.fulfill).toBe(false);
});
it('should have trigger state', function () {
var routine = (0, _index.createRoutine)('test');
var state = routine.state;

expect(routine.trigger().type).toContain('TRIGGER');
expect(state.trigger).toBe(true);
expect(state.request).toBe(false);
expect(state.success).toBe(false);
expect(state.failure).toBe(false);
expect(state.fulfill).toBe(false);
});
it('should have request state', function () {
var routine = (0, _index.createRoutine)('test');
var state = routine.state;

expect(routine.request().type).toContain('REQUEST');
expect(state.trigger).toBe(false);
expect(state.request).toBe(true);
expect(state.success).toBe(false);
expect(state.failure).toBe(false);
expect(state.fulfill).toBe(false);
});
it('should have success state', function () {
it('should have all routine properties', function () {
var routine = (0, _index.createRoutine)('test');
var state = routine.state;

expect(routine.success().type).toContain('SUCCESS');
expect(state.trigger).toBe(false);
expect(state.request).toBe(false);
expect(state.success).toBe(true);
expect(state.failure).toBe(false);
expect(state.fulfill).toBe(false);
stages.forEach(function (stage) {
expect(routine).toHaveProperty(stage.toUpperCase());
expect(routine).toHaveProperty(stage.toLowerCase());
});
});
it('should have failure state', function () {
it('should create all action types with default stages', function () {
var routine = (0, _index.createRoutine)('test');
var state = routine.state;

expect(routine.failure().type).toContain('FAILURE');
expect(state.trigger).toBe(false);
expect(state.request).toBe(false);
expect(state.success).toBe(false);
expect(state.failure).toBe(true);
expect(state.fulfill).toBe(false);
stages.forEach(function (stage) {
var actionCreator = routine[stage.toLowerCase()];
var actionType = routine[stage];
expect(actionType).toBe('test/' + stage);
expect(String(actionCreator)).toBe(actionType);
});
});
it('should have fulfill state', function () {
it('should create all action creators with default stages', function () {
var routine = (0, _index.createRoutine)('test');
var state = routine.state;

expect(routine.fulfill().type).toContain('FULFILL');
expect(state.trigger).toBe(false);
expect(state.request).toBe(false);
expect(state.success).toBe(false);
expect(state.failure).toBe(false);
expect(state.fulfill).toBe(true);
});
it('should modify payload with enhancer', function () {
var routine = (0, _index.createRoutine)('test', function (action) {
action.payload += 1;
return action;
stages.forEach(function (stage) {
var actionCreator = routine[stage.toLowerCase()];
var actionType = routine[stage];
expect(actionCreator()).toEqual({ type: 'test/' + stage });
expect(actionCreator()).toEqual({ type: actionType });
});
expect(routine.trigger(0).payload).toBe(1);
expect(routine.request(0).payload).toBe(1);
expect(routine.success(0).payload).toBe(1);
expect(routine.failure(0).payload).toBe(1);
expect(routine.fulfill(0).payload).toBe(1);
});
it('should trigger on routine invocation', function () {
var routine = (0, _index.createRoutine)('test');
var action = routine();
expect(action.type).toContain('TRIGGER');
expect(routine.state.trigger).toBe(true);
it('should create routine with payloadCreator', function () {
var routine = (0, _index.createRoutine)('test', function (val) {
return val + 1;
});
stages.forEach(function (stage) {
var actionCreator = routine[stage.toLowerCase()];
expect(actionCreator(0).payload).toBe(1);
});
});
});

describe('createAction', function () {
it('should create an action object', function () {
var type = 'TEST';
var payload = {};
var action = (0, _index.createAction)(type, payload);
expect(action).toMatchObject({
type: type,
payload: payload
it('should create routine with metaCreator', function () {
var routine = (0, _index.createRoutine)('test', null, function () {
return { extra: true };
});
stages.forEach(function (stage) {
var actionCreator = routine[stage.toLowerCase()];
expect(actionCreator().meta).toEqual({ extra: true });
});
});
it('should create an action object with additional properties', function () {
var type = 'TEST';
var payload = {};
var props = { test: true };
var action = (0, _index.createAction)(type, payload, props);
expect(action).toMatchObject({
type: type,
payload: payload,
test: true
it('should create routine with different separator', function () {
var routine = (0, _index.createRoutine)('test', null, null, { separator: '+' });
stages.forEach(function (stage) {
var actionCreator = routine[stage.toLowerCase()];
expect(actionCreator()).toEqual({ type: 'test+' + stage });
});
});
it('should not mutate action with additional properties', function () {
var type = 'TEST';
var props = { test: true };
var action1 = (0, _index.createAction)('type1', null, props);
var action2 = (0, _index.createAction)('type2', null, props);
expect(action1.type).toContain('type1');
expect(action2.type).toContain('type2');
it('should create routine with explicit stages', function () {
var stages = ['REQUEST', 'SUCCESS', 'FAILURE'];
var routine = (0, _index.createRoutine)('test', null, null, { stages: stages });
stages.forEach(function (stage) {
expect(routine).toHaveProperty(stage.toUpperCase());
expect(routine).toHaveProperty(stage.toLowerCase());
});
expect(routine).not.toHaveProperty('TRIGGER');
expect(routine).not.toHaveProperty('trigger');
expect(routine).not.toHaveProperty('FULFILL');
expect(routine).not.toHaveProperty('fulfill');
});
});

describe('prefixType', function () {
describe('createActionType', function () {
it('should throws if prefix is not specified', function () {
expect(_index.prefixType).toThrow();
expect(function () {
return (0, _index.createActionType)();
}).toThrow();
});
it('should throws if prefix is a not string', function () {
expect(function () {
return (0, _index.prefixType)(0);
return (0, _index.createActionType)(0);
}).toThrow();
expect(function () {
return (0, _index.createActionType)(1);
}).toThrow();
expect(function () {
return (0, _index.createActionType)(true);
}).toThrow();
expect(function () {
return (0, _index.createActionType)(false);
}).toThrow();
expect(function () {
return (0, _index.createActionType)({});
}).toThrow();
});
it('should throws if stage is a not string', function () {
expect(function () {
return (0, _index.createActionType)('', 0);
}).toThrow();
expect(function () {
return (0, _index.prefixType)(1);
return (0, _index.createActionType)('', 1);
}).toThrow();
expect(function () {
return (0, _index.prefixType)(true);
return (0, _index.createActionType)('', true);
}).toThrow();
expect(function () {
return (0, _index.prefixType)(false);
return (0, _index.createActionType)('', false);
}).toThrow();
expect(function () {
return (0, _index.prefixType)({});
return (0, _index.createActionType)('', {});
}).toThrow();
});
it('should prefix type', function () {
expect((0, _index.prefixType)('TEST', 'TYPE')).toBe('TEST_TYPE');
expect((0, _index.createActionType)('TEST', 'TYPE', '_')).toBe('TEST_TYPE');
});
it('should not modify prefix to uppercase', function () {
expect((0, _index.prefixType)('@@test/TEST', 'TYPE')).toBe('@@test/TEST_TYPE');
expect((0, _index.createActionType)('@test/TEST', 'TYPE', '_')).toBe('@test/TEST_TYPE');
});
});
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "redux-routines",
"version": "2.0.1",
"version": "3.0.0",
"description": "Simple, yet effective tool for removing Redux boilerplate code.",
"keywords": [
"redux",
Expand Down

0 comments on commit a9789ca

Please sign in to comment.