UNPKG

react-diode

Version:

Endpoint agnostic, unidirectional data fetching for React applications

3 lines (2 loc) 11.3 kB
function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var r=e(require("lodash.find")),t=e(require("react")),n=require("react-is"),o=e(require("deep-extend")),i=e(require("object-assign")),a=e(require("hoist-non-react-statics")),u=e(require("lodash.mergewith")),c=function(){this._queryMockEnabled=!1};c.prototype.injectNetworkLayer=function(e){this._injectedNetworkLayer=e},c.prototype.injectQueryMockResolver=function(e){this._queryMockEnabled=!0,this._queryMockResolver=e},c.prototype.sendQueries=function(e,r){var t=this,n=e,o={},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||(o[e.type]=n,!1)}return!0})),a.sendQueries(n,r).then(function(e){return i(o,e)})},c.prototype._getCurrentNetworkLayer=function(){return this._injectedNetworkLayer};var s=function(e){this._variables={},this._containerQuery=e};function p(e,r){return Object.assign({},{type:e.type,fragment:e.fragment,resolve:e.resolve},r)}s.prototype.getContainerQuery=function(){return this._containerQuery},s.prototype.setVariables=function(e){u(this._variables,e)},s.prototype.getVariables=function(){return this._variables},s.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})},s.prototype._compileFragmentKeys=function(e){var r=this;return Object.keys(e).reduce(function(t,n){return t[r._compileFragmentValue(n)]="object"==typeof e[n]&&null!==e[n]?r._compileFragmentKeys(e[n]):r._compileFragmentValue(e[n]),t},{})},s.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 y={BATCH:"batch-query"},f="__fac__";function h(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][f])&&(e[r.type][f]=[]),e[r.type][f].push(t))})}catch(e){}}),e}var l=function(){this._batchQueriesEnabled=!1,this._networkLayer=new c};l.prototype.injectNetworkLayer=function(e){this._networkLayer.injectNetworkLayer(e)},l.prototype.useMockQueries=function(e){this._networkLayer.injectQueryMockResolver(e)},l.prototype.useBatchQuery=function(e){e&&(this._batchQueryEnabled=!0,this._batchQuery=e)},l.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 p(e,t)})}(e,r);return this._fetchQueries(t,r).then(function(r){return h(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},{}),o=e.__additional;return o?i(n,{__additional:o}):n}(r,e),t)})},l.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)a.forEach(function(e){o&&o[e]||(t[n]||(t[n]={}),t[n][e]=i[e])});else{if(Array.isArray(r[f])&&r[f].includes(n))return;t[n]={}}}}),Object.assign({},e,{fragment:t})},l.prototype.fetch=function(e,r){try{var t=this,n=new s(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 p(e,a)}).filter(Boolean);return Promise.resolve(t._fetchQueries(n,r)).then(function(e){u(t.cache,h(e,n),function(e,r){if(Array.isArray(e))return e.concat(r)})})}catch(e){return Promise.reject(e)}},l.prototype._fetchQueries=function(e,t){var n=this;void 0===t&&(t={});var o=e.filter(function(e){return e.dependencies}),a=e.filter(function(e){return!e.dependencies}),u=a;return this._batchQueryEnabled&&(u=function(e,t,n){var o=[],i=t.queryTypes,a=t.forceMerge,u=i.map(function(t){return r(e,{type:t})}).filter(function(e){return Boolean(e)});if(u.length===i.length||a&&u.length>0){var c=function(e,r,n){return Object.assign({},{type:t.type,resolve:t.resolve},t.request(u,n))}(0,0,n);o.push(c)}else o=o.concat(u);var s=e.filter(function(e){return-1===u.indexOf(e)});return o.concat(s)}(u,this._batchQuery,t)),this._networkLayer.sendQueries(u,t).then(function(e){var c=function(e,t,n,o){return Object.keys(n).reduce(function(a,u){try{var c=n[u],s=r(e,{type:u});if(u===y.BATCH){var p=function(e,t,n){var o={};for(var a in e)if(e.hasOwnProperty(a)){var u=e[a],c=r(t,{type:a});"__additional"===a?i(o,{__additional:u}):u&&c&&(o[a]=(0,c.resolve)(u,c.fragment,n))}return o}(s.resolve(c,o),t,o);Object.assign(a,p)}else a[u]=s.resolve(c,s.fragment,o);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,e,t);if(o.length>0){var s=function(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=p(r,n.apply(void 0,i));return a.dependencies?e(a,t):a}return r}(e,r)})}(o,c);return n._fetchQueries(s,t).then(function(e){return Object.assign(c,e)})}return c})};var d=new l,m=t.createContext(null),v=function(e,r){d.cache=e,d.options=r};v.prototype.getContents=function(){return d.cache},v.prototype.getUnresolvedQueries=function(e){return Object.keys(e.map).filter(function(r){var t=d.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[f])||!t[f].includes(e):i.some(function(e){return r?void 0===r[e]:void 0===r})})})},v.prototype.hasResolved=function(e){return 0===this.getUnresolvedQueries(e).length},v.prototype.resolve=function(e){try{return Promise.resolve(d.fetch(e,d.options)).then(function(){})}catch(e){return Promise.reject(e)}};var g=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)};g.prototype.getQueryTypeMap=function(){return this._queryTypeMap},g.prototype.injectChildren=function(e){this._children=this._children.concat(e),this._mergeChildQueryTypeMap(e),this._buildFinalQueryMap(this._queries,this._children)},g.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)u(o.fragmentStructure,n.fragmentStructure),u(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}})},g.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?u(o.fragmentStructure,n.fragmentStructure):r._queryTypeMap[n.type]=n})})},g.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 _=function(e){function r(){for(var r=[],t=arguments.length;t--;)r[t]=arguments[t];e.apply(this,r),this.state={error:null,isLoading:this.props.cache instanceof v&&!this.props.cache.hasResolved(this.props.query)}}return e&&(r.__proto__=e),(r.prototype=Object.create(e&&e.prototype)).constructor=r,r.prototype.componentDidMount=function(){try{var e=this,r=e.props,t=r.cache,n=r.query;if(!1===e.state.isLoading)return;var o=function(r,o){try{var i=Promise.resolve(t.resolve(n)).then(function(){function r(){e.setState({isLoading:!1})}var n=function(){if("function"==typeof e.props.afterFetchCallback)return Promise.resolve(new Promise(function(r){return e.props.afterFetchCallback(r,t.getContents())})).then(function(){})}();return n&&n.then?n.then(r):r()})}catch(e){return o(e)}return i&&i.then?i.then(void 0,o):i}(0,function(r){console.error("error",r),e.setState({error:r,isLoading:!1})});return o&&o.then?o.then(function(){}):void 0}catch(e){return Promise.reject(e)}},r.prototype.render=function(){var e,r=this.props,o=r.Component,i=r.wrapper,a=r.cache,u=r.loading,c=r.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}(r,["Component","wrapper","cache","query","loading","error"]),p=this.state.isLoading;return null!==this.state.error?c&&n.isValidElementType(c)?t.createElement(c,s):t.createElement("span",null,this.state.error.message):(e=p?u&&n.isValidElementType(u)?t.createElement(u,s):null:t.createElement(o,Object.assign({},s,a instanceof v&&a.getContents())),i?t.createElement("div",i,e):e)},r}(t.Component);function b(e,r){void 0===r&&(r={});var n,u=e.displayName||e.name,c="Diode("+u+")",s=new g(u,r.queries,r.children);function p(o){return n||(n=function(e,r,n){var o="Diode("+(e.displayName||e.name)+")",i=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(m.Consumer,null,function(i){return t.createElement(_,Object.assign({},o.props,{Component:e,wrapper:a,query:n,cache:i,loading:r.loading,error:r.error}))})},i}(t.Component);return i.displayName=o,a(i,e)}(e,r,s)),new n(o)}return p.setWrapperInfo=function(e){i(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=o(s,e.query),p.displayName=c,p.componentName=u,a(p,e,{query:!0})}var q={Store:d,CacheProvider:m.Provider,QueryTypes:y,RootQuery:s,createCache:function(e,r){return new v(e,r)},createContainer:b,createRootContainer:function(e,r){var t=b(e,r);return t.query=new s(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:d.useBatchQuery.bind(d),useMockQueries:d.useMockQueries.bind(d),injectNetworkLayer:d.injectNetworkLayer.bind(d)};module.exports=q; //# sourceMappingURL=react-diode.js.map