UNPKG

react-diode

Version:

Endpoint agnostic, unidirectional data fetching for React applications

3 lines (2 loc) 11.2 kB
import e from"lodash.find";import r from"react";import{isValidElementType as t}from"react-is";import n from"deep-extend";import o from"object-assign";import i from"hoist-non-react-statics";import a from"lodash.mergewith";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,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)})},u.prototype._getCurrentNetworkLayer=function(){return this._injectedNetworkLayer};var c=function(e){this._variables={},this._containerQuery=e};function p(e,r){return Object.assign({},{type:e.type,fragment:e.fragment,resolve:e.resolve},r)}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,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})},c.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},{})},c.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 s={BATCH:"batch-query"},y="__fac__";function f(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][y])&&(e[r.type][y]=[]),e[r.type][y].push(t))})}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,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 f(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)})},h.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[y])&&r[y].includes(n))return;t[n]={}}}}),Object.assign({},e,{fragment:t})},h.prototype.fetch=function(e,r){try{var t=this,n=new c(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){a(t.cache,f(e,n),function(e,r){if(Array.isArray(e))return e.concat(r)})})}catch(e){return Promise.reject(e)}},h.prototype._fetchQueries=function(r,t){var n=this;void 0===t&&(t={});var i=r.filter(function(e){return e.dependencies}),a=r.filter(function(e){return!e.dependencies}),u=a;return this._batchQueryEnabled&&(u=function(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,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 p=r.filter(function(e){return-1===u.indexOf(e)});return o.concat(p)}(u,this._batchQuery,t)),this._networkLayer.sendQueries(u,t).then(function(r){var c=function(r,t,n,i){return Object.keys(n).reduce(function(a,u){try{var c=n[u],p=e(r,{type:u});if(u===s.BATCH){var y=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}(p.resolve(c,i),t,i);Object.assign(a,y)}else a[u]=p.resolve(c,p.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,r,t);if(i.length>0){var y=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)})}(i,c);return n._fetchQueries(y,t).then(function(e){return Object.assign(c,e)})}return c})};var l=new h,m=r.createContext(null),d=function(e,r){l.cache=e,l.options=r};d.prototype.getContents=function(){return l.cache},d.prototype.getUnresolvedQueries=function(e){return Object.keys(e.map).filter(function(r){var t=l.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[y])||!t[y].includes(e):i.some(function(e){return r?void 0===r[e]:void 0===r})})})},d.prototype.hasResolved=function(e){return 0===this.getUnresolvedQueries(e).length},d.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,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)};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 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}})},v.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})})},v.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 g=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 d&&!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,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)}},n.prototype.render=function(){var e,n=this.props,o=n.Component,i=n.wrapper,a=n.cache,u=n.loading,c=n.error,p=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"]),s=this.state.isLoading;return null!==this.state.error?c&&t(c)?r.createElement(c,p):r.createElement("span",null,this.state.error.message):(e=s?u&&t(u)?r.createElement(u,p):null:r.createElement(o,Object.assign({},p,a instanceof d&&a.getContents())),i?r.createElement("div",i,e):e)},n}(r.Component);function _(e,t){void 0===t&&(t={});var a,u=e.displayName||e.name,c="Diode("+u+")",p=new v(u,t.queries,t.children);function s(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(m.Consumer,null,function(i){return r.createElement(g,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,p)),new a(n)}return s.setWrapperInfo=function(e){o(t.wrapperInfo,e)},s.getWrapperInfo=function(e){return t.wrapperInfo[e]},s.getComponent=function(){return e},s.getChildren=function(){return t.children&&t.children.length?t.children:[]},s.query=n(p,e.query),s.displayName=c,s.componentName=u,i(s,e,{query:!0})}export default{Store:l,CacheProvider:m.Provider,QueryTypes:s,RootQuery:c,createCache:function(e,r){return new d(e,r)},createContainer:_,createRootContainer:function(e,r){var t=_(e,r);return t.query=new c(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:l.useBatchQuery.bind(l),useMockQueries:l.useMockQueries.bind(l),injectNetworkLayer:l.injectNetworkLayer.bind(l)}; //# sourceMappingURL=react-diode.mjs.map