react-fetching-library
Version:
Simple and powerful API client for react. Use hooks or FACC's to fetch data in easy way. No dependencies! Just react under the hood.
45 lines (42 loc) • 13.8 kB
JavaScript
/*
*****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
*****************************************************************************/
;Object.defineProperty(exports,"__esModule",{value:!0});function _interopDefault(a){return a&&"object"===typeof a&&"default"in a?a["default"]:a}var React=require("react"),React__default=_interopDefault(React),extendStatics=function(a,c){extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var b in c)c.hasOwnProperty(b)&&(a[b]=c[b])};return extendStatics(a,c)};
function __extends(a,c){function f(){this.constructor=a}extendStatics(a,c);a.prototype=null===c?Object.create(c):(f.prototype=c.prototype,new f)}var __assign=function(){__assign=Object.assign||function(a){for(var c,f=1,b=arguments.length;f<b;f++){c=arguments[f];for(var e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e])}return a};return __assign.apply(this,arguments)};
function __rest(a,c){var f={},b;for(b in a)Object.prototype.hasOwnProperty.call(a,b)&&0>c.indexOf(b)&&(f[b]=a[b]);if(null!=a&&"function"===typeof Object.getOwnPropertySymbols){var e=0;for(b=Object.getOwnPropertySymbols(a);e<b.length;e++)0>c.indexOf(b[e])&&(f[b[e]]=a[b[e]])}return f}
function __awaiter(a,c,f,b){return new (f||(f=Promise))(function(e,h){function g(a){try{k(b.next(a))}catch(l){h(l)}}function d(a){try{k(b["throw"](a))}catch(l){h(l)}}function k(a){a.done?e(a.value):(new f(function(c){c(a.value)})).then(g,d)}k((b=b.apply(a,c||[])).next())})}
function __generator(a,c){function f(a){return function(c){return b([a,c])}}function b(b){if(h)throw new TypeError("Generator is already executing.");for(;e;)try{if(h=1,g&&(d=b[0]&2?g["return"]:b[0]?g["throw"]||((d=g["return"])&&d.call(g),0):g.next)&&!(d=d.call(g,b[1])).done)return d;if(g=0,d)b=[b[0]&2,d.value];switch(b[0]){case 0:case 1:d=b;break;case 4:return e.label++,{value:b[1],done:!1};case 5:e.label++;g=b[1];b=[0];continue;case 7:b=e.ops.pop();e.trys.pop();continue;default:if(!(d=e.trys,d=
0<d.length&&d[d.length-1])&&(6===b[0]||2===b[0])){e=0;continue}if(3===b[0]&&(!d||b[1]>d[0]&&b[1]<d[3]))e.label=b[1];else if(6===b[0]&&e.label<d[1])e.label=d[1],d=b;else if(d&&e.label<d[2])e.label=d[2],e.ops.push(b);else{d[2]&&e.ops.pop();e.trys.pop();continue}}b=c.call(a,e)}catch(l){b=[6,l],g=0}finally{h=d=0}if(b[0]&5)throw b[1];return{value:b[0]?b[1]:void 0,done:!0}}var e={label:0,sent:function(){if(d[0]&1)throw d[1];return d[1]},trys:[],ops:[]},h,g,d,k;return k={next:f(0),"throw":f(1),"return":f(2)},
"function"===typeof Symbol&&(k[Symbol.iterator]=function(){return this}),k}
var convertActionToBase64=function(a){return Buffer.from(JSON.stringify(a)).toString("base64")},createCache=function(a,c){var f={},b=function(a){delete f[convertActionToBase64(a)]};return{add:function(b,c){a(b)&&(f[convertActionToBase64(b)]=__assign(__assign({},c),{timestamp:Date.now()}))},get:function(a){var e=f[convertActionToBase64(a)],g=e&&c(e);if(g)return e;e&&!g&&b(a)},getItems:function(){return f},remove:b,setItems:function(a){f=a}}},QueryError=function(a){function c(f,b){f=a.call(this,f)||
this;Object.setPrototypeOf(f,c.prototype);f.name="QueryError";f.response=b;return f}__extends(c,a);return c}(Error),createClient=function(a){void 0===a&&(a={});var c=a.cacheProvider,f=createCache(function(){return!0},function(){return!0}),b=function(a,c){return __awaiter(void 0,void 0,void 0,function(){var f,e,g,d;return __generator(this,function(l){switch(l.label){case 0:f=c[0];e=c.slice(1);if(!f)return[3,3];d=b;return[4,f(h)(a)];case 1:return[4,d.apply(void 0,[l.sent(),e])];case 2:return g=l.sent(),
[3,4];case 3:g=a,l.label=4;case 4:return[2,g]}})})},e=function(a,b,c){return __awaiter(void 0,void 0,void 0,function(){var f,g,d,k,m;return __generator(this,function(l){switch(l.label){case 0:f=c[0];g=c.slice(1);if(!f)return[3,3];k=e;m=[a];return[4,f(h)(a,b)];case 1:return[4,k.apply(void 0,m.concat([l.sent(),g]))];case 2:return d=l.sent(),[3,4];case 3:d=b,l.label=4;case 4:return[2,d]}})})},h={cache:c,query:function(f,d){void 0===d&&(d=!1);return __awaiter(void 0,void 0,void 0,function(){var g,h,l,
n,v,m,p,t,x,q,r,y,z,w,A;return __generator(this,function(k){switch(k.label){case 0:return k.trys.push([0,5,,6]),[4,b(f,a.requestInterceptors||[])];case 1:g=k.sent();h=g.endpoint;l=g.body;n=g.responseType;v=__rest(g,["endpoint","body","responseType"]);if(c&&!d&&(m=c.get(f)))return[2,m];p=v.headers;l&&(l instanceof FormData||l instanceof Blob||l instanceof ArrayBuffer)||(p=__assign({"Content-Type":"application/json; charset=utf-8"},v.headers));t=p&&p["Content-Type"]&&-1!==p["Content-Type"].indexOf("json");
x=a.fetch||fetch;return[4,x(h,__assign(__assign({},v),{body:l?t?JSON.stringify(l):l:void 0,headers:p,responseType:n}))];case 2:return q=k.sent(),y=e,z=[g],w={error:!q.ok,headers:q.headers},[4,resolveResponse(q,n)];case 3:return[4,y.apply(void 0,z.concat([(w.payload=k.sent(),w.status=q.status,w),a.responseInterceptors||[]]))];case 4:r=k.sent();c&&q.ok&&c.add(f,r);if(r.status&&g.config&&g.config.emitErrorForStatuses&&g.config.emitErrorForStatuses.includes(r.status))throw new QueryError("request-error",
r);return[2,r];case 5:return A=k.sent(),[2,{error:!0,errorObject:A}];case 6:return[2]}})})},suspenseCache:f};return h};
function resolveResponse(a,c){return __awaiter(this,void 0,void 0,function(){var f,b,e,h;return __generator(this,function(g){switch(g.label){case 0:return c?[2,a[c]()]:[3,1];case 1:return f=[204,205],b=a.headers.get("Content-Type"),(e=-1===f.indexOf(a.status)&&b&&-1!==b.indexOf("json"))?[4,a.json()]:[3,3];case 2:return h=g.sent(),[3,5];case 3:return[4,a.text()];case 4:h=g.sent(),g.label=5;case 5:return[2,h]}})})}
var initialContext={query:function(){console.warn("Add ClientProvider to use client context");return Promise.resolve({error:!0,status:0})},suspenseCache:createCache(function(){return!0},function(){return!0})},ClientContext=React.createContext(initialContext),SET_LOADING="response/loading",RESET_LOADING="response/reset-loading",RESET="response/reset",SET_RESPONSE="response/set",responseReducer=function(a,c){switch(c.type){case SET_LOADING:return __assign(__assign({},a),{loading:!0});case RESET_LOADING:return __assign(__assign({},
a),{loading:!1});case SET_RESPONSE:if(!c.response)throw Error();return __assign(__assign({},a),{loading:!1,response:c.response});case RESET:return{loading:!1,response:{error:!1}};default:throw Error();}},useCachedResponse=function(a){var c=React.useContext(ClientContext);if(c.cache)return c.cache.get(a)},useQuery=function(a,c){void 0===c&&(c=!0);var f=React.useContext(ClientContext),b=useCachedResponse(a),e=React.useRef(!0),h=React.useRef(),g=React.useReducer(responseReducer,{loading:b?!1:c,response:b?
b:{error:!1}}),d=g[0],k=g[1];g=convertActionToBase64(a);var u=React.useRef(g);g!==u.current&&(u.current=g,b&&k({type:SET_RESPONSE,response:b}));React.useEffect(function(){e.current=!0;c&&!b&&l();return function(){e.current=!1;n()}},[g]);var l=React.useCallback(function(b){void 0===b&&(b=!1);return __awaiter(void 0,void 0,void 0,function(){var c,g,d;return __generator(this,function(l){switch(l.label){case 0:c="AbortController"in window?new AbortController:void 0;g=a.signal||(c?c.signal:void 0);h.current&&
h.current.abort();h.current=c;if(!e.current)return[2,{error:!1}];k({type:SET_LOADING});return[4,f.query(__assign(__assign({},a),{signal:a.signal||g}),b)];case 1:return d=l.sent(),!e.current||d.errorObject&&"AbortError"===d.errorObject.name||k({type:SET_RESPONSE,response:d}),e.current&&d.errorObject&&"AbortError"===d.errorObject.name&&h.current&&h.current===c&&(h.current=void 0,k({type:RESET_LOADING})),[2,d]}})})},[g,f.query]);g=React.useCallback(function(){return l(!0)},[l]);var n=React.useCallback(function(){h.current&&
h.current.abort()},[]);u=React.useCallback(function(){k({type:RESET})},[]);if(d.response&&d.response.errorObject&&d.response.errorObject instanceof QueryError)throw d.response.errorObject;return __assign({abort:n,loading:d.loading,query:g,reset:u},d.response)},useMutation=function(a){var c=React.useContext(ClientContext),f=React.useRef(!0),b=React.useRef(),e=React.useReducer(responseReducer,{loading:!1,response:{error:!1}}),h=e[0],g=e[1];React.useEffect(function(){f.current=!0;return function(){f.current=
!1;d()}},[]);e=React.useCallback(function(){for(var d=[],e=0;e<arguments.length;e++)d[e]=arguments[e];return __awaiter(void 0,void 0,void 0,function(){var e,h,l,k;return __generator(this,function(t){switch(t.label){case 0:if(!f.current)return[2,{error:!1}];e=a.apply(void 0,d);h="AbortController"in window?new AbortController:void 0;l=e.signal||(h?h.signal:void 0);b.current&&b.current.abort();b.current=h;g({type:SET_LOADING});return[4,c.query(__assign(__assign({},e),{signal:e.signal||l}))];case 1:return k=
t.sent(),!f.current||k.errorObject&&"AbortError"===k.errorObject.name||g({type:SET_RESPONSE,response:k}),f.current&&k.errorObject&&"AbortError"===k.errorObject.name&&b.current&&b.current===h&&(b.current=void 0,g({type:RESET_LOADING})),[2,k]}})})},[a,c.query]);var d=React.useCallback(function(){b.current&&b.current.abort()},[]),k=React.useCallback(function(){g({type:RESET})},[]);if(h.response&&h.response.errorObject&&h.response.errorObject instanceof QueryError)throw h.response.errorObject;return __assign({abort:d,
loading:h.loading,mutate:e,reset:k},h.response)},useBulkMutation=function(a){var c=React.useContext(ClientContext).query,f=React.useRef(!0),b=React.useRef(),e=React.useState({loading:!1,responses:[]}),h=e[0],g=e[1],d=React.useCallback(function(){b.current&&b.current.abort()},[b]);React.useEffect(function(){f.current=!0;return function(){f.current=!1;d()}},[d]);e=React.useCallback(function(e){return __awaiter(void 0,void 0,void 0,function(){var d,h,k,m;return __generator(this,function(l){switch(l.label){case 0:if(!f.current)return[2,
Array.from(Array(10).keys()).map(function(){return{error:!1}})];d="AbortController"in window?new AbortController:void 0;h=e.map(function(b){return a(b)});k=d?d.signal:void 0;h.forEach(function(a){return a.signal=a.signal||k});b.current&&b.current.abort();b.current=d;g(function(a){return __assign(__assign({},a),{loading:!0})});return[4,Promise.all(h.map(function(a){return c(a)}))];case 1:return m=l.sent(),f.current&&g({loading:!1,responses:m.map(function(a,c){if(!a.errorObject||"AbortError"!==a.errorObject.name)return h[c].signal===
k&&b.current===d&&(b.current=void 0,g(function(a){return __assign(__assign({},a),{loading:!1})})),a})}),[2,m]}})})},[c,a]);var k=React.useCallback(function(){g({loading:!1,responses:[]})},[g]);return{abort:d,loading:h.loading,mutate:e,reset:k,responses:h.responses}},useSuspenseQuery=function(a){var c=React.useContext(ClientContext),f=React.useState(null),b=f[0],e=f[1],h=c.suspenseCache.get(a);React.useEffect(function(){h&&h.response&&null!==b&&c.suspenseCache.remove(a);return function(){c.suspenseCache.remove(a)}},
[convertActionToBase64(a)]);f=function(){c.suspenseCache.remove(a);e(!b)};if(h){if(h.response){if(h.response.errorObject&&h.response.errorObject instanceof QueryError)throw h.response.errorObject;return __assign(__assign({},h.response),{query:f})}throw h.fetch;}var g=c.query(a,null!==b).then(function(b){c.suspenseCache.add(a,{fetch:g,response:b})});c.suspenseCache.add(a,{fetch:g});throw g;},useClient=function(){return React.useContext(ClientContext)},useParameterizedQuery=function(a){var c=useMutation(a);
a=c.mutate;c=__rest(c,["mutate"]);return __assign(__assign({},c),{query:a})},Query=function(a){var c=a.children,f=a.initFetch;a=useQuery(a.action,void 0===f?!0:f);return c(a)},Mutation=function(a){var c=a.children;a=useMutation(a.actionCreator);return c(a)},SuspenseQuery=function(a){var c=a.children;a=useSuspenseQuery(a.action);return c(a)},QueryErrorBoundary=function(a){function c(c){var b=a.call(this,c)||this;b.state={hasError:!1};b.restart=function(){b.setState({hasError:!1,response:void 0})};
b.state={hasError:!1,response:void 0};return b}__extends(c,a);c.getDerivedStateFromError=function(a){if(a instanceof QueryError)return{hasError:!0,response:a.response}};c.prototype.render=function(){return this.state.hasError&&this.state.response&&this.state.response.status&&this.props.statuses.includes(this.state.response.status)?this.props.fallback(this.state.response,this.restart):this.props.children};return c}(React.Component),ClientContextProvider=function(a){var c=a.client;return React__default.createElement(ClientContext.Provider,
{value:{query:c.query,cache:c.cache,suspenseCache:c.suspenseCache}},a.children)};exports.ClientContext=ClientContext;exports.ClientContextProvider=ClientContextProvider;exports.Mutation=Mutation;exports.Query=Query;exports.QueryError=QueryError;exports.QueryErrorBoundary=QueryErrorBoundary;exports.SuspenseQuery=SuspenseQuery;exports.convertActionToBase64=convertActionToBase64;exports.createCache=createCache;exports.createClient=createClient;exports.useBulkMutation=useBulkMutation;
exports.useCachedResponse=useCachedResponse;exports.useClient=useClient;exports.useMutation=useMutation;exports.useParameterizedQuery=useParameterizedQuery;exports.useQuery=useQuery;exports.useSuspenseQuery=useSuspenseQuery;