UNPKG

react-diode

Version:

Endpoint agnostic, unidirectional data fetching for React applications

1 lines 43.5 kB
{"version":3,"file":"DiodePublic.mjs","sources":["../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../src/network/DiodeNetworkLayer.js","../src/query/DiodeRootQuery.js","../src/query/DiodeQueryTypes.js","../src/query/resolveQueryResponse.js","../src/query/createBatchQueryRequest.js","../src/cache/DiodeCacheConstant.js","../src/store/DiodeStore.js","../src/container/resolveContainerProps.js","../src/cache/DiodeCache.js","../src/query/DiodeContainerQuery.js","../src/DiodePublic.js"],"sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = (function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tvalue = Promise.resolve(value);\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn Promise.resolve(value).then(_empty);\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof Symbol !== \"undefined\") {\n\t\tvar iteratorSymbol = Symbol.iterator;\n\t\tif (iteratorSymbol && (iteratorSymbol in target)) {\n\t\t\tvar iterator = target[iteratorSymbol](), step, pact, reject;\n\t\t\tfunction _cycle(result) {\n\t\t\t\ttry {\n\t\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (pact) {\n\t\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpact = result;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(pact || (pact = new Pact()), 2, e);\n\t\t\t\t}\n\t\t\t}\n\t\t\t_cycle();\n\t\t\tif (iterator.return) {\n\t\t\t\tvar _fixup = function(value) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\t\titerator.return();\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\tif (pact && pact.then) {\n\t\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t_fixup();\n\t\t\t}\n\t\t\treturn pact;\n\t\t}\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"value is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof Symbol !== \"undefined\") {\n\t\tvar asyncIteratorSymbol = Symbol.asyncIterator;\n\t\tif (asyncIteratorSymbol && (asyncIteratorSymbol in target)) {\n\t\t\tvar pact = new _Pact();\n\t\t\tvar reject = _settle.bind(null, pact, 2);\n\t\t\tvar iterator = target[asyncIteratorSymbol]();\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, reject);\n\t\t\treturn pact;\n\t\t\tfunction _resumeAfterBody(result) {\n\t\t\t\tif (check && !check()) {\n\t\t\t\t\treturn _settle(pact, 1, result);\n\t\t\t\t}\n\t\t\t\titerator.next().then(_resumeAfterNext).then(void 0, reject);\n\t\t\t}\n\t\t\tfunction _resumeAfterNext(step) {\n\t\t\t\tif (step.done) {\n\t\t\t\t\t_settle(pact, 1);\n\t\t\t\t} else {\n\t\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, value);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n","/**\n * @flow\n */\nimport objectAssign from \"object-assign\";\nimport type { DiodeQueryRequest } from \"../query/DiodeQueryRequest\";\nimport type { NetworkLayer, QueryMockResolver } from \"../tools/DiodeTypes\";\n\nclass DiodeNetworkLayer {\n _injectedNetworkLayer: NetworkLayer;\n\n _queryMockEnabled: boolean;\n\n constructor() {\n this._queryMockEnabled = false;\n }\n\n /**\n * @internal\n *\n * Supply your own network layer\n */\n injectNetworkLayer(networkLayer: NetworkLayer): void {\n this._injectedNetworkLayer = networkLayer;\n }\n\n injectQueryMockResolver(queryMockResolver: QueryMockResolver): void {\n this._queryMockEnabled = true;\n this._queryMockResolver = queryMockResolver;\n }\n\n /**\n * @internal\n *\n * Send diode query via injected network layer\n */\n sendQueries(queries: Array<DiodeQueryRequest>, options: any): Promise {\n let queryRequests = queries;\n const mockedQueryResponse = {};\n const networkLayer = this._getCurrentNetworkLayer();\n\n if (this._queryMockEnabled) {\n queryRequests = queries.filter(query => {\n // check whether a query as a mocked response\n const queryMockResolver = this._queryMockResolver[query.type];\n if (queryMockResolver && typeof queryMockResolver === \"function\") {\n const mockedResponse = queryMockResolver(query);\n if (mockedResponse) {\n mockedQueryResponse[query.type] = mockedResponse;\n return false;\n }\n {\n return true;\n }\n } else {\n return true;\n }\n });\n }\n\n return networkLayer.sendQueries(queryRequests, options).then(response => {\n return objectAssign(mockedQueryResponse, response);\n });\n }\n\n _getCurrentNetworkLayer(): NetworkLayer {\n return this._injectedNetworkLayer;\n }\n}\n\nexport default DiodeNetworkLayer;\n","/**\n * @flow\n */\nimport mergeWith from \"lodash.mergewith\";\nimport type DiodeContainerQuery from \"./DiodeContainerQuery\";\nimport type { DiodeQuery, Variables } from \"../tools/DiodeTypes\";\n\n/**\n * Represent complete query in Diode.RootContainer\n *\n */\nclass DiodeRootQuery {\n _variables: Variables = {};\n _containerQuery: DiodeContainerQuery;\n\n constructor(containerQuery: DiodeContainerQuery) {\n this._containerQuery = containerQuery;\n }\n\n /**\n * @internal\n *\n */\n getContainerQuery(): DiodeContainerQuery {\n return this._containerQuery;\n }\n\n /**\n * @public\n *\n */\n setVariables(variables: Variables): void {\n mergeWith(this._variables, variables);\n }\n\n /**\n * @public\n *\n */\n getVariables(): Variables {\n return this._variables;\n }\n\n /**\n * @public\n *\n * Compile query map into an array of actionable query and apply fragment\n * values from .setVariables() method (if any)\n */\n compile(): Array<DiodeQuery> {\n const queryTypeMap = this._containerQuery.getQueryTypeMap();\n\n return Object.keys(queryTypeMap).map(queryType => {\n const query = queryTypeMap[queryType];\n query.fragment = this._compileFragmentKeys(query.fragmentStructure);\n query.params = this._compileFragmentKeys(query.paramsStructure);\n return query;\n });\n }\n\n /**\n * Iterate over fragment structure keys and compile the value.\n * If an object is found, recursively iterate the object keys\n */\n _compileFragmentKeys(rawFragment: any): any {\n return Object.keys(rawFragment).reduce((fragment, key) => {\n const parsedKey = this._compileFragmentValue(key);\n\n // typeof null === 'object'\n if (typeof rawFragment[key] === \"object\" && rawFragment[key] !== null) {\n fragment[parsedKey] = this._compileFragmentKeys(rawFragment[key]);\n } else {\n fragment[parsedKey] = this._compileFragmentValue(rawFragment[key]);\n }\n\n return fragment;\n }, {});\n }\n\n /**\n * Replace value format with actual value from stored value map\n */\n _compileFragmentValue(rawFragment: any): any {\n if (typeof rawFragment === \"string\" && rawFragment.charAt(0) === \"$\") {\n const key = rawFragment.slice(1);\n const value = this._variables[key];\n\n // If value not found from value map, return as is.\n // Do not use boolean coercion here as it's possible we have\n // falsy value like 0 and ''\n if (typeof value === \"undefined\" || value === null) {\n return rawFragment;\n }\n\n return value;\n }\n\n return rawFragment;\n }\n}\n\nexport default DiodeRootQuery;\n","const DiodeQueryTypes = {\n BATCH: \"batch-query\"\n};\n\nexport default DiodeQueryTypes;\n","import find from \"lodash.find\";\nimport DiodeQueryTypes from \"./DiodeQueryTypes\";\nimport resolveBatchQuery from \"./resolveBatchQuery\";\n\n/*\n Possible Errors:\n 1. Injected network layer did not properly map query type and response \n (different type specified in query)\n*/\nexport default function resolveQueryResponse(\n queries,\n initialQueries,\n queryResponseMap,\n options\n) {\n return Object.keys(queryResponseMap).reduce((map, type) => {\n try {\n const queryResponse = queryResponseMap[type];\n const query = find(queries, { type });\n\n if (type === DiodeQueryTypes.BATCH) {\n // BatchQuery returns multiple response at once as single object,\n // we need to merge initial response with response generated by\n // batch query response resolution\n const batchQueryResponseMap = resolveBatchQuery(\n query.resolve(queryResponse, options),\n initialQueries,\n options\n );\n Object.assign(map, batchQueryResponseMap);\n } else {\n map[type] = query.resolve(queryResponse, query.fragment, options);\n }\n\n return map;\n } catch (err) {\n throw new Error(\n `Query type ${type} from network layer does not match any query types specified in Diode queries.`\n );\n }\n }, {});\n}\n","/**\n * @flow\n */\nimport type { BatchQueryDefinition } from \"../tools/DiodeTypes\";\nimport type { DiodeQueryRequest } from \"./DiodeQueryRequest\";\n\nexport default function createBatchQueryRequest(\n query: BatchQueryDefinition,\n queryList: Array<DiodeQueryRequest>,\n options: any\n): DiodeQueryRequest {\n const { resolve, type } = query;\n\n return {\n type,\n resolve,\n ...query.request(queryList, options)\n };\n}\n","export const FETCH_ALL_CACHE = \"__fac__\";\n","/**\n * @flow\n */\nimport mergeWith from \"lodash.mergewith\";\nimport resolveContainerProps from \"../container/resolveContainerProps\";\nimport DiodeNetworkLayer from \"../network/DiodeNetworkLayer\";\nimport DiodeRootQuery from \"../query/DiodeRootQuery\";\nimport resolvePendingQueries from \"../query/resolvePendingQueries\";\nimport resolveQueryResponse from \"../query/resolveQueryResponse\";\nimport { filterBatchQuery } from \"../query/filterBatchQuery\";\nimport {\n getQueryRequests,\n generateQueryRequest\n} from \"../query/DiodeQueryRequest\";\nimport { FETCH_ALL_CACHE } from \"../cache/DiodeCacheConstant\";\n\nimport type { DiodeRootContainer } from \"../container/DiodeRootContainer\";\nimport type {\n BatchQueryDefinition,\n NetworkLayer,\n // TODO Annotate QueryMockResolver in DiodeTypes\n QueryMockResolver\n} from \"../tools/DiodeTypes\";\nimport type { DiodeQueryRequest } from \"../query/DiodeQueryRequest\";\n\nfunction markFetchAllCache(response, queries) {\n // mark special fetch-all case so our cache is aware\n queries.forEach(query => {\n try {\n Object.keys(query.fragment).forEach(fragmentKey => {\n const fragmentResponse = response[query.type][fragmentKey];\n if (\n Object.keys(query.fragment[fragmentKey]).length === 0 &&\n fragmentResponse\n ) {\n if (Array.isArray(response[query.type][FETCH_ALL_CACHE]) === false) {\n response[query.type][FETCH_ALL_CACHE] = [];\n }\n\n response[query.type][FETCH_ALL_CACHE].push(fragmentKey);\n }\n });\n } catch (err) {}\n });\n\n return response;\n}\n\nclass DiodeStore {\n _networkLayer: DiodeNetworkLayer;\n\n _batchQueryEnabled: boolean;\n\n _batchQuery: BatchQueryDefinition;\n\n constructor() {\n this._batchQueriesEnabled = false;\n this._networkLayer = new DiodeNetworkLayer();\n }\n\n /**\n * @public\n */\n injectNetworkLayer(networkLayer: NetworkLayer): void {\n this._networkLayer.injectNetworkLayer(networkLayer);\n }\n\n /**\n * @public\n */\n useMockQueries(queryMockResolver: QueryMockResolver): void {\n this._networkLayer.injectQueryMockResolver(queryMockResolver);\n }\n\n /**\n * @public\n */\n useBatchQuery(batchQuery: BatchQueryDefinition): void {\n /* istanbul ignore else */\n if (batchQuery) {\n this._batchQueryEnabled = true;\n this._batchQuery = batchQuery;\n }\n }\n\n /**\n * @public\n *\n * Send queries via network layer bypassing internal cache. Note that the\n * server may respond with 304 status but it's not actually an internal\n * cached response\n */\n forceFetch(RootContainer: DiodeRootContainer, options: any): Promise {\n const queries = getQueryRequests(RootContainer, options);\n return this._fetchQueries(queries, options).then(response => {\n const result = resolveContainerProps(response, RootContainer);\n return markFetchAllCache(result, queries);\n });\n }\n\n /**\n * @private\n *\n * Remove fragments that have already been cached from query; cached fragments\n * should not be fetched. Returned fragment are fragments that are required but\n * have not been fetched.\n */\n filterCachedFragments(query) {\n const cache = this.cache[query.type];\n\n if (!cache) {\n return query;\n }\n\n const filteredFragments = {};\n Object.keys(query.fragment).forEach(fragmentKey => {\n const cachedFragment = cache[fragmentKey];\n const innerFragment = query.fragment[fragmentKey];\n\n if (!innerFragment) {\n return;\n }\n\n const innerFragmentKeys = Object.keys(innerFragment);\n\n if (innerFragmentKeys.length === 0) {\n // If fragment is already cached and all data in the fragment is\n // already fetched, remove all fragments. Otherwise, fetch all\n // fragments.\n if (\n Array.isArray(cache[FETCH_ALL_CACHE]) &&\n cache[FETCH_ALL_CACHE].includes(fragmentKey)\n ) {\n return;\n }\n\n filteredFragments[fragmentKey] = {};\n return;\n }\n\n // this query type might be partially cached\n // check specific fragment\n filteredFragments[fragmentKey] = {};\n innerFragmentKeys.forEach(innerKey => {\n if (cachedFragment && cachedFragment[innerKey]) {\n return;\n }\n\n filteredFragments[fragmentKey][innerKey] = innerFragment[innerKey];\n });\n });\n\n return {\n ...query,\n fragment: filteredFragments\n };\n }\n\n async fetch(rawQuery, options) {\n const rootQuery = new DiodeRootQuery(rawQuery);\n const queries = rootQuery\n .compile()\n .map(query => {\n const { fragment, params } = this.filterCachedFragments(query);\n if (Object.keys(fragment).length === 0) {\n return null;\n }\n\n const queryRequestInfo = query.request(fragment, params, options);\n return generateQueryRequest(query, queryRequestInfo);\n })\n .filter(Boolean);\n\n const response = await this._fetchQueries(queries, options);\n // customizer function is required. Otherwise, __fac__ array in cache will be\n // replaced, not concat when updating cache\n mergeWith(\n this.cache,\n markFetchAllCache(response, queries),\n function customizer(objValue, srcValue) {\n if (Array.isArray(objValue)) {\n return objValue.concat(srcValue);\n }\n }\n );\n }\n\n /**\n * Recursively fetch over query dependency, starting with query with no\n * dependency, and build response moving up\n *\n * TODO:\n * - All DiodeQueryRequest should contain pending property for filtering\n * instead of using query.dependencies which is not available in normal\n * QueryRequest\n */\n _fetchQueries(\n allQueries: Array<DiodeQueryRequest>,\n options: any = {}\n ): Promise {\n // We need to store unmodified initial queries before filtered\n // into batch query so we can use their resolve function when resolving\n // response from batch query\n const pendingQueries = allQueries.filter(query => query.dependencies);\n const initialQueries = allQueries.filter(query => !query.dependencies);\n let queries = initialQueries;\n\n if (this._batchQueryEnabled) {\n queries = filterBatchQuery(queries, this._batchQuery, options);\n }\n\n return this._networkLayer\n .sendQueries(queries, options)\n .then(queryResponseMap => {\n const responseMap = resolveQueryResponse(\n queries,\n initialQueries,\n queryResponseMap,\n options\n );\n\n if (pendingQueries.length > 0) {\n const nextQueries = resolvePendingQueries(\n pendingQueries,\n responseMap\n );\n return this._fetchQueries(nextQueries, options).then(\n nextResponseMap => {\n return Object.assign(responseMap, nextResponseMap);\n }\n );\n }\n\n return responseMap;\n });\n }\n}\n\nexport default new DiodeStore();\n","import objectAssign from \"object-assign\";\n\n/*\n Possible Errors:\n 1. Queries key specified in Diode Container is not the same as query type in Diode Query\n*/\nexport default function resolveContainerProps(response, RootContainer) {\n // Convert diode response as root container props\n const { map: queryMap } = RootContainer.query.getContainerQuery();\n const containerProps = Object.keys(queryMap).reduce((props, key) => {\n props[key] = response[key];\n\n if (!props[key]) {\n throw new Error(\n `Queries key ${key} does not match any type specified in Diode query.`\n );\n }\n\n return props;\n }, {});\n\n const { __additional } = response;\n if (__additional) {\n return objectAssign(containerProps, { __additional });\n } else {\n return containerProps;\n }\n}\n","import React from \"react\";\nimport Store from \"../store/DiodeStore\";\nimport { FETCH_ALL_CACHE } from \"./DiodeCacheConstant\";\n\nexport const CacheContext = React.createContext(null);\n\nexport class DiodeCache {\n constructor(cache, options) {\n Store.cache = cache;\n Store.options = options;\n }\n\n getContents() {\n return Store.cache;\n }\n\n // TODO memo\n getUnresolvedQueries(containerQuery) {\n return Object.keys(containerQuery.map).filter(type => {\n const cache = Store.cache[type];\n if (!cache) {\n // have no matching cache\n return true;\n }\n\n // check for unresolved fragment\n const query = containerQuery.map[type];\n return Object.keys(query.fragmentStructure).some(fragment => {\n const cachedFragment = cache[fragment];\n if (Array.isArray(cachedFragment)) {\n return false;\n }\n\n const innerFragment = query.fragmentStructure[fragment];\n if (!innerFragment || typeof innerFragment !== \"object\") {\n return false;\n }\n\n const innerFragmentKeys = Object.keys(innerFragment);\n if (innerFragmentKeys.length === 0) {\n if (Array.isArray(cache[FETCH_ALL_CACHE])) {\n // might already cache fetch-all\n return !cache[FETCH_ALL_CACHE].includes(fragment);\n }\n\n return true;\n }\n\n return innerFragmentKeys.some(key => {\n // API can return null\n if (cachedFragment) {\n return cachedFragment[key] === undefined;\n }\n\n return cachedFragment === undefined;\n });\n });\n });\n }\n\n hasResolved(containerQuery) {\n return this.getUnresolvedQueries(containerQuery).length === 0;\n }\n\n async resolve(containerQuery) {\n await Store.fetch(containerQuery, Store.options);\n }\n}\n\nexport function createCache(initialCache, options) {\n return new DiodeCache(initialCache, options);\n}\n","/**\n * @flow\n */\nimport mergeWith from \"lodash.mergewith\";\nimport type { DiodeQueryMap } from \"../tools/DiodeTypes\";\nimport type { DiodeContainer } from \"../container/DiodeContainer\";\n\n/**\n * Partially-complete query in given DiodeContainer\n *\n */\nclass DiodeContainerQuery {\n // store final query shape\n map: DiodeQueryMap = {};\n\n // store distinct query type\n _queryTypeMap: DiodeQueryMap = {};\n\n _queries: ?DiodeQueryMap;\n\n _children: Array<DiodeContainer>;\n\n constructor(\n componentName: string,\n queries: ?DiodeQueryMap,\n children: ?Array<DiodeContainer>\n ) {\n this._componentName = componentName;\n this._queries = queries;\n this._children = children || [];\n\n this._parseQueryTypeMap(queries);\n this._mergeChildQueryTypeMap(children);\n this._buildFinalQueryMap(queries, children);\n }\n\n getQueryTypeMap(): DiodeQueryMap {\n return this._queryTypeMap;\n }\n\n /**\n * @internal\n * @unstable\n *\n * Add child container dynamicly and rebuilt the query map\n */\n injectChildren(children: Array<DiodeContainer>) {\n this._children = this._children.concat(children);\n this._mergeChildQueryTypeMap(children);\n this._buildFinalQueryMap(this._queries, this._children);\n }\n\n /**\n * Group distinct query type into single query shape, this is to make sure\n * there is no same query type with different key.\n */\n _parseQueryTypeMap(queries: ?DiodeQueryMap): void {\n if (queries === null || queries === undefined) {\n return;\n }\n\n Object.keys(queries).forEach(key => {\n const query = queries[key];\n const existingQueryType = this._queryTypeMap[query.type];\n\n if (existingQueryType) {\n const { fragmentStructure: existingFragment } = existingQueryType;\n const { fragmentStructure: newFragment } = query;\n mergeWith(existingFragment, newFragment);\n mergeWith(existingQueryType.params, query.params);\n } else if (query.type) {\n this._queryTypeMap[query.type] = query;\n } else {\n throw new Error(\n `Invalid query type in query key ${key} at component ${\n this._componentName\n }`\n );\n }\n });\n }\n\n /**\n * Merge all child query map with existing query map, also merge all queries\n * with same type as we can have different key between parent-child that\n * represent same query type\n */\n _mergeChildQueryTypeMap(children: ?Array<DiodeContainer>): void {\n if (!children || !children.length) {\n return;\n }\n\n children.forEach(child => {\n const childQueryMap = child.query.map;\n\n /* istanbul ignore if */\n if (childQueryMap === null || childQueryMap === undefined) {\n return;\n }\n\n Object.keys(childQueryMap).forEach(key => {\n const childQuery = childQueryMap[key];\n const existingQueryType = this._queryTypeMap[childQuery.type];\n\n if (existingQueryType) {\n const { fragmentStructure: existingFragment } = existingQueryType;\n const { fragmentStructure: newFragment } = childQuery;\n mergeWith(existingFragment, newFragment);\n } else {\n this._queryTypeMap[childQuery.type] = childQuery;\n }\n });\n });\n }\n\n /**\n * Given complete query type map from current container and child container,\n * re-generate query map from initial queries with the complete query\n */\n _buildFinalQueryMap(\n queries: ?DiodeQueryMap,\n children: ?Array<DiodeContainer>\n ): void {\n if (queries) {\n // Create initial query map from parent container via query type map.\n // For the most part, this is enough as we already compile the complete\n // fragment and usually parent and child use same query key\n this.map = Object.keys(queries).reduce((queryMap, key) => {\n const query = queries[key];\n queryMap[key] = this._queryTypeMap[query.type];\n return queryMap;\n }, {});\n }\n\n if (!children || !children.length) {\n return;\n }\n\n children.forEach(child => {\n const queryMap = child.query.map;\n\n Object.keys(queryMap).forEach(key => {\n const childQuery = queryMap[key];\n const existingQuery = this.map[key];\n\n if (existingQuery && existingQuery.type !== childQuery.type) {\n return console.warn(\n // eslint-disable-line no-console\n \"Different query type for same query key %s: %s (%s) and %s (%s)\",\n key,\n this._componentName,\n existingQuery.type,\n child.componentName,\n childQuery.type\n );\n }\n\n this.map[key] = this._queryTypeMap[childQuery.type];\n });\n });\n }\n}\n\nexport default DiodeContainerQuery;\n","import { CacheContext, createCache } from \"./cache/DiodeCache\";\nimport DiodeStore from \"./store/DiodeStore\";\nimport { createContainer } from \"./container/DiodeContainer\";\nimport { createRootContainer } from \"./container/DiodeRootContainer\";\nimport DiodeQueryTypes from \"./query/DiodeQueryTypes\";\nimport { createDiodeQuery } from \"./query/createDiodeQuery\";\nimport {\n createQueryRequest,\n createPendingQueryRequest\n} from \"./query/DiodeQueryRequest\";\nimport DiodeRootQuery from \"./query/DiodeRootQuery\";\n\nconst DiodePublic = {\n Store: DiodeStore,\n CacheProvider: CacheContext.Provider,\n QueryTypes: DiodeQueryTypes,\n RootQuery: DiodeRootQuery,\n\n createCache,\n createContainer,\n createRootContainer,\n createQuery: createDiodeQuery,\n queryRequest: createQueryRequest,\n waitForQuery: createPendingQueryRequest,\n useBatchQuery: DiodeStore.useBatchQuery.bind(DiodeStore),\n useMockQueries: DiodeStore.useMockQueries.bind(DiodeStore),\n injectNetworkLayer: DiodeStore.injectNetworkLayer.bind(DiodeStore)\n};\n\nexport default DiodePublic;\n"],"names":["_call","body","then","direct","result","Promise","resolve","e","reject","_empty","constructor","Object","key","const","DiodeQueryTypes","BATCH","resolveQueryResponse","queries","initialQueries","queryResponseMap","options","keys","reduce","map","type","queryResponse","query","find","batchQueryResponseMap","resolveBatchQuery","assign","fragment","err","Error","FETCH_ALL_CACHE","response","RootContainer","getContainerQuery","containerProps","props","__additional","objectAssign","CacheContext","React","createContext","DiodeCache","cache","Store","getContents","getUnresolvedQueries","containerQuery","filter","fragmentStructure","some","cachedFragment","Array","isArray","innerFragment","innerFragmentKeys","length","includes","undefined","hasResolved","this","fetch","value","recover","DiodeStore","CacheProvider","Provider","QueryTypes","RootQuery","DiodeRootQuery","initialCache","createContainer","createQuery","queryRequest","waitForQuery","useBatchQuery","bind","useMockQueries","injectNetworkLayer"],"mappings":"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"}