@skele/classic
Version:
Skele is an architectural framework that assists with building data-driven apps with React or React Native.
1 lines • 11.8 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:true});exports.setLoading=setLoading;exports.setRefreshing=setRefreshing;exports.setRefreshMetadata=setRefreshMetadata;exports.applyRead=applyRead;exports.fail=fail;exports.performRead=performRead;exports.read=read;exports.readRefresh=readRefresh;exports.fallback=void 0;var R=_interopRequireWildcard(require("ramda"));var _invariant=_interopRequireDefault(require("invariant"));var _immutable=require("immutable");var _uuid=_interopRequireDefault(require("uuid"));var _core=require("@skele/core");var _util=require("../impl/util");var readActions=_interopRequireWildcard(require("./actions"));var propNames=_interopRequireWildcard(require("../propNames"));var _http=require("./http");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)){var desc=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):{};if(desc.get||desc.set){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}}newObj.default=obj;return newObj;}}function _toConsumableArray(arr){return _arrayWithoutHoles(arr)||_iterableToArray(arr)||_nonIterableSpread();}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance");}function _iterableToArray(iter){if((typeof Symbol==="function"?Symbol.iterator:"@@iterator")in Object(iter)||Object.prototype.toString.call(iter)==="[object Arguments]")return Array.from(iter);}function _arrayWithoutHoles(arr){if(Array.isArray(arr)){for(var i=0,arr2=new Array(arr.length);i<arr.length;i++){arr2[i]=arr[i];}return arr2;}}function _objectSpread(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=Object.keys(source);if(typeof Object.getOwnPropertySymbols==='function'){ownKeys=ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym){return Object.getOwnPropertyDescriptor(source,sym).enumerable;}));}ownKeys.forEach(function(key){_defineProperty(target,key,source[key]);});}return target;}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_nonIterableRest();}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}function _iterableToArrayLimit(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=arr[typeof Symbol==="function"?Symbol.iterator:"@@iterator"](),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr;}function _objectWithoutProperties(source,excluded){if(source==null)return{};var target=_objectWithoutPropertiesLoose(source,excluded);var key,i;if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++){key=sourceSymbolKeys[i];if(excluded.indexOf(key)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(source,key))continue;target[key]=source[key];}}return target;}function _objectWithoutPropertiesLoose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key];}return target;}var canonical=_core.data.canonical,flow=_core.data.flow,kindOf=_core.data.kindOf;var info=_core.log.info,error=_core.log.error;var fallback='@@skele/defaultRead';exports.fallback=fallback;var updateKind=R.curry(function(update,element){return element.update('kind',R.pipe(canonical,update));});var setReadId=R.curry(function(id,el){return el.setIn([propNames.metadata,'readId'],id);});var getReadId=function getReadId(el){return el.getIn([propNames.metadata,'readId']);};var setMeta=R.curry(function(meta,el){return el.set(propNames.metadata,meta);});var setRefreshingAttr=R.curry(function(value,el){return el.setIn([propNames.metadata,'refreshing'],value);});var setRefreshMeta=R.curry(function(meta,el){return el.setIn([propNames.metadata,'failedRefresh'],meta).deleteIn([propNames.metadata,'refreshing']);});function setLoading(element,action){var readId=action.readId;return flow(element,updateKind(function(k){return k.set(0,'__loading');}),setReadId(readId));}function setRefreshing(element,action){var readId=action.readId,refreshing=action.refreshing;if(refreshing==null)refreshing=true;return flow(element,setReadId(readId),setRefreshingAttr(refreshing));}function setRefreshMetadata(element,action){var metadata=action.metadata,readId=action.readId;return flow(element,R.unless(function(el){return el==null||readId!==getReadId(el);},setRefreshMeta(metadata)));}function applyRead(element,action){var readId=action.readId,readValue=action.readValue;if(element==null||readId!==getReadId(element))return element;return flow(readValue,setReadId(readId));}function fail(element,action){var readId=action.readId,response=action.response;if(element==null||readId!==getReadId(element))return element;return flow(element,updateKind(function(k){return k.set(0,'__error');}),setMeta((0,_immutable.fromJS)(response.meta)));}function performRead(context,action){var _context$subsystems$r,registry,enrichment,enhancement,transformation,kernel,_R$omit,uri,opts,reader,enhanceContext,_ref,_ref2,readResponse,readIndependentEnhancements,readValue,readDependentEnhancements,enhancedResponse,enrichContext,enrichedResponse,transformContext,transformedResponse;return regeneratorRuntime.async(function performRead$(_context){while(1){switch(_context.prev=_context.next){case 0:_context$subsystems$r=context.subsystems.read.context,registry=_context$subsystems$r.registry,enrichment=_context$subsystems$r.enrichment,enhancement=_context$subsystems$r.enhancement,transformation=_context$subsystems$r.transformation;kernel=context;_R$omit=R.omit(['type',propNames.actionMeta],action),uri=_R$omit.uri,opts=_objectWithoutProperties(_R$omit,["uri"]);reader=registry.get(uri)||registry.get(fallback);if(!(reader!=null)){_context.next=33;break;}enhanceContext={config:kernel.config,subsystems:kernel.subsystems,subsystemSequence:kernel.subsystemSequence,elementZipper:kernel.elementZipper,uri:uri,opts:opts};_context.next=8;return regeneratorRuntime.awrap((0,_util.time)("TIME-reader-plus-enhancement-("+uri+")",Promise.all.bind(Promise))([(0,_util.time)("TIME-reader-("+uri+")",reader)(uri,opts,R.pick(['config','subsystems','subsystemSequence'],context)),(0,_util.time)("TIME-enhancement-run-independent-("+uri+")",enhancement.runEnhancers)(null,enhanceContext,enhancement.readIndependentEnhancers())]));case 8:_ref=_context.sent;_ref2=_slicedToArray(_ref,2);readResponse=_ref2[0];readIndependentEnhancements=_ref2[1];if((0,_http.isResponse)(readResponse)){_context.next=14;break;}throw new Error("The read fn acting on "+uri+" has returned an invalid response: "+readResponse);case 14:if(!(0,_http.isOK)(readResponse)){_context.next=30;break;}readValue=(0,_immutable.fromJS)(readResponse.value).merge(_defineProperty({},propNames.metadata,(0,_immutable.fromJS)(readResponse.meta||defaultMeta(uri)).merge({request:R.omit([propNames.actionMeta],action)})));enhanceContext=_objectSpread({},enhanceContext,{readValue:readValue});_context.next=19;return regeneratorRuntime.awrap((0,_util.time)("TIME-enhancement-run-read-dependent-("+uri+")",enhancement.runEnhancers)(readValue,enhanceContext,enhancement.readDependentEnhancers(kindOf(readValue))));case 19:readDependentEnhancements=_context.sent;enhancedResponse=(0,_util.timeSync)("TIME-enhancement-aply-("+uri+")",enhancement.applyEnhancements)(readValue,enhanceContext,[].concat(_toConsumableArray(readIndependentEnhancements),_toConsumableArray(readDependentEnhancements)));enrichContext=_objectSpread({},enhanceContext,{readValue:enhancedResponse});_context.next=24;return regeneratorRuntime.awrap((0,_util.time)("TIME-enrichment-("+uri+")",enrichment)(enhancedResponse,enrichContext));case 24:enrichedResponse=_context.sent;transformContext=_objectSpread({},enrichContext,{readValue:enrichedResponse});transformedResponse=(0,_util.timeSync)("TIME-transformation-("+uri+")",transformation)(enrichedResponse,transformContext);return _context.abrupt("return",_objectSpread({},readResponse,{value:transformedResponse}));case 30:return _context.abrupt("return",readResponse);case 31:_context.next=34;break;case 33:return _context.abrupt("return",{meta:{url:uri,uri:uri,status:999,message:"There's no reader defined for "+uri+". Did you forget to register a fallback reader?"}});case 34:case"end":return _context.stop();}}},null,this);}function defaultMeta(uri){return{status:200,uri:uri,url:uri};}function read(context,action){var dispatch,readId,readResponse;return regeneratorRuntime.async(function read$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:dispatch=context.dispatch;readId=(0,_uuid.default)();dispatch(_objectSpread({},action,{readId:readId,type:readActions.types.setLoading}));_context2.prev=3;_context2.next=6;return regeneratorRuntime.awrap((0,_util.time)("TIME-performRead-("+action.uri+")",performRead)(context,action));case 6:readResponse=_context2.sent;if((0,_http.isOK)(readResponse)){dispatch(_objectSpread({},action,{type:readActions.types.apply,readId:readId,response:readResponse,readValue:readResponse.value}));}else{dispatch(_objectSpread({},action,{readId:readId,type:readActions.types.fail,response:readResponse}));}_context2.next=13;break;case 10:_context2.prev=10;_context2.t0=_context2["catch"](3);dispatch(_objectSpread({},action,{readId:readId,type:readActions.types.fail,response:{meta:{status:999,message:_context2.t0.toString(),error:_context2.t0}}}));case 13:case"end":return _context2.stop();}}},null,this,[[3,10]]);}function readRefresh(context,action){var dispatch,element,readId,readAction,response;return regeneratorRuntime.async(function readRefresh$(_context3){while(1){switch(_context3.prev=_context3.next){case 0:dispatch=context.dispatch;element=context.query();readId=(0,_uuid.default)();if(action.uri!=null){readAction=action;}else{readAction=element.getIn([propNames.metadata,'request']).toJS();}(0,_invariant.default)(readAction!=null,'The element you are refreshing must have been loaded via a read, or you must provide an uri yourself.');readAction.revalidate=flow(action,R.prop('revalidate'),R.defaultTo(true));context.dispatch(_objectSpread({},action,{readId:readId,type:readActions.types.setRefreshing}));_context3.prev=7;_context3.next=10;return regeneratorRuntime.awrap(performRead(context,readAction));case 10:response=_context3.sent;if((0,_http.isOK)(response)){dispatch(_objectSpread({},action,{readId:readId,type:readActions.types.apply,response:response,readValue:response.value}));}else{info("Unsuccessful refreshing (read) "+readAction.uri+" ",response);dispatch(_objectSpread({},action,{readId:readId,metadata:(0,_immutable.fromJS)(response.meta),type:readActions.types.setRefreshMetadata}));}_context3.next=18;break;case 14:_context3.prev=14;_context3.t0=_context3["catch"](7);error("Error while refreshing (read) "+readAction.uri+" ",_context3.t0);dispatch(_objectSpread({},action,{readId:readId,metadata:(0,_immutable.fromJS)({status:999,message:_context3.t0.toString(),error:_context3.t0}),type:readActions.types.setRefreshMetadata}));case 18:case"end":return _context3.stop();}}},null,this,[[7,14]]);}