UNPKG

react-diode

Version:

Endpoint agnostic, unidirectional data fetching for React applications

3 lines (2 loc) 11.9 kB
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r(require("lodash.find"),require("react"),require("react-is"),require("deep-extend"),require("object-assign"),require("hoist-non-react-statics"),require("lodash.mergewith")):"function"==typeof define&&define.amd?define(["lodash.find","react","react-is","deep-extend","object-assign","hoist-non-react-statics","lodash.mergewith"],r):e.reactDiode=r(e.find,e.react,e.reactIs,e.deepExtend,e.objectAssign,e.hoistStatics,e.mergeWith)}(this,function(e,r,t,n,o,i,a){function u(e,r,t){if(t)return r?r(e()):e();try{var n=Promise.resolve(e());return r?n.then(r):n}catch(e){return Promise.reject(e)}}function c(){}e=e&&e.hasOwnProperty("default")?e.default:e,r=r&&r.hasOwnProperty("default")?r.default:r,n=n&&n.hasOwnProperty("default")?n.default:n,o=o&&o.hasOwnProperty("default")?o.default:o,i=i&&i.hasOwnProperty("default")?i.default:i,a=a&&a.hasOwnProperty("default")?a.default:a;var s=function(){this._queryMockEnabled=!1};s.prototype.injectNetworkLayer=function(e){this._injectedNetworkLayer=e},s.prototype.injectQueryMockResolver=function(e){this._queryMockEnabled=!0,this._queryMockResolver=e},s.prototype.sendQueries=function(e,r){var t=this,n=e,i={},a=this._getCurrentNetworkLayer();return this._queryMockEnabled&&(n=e.filter(function(e){var r=t._queryMockResolver[e.type];if(r&&"function"==typeof r){var n=r(e);return!n||(i[e.type]=n,!1)}return!0})),a.sendQueries(n,r).then(function(e){return o(i,e)})},s.prototype._getCurrentNetworkLayer=function(){return this._injectedNetworkLayer};var p=function(e){this._variables={},this._containerQuery=e};function f(e,r){return Object.assign({},{type:e.type,fragment:e.fragment,resolve:e.resolve},r)}function y(e,r){return e.map(function(e){return function e(r,t){var n=r.callback,o=r.dependencies,i=o.map(function(e){return t[e.type]}).filter(function(e){return Boolean(e)});if(i.length===o.length){var a=f(r,n.apply(void 0,i));return a.dependencies?e(a,t):a}return r}(e,r)})}p.prototype.getContainerQuery=function(){return this._containerQuery},p.prototype.setVariables=function(e){a(this._variables,e)},p.prototype.getVariables=function(){return this._variables},p.prototype.compile=function(){var e=this,r=this._containerQuery.getQueryTypeMap();return Object.keys(r).map(function(t){var n=r[t];return n.fragment=e._compileFragmentKeys(n.fragmentStructure),n.params=e._compileFragmentKeys(n.paramsStructure),n})},p.prototype._compileFragmentKeys=function(e){var r=this;return Object.keys(e).reduce(function(t,n){var o=r._compileFragmentValue(n);return t[o]="object"==typeof e[n]&&null!==e[n]?r._compileFragmentKeys(e[n]):r._compileFragmentValue(e[n]),t},{})},p.prototype._compileFragmentValue=function(e){if("string"==typeof e&&"$"===e.charAt(0)){var r=e.slice(1),t=this._variables[r];return null==t?e:t}return e};var h={BATCH:"batch-query"};function l(r,t,n,i){return Object.keys(n).reduce(function(a,u){try{var c=n[u],s=e(r,{type:u});if(u===h.BATCH){var p=function(r,t,n){var i={};for(var a in r)if(r.hasOwnProperty(a)){var u=r[a],c=e(t,{type:a});"__additional"===a?o(i,{__additional:u}):u&&c&&(i[a]=(0,c.resolve)(u,c.fragment,n))}return i}(s.resolve(c,i),t,i);Object.assign(a,p)}else a[u]=s.resolve(c,s.fragment,i);return a}catch(e){throw new Error("Query type "+u+" from network layer does not match any query types specified in Diode queries.")}},{})}function d(r,t,n){var o=[],i=t.queryTypes,a=t.forceMerge,u=i.map(function(t){return e(r,{type:t})}).filter(function(e){return Boolean(e)});if(u.length===i.length||a&&u.length>0){var c=function(e,r,t){return Object.assign({},{type:e.type,resolve:e.resolve},e.request(r,t))}(t,u,n);o.push(c)}else o=o.concat(u);var s=r.filter(function(e){return-1===u.indexOf(e)});return o=o.concat(s)}var m="__fac__";function v(e,r){return r.forEach(function(r){try{Object.keys(r.fragment).forEach(function(t){var n=e[r.type][t];0===Object.keys(r.fragment[t]).length&&n&&(!1===Array.isArray(e[r.type][m])&&(e[r.type][m]=[]),e[r.type][m].push(t))})}catch(e){}}),e}var g=function(){this._batchQueriesEnabled=!1,this._networkLayer=new s};g.prototype.injectNetworkLayer=function(e){this._networkLayer.injectNetworkLayer(e)},g.prototype.useMockQueries=function(e){this._networkLayer.injectQueryMockResolver(e)},g.prototype.useBatchQuery=function(e){e&&(this._batchQueryEnabled=!0,this._batchQuery=e)},g.prototype.forceFetch=function(e,r){var t=function(e,r){return e.query.compile().map(function(e){var t=e.request(e.fragment,e.params,r);return f(e,t)})}(e,r);return this._fetchQueries(t,r).then(function(r){return v(function(e,r){var t=r.query.getContainerQuery(),n=Object.keys(t.map).reduce(function(r,t){if(r[t]=e[t],!r[t])throw new Error("Queries key "+t+" does not match any type specified in Diode query.");return r},{}),i=e.__additional;return i?o(n,{__additional:i}):n}(r,e),t)})},g.prototype.filterCachedFragments=function(e){var r=this.cache[e.type];if(!r)return e;var t={};return Object.keys(e.fragment).forEach(function(n){var o=r[n],i=e.fragment[n];if(i){var a=Object.keys(i);if(0!==a.length)t[n]={},a.forEach(function(e){o&&o[e]||(t[n][e]=i[e])});else{if(Array.isArray(r[m])&&r[m].includes(n))return;t[n]={}}}}),Object.assign({},e,{fragment:t})},g.prototype.fetch=function(e,r){var t=this;return u(function(){var n=new p(e).compile().map(function(e){var n=t.filterCachedFragments(e),o=n.fragment,i=n.params;if(0===Object.keys(o).length)return null;var a=e.request(o,i,r);return f(e,a)}).filter(Boolean);return Promise.resolve(t._fetchQueries(n,r)).then(function(e){a(t.cache,v(e,n),function(e,r){if(Array.isArray(e))return e.concat(r)})})})},g.prototype._fetchQueries=function(e,r){var t=this;void 0===r&&(r={});var n=e.filter(function(e){return e.dependencies}),o=e.filter(function(e){return!e.dependencies}),i=o;return this._batchQueryEnabled&&(i=d(i,this._batchQuery,r)),this._networkLayer.sendQueries(i,r).then(function(e){var a=l(i,o,e,r);if(n.length>0){var u=y(n,a);return t._fetchQueries(u,r).then(function(e){return Object.assign(a,e)})}return a})};var _=new g,b=r.createContext(null),q=function(e,r){_.cache=e,_.options=r};q.prototype.getContents=function(){return _.cache},q.prototype.getUnresolvedQueries=function(e){return Object.keys(e.map).filter(function(r){var t=_.cache[r];if(!t)return!0;var n=e.map[r];return Object.keys(n.fragmentStructure).some(function(e){var r=t[e];if(Array.isArray(r))return!1;var o=n.fragmentStructure[e];if(!o||"object"!=typeof o)return!1;var i=Object.keys(o);return 0===i.length?!Array.isArray(t[m])||!t[m].includes(e):i.some(function(e){return r?void 0===r[e]:void 0===r})})})},q.prototype.hasResolved=function(e){return 0===this.getUnresolvedQueries(e).length},q.prototype.resolve=function(e){return u(function(){return Promise.resolve(_.fetch(e,_.options)).then(function(){})})};var w=function(e,r,t){this.map={},this._queryTypeMap={},this._componentName=e,this._queries=r,this._children=t||[],this._parseQueryTypeMap(r),this._mergeChildQueryTypeMap(t),this._buildFinalQueryMap(r,t)};w.prototype.getQueryTypeMap=function(){return this._queryTypeMap},w.prototype.injectChildren=function(e){this._children=this._children.concat(e),this._mergeChildQueryTypeMap(e),this._buildFinalQueryMap(this._queries,this._children)},w.prototype._parseQueryTypeMap=function(e){var r=this;null!=e&&Object.keys(e).forEach(function(t){var n=e[t],o=r._queryTypeMap[n.type];if(o){a(o.fragmentStructure,n.fragmentStructure),a(o.params,n.params)}else{if(!n.type)throw new Error("Invalid query type in query key "+t+" at component "+r._componentName);r._queryTypeMap[n.type]=n}})},w.prototype._mergeChildQueryTypeMap=function(e){var r=this;e&&e.length&&e.forEach(function(e){var t=e.query.map;null!=t&&Object.keys(t).forEach(function(e){var n=t[e],o=r._queryTypeMap[n.type];o?a(o.fragmentStructure,n.fragmentStructure):r._queryTypeMap[n.type]=n})})},w.prototype._buildFinalQueryMap=function(e,r){var t=this;e&&(this.map=Object.keys(e).reduce(function(r,n){return r[n]=t._queryTypeMap[e[n].type],r},{})),r&&r.length&&r.forEach(function(e){var r=e.query.map;Object.keys(r).forEach(function(n){var o=r[n],i=t.map[n];if(i&&i.type!==o.type)return console.warn("Different query type for same query key %s: %s (%s) and %s (%s)",n,t._componentName,i.type,e.componentName,o.type);t.map[n]=t._queryTypeMap[o.type]})})};var k=function(e){function n(){for(var r=[],t=arguments.length;t--;)r[t]=arguments[t];e.apply(this,r),this.state={error:null,isLoading:this.props.cache instanceof q&&!this.props.cache.hasResolved(this.props.query)}}return e&&(n.__proto__=e),(n.prototype=Object.create(e&&e.prototype)).constructor=n,n.prototype.componentDidMount=function(){var e=this;return u(function(){var r=e.props,t=r.cache,n=r.query;if(!1!==e.state.isLoading)return function(e){if(e&&e.then)return e.then(c)}(function(e,r){try{var t=e()}catch(e){return r(e)}return t&&t.then?t.then(void 0,r):t}(function(){return Promise.resolve(t.resolve(n)).then(function(){return r=function(){e.setState({isLoading:!1})},(n=function(){if("function"==typeof e.props.afterFetchCallback)return Promise.resolve(new Promise(function(r){return e.props.afterFetchCallback(r,t.getContents())})).then(function(){})}())&&n.then?n.then(r):r(n);var r,n})},function(r){console.error("error",r),e.setState({error:r,isLoading:!1})}))})},n.prototype.render=function(){var e,n=this.props,o=n.Component,i=n.wrapper,a=n.cache,u=n.loading,c=n.error,s=function(e,r){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&-1===r.indexOf(n)&&(t[n]=e[n]);return t}(n,["Component","wrapper","cache","query","loading","error"]),p=this.state.isLoading;return null!==this.state.error?c&&t.isValidElementType(c)?r.createElement(c,s):r.createElement("span",null,this.state.error.message):(e=p?u&&t.isValidElementType(u)?r.createElement(u,s):null:r.createElement(o,Object.assign({},s,a instanceof q&&a.getContents())),i?r.createElement("div",i,e):e)},n}(r.Component);function j(e,t){void 0===t&&(t={});var a,u=e.displayName||e.name,c="Diode("+u+")",s=new w(u,t.queries,t.children);function p(n){return a||(a=function(e,t,n){var o="Diode("+(e.displayName||e.name)+")",a=function(o){function i(e){o.call(this,e),this.wrapperInfo=t.wrapperInfo}return o&&(i.__proto__=o),(i.prototype=Object.create(o&&o.prototype)).constructor=i,i.prototype.render=function(){var o=this,i=this.props,a=i.wrapperInfo?i.wrapperInfo:this.wrapperInfo;return r.createElement(b.Consumer,null,function(i){return r.createElement(k,Object.assign({},o.props,{Component:e,wrapper:a,query:n,cache:i,loading:t.loading,error:t.error}))})},i}(r.Component);return a.displayName=o,i(a,e)}(e,t,s)),new a(n)}return p.setWrapperInfo=function(e){o(t.wrapperInfo,e)},p.getWrapperInfo=function(e){return t.wrapperInfo[e]},p.getComponent=function(){return e},p.getChildren=function(){return t.children&&t.children.length?t.children:[]},p.query=n(s,e.query),p.displayName=c,p.componentName=u,i(p,e,{query:!0})}return{Store:_,CacheProvider:b.Provider,QueryTypes:h,RootQuery:p,createCache:function(e,r){return new q(e,r)},createContainer:j,createRootContainer:function(e,r){var t=j(e,r);return t.query=new p(t.query),t},createQuery:function(e,r,t){if(void 0===t&&(t={}),"string"!=typeof e.type)throw new TypeError("Expected query definition to have query type");if("function"!=typeof e.request)throw new TypeError("Expected query definition to have .request() method");if("function"!=typeof e.resolve)throw new TypeError("Expected query definition to have .resolve() method");var n=Object.create(e);return n.fragmentStructure=r,n.paramsStructure=t,n},queryRequest:function(e,r,t,n){return void 0===n&&(n={}),{pending:!1,url:e,method:r,payload:t,headers:n}},waitForQuery:function(e,r){return e instanceof Array||(e=[e]),{pending:!0,dependencies:e,callback:r}},useBatchQuery:_.useBatchQuery.bind(_),useMockQueries:_.useMockQueries.bind(_),injectNetworkLayer:_.injectNetworkLayer.bind(_)}}); //# sourceMappingURL=DiodePublic.umd.js.map