UNPKG

@stratusjs/angularjs

Version:

This is the AngularJS package for StratusJS.

1 lines 14.6 kB
System.register(["lodash","@stratusjs/runtime/stratus","@stratusjs/core/errors/errorBase","@stratusjs/core/datastore/modelBase","@stratusjs/core/events/eventManager","@stratusjs/core/environment","@stratusjs/core/misc","@stratusjs/core/datastore/xhr","./model","toastify-js"],function(exports_1,context_1){"use strict";var lodash_1,stratus_1,errorBase_1,modelBase_1,eventManager_1,environment_1,misc_1,xhr_1,model_1,toastify_js_1,CollectionOptionKeys,Collection;context_1&&context_1.id;return{setters:[function(lodash_1_1){lodash_1=lodash_1_1},function(stratus_1_1){stratus_1=stratus_1_1},function(errorBase_1_1){errorBase_1=errorBase_1_1},function(modelBase_1_1){modelBase_1=modelBase_1_1},function(eventManager_1_1){eventManager_1=eventManager_1_1},function(environment_1_1){environment_1=environment_1_1},function(misc_1_1){misc_1=misc_1_1},function(xhr_1_1){xhr_1=xhr_1_1},function(model_1_1){model_1=model_1_1},function(toastify_js_1_1){toastify_js_1=toastify_js_1_1}],execute:function(){exports_1("CollectionOptionKeys",CollectionOptionKeys=["autoSave","autoSaveInterval","cache","direct","target","targetSuffix","urlRoot","watch","payload","convoy","headers"]),Collection=class extends eventManager_1.EventManager{name="Collection";direct=!1;target=null;targetSuffix=null;urlRoot="/Api";toast=!0;qualifier="";serviceId=null;infinite=!1;threshold=.5;decay=0;header=new modelBase_1.ModelBase;meta=new modelBase_1.ModelBase;model=model_1.Model;models=[];types=[];xhr;withCredentials=!1;headers={};cacheResponse={};cacheHeaders={};cache=!1;pending=!1;error=!1;completed=!1;filtering=!1;paginate=!1;collectionApiHydratedFromUrl=!1;watch=!1;autoSave=!1;autoSaveInterval=2500;throttle=lodash_1.throttle(this.fetch,1e3);constructor(options={}){if(super(),options=options&&"object"==typeof options?options:{},lodash_1.extend(this,options),this.target&&(this.urlRoot+="/"+misc_1.ucfirst(this.target)),options.convoy){const convoy=misc_1.isJSON(options.convoy)?JSON.parse(options.convoy):options.convoy;if(lodash_1.isObject(convoy)){this.meta.set(convoy.meta||{});const models=convoy.payload;lodash_1.isArray(models)?(this.inject(models),this.completed=!0):console.error("malformed payload:",models)}else console.error("malformed convoy:",convoy)}if(options.payload){const models=misc_1.isJSON(options.payload)?JSON.parse(options.payload):options.payload;lodash_1.isArray(models)?(this.inject(models),this.completed=!0):console.error("malformed payload:",models)}}sanitizeOptions(options){const sanitizedOptions={};return lodash_1.forEach(CollectionOptionKeys,key=>{const data=lodash_1.get(options,key);lodash_1.isUndefined(data)||lodash_1.set(sanitizedOptions,key,data)}),sanitizedOptions}serialize(obj,chain){const str=[];return obj=obj||{},lodash_1.forEach(obj,(value,key)=>{if(lodash_1.isObject(value)){chain&&(key=chain+"["+key+"]");const serialized=this.serialize(value,key);serialized&&str.push(serialized)}else{let encoded="";chain&&(encoded+=chain+"["),encoded+=key,chain&&(encoded+="]"),str.push(encoded+"="+value)}}),str.join("&")}url(){return this.urlRoot+(this.targetSuffix||"")}inject(data,type){lodash_1.isArray(data)&&(this.types&&-1===this.types.indexOf(type)&&this.types.push(type),this.direct||data.forEach(target=>{this.models.push(new model_1.Model({autoSave:this.autoSave,autoSaveInterval:this.autoSaveInterval,collection:this,completed:!0,received:!0,toast:this.toast,type:type||null,watch:this.watch},target))}))}sync(action,data,options){return this.pending=!0,new Promise(async(resolve,reject)=>{options=options||{};const request={method:action=action||"GET",url:this.url(),headers:lodash_1.clone(this.headers),withCredentials:this.withCredentials};if(!lodash_1.isUndefined(data)){if(lodash_1.isObject(data)&&Object.prototype.hasOwnProperty.call(data,"p")){const validPage=this.normalizePositiveWholeNumber(data.p);lodash_1.isUndefined(validPage)?delete data.p:data.p=validPage}"GET"===action?lodash_1.isObject(data)&&Object.keys(data).length&&(request.url+=request.url.includes("?")?"&":"?",request.url+=this.serialize(data)):(request.headers["Content-Type"]="application/json",request.data=JSON.stringify(data))}Object.prototype.hasOwnProperty.call(options,"headers")&&"object"==typeof options.headers&&Object.keys(options.headers).forEach(headerKey=>{request.headers[headerKey]=options.headers[headerKey]});const queryHash=`${request.method}:${request.url}`;options.nocache&&(queryHash in this.cacheResponse&&delete this.cacheResponse[queryHash],queryHash in this.cacheHeaders&&delete this.cacheHeaders[queryHash]);const xhr=new xhr_1.XHR(request);this.xhr=xhr;const handler=(response,responseXhr=xhr)=>{if(!lodash_1.isObject(response)&&!lodash_1.isArray(response)){const error=new errorBase_1.ErrorBase({payload:response,message:`Invalid Payload: ${request.method} ${request.url}`},{});return this.error=!0,this.pending=!1,this.throttleTrigger("change"),this.trigger("error",error),void reject(error)}let responseHeaders=null;this.cache&&"GET"===request.method&&(queryHash in this.cacheResponse||(this.cacheResponse[queryHash]=lodash_1.cloneDeep(response)),queryHash in this.cacheHeaders?responseHeaders=this.cacheHeaders[queryHash]:this.cacheHeaders[queryHash]=responseXhr.getAllResponseHeaders()),this.header.set(responseHeaders||responseXhr.getAllResponseHeaders()),this.meta.set(response.meta||{}),this.models=[];const payload=response.payload||response;this.error=!1,this.meta.has("success")&&!this.meta.get("success")?this.error=!0:this.direct?this.models=payload:lodash_1.isArray(payload)?this.inject(payload):lodash_1.isObject(payload)?lodash_1.forEach(payload,(value,key)=>{this.inject(value,key)}):(this.meta.has("status")||this.meta.has("success")||(this.error=!0),console.warn(`Invalid Payload: ${request.method} ${request.url}`)),this.pending=!1,this.completed=!0,this.filtering=!lodash_1.isEmpty(this.meta.get("api.q")),this.paginate=!lodash_1.isEmpty(this.meta.get("api.p")),this.meta.clearTemp(),this.throttleTrigger("change"),this.trigger("complete"),resolve(this.models)};if(this.cache&&"GET"===request.method&&queryHash in this.cacheResponse)return void handler(this.cacheResponse[queryHash]);const prewarmRequest="undefined"!=typeof window&&window.StratusApiPrewarm?window.StratusApiPrewarm[request.url]:null,prewarm="GET"===request.method&&prewarmRequest&&"function"==typeof prewarmRequest.then?prewarmRequest:null;if(prewarm)return void prewarm.then(response=>response&&"function"==typeof response.clone?response.clone().json():response).then(response=>{const prewarmXhr={getAllResponseHeaders:()=>({})};this.xhr=prewarmXhr,handler(response,prewarmXhr)}).catch(()=>{const retryXhr=new xhr_1.XHR(request);this.xhr=retryXhr;const xhrPromise=retryXhr.send();"GET"===request.method&&"undefined"!=typeof window&&(window.StratusApiPrewarm=window.StratusApiPrewarm||{},window.StratusApiPrewarm[request.url]=xhrPromise),xhrPromise.then(response=>handler(response,retryXhr)).catch(error=>{console.error(`XHR: ${request.method} ${request.url}`),this.throttleTrigger("change"),this.trigger("error",error),reject(error)})});const xhrPromise=this.xhr.send();"GET"===request.method&&"undefined"!=typeof window&&(window.StratusApiPrewarm=window.StratusApiPrewarm||{},window.StratusApiPrewarm[request.url]=xhrPromise),xhrPromise.then(response=>handler(response,xhr)).catch(error=>{console.error(`XHR: ${request.method} ${request.url}`),this.throttleTrigger("change"),this.trigger("error",error),reject(error)})})}fetch(action,data,options){return new Promise(async(resolve,reject)=>{this.hydrateCollectionApiFromUrl(),this.sync(action,data||this.meta.get("api"),options).then(resolve).catch(async error=>{if(console.error("FETCH:",error),!this.toast)return void reject(error);const errorMessage=this.errorMessage(error),formatMessage=errorMessage?`: ${errorMessage}`:".";toastify_js_1.default({text:`Unable to Fetch ${this.target}${formatMessage}`,duration:12e3,close:!0,stopOnFocus:!0,style:{background:"#E14D45"}}).showToast(),reject(error)})})}hydrateCollectionApiFromUrl(force=!1){if(!force&&this.collectionApiHydratedFromUrl||"undefined"==typeof window)return;const url=new URL(window.location.href),urlApi=this.getUrlSearchObject(url);let filterApplied=!1,rawPage=null;"string"==typeof this.target&&this.target.length&&(rawPage=this.getUrlSearchValue(url,[`page[${this.target}]`,`p[${this.target}]`])),rawPage||(rawPage=this.getUrlSearchValue(url,["p","page"]));const page=this.normalizePositiveWholeNumber(rawPage);lodash_1.isUndefined(page)||(this.meta.set("api.p",page),this.meta.set("pagination.pageCurrent",page),this.paginate=!0);const query=this.getUrlSearchValue(url,["q","query","keyword","search"]);lodash_1.isUndefined(query)||null===query||""===query||(this.meta.set("api.q",query),this.filtering=!0,filterApplied=!0);const tags=this.getUrlSearchArray(url,["tags","tag"]);lodash_1.isEmpty(tags)||(this.meta.set("api.tags",lodash_1.map(tags,this.parseNumberLikeValue)),filterApplied=!0);const contentTypes=this.getUrlSearchArray(url,["contentType","contentTypes"]);lodash_1.isEmpty(contentTypes)||(this.meta.set("api.contentType",lodash_1.map(contentTypes,this.parseNumberLikeValue)),filterApplied=!0),lodash_1.forEach(["authorId","status","filterPublished","filterTimeField","filterTimeMin","filterTimeMax","filterTimeRange","sort","sortOrder","filter"],apiKey=>{if(!lodash_1.has(urlApi,apiKey))return;const value=lodash_1.get(urlApi,apiKey);lodash_1.isUndefined(value)||null===value||""===value||(this.meta.set(`api.${apiKey}`,this.parseUrlValue(value)),filterApplied=!0)}),filterApplied&&this.meta.set("filterApplied",!0),this.collectionApiHydratedFromUrl=!0}getUrlSearchValue(url,keys){for(const key of keys){const value=url.searchParams.get(key);if(!lodash_1.isUndefined(value)&&null!==value&&""!==value)return this.parseUrlValue(value)}}getUrlSearchArray(url,keys){const values=[];return url.searchParams.forEach((value,key)=>{if(!lodash_1.find(keys,name=>key===name||key===`${name}[]`||new RegExp(`^${name}\\[\\d+\\]$`).test(key)))return;const parsedValue=this.parseUrlValue(value);lodash_1.isArray(parsedValue)?values.push(...parsedValue):"string"!=typeof parsedValue||-1===parsedValue.indexOf(",")?values.push(parsedValue):values.push(...parsedValue.split(",").map(item=>item.trim()).filter(item=>""!==item))}),values}getUrlSearchObject(url){const output={};return url.searchParams.forEach((value,key)=>{this.assignUrlSearchValue(output,this.getUrlSearchParts(key),value)}),output}getUrlSearchParts(key){const parts=[],pattern=/([^\[\]]+)|\[(.*?)\]/g;let match;for(;null!==(match=pattern.exec(key));)parts.push(match[1]||match[2]||"");return parts}assignUrlSearchValue(output,parts,rawValue){if(!parts.length)return;let cursor=output;lodash_1.forEach(parts,(part,index)=>{const last=index===parts.length-1,key=""===part?this.nextArrayKey(cursor):part;last?lodash_1.isUndefined(cursor[key])?cursor[key]=rawValue:lodash_1.isArray(cursor[key])?cursor[key].push(rawValue):cursor[key]=[cursor[key],rawValue]:(lodash_1.isObject(cursor[key])||(cursor[key]=""===parts[index+1]||/^\d+$/.test(parts[index+1])?[]:{}),cursor=cursor[key])})}nextArrayKey(value){return lodash_1.isArray(value)?value.length:Object.keys(value).length}parseUrlValue(value){return lodash_1.isArray(value)?lodash_1.map(value,item=>this.parseUrlValue(item)):lodash_1.isObject(value)?lodash_1.reduce(value,(result,item,key)=>(result[key]=this.parseUrlValue(item),result),{}):"string"!=typeof value?value:misc_1.isJSON(value)?JSON.parse(value):this.parseNumberLikeValue(value)}parseNumberLikeValue(value){return"string"!=typeof value?value:/^-?\d+(\.\d+)?$/.test(value)?Number(value):value}filter(query){return this.filtering=!lodash_1.isEmpty(query),this.meta.set("api.q",lodash_1.isUndefined(query)?"":query),this.meta.set("api.p",1),this.fetch()}throttleFilter(query){return this.meta.set("api.q",lodash_1.isUndefined(query)?"":query),new Promise((resolve,reject)=>{const request=this.throttle();environment_1.cookie("env")&&console.log("request:",request),request.then(models=>{environment_1.cookie("env"),resolve(models)}).catch(reject)})}page(page){const validPage=this.normalizePositiveWholeNumber(page);this.paginate=!lodash_1.isUndefined(validPage),lodash_1.isUndefined(validPage)||(this.meta.set("api.p",validPage),this.fetch().then()),this.clearApiPage()}clearApiPage(){const collectionApi=this.meta.get("api");lodash_1.isObject(collectionApi)&&Object.prototype.hasOwnProperty.call(collectionApi,"p")&&delete collectionApi.p}normalizePositiveWholeNumber(value){const page=Number(value);return Number.isFinite(page)&&Number.isInteger(page)&&page>=1?page:void 0}toJSON(){return this.direct?this.models:this.models.map(model=>model.toJSON())}add(target,options){if(lodash_1.isObject(target))return options&&"object"==typeof options||(options={}),target instanceof model_1.Model?target.collection=this:(options.collection=this,(target=new model_1.Model(options,target)).initialize(),(options.autoSave||options.watch)&&(target.isNew()?target.save():target.completed||target.fetch())),options.save&&target.save(),options.prepend?this.models.unshift(target):this.models.push(target),options.trigger&&this.trigger("add",target),this.throttleTrigger("change"),target;console.error("collection.add: target object not set!")}remove(target){return this.direct||(this.models.splice(this.models.indexOf(target),1),this.throttleTrigger("change")),this}find(predicate){return lodash_1.find(this.models,lodash_1.isFunction(predicate)?predicate:model=>model.get("id")===predicate)}map(predicate){return lodash_1.map(this.models,model=>model instanceof model_1.Model?model.get(predicate):null)}pluck(attribute){return lodash_1.map(this.models,model=>model instanceof model_1.Model?model.pluck(attribute):null)}exists(attribute){return!!lodash_1.reduce(this.pluck(attribute)||[],(memo,data)=>memo||!lodash_1.isUndefined(data))}errorMessage(error){if(error instanceof errorBase_1.ErrorBase)return console.error(`[${error.code}] ${error.message}`,error),"Internal"!==error.code?error.message:null;const digest=error.responseText&&misc_1.isJSON(error.responseText)?JSON.parse(error.responseText):null;if(!digest)return null;const message=lodash_1.get(digest,"meta.status[0].message")||lodash_1.get(digest,"error.exception[0].message")||null;return message?!environment_1.cookie("env")&&lodash_1.has(digest,"error.exception[0].message")?(console.error("[xhr] server:",message),null):message:null}},exports_1("Collection",Collection),stratus_1.Stratus.Services.Collection=["$provide",$provide=>{$provide.factory("Collection",[()=>Collection])}],stratus_1.Stratus.Data.Collection=Collection}}});