UNPKG

10.4 kBJavaScriptView Raw
1"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var reselect=require("reselect"),lodash=require("lodash"),normalizr=require("normalizr");const PREFIX="@API",REQUEST="REQUEST",SUCCESS="SUCCESS",FAILURE="FAILURE",CLEAR="CLEAR",REFRESH="REFRESH",successOf=e=>`${PREFIX}/${e}/${SUCCESS}`,requestOf=e=>`${PREFIX}/${e}/${REQUEST}`,failureOf=e=>`${PREFIX}/${e}/${FAILURE}`,clearOf=e=>`${PREFIX}/${e}/${CLEAR}`,refreshOf=e=>`${PREFIX}/${e}/${REFRESH}`;function isApi(e){const{key:t,type:r}=e;return t&&lodash.startsWith(r,PREFIX)}function isRequest(e){return isApi(e)&&lodash.endsWith(e.type,REQUEST)}function isSuccess(e){return isApi(e)&&lodash.endsWith(e.type,SUCCESS)}function isFailure(e){return isApi(e)&&lodash.endsWith(e.type,FAILURE)}function isClear(e){return isApi(e)&&lodash.endsWith(e.type,CLEAR)}function isRefresh(e){return isApi(e)&&lodash.endsWith(e.type,REFRESH)}const Apis=new Map;function registerSaga(e,t){Apis.set(e,t)}const initState={loading:!1,result:null,request:{},meta:{},total:0};function r(e=initState,t={}){const{payload:r={},error:n,meta:a={}}=t,{xTotalCount:i,result:o}=r,{append:s=!1}=a;return isRequest(t)?{...e,loading:!0,request:r,meta:a}:isSuccess(t)?{...e,loading:!1,result:s?lodash.union(o,e.result):o,total:i&&+i,meta:{...e.meta,...a}}:isFailure(t)?{...e,loading:!1,error:n,meta:{...e.meta,...a}}:isClear(t)?initState:e}const customizer=(e,t,r,n,a,i)=>{if(2===i.size&&lodash.isArray(t))return t};function entitiesReducer(e={},t){return t.payload&&t.payload.entities?lodash.mergeWith(e,t.payload.entities,customizer):e}function apiReducer(e={},t){const{key:n}=t;if(isApi(t)){const a=Apis.get(n);return a?lodash.setWith({...e},a.reduxPath,r(lodash.get(e,a.reduxPath),t),lodash.clone):e}return e}const apiReducers={apis:apiReducer,entities:entitiesReducer};function createIteratee(e,t){return(r,n,a)=>lodash.set(r,e(a),lodash.isObjectLike(n)?t(n):n)}function createHumps(e){return function t(r){return lodash.isArray(r)?lodash.map(r,t):lodash.isPlainObject(r)?lodash.transform(r,createIteratee(e,t)):r}}const humps=createHumps(lodash.camelCase),camelCaseKey=e=>e.split(".").map(e=>lodash.camelCase(e)).join("."),entitiesSelector=e=>e.entities,makeStateSelector=e=>t=>lodash.get(t.apis,e)||initState,makeApiSelector=(e,t)=>{const r=camelCaseKey(e),n=makeStateSelector(r);return reselect.createSelector(n,entitiesSelector,(e,r)=>{const{result:n}=e;if(!n||!t)return e;const a=normalizr.denormalize(n,t,r);return{...e,result:a}})};var createSymbol=function(e){return"@@redux-saga/"+e},CANCEL=createSymbol("CANCEL_PROMISE"),IO=createSymbol("IO"),MULTICAST=createSymbol("MULTICAST"),SELF_CANCELLATION=createSymbol("SELF_CANCELLATION"),undef=function(e){return null==e},notUndef=function(e){return null!=e},func=function(e){return"function"==typeof e},string=function(e){return"string"==typeof e},array=Array.isArray,pattern=function e(t){return t&&(string(t)||symbol(t)||func(t)||array(t)&&t.every(e))},channel=function(e){return e&&func(e.take)&&func(e.close)},stringableFunc=function(e){return func(e)&&e.hasOwnProperty("toString")},symbol=function(e){return!!e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype},multicast=function(e){return channel(e)&&e[MULTICAST]};function delayP(e,t){var r;void 0===t&&(t=!0);var n=new Promise(function(n){r=setTimeout(n,e,t)});return n[CANCEL]=function(){clearTimeout(r)},n}var konst=function(e){return function(){return e}},kTrue=konst(!0),noop=function(){},identity=function(e){return e},kThrow=function(e){throw e},kReturn=function(e){return{value:e,done:!0}};function makeIterator(e,t,r){void 0===t&&(t=kThrow),void 0===r&&(r="iterator");var n={meta:{name:r},next:e,throw:t,return:kReturn,isSagaIterator:!0};return"undefined"!=typeof Symbol&&(n[Symbol.iterator]=function(){return n}),n}var BUFFER_OVERFLOW="Channel's Buffer overflow!",ON_OVERFLOW_THROW=1,ON_OVERFLOW_DROP=2,ON_OVERFLOW_SLIDE=3,ON_OVERFLOW_EXPAND=4,zeroBuffer={isEmpty:kTrue,put:noop,take:noop};function ringBuffer(e,t){void 0===e&&(e=10);var r=[],n=0,a=0,i=0,o=function(t){r[a]=t,a=(a+1)%e,n++},s=function(){if(0!=n){var t=r[i];return r[i]=null,n--,i=(i+1)%e,t}},u=function(){for(var e=[];n;)e.push(s());return e};return{isEmpty:function(){return 0==n},put:function(s){var c;if(e>n)o(s);else switch(t){case ON_OVERFLOW_THROW:throw Error(BUFFER_OVERFLOW);case ON_OVERFLOW_SLIDE:r[a]=s,i=a=(a+1)%e;break;case ON_OVERFLOW_EXPAND:c=2*e,r=u(),n=r.length,a=r.length,i=0,r.length=c,e=c,o(s)}},take:s,flush:u}}var none=function(){return zeroBuffer},fixed=function(e){return ringBuffer(e,ON_OVERFLOW_THROW)},dropping=function(e){return ringBuffer(e,ON_OVERFLOW_DROP)},sliding=function(e){return ringBuffer(e,ON_OVERFLOW_SLIDE)},expanding=function(e){return ringBuffer(e,ON_OVERFLOW_EXPAND)},buffers=Object.freeze({none:none,fixed:fixed,dropping:dropping,sliding:sliding,expanding:expanding}),TAKE="TAKE",PUT="PUT",ALL="ALL",RACE="RACE",CALL="CALL",CPS="CPS",FORK="FORK",JOIN="JOIN",CANCEL$1="CANCEL",SELECT="SELECT",ACTION_CHANNEL="ACTION_CHANNEL",CANCELLED="CANCELLED",FLUSH="FLUSH",GET_CONTEXT="GET_CONTEXT",SET_CONTEXT="SET_CONTEXT",effectTypes=Object.freeze({TAKE:TAKE,PUT:PUT,ALL:ALL,RACE:RACE,CALL:CALL,CPS:CPS,FORK:FORK,JOIN:JOIN,CANCEL:CANCEL$1,SELECT:SELECT,ACTION_CHANNEL:ACTION_CHANNEL,CANCELLED:CANCELLED,FLUSH:FLUSH,GET_CONTEXT:GET_CONTEXT,SET_CONTEXT:SET_CONTEXT}),makeEffect=function(e,t){var r;return(r={})[IO]=!0,r.combinator=!1,r.type=e,r.payload=t,r};function take(e,t){return void 0===e&&(e="*"),pattern(e)?makeEffect(TAKE,{pattern:e}):multicast(e)&&notUndef(t)&&pattern(t)?makeEffect(TAKE,{channel:e,pattern:t}):channel(e)?makeEffect(TAKE,{channel:e}):void 0}function put(e,t){return undef(t)&&(t=e,e=void 0),makeEffect(PUT,{channel:e,action:t})}function all(e){var t=makeEffect(ALL,e);return t.combinator=!0,t}function getFnCallDescriptor(e,t){var r,n=null;return func(e)?r=e:(array(e)?(n=e[0],r=e[1]):(n=e.context,r=e.fn),n&&string(r)&&func(n[r])&&(r=n[r])),{context:n,fn:r,args:t}}function call(e){for(var t=arguments.length,r=[],n=1;t>n;n++)r[n-1]=arguments[n];return makeEffect(CALL,getFnCallDescriptor(e,r))}function fork(e){for(var t=arguments.length,r=[],n=1;t>n;n++)r[n-1]=arguments[n];return makeEffect(FORK,getFnCallDescriptor(e,r))}function cancel(e){return void 0===e&&(e=SELF_CANCELLATION),makeEffect(CANCEL$1,e)}function select(e){void 0===e&&(e=identity);for(var t=arguments.length,r=[],n=1;t>n;n++)r[n-1]=arguments[n];return makeEffect(SELECT,{selector:e,args:r})}var delay=call.bind(null,delayP),done=function(e){return{done:!0,value:e}},qEnd={};function safeName(e){return channel(e)?"channel":stringableFunc(e)?e+"":func(e)?e.name:e+""}function fsmIterator(e,t,r){var n,a,i,o=t;function s(t,r){if(o===qEnd)return done(t);if(r&&!a)throw o=qEnd,r;n&&n(t);var s=r?e[a](r):e[o]();return i=s.effect,n=s.stateUpdater,a=s.errorState,(o=s.nextState)===qEnd?done(t):i}return makeIterator(s,function(e){return s(null,e)},r)}function takeLatest(e,t){for(var r=arguments.length,n=[],a=2;r>a;a++)n[a-2]=arguments[a];var i,o,s={done:!1,value:take(e)},u=function(e){return{done:!1,value:fork.apply(void 0,[t].concat(n,[e]))}},c=function(e){return{done:!1,value:cancel(e)}},f=function(e){return i=e},l=function(e){return o=e};return fsmIterator({q1:function(){return{nextState:"q2",effect:s,stateUpdater:l}},q2:function(){return i?{nextState:"q3",effect:c(i)}:{nextState:"q1",effect:u(o),stateUpdater:f}},q3:function(){return{nextState:"q1",effect:u(o),stateUpdater:f}}},"q1","takeLatest("+safeName(e)+", "+t.name+")")}function takeLatest$1(e,t){for(var r=arguments.length,n=[],a=2;r>a;a++)n[a-2]=arguments[a];return fork.apply(void 0,[takeLatest,e,t].concat(n))}const sagaHooks={beforeRequest:null,afterRequest:null};function registerHooks(e={}){sagaHooks.beforeRequest=e.beforeRequest||null,sagaHooks.afterRequest=e.afterRequest||null}function*callAPI(e,t,r){if(!e)return;if(!t)return;const{payload:n}=t,a=Apis.get(e);if(!a)throw Error(`redux-api: api ${e} should be registered`);const i=a.endpoint;if(!i)throw Error(`redux-api: api ${e} should has endpoint`);const o=a.schema;if(sagaHooks.beforeRequest){if(!(yield call(sagaHooks.beforeRequest,e,t,a)))return}let s,u;try{s=(yield call(i,n))||{};const{body:t={},headers:a={}}=s,c=o?normalizr.normalize(t,o):{result:t};yield put({type:successOf(e),payload:{...c,...humps(a)},key:e,meta:r})}catch(t){yield put({type:failureOf(e),error:t,key:e,meta:r}),u=t}sagaHooks.afterRequest&&(yield call(sagaHooks.afterRequest,e,t,a,s,u))}function*watchRequest(){const e={};for(;;){const t=yield take(isRequest),{meta:r={},key:n}=t;e[n]&&(yield cancel(e[n])),e[n]=yield fork(callAPI,n,t,r)}}function*watchRefresh(e){const{key:t}=e,r=Apis.get(t);if(!r)throw Error(`redux-api: api ${t} should be registered`);const n=makeStateSelector(r.reduxPath),a=yield select(n);yield put({type:requestOf(t),key:t,payload:a.request,meta:a.meta})}function*watchApis(){yield all([fork(watchRequest),takeLatest$1(isRefresh,watchRefresh)])}class Api{constructor(e,t,r,n){this._key=e,this._endpoint=t,this._schema=r,this._reduxPath=camelCaseKey(n||e)}get endpoint(){return this._endpoint}get key(){return this._key}get schema(){return this._schema}get reduxPath(){return this._reduxPath}get actions(){return{request:(e,t={})=>({type:requestOf(this.key),key:this.key,payload:e,meta:t}),clear:(e={})=>({type:clearOf(this.key),key:this.key,meta:e}),refresh:(e={})=>({type:refreshOf(this.key),key:this.key,meta:e})}}}function createApiActions(e,t={}){if(!e)throw Error("Api need a key!");if(!t.endpoint)throw Error("Api need an endpoint function");if(Apis.has(e))return Apis.get(e).actions;const r=new Api(e,t.endpoint,t.schema,t.reduxPath);return registerSaga(e,r),r.actions}function createApiSelector(e,t){return makeApiSelector(e,t)}function apiSelector(e,t){return console.warn("apiSelector function is deprecated, please use createApiSelector "),makeApiSelector(e,t)}exports.createApiActions=createApiActions,exports.createApiSelector=createApiSelector,exports.apiSelector=apiSelector,exports.apiReducers=apiReducers,exports.apiReducer=apiReducer,exports.entitiesReducer=entitiesReducer,exports.watchApis=watchApis,exports.registerHooks=registerHooks,exports.isApi=isApi,exports.isSuccess=isSuccess,exports.isRequest=isRequest,exports.isFailure=isFailure,exports.successOf=successOf,exports.failureOf=failureOf,exports.requestOf=requestOf;
2//# sourceMappingURL=index.cjs.js.map