{"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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"}