react-diode
Version:
Endpoint agnostic, unidirectional data fetching for React applications
3 lines (2 loc) • 11.8 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(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"],t):e.reactDiode=t(e.find,e.react,e.reactIs,e.deepExtend,e.objectAssign,e.hoistStatics,e.mergeWith)}(this,function(e,t,r,n,o,i,a){e=e&&e.hasOwnProperty("default")?e.default:e,t=t&&t.hasOwnProperty("default")?t.default:t,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 u=function(){this._queryMockEnabled=!1};u.prototype.injectNetworkLayer=function(e){this._injectedNetworkLayer=e},u.prototype.injectQueryMockResolver=function(e){this._queryMockEnabled=!0,this._queryMockResolver=e},u.prototype.sendQueries=function(e,t){var r=this,n=e,i={},a=this._getCurrentNetworkLayer();return this._queryMockEnabled&&(n=e.filter(function(e){var t=r._queryMockResolver[e.type];if(t&&"function"==typeof t){var n=t(e);return!n||(i[e.type]=n,!1)}return!0})),a.sendQueries(n,t).then(function(e){return o(i,e)})},u.prototype._getCurrentNetworkLayer=function(){return this._injectedNetworkLayer};var c=function(e){this._variables={},this._containerQuery=e};function s(e,t){return Object.assign({},{type:e.type,fragment:e.fragment,resolve:e.resolve},t)}c.prototype.getContainerQuery=function(){return this._containerQuery},c.prototype.setVariables=function(e){a(this._variables,e)},c.prototype.getVariables=function(){return this._variables},c.prototype.compile=function(){var e=this,t=this._containerQuery.getQueryTypeMap();return Object.keys(t).map(function(r){var n=t[r];return n.fragment=e._compileFragmentKeys(n.fragmentStructure),n.params=e._compileFragmentKeys(n.paramsStructure),n})},c.prototype._compileFragmentKeys=function(e){var t=this;return Object.keys(e).reduce(function(r,n){return r[t._compileFragmentValue(n)]="object"==typeof e[n]&&null!==e[n]?t._compileFragmentKeys(e[n]):t._compileFragmentValue(e[n]),r},{})},c.prototype._compileFragmentValue=function(e){if("string"==typeof e&&"$"===e.charAt(0)){var t=e.slice(1),r=this._variables[t];return null==r?e:r}return e};var p={BATCH:"batch-query"},f="__fac__";function y(e,t){return t.forEach(function(t){try{Object.keys(t.fragment).forEach(function(r){var n=e[t.type][r];0===Object.keys(t.fragment[r]).length&&n&&(!1===Array.isArray(e[t.type][f])&&(e[t.type][f]=[]),e[t.type][f].push(r))})}catch(e){}}),e}var h=function(){this._batchQueriesEnabled=!1,this._networkLayer=new u};h.prototype.injectNetworkLayer=function(e){this._networkLayer.injectNetworkLayer(e)},h.prototype.useMockQueries=function(e){this._networkLayer.injectQueryMockResolver(e)},h.prototype.useBatchQuery=function(e){e&&(this._batchQueryEnabled=!0,this._batchQuery=e)},h.prototype.forceFetch=function(e,t){var r=function(e,t){return e.query.compile().map(function(e){var r=e.request(e.fragment,e.params,t);return s(e,r)})}(e,t);return this._fetchQueries(r,t).then(function(t){return y(function(e,t){var r=t.query.getContainerQuery(),n=Object.keys(r.map).reduce(function(t,r){if(t[r]=e[r],!t[r])throw new Error("Queries key "+r+" does not match any type specified in Diode query.");return t},{}),i=e.__additional;return i?o(n,{__additional:i}):n}(t,e),r)})},h.prototype.filterCachedFragments=function(e){var t=this.cache[e.type];if(!t)return e;var r={};return Object.keys(e.fragment).forEach(function(n){var o=t[n],i=e.fragment[n];if(i){var a=Object.keys(i);if(0!==a.length)a.forEach(function(e){o&&o[e]||(r[n]||(r[n]={}),r[n][e]=i[e])});else{if(Array.isArray(t[f])&&t[f].includes(n))return;r[n]={}}}}),Object.assign({},e,{fragment:r})},h.prototype.fetch=function(e,t){try{var r=this,n=new c(e).compile().map(function(e){var n=r.filterCachedFragments(e),o=n.fragment,i=n.params;if(0===Object.keys(o).length)return null;var a=e.request(o,i,t);return s(e,a)}).filter(Boolean);return Promise.resolve(r._fetchQueries(n,t)).then(function(e){a(r.cache,y(e,n),function(e,t){if(Array.isArray(e))return e.concat(t)})})}catch(e){return Promise.reject(e)}},h.prototype._fetchQueries=function(t,r){var n=this;void 0===r&&(r={});var i=t.filter(function(e){return e.dependencies}),a=t.filter(function(e){return!e.dependencies}),u=a;return this._batchQueryEnabled&&(u=function(t,r,n){var o=[],i=r.queryTypes,a=r.forceMerge,u=i.map(function(r){return e(t,{type:r})}).filter(function(e){return Boolean(e)});if(u.length===i.length||a&&u.length>0){var c=function(e,t,n){return Object.assign({},{type:r.type,resolve:r.resolve},r.request(u,n))}(0,0,n);o.push(c)}else o=o.concat(u);var s=t.filter(function(e){return-1===u.indexOf(e)});return o.concat(s)}(u,this._batchQuery,r)),this._networkLayer.sendQueries(u,r).then(function(t){var c=function(t,r,n,i){return Object.keys(n).reduce(function(a,u){try{var c=n[u],s=e(t,{type:u});if(u===p.BATCH){var f=function(t,r,n){var i={};for(var a in t)if(t.hasOwnProperty(a)){var u=t[a],c=e(r,{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),r,i);Object.assign(a,f)}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.")}},{})}(u,a,t,r);if(i.length>0){var f=function(e,t){return e.map(function(e){return function e(t,r){var n=t.callback,o=t.dependencies,i=o.map(function(e){return r[e.type]}).filter(function(e){return Boolean(e)});if(i.length===o.length){var a=s(t,n.apply(void 0,i));return a.dependencies?e(a,r):a}return t}(e,t)})}(i,c);return n._fetchQueries(f,r).then(function(e){return Object.assign(c,e)})}return c})};var l=new h,d=t.createContext(null),m=function(e,t){l.cache=e,l.options=t};m.prototype.getContents=function(){return l.cache},m.prototype.getUnresolvedQueries=function(e){return Object.keys(e.map).filter(function(t){var r=l.cache[t];if(!r)return!0;var n=e.map[t];return Object.keys(n.fragmentStructure).some(function(e){var t=r[e];if(Array.isArray(t))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(r[f])||!r[f].includes(e):i.some(function(e){return t?void 0===t[e]:void 0===t})})})},m.prototype.hasResolved=function(e){return 0===this.getUnresolvedQueries(e).length},m.prototype.resolve=function(e){try{return Promise.resolve(l.fetch(e,l.options)).then(function(){})}catch(e){return Promise.reject(e)}};var v=function(e,t,r){this.map={},this._queryTypeMap={},this._componentName=e,this._queries=t,this._children=r||[],this._parseQueryTypeMap(t),this._mergeChildQueryTypeMap(r),this._buildFinalQueryMap(t,r)};v.prototype.getQueryTypeMap=function(){return this._queryTypeMap},v.prototype.injectChildren=function(e){this._children=this._children.concat(e),this._mergeChildQueryTypeMap(e),this._buildFinalQueryMap(this._queries,this._children)},v.prototype._parseQueryTypeMap=function(e){var t=this;null!=e&&Object.keys(e).forEach(function(r){var n=e[r],o=t._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 "+r+" at component "+t._componentName);t._queryTypeMap[n.type]=n}})},v.prototype._mergeChildQueryTypeMap=function(e){var t=this;e&&e.length&&e.forEach(function(e){var r=e.query.map;null!=r&&Object.keys(r).forEach(function(e){var n=r[e],o=t._queryTypeMap[n.type];o?a(o.fragmentStructure,n.fragmentStructure):t._queryTypeMap[n.type]=n})})},v.prototype._buildFinalQueryMap=function(e,t){var r=this;e&&(this.map=Object.keys(e).reduce(function(t,n){return t[n]=r._queryTypeMap[e[n].type],t},{})),t&&t.length&&t.forEach(function(e){var t=e.query.map;Object.keys(t).forEach(function(n){var o=t[n],i=r.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,r._componentName,i.type,e.componentName,o.type);r.map[n]=r._queryTypeMap[o.type]})})};var g=function(e){function n(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];e.apply(this,t),this.state={error:null,isLoading:this.props.cache instanceof m&&!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(){try{var e=this,t=e.props,r=t.cache,n=t.query;if(!1===e.state.isLoading)return;var o=function(t,o){try{var i=Promise.resolve(r.resolve(n)).then(function(){function t(){e.setState({isLoading:!1})}var n=function(){if("function"==typeof e.props.afterFetchCallback)return Promise.resolve(new Promise(function(t){return e.props.afterFetchCallback(t,r.getContents())})).then(function(){})}();return n&&n.then?n.then(t):t()})}catch(e){return o(e)}return i&&i.then?i.then(void 0,o):i}(0,function(t){console.error("error",t),e.setState({error:t,isLoading:!1})});return o&&o.then?o.then(function(){}):void 0}catch(e){return Promise.reject(e)}},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,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&-1===t.indexOf(n)&&(r[n]=e[n]);return r}(n,["Component","wrapper","cache","query","loading","error"]),p=this.state.isLoading;return null!==this.state.error?c&&r.isValidElementType(c)?t.createElement(c,s):t.createElement("span",null,this.state.error.message):(e=p?u&&r.isValidElementType(u)?t.createElement(u,s):null:t.createElement(o,Object.assign({},s,a instanceof m&&a.getContents())),i?t.createElement("div",i,e):e)},n}(t.Component);function _(e,r){void 0===r&&(r={});var a,u=e.displayName||e.name,c="Diode("+u+")",s=new v(u,r.queries,r.children);function p(n){return a||(a=function(e,r,n){var o="Diode("+(e.displayName||e.name)+")",a=function(o){function i(e){o.call(this,e),this.wrapperInfo=r.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 t.createElement(d.Consumer,null,function(i){return t.createElement(g,Object.assign({},o.props,{Component:e,wrapper:a,query:n,cache:i,loading:r.loading,error:r.error}))})},i}(t.Component);return a.displayName=o,i(a,e)}(e,r,s)),new a(n)}return p.setWrapperInfo=function(e){o(r.wrapperInfo,e)},p.getWrapperInfo=function(e){return r.wrapperInfo[e]},p.getComponent=function(){return e},p.getChildren=function(){return r.children&&r.children.length?r.children:[]},p.query=n(s,e.query),p.displayName=c,p.componentName=u,i(p,e,{query:!0})}return{Store:l,CacheProvider:d.Provider,QueryTypes:p,RootQuery:c,createCache:function(e,t){return new m(e,t)},createContainer:_,createRootContainer:function(e,t){var r=_(e,t);return r.query=new c(r.query),r},createQuery:function(e,t,r){if(void 0===r&&(r={}),"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=t,n.paramsStructure=r,n},queryRequest:function(e,t,r,n){return void 0===n&&(n={}),{pending:!1,url:e,method:t,payload:r,headers:n}},waitForQuery:function(e,t){return e instanceof Array||(e=[e]),{pending:!0,dependencies:e,callback:t}},useBatchQuery:l.useBatchQuery.bind(l),useMockQueries:l.useMockQueries.bind(l),injectNetworkLayer:l.injectNetworkLayer.bind(l)}});
//# sourceMappingURL=react-diode.umd.js.map