Comparing version
1224
dist/gyrejs.js
@@ -10,3 +10,3 @@ (function webpackUniversalModuleDefinition(root, factory) { | ||
root["GyreJS"] = factory(root["Immutable"]); | ||
})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) { | ||
})(this, function(__WEBPACK_EXTERNAL_MODULE_2__) { | ||
return /******/ (function(modules) { // webpackBootstrap | ||
@@ -65,29 +65,6 @@ /******/ // The module cache | ||
var _store = __webpack_require__(15); | ||
var _store = __webpack_require__(1); | ||
var _store2 = _interopRequireDefault(_store); | ||
var _gyresLocalFactory = __webpack_require__(5); | ||
var _gyresLocalFactory2 = _interopRequireDefault(_gyresLocalFactory); | ||
var _gyresSmartRestFactory = __webpack_require__(9); | ||
var _gyresSmartRestFactory2 = _interopRequireDefault(_gyresSmartRestFactory); | ||
// Middleware | ||
var _middleWareDispatchLogger = __webpack_require__(13); | ||
var _middleWareDispatchLogger2 = _interopRequireDefault(_middleWareDispatchLogger); | ||
var _middleWareInjectDispatch = __webpack_require__(14); | ||
var _middleWareInjectDispatch2 = _interopRequireDefault(_middleWareInjectDispatch); | ||
var middleWare = { | ||
dispatchLogger: _middleWareDispatchLogger2["default"], | ||
injectDispatch: _middleWareInjectDispatch2["default"] | ||
}; | ||
// Private variables | ||
@@ -107,9 +84,27 @@ var gyres = new Map(); | ||
if (!gyres.has(id)) { | ||
console.warn(">> GyreJS: Gyre factory '" + id + "' not registered."); | ||
console.warn(">> GyreJS: Gyre factory '" + id + "' not registered."); // eslint-disable-line no-console | ||
} | ||
var newNameSpace = id + "-" + Date.now(); | ||
store.setState({ | ||
data: {} | ||
}, newNameSpace); | ||
return gyres.get(id)(store, Object.assign({}, { NS: id + "-" + Date.now() }, options)); | ||
return gyres.get(id)(store, Object.assign({}, { NS: newNameSpace }, options)); | ||
}; | ||
/** | ||
* destroyGyre() | ||
* | ||
* @param {String} id Id of a registered gyre factory. | ||
* @returns {Object|boolean} Gyre instance. | ||
*/ | ||
var destroyGyre = function destroyGyre(id) { | ||
if (!gyres.has(id)) { | ||
console.warn(">> GyreJS: Gyre factory '" + id + "' not registered."); // eslint-disable-line no-console | ||
return false; | ||
} | ||
return gyres["delete"](id) && true; | ||
}; | ||
/** | ||
* registerGyreFactory() | ||
@@ -125,8 +120,4 @@ * | ||
// Register standard gyres | ||
registerGyreFactory("local", _gyresLocalFactory2["default"]); | ||
registerGyreFactory("smartRest", _gyresSmartRestFactory2["default"]); | ||
exports.createGyre = createGyre; | ||
exports.middleWare = middleWare; | ||
exports.destroyGyre = destroyGyre; | ||
exports.registerGyreFactory = registerGyreFactory; | ||
@@ -136,8 +127,2 @@ | ||
/* 1 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_1__; | ||
/***/ }, | ||
/* 2 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
@@ -151,1110 +136,57 @@ | ||
var _actionHandler = __webpack_require__(4); | ||
var _immutable = __webpack_require__(2); | ||
var _actionHandler2 = _interopRequireDefault(_actionHandler); | ||
var _immutable2 = _interopRequireDefault(_immutable); | ||
/** | ||
* gyreFactory() | ||
* Store() Factory function | ||
* | ||
* @param {Function} Reducer Reducer factory. | ||
* @param {Function} ReactHoC React HoC factory. | ||
* @param {Function} [actions] Default actions object. | ||
* @param {Immutable.Map|Object} [state] Initial state object. | ||
* @returns {Function} Gyre factory function. | ||
* @returns {{addFilter: Function, getState: Function, setState: Function, updateState: Function}} API | ||
*/ | ||
var gyreFactory = function gyreFactory(Reducer, ReactHoC) { | ||
var actions = arguments.length <= 2 || arguments[2] === undefined ? function () {} : arguments[2]; | ||
var state = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; | ||
return function (store, options) { | ||
// Private variables | ||
var AH = _actionHandler2["default"](store, options); | ||
// Public functions | ||
/** | ||
* getReducer() Getter for reducer | ||
* | ||
* @param {String} matcher Matcher | ||
* @param {Function} cb Callback | ||
* @returns {Function} Reducer factory | ||
*/ | ||
var getReducer = function getReducer(matcher, cb) { | ||
return Reducer(store, AH.dispatch, matcher, cb, options); | ||
}; | ||
/** | ||
* setState() | ||
* | ||
* @param {Object|Immutable.Map} tState The state to set to this gyre. | ||
* @returns {Immutable.Map} Current store state. | ||
*/ | ||
var setState = function setState(tState) { | ||
return store.setState(tState, options.NS); | ||
}; | ||
/** | ||
* getState() | ||
* | ||
* @returns {Immutable.Map} Current store state. | ||
*/ | ||
var getState = function getState() { | ||
return store.getState.get(options.NS); | ||
}; | ||
/** | ||
* reactHoC() | ||
* | ||
* @param {Object} react React instance. | ||
* @return {Function} HoC factory function. | ||
*/ | ||
var reactHoC = ReactHoC(getReducer); | ||
// Setup | ||
AH.addActions(actions(options)); | ||
setState(state); | ||
// API | ||
return { | ||
addAction: AH.addAction, | ||
addActions: AH.addActions, | ||
dispatch: AH.dispatch, | ||
getState: getState, | ||
getReducer: getReducer, | ||
reactHoC: reactHoC, | ||
setState: setState, | ||
use: AH.use | ||
}; | ||
}; | ||
}; | ||
exports["default"] = gyreFactory; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 3 */ | ||
/***/ function(module, exports) { | ||
/** | ||
* extractEndpoints() | ||
* | ||
* @param {Object} query Query object. | ||
* @returns {Object[]} Array of endpoints. | ||
*/ | ||
"use strict"; | ||
exports.__esModule = true; | ||
var extractEndpoints = function extractEndpoints(query) { | ||
var marked1$0 = [processQuery].map(regeneratorRuntime.mark); | ||
function processQuery(q, root, branch) { | ||
var _iterator, _isArray, _i, _ref, i, val, tBranch, rV, _iterator2, _isArray2, _i2, _ref2, idVal; | ||
return regeneratorRuntime.wrap(function processQuery$(context$2$0) { | ||
while (1) switch (context$2$0.prev = context$2$0.next) { | ||
case 0: | ||
_iterator = Object.keys(q), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator](); | ||
case 1: | ||
if (!_isArray) { | ||
context$2$0.next = 7; | ||
break; | ||
} | ||
if (!(_i >= _iterator.length)) { | ||
context$2$0.next = 4; | ||
break; | ||
} | ||
return context$2$0.abrupt("break", 36); | ||
case 4: | ||
_ref = _iterator[_i++]; | ||
context$2$0.next = 11; | ||
break; | ||
case 7: | ||
_i = _iterator.next(); | ||
if (!_i.done) { | ||
context$2$0.next = 10; | ||
break; | ||
} | ||
return context$2$0.abrupt("break", 36); | ||
case 10: | ||
_ref = _i.value; | ||
case 11: | ||
i = _ref; | ||
val = q[i]; | ||
tBranch = branch ? branch.concat([i]) : [i]; | ||
rV = { | ||
name: root ? root + "/" + i : i, | ||
branch: tBranch, | ||
id: val.id ? val.id : null, | ||
fields: val.fields ? val.fields : null | ||
}; | ||
if (!(rV.fields || rV.id && !val.children)) { | ||
context$2$0.next = 18; | ||
break; | ||
} | ||
context$2$0.next = 18; | ||
return rV; | ||
case 18: | ||
if (!val.children) { | ||
context$2$0.next = 34; | ||
break; | ||
} | ||
_iterator2 = Array.isArray(val.id) ? val.id : [val.id], _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator](); | ||
case 20: | ||
if (!_isArray2) { | ||
context$2$0.next = 26; | ||
break; | ||
} | ||
if (!(_i2 >= _iterator2.length)) { | ||
context$2$0.next = 23; | ||
break; | ||
} | ||
return context$2$0.abrupt("break", 34); | ||
case 23: | ||
_ref2 = _iterator2[_i2++]; | ||
context$2$0.next = 30; | ||
break; | ||
case 26: | ||
_i2 = _iterator2.next(); | ||
if (!_i2.done) { | ||
context$2$0.next = 29; | ||
break; | ||
} | ||
return context$2$0.abrupt("break", 34); | ||
case 29: | ||
_ref2 = _i2.value; | ||
case 30: | ||
idVal = _ref2; | ||
return context$2$0.delegateYield(processQuery(val.children, idVal ? i + "/" + idVal : i, tBranch), "t0", 32); | ||
case 32: | ||
context$2$0.next = 20; | ||
break; | ||
case 34: | ||
context$2$0.next = 1; | ||
break; | ||
case 36: | ||
case "end": | ||
return context$2$0.stop(); | ||
} | ||
}, marked1$0[0], this); | ||
} | ||
var it = processQuery(query); | ||
var res = it.next(); | ||
var urlDefs = []; | ||
while (!res.done) { | ||
urlDefs.push(res.value); | ||
res = it.next(); | ||
} | ||
return urlDefs; | ||
}; | ||
/** | ||
* createUrls() | ||
* Creates urls from query | ||
* | ||
* @param {Object}query Query object. | ||
* @returns {String[]} Array of urls. | ||
*/ | ||
var createUrls = function createUrls(query) { | ||
var urlDefs = extractEndpoints(query); | ||
return urlDefs.map(function (urlDef) { | ||
var urlString = urlDef.name; | ||
if (urlDef.hasOwnProperty("id") && urlDef.id !== null) { | ||
urlString = urlString + "/" + urlDef.id; | ||
} | ||
if (Array.isArray(urlDef.fields) && urlDef.fields.length > 0) { | ||
urlString = urlString + "?fields=" + urlDef.fields.toString(); | ||
} | ||
return { | ||
path: urlString, | ||
type: urlDef.branch[urlDef.branch.length - 1], | ||
root: urlDef.name | ||
}; | ||
}); | ||
}; | ||
/** | ||
* checkStatusAndParse() | ||
* | ||
* @param {Object} response Fetch response. | ||
* @returns {Object} Parsed response. | ||
*/ | ||
var checkStatusAndParse = function checkStatusAndParse(response) { | ||
if (response.status >= 200 && response.status < 300) { | ||
return response.json().then(function (data) { | ||
return { | ||
success: true, | ||
data: data | ||
}; | ||
}); | ||
} | ||
return new Promise(function (resolve) { | ||
return resolve({ | ||
success: false, | ||
msg: response, | ||
code: response.status | ||
}); | ||
}); | ||
}; | ||
/** | ||
* parse() | ||
* | ||
* @param {Immutable.Map} endpoint | ||
* @returns {*} | ||
*/ | ||
var transform = function transform(endpoint) { | ||
return function (response) { | ||
if (response.success) { | ||
var _ret = (function () { | ||
var rData = Array.isArray(response.data) ? response.data : [response.data]; | ||
// Get idList and map data | ||
var idList = {}; | ||
var data = {}; | ||
idList[endpoint.get("root")] = []; | ||
data[endpoint.get("type")] = {}; | ||
rData.forEach(function (entry) { | ||
idList[endpoint.get("root")].push(entry.id.toString()); | ||
data[endpoint.get("type")][entry.id.toString()] = entry; | ||
}); | ||
return { | ||
v: { | ||
success: true, | ||
data: data, | ||
idList: idList | ||
} | ||
}; | ||
})(); | ||
if (typeof _ret === "object") return _ret.v; | ||
} | ||
return response; | ||
}; | ||
}; | ||
/** | ||
* fetchUrl() | ||
* | ||
* @param {String} host Endpoint host. | ||
* @param {Immutable.Map} endpoint Endpoint options. | ||
* @returns {Promise} Promise of fetch. | ||
*/ | ||
var fetchUrl = function fetchUrl(host, endpoint) { | ||
var hostName = host || location.protocol + "//" + location.hostname + (location.port ? ":" + location.port : ""); | ||
// Fetch data | ||
return fetch(hostName + "/" + endpoint.get("path")).then(checkStatusAndParse).then(transform(endpoint)); | ||
}; | ||
/** | ||
* hash() | ||
* Simple hash from string | ||
* | ||
* @param {String} str string | ||
* @returns {Number} hash Hash of string. | ||
*/ | ||
var hash = function hash(str) { | ||
var len = str.length; | ||
var h = 0; | ||
if (str.length === 0) { | ||
return h; | ||
} | ||
for (var i = 0; i < len; i++) { | ||
var chr = str.charCodeAt(i); | ||
h = (h << 5) - h + chr; | ||
h |= 0; | ||
} | ||
return h; | ||
}; | ||
/** | ||
* hashQueryObject() | ||
* Simple query hash from object | ||
* | ||
* @param {Object} obj Query object | ||
* @returns {Number} hash Hash of query. | ||
*/ | ||
var hashQueryObject = function hashQueryObject(obj) { | ||
return hash(JSON.stringify(obj)); | ||
}; | ||
// Helper functions | ||
var helpers = { | ||
createUrls: createUrls, | ||
fetchUrl: fetchUrl, | ||
hashQueryObject: hashQueryObject | ||
}; | ||
exports["default"] = helpers; | ||
module.exports = exports["default"]; | ||
// If it has fields, OR an id and no children, return as endpoint. | ||
/***/ }, | ||
/* 4 */ | ||
/***/ function(module, exports) { | ||
/** | ||
* actionHandler() | ||
* | ||
* @param {Object} store instance. | ||
* @param {Object} options Options object. | ||
* @returns {{addAction: Function, dispatch: Function}} API. | ||
*/ | ||
"use strict"; | ||
exports.__esModule = true; | ||
var actionHandler = function actionHandler(store, options) { | ||
var store = function store() { | ||
// Private variables | ||
var actionMap = new Map(); | ||
var middleWare = []; | ||
var state = _immutable2["default"].Map({}); | ||
var filterList = {}; | ||
var updateQueue = new Set(); | ||
// Public functions | ||
// Private functions | ||
/** | ||
* dispatch() | ||
* Send update to all registered reducers | ||
* | ||
* @param {String} id Id | ||
* @param {Array} args Function arguments. | ||
* @returns {void} | ||
*/ | ||
var dispatch = function dispatch(id) { | ||
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | ||
args[_key - 1] = arguments[_key]; | ||
} | ||
if (actionMap.has(id)) { | ||
// Invoke all registered middleWare before running the final action. | ||
middleWare.reduce(function (prev, next) { | ||
return function () { | ||
return next(options.NS, id, args, prev, dispatch); | ||
}; | ||
}, function () { | ||
return actionMap.get(id)(args); | ||
})(); | ||
} else { | ||
console.warn(">> GyreJS-'" + options.NS + "'-gyre: Unregistered action dispatched: '" + id + "' with arguments:", args, ". (This is a no-op)"); | ||
} | ||
}; | ||
/** | ||
* addAction() | ||
* | ||
* @param {String} id Action ID. | ||
* @param {Function} func Reducer function. | ||
* the actions. | ||
* @returns {void} | ||
*/ | ||
var addAction = function addAction(id, func) { | ||
return actionMap.set(id, function (args) { | ||
store.updateState(options.NS, func, args); | ||
var sendUpdate = function sendUpdate() { | ||
updateQueue.forEach(function (ns) { | ||
return (filterList[ns] || []).forEach(function (filter) { | ||
return filter(ns === "all" ? state : state.get(ns)); | ||
}); | ||
}); | ||
updateQueue.clear(); | ||
}; | ||
/** | ||
* addActions() | ||
* Request to issue update to filters of a given namespace. | ||
* | ||
* @param {Object} actions Key/func object of actions. | ||
* the actions. | ||
* @param {String} ns Namespace. | ||
* @returns {void} | ||
*/ | ||
var addActions = function addActions(actions) { | ||
Object.keys(actions).forEach(function (action) { | ||
addAction(action, actions[action]); | ||
}); | ||
}; | ||
/** | ||
* use() | ||
* | ||
* @param {Function} mware Middleware function. | ||
* @returns {void} | ||
*/ | ||
var use = function use(mware) { | ||
middleWare.unshift(mware); | ||
}; | ||
// API | ||
return { | ||
addAction: addAction, | ||
addActions: addActions, | ||
dispatch: dispatch, | ||
use: use | ||
}; | ||
}; | ||
exports["default"] = actionHandler; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 5 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _gyreFactory = __webpack_require__(2); | ||
var _gyreFactory2 = _interopRequireDefault(_gyreFactory); | ||
var _reducer = __webpack_require__(7); | ||
var _reducer2 = _interopRequireDefault(_reducer); | ||
var _reactHoC = __webpack_require__(6); | ||
var _reactHoC2 = _interopRequireDefault(_reactHoC); | ||
exports["default"] = _gyreFactory2["default"](_reducer2["default"], _reactHoC2["default"]); | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 6 */ | ||
/***/ function(module, exports) { | ||
/** | ||
* Higher order Component factory for local gyre. | ||
* | ||
* @param {Function} reducer Reducer factory. | ||
* @returns {Function} HoC Factory. | ||
*/ | ||
"use strict"; | ||
exports.__esModule = true; | ||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; | ||
var localHoCFactory = function localHoCFactory(reducer) { | ||
/** | ||
* localHoC() | ||
* | ||
* @param {String} matcher Matcher. | ||
* @param {Object} DefaultComponent Default component. | ||
* @param {*} initialData Initial state. | ||
* @returns {Object} React class | ||
*/ | ||
return function (matcher, DefaultComponent) { | ||
return React.createClass({ | ||
displayName: "GyreJS-localHoC", | ||
getInitialState: function getInitialState() { | ||
return { | ||
data: null | ||
}; | ||
}, | ||
componentWillMount: function componentWillMount() { | ||
this.unRegisterReducer = reducer(matcher, this.handleNewData); | ||
}, | ||
shouldComponentUpdate: function shouldComponentUpdate(nextState) { | ||
return this.state.data !== nextState.data; | ||
}, | ||
componentWillUnmount: function componentWillUnmount() { | ||
this.unRegisterReducer(); | ||
}, | ||
handleNewData: function handleNewData(data) { | ||
this.setState({ | ||
data: data | ||
}); | ||
}, | ||
render: function render() { | ||
return typeof this.state.data !== "undefined" ? React.createElement(DefaultComponent, _extends({}, this.props, this.state.data)) : false; | ||
} | ||
}); | ||
}; | ||
}; | ||
exports["default"] = localHoCFactory; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 7 */ | ||
/***/ function(module, exports) { | ||
/** | ||
* reducer() | ||
* | ||
* @param {Object} store Store instance | ||
* @param {Function} dispatch Dispatch | ||
* @param {Array|String} matcher Matcher | ||
* @param {Function} cb Callback | ||
* @param {Object} options Options object. | ||
* @returns {Function} Un-register function | ||
*/ | ||
"use strict"; | ||
exports.__esModule = true; | ||
var reducer = function reducer(store, dispatch, matcher, cb, options) { | ||
// Private functions | ||
var update = function update(stateVar) { | ||
var state = stateVar.get(options.NS); | ||
var matchValue = Array.isArray(matcher) ? matcher : [matcher]; | ||
if (state) { | ||
cb(matchValue.reduce(function (memo, val) { | ||
memo[val] = state.get(val); | ||
return memo; | ||
}, {})); | ||
} else { | ||
cb(void 0); | ||
var requestUpdate = function requestUpdate(ns) { | ||
if (!updateQueue.size) { | ||
requestAnimationFrame(sendUpdate); | ||
} | ||
updateQueue.add("all").add(ns); | ||
}; | ||
// Return the un-register function right away. | ||
return store.addReducer(update); | ||
}; | ||
exports["default"] = reducer; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 8 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _helpers = __webpack_require__(3); | ||
var _immutable = __webpack_require__(1); | ||
var _immutable2 = _interopRequireDefault(_immutable); | ||
var IMap = _immutable2["default"].Map; | ||
var IList = _immutable2["default"].List; | ||
// Status constants | ||
var STATUS_COMPLETED = "COMPLETED"; | ||
var STATUS_LOADING = "LOADING"; | ||
// const STATUS_CREATING = "CREATING"; | ||
var STATUS_UPDATING = "UPDATING"; | ||
// const STATUS_REMOVING = "REMOVING"; | ||
var STATUS_ERROR = "ERROR"; | ||
// Actions | ||
var actions = {}; | ||
var ADD_QUERY = "ADD_QUERY"; | ||
var FETCH_QUERY = "FETCH_QUERY"; | ||
var COMPLETE_QUERY = "COMPLETE_QUERY"; | ||
var FAIL_QUERY = "FAIL_QUERY"; | ||
var CREATE = "CREATE"; | ||
/* | ||
const UPDATE = "UPDATE"; | ||
const DELETE = "DELETE"; | ||
*/ | ||
// Misc | ||
var newQuery = IMap({ | ||
status: null, | ||
count: 0 | ||
}); | ||
exports["default"] = function (_ref) { | ||
var hostname = _ref.hostname; | ||
/** | ||
* Action: ADD_QUERY | ||
* removeFilter() - Factory | ||
* Remove filter from the store | ||
* | ||
* @param state | ||
* @param query | ||
* @param hash | ||
* @param dispatch | ||
*/ | ||
actions[ADD_QUERY] = function (state, query, hash, dispatch) { | ||
return state.reduce(function (memo, value, key) { | ||
if (key === "queries") { | ||
memo = memo.set("queries", value.set(hash, newQuery.merge(value.get(hash)).merge({ | ||
hash: hash, | ||
urls: _helpers.createUrls(query) | ||
}).map(function (qvVal, qvKey) { | ||
switch (qvKey) { | ||
case "count": | ||
{ | ||
return qvVal + 1; | ||
} | ||
case "status": | ||
{ | ||
return qvVal === STATUS_COMPLETED ? STATUS_UPDATING : qvVal; | ||
} | ||
default: | ||
return qvVal; | ||
} | ||
})).map(function (qVal, qKey) { | ||
if (qKey === hash) { | ||
if ([STATUS_LOADING, STATUS_UPDATING].indexOf(qVal.get("status")) === -1) { | ||
dispatch(FETCH_QUERY, qVal); | ||
} | ||
} | ||
return qVal.set("status", qVal.get("status") || STATUS_LOADING); | ||
})); | ||
} | ||
return memo; | ||
}, state); | ||
}; | ||
/** | ||
* Action: FETCH_QUERY | ||
* | ||
* @param state | ||
* @param query | ||
* @param dispatch | ||
*/ | ||
actions[FETCH_QUERY] = function (state, query, dispatch) { | ||
// Fetch urls | ||
var promiseArray = query.get("urls").map(function (endpoint) { | ||
return _helpers.fetchUrl(hostname, endpoint); | ||
}); | ||
Promise.all(promiseArray).then(function (resultArray) { | ||
var fetchResult = resultArray.reduce(function (memo, _ref2) { | ||
var success = _ref2.success; | ||
var msg = _ref2.msg; | ||
if (!success) { | ||
memo.success = false; | ||
memo.msgList = memo.msgList.push(msg); | ||
} | ||
return memo; | ||
}, { success: true, msgList: IList([]) }); | ||
if (fetchResult.success) { | ||
dispatch(COMPLETE_QUERY, resultArray, query); | ||
} else { | ||
dispatch(FAIL_QUERY, fetchResult.msgList, query); | ||
} | ||
})["catch"](function (error) { | ||
dispatch(FAIL_QUERY, [error], query); | ||
}); | ||
}; | ||
/** | ||
* Action: COMPLETE_QUERY | ||
* | ||
* @param state | ||
* @param resultArray | ||
* @param query | ||
*/ | ||
actions[COMPLETE_QUERY] = function (state, resultArray, query) { | ||
return state.reduce(function (memo, value, key) { | ||
if (key === "queries") { | ||
memo = memo.set("queries", value.map(function (qr, ky) { | ||
var qry = qr; | ||
if (ky === query.get("hash")) { | ||
qry = qry.merge({ | ||
"status": STATUS_COMPLETED, | ||
"idList": resultArray.reduce(function (prev, next) { | ||
return prev.merge(next.idList); | ||
}, IMap({})) | ||
}); | ||
} | ||
return qry; | ||
})); | ||
} | ||
if (key === "data") { | ||
memo = memo.set("data", resultArray.reduce(function (prev, result) { | ||
return prev.mergeDeep(result.data); | ||
}, memo.get("data"))); | ||
} | ||
return memo; | ||
}, state); | ||
}; | ||
/** | ||
* Action: FAIL_QUERY | ||
* | ||
* @param state | ||
* @param msgList | ||
* @param query | ||
*/ | ||
actions[FAIL_QUERY] = function (state, msgList, query) { | ||
return state.reduce(function (memo, value, key) { | ||
if (key === "queries") { | ||
memo = memo.set("queries", value.map(function (qr, ky) { | ||
var qry = qr; | ||
if (ky === query.get("hash")) { | ||
qry = qry.merge({ | ||
"status": STATUS_ERROR, | ||
"msg": msgList | ||
}); | ||
} | ||
return qry; | ||
})); | ||
} | ||
return memo; | ||
}, state); | ||
}; | ||
actions[CREATE] = function (state, type, data) { | ||
return state.reduce(function (memo, value, key) { | ||
if (key === "data") { | ||
var id = Date.now(); | ||
memo = memo.setIn(["data", type, id], _immutable2["default"].fromJS(data)); | ||
} | ||
return memo; | ||
}, state); | ||
}; | ||
return actions; | ||
}; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 9 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _gyreFactory = __webpack_require__(2); | ||
var _gyreFactory2 = _interopRequireDefault(_gyreFactory); | ||
var _reducer = __webpack_require__(11); | ||
var _reducer2 = _interopRequireDefault(_reducer); | ||
var _reactHoC = __webpack_require__(10); | ||
var _reactHoC2 = _interopRequireDefault(_reactHoC); | ||
var _actions = __webpack_require__(8); | ||
var _actions2 = _interopRequireDefault(_actions); | ||
var _state = __webpack_require__(12); | ||
var _state2 = _interopRequireDefault(_state); | ||
exports["default"] = _gyreFactory2["default"](_reducer2["default"], _reactHoC2["default"], _actions2["default"], _state2["default"]); | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 10 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _immutable = __webpack_require__(1); | ||
var _immutable2 = _interopRequireDefault(_immutable); | ||
/** | ||
* Higher order Component factory for local gyre. | ||
* | ||
* @param {Function} reducer Reducer factory. | ||
* @returns {Function} HoC Factory. | ||
*/ | ||
var reactHoCFactory = function reactHoCFactory(reducer) { | ||
/** | ||
* reactHoC() | ||
* | ||
* @param {String} matcher Matcher. | ||
* @param {Object} DefaultComponent Default component. | ||
* @param {Object} LoadingComponent Loading component. | ||
* @param {Object} ErrorComponent Error component. | ||
* @returns {Object} React class | ||
*/ | ||
return function (matcher, DefaultComponent, LoadingComponent, ErrorComponent) { | ||
return React.createClass({ | ||
displayName: "GyreJS-localHoC", | ||
getInitialState: function getInitialState() { | ||
return { | ||
data: null | ||
}; | ||
}, | ||
componentWillMount: function componentWillMount() { | ||
this.unRegisterReducer = reducer(matcher, this.handleNewData); | ||
}, | ||
shouldComponentUpdate: function shouldComponentUpdate(nextProps, nextState) { | ||
if (this.state.status !== nextState.status) { | ||
return true; | ||
} | ||
if (nextState.data) { | ||
return !_immutable2["default"].is(nextState.data, this.state.data); | ||
} | ||
return true; | ||
}, | ||
componentWillUnmount: function componentWillUnmount() { | ||
this.unRegisterReducer(); | ||
}, | ||
handleNewData: function handleNewData(status, data) { | ||
this.setState({ | ||
data: data, | ||
status: status | ||
}); | ||
}, | ||
render: function render() { | ||
// Render wrapped component with current props and state as props. | ||
if (!this.state || !this.state.status) { | ||
return false; | ||
} | ||
var Component = undefined; | ||
switch (this.state.status) { | ||
case "LOADING": | ||
{ | ||
Component = LoadingComponent; | ||
break; | ||
} | ||
case "ERROR": | ||
{ | ||
Component = ErrorComponent; | ||
break; | ||
} | ||
default: | ||
{ | ||
Component = DefaultComponent; | ||
} | ||
} | ||
return Component ? React.createElement(Component, _extends({}, this.props, this.state)) : false; | ||
} | ||
}); | ||
}; | ||
}; | ||
exports["default"] = reactHoCFactory; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 11 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _immutable = __webpack_require__(1); | ||
var _immutable2 = _interopRequireDefault(_immutable); | ||
var _helpers = __webpack_require__(3); | ||
var IMap = _immutable2["default"].Map; | ||
/** | ||
* reducer() | ||
* | ||
* @param {Object} store Store instance | ||
* @param {Function} dispatch Dispatch | ||
* @param {Array|String} matcher Matcher | ||
* @param {Function} cb Callback | ||
* @param {Object} NS NameSpace from Options object. | ||
* @returns {Function} Un-register function | ||
*/ | ||
var reducer = function reducer(store, dispatch, matcher, cb, _ref) { | ||
var NS = _ref.NS; | ||
var queryHash = _helpers.hashQueryObject(matcher); | ||
var update = function update(state) { | ||
var queryResult = state.getIn([NS, "queries", queryHash, "idList"]); | ||
var queryInfo = state.getIn([NS, "queries", queryHash]); | ||
if (queryResult) { | ||
cb(queryInfo.get("status"), queryResult.reduce(function (mm, value, key) { | ||
var memo = mm; | ||
// Create path | ||
var path = key.split("/").reduce(function (mem, val, index) { | ||
if (index % 2 === 0 && index) { | ||
mem.push("children"); | ||
} | ||
mem.push(val); | ||
return mem; | ||
}, []); | ||
// Add to reducer result | ||
var type = key.split("/"); | ||
type = type[type.length - 1]; | ||
value.forEach(function (val) { | ||
memo = memo.mergeDeepIn(path.concat(val), state.getIn([NS, "data", type, val])); | ||
}); | ||
return memo; | ||
}, IMap({}))); | ||
} else { | ||
cb(queryInfo.get("status")); | ||
} | ||
}; | ||
// Emit action to add query | ||
dispatch("ADD_QUERY", matcher, queryHash); | ||
// Return the un-register function right away. | ||
return store.addReducer(update); | ||
}; | ||
exports["default"] = reducer; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 12 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _immutable = __webpack_require__(1); | ||
var _immutable2 = _interopRequireDefault(_immutable); | ||
var IMap = _immutable2["default"].Map; | ||
exports["default"] = IMap({ | ||
queries: IMap({}), | ||
data: IMap({}) | ||
}); | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 13 */ | ||
/***/ function(module, exports) { | ||
/** | ||
* dispatchLogger() | ||
* | ||
* @param {String} nameSpace Gyre namespace. | ||
* @param {String} id Action Id. | ||
* @param {Array} args Action arguments array. | ||
* @param {Function} next Call next function in chain. | ||
* @returns {void} | ||
*/ | ||
"use strict"; | ||
exports.__esModule = true; | ||
var dispatchLogger = function dispatchLogger(nameSpace, id, args, next) { | ||
console.log(">> GyreJS-'" + nameSpace + "'-gyre: Applying action '" + id + "' with arguments: ", args); | ||
next(); | ||
}; | ||
exports["default"] = dispatchLogger; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 14 */ | ||
/***/ function(module, exports) { | ||
/** | ||
* injectDispatch() | ||
* | ||
* @param {String} nameSpace Gyre namespace. | ||
* @param {String} id Action Id. | ||
* @param {Array} args Action arguments array. | ||
* @param {Function} next Call next function in chain. | ||
* @param {Function} dispatch Action handler dispatcher. | ||
* @returns {void} | ||
*/ | ||
"use strict"; | ||
exports.__esModule = true; | ||
var injectDispatch = function injectDispatch(nameSpace, id, args, next, dispatch) { | ||
args.push(dispatch); | ||
next(); | ||
}; | ||
exports["default"] = injectDispatch; | ||
module.exports = exports["default"]; | ||
/***/ }, | ||
/* 15 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
exports.__esModule = true; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } | ||
var _immutable = __webpack_require__(1); | ||
var _immutable2 = _interopRequireDefault(_immutable); | ||
var IMap = _immutable2["default"].Map; | ||
/** | ||
* Store() Factory function | ||
* | ||
* @returns {{addReducer: Function, getState: Function, setState: Function, updateState: Function}} API | ||
*/ | ||
var store = function store() { | ||
// Private variables | ||
var state = IMap({}); | ||
var reducerList = []; | ||
// Private functions | ||
/** | ||
* Send update to all registered reducers | ||
* | ||
* @returns {void} | ||
*/ | ||
var sendUpdate = function sendUpdate() { | ||
return reducerList.forEach(function (reducer) { | ||
return reducer(state); | ||
}); | ||
}; | ||
/** | ||
* removeReducer() - Factory | ||
* Remove reducer from the store | ||
* | ||
* @param {Function} cb Reducer callback. | ||
* @param {String} ns Namespace. | ||
* @param {Function} cb Filter callback. | ||
* @returns {Function} removal function. | ||
*/ | ||
var removeReducer = function removeReducer(cb) { | ||
var removeFilter = function removeFilter(ns, cb) { | ||
return function () { | ||
return reducerList = reducerList.filter(function (reducer) { | ||
return reducer !== cb; | ||
return filterList[ns] = filterList[ns].filter(function (filter) { | ||
return filter !== cb; | ||
}); | ||
@@ -1269,9 +201,9 @@ }; | ||
* @param {Immutable.Map} newState New state. | ||
* @param {String} nameSpace Namespace. | ||
* @param {String} ns Namespace. | ||
* @returns {Immutable.Map} state Current state | ||
*/ | ||
var setNewState = function setNewState(newState, nameSpace) { | ||
if (state.get(nameSpace) !== newState) { | ||
state = state.set(nameSpace, newState); | ||
sendUpdate(); | ||
var setNewState = function setNewState(newState, ns) { | ||
if (state.get(ns) !== newState) { | ||
state = state.set(ns, newState); | ||
requestUpdate(ns); | ||
} | ||
@@ -1283,16 +215,23 @@ return state; | ||
/** | ||
* Register a faucet with the store and send initial data. | ||
* addFilter() Register a faucet with the store and send initial data. | ||
* | ||
* @param {Function} cb callback. | ||
* @param {String} [ns] Namespace. | ||
* @returns {Function} un-register function. | ||
*/ | ||
var addReducer = function addReducer(cb) { | ||
var addFilter = function addFilter(cb) { | ||
var ns = arguments.length <= 1 || arguments[1] === undefined ? "all" : arguments[1]; | ||
if (!filterList[ns]) { | ||
filterList[ns] = []; | ||
} | ||
// Save to local register | ||
reducerList.push(cb); | ||
filterList[ns].push(cb); | ||
// Send state to reducer | ||
cb(state); | ||
// Request update to make sure the new filter gets data asap. | ||
requestUpdate(ns); | ||
// Return remover | ||
return removeReducer(cb); | ||
return removeFilter(ns, cb); | ||
}; | ||
@@ -1312,8 +251,8 @@ | ||
* | ||
* @param {Immutable.Map|Object} nState State. | ||
* @param {String} [nameSpace] Namespace. | ||
* @param {Immutable.Map|Object} newState State. | ||
* @param {String} ns Namespace. | ||
* @returns {Immutable.Map} New state. | ||
*/ | ||
var setState = function setState(nState, nameSpace) { | ||
return setNewState(IMap.isMap(nState) ? nState : IMap(nState), nameSpace); | ||
var setState = function setState(newState, ns) { | ||
return setNewState(_immutable2["default"].Map.isMap(newState) ? newState : _immutable2["default"].Map(newState), ns); | ||
}; | ||
@@ -1325,3 +264,3 @@ | ||
* | ||
* @param {String} nameSpace Namespace. | ||
* @param {String} ns Namespace. | ||
* @param {Function} func Reducer function. | ||
@@ -1331,5 +270,4 @@ * @param {Array} args Reducer function arguments. | ||
*/ | ||
var updateState = function updateState(nameSpace, func, args) { | ||
setNewState(func.apply(undefined, [state.get(nameSpace)].concat(args)) || state.get(nameSpace), nameSpace); | ||
return state; | ||
var updateState = function updateState(ns, func, args) { | ||
return setNewState(func.apply(undefined, [state.get(ns)].concat(args)) || state.get(ns), ns); | ||
}; | ||
@@ -1339,3 +277,3 @@ | ||
return { | ||
addReducer: addReducer, | ||
addFilter: addFilter, | ||
getState: getState, | ||
@@ -1350,2 +288,8 @@ setState: setState, | ||
/***/ }, | ||
/* 2 */ | ||
/***/ function(module, exports) { | ||
module.exports = __WEBPACK_EXTERNAL_MODULE_2__; | ||
/***/ } | ||
@@ -1352,0 +296,0 @@ /******/ ]) |
@@ -1,1 +0,1 @@ | ||
!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("Immutable")):"function"==typeof define&&define.amd?define(["Immutable"],e):"object"==typeof exports?exports.GyreJS=e(require("Immutable")):t.GyreJS=e(t.Immutable)}(this,function(t){return function(t){function e(r){if(n[r])return n[r].exports;var u=n[r]={exports:{},id:r,loaded:!1};return t[r].call(u.exports,u,u.exports,e),u.loaded=!0,u.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(15),a=r(u),s=n(5),i=r(s),o=n(9),c=r(o),f=n(13),d=r(f),l=n(14),p=r(l),h={dispatchLogger:d.default,injectDispatch:p.default},g=new Map,m=a.default(),v=function(t,e){return g.has(t)||console.warn(">> GyreJS: Gyre factory '"+t+"' not registered."),g.get(t)(m,Object.assign({},{NS:t+"-"+Date.now()},e))},_=function(t,e){g.set(t,e)};_("local",i.default),_("smartRest",c.default),e.createGyre=v,e.middleWare=h,e.registerGyreFactory=_},function(e,n){e.exports=t},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(4),a=r(u),s=function(t,e){var n=arguments.length<=2||void 0===arguments[2]?function(){}:arguments[2],r=arguments.length<=3||void 0===arguments[3]?{}:arguments[3];return function(u,s){var i=a.default(u,s),o=function(e,n){return t(u,i.dispatch,e,n,s)},c=function(t){return u.setState(t,s.NS)},f=function(){return u.getState.get(s.NS)},d=e(o);return i.addActions(n(s)),c(r),{addAction:i.addAction,addActions:i.addActions,dispatch:i.dispatch,getState:f,getReducer:o,reactHoC:d,setState:c,use:i.use}}};e.default=s,t.exports=e.default},function(t,e){"use strict";e.__esModule=!0;var n=function(t){function e(t,r,u){var a,s,i,o,c,f,d,l,p,h,g,m,v;return regeneratorRuntime.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:a=Object.keys(t),s=Array.isArray(a),i=0,a=s?a:a[Symbol.iterator]();case 1:if(!s){n.next=7;break}if(!(i>=a.length)){n.next=4;break}return n.abrupt("break",36);case 4:o=a[i++],n.next=11;break;case 7:if(i=a.next(),!i.done){n.next=10;break}return n.abrupt("break",36);case 10:o=i.value;case 11:if(c=o,f=t[c],d=u?u.concat([c]):[c],l={name:r?r+"/"+c:c,branch:d,id:f.id?f.id:null,fields:f.fields?f.fields:null},!(l.fields||l.id&&!f.children)){n.next=18;break}return n.next=18,l;case 18:if(!f.children){n.next=34;break}p=Array.isArray(f.id)?f.id:[f.id],h=Array.isArray(p),g=0,p=h?p:p[Symbol.iterator]();case 20:if(!h){n.next=26;break}if(!(g>=p.length)){n.next=23;break}return n.abrupt("break",34);case 23:m=p[g++],n.next=30;break;case 26:if(g=p.next(),!g.done){n.next=29;break}return n.abrupt("break",34);case 29:m=g.value;case 30:return v=m,n.delegateYield(e(f.children,v?c+"/"+v:c,d),"t0",32);case 32:n.next=20;break;case 34:n.next=1;break;case 36:case"end":return n.stop()}},n[0],this)}for(var n=[e].map(regeneratorRuntime.mark),r=e(t),u=r.next(),a=[];!u.done;)a.push(u.value),u=r.next();return a},r=function(t){var e=n(t);return e.map(function(t){var e=t.name;return t.hasOwnProperty("id")&&null!==t.id&&(e=e+"/"+t.id),Array.isArray(t.fields)&&t.fields.length>0&&(e=e+"?fields="+t.fields.toString()),{path:e,type:t.branch[t.branch.length-1],root:t.name}})},u=function(t){return t.status>=200&&t.status<300?t.json().then(function(t){return{success:!0,data:t}}):new Promise(function(e){return e({success:!1,msg:t,code:t.status})})},a=function(t){return function(e){if(e.success){var n=function(){var n=Array.isArray(e.data)?e.data:[e.data],r={},u={};return r[t.get("root")]=[],u[t.get("type")]={},n.forEach(function(e){r[t.get("root")].push(e.id.toString()),u[t.get("type")][e.id.toString()]=e}),{v:{success:!0,data:u,idList:r}}}();if("object"==typeof n)return n.v}return e}},s=function(t,e){var n=t||location.protocol+"//"+location.hostname+(location.port?":"+location.port:"");return fetch(n+"/"+e.get("path")).then(u).then(a(e))},i=function(t){var e=t.length,n=0;if(0===t.length)return n;for(var r=0;e>r;r++){var u=t.charCodeAt(r);n=(n<<5)-n+u,n|=0}return n},o=function(t){return i(JSON.stringify(t))},c={createUrls:r,fetchUrl:s,hashQueryObject:o};e.default=c,t.exports=e.default},function(t,e){"use strict";e.__esModule=!0;var n=function(t,e){var n=new Map,r=[],u=function o(t){for(var u=arguments.length,a=Array(u>1?u-1:0),s=1;u>s;s++)a[s-1]=arguments[s];n.has(t)?r.reduce(function(n,r){return function(){return r(e.NS,t,a,n,o)}},function(){return n.get(t)(a)})():console.warn(">> GyreJS-'"+e.NS+"'-gyre: Unregistered action dispatched: '"+t+"' with arguments:",a,". (This is a no-op)")},a=function(r,u){return n.set(r,function(n){t.updateState(e.NS,u,n)})},s=function(t){Object.keys(t).forEach(function(e){a(e,t[e])})},i=function(t){r.unshift(t)};return{addAction:a,addActions:s,dispatch:u,use:i}};e.default=n,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(2),a=r(u),s=n(7),i=r(s),o=n(6),c=r(o);e.default=a.default(i.default,c.default),t.exports=e.default},function(t,e){"use strict";e.__esModule=!0;var n=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},r=function(t){return function(e,r){return React.createClass({displayName:"GyreJS-localHoC",getInitialState:function(){return{data:null}},componentWillMount:function(){this.unRegisterReducer=t(e,this.handleNewData)},shouldComponentUpdate:function(t){return this.state.data!==t.data},componentWillUnmount:function(){this.unRegisterReducer()},handleNewData:function(t){this.setState({data:t})},render:function(){return"undefined"!=typeof this.state.data?React.createElement(r,n({},this.props,this.state.data)):!1}})}};e.default=r,t.exports=e.default},function(t,e){"use strict";e.__esModule=!0;var n=function(t,e,n,r,u){var a=function(t){var e=t.get(u.NS),a=Array.isArray(n)?n:[n];r(e?a.reduce(function(t,n){return t[n]=e.get(n),t},{}):void 0)};return t.addReducer(a)};e.default=n,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(3),a=n(1),s=r(a),i=s.default.Map,o=s.default.List,c="COMPLETED",f="LOADING",d="UPDATING",l="ERROR",p={},h="ADD_QUERY",g="FETCH_QUERY",m="COMPLETE_QUERY",v="FAIL_QUERY",_="CREATE",y=i({status:null,count:0});e.default=function(t){var e=t.hostname;return p[h]=function(t,e,n,r){return t.reduce(function(t,a,s){return"queries"===s&&(t=t.set("queries",a.set(n,y.merge(a.get(n)).merge({hash:n,urls:u.createUrls(e)}).map(function(t,e){switch(e){case"count":return t+1;case"status":return t===c?d:t;default:return t}})).map(function(t,e){return e===n&&-1===[f,d].indexOf(t.get("status"))&&r(g,t),t.set("status",t.get("status")||f)}))),t},t)},p[g]=function(t,n,r){var a=n.get("urls").map(function(t){return u.fetchUrl(e,t)});Promise.all(a).then(function(t){var e=t.reduce(function(t,e){var n=e.success,r=e.msg;return n||(t.success=!1,t.msgList=t.msgList.push(r)),t},{success:!0,msgList:o([])});e.success?r(m,t,n):r(v,e.msgList,n)}).catch(function(t){r(v,[t],n)})},p[m]=function(t,e,n){return t.reduce(function(t,r,u){return"queries"===u&&(t=t.set("queries",r.map(function(t,r){var u=t;return r===n.get("hash")&&(u=u.merge({status:c,idList:e.reduce(function(t,e){return t.merge(e.idList)},i({}))})),u}))),"data"===u&&(t=t.set("data",e.reduce(function(t,e){return t.mergeDeep(e.data)},t.get("data")))),t},t)},p[v]=function(t,e,n){return t.reduce(function(t,r,u){return"queries"===u&&(t=t.set("queries",r.map(function(t,r){var u=t;return r===n.get("hash")&&(u=u.merge({status:l,msg:e})),u}))),t},t)},p[_]=function(t,e,n){return t.reduce(function(t,r,u){if("data"===u){var a=Date.now();t=t.setIn(["data",e,a],s.default.fromJS(n))}return t},t)},p},t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(2),a=r(u),s=n(11),i=r(s),o=n(10),c=r(o),f=n(8),d=r(f),l=n(12),p=r(l);e.default=a.default(i.default,c.default,d.default,p.default),t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},a=n(1),s=r(a),i=function(t){return function(e,n,r,a){return React.createClass({displayName:"GyreJS-localHoC",getInitialState:function(){return{data:null}},componentWillMount:function(){this.unRegisterReducer=t(e,this.handleNewData)},shouldComponentUpdate:function(t,e){return this.state.status!==e.status?!0:e.data?!s.default.is(e.data,this.state.data):!0},componentWillUnmount:function(){this.unRegisterReducer()},handleNewData:function(t,e){this.setState({data:e,status:t})},render:function(){if(!this.state||!this.state.status)return!1;var t=void 0;switch(this.state.status){case"LOADING":t=r;break;case"ERROR":t=a;break;default:t=n}return t?React.createElement(t,u({},this.props,this.state)):!1}})}};e.default=i,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(1),a=r(u),s=n(3),i=a.default.Map,o=function(t,e,n,r,u){var a=u.NS,o=s.hashQueryObject(n),c=function(t){var e=t.getIn([a,"queries",o,"idList"]),n=t.getIn([a,"queries",o]);e?r(n.get("status"),e.reduce(function(e,n,r){var u=e,s=r.split("/").reduce(function(t,e,n){return n%2===0&&n&&t.push("children"),t.push(e),t},[]),i=r.split("/");return i=i[i.length-1],n.forEach(function(e){u=u.mergeDeepIn(s.concat(e),t.getIn([a,"data",i,e]))}),u},i({}))):r(n.get("status"))};return e("ADD_QUERY",n,o),t.addReducer(c)};e.default=o,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(1),a=r(u),s=a.default.Map;e.default=s({queries:s({}),data:s({})}),t.exports=e.default},function(t,e){"use strict";e.__esModule=!0;var n=function(t,e,n,r){console.log(">> GyreJS-'"+t+"'-gyre: Applying action '"+e+"' with arguments: ",n),r()};e.default=n,t.exports=e.default},function(t,e){"use strict";e.__esModule=!0;var n=function(t,e,n,r,u){n.push(u),r()};e.default=n,t.exports=e.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}e.__esModule=!0;var u=n(1),a=r(u),s=a.default.Map,i=function(){var t=s({}),e=[],n=function(){return e.forEach(function(e){return e(t)})},r=function(t){return function(){return e=e.filter(function(e){return e!==t})}},u=function(e,r){return t.get(r)!==e&&(t=t.set(r,e),n()),t},a=function(n){return e.push(n),n(t),r(n)},i=function(){return t},o=function(t,e){return u(s.isMap(t)?t:s(t),e)},c=function(e,n,r){return u(n.apply(void 0,[t.get(e)].concat(r))||t.get(e),e),t};return{addReducer:a,getState:i,setState:o,updateState:c}};e.default=i,t.exports=e.default}])}); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("Immutable")):"function"==typeof define&&define.amd?define(["Immutable"],t):"object"==typeof exports?exports.GyreJS=t(require("Immutable")):e.GyreJS=t(e.Immutable)}(this,function(e){return function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={exports:{},id:n,loaded:!1};return e[n].call(u.exports,u,u.exports,t),u.loaded=!0,u.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var u=r(1),o=n(u),a=new Map,i=o.default(),f=function(e,t){a.has(e)||console.warn(">> GyreJS: Gyre factory '"+e+"' not registered.");var r=e+"-"+Date.now();return i.setState({data:{}},r),a.get(e)(i,Object.assign({},{NS:r},t))},c=function(e){return a.has(e)?a.delete(e)&&!0:(console.warn(">> GyreJS: Gyre factory '"+e+"' not registered."),!1)},s=function(e,t){a.set(e,t)};t.createGyre=f,t.destroyGyre=c,t.registerGyreFactory=s},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}t.__esModule=!0;var u=r(2),o=n(u),a=function(){var e=o.default.Map({}),t={},r=new Set,n=function(){r.forEach(function(r){return(t[r]||[]).forEach(function(t){return t("all"===r?e:e.get(r))})}),r.clear()},u=function(e){r.size||requestAnimationFrame(n),r.add("all").add(e)},a=function(e,r){return function(){return t[e]=t[e].filter(function(e){return e!==r})}},i=function(t,r){return e.get(r)!==t&&(e=e.set(r,t),u(r)),e},f=function(e){var r=arguments.length<=1||void 0===arguments[1]?"all":arguments[1];return t[r]||(t[r]=[]),t[r].push(e),u(r),a(r,e)},c=function(){return e},s=function(e,t){return i(o.default.Map.isMap(e)?e:o.default.Map(e),t)},d=function(t,r,n){return i(r.apply(void 0,[e.get(t)].concat(n))||e.get(t),t)};return{addFilter:f,getState:c,setState:s,updateState:d}};t.default=a,e.exports=t.default},function(t,r){t.exports=e}])}); |
@@ -18,3 +18,3 @@ /** | ||
/** | ||
* dispatch() | ||
* dispatch() Dispatch a registered action by ID. | ||
* | ||
@@ -37,6 +37,6 @@ * @param {String} id Id | ||
}, function () { | ||
return actionMap.get(id)(args); | ||
return actionMap.get(id)(args.push(dispatch) && args); | ||
})(); | ||
} else { | ||
console.warn(">> GyreJS-'" + options.NS + "'-gyre: Unregistered action dispatched: '" + id + "' with arguments:", args, ". (This is a no-op)"); | ||
console.warn(">> GyreJS-'" + options.NS + "'-gyre: Unregistered action dispatched: '" + id + "' with arguments:", args, ". (This is a no-op)"); // eslint-disable-line no-console | ||
} | ||
@@ -46,3 +46,3 @@ }; | ||
/** | ||
* addAction() | ||
* addAction() Add a single action. | ||
* | ||
@@ -55,4 +55,4 @@ * @param {String} id Action ID. | ||
var addAction = function addAction(id, func) { | ||
return actionMap.set(id, function (args) { | ||
store.updateState(options.NS, func, args); | ||
actionMap.set(id, function (args) { | ||
return store.updateState(options.NS, func, args); | ||
}); | ||
@@ -62,3 +62,3 @@ }; | ||
/** | ||
* addActions() | ||
* addActions() Add multiple actions. | ||
* | ||
@@ -76,3 +76,3 @@ * @param {Object} actions Key/func object of actions. | ||
/** | ||
* use() | ||
* use() Apply middleware. | ||
* | ||
@@ -79,0 +79,0 @@ * @param {Function} mware Middleware function. |
@@ -14,11 +14,14 @@ "use strict"; | ||
* | ||
* @param {Function} Reducer Reducer factory. | ||
* @param {Function} ReactHoC React HoC factory. | ||
* @param {Function} [actions] Default actions object. | ||
* @param {Function} filters Reducer factory. | ||
* @param {Immutable.Map|Object} [state] Initial state object. | ||
* @returns {Function} Gyre factory function. | ||
*/ | ||
var gyreFactory = function gyreFactory(Reducer, ReactHoC) { | ||
var actions = arguments.length <= 2 || arguments[2] === undefined ? function () {} : arguments[2]; | ||
var state = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3]; | ||
var gyreFactory = function gyreFactory(_ref) { | ||
var _ref$actions = _ref.actions; | ||
var actions = _ref$actions === undefined ? function () {} : _ref$actions; | ||
var _ref$filters = _ref.filters; | ||
var filters = _ref$filters === undefined ? {} : _ref$filters; | ||
var _ref$state = _ref.state; | ||
var state = _ref$state === undefined ? {} : _ref$state; | ||
return function (store, options) { | ||
@@ -30,10 +33,18 @@ // Private variables | ||
/** | ||
* getReducer() Getter for reducer | ||
* getFilter() Getter for reducer | ||
* | ||
* @param {String} matcher Matcher | ||
* @param {*} id Id | ||
* @param {Function} cb Callback | ||
* @returns {Function} Reducer factory | ||
* @param {Array} [args] Remaining arguments. | ||
* @returns {Function|void} Filter factory | ||
*/ | ||
var getReducer = function getReducer(matcher, cb) { | ||
return Reducer(store, AH.dispatch, matcher, cb, options); | ||
var getFilter = function getFilter(id, cb) { | ||
for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { | ||
args[_key - 2] = arguments[_key]; | ||
} | ||
if (Object.prototype.hasOwnProperty.call(filters, id)) { | ||
return filters[id].apply(filters, [store, AH.dispatch, cb, options].concat(args)); | ||
} | ||
console.warn(">> GyreJS-'" + options.NS + "'-gyre: Unregistered filter requested: '" + id + "' with arguments:", args, "."); // eslint-disable-line no-console | ||
}; | ||
@@ -57,13 +68,5 @@ | ||
var getState = function getState() { | ||
return store.getState.get(options.NS); | ||
return store.getState().get(options.NS); | ||
}; | ||
/** | ||
* reactHoC() | ||
* | ||
* @param {Object} react React instance. | ||
* @return {Function} HoC factory function. | ||
*/ | ||
var reactHoC = ReactHoC(getReducer); | ||
// Setup | ||
@@ -79,4 +82,4 @@ AH.addActions(actions(options)); | ||
getState: getState, | ||
getReducer: getReducer, | ||
reactHoC: reactHoC, | ||
getFilter: getFilter, | ||
nameSpace: options.NS, | ||
setState: setState, | ||
@@ -83,0 +86,0 @@ use: AH.use |
@@ -12,25 +12,2 @@ // Import sub libraries | ||
var _gyresLocalFactory = require("./gyres/local/factory"); | ||
var _gyresLocalFactory2 = _interopRequireDefault(_gyresLocalFactory); | ||
var _gyresSmartRestFactory = require("./gyres/smartRest/factory"); | ||
var _gyresSmartRestFactory2 = _interopRequireDefault(_gyresSmartRestFactory); | ||
// Middleware | ||
var _middleWareDispatchLogger = require("./middleWare/dispatchLogger"); | ||
var _middleWareDispatchLogger2 = _interopRequireDefault(_middleWareDispatchLogger); | ||
var _middleWareInjectDispatch = require("./middleWare/injectDispatch"); | ||
var _middleWareInjectDispatch2 = _interopRequireDefault(_middleWareInjectDispatch); | ||
var middleWare = { | ||
dispatchLogger: _middleWareDispatchLogger2["default"], | ||
injectDispatch: _middleWareInjectDispatch2["default"] | ||
}; | ||
// Private variables | ||
@@ -50,9 +27,27 @@ var gyres = new Map(); | ||
if (!gyres.has(id)) { | ||
console.warn(">> GyreJS: Gyre factory '" + id + "' not registered."); | ||
console.warn(">> GyreJS: Gyre factory '" + id + "' not registered."); // eslint-disable-line no-console | ||
} | ||
var newNameSpace = id + "-" + Date.now(); | ||
store.setState({ | ||
data: {} | ||
}, newNameSpace); | ||
return gyres.get(id)(store, Object.assign({}, { NS: id + "-" + Date.now() }, options)); | ||
return gyres.get(id)(store, Object.assign({}, { NS: newNameSpace }, options)); | ||
}; | ||
/** | ||
* destroyGyre() | ||
* | ||
* @param {String} id Id of a registered gyre factory. | ||
* @returns {Object|boolean} Gyre instance. | ||
*/ | ||
var destroyGyre = function destroyGyre(id) { | ||
if (!gyres.has(id)) { | ||
console.warn(">> GyreJS: Gyre factory '" + id + "' not registered."); // eslint-disable-line no-console | ||
return false; | ||
} | ||
return gyres["delete"](id) && true; | ||
}; | ||
/** | ||
* registerGyreFactory() | ||
@@ -68,8 +63,4 @@ * | ||
// Register standard gyres | ||
registerGyreFactory("local", _gyresLocalFactory2["default"]); | ||
registerGyreFactory("smartRest", _gyresSmartRestFactory2["default"]); | ||
exports.createGyre = createGyre; | ||
exports.middleWare = middleWare; | ||
exports.destroyGyre = destroyGyre; | ||
exports.registerGyreFactory = registerGyreFactory; |
@@ -11,13 +11,12 @@ "use strict"; | ||
var IMap = _immutable2["default"].Map; | ||
/** | ||
* Store() Factory function | ||
* | ||
* @returns {{addReducer: Function, getState: Function, setState: Function, updateState: Function}} API | ||
* @returns {{addFilter: Function, getState: Function, setState: Function, updateState: Function}} API | ||
*/ | ||
var store = function store() { | ||
// Private variables | ||
var state = IMap({}); | ||
var reducerList = []; | ||
var state = _immutable2["default"].Map({}); | ||
var filterList = {}; | ||
var updateQueue = new Set(); | ||
@@ -31,18 +30,35 @@ // Private functions | ||
var sendUpdate = function sendUpdate() { | ||
return reducerList.forEach(function (reducer) { | ||
return reducer(state); | ||
updateQueue.forEach(function (ns) { | ||
return (filterList[ns] || []).forEach(function (filter) { | ||
return filter(ns === "all" ? state : state.get(ns)); | ||
}); | ||
}); | ||
updateQueue.clear(); | ||
}; | ||
/** | ||
* removeReducer() - Factory | ||
* Remove reducer from the store | ||
* Request to issue update to filters of a given namespace. | ||
* | ||
* @param {Function} cb Reducer callback. | ||
* @param {String} ns Namespace. | ||
* @returns {void} | ||
*/ | ||
var requestUpdate = function requestUpdate(ns) { | ||
if (!updateQueue.size) { | ||
requestAnimationFrame(sendUpdate); | ||
} | ||
updateQueue.add("all").add(ns); | ||
}; | ||
/** | ||
* removeFilter() - Factory | ||
* Remove filter from the store | ||
* | ||
* @param {String} ns Namespace. | ||
* @param {Function} cb Filter callback. | ||
* @returns {Function} removal function. | ||
*/ | ||
var removeReducer = function removeReducer(cb) { | ||
var removeFilter = function removeFilter(ns, cb) { | ||
return function () { | ||
return reducerList = reducerList.filter(function (reducer) { | ||
return reducer !== cb; | ||
return filterList[ns] = filterList[ns].filter(function (filter) { | ||
return filter !== cb; | ||
}); | ||
@@ -57,9 +73,9 @@ }; | ||
* @param {Immutable.Map} newState New state. | ||
* @param {String} nameSpace Namespace. | ||
* @param {String} ns Namespace. | ||
* @returns {Immutable.Map} state Current state | ||
*/ | ||
var setNewState = function setNewState(newState, nameSpace) { | ||
if (state.get(nameSpace) !== newState) { | ||
state = state.set(nameSpace, newState); | ||
sendUpdate(); | ||
var setNewState = function setNewState(newState, ns) { | ||
if (state.get(ns) !== newState) { | ||
state = state.set(ns, newState); | ||
requestUpdate(ns); | ||
} | ||
@@ -71,16 +87,23 @@ return state; | ||
/** | ||
* Register a faucet with the store and send initial data. | ||
* addFilter() Register a faucet with the store and send initial data. | ||
* | ||
* @param {Function} cb callback. | ||
* @param {String} [ns] Namespace. | ||
* @returns {Function} un-register function. | ||
*/ | ||
var addReducer = function addReducer(cb) { | ||
var addFilter = function addFilter(cb) { | ||
var ns = arguments.length <= 1 || arguments[1] === undefined ? "all" : arguments[1]; | ||
if (!filterList[ns]) { | ||
filterList[ns] = []; | ||
} | ||
// Save to local register | ||
reducerList.push(cb); | ||
filterList[ns].push(cb); | ||
// Send state to reducer | ||
cb(state); | ||
// Request update to make sure the new filter gets data asap. | ||
requestUpdate(ns); | ||
// Return remover | ||
return removeReducer(cb); | ||
return removeFilter(ns, cb); | ||
}; | ||
@@ -100,8 +123,8 @@ | ||
* | ||
* @param {Immutable.Map|Object} nState State. | ||
* @param {String} [nameSpace] Namespace. | ||
* @param {Immutable.Map|Object} newState State. | ||
* @param {String} ns Namespace. | ||
* @returns {Immutable.Map} New state. | ||
*/ | ||
var setState = function setState(nState, nameSpace) { | ||
return setNewState(IMap.isMap(nState) ? nState : IMap(nState), nameSpace); | ||
var setState = function setState(newState, ns) { | ||
return setNewState(_immutable2["default"].Map.isMap(newState) ? newState : _immutable2["default"].Map(newState), ns); | ||
}; | ||
@@ -113,3 +136,3 @@ | ||
* | ||
* @param {String} nameSpace Namespace. | ||
* @param {String} ns Namespace. | ||
* @param {Function} func Reducer function. | ||
@@ -119,5 +142,4 @@ * @param {Array} args Reducer function arguments. | ||
*/ | ||
var updateState = function updateState(nameSpace, func, args) { | ||
setNewState(func.apply(undefined, [state.get(nameSpace)].concat(args)) || state.get(nameSpace), nameSpace); | ||
return state; | ||
var updateState = function updateState(ns, func, args) { | ||
return setNewState(func.apply(undefined, [state.get(ns)].concat(args)) || state.get(ns), ns); | ||
}; | ||
@@ -127,3 +149,3 @@ | ||
return { | ||
addReducer: addReducer, | ||
addFilter: addFilter, | ||
getState: getState, | ||
@@ -130,0 +152,0 @@ setState: setState, |
{ | ||
"name": "gyrejs", | ||
"version": "0.0.14", | ||
"version": "0.0.15", | ||
"description": "Experimental data fetching and state library geared towards ReactJS", | ||
@@ -50,2 +50,3 @@ "main": "lib/gyrejs-min.js", | ||
"isomorphic-fetch": "^2.1.1", | ||
"raf": "^3.1.0", | ||
"react": "0.14.0", | ||
@@ -52,0 +53,0 @@ "react-dom": "^0.14.0", |
# GyreJS | ||
[](https://travis-ci.org/WRidder/gyrejs) | ||
Data fetching and state library geared towards ReactJS. This is an experimental project. | ||
Data fetching and state library. This is an experimental project. | ||
@@ -31,5 +31,3 @@ ## Vision | ||
- Minimal surface API | ||
- HoC for ReactJS (data wrapper) | ||
- Isomorphic | ||
- Snapshots / rollback | ||
- Immutable data | ||
@@ -36,0 +34,0 @@ |
@@ -15,3 +15,3 @@ /** | ||
/** | ||
* dispatch() | ||
* dispatch() Dispatch a registered action by ID. | ||
* | ||
@@ -27,7 +27,6 @@ * @param {String} id Id | ||
() => next(options.NS, id, args, prev, dispatch), | ||
() => actionMap.get(id)(args))(); | ||
() => actionMap.get(id)(args.push(dispatch) && args))(); | ||
} | ||
else { | ||
console.warn(`>> GyreJS-'${options.NS}'-gyre: Unregistered action dispatched: '${id}' with arguments:`, | ||
args, ". (This is a no-op)"); | ||
console.warn(`>> GyreJS-'${options.NS}'-gyre: Unregistered action dispatched: '${id}' with arguments:`, args, ". (This is a no-op)"); // eslint-disable-line no-console | ||
} | ||
@@ -37,3 +36,3 @@ }; | ||
/** | ||
* addAction() | ||
* addAction() Add a single action. | ||
* | ||
@@ -45,9 +44,10 @@ * @param {String} id Action ID. | ||
*/ | ||
const addAction = (id, func) => | ||
actionMap.set(id, (args) => { | ||
store.updateState(options.NS, func, args); | ||
}); | ||
const addAction = (id, func) => { | ||
actionMap.set(id, (args) => | ||
store.updateState(options.NS, func, args) | ||
); | ||
}; | ||
/** | ||
* addActions() | ||
* addActions() Add multiple actions. | ||
* | ||
@@ -65,3 +65,3 @@ * @param {Object} actions Key/func object of actions. | ||
/** | ||
* use() | ||
* use() Apply middleware. | ||
* | ||
@@ -68,0 +68,0 @@ * @param {Function} mware Middleware function. |
@@ -6,9 +6,8 @@ import ActionHandler from "./actionHandler"; | ||
* | ||
* @param {Function} Reducer Reducer factory. | ||
* @param {Function} ReactHoC React HoC factory. | ||
* @param {Function} [actions] Default actions object. | ||
* @param {Function} filters Reducer factory. | ||
* @param {Immutable.Map|Object} [state] Initial state object. | ||
* @returns {Function} Gyre factory function. | ||
*/ | ||
const gyreFactory = (Reducer, ReactHoC, actions = () => {}, state = {}) => | ||
const gyreFactory = ({actions = () => {}, filters = {}, state = {}}) => | ||
(store, options) => { | ||
@@ -20,11 +19,17 @@ // Private variables | ||
/** | ||
* getReducer() Getter for reducer | ||
* getFilter() Getter for reducer | ||
* | ||
* @param {String} matcher Matcher | ||
* @param {*} id Id | ||
* @param {Function} cb Callback | ||
* @returns {Function} Reducer factory | ||
* @param {Array} [args] Remaining arguments. | ||
* @returns {Function|void} Filter factory | ||
*/ | ||
const getReducer = (matcher, cb) => | ||
Reducer(store, AH.dispatch, matcher, cb, options); | ||
const getFilter = (id, cb, ...args) => { | ||
if (Object.prototype.hasOwnProperty.call(filters, id)) { | ||
return filters[id](store, AH.dispatch, cb, options, ...args); | ||
} | ||
console.warn(`>> GyreJS-'${options.NS}'-gyre: Unregistered filter requested: '${id}' with arguments:`, args, "."); // eslint-disable-line no-console | ||
}; | ||
/** | ||
@@ -45,12 +50,4 @@ * setState() | ||
const getState = () => | ||
store.getState.get(options.NS); | ||
store.getState().get(options.NS); | ||
/** | ||
* reactHoC() | ||
* | ||
* @param {Object} react React instance. | ||
* @return {Function} HoC factory function. | ||
*/ | ||
const reactHoC = ReactHoC(getReducer); | ||
// Setup | ||
@@ -66,4 +63,4 @@ AH.addActions(actions(options)); | ||
getState, | ||
getReducer, | ||
reactHoC, | ||
getFilter, | ||
nameSpace: options.NS, | ||
setState, | ||
@@ -70,0 +67,0 @@ use: AH.use |
// Import sub libraries | ||
import Store from "./store"; | ||
import LocalGyre from "./gyres/local/factory"; | ||
import SmartRestGyre from "./gyres/smartRest/factory"; | ||
// Middleware | ||
import dispatchLogger from "./middleWare/dispatchLogger"; | ||
import injectDispatch from "./middleWare/injectDispatch"; | ||
const middleWare = { | ||
dispatchLogger, | ||
injectDispatch | ||
}; | ||
// Private variables | ||
@@ -28,9 +18,27 @@ const gyres = new Map(); | ||
if (!gyres.has(id)) { | ||
console.warn(`>> GyreJS: Gyre factory '${id}' not registered.`); | ||
console.warn(`>> GyreJS: Gyre factory '${id}' not registered.`); // eslint-disable-line no-console | ||
} | ||
const newNameSpace = `${id}-${Date.now()}`; | ||
store.setState({ | ||
data: {} | ||
}, newNameSpace); | ||
return gyres.get(id)(store, Object.assign({}, {NS: `${id}-${Date.now()}`}, options)); | ||
return gyres.get(id)(store, Object.assign({}, {NS: newNameSpace}, options)); | ||
}; | ||
/** | ||
* destroyGyre() | ||
* | ||
* @param {String} id Id of a registered gyre factory. | ||
* @returns {Object|boolean} Gyre instance. | ||
*/ | ||
const destroyGyre = (id) => { | ||
if (!gyres.has(id)) { | ||
console.warn(`>> GyreJS: Gyre factory '${id}' not registered.`); // eslint-disable-line no-console | ||
return false; | ||
} | ||
return gyres.delete(id) && true; | ||
}; | ||
/** | ||
* registerGyreFactory() | ||
@@ -46,10 +54,6 @@ * | ||
// Register standard gyres | ||
registerGyreFactory("local", LocalGyre); | ||
registerGyreFactory("smartRest", SmartRestGyre); | ||
export { | ||
createGyre, | ||
middleWare, | ||
destroyGyre, | ||
registerGyreFactory | ||
}; |
import Immutable from "immutable"; | ||
const IMap = Immutable.Map; | ||
@@ -7,8 +6,9 @@ /** | ||
* | ||
* @returns {{addReducer: Function, getState: Function, setState: Function, updateState: Function}} API | ||
* @returns {{addFilter: Function, getState: Function, setState: Function, updateState: Function}} API | ||
*/ | ||
const store = () => { | ||
// Private variables | ||
let state = IMap({}); | ||
let reducerList = []; | ||
let state = Immutable.Map({}); | ||
const filterList = {}; | ||
const updateQueue = new Set(); | ||
@@ -21,15 +21,35 @@ // Private functions | ||
*/ | ||
const sendUpdate = () => | ||
reducerList.forEach(reducer => reducer(state)); | ||
const sendUpdate = () => { | ||
updateQueue.forEach(ns => | ||
(filterList[ns] || []).forEach(filter => | ||
filter(ns === "all" ? state : state.get(ns))) | ||
); | ||
updateQueue.clear(); | ||
}; | ||
/** | ||
* removeReducer() - Factory | ||
* Remove reducer from the store | ||
* Request to issue update to filters of a given namespace. | ||
* | ||
* @param {Function} cb Reducer callback. | ||
* @param {String} ns Namespace. | ||
* @returns {void} | ||
*/ | ||
const requestUpdate = (ns) => { | ||
if (!updateQueue.size) { | ||
requestAnimationFrame(sendUpdate); | ||
} | ||
updateQueue.add("all").add(ns); | ||
}; | ||
/** | ||
* removeFilter() - Factory | ||
* Remove filter from the store | ||
* | ||
* @param {String} ns Namespace. | ||
* @param {Function} cb Filter callback. | ||
* @returns {Function} removal function. | ||
*/ | ||
const removeReducer = (cb) => | ||
const removeFilter = (ns, cb) => | ||
() => | ||
reducerList = reducerList.filter(reducer => reducer !== cb); | ||
filterList[ns] = filterList[ns] | ||
.filter(filter => filter !== cb); | ||
@@ -41,9 +61,9 @@ /** | ||
* @param {Immutable.Map} newState New state. | ||
* @param {String} nameSpace Namespace. | ||
* @param {String} ns Namespace. | ||
* @returns {Immutable.Map} state Current state | ||
*/ | ||
const setNewState = (newState, nameSpace) => { | ||
if (state.get(nameSpace) !== newState) { | ||
state = state.set(nameSpace, newState); | ||
sendUpdate(); | ||
const setNewState = (newState, ns) => { | ||
if (state.get(ns) !== newState) { | ||
state = state.set(ns, newState); | ||
requestUpdate(ns); | ||
} | ||
@@ -55,16 +75,21 @@ return state; | ||
/** | ||
* Register a faucet with the store and send initial data. | ||
* addFilter() Register a faucet with the store and send initial data. | ||
* | ||
* @param {Function} cb callback. | ||
* @param {String} [ns] Namespace. | ||
* @returns {Function} un-register function. | ||
*/ | ||
const addReducer = (cb) => { | ||
const addFilter = (cb, ns = "all") => { | ||
if (!filterList[ns]) { | ||
filterList[ns] = []; | ||
} | ||
// Save to local register | ||
reducerList.push(cb); | ||
filterList[ns].push(cb); | ||
// Send state to reducer | ||
cb(state); | ||
// Request update to make sure the new filter gets data asap. | ||
requestUpdate(ns); | ||
// Return remover | ||
return removeReducer(cb); | ||
return removeFilter(ns, cb); | ||
}; | ||
@@ -82,8 +107,11 @@ | ||
* | ||
* @param {Immutable.Map|Object} nState State. | ||
* @param {String} [nameSpace] Namespace. | ||
* @param {Immutable.Map|Object} newState State. | ||
* @param {String} ns Namespace. | ||
* @returns {Immutable.Map} New state. | ||
*/ | ||
const setState = (nState, nameSpace) => | ||
setNewState(IMap.isMap(nState) ? nState : IMap(nState), nameSpace); | ||
const setState = (newState, ns) => | ||
setNewState(Immutable.Map.isMap(newState) ? | ||
newState : | ||
Immutable.Map(newState), | ||
ns); | ||
@@ -94,3 +122,3 @@ /** | ||
* | ||
* @param {String} nameSpace Namespace. | ||
* @param {String} ns Namespace. | ||
* @param {Function} func Reducer function. | ||
@@ -100,10 +128,8 @@ * @param {Array} args Reducer function arguments. | ||
*/ | ||
const updateState = (nameSpace, func, args) => { | ||
setNewState(func(...[state.get(nameSpace)].concat(args)) || state.get(nameSpace), nameSpace); | ||
return state; | ||
}; | ||
const updateState = (ns, func, args) => | ||
setNewState(func(...[state.get(ns)].concat(args)) || state.get(ns), ns); | ||
// API | ||
return { | ||
addReducer, | ||
addFilter, | ||
getState, | ||
@@ -110,0 +136,0 @@ setState, |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
1
-75%42084
-71.23%16
6.67%18
-57.14%879
-72.05%49
-3.92%