From b7ee27476b1e7f153c6f7e4e8edc66efdd62fba6 Mon Sep 17 00:00:00 2001 From: Fabio Carneiro Date: Fri, 13 Nov 2015 18:01:52 +0100 Subject: [PATCH] replace put requests with patch requests --- dist-demo/maps/scripts/lib-f2c7ec66be.js.map | 2 +- dist-demo/scripts/lib-f2c7ec66be.js | 4 ++-- dist-demo/scripts/vendor-5f48f0c060.js | 4 ++-- dist/angular-jsonapi.js | 8 ++++---- dist/angular-jsonapi.js.map | 2 +- dist/angular-jsonapi.min.js | 4 ++-- dist/angular-jsonapi.min.js.map | 2 +- src/sources/rest/source-rest.factory.js | 6 +++--- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/dist-demo/maps/scripts/lib-f2c7ec66be.js.map b/dist-demo/maps/scripts/lib-f2c7ec66be.js.map index e9c2972..133ed22 100644 --- a/dist-demo/maps/scripts/lib-f2c7ec66be.js.map +++ b/dist-demo/maps/scripts/lib-f2c7ec66be.js.map @@ -1 +1 @@ -{"version":3,"sources":["scripts/lib-f2c7ec66be.js"],"names":["angular","module","AngularJsonAPISourceRestWrapper","AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http","AngularJsonAPISourceRestFactory","name","url","AngularJsonAPISourceRest","all","config","method","headers","params","encodeParams","then","resolveHttp","rejectHttp","bind","get","object","data","id","remove","unlink","deferred","defer","schema","relationships","key","removed","reject","create","_this","undefined","target","type","resolve","promise","link","errors","status","statusText","toLinkData","update","form","toJson","add","response","action","rejectServerOffline","rejectNoConnection","this","Accept","Content-Type","apply","arguments","synchronization","encodeValue","argument","isArray","join","encodedParams","forEach","paramValue","paramKey","isObject","paramInnerValue","paramInnerKey","decodeParams","decodedParams","value","objectKeyStart","indexOf","split","objectKey","substr","objectElementKey","prototype","Object","constructor","factory","$inject","provide","$provide","decorator","$delegate","$jsonapi","sourceRest","constant","Parse","AngularJsonAPISourceParseWrapper","pluralize","$log","AngularJsonAPISourceParseFactory","table","AngularJsonAPISourceParse","query","Query","ParseObject","limit","filter","equalTo","find","resolveParse","rejectParse","set","destroy","toParseObject","save","parseObject","attributes","attribute","relationship","charAt","toUpperCase","slice","parsePointer","extend","fromParseObject","synchronizer","resource","model","elem","error","toLowerCase","initialize","appId","jsKey","sourceLocal","AngularJsonAPISourceLocalWrapper","$window","AngularJsonAPISourceLocalFactory","prefix","AngularJsonAPISourceLocal","init","localStorage","getItem","clear","size","list","max","objectMaxKey","fraction","removeItem","updateStorage","cache","json","length","setItem","keys","reduce","m","k","__updateStorage","begin","finish","validate","AngularJsonAPIResourceCacheWrapper","uuid4","AngularJsonAPIResourceCacheFactory","AngularJsonAPIResourceCache","indexIds","addOrUpdate","validatedData","updatedAt","modelFactory","initialization","fromJson","collection","new","synchronized","stable","pristine","objectData","hasErrors","push","index","filterParams","valid","constraint","map","setIndexIds","array","element","isString","revertRemove","clearRemoved","oneWay","polymorphic","__addHasMany","__processAddHasMany","__addHasOne","__processAddHasOne","__removeHasMany","__processRemove","reflectionSchema","reflectionKey","reflection","__swapResults","__wrapResults","oldReflectionSchema","oldReflection","result","__removeHasOne","debug","reset","linkData","splice","newValue","item","i","service","AngularJsonAPIModelFormWrapper","AngularJsonAPIModelValidationError","validateJS","AngularJsonAPIModelFormFactory","parent","AngularJsonAPIModelForm","copy","auto","validator","validation","errorsMap","attributesWrapper","constraintsWrapper","async","AngularJsonAPIAbstractModelWrapper","AngularJsonAPIModelErrorsManager","$rootScope","$injector","AngularJsonAPIAbstractModel","loading","saving","Date","now","loadingCount","savingCount","__setData","synchronize","notify","$emit","concat","meta","__decrementSavingCounter","__incrementSavingCounter","refresh","synchronizeIncluded","__incrementLoadingCounter","__decrementLoadingCounter","resolveIncluded","includedResponse","operation","success","results","included","__proccesResults","allSettled","unlinkAll","removeLink","linksObj","removeReflectionLink","resolveReflection","targets","answer","setAttributes","validators","setRelationships","relationshipData","links","linkOne","unlinkOne","getResource","AngularJsonAPIModelValidationErrorWrapper","ValidationErrorFactory","message","ValidationError","context","Error","AngularJsonAPIModelSourceErrorWrapper","SourceErrorFactory","source","code","SourceError","AngularJsonAPIModelErrorsManagerWrapper","ErrorsManagerFactory","description","ErrorConstructor","defaultFilter","ErrorsManager","obj","namedFunction","fn","Function","propertyName","callback","done","defineProperty","call","enumerable","configurable","str","replace","promises","resolvedCallback","rejectedCallback","wrap","isFunction","reason","wrapped","hasOwnProperty","AngularJsonAPISynchronizerSimpleWrapper","AngularJsonAPISynchronizerPrototype","AngularJsonAPISynchronizerSimpleFactory","sources","AngularJsonAPISynchronizerSimple","state","step","resolved","afterHooks","hook","finishHooks","rejected","noop","beginHooks","beforeHooks","synchronizationHooks","AngularJsonAPISynchronizerPrototypeWrapper","AngularJsonAPISourcePrototypeWrapper","allHooks","options","hookName","beforeSynchro","afterSynchro","before","after","AngularJsonAPISchemaWrapper","AngularJsonAPISchemaLink","AngularJsonAPISchemaFactory","AngularJsonAPISchema","include","generate","isNumber","identity","linkSchema","linkName","linkSchemaObj","AngularJsonAPILinkSchrapperLink","AngularJsonAPISchemaLinkFactory","plural","singular","AngularJsonAPIResourceWrapper","AngularJsonAPIModel","AngularJsonAPICollection","AngularJsonAPIResourceFactory","AngularJsonAPIResource","initialized","fetch","relationshipSchema","relationshipName","clearCache","createModelFactory","schemaObj","isNew","Model","constructorName","functions","metaFunction","metaFunctionName","AngularJsonAPICollectionWrapper","AngularJsonAPICollectionFactory","event","clearWatchers","onObjectRemove","onFactoryClear","onObjectAdd","$on","jsonapiProvider","jsonapiFactory","addResource","memory","names","allResources","listResources","addValidator","warn","objects","synchronizerSimple","$get","provider","$logProvider","debugEnabled","run","Promise"],"mappings":"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","file":"scripts/lib-f2c7ec66be.js","sourcesContent":["(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest', ['angular-jsonapi']);\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper);\n\n function AngularJsonAPISourceRestWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n toKebabCase,\n $q,\n $http\n ) {\n\n AngularJsonAPISourceRest.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceRest.prototype.constructor = AngularJsonAPISourceRest;\n\n return {\n create: AngularJsonAPISourceRestFactory,\n encodeParams: encodeParams,\n decodeParams: decodeParams\n };\n\n function AngularJsonAPISourceRestFactory(name, url) {\n return new AngularJsonAPISourceRest(name, url);\n }\n\n function AngularJsonAPISourceRest(name, url) {\n var _this = this;\n var headers = { // jscs:disable disallowQuotedKeysInObjects\n 'Accept': 'application/vnd.api+json',\n 'Content-Type': 'application/vnd.api+json'\n }; // jscs:enable disallowQuotedKeysInObjects\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('unlink', unlink);\n _this.synchronization('link', link);\n _this.synchronization('update', update);\n _this.synchronization('add', add);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'all'));\n }\n\n function get(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url + '/' + config.object.data.id,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'get'));\n }\n\n function remove(config) {\n return $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'remove'));\n }\n\n function unlink(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Object has been removed', _this, 0, 'unlink'));\n } else if (config.target !== undefined && config.target.data.id === undefined) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Can\\'t unlink object without id through rest call', _this, 0, 'unlink'));\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'get')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n if (config.target === undefined) {\n $http({\n method: 'PUT',\n headers: headers,\n data: {data: []},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n } else {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key + '/' + config.target.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n }\n }\n\n return deferred.promise;\n }\n\n function link(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject({errors: [{status: 0, statusText: 'Object has been removed'}]});\n } else if (config.target === undefined || config.target.data.id === undefined) {\n deferred.reject({errors: [{status: 0, statusText: 'Can\\'t link object without id through rest call'}]});\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'PUT',\n headers: headers,\n data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n $http({\n method: 'POST',\n headers: headers,\n data: {data: [AngularJsonAPIModelLinkerService.toLinkData(config.target)]},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n }\n\n return deferred.promise;\n }\n\n function update(config) {\n return $http({\n method: 'PUT',\n headers: headers,\n url: url + '/' + config.object.data.id,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'update'));\n }\n\n function add(config) {\n return $http({\n method: 'POST',\n headers: headers,\n url: url,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'add'));\n }\n\n function resolveHttp(response) {\n return $q.resolve(response.data);\n }\n\n function rejectHttp(action, response) {\n var deferred = $q.defer();\n\n if (response.status === 0) {\n $http({\n method: 'GET',\n url: 'https://status.cloud.google.com/incidents.schema.json'\n }).then(rejectServerOffline, rejectNoConnection);\n } else {\n deferred.reject(AngularJsonAPIModelSourceError.create(response.statusText, _this, response.status, action));\n }\n\n return deferred.promise;\n\n function rejectServerOffline(response) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Server is offline', _this, response.status, action));\n }\n\n function rejectNoConnection() {\n deferred.reject(AngularJsonAPIModelSourceError.create('No internet connection', _this, response.status, action));\n }\n }\n }\n\n function encodeParams(params) {\n var encodedParams = {};\n\n if (params === undefined) {\n return {};\n }\n\n angular.forEach(params, function(paramValue, paramKey) {\n if (angular.isArray(paramValue)) {\n encodedParams[paramKey] = encodeValue(paramValue);\n } else if (angular.isObject(paramValue)) {\n angular.forEach(paramValue, function(paramInnerValue, paramInnerKey) {\n encodedParams[paramKey + '[' + paramInnerKey + ']'] = encodeValue(paramInnerValue);\n });\n } else {\n encodedParams[paramKey] = paramValue;\n }\n });\n\n return encodedParams;\n\n function encodeValue(argument) {\n if (angular.isArray(argument)) {\n return argument.join(',');\n } else {\n return argument;\n }\n }\n }\n\n function decodeParams(params) {\n var decodedParams = {};\n\n angular.forEach(params, function(value, key) {\n var objectKeyStart = key.indexOf('[');\n value = value.split(',');\n\n if (objectKeyStart > -1) {\n var objectKey = key.substr(0, objectKeyStart);\n var objectElementKey = key.substr(objectKeyStart + 1, key.indexOf(']') - objectKeyStart - 1);\n\n decodedParams[objectKey] = decodedParams[objectKey] || {};\n decodedParams[objectKey][objectElementKey] = value;\n } else {\n decodedParams[key] = value;\n }\n });\n\n return decodedParams;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceRest) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceRest = AngularJsonAPISourceRest;\n\n return $jsonapi;\n }\n})();\n\n(function() {\n 'use strict';\n\n /* global Parse: false */\n angular.module('angular-jsonapi-parse', ['angular-jsonapi'])\n .constant('Parse', Parse);\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper);\n\n function AngularJsonAPISourceParseWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n pluralize,\n Parse,\n $log,\n $q\n ) {\n\n AngularJsonAPISourceParse.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceParse.prototype.constructor = AngularJsonAPISourceParse;\n AngularJsonAPISourceParse.prototype.initialize = initialize;\n\n return {\n create: AngularJsonAPISourceParseFactory\n };\n\n function AngularJsonAPISourceParseFactory(name, table) {\n return new AngularJsonAPISourceParse(name, table);\n }\n\n function AngularJsonAPISourceParse(name, table) {\n var _this = this;\n\n _this.ParseObject = Parse.Object.extend(table);\n _this.type = pluralize(table).charAt(0).toLowerCase() + pluralize(table).slice(1);\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('update', update);\n _this.synchronization('add', update);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n var query = new Parse.Query(_this.ParseObject);\n\n if (config.params.limit !== undefined) {\n query.limit(config.params.limit);\n }\n\n angular.forEach(config.params.filter, function(filter) {\n query.equalTo(filter.key, filter.value);\n });\n\n return query.find().then(resolveParse, rejectParse.bind(null, 'all'));\n }\n\n function get(config) {\n var query = new Parse.Query(_this.ParseObject);\n return query.get(config.object.data.id).then(resolveParse, rejectParse.bind(null, 'get'));\n }\n\n function remove(config) {\n var object = new _this.ParseObject();\n object.set('id', config.object.data.id);\n return object.destroy().then(resolveParse, rejectParse.bind(null, 'remove'));\n }\n\n function update(config) {\n var object = toParseObject(config.object);\n return object.save(null).then(resolveParse, rejectParse.bind(null, 'update'));\n }\n\n function toParseObject(object) {\n var parseObject = new _this.ParseObject();\n angular.forEach(object.form.data.attributes, function(attribute, key) {\n parseObject.set(key, attribute);\n });\n\n angular.forEach(object.schema.relationships, function(relationship, key) {\n if (relationship.type === 'hasOne'\n && object.form.data.relationships[key].data !== null\n && object.form.data.relationships[key].data !== undefined\n ) {\n var table = pluralize(key, 1).charAt(0).toUpperCase() + pluralize(key, 1).slice(1);\n var parsePointer = new (Parse.Object.extend(table))();\n parsePointer.set('id', object.form.data.relationships[key].data.id);\n parseObject.set(key, parsePointer);\n }\n });\n\n return parseObject;\n }\n\n function fromParseObject(object) {\n var relationships = _this.synchronizer.resource.schema.relationships;\n object.type = _this.type;\n object.relationships = object.relationships || [];\n angular.forEach(relationships, function(relationship, key) {\n if (object.attributes[key] && relationship.type === 'hasOne') {\n object.relationships[key] = {\n data: {\n type: relationship.model,\n id: object.attributes[key].id\n }\n };\n }\n });\n\n return object;\n }\n\n function resolveParse(response) {\n if (angular.isArray(response)) {\n angular.forEach(response, function(elem, key) {\n response[key] = fromParseObject(elem);\n });\n } else if (angular.isObject(response)) {\n response = fromParseObject(response);\n }\n\n return $q.resolve({\n data: response\n });\n }\n\n function rejectParse(action, response) {\n $log.error('Parse error for', action, response);\n return $q.reject(response);\n }\n }\n\n function initialize(appId, jsKey) {\n Parse.initialize(appId, jsKey);\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceParse) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceParse;\n\n return $jsonapi;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local', ['angular-jsonapi']);\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper);\n\n function AngularJsonAPISourceLocalWrapper(\n AngularJsonAPISourcePrototype,\n $window,\n $q\n ) {\n var size = {\n max: 0,\n all: 0,\n limit: 5200000,\n list: {}\n };\n\n AngularJsonAPISourceLocal.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceLocal.prototype.constructor = AngularJsonAPISourceLocal;\n\n return {\n create: AngularJsonAPISourceLocalFactory,\n size: size\n };\n\n function AngularJsonAPISourceLocalFactory(name, prefix) {\n return new AngularJsonAPISourceLocal(name, prefix);\n }\n\n function AngularJsonAPISourceLocal(name, prefix) {\n var _this = this;\n\n prefix = prefix || 'AngularJsonAPI';\n\n _this.__updateStorage = updateStorage;\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('init', init);\n\n _this.begin('clearCache', clear);\n\n _this.finish('init', updateStorage);\n _this.finish('clearCache', updateStorage);\n _this.finish('remove', updateStorage);\n _this.finish('refresh', updateStorage);\n _this.finish('unlink', updateStorage);\n _this.finish('unlinkReflection', updateStorage);\n _this.finish('link', updateStorage);\n _this.finish('linkReflection', updateStorage);\n _this.finish('update', updateStorage);\n _this.finish('add', updateStorage);\n _this.finish('get', updateStorage);\n _this.finish('all', updateStorage);\n _this.finish('include', updateStorage);\n\n function init() {\n var type = _this.synchronizer.resource.schema.type;\n return $q.resolve($window.localStorage.getItem(prefix + '.' + type));\n }\n\n function clear() {\n var type = _this.synchronizer.resource.schema.type;\n var key = prefix + '.' + type;\n\n size.all -= size.list[key];\n delete size.list[key];\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.removeItem(key);\n }\n\n function updateStorage() {\n var type = _this.synchronizer.resource.schema.type;\n var cache = _this.synchronizer.resource.cache;\n var json = cache.toJson();\n var key = prefix + '.' + type;\n\n size.list[key] = size.list[key] === undefined ? 0 : size.list[key];\n size.all += json.length - size.list[key];\n size.list[key] = json.length;\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.setItem(key, json);\n }\n\n function objectMaxKey(object) {\n return Object.keys(object).reduce(function(m, k) {\n return object[k] > object[m] ? k : m;\n }, Object.keys(object)[0]);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceLocal) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceLocal;\n\n return $jsonapi;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi', ['uuid4'])\n /* global pluralize: false, validate: false */\n .constant('pluralize', pluralize)\n .constant('validateJS', validate);\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper);\n\n function AngularJsonAPIResourceCacheWrapper(\n uuid4,\n $log\n ) {\n\n AngularJsonAPIResourceCache.prototype.get = get;\n AngularJsonAPIResourceCache.prototype.index = index;\n AngularJsonAPIResourceCache.prototype.setIndexIds = setIndexIds;\n AngularJsonAPIResourceCache.prototype.addOrUpdate = addOrUpdate;\n\n AngularJsonAPIResourceCache.prototype.fromJson = fromJson;\n AngularJsonAPIResourceCache.prototype.toJson = toJson;\n AngularJsonAPIResourceCache.prototype.clear = clear;\n\n AngularJsonAPIResourceCache.prototype.remove = remove;\n AngularJsonAPIResourceCache.prototype.revertRemove = revertRemove;\n AngularJsonAPIResourceCache.prototype.clearRemoved = clearRemoved;\n\n return {\n create: AngularJsonAPIResourceCacheFactory\n };\n\n function AngularJsonAPIResourceCacheFactory(resource) {\n return new AngularJsonAPIResourceCache(resource);\n }\n\n /**\n * Constructor\n */\n function AngularJsonAPIResourceCache(resource) {\n var _this = this;\n\n _this.resource = resource;\n _this.data = {};\n _this.removed = {};\n _this.size = 0;\n\n _this.indexIds = undefined;\n }\n\n /**\n * Add new model or update existing with data\n * @param {object} validatedData Data that are used to update or create an object, has to be valid\n * @return {AngularJsonAPIModel} Created model\n */\n function addOrUpdate(validatedData, config, updatedAt) {\n var _this = this;\n var id = validatedData.id;\n\n if (id === undefined) {\n $log.error('Can\\'t add data without id!', validatedData);\n return;\n }\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(validatedData, config, updatedAt);\n _this.size += 1;\n } else {\n _this.data[id].update(validatedData, !config.new, config.initialization);\n }\n\n return _this.data[id];\n }\n\n\n /**\n * Recreate object structure from json data\n * @param {json} json Json data\n * @return {undefined}\n */\n function fromJson(json) {\n var _this = this;\n var collection = angular.fromJson(json);\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: true\n };\n\n if (angular.isObject(collection) && collection.data !== undefined) {\n _this.updatedAt = collection.updatedAt;\n _this.indexIds = collection.indexIds;\n\n angular.forEach(collection.data, function(objectData) {\n var data = objectData.data;\n _this.addOrUpdate(data, config, objectData.updatedAt);\n });\n }\n }\n\n /**\n * Encodes memory into json format\n * @return {json} Json encoded memory\n */\n function toJson() {\n var _this = this;\n var json = {\n data: [],\n updatedAt: _this.updatedAt,\n indexIds: _this.indexIds\n };\n\n angular.forEach(_this.data, function(object) {\n if (object.hasErrors() === false) {\n json.data.push(object.toJson());\n }\n });\n\n return angular.toJson(json);\n }\n\n /**\n * Clear memory\n * @return {undefined}\n */\n function clear() {\n var _this = this;\n\n _this.indexIds = undefined;\n _this.data = {};\n _this.removed = {};\n }\n\n /**\n * Low level get used internally, does not run any synchronization\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function get(id) {\n var _this = this;\n\n var data = {\n id: id,\n type: _this.resource.schema.type\n };\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: true\n };\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(data, config);\n }\n\n return _this.data[id];\n }\n\n /**\n * Low level get used internally, does not run any synchronization, used for index requests\n * @param {objec} params\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function index(params) {\n var _this = this;\n params = params || {};\n\n if (_this.indexIds === undefined) {\n return _this.indexIds;\n }\n\n return _this.indexIds.map(_this.get.bind(_this)).filter(filter);\n\n function filter(argument) {\n var filterParams = params.filter;\n var valid = true;\n\n angular.forEach(filterParams, function(constraint) {\n valid = valid && argument.data.attributes[constraint.key] === constraint.value;\n });\n\n return valid;\n }\n }\n\n /**\n * Cache ids of objects returned by index request\n * @param {ids array or AngularJsonAPIModel array} array Objects or ids to be cached\n */\n function setIndexIds(array) {\n var _this = this;\n\n _this.indexIds = [];\n\n angular.forEach(array, function(element) {\n if (angular.isString(element) && _this.resource.schema.id.validate(element)) {\n _this.indexIds.push(element);\n } else if (angular.isObject(element) && _this.resource.schema.id.validate(element.data.id)) {\n _this.indexIds.push(element.data.id);\n }\n });\n }\n\n /**\n * Remove object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function remove(id) {\n var _this = this;\n\n if (_this.data[id] !== undefined) {\n _this.removed[id] = _this.data[id];\n delete _this.data[id];\n _this.size -= 1;\n }\n\n return _this.removed[id];\n }\n\n /**\n * Revert removal of an object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function revertRemove(id) {\n var _this = this;\n\n if (_this.removed[id] !== undefined) {\n _this.data[id] = _this.removed[id];\n delete _this.removed[id];\n _this.size += 1;\n }\n\n return _this.data[id];\n }\n\n /**\n * Clear removed object from memory\n * @param {uuid} id\n * @return {undefined}\n */\n function clearRemoved(id) {\n var _this = this;\n\n delete _this.removed[id];\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService);\n\n function AngularJsonAPIModelLinkerService($log) {\n var _this = this;\n\n _this.toLinkData = toLinkData;\n\n _this.link = link;\n _this.unlink = unlink;\n\n return this;\n\n /**\n * Extracts data needed for relationship linking from object\n * @param {AngularJsonAPIModel} object Object\n * @return {json} Link data\n */\n function toLinkData(object) {\n if (object === null) {\n return null;\n }\n\n return {type: object.data.type, id: object.data.id};\n }\n\n /**\n * Add target to object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function link(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t add link to non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (target === undefined) {\n $log.error('Can\\'t link non existing object', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema === undefined) {\n $log.error('Can\\'t add link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (target !== null && schema.polymorphic === false && schema.model !== target.data.type) {\n $log.error('This relation is not polymorphic, expected: ' + schema.model + ' instead of ' + target.data.type);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema.type === 'hasMany') {\n if (oneWay === true) {\n __addHasMany(object, key, target, form);\n return [];\n } else {\n return __processAddHasMany(object, key, target, form);\n }\n } else if (schema.type === 'hasOne') {\n if (oneWay === true) {\n __addHasOne(object, key, target, form);\n return [];\n } else {\n return __processAddHasOne(object, key, target, form);\n }\n }\n }\n\n /**\n * Remove target from object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function unlink(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t remove link from non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (schema === undefined) {\n $log.error('Can\\'t remove link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (oneWay === true) {\n __removeHasMany(object, key, target, form);\n return [];\n } else {\n return __processRemove(object, key, target, form);\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __processAddHasMany(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var reflectionSchema;\n\n if (reflectionKey === false) {\n __addHasMany(object, key, target, form);\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema === undefined) {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n } else if (reflectionSchema.type === 'hasOne') {\n return __swapResults(\n __wrapResults(object, key, target),\n __wrapResults(target, reflectionKey, object),\n __processAddHasOne(target, reflectionKey, object, form)\n );\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(object, key, target, form);\n __addHasMany(target, reflectionKey, object, form);\n return [__wrapResults(target, reflectionKey, object)];\n }\n }\n\n function __processAddHasOne(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var oldReflection = object.relationships[key];\n var reflectionSchema;\n var oldReflectionSchema;\n var result = [];\n\n __addHasOne(object, key, target, form);\n\n if (reflectionKey === false) {\n return [];\n }\n\n if (oldReflection !== undefined && oldReflection !== null) {\n oldReflectionSchema = oldReflection.schema.relationships[reflectionKey];\n\n if (oldReflectionSchema !== undefined) {\n if (oldReflectionSchema.type === 'hasOne') {\n __removeHasOne(oldReflection, reflectionKey, object, form);\n } else if (oldReflectionSchema.type === 'hasMany') {\n __removeHasMany(oldReflection, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(oldReflection, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n if (target !== undefined && target !== null && reflectionKey !== false) {\n reflectionSchema = target.schema.relationships[reflectionKey];\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __addHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(target, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(target, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n return result;\n }\n\n function __processRemove(object, key, target, form) {\n var schema = object.schema.relationships[key];\n var reflectionKey = schema.reflection;\n var reflectionSchema;\n\n if (schema.type === 'hasMany') {\n __removeHasMany(object, key, target, form);\n } else if (schema.type === 'hasOne') {\n __removeHasOne(object, key, target, form);\n }\n\n if (reflectionKey === false) {\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __removeHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __removeHasMany(target, reflectionKey, object, form);\n }\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n }\n\n return [__wrapResults(target, reflectionKey, object)];\n }\n\n function __addHasOne(object, key, target, form) {\n $log.debug('addHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n object.relationships[key] = target;\n object.data.relationships[key].data = toLinkData(target);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __addHasMany(object, key, target, form) {\n $log.debug('addHasMany', object, key, target);\n\n var linkData = toLinkData(target);\n if (form === true) {\n object = object.form;\n }\n\n if (angular.isArray(object.relationships[key]) && object.relationships[key].indexOf(target) > -1) {\n return false;\n }\n\n object.relationships[key] = object.relationships[key] || [];\n object.data.relationships[key].data = object.data.relationships[key].data || [];\n\n object.relationships[key].push(target);\n object.data.relationships[key].data.push(linkData);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasOne(object, key, target, form) {\n $log.debug('removeHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (target !== undefined && object.relationships[key] !== target) {\n return false;\n }\n\n object.relationships[key] = null;\n object.data.relationships[key].data = undefined;\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasMany(object, key, target, form) {\n $log.debug('removeHasMany', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (object.relationships[key] === undefined) {\n return;\n }\n\n if (target === undefined) {\n object.relationships[key] = [];\n object.data.relationships[key].data = [];\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n var index = object.relationships[key].indexOf(target);\n\n if (index === -1) {\n return false;\n }\n\n object.relationships[key].splice(index, 1);\n object.data.relationships[key].data.splice(index, 1);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __wrapResults(object, key, target) {\n return {\n object: object,\n key: key,\n target: target\n };\n }\n\n function __swapResults(value, newValue, array) {\n var index = -1;\n angular.forEach(array, function(item, i) {\n if (item.object === value.object && item.key === value.key && item.target === value.target) {\n index = i;\n }\n });\n\n if (index > -1) {\n array[index] = newValue;\n } else {\n array.push(newValue);\n }\n\n return array;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper);\n\n function AngularJsonAPIModelFormWrapper(\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelLinkerService,\n validateJS,\n $q\n ) {\n\n AngularJsonAPIModelForm.prototype.save = save;\n AngularJsonAPIModelForm.prototype.reset = reset;\n AngularJsonAPIModelForm.prototype.validate = validate;\n\n AngularJsonAPIModelForm.prototype.link = link;\n AngularJsonAPIModelForm.prototype.unlink = unlink;\n\n AngularJsonAPIModelForm.prototype.toJson = toJson;\n\n return {\n create: AngularJsonAPIModelFormFactory\n };\n\n function AngularJsonAPIModelFormFactory(parent) {\n return new AngularJsonAPIModelForm(parent);\n }\n\n function AngularJsonAPIModelForm(parent) {\n var _this = this;\n\n _this.data = {\n id: parent.data.id,\n type: parent.data.type,\n attributes: {},\n relationships: {}\n };\n\n _this.relationships = {};\n _this.parent = parent;\n _this.schema = parent.schema;\n _this.reset();\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = angular.copy(_this.data);\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data\n };\n }\n\n /**\n * Saves form, shortcut to parent.save()\n * @return {promise} Promise associated with synchronization\n */\n function save() {\n var _this = this;\n\n return _this.parent.save();\n }\n\n /**\n * Resets form to state of a parent\n * @return {undefined}\n */\n function reset(auto) {\n var _this = this;\n\n angular.forEach(_this.schema.relationships, function(data, key) {\n _this.data.relationships[key] = angular.copy(_this.parent.data.relationships[key]) || {};\n if (angular.isArray(_this.relationships[key])) {\n _this.relationships[key] = _this.parent.relationships[key].slice();\n } else {\n _this.relationships[key] = _this.parent.relationships[key];\n }\n });\n\n if (auto === true && _this.parent.synchronized === true) {\n return;\n }\n\n angular.forEach(_this.schema.attributes, function(validator, key) {\n _this.data.attributes[key] = angular.copy(_this.parent.data.attributes[key]);\n });\n\n _this.parent.errors.validation.clear();\n }\n\n /**\n * Validates form\n * @return {promise} Promise rejected to errors object indexed by keys. If the\n * key param i stated it only validates an attribute, else all attributes.\n */\n function validate(key) {\n var _this = this;\n var attributesWrapper;\n var constraintsWrapper;\n var deferred = $q.defer();\n\n if (key === undefined) {\n attributesWrapper = _this.data.attributes;\n constraintsWrapper = _this.schema.attributes;\n } else {\n attributesWrapper = {};\n constraintsWrapper = {};\n\n attributesWrapper[key] = _this.data.attributes[key];\n constraintsWrapper[key] = _this.schema.attributes[key];\n }\n\n validateJS.async(\n attributesWrapper,\n constraintsWrapper\n ).then(resolve, reject);\n\n function resolve() {\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n deferred.resolve();\n }\n\n function reject(errorsMap) {\n _this.parent.error = true;\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n angular.forEach(errorsMap, function(errors, attribute) {\n angular.forEach(errors, function(error) {\n _this.parent.errors.validation.add(attribute, AngularJsonAPIModelValidationError.create(error, attribute));\n });\n });\n\n deferred.reject(_this.parent.errors.validation);\n }\n\n return deferred.promise;\n }\n\n /**\n * Adds link to a form without synchronization\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function link(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.link(_this.parent, key, target, oneWay, true));\n }\n\n /**\n * Removes link from form without synchronization\n * @param {[type]} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function unlink(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true));\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper);\n\n function AngularJsonAPIAbstractModelWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelErrorsManager,\n AngularJsonAPIModelLinkerService,\n AngularJsonAPIModelForm,\n $rootScope,\n $injector,\n $log,\n $q\n ) {\n AngularJsonAPIAbstractModel.prototype.refresh = refresh;\n AngularJsonAPIAbstractModel.prototype.remove = remove;\n AngularJsonAPIAbstractModel.prototype.reset = reset;\n AngularJsonAPIAbstractModel.prototype.save = save;\n\n AngularJsonAPIAbstractModel.prototype.update = update;\n\n AngularJsonAPIAbstractModel.prototype.link = link;\n AngularJsonAPIAbstractModel.prototype.unlink = unlink;\n AngularJsonAPIAbstractModel.prototype.unlinkAll = unlinkAll;\n\n AngularJsonAPIAbstractModel.prototype.toJson = toJson;\n\n AngularJsonAPIAbstractModel.prototype.hasErrors = hasErrors;\n\n return AngularJsonAPIAbstractModel;\n\n /**\n * Constructor\n * @param {json} data Validated data used to create an object\n * @param {object} config Is object new (for form)\n */\n function AngularJsonAPIAbstractModel(data, config, updatedAt) {\n var _this = this;\n\n data.relationships = data.relationships || {};\n\n /**\n * Is not a new record\n * @type {Boolean}\n */\n _this.new = config.new === undefined ? false : config.new;\n\n /**\n * Is present on the server\n * @type {Boolean}\n */\n _this.stable = config.stable === undefined ? true : config.stable;\n\n /**\n * Has been synchronized with the server\n * @type {Boolean}\n */\n _this.synchronized = config.synchronized === undefined ? true : config.synchronized;\n\n /**\n * Has just been created by request and may not exist on the server\n * @type {Boolean}\n */\n _this.pristine = config.pristine === undefined ? true : config.pristine;\n\n _this.removed = false;\n _this.loading = false;\n _this.saving = false;\n _this.updatedAt = _this.synchronized === true ? Date.now() : updatedAt;\n\n _this.loadingCount = 0;\n _this.savingCount = 0;\n\n _this.data = {\n relationships: {},\n attributes: {}\n };\n _this.relationships = {};\n\n angular.forEach(_this.schema.relationships, function(schema, key) {\n _this.relationships[key] = undefined;\n });\n\n _this.errors = {\n validation: AngularJsonAPIModelErrorsManager.create(\n 'Validation',\n 'Errors of attributes validation',\n AngularJsonAPIModelValidationError\n ),\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.promise = $q.resolve(_this);\n\n __setData(_this, data);\n\n _this.form = AngularJsonAPIModelForm.create(_this);\n }\n\n /**\n * Saves model's form\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function save() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: _this.new === true ? 'add' : 'update',\n object: _this\n };\n\n _this.form.validate().then(\n synchronize,\n deferred.reject\n ).finally(__decrementSavingCounter.bind(_this, undefined));\n\n __incrementSavingCounter(_this);\n\n return deferred.promise;\n\n function synchronize() {\n _this.synchronize(config).then(resolve, reject, notify);\n }\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:' + config.action, 'resolved', _this, response);\n _this.update(response.data.data);\n\n if (_this.new === true) {\n _this.resource.cache.indexIds = _this.resource.cache.indexIds || [];\n _this.resource.cache.indexIds.push(_this.data.id);\n }\n\n _this.synchronized = true;\n _this.new = false;\n _this.pristine = false;\n _this.stable = true;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve(response.data.meta);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Reset object form\n * @return {undefined}\n */\n function reset() {\n var _this = this;\n\n if (_this.form !== undefined) {\n _this.form.reset();\n }\n }\n\n /**\n * Synchronize object with remote\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function refresh(params) {\n var $jsonapi = $injector.get('$jsonapi');\n var deferred = $q.defer();\n var _this = this;\n params = params === undefined ? _this.schema.params.get : params;\n\n var config = {\n action: 'refresh',\n object: _this,\n params: params\n };\n\n if (_this.new === true) {\n var error = AngularJsonAPIModelSourceError.create('Can\\'t refresh new object', null, 0, 'refresh');\n _this.errors.synchronization.add('refresh', error);\n deferred.reject(error);\n } else {\n __incrementLoadingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n _this.synchronized = true;\n _this.stable = true;\n _this.pristine = false;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = _this.data;\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data,\n updatedAt: _this.updatedAt\n };\n }\n\n /**\n * Remove object\n * @return {promise} Promise associated with synchronization that resolves to nothing\n */\n function remove() {\n var _this = this;\n var deferred = $q.defer();\n\n var config = {\n action: 'remove',\n object: _this\n };\n\n _this.resource.cache.remove(_this.data.id);\n\n if (_this.new === true) {\n deferred.resolve();\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'resolved', _this, response);\n _this.removed = true;\n _this.unlinkAll();\n _this.resource.cache.clearRemoved(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'rejected', _this, response);\n _this.resource.cache.revertRemove(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlink all reflection relationships of the object **without synchronization**\n * @return {boolean} Result\n */\n function unlinkAll(key) {\n var _this = this;\n var deferred = $q.defer();\n\n __incrementLoadingCounter(_this);\n\n if (key === undefined) {\n angular.forEach(_this.relationships, removeLink);\n } else {\n removeLink(_this.relationships[key], key);\n }\n\n __decrementLoadingCounter(_this);\n\n return deferred.promise;\n\n function removeLink(linksObj, key) {\n var schema = _this.schema.relationships[key];\n var reflectionKey = schema.reflection;\n\n if (angular.isArray(linksObj)) {\n angular.forEach(linksObj, removeReflectionLink.bind(undefined, reflectionKey));\n } else if (angular.isObject(linksObj)) {\n removeReflectionLink(reflectionKey, linksObj);\n }\n\n if (schema.type === 'hasOne') {\n _this.relationships[key] = null;\n } else if (schema.type === 'hasMany') {\n _this.relationships[key] = [];\n }\n }\n\n function removeReflectionLink(reflectionKey, target) {\n var reflectionSchema = target.schema.relationships[reflectionKey];\n var config = {\n action: 'unlinkReflection',\n object: target,\n target: _this,\n key: reflectionKey\n };\n\n __incrementLoadingCounter(target);\n AngularJsonAPIModelLinkerService.unlink(target, reflectionKey, _this, reflectionSchema);\n\n target.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(target, undefined));\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'resolve', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'notify', _this, response);\n\n response.finish();\n deferred.notify(response);\n }\n }\n }\n\n /**\n * Links object to relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {promise} Promise associated with synchronizations\n */\n function link(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'link',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link undefined', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link new object', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'linkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].object.data.type + ':object:linkReflection', 'resolved', targets[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlinks object from relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked if undefined unlinks all\n * @return {promise} Promise associated with synchronizations\n */\n function unlink(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'unlink',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink undefined', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink new object', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'unlinkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].data.type + ':object:unlinkReflection', 'resolved', targets[key], operation);\n response.value.finish();\n }\n });\n\n deferred.resolve();\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Sets object state to data\n * @param {object} validatedData JsonAPI object with data\n * @return {bool} Result\n */\n function update(validatedData, auto, initialization) {\n var _this = this;\n\n __incrementLoadingCounter(_this);\n\n __setData(_this, validatedData);\n _this.reset(auto);\n _this.synchronized = initialization === true ? false : true;\n _this.stable = initialization === true ? false : true;\n _this.updatedAt = Date.now();\n\n __decrementLoadingCounter(_this);\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /////////////\n // PRIVATE //\n /////////////\n\n /**\n * Low level set data function, use only with validated data\n * @param {AngularJsonAPIModel} object object to be modified\n * @param {object} validatedData Validated data\n * @return {boolean} Status\n */\n function __setData(object, validatedData) {\n\n var $jsonapi = $injector.get('$jsonapi');\n var schema = object.schema;\n\n object.data.id = validatedData.id;\n object.data.type = validatedData.type;\n\n if (object.resource.schema.type !== validatedData.type) {\n $log.error('Different type then resource', object.resource.schema.type, validatedData);\n return false;\n }\n\n if (!object.schema.id.validate(object.data.id)) {\n $log.error('Invalid id');\n return false;\n }\n\n object.data.links = validatedData.links;\n validatedData.attributes = validatedData.attributes || {};\n validatedData.relationships = validatedData.relationships || {};\n\n angular.forEach(schema.attributes, setAttributes);\n angular.forEach(schema.relationships, setRelationships);\n\n return true;\n\n function setAttributes(validators, key) {\n object.data.attributes[key] = validatedData.attributes[key];\n }\n\n function setRelationships(schema, key) {\n var relationshipData = validatedData.relationships[key];\n\n if (relationshipData === undefined) {\n if (object.data.relationships[key] === undefined) {\n object.data.relationships[key] = {data: undefined};\n }\n\n return;\n }\n\n object.data.relationships[key] = object.data.relationships[key] || {};\n object.data.relationships[key].links = relationshipData.links;\n\n if (schema.type === 'hasOne') {\n linkOne(object, key, relationshipData.data);\n } else if (schema.type === 'hasMany') {\n if (angular.isArray(relationshipData.data)) {\n if (relationshipData.data.length === 0) {\n object.data.relationships[key].data = [];\n object.unlinkAll(key);\n } else {\n angular.forEach(\n object.relationships[key],\n unlinkOne.bind(undefined, object, key, relationshipData.data)\n );\n angular.forEach(\n relationshipData.data,\n linkOne.bind(undefined, object, key)\n );\n }\n }\n }\n }\n\n function linkOne(object, key, data) {\n var resource;\n\n if (data === null) {\n AngularJsonAPIModelLinkerService.link(object, key, null);\n return;\n }\n\n if (data === undefined) {\n return;\n }\n\n resource = $jsonapi.getResource(data.type);\n\n if (resource === undefined) {\n $log.error('Factory not found', data.type, data);\n return;\n }\n\n var target = resource.cache.get(data.id);\n\n AngularJsonAPIModelLinkerService.link(object, key, target);\n }\n\n function unlinkOne(object, key, relationshipData, target) {\n if (relationshipData.indexOf(target.data.id) > -1) {\n return;\n }\n\n AngularJsonAPIModelLinkerService.unlink(object, key, target);\n }\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n\n function __incrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount += 1;\n object.saving = true;\n }\n\n function __decrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount -= 1;\n object.saving = object.savingCount > 0;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelValidationError', AngularJsonAPIModelValidationErrorWrapper);\n\n function AngularJsonAPIModelValidationErrorWrapper() {\n ValidationError.prototype = Object.create(Error.prototype);\n ValidationError.prototype.constructor = ValidationError;\n ValidationError.prototype.name = 'ValidationError';\n\n return {\n create: ValidationErrorFactory\n };\n\n function ValidationErrorFactory(message, attribute) {\n return new ValidationError(message, attribute);\n }\n\n function ValidationError(message, attribute) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n attribute: attribute\n };\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelSourceError', AngularJsonAPIModelSourceErrorWrapper);\n\n function AngularJsonAPIModelSourceErrorWrapper() {\n SourceError.prototype = Object.create(Error.prototype);\n SourceError.prototype.constructor = SourceError;\n SourceError.prototype.name = 'SourceError';\n\n return {\n create: SourceErrorFactory\n };\n\n function SourceErrorFactory(message, source, code, action) {\n return new SourceError(message, source, code, action);\n }\n\n function SourceError(message, source, code, action) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n source: source,\n code: code,\n action: action\n };\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelErrorsManager', AngularJsonAPIModelErrorsManagerWrapper);\n\n function AngularJsonAPIModelErrorsManagerWrapper() {\n ErrorsManager.prototype.constructor = ErrorsManager;\n ErrorsManager.prototype.concat = concat;\n ErrorsManager.prototype.clear = clear;\n ErrorsManager.prototype.add = add;\n ErrorsManager.prototype.hasErrors = hasErrors;\n\n return {\n create: ErrorsManagerFactory\n };\n\n function ErrorsManagerFactory(name, description, ErrorConstructor, defaultFilter) {\n return new ErrorsManager(name, description, ErrorConstructor, defaultFilter);\n }\n\n function ErrorsManager(name, description, ErrorConstructor, defaultFilter) {\n var _this = this;\n _this.name = name;\n _this.description = description;\n\n _this.ErrorConstructor = ErrorConstructor;\n _this.errors = {};\n _this.defaultFilter = defaultFilter || function() { return true; };\n }\n\n function clear(key) {\n var _this = this;\n\n if (key === undefined) {\n angular.forEach(_this.errors, function(obj, key) {\n _this.errors[key] = [];\n });\n } else {\n _this.errors[key] = [];\n }\n }\n\n function add(key, error) {\n var _this = this;\n\n _this.errors[key] = _this.errors[key] || [];\n _this.errors[key].push(error);\n }\n\n function concat(errors) {\n var _this = this;\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key] = [];\n });\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key].push(error.object);\n });\n\n }\n\n function hasErrors(key) {\n var _this = this;\n\n if (key === undefined) {\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = answer || error.length > 0;\n });\n\n return answer;\n } else {\n return _this.errors[key] !== undefined && _this.errors[key].length > 0;\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('namedFunction', namedFunction);\n\n function namedFunction(name, fn) {\n return new Function('fn',\n 'return function ' + name + '(){ return fn.apply(this,arguments)}'\n )(fn);\n }\n})();\n\n// from https://www.sitepen.com/blog/2012/10/19/lazy-property-access/\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('lazyProperty', function(target, propertyName, callback) {\n var result;\n var done;\n Object.defineProperty(target, propertyName, {\n get: function() { // Define the getter\n if (!done) {\n // We cache the result and only compute once.\n done = true;\n result = callback.call(target);\n }\n\n return result;\n },\n\n // Keep it enumerable and configurable, certainly not necessary.\n enumerable: true,\n configurable: true\n });\n });\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('toKebabCase', function(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n });\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$q', decorator);\n }\n\n function decorator($delegate) {\n var $q = $delegate;\n\n $q.allSettled = $q.allSettled || allSettled;\n\n function allSettled(promises, resolvedCallback, rejectedCallback) {\n // Implementation of allSettled function from Kris Kowal's Q:\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\n // by Michael Kropat from http://stackoverflow.com/a/27114615/1400432 slightly modified\n\n var wrapped = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function(promise, key) {\n if (!wrapped.hasOwnProperty(key)) {\n wrapped[key] = wrap(promise);\n }\n });\n\n return $q.all(wrapped);\n\n function wrap(promise) {\n return $q.resolve(promise)\n .then(function(value) {\n if (angular.isFunction(resolvedCallback)) {\n resolvedCallback(value);\n }\n\n return { success: true, value: value };\n },\n\n function(reason) {\n if (angular.isFunction(rejectedCallback)) {\n rejectedCallback(reason);\n }\n\n return { success: false, reason: reason };\n });\n }\n }\n\n return $q;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper);\n\n function AngularJsonAPISynchronizerSimpleWrapper(AngularJsonAPISynchronizerPrototype, $q, $log) {\n\n AngularJsonAPISynchronizerSimple.prototype = Object.create(AngularJsonAPISynchronizerPrototype.prototype);\n AngularJsonAPISynchronizerSimple.prototype.constructor = AngularJsonAPISynchronizerSimple;\n\n AngularJsonAPISynchronizerSimple.prototype.synchronize = synchronize;\n\n return {\n create: AngularJsonAPISynchronizerSimpleFactory\n };\n\n function AngularJsonAPISynchronizerSimpleFactory(sources) {\n return new AngularJsonAPISynchronizerSimple(sources);\n }\n\n function AngularJsonAPISynchronizerSimple(sources) {\n var _this = this;\n\n _this.state = {};\n\n AngularJsonAPISynchronizerPrototype.call(_this, sources);\n\n angular.forEach(sources, function(source) {\n source.synchronizer = _this;\n });\n }\n\n function synchronize(config) {\n var _this = this;\n var promises = [];\n var deferred = $q.defer();\n var action = config.action;\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize.call(_this, config);\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beginHooks[action], function(hook) {\n deferred.notify({step: 'begin', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beforeHooks[action], function(hook) {\n deferred.notify({step: 'before', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.synchronizationHooks[action], function(hook) {\n promises.push(hook.call(_this, config));\n });\n });\n\n $q.allSettled(promises, resolvedCallback, rejectedCallback).then(resolved, rejected);\n\n function resolvedCallback(value) {\n deferred.notify({step: 'synchronization', data: value});\n }\n\n function rejectedCallback(reason) {\n deferred.notify({step: 'synchronization', errors: reason});\n }\n\n function resolved(results) {\n _this.state[action] = _this.state[action] || {};\n _this.state[action].success = true;\n\n angular.forEach(results, function(result) {\n if (result.success === false) {\n _this.state[action].success = false;\n }\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.afterHooks[action], function(hook) {\n deferred.notify({step: 'after', errors: hook.call(_this, config, results)});\n });\n });\n\n var data;\n var errors = [];\n\n angular.forEach(results, function(result) {\n if (result.success === true) {\n data = result.value;\n } else {\n errors.push({\n key: action,\n object: result.reason\n });\n }\n });\n\n if (errors.length > 0) {\n deferred.reject({data: data || {}, finish: finish, errors: errors});\n } else {\n deferred.resolve({data: data || {}, finish: finish, errors: errors});\n }\n }\n\n function finish() {\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.finishHooks[action], function(hook) {\n deferred.notify({step: 'finish', errors: hook.call(_this, config)});\n });\n });\n }\n\n function rejected(errors) {\n $log.error('All settled rejected! Something went wrong');\n\n deferred.reject({finish: angular.noop, errors: errors});\n }\n\n return deferred.promise;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper);\n\n function AngularJsonAPISynchronizerPrototypeWrapper($log) {\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize = synchronize;\n\n return AngularJsonAPISynchronizerPrototype;\n\n function AngularJsonAPISynchronizerPrototype(sources) {\n var _this = this;\n\n _this.sources = sources;\n }\n\n function synchronize(config) {\n var _this = this;\n\n $log.debug('Synchro Collection', _this.resource.schema.type, config);\n\n if (config.action === undefined) {\n $log.error('Can\\'t synchronize undefined action', config);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISourcePrototype', AngularJsonAPISourcePrototypeWrapper);\n\n function AngularJsonAPISourcePrototypeWrapper() {\n AngularJsonAPISourcePrototype.prototype.before = beforeSynchro;\n AngularJsonAPISourcePrototype.prototype.after = afterSynchro;\n AngularJsonAPISourcePrototype.prototype.begin = begin;\n AngularJsonAPISourcePrototype.prototype.finish = finish;\n AngularJsonAPISourcePrototype.prototype.synchronization = synchronization;\n\n return AngularJsonAPISourcePrototype;\n\n function AngularJsonAPISourcePrototype(name) {\n var _this = this;\n var allHooks = [\n 'add',\n 'init',\n 'get',\n 'all',\n 'clearCache',\n 'remove',\n 'unlink',\n 'unlinkReflection',\n 'link',\n 'linkReflection',\n 'update',\n 'refresh',\n 'include'\n ];\n\n _this.name = name;\n _this.state = {};\n\n _this.beginHooks = {};\n _this.beforeHooks = {};\n _this.synchronizationHooks = {};\n _this.afterHooks = {};\n _this.finishHooks = {};\n\n _this.options = {};\n\n angular.forEach(allHooks, function(hookName) {\n _this.beginHooks[hookName] = [];\n _this.beforeHooks[hookName] = [];\n _this.synchronizationHooks[hookName] = [];\n _this.afterHooks[hookName] = [];\n _this.finishHooks[hookName] = [];\n _this.state[hookName] = {\n loading: false,\n success: true\n };\n });\n }\n\n function begin(action, callback) {\n var _this = this;\n\n _this.beginHooks[action].push(callback);\n }\n\n function finish(action, callback) {\n var _this = this;\n\n _this.finishHooks[action].push(callback);\n }\n\n function beforeSynchro(action, callback) {\n var _this = this;\n\n _this.beforeHooks[action].push(callback);\n }\n\n function afterSynchro(action, callback) {\n var _this = this;\n\n _this.afterHooks[action].push(callback);\n }\n\n function synchronization(action, callback) {\n var _this = this;\n\n _this.synchronizationHooks[action].push(callback);\n }\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper);\n\n function AngularJsonAPISchemaWrapper(\n $log,\n pluralize,\n uuid4,\n AngularJsonAPISchemaLink\n ) {\n\n return {\n create: AngularJsonAPISchemaFactory\n };\n\n function AngularJsonAPISchemaFactory(schema) {\n return new AngularJsonAPISchema(schema);\n }\n\n function AngularJsonAPISchema(schema) {\n var _this = this;\n var include = schema.include || {};\n schema.include = include;\n include.get = schema.include.get || [];\n include.all = schema.include.all || [];\n\n _this.params = {\n get: {},\n all: {}\n };\n\n if (schema.id === 'uuid4') {\n schema.id = uuid4;\n } else if (schema.id === 'int') {\n schema.id = {\n generate: angular.noop,\n validate: angular.isNumber\n };\n } else if (angular.isObject(schema.id)) {\n if (!angular.isFunction(schema.id.generate)) {\n schema.id.generate = angular.noop;\n }\n } else {\n schema.id = {\n generate: angular.noop,\n validate: angular.identity.bind(null, true)\n };\n }\n\n angular.forEach(schema.relationships, function(linkSchema, linkName) {\n var linkSchemaObj = AngularJsonAPISchemaLink.create(linkSchema, linkName, schema.type);\n schema.relationships[linkName] = linkSchemaObj;\n if (linkSchemaObj.included === true) {\n include.get.push(linkName);\n if (linkSchemaObj.type === 'hasOne') {\n include.all.push(linkName);\n }\n }\n });\n\n angular.extend(_this, schema);\n\n if (include.get.length > 0) {\n _this.params.get.include = include.get;\n }\n\n if (include.all.length > 0) {\n _this.params.all.include = include.all;\n }\n }\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink);\n\n function AngularJsonAPILinkSchrapperLink($log, pluralize) {\n\n return {\n create: AngularJsonAPISchemaLinkFactory\n };\n\n function AngularJsonAPISchemaLinkFactory(linkSchema, linkName, type) {\n return new AngularJsonAPISchemaLink(linkSchema, linkName, type);\n }\n\n function AngularJsonAPISchemaLink(linkSchema, linkName, type) {\n var _this = this;\n\n if (angular.isString(linkSchema)) {\n _this.model = pluralize.plural(linkName);\n _this.type = linkSchema;\n _this.polymorphic = false;\n _this.reflection = type;\n } else {\n if (linkSchema.type === undefined) {\n $log.error('Schema of link without a type: ', linkSchema, linkName);\n }\n\n if (linkSchema.type !== 'hasMany' && linkSchema.type !== 'hasOne') {\n $log.error('Schema of link with wrong type: ', linkSchema.type, 'available: hasOne, hasMany');\n }\n\n _this.model = linkSchema.model || pluralize.plural(linkName);\n _this.type = linkSchema.type;\n _this.polymorphic = linkSchema.polymorphic || false;\n\n if (linkSchema.reflection === undefined) {\n _this.reflection = _this.type === 'hasMany' ? pluralize.singular(type) : type;\n } else {\n _this.reflection = linkSchema.reflection;\n }\n\n _this.included = linkSchema.included || false;\n }\n }\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper);\n\n function AngularJsonAPIResourceWrapper(\n AngularJsonAPIModel,\n AngularJsonAPISchema,\n AngularJsonAPIResourceCache,\n AngularJsonAPICollection,\n $rootScope,\n $log,\n $q\n ) {\n AngularJsonAPIResource.prototype.get = get;\n AngularJsonAPIResource.prototype.all = all;\n AngularJsonAPIResource.prototype.remove = remove;\n AngularJsonAPIResource.prototype.initialize = initialize;\n\n AngularJsonAPIResource.prototype.clearCache = clearCache;\n\n return {\n create: AngularJsonAPIResourceFactory\n };\n\n function AngularJsonAPIResourceFactory(schema, synchronizer) {\n return new AngularJsonAPIResource(schema, synchronizer);\n }\n\n /**\n * AngularJsonAPIResource constructor\n * @param {json} schema Schema object\n * @param {AngularJsonAPISynchronizer} synchronizer Synchronizer for the resource\n */\n function AngularJsonAPIResource(schema, synchronizer) {\n var _this = this;\n var config = {\n action: 'init'\n };\n\n _this.schema = AngularJsonAPISchema.create(schema);\n _this.cache = AngularJsonAPIResourceCache.create(_this);\n\n _this.synchronizer = synchronizer;\n _this.synchronizer.resource = _this;\n\n _this.modelFactory = AngularJsonAPIModel.modelFactory(\n _this.schema,\n _this\n );\n\n _this.initialized = false;\n _this.type = _this.schema.type;\n\n synchronizer.resource = _this;\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'resolved', response);\n _this.cache.fromJson(response.data);\n _this.initialized = true;\n\n response.finish();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'rejected', response);\n response.finish();\n _this.initialized = true;\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'notify', response);\n }\n }\n\n /**\n * Get request\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id, synchronized\n */\n function get(id, params) {\n var _this = this;\n\n if (!_this.schema.id.validate(id)) {\n return $q.reject({errors: [{status: 0, statusText: 'Invalid id'}]});\n }\n\n var object = _this.cache.get(id);\n\n object.promise = object.refresh(params);\n\n return object;\n }\n\n /**\n * All request\n * @param {object} params Object associated with params (for filters/pagination etc.)\n * @return {AngularJsonAPICollection} Collection of AngularJsonAPIModel, synchronized\n */\n function all(params) {\n var _this = this;\n params = angular.extend({}, _this.schema.params.all, params);\n\n var collection = AngularJsonAPICollection.create(\n _this,\n params\n );\n\n collection.promise = collection.fetch();\n\n return collection;\n }\n\n /**\n * Remove request\n * @param {uuid} id\n * @return {promise} Promise associated with the synchronization, in case of\n * fail object is reverted to previous state\n */\n function remove(id) {\n var _this = this;\n var object = _this.cache.remove(id);\n\n return object.remove();\n }\n\n /**\n * Initialize new AngularJsonAPIModel\n * @return {AngularJsonAPIModel} New model\n */\n function initialize() {\n var _this = this;\n var relationships = {};\n\n angular.forEach(_this.schema.relationships, function(relationshipSchema, relationshipName) {\n if (relationshipSchema.type === 'hasOne') {\n relationships[relationshipName] = {\n data: null\n };\n } else if (relationshipSchema.type === 'hasMany') {\n relationships[relationshipName] = {\n data: []\n };\n }\n });\n\n var data = {\n type: _this.type,\n id: _this.schema.id.generate(),\n attributes: {},\n relationships: relationships\n };\n\n var config = {\n new: true,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: false\n };\n\n var object = _this.modelFactory(data, config);\n\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:initialize', 'resolved', object);\n\n return object;\n }\n\n /**\n * Clears localy saved data\n * @return {promise} Promise associated with the synchronization resolves to nothing\n */\n function clearCache() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: 'clearCache'\n };\n\n _this.cache.clear();\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n return deferred;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.resolve(response);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.reject(response);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'notify', response);\n\n deferred.notify(response);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModel', AngularJsonAPIModel);\n\n function AngularJsonAPIModel(\n AngularJsonAPIAbstractModel,\n AngularJsonAPISchema,\n namedFunction,\n pluralize,\n $log\n ) {\n\n return {\n modelFactory: createModelFactory\n };\n\n function createModelFactory(schemaObj, resource) {\n var constructorName = pluralize.plural(schemaObj.type, 1);\n\n var Model = namedFunction(constructorName, function(data, config, updatedAt) {\n var _this = this;\n\n if (data.type !== _this.schema.type) {\n $log.error('Data type other then declared in schema: ', data.type, ' instead of ', _this.schema.type);\n }\n\n AngularJsonAPIAbstractModel.call(_this, data, config, updatedAt);\n\n _this.form.parent = _this;\n });\n\n Model.prototype = Object.create(AngularJsonAPIAbstractModel.prototype);\n Model.prototype.constructor = Model;\n\n Model.prototype.schema = schemaObj;\n Model.prototype.resource = resource;\n Model.prototype.synchronize = resource.synchronizer.synchronize.bind(resource.synchronizer);\n\n angular.forEach(schemaObj.functions, function(metaFunction, metaFunctionName) {\n Model.prototype[metaFunctionName] = function() {\n return metaFunction.apply(this, arguments);\n };\n });\n\n return modelFactory;\n\n function modelFactory(data, updatedAt, isNew) {\n return new Model(data, updatedAt, isNew);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper);\n\n function AngularJsonAPICollectionWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelErrorsManager,\n $rootScope,\n $injector,\n $q\n ) {\n\n AngularJsonAPICollection.prototype.fetch = fetch;\n AngularJsonAPICollection.prototype.refresh = fetch;\n AngularJsonAPICollection.prototype.get = get;\n AngularJsonAPICollection.prototype.hasErrors = hasErrors;\n\n return {\n create: AngularJsonAPICollectionFactory\n };\n\n function AngularJsonAPICollectionFactory(resource, params) {\n return new AngularJsonAPICollection(resource, params);\n }\n\n /**\n * Constructor\n * @param {AngularJsonAPIResource} resource Factory associated with the collection\n * @param {object} params Params associated with this resource (such as filters)\n */\n function AngularJsonAPICollection(resource, params) {\n var _this = this;\n\n _this.resource = resource;\n _this.type = resource.schema.type;\n _this.params = params || {};\n\n _this.errors = {\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.data = _this.resource.cache.index(_this.params);\n\n _this.loading = false;\n _this.loadingCount = 0;\n _this.synchronized = false;\n _this.pristine = _this.data === undefined;\n\n _this.promise = $q.resolve(_this);\n\n var onObjectRemove = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:remove', remove);\n var onFactoryClear = $rootScope.$on('angularJsonAPI:' + _this.type + ':resource:clearCache', clear);\n var onObjectAdd = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:add', add);\n\n $rootScope.$on('$destroy', clearWatchers);\n\n function remove(event, status, object) {\n var index;\n\n if (status === 'resolved' && _this.data !== undefined) {\n index = _this.data.indexOf(object);\n if (index > -1) {\n _this.data.splice(index, 1);\n _this.resource.cache.setIndexIds(_this.data);\n }\n }\n }\n\n function clear() {\n _this.data = undefined;\n _this.pristine = true;\n }\n\n function add(event, status, object) {\n if (status === 'resolved') {\n _this.data = _this.data || [];\n _this.data.push(object);\n }\n }\n\n function clearWatchers() {\n onObjectRemove();\n onFactoryClear();\n onObjectAdd();\n }\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /**\n * Shortcut to this.resource.get\n * @param {string} id Id of object]\n * @return {AngularJsonAPIModel} Model with id\n */\n function get(id, params) {\n var _this = this;\n\n return _this.resource.get(id, params);\n }\n\n /**\n * Synchronizes collection with the server\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function fetch() {\n var _this = this;\n var deferred = $q.defer();\n var $jsonapi = $injector.get('$jsonapi');\n var config = {\n action: 'all',\n params: _this.params\n };\n\n __incrementLoadingCounter(_this);\n\n angular.forEach(_this.data, __incrementLoadingCounter);\n\n _this.resource.synchronizer.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n\n _this.data = results.data;\n _this.links = response.data.links;\n\n _this.updatedAt = Date.now();\n _this.synchronized = true;\n _this.pristine = false;\n\n _this.resource.cache.setIndexIds(_this.data);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'rejected', _this, response);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n }\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .provider('$jsonapi', jsonapiProvider);\n\n function jsonapiProvider(validateJS) {\n var memory = {};\n var names = [];\n this.$get = jsonapiFactory;\n\n function jsonapiFactory(\n $log,\n AngularJsonAPIResource,\n AngularJsonAPISynchronizerSimple\n ) {\n return {\n addResource: addResource,\n getResource: getResource,\n clearCache: clearCache,\n allResources: allResources,\n listResources: listResources,\n addValidator: addValidator,\n synchronizerSimple: AngularJsonAPISynchronizerSimple,\n\n __proccesResults: __proccesResults\n };\n\n function addResource(schema, synchronizer) {\n var resource = AngularJsonAPIResource.create(schema, synchronizer);\n\n memory[schema.type] = resource;\n names.push(schema.type);\n }\n\n function getResource(type) {\n return memory[type];\n }\n\n function allResources() {\n return memory;\n }\n\n function listResources() {\n return names;\n }\n\n function clearCache() {\n angular.forEach(memory, function(resource) {\n resource.clearCache();\n });\n }\n\n function addValidator(name, validator) {\n if (!angular.isString(name)) {\n $log.error('Validator name is not a string', name);\n return;\n } else if (validateJS.validators[name] === undefined) {\n $log.warn('Redeclaring validator', name);\n }\n\n validateJS.validators[name] = validator;\n }\n\n function __proccesResults(results) {\n var objects = {\n data: [],\n included: []\n };\n\n if (results === undefined) {\n $log.error('Can\\'t proccess results:', results);\n return;\n }\n\n var config = {\n new: false,\n synchronized: true,\n stable: true,\n pristine: false,\n initialization: false\n };\n\n angular.forEach(results.included, function(data) {\n objects.included.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n\n if (angular.isArray(results.data)) {\n angular.forEach(results.data, function(data) {\n objects.data.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n } else if (results.data !== undefined) {\n objects.data.push(getResource(results.data.type).cache.addOrUpdate(results.data, config));\n }\n\n return objects;\n }\n }\n }\n\n})();\n\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(function($logProvider) {\n $logProvider.debugEnabled(false);\n })\n .run(function(validateJS, $q) {\n validateJS.Promise = $q;\n });\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["scripts/lib-f2c7ec66be.js"],"names":["angular","module","AngularJsonAPISourceRestWrapper","AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http","AngularJsonAPISourceRestFactory","name","url","AngularJsonAPISourceRest","all","config","method","headers","params","encodeParams","then","resolveHttp","rejectHttp","bind","get","object","data","id","remove","unlink","deferred","defer","schema","relationships","key","removed","reject","create","_this","undefined","target","type","resolve","promise","link","errors","status","statusText","toLinkData","update","form","toJson","add","response","action","rejectServerOffline","rejectNoConnection","this","Accept","Content-Type","apply","arguments","synchronization","encodeValue","argument","isArray","join","encodedParams","forEach","paramValue","paramKey","isObject","paramInnerValue","paramInnerKey","decodeParams","decodedParams","value","objectKeyStart","indexOf","split","objectKey","substr","objectElementKey","prototype","Object","constructor","factory","$inject","provide","$provide","decorator","$delegate","$jsonapi","sourceRest","constant","Parse","AngularJsonAPISourceParseWrapper","pluralize","$log","AngularJsonAPISourceParseFactory","table","AngularJsonAPISourceParse","query","Query","ParseObject","limit","filter","equalTo","find","resolveParse","rejectParse","set","destroy","toParseObject","save","parseObject","attributes","attribute","relationship","charAt","toUpperCase","slice","parsePointer","extend","fromParseObject","synchronizer","resource","model","elem","error","toLowerCase","initialize","appId","jsKey","sourceLocal","AngularJsonAPISourceLocalWrapper","$window","AngularJsonAPISourceLocalFactory","prefix","AngularJsonAPISourceLocal","init","localStorage","getItem","clear","size","list","max","objectMaxKey","fraction","removeItem","updateStorage","cache","json","length","setItem","keys","reduce","m","k","__updateStorage","begin","finish","validate","AngularJsonAPIResourceCacheWrapper","uuid4","AngularJsonAPIResourceCacheFactory","AngularJsonAPIResourceCache","indexIds","addOrUpdate","validatedData","updatedAt","modelFactory","initialization","fromJson","collection","new","synchronized","stable","pristine","objectData","hasErrors","push","index","filterParams","valid","constraint","map","setIndexIds","array","element","isString","revertRemove","clearRemoved","oneWay","polymorphic","__addHasMany","__processAddHasMany","__addHasOne","__processAddHasOne","__removeHasMany","__processRemove","reflectionSchema","reflectionKey","reflection","__swapResults","__wrapResults","oldReflectionSchema","oldReflection","result","__removeHasOne","debug","reset","linkData","splice","newValue","item","i","service","AngularJsonAPIModelFormWrapper","AngularJsonAPIModelValidationError","validateJS","AngularJsonAPIModelFormFactory","parent","AngularJsonAPIModelForm","copy","auto","validator","validation","errorsMap","attributesWrapper","constraintsWrapper","async","AngularJsonAPIAbstractModelWrapper","AngularJsonAPIModelErrorsManager","$rootScope","$injector","AngularJsonAPIAbstractModel","loading","saving","Date","now","loadingCount","savingCount","__setData","synchronize","notify","$emit","concat","meta","__decrementSavingCounter","__incrementSavingCounter","refresh","synchronizeIncluded","__incrementLoadingCounter","__decrementLoadingCounter","resolveIncluded","includedResponse","operation","success","results","included","__proccesResults","allSettled","unlinkAll","removeLink","linksObj","removeReflectionLink","resolveReflection","targets","answer","setAttributes","validators","setRelationships","relationshipData","links","linkOne","unlinkOne","getResource","AngularJsonAPIModelValidationErrorWrapper","ValidationErrorFactory","message","ValidationError","context","Error","AngularJsonAPIModelSourceErrorWrapper","SourceErrorFactory","source","code","SourceError","AngularJsonAPIModelErrorsManagerWrapper","ErrorsManagerFactory","description","ErrorConstructor","defaultFilter","ErrorsManager","obj","namedFunction","fn","Function","propertyName","callback","done","defineProperty","call","enumerable","configurable","str","replace","promises","resolvedCallback","rejectedCallback","wrap","isFunction","reason","wrapped","hasOwnProperty","AngularJsonAPISynchronizerSimpleWrapper","AngularJsonAPISynchronizerPrototype","AngularJsonAPISynchronizerSimpleFactory","sources","AngularJsonAPISynchronizerSimple","state","step","resolved","afterHooks","hook","finishHooks","rejected","noop","beginHooks","beforeHooks","synchronizationHooks","AngularJsonAPISynchronizerPrototypeWrapper","AngularJsonAPISourcePrototypeWrapper","allHooks","options","hookName","beforeSynchro","afterSynchro","before","after","AngularJsonAPISchemaWrapper","AngularJsonAPISchemaLink","AngularJsonAPISchemaFactory","AngularJsonAPISchema","include","generate","isNumber","identity","linkSchema","linkName","linkSchemaObj","AngularJsonAPILinkSchrapperLink","AngularJsonAPISchemaLinkFactory","plural","singular","AngularJsonAPIResourceWrapper","AngularJsonAPIModel","AngularJsonAPICollection","AngularJsonAPIResourceFactory","AngularJsonAPIResource","initialized","fetch","relationshipSchema","relationshipName","clearCache","createModelFactory","schemaObj","isNew","Model","constructorName","functions","metaFunction","metaFunctionName","AngularJsonAPICollectionWrapper","AngularJsonAPICollectionFactory","event","clearWatchers","onObjectRemove","onFactoryClear","onObjectAdd","$on","jsonapiProvider","jsonapiFactory","addResource","memory","names","allResources","listResources","addValidator","warn","objects","synchronizerSimple","$get","provider","$logProvider","debugEnabled","run","Promise"],"mappings":"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","file":"scripts/lib-f2c7ec66be.js","sourcesContent":["(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest', ['angular-jsonapi']);\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper);\n\n function AngularJsonAPISourceRestWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n toKebabCase,\n $q,\n $http\n ) {\n\n AngularJsonAPISourceRest.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceRest.prototype.constructor = AngularJsonAPISourceRest;\n\n return {\n create: AngularJsonAPISourceRestFactory,\n encodeParams: encodeParams,\n decodeParams: decodeParams\n };\n\n function AngularJsonAPISourceRestFactory(name, url) {\n return new AngularJsonAPISourceRest(name, url);\n }\n\n function AngularJsonAPISourceRest(name, url) {\n var _this = this;\n var headers = { // jscs:disable disallowQuotedKeysInObjects\n 'Accept': 'application/vnd.api+json',\n 'Content-Type': 'application/vnd.api+json'\n }; // jscs:enable disallowQuotedKeysInObjects\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('unlink', unlink);\n _this.synchronization('link', link);\n _this.synchronization('update', update);\n _this.synchronization('add', add);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'all'));\n }\n\n function get(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url + '/' + config.object.data.id,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'get'));\n }\n\n function remove(config) {\n return $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'remove'));\n }\n\n function unlink(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Object has been removed', _this, 0, 'unlink'));\n } else if (config.target !== undefined && config.target.data.id === undefined) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Can\\'t unlink object without id through rest call', _this, 0, 'unlink'));\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'get')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n if (config.target === undefined) {\n $http({\n method: 'PATCH',\n headers: headers,\n data: {data: []},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n } else {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key + '/' + config.target.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n }\n }\n\n return deferred.promise;\n }\n\n function link(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject({errors: [{status: 0, statusText: 'Object has been removed'}]});\n } else if (config.target === undefined || config.target.data.id === undefined) {\n deferred.reject({errors: [{status: 0, statusText: 'Can\\'t link object without id through rest call'}]});\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'PATCH',\n headers: headers,\n data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n $http({\n method: 'POST',\n headers: headers,\n data: {data: [AngularJsonAPIModelLinkerService.toLinkData(config.target)]},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n }\n\n return deferred.promise;\n }\n\n function update(config) {\n return $http({\n method: 'PATCH',\n headers: headers,\n url: url + '/' + config.object.data.id,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'update'));\n }\n\n function add(config) {\n return $http({\n method: 'POST',\n headers: headers,\n url: url,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'add'));\n }\n\n function resolveHttp(response) {\n return $q.resolve(response.data);\n }\n\n function rejectHttp(action, response) {\n var deferred = $q.defer();\n\n if (response.status === 0) {\n $http({\n method: 'GET',\n url: 'https://status.cloud.google.com/incidents.schema.json'\n }).then(rejectServerOffline, rejectNoConnection);\n } else {\n deferred.reject(AngularJsonAPIModelSourceError.create(response.statusText, _this, response.status, action));\n }\n\n return deferred.promise;\n\n function rejectServerOffline(response) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Server is offline', _this, response.status, action));\n }\n\n function rejectNoConnection() {\n deferred.reject(AngularJsonAPIModelSourceError.create('No internet connection', _this, response.status, action));\n }\n }\n }\n\n function encodeParams(params) {\n var encodedParams = {};\n\n if (params === undefined) {\n return {};\n }\n\n angular.forEach(params, function(paramValue, paramKey) {\n if (angular.isArray(paramValue)) {\n encodedParams[paramKey] = encodeValue(paramValue);\n } else if (angular.isObject(paramValue)) {\n angular.forEach(paramValue, function(paramInnerValue, paramInnerKey) {\n encodedParams[paramKey + '[' + paramInnerKey + ']'] = encodeValue(paramInnerValue);\n });\n } else {\n encodedParams[paramKey] = paramValue;\n }\n });\n\n return encodedParams;\n\n function encodeValue(argument) {\n if (angular.isArray(argument)) {\n return argument.join(',');\n } else {\n return argument;\n }\n }\n }\n\n function decodeParams(params) {\n var decodedParams = {};\n\n angular.forEach(params, function(value, key) {\n var objectKeyStart = key.indexOf('[');\n value = value.split(',');\n\n if (objectKeyStart > -1) {\n var objectKey = key.substr(0, objectKeyStart);\n var objectElementKey = key.substr(objectKeyStart + 1, key.indexOf(']') - objectKeyStart - 1);\n\n decodedParams[objectKey] = decodedParams[objectKey] || {};\n decodedParams[objectKey][objectElementKey] = value;\n } else {\n decodedParams[key] = value;\n }\n });\n\n return decodedParams;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceRest) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceRest = AngularJsonAPISourceRest;\n\n return $jsonapi;\n }\n})();\n\n(function() {\n 'use strict';\n\n /* global Parse: false */\n angular.module('angular-jsonapi-parse', ['angular-jsonapi'])\n .constant('Parse', Parse);\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper);\n\n function AngularJsonAPISourceParseWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n pluralize,\n Parse,\n $log,\n $q\n ) {\n\n AngularJsonAPISourceParse.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceParse.prototype.constructor = AngularJsonAPISourceParse;\n AngularJsonAPISourceParse.prototype.initialize = initialize;\n\n return {\n create: AngularJsonAPISourceParseFactory\n };\n\n function AngularJsonAPISourceParseFactory(name, table) {\n return new AngularJsonAPISourceParse(name, table);\n }\n\n function AngularJsonAPISourceParse(name, table) {\n var _this = this;\n\n _this.ParseObject = Parse.Object.extend(table);\n _this.type = pluralize(table).charAt(0).toLowerCase() + pluralize(table).slice(1);\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('update', update);\n _this.synchronization('add', update);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n var query = new Parse.Query(_this.ParseObject);\n\n if (config.params.limit !== undefined) {\n query.limit(config.params.limit);\n }\n\n angular.forEach(config.params.filter, function(filter) {\n query.equalTo(filter.key, filter.value);\n });\n\n return query.find().then(resolveParse, rejectParse.bind(null, 'all'));\n }\n\n function get(config) {\n var query = new Parse.Query(_this.ParseObject);\n return query.get(config.object.data.id).then(resolveParse, rejectParse.bind(null, 'get'));\n }\n\n function remove(config) {\n var object = new _this.ParseObject();\n object.set('id', config.object.data.id);\n return object.destroy().then(resolveParse, rejectParse.bind(null, 'remove'));\n }\n\n function update(config) {\n var object = toParseObject(config.object);\n return object.save(null).then(resolveParse, rejectParse.bind(null, 'update'));\n }\n\n function toParseObject(object) {\n var parseObject = new _this.ParseObject();\n angular.forEach(object.form.data.attributes, function(attribute, key) {\n parseObject.set(key, attribute);\n });\n\n angular.forEach(object.schema.relationships, function(relationship, key) {\n if (relationship.type === 'hasOne'\n && object.form.data.relationships[key].data !== null\n && object.form.data.relationships[key].data !== undefined\n ) {\n var table = pluralize(key, 1).charAt(0).toUpperCase() + pluralize(key, 1).slice(1);\n var parsePointer = new (Parse.Object.extend(table))();\n parsePointer.set('id', object.form.data.relationships[key].data.id);\n parseObject.set(key, parsePointer);\n }\n });\n\n return parseObject;\n }\n\n function fromParseObject(object) {\n var relationships = _this.synchronizer.resource.schema.relationships;\n object.type = _this.type;\n object.relationships = object.relationships || [];\n angular.forEach(relationships, function(relationship, key) {\n if (object.attributes[key] && relationship.type === 'hasOne') {\n object.relationships[key] = {\n data: {\n type: relationship.model,\n id: object.attributes[key].id\n }\n };\n }\n });\n\n return object;\n }\n\n function resolveParse(response) {\n if (angular.isArray(response)) {\n angular.forEach(response, function(elem, key) {\n response[key] = fromParseObject(elem);\n });\n } else if (angular.isObject(response)) {\n response = fromParseObject(response);\n }\n\n return $q.resolve({\n data: response\n });\n }\n\n function rejectParse(action, response) {\n $log.error('Parse error for', action, response);\n return $q.reject(response);\n }\n }\n\n function initialize(appId, jsKey) {\n Parse.initialize(appId, jsKey);\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceParse) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceParse;\n\n return $jsonapi;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local', ['angular-jsonapi']);\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper);\n\n function AngularJsonAPISourceLocalWrapper(\n AngularJsonAPISourcePrototype,\n $window,\n $q\n ) {\n var size = {\n max: 0,\n all: 0,\n limit: 5200000,\n list: {}\n };\n\n AngularJsonAPISourceLocal.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceLocal.prototype.constructor = AngularJsonAPISourceLocal;\n\n return {\n create: AngularJsonAPISourceLocalFactory,\n size: size\n };\n\n function AngularJsonAPISourceLocalFactory(name, prefix) {\n return new AngularJsonAPISourceLocal(name, prefix);\n }\n\n function AngularJsonAPISourceLocal(name, prefix) {\n var _this = this;\n\n prefix = prefix || 'AngularJsonAPI';\n\n _this.__updateStorage = updateStorage;\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('init', init);\n\n _this.begin('clearCache', clear);\n\n _this.finish('init', updateStorage);\n _this.finish('clearCache', updateStorage);\n _this.finish('remove', updateStorage);\n _this.finish('refresh', updateStorage);\n _this.finish('unlink', updateStorage);\n _this.finish('unlinkReflection', updateStorage);\n _this.finish('link', updateStorage);\n _this.finish('linkReflection', updateStorage);\n _this.finish('update', updateStorage);\n _this.finish('add', updateStorage);\n _this.finish('get', updateStorage);\n _this.finish('all', updateStorage);\n _this.finish('include', updateStorage);\n\n function init() {\n var type = _this.synchronizer.resource.schema.type;\n return $q.resolve($window.localStorage.getItem(prefix + '.' + type));\n }\n\n function clear() {\n var type = _this.synchronizer.resource.schema.type;\n var key = prefix + '.' + type;\n\n size.all -= size.list[key];\n delete size.list[key];\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.removeItem(key);\n }\n\n function updateStorage() {\n var type = _this.synchronizer.resource.schema.type;\n var cache = _this.synchronizer.resource.cache;\n var json = cache.toJson();\n var key = prefix + '.' + type;\n\n size.list[key] = size.list[key] === undefined ? 0 : size.list[key];\n size.all += json.length - size.list[key];\n size.list[key] = json.length;\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.setItem(key, json);\n }\n\n function objectMaxKey(object) {\n return Object.keys(object).reduce(function(m, k) {\n return object[k] > object[m] ? k : m;\n }, Object.keys(object)[0]);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceLocal) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceLocal;\n\n return $jsonapi;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi', ['uuid4'])\n /* global pluralize: false, validate: false */\n .constant('pluralize', pluralize)\n .constant('validateJS', validate);\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper);\n\n function AngularJsonAPIResourceCacheWrapper(\n uuid4,\n $log\n ) {\n\n AngularJsonAPIResourceCache.prototype.get = get;\n AngularJsonAPIResourceCache.prototype.index = index;\n AngularJsonAPIResourceCache.prototype.setIndexIds = setIndexIds;\n AngularJsonAPIResourceCache.prototype.addOrUpdate = addOrUpdate;\n\n AngularJsonAPIResourceCache.prototype.fromJson = fromJson;\n AngularJsonAPIResourceCache.prototype.toJson = toJson;\n AngularJsonAPIResourceCache.prototype.clear = clear;\n\n AngularJsonAPIResourceCache.prototype.remove = remove;\n AngularJsonAPIResourceCache.prototype.revertRemove = revertRemove;\n AngularJsonAPIResourceCache.prototype.clearRemoved = clearRemoved;\n\n return {\n create: AngularJsonAPIResourceCacheFactory\n };\n\n function AngularJsonAPIResourceCacheFactory(resource) {\n return new AngularJsonAPIResourceCache(resource);\n }\n\n /**\n * Constructor\n */\n function AngularJsonAPIResourceCache(resource) {\n var _this = this;\n\n _this.resource = resource;\n _this.data = {};\n _this.removed = {};\n _this.size = 0;\n\n _this.indexIds = undefined;\n }\n\n /**\n * Add new model or update existing with data\n * @param {object} validatedData Data that are used to update or create an object, has to be valid\n * @return {AngularJsonAPIModel} Created model\n */\n function addOrUpdate(validatedData, config, updatedAt) {\n var _this = this;\n var id = validatedData.id;\n\n if (id === undefined) {\n $log.error('Can\\'t add data without id!', validatedData);\n return;\n }\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(validatedData, config, updatedAt);\n _this.size += 1;\n } else {\n _this.data[id].update(validatedData, !config.new, config.initialization);\n }\n\n return _this.data[id];\n }\n\n\n /**\n * Recreate object structure from json data\n * @param {json} json Json data\n * @return {undefined}\n */\n function fromJson(json) {\n var _this = this;\n var collection = angular.fromJson(json);\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: true\n };\n\n if (angular.isObject(collection) && collection.data !== undefined) {\n _this.updatedAt = collection.updatedAt;\n _this.indexIds = collection.indexIds;\n\n angular.forEach(collection.data, function(objectData) {\n var data = objectData.data;\n _this.addOrUpdate(data, config, objectData.updatedAt);\n });\n }\n }\n\n /**\n * Encodes memory into json format\n * @return {json} Json encoded memory\n */\n function toJson() {\n var _this = this;\n var json = {\n data: [],\n updatedAt: _this.updatedAt,\n indexIds: _this.indexIds\n };\n\n angular.forEach(_this.data, function(object) {\n if (object.hasErrors() === false) {\n json.data.push(object.toJson());\n }\n });\n\n return angular.toJson(json);\n }\n\n /**\n * Clear memory\n * @return {undefined}\n */\n function clear() {\n var _this = this;\n\n _this.indexIds = undefined;\n _this.data = {};\n _this.removed = {};\n }\n\n /**\n * Low level get used internally, does not run any synchronization\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function get(id) {\n var _this = this;\n\n var data = {\n id: id,\n type: _this.resource.schema.type\n };\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: true\n };\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(data, config);\n }\n\n return _this.data[id];\n }\n\n /**\n * Low level get used internally, does not run any synchronization, used for index requests\n * @param {objec} params\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function index(params) {\n var _this = this;\n params = params || {};\n\n if (_this.indexIds === undefined) {\n return _this.indexIds;\n }\n\n return _this.indexIds.map(_this.get.bind(_this)).filter(filter);\n\n function filter(argument) {\n var filterParams = params.filter;\n var valid = true;\n\n angular.forEach(filterParams, function(constraint) {\n valid = valid && argument.data.attributes[constraint.key] === constraint.value;\n });\n\n return valid;\n }\n }\n\n /**\n * Cache ids of objects returned by index request\n * @param {ids array or AngularJsonAPIModel array} array Objects or ids to be cached\n */\n function setIndexIds(array) {\n var _this = this;\n\n _this.indexIds = [];\n\n angular.forEach(array, function(element) {\n if (angular.isString(element) && _this.resource.schema.id.validate(element)) {\n _this.indexIds.push(element);\n } else if (angular.isObject(element) && _this.resource.schema.id.validate(element.data.id)) {\n _this.indexIds.push(element.data.id);\n }\n });\n }\n\n /**\n * Remove object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function remove(id) {\n var _this = this;\n\n if (_this.data[id] !== undefined) {\n _this.removed[id] = _this.data[id];\n delete _this.data[id];\n _this.size -= 1;\n }\n\n return _this.removed[id];\n }\n\n /**\n * Revert removal of an object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function revertRemove(id) {\n var _this = this;\n\n if (_this.removed[id] !== undefined) {\n _this.data[id] = _this.removed[id];\n delete _this.removed[id];\n _this.size += 1;\n }\n\n return _this.data[id];\n }\n\n /**\n * Clear removed object from memory\n * @param {uuid} id\n * @return {undefined}\n */\n function clearRemoved(id) {\n var _this = this;\n\n delete _this.removed[id];\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService);\n\n function AngularJsonAPIModelLinkerService($log) {\n var _this = this;\n\n _this.toLinkData = toLinkData;\n\n _this.link = link;\n _this.unlink = unlink;\n\n return this;\n\n /**\n * Extracts data needed for relationship linking from object\n * @param {AngularJsonAPIModel} object Object\n * @return {json} Link data\n */\n function toLinkData(object) {\n if (object === null) {\n return null;\n }\n\n return {type: object.data.type, id: object.data.id};\n }\n\n /**\n * Add target to object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function link(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t add link to non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (target === undefined) {\n $log.error('Can\\'t link non existing object', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema === undefined) {\n $log.error('Can\\'t add link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (target !== null && schema.polymorphic === false && schema.model !== target.data.type) {\n $log.error('This relation is not polymorphic, expected: ' + schema.model + ' instead of ' + target.data.type);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema.type === 'hasMany') {\n if (oneWay === true) {\n __addHasMany(object, key, target, form);\n return [];\n } else {\n return __processAddHasMany(object, key, target, form);\n }\n } else if (schema.type === 'hasOne') {\n if (oneWay === true) {\n __addHasOne(object, key, target, form);\n return [];\n } else {\n return __processAddHasOne(object, key, target, form);\n }\n }\n }\n\n /**\n * Remove target from object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function unlink(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t remove link from non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (schema === undefined) {\n $log.error('Can\\'t remove link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (oneWay === true) {\n __removeHasMany(object, key, target, form);\n return [];\n } else {\n return __processRemove(object, key, target, form);\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __processAddHasMany(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var reflectionSchema;\n\n if (reflectionKey === false) {\n __addHasMany(object, key, target, form);\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema === undefined) {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n } else if (reflectionSchema.type === 'hasOne') {\n return __swapResults(\n __wrapResults(object, key, target),\n __wrapResults(target, reflectionKey, object),\n __processAddHasOne(target, reflectionKey, object, form)\n );\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(object, key, target, form);\n __addHasMany(target, reflectionKey, object, form);\n return [__wrapResults(target, reflectionKey, object)];\n }\n }\n\n function __processAddHasOne(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var oldReflection = object.relationships[key];\n var reflectionSchema;\n var oldReflectionSchema;\n var result = [];\n\n __addHasOne(object, key, target, form);\n\n if (reflectionKey === false) {\n return [];\n }\n\n if (oldReflection !== undefined && oldReflection !== null) {\n oldReflectionSchema = oldReflection.schema.relationships[reflectionKey];\n\n if (oldReflectionSchema !== undefined) {\n if (oldReflectionSchema.type === 'hasOne') {\n __removeHasOne(oldReflection, reflectionKey, object, form);\n } else if (oldReflectionSchema.type === 'hasMany') {\n __removeHasMany(oldReflection, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(oldReflection, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n if (target !== undefined && target !== null && reflectionKey !== false) {\n reflectionSchema = target.schema.relationships[reflectionKey];\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __addHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(target, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(target, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n return result;\n }\n\n function __processRemove(object, key, target, form) {\n var schema = object.schema.relationships[key];\n var reflectionKey = schema.reflection;\n var reflectionSchema;\n\n if (schema.type === 'hasMany') {\n __removeHasMany(object, key, target, form);\n } else if (schema.type === 'hasOne') {\n __removeHasOne(object, key, target, form);\n }\n\n if (reflectionKey === false) {\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __removeHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __removeHasMany(target, reflectionKey, object, form);\n }\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n }\n\n return [__wrapResults(target, reflectionKey, object)];\n }\n\n function __addHasOne(object, key, target, form) {\n $log.debug('addHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n object.relationships[key] = target;\n object.data.relationships[key].data = toLinkData(target);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __addHasMany(object, key, target, form) {\n $log.debug('addHasMany', object, key, target);\n\n var linkData = toLinkData(target);\n if (form === true) {\n object = object.form;\n }\n\n if (angular.isArray(object.relationships[key]) && object.relationships[key].indexOf(target) > -1) {\n return false;\n }\n\n object.relationships[key] = object.relationships[key] || [];\n object.data.relationships[key].data = object.data.relationships[key].data || [];\n\n object.relationships[key].push(target);\n object.data.relationships[key].data.push(linkData);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasOne(object, key, target, form) {\n $log.debug('removeHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (target !== undefined && object.relationships[key] !== target) {\n return false;\n }\n\n object.relationships[key] = null;\n object.data.relationships[key].data = undefined;\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasMany(object, key, target, form) {\n $log.debug('removeHasMany', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (object.relationships[key] === undefined) {\n return;\n }\n\n if (target === undefined) {\n object.relationships[key] = [];\n object.data.relationships[key].data = [];\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n var index = object.relationships[key].indexOf(target);\n\n if (index === -1) {\n return false;\n }\n\n object.relationships[key].splice(index, 1);\n object.data.relationships[key].data.splice(index, 1);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __wrapResults(object, key, target) {\n return {\n object: object,\n key: key,\n target: target\n };\n }\n\n function __swapResults(value, newValue, array) {\n var index = -1;\n angular.forEach(array, function(item, i) {\n if (item.object === value.object && item.key === value.key && item.target === value.target) {\n index = i;\n }\n });\n\n if (index > -1) {\n array[index] = newValue;\n } else {\n array.push(newValue);\n }\n\n return array;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper);\n\n function AngularJsonAPIModelFormWrapper(\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelLinkerService,\n validateJS,\n $q\n ) {\n\n AngularJsonAPIModelForm.prototype.save = save;\n AngularJsonAPIModelForm.prototype.reset = reset;\n AngularJsonAPIModelForm.prototype.validate = validate;\n\n AngularJsonAPIModelForm.prototype.link = link;\n AngularJsonAPIModelForm.prototype.unlink = unlink;\n\n AngularJsonAPIModelForm.prototype.toJson = toJson;\n\n return {\n create: AngularJsonAPIModelFormFactory\n };\n\n function AngularJsonAPIModelFormFactory(parent) {\n return new AngularJsonAPIModelForm(parent);\n }\n\n function AngularJsonAPIModelForm(parent) {\n var _this = this;\n\n _this.data = {\n id: parent.data.id,\n type: parent.data.type,\n attributes: {},\n relationships: {}\n };\n\n _this.relationships = {};\n _this.parent = parent;\n _this.schema = parent.schema;\n _this.reset();\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = angular.copy(_this.data);\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data\n };\n }\n\n /**\n * Saves form, shortcut to parent.save()\n * @return {promise} Promise associated with synchronization\n */\n function save() {\n var _this = this;\n\n return _this.parent.save();\n }\n\n /**\n * Resets form to state of a parent\n * @return {undefined}\n */\n function reset(auto) {\n var _this = this;\n\n angular.forEach(_this.schema.relationships, function(data, key) {\n _this.data.relationships[key] = angular.copy(_this.parent.data.relationships[key]) || {};\n if (angular.isArray(_this.relationships[key])) {\n _this.relationships[key] = _this.parent.relationships[key].slice();\n } else {\n _this.relationships[key] = _this.parent.relationships[key];\n }\n });\n\n if (auto === true && _this.parent.synchronized === true) {\n return;\n }\n\n angular.forEach(_this.schema.attributes, function(validator, key) {\n _this.data.attributes[key] = angular.copy(_this.parent.data.attributes[key]);\n });\n\n _this.parent.errors.validation.clear();\n }\n\n /**\n * Validates form\n * @return {promise} Promise rejected to errors object indexed by keys. If the\n * key param i stated it only validates an attribute, else all attributes.\n */\n function validate(key) {\n var _this = this;\n var attributesWrapper;\n var constraintsWrapper;\n var deferred = $q.defer();\n\n if (key === undefined) {\n attributesWrapper = _this.data.attributes;\n constraintsWrapper = _this.schema.attributes;\n } else {\n attributesWrapper = {};\n constraintsWrapper = {};\n\n attributesWrapper[key] = _this.data.attributes[key];\n constraintsWrapper[key] = _this.schema.attributes[key];\n }\n\n validateJS.async(\n attributesWrapper,\n constraintsWrapper\n ).then(resolve, reject);\n\n function resolve() {\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n deferred.resolve();\n }\n\n function reject(errorsMap) {\n _this.parent.error = true;\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n angular.forEach(errorsMap, function(errors, attribute) {\n angular.forEach(errors, function(error) {\n _this.parent.errors.validation.add(attribute, AngularJsonAPIModelValidationError.create(error, attribute));\n });\n });\n\n deferred.reject(_this.parent.errors.validation);\n }\n\n return deferred.promise;\n }\n\n /**\n * Adds link to a form without synchronization\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function link(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.link(_this.parent, key, target, oneWay, true));\n }\n\n /**\n * Removes link from form without synchronization\n * @param {[type]} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function unlink(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true));\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper);\n\n function AngularJsonAPIAbstractModelWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelErrorsManager,\n AngularJsonAPIModelLinkerService,\n AngularJsonAPIModelForm,\n $rootScope,\n $injector,\n $log,\n $q\n ) {\n AngularJsonAPIAbstractModel.prototype.refresh = refresh;\n AngularJsonAPIAbstractModel.prototype.remove = remove;\n AngularJsonAPIAbstractModel.prototype.reset = reset;\n AngularJsonAPIAbstractModel.prototype.save = save;\n\n AngularJsonAPIAbstractModel.prototype.update = update;\n\n AngularJsonAPIAbstractModel.prototype.link = link;\n AngularJsonAPIAbstractModel.prototype.unlink = unlink;\n AngularJsonAPIAbstractModel.prototype.unlinkAll = unlinkAll;\n\n AngularJsonAPIAbstractModel.prototype.toJson = toJson;\n\n AngularJsonAPIAbstractModel.prototype.hasErrors = hasErrors;\n\n return AngularJsonAPIAbstractModel;\n\n /**\n * Constructor\n * @param {json} data Validated data used to create an object\n * @param {object} config Is object new (for form)\n */\n function AngularJsonAPIAbstractModel(data, config, updatedAt) {\n var _this = this;\n\n data.relationships = data.relationships || {};\n\n /**\n * Is not a new record\n * @type {Boolean}\n */\n _this.new = config.new === undefined ? false : config.new;\n\n /**\n * Is present on the server\n * @type {Boolean}\n */\n _this.stable = config.stable === undefined ? true : config.stable;\n\n /**\n * Has been synchronized with the server\n * @type {Boolean}\n */\n _this.synchronized = config.synchronized === undefined ? true : config.synchronized;\n\n /**\n * Has just been created by request and may not exist on the server\n * @type {Boolean}\n */\n _this.pristine = config.pristine === undefined ? true : config.pristine;\n\n _this.removed = false;\n _this.loading = false;\n _this.saving = false;\n _this.updatedAt = _this.synchronized === true ? Date.now() : updatedAt;\n\n _this.loadingCount = 0;\n _this.savingCount = 0;\n\n _this.data = {\n relationships: {},\n attributes: {}\n };\n _this.relationships = {};\n\n angular.forEach(_this.schema.relationships, function(schema, key) {\n _this.relationships[key] = undefined;\n });\n\n _this.errors = {\n validation: AngularJsonAPIModelErrorsManager.create(\n 'Validation',\n 'Errors of attributes validation',\n AngularJsonAPIModelValidationError\n ),\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.promise = $q.resolve(_this);\n\n __setData(_this, data);\n\n _this.form = AngularJsonAPIModelForm.create(_this);\n }\n\n /**\n * Saves model's form\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function save() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: _this.new === true ? 'add' : 'update',\n object: _this\n };\n\n _this.form.validate().then(\n synchronize,\n deferred.reject\n ).finally(__decrementSavingCounter.bind(_this, undefined));\n\n __incrementSavingCounter(_this);\n\n return deferred.promise;\n\n function synchronize() {\n _this.synchronize(config).then(resolve, reject, notify);\n }\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:' + config.action, 'resolved', _this, response);\n _this.update(response.data.data);\n\n if (_this.new === true) {\n _this.resource.cache.indexIds = _this.resource.cache.indexIds || [];\n _this.resource.cache.indexIds.push(_this.data.id);\n }\n\n _this.synchronized = true;\n _this.new = false;\n _this.pristine = false;\n _this.stable = true;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve(response.data.meta);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Reset object form\n * @return {undefined}\n */\n function reset() {\n var _this = this;\n\n if (_this.form !== undefined) {\n _this.form.reset();\n }\n }\n\n /**\n * Synchronize object with remote\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function refresh(params) {\n var $jsonapi = $injector.get('$jsonapi');\n var deferred = $q.defer();\n var _this = this;\n params = params === undefined ? _this.schema.params.get : params;\n\n var config = {\n action: 'refresh',\n object: _this,\n params: params\n };\n\n if (_this.new === true) {\n var error = AngularJsonAPIModelSourceError.create('Can\\'t refresh new object', null, 0, 'refresh');\n _this.errors.synchronization.add('refresh', error);\n deferred.reject(error);\n } else {\n __incrementLoadingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n _this.synchronized = true;\n _this.stable = true;\n _this.pristine = false;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = _this.data;\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data,\n updatedAt: _this.updatedAt\n };\n }\n\n /**\n * Remove object\n * @return {promise} Promise associated with synchronization that resolves to nothing\n */\n function remove() {\n var _this = this;\n var deferred = $q.defer();\n\n var config = {\n action: 'remove',\n object: _this\n };\n\n _this.resource.cache.remove(_this.data.id);\n\n if (_this.new === true) {\n deferred.resolve();\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'resolved', _this, response);\n _this.removed = true;\n _this.unlinkAll();\n _this.resource.cache.clearRemoved(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'rejected', _this, response);\n _this.resource.cache.revertRemove(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlink all reflection relationships of the object **without synchronization**\n * @return {boolean} Result\n */\n function unlinkAll(key) {\n var _this = this;\n var deferred = $q.defer();\n\n __incrementLoadingCounter(_this);\n\n if (key === undefined) {\n angular.forEach(_this.relationships, removeLink);\n } else {\n removeLink(_this.relationships[key], key);\n }\n\n __decrementLoadingCounter(_this);\n\n return deferred.promise;\n\n function removeLink(linksObj, key) {\n var schema = _this.schema.relationships[key];\n var reflectionKey = schema.reflection;\n\n if (angular.isArray(linksObj)) {\n angular.forEach(linksObj, removeReflectionLink.bind(undefined, reflectionKey));\n } else if (angular.isObject(linksObj)) {\n removeReflectionLink(reflectionKey, linksObj);\n }\n\n if (schema.type === 'hasOne') {\n _this.relationships[key] = null;\n } else if (schema.type === 'hasMany') {\n _this.relationships[key] = [];\n }\n }\n\n function removeReflectionLink(reflectionKey, target) {\n var reflectionSchema = target.schema.relationships[reflectionKey];\n var config = {\n action: 'unlinkReflection',\n object: target,\n target: _this,\n key: reflectionKey\n };\n\n __incrementLoadingCounter(target);\n AngularJsonAPIModelLinkerService.unlink(target, reflectionKey, _this, reflectionSchema);\n\n target.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(target, undefined));\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'resolve', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'notify', _this, response);\n\n response.finish();\n deferred.notify(response);\n }\n }\n }\n\n /**\n * Links object to relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {promise} Promise associated with synchronizations\n */\n function link(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'link',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link undefined', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link new object', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'linkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].object.data.type + ':object:linkReflection', 'resolved', targets[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlinks object from relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked if undefined unlinks all\n * @return {promise} Promise associated with synchronizations\n */\n function unlink(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'unlink',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink undefined', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink new object', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'unlinkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].data.type + ':object:unlinkReflection', 'resolved', targets[key], operation);\n response.value.finish();\n }\n });\n\n deferred.resolve();\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Sets object state to data\n * @param {object} validatedData JsonAPI object with data\n * @return {bool} Result\n */\n function update(validatedData, auto, initialization) {\n var _this = this;\n\n __incrementLoadingCounter(_this);\n\n __setData(_this, validatedData);\n _this.reset(auto);\n _this.synchronized = initialization === true ? false : true;\n _this.stable = initialization === true ? false : true;\n _this.updatedAt = Date.now();\n\n __decrementLoadingCounter(_this);\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /////////////\n // PRIVATE //\n /////////////\n\n /**\n * Low level set data function, use only with validated data\n * @param {AngularJsonAPIModel} object object to be modified\n * @param {object} validatedData Validated data\n * @return {boolean} Status\n */\n function __setData(object, validatedData) {\n\n var $jsonapi = $injector.get('$jsonapi');\n var schema = object.schema;\n\n object.data.id = validatedData.id;\n object.data.type = validatedData.type;\n\n if (object.resource.schema.type !== validatedData.type) {\n $log.error('Different type then resource', object.resource.schema.type, validatedData);\n return false;\n }\n\n if (!object.schema.id.validate(object.data.id)) {\n $log.error('Invalid id');\n return false;\n }\n\n object.data.links = validatedData.links;\n validatedData.attributes = validatedData.attributes || {};\n validatedData.relationships = validatedData.relationships || {};\n\n angular.forEach(schema.attributes, setAttributes);\n angular.forEach(schema.relationships, setRelationships);\n\n return true;\n\n function setAttributes(validators, key) {\n object.data.attributes[key] = validatedData.attributes[key];\n }\n\n function setRelationships(schema, key) {\n var relationshipData = validatedData.relationships[key];\n\n if (relationshipData === undefined) {\n if (object.data.relationships[key] === undefined) {\n object.data.relationships[key] = {data: undefined};\n }\n\n return;\n }\n\n object.data.relationships[key] = object.data.relationships[key] || {};\n object.data.relationships[key].links = relationshipData.links;\n\n if (schema.type === 'hasOne') {\n linkOne(object, key, relationshipData.data);\n } else if (schema.type === 'hasMany') {\n if (angular.isArray(relationshipData.data)) {\n if (relationshipData.data.length === 0) {\n object.data.relationships[key].data = [];\n object.unlinkAll(key);\n } else {\n angular.forEach(\n object.relationships[key],\n unlinkOne.bind(undefined, object, key, relationshipData.data)\n );\n angular.forEach(\n relationshipData.data,\n linkOne.bind(undefined, object, key)\n );\n }\n }\n }\n }\n\n function linkOne(object, key, data) {\n var resource;\n\n if (data === null) {\n AngularJsonAPIModelLinkerService.link(object, key, null);\n return;\n }\n\n if (data === undefined) {\n return;\n }\n\n resource = $jsonapi.getResource(data.type);\n\n if (resource === undefined) {\n $log.error('Factory not found', data.type, data);\n return;\n }\n\n var target = resource.cache.get(data.id);\n\n AngularJsonAPIModelLinkerService.link(object, key, target);\n }\n\n function unlinkOne(object, key, relationshipData, target) {\n if (relationshipData.indexOf(target.data.id) > -1) {\n return;\n }\n\n AngularJsonAPIModelLinkerService.unlink(object, key, target);\n }\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n\n function __incrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount += 1;\n object.saving = true;\n }\n\n function __decrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount -= 1;\n object.saving = object.savingCount > 0;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelValidationError', AngularJsonAPIModelValidationErrorWrapper);\n\n function AngularJsonAPIModelValidationErrorWrapper() {\n ValidationError.prototype = Object.create(Error.prototype);\n ValidationError.prototype.constructor = ValidationError;\n ValidationError.prototype.name = 'ValidationError';\n\n return {\n create: ValidationErrorFactory\n };\n\n function ValidationErrorFactory(message, attribute) {\n return new ValidationError(message, attribute);\n }\n\n function ValidationError(message, attribute) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n attribute: attribute\n };\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelSourceError', AngularJsonAPIModelSourceErrorWrapper);\n\n function AngularJsonAPIModelSourceErrorWrapper() {\n SourceError.prototype = Object.create(Error.prototype);\n SourceError.prototype.constructor = SourceError;\n SourceError.prototype.name = 'SourceError';\n\n return {\n create: SourceErrorFactory\n };\n\n function SourceErrorFactory(message, source, code, action) {\n return new SourceError(message, source, code, action);\n }\n\n function SourceError(message, source, code, action) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n source: source,\n code: code,\n action: action\n };\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelErrorsManager', AngularJsonAPIModelErrorsManagerWrapper);\n\n function AngularJsonAPIModelErrorsManagerWrapper() {\n ErrorsManager.prototype.constructor = ErrorsManager;\n ErrorsManager.prototype.concat = concat;\n ErrorsManager.prototype.clear = clear;\n ErrorsManager.prototype.add = add;\n ErrorsManager.prototype.hasErrors = hasErrors;\n\n return {\n create: ErrorsManagerFactory\n };\n\n function ErrorsManagerFactory(name, description, ErrorConstructor, defaultFilter) {\n return new ErrorsManager(name, description, ErrorConstructor, defaultFilter);\n }\n\n function ErrorsManager(name, description, ErrorConstructor, defaultFilter) {\n var _this = this;\n _this.name = name;\n _this.description = description;\n\n _this.ErrorConstructor = ErrorConstructor;\n _this.errors = {};\n _this.defaultFilter = defaultFilter || function() { return true; };\n }\n\n function clear(key) {\n var _this = this;\n\n if (key === undefined) {\n angular.forEach(_this.errors, function(obj, key) {\n _this.errors[key] = [];\n });\n } else {\n _this.errors[key] = [];\n }\n }\n\n function add(key, error) {\n var _this = this;\n\n _this.errors[key] = _this.errors[key] || [];\n _this.errors[key].push(error);\n }\n\n function concat(errors) {\n var _this = this;\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key] = [];\n });\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key].push(error.object);\n });\n\n }\n\n function hasErrors(key) {\n var _this = this;\n\n if (key === undefined) {\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = answer || error.length > 0;\n });\n\n return answer;\n } else {\n return _this.errors[key] !== undefined && _this.errors[key].length > 0;\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('namedFunction', namedFunction);\n\n function namedFunction(name, fn) {\n return new Function('fn',\n 'return function ' + name + '(){ return fn.apply(this,arguments)}'\n )(fn);\n }\n})();\n\n// from https://www.sitepen.com/blog/2012/10/19/lazy-property-access/\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('lazyProperty', function(target, propertyName, callback) {\n var result;\n var done;\n Object.defineProperty(target, propertyName, {\n get: function() { // Define the getter\n if (!done) {\n // We cache the result and only compute once.\n done = true;\n result = callback.call(target);\n }\n\n return result;\n },\n\n // Keep it enumerable and configurable, certainly not necessary.\n enumerable: true,\n configurable: true\n });\n });\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('toKebabCase', function(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n });\n\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$q', decorator);\n }\n\n function decorator($delegate) {\n var $q = $delegate;\n\n $q.allSettled = $q.allSettled || allSettled;\n\n function allSettled(promises, resolvedCallback, rejectedCallback) {\n // Implementation of allSettled function from Kris Kowal's Q:\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\n // by Michael Kropat from http://stackoverflow.com/a/27114615/1400432 slightly modified\n\n var wrapped = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function(promise, key) {\n if (!wrapped.hasOwnProperty(key)) {\n wrapped[key] = wrap(promise);\n }\n });\n\n return $q.all(wrapped);\n\n function wrap(promise) {\n return $q.resolve(promise)\n .then(function(value) {\n if (angular.isFunction(resolvedCallback)) {\n resolvedCallback(value);\n }\n\n return { success: true, value: value };\n },\n\n function(reason) {\n if (angular.isFunction(rejectedCallback)) {\n rejectedCallback(reason);\n }\n\n return { success: false, reason: reason };\n });\n }\n }\n\n return $q;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper);\n\n function AngularJsonAPISynchronizerSimpleWrapper(AngularJsonAPISynchronizerPrototype, $q, $log) {\n\n AngularJsonAPISynchronizerSimple.prototype = Object.create(AngularJsonAPISynchronizerPrototype.prototype);\n AngularJsonAPISynchronizerSimple.prototype.constructor = AngularJsonAPISynchronizerSimple;\n\n AngularJsonAPISynchronizerSimple.prototype.synchronize = synchronize;\n\n return {\n create: AngularJsonAPISynchronizerSimpleFactory\n };\n\n function AngularJsonAPISynchronizerSimpleFactory(sources) {\n return new AngularJsonAPISynchronizerSimple(sources);\n }\n\n function AngularJsonAPISynchronizerSimple(sources) {\n var _this = this;\n\n _this.state = {};\n\n AngularJsonAPISynchronizerPrototype.call(_this, sources);\n\n angular.forEach(sources, function(source) {\n source.synchronizer = _this;\n });\n }\n\n function synchronize(config) {\n var _this = this;\n var promises = [];\n var deferred = $q.defer();\n var action = config.action;\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize.call(_this, config);\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beginHooks[action], function(hook) {\n deferred.notify({step: 'begin', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beforeHooks[action], function(hook) {\n deferred.notify({step: 'before', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.synchronizationHooks[action], function(hook) {\n promises.push(hook.call(_this, config));\n });\n });\n\n $q.allSettled(promises, resolvedCallback, rejectedCallback).then(resolved, rejected);\n\n function resolvedCallback(value) {\n deferred.notify({step: 'synchronization', data: value});\n }\n\n function rejectedCallback(reason) {\n deferred.notify({step: 'synchronization', errors: reason});\n }\n\n function resolved(results) {\n _this.state[action] = _this.state[action] || {};\n _this.state[action].success = true;\n\n angular.forEach(results, function(result) {\n if (result.success === false) {\n _this.state[action].success = false;\n }\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.afterHooks[action], function(hook) {\n deferred.notify({step: 'after', errors: hook.call(_this, config, results)});\n });\n });\n\n var data;\n var errors = [];\n\n angular.forEach(results, function(result) {\n if (result.success === true) {\n data = result.value;\n } else {\n errors.push({\n key: action,\n object: result.reason\n });\n }\n });\n\n if (errors.length > 0) {\n deferred.reject({data: data || {}, finish: finish, errors: errors});\n } else {\n deferred.resolve({data: data || {}, finish: finish, errors: errors});\n }\n }\n\n function finish() {\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.finishHooks[action], function(hook) {\n deferred.notify({step: 'finish', errors: hook.call(_this, config)});\n });\n });\n }\n\n function rejected(errors) {\n $log.error('All settled rejected! Something went wrong');\n\n deferred.reject({finish: angular.noop, errors: errors});\n }\n\n return deferred.promise;\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper);\n\n function AngularJsonAPISynchronizerPrototypeWrapper($log) {\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize = synchronize;\n\n return AngularJsonAPISynchronizerPrototype;\n\n function AngularJsonAPISynchronizerPrototype(sources) {\n var _this = this;\n\n _this.sources = sources;\n }\n\n function synchronize(config) {\n var _this = this;\n\n $log.debug('Synchro Collection', _this.resource.schema.type, config);\n\n if (config.action === undefined) {\n $log.error('Can\\'t synchronize undefined action', config);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISourcePrototype', AngularJsonAPISourcePrototypeWrapper);\n\n function AngularJsonAPISourcePrototypeWrapper() {\n AngularJsonAPISourcePrototype.prototype.before = beforeSynchro;\n AngularJsonAPISourcePrototype.prototype.after = afterSynchro;\n AngularJsonAPISourcePrototype.prototype.begin = begin;\n AngularJsonAPISourcePrototype.prototype.finish = finish;\n AngularJsonAPISourcePrototype.prototype.synchronization = synchronization;\n\n return AngularJsonAPISourcePrototype;\n\n function AngularJsonAPISourcePrototype(name) {\n var _this = this;\n var allHooks = [\n 'add',\n 'init',\n 'get',\n 'all',\n 'clearCache',\n 'remove',\n 'unlink',\n 'unlinkReflection',\n 'link',\n 'linkReflection',\n 'update',\n 'refresh',\n 'include'\n ];\n\n _this.name = name;\n _this.state = {};\n\n _this.beginHooks = {};\n _this.beforeHooks = {};\n _this.synchronizationHooks = {};\n _this.afterHooks = {};\n _this.finishHooks = {};\n\n _this.options = {};\n\n angular.forEach(allHooks, function(hookName) {\n _this.beginHooks[hookName] = [];\n _this.beforeHooks[hookName] = [];\n _this.synchronizationHooks[hookName] = [];\n _this.afterHooks[hookName] = [];\n _this.finishHooks[hookName] = [];\n _this.state[hookName] = {\n loading: false,\n success: true\n };\n });\n }\n\n function begin(action, callback) {\n var _this = this;\n\n _this.beginHooks[action].push(callback);\n }\n\n function finish(action, callback) {\n var _this = this;\n\n _this.finishHooks[action].push(callback);\n }\n\n function beforeSynchro(action, callback) {\n var _this = this;\n\n _this.beforeHooks[action].push(callback);\n }\n\n function afterSynchro(action, callback) {\n var _this = this;\n\n _this.afterHooks[action].push(callback);\n }\n\n function synchronization(action, callback) {\n var _this = this;\n\n _this.synchronizationHooks[action].push(callback);\n }\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper);\n\n function AngularJsonAPISchemaWrapper(\n $log,\n pluralize,\n uuid4,\n AngularJsonAPISchemaLink\n ) {\n\n return {\n create: AngularJsonAPISchemaFactory\n };\n\n function AngularJsonAPISchemaFactory(schema) {\n return new AngularJsonAPISchema(schema);\n }\n\n function AngularJsonAPISchema(schema) {\n var _this = this;\n var include = schema.include || {};\n schema.include = include;\n include.get = schema.include.get || [];\n include.all = schema.include.all || [];\n\n _this.params = {\n get: {},\n all: {}\n };\n\n if (schema.id === 'uuid4') {\n schema.id = uuid4;\n } else if (schema.id === 'int') {\n schema.id = {\n generate: angular.noop,\n validate: angular.isNumber\n };\n } else if (angular.isObject(schema.id)) {\n if (!angular.isFunction(schema.id.generate)) {\n schema.id.generate = angular.noop;\n }\n } else {\n schema.id = {\n generate: angular.noop,\n validate: angular.identity.bind(null, true)\n };\n }\n\n angular.forEach(schema.relationships, function(linkSchema, linkName) {\n var linkSchemaObj = AngularJsonAPISchemaLink.create(linkSchema, linkName, schema.type);\n schema.relationships[linkName] = linkSchemaObj;\n if (linkSchemaObj.included === true) {\n include.get.push(linkName);\n if (linkSchemaObj.type === 'hasOne') {\n include.all.push(linkName);\n }\n }\n });\n\n angular.extend(_this, schema);\n\n if (include.get.length > 0) {\n _this.params.get.include = include.get;\n }\n\n if (include.all.length > 0) {\n _this.params.all.include = include.all;\n }\n }\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink);\n\n function AngularJsonAPILinkSchrapperLink($log, pluralize) {\n\n return {\n create: AngularJsonAPISchemaLinkFactory\n };\n\n function AngularJsonAPISchemaLinkFactory(linkSchema, linkName, type) {\n return new AngularJsonAPISchemaLink(linkSchema, linkName, type);\n }\n\n function AngularJsonAPISchemaLink(linkSchema, linkName, type) {\n var _this = this;\n\n if (angular.isString(linkSchema)) {\n _this.model = pluralize.plural(linkName);\n _this.type = linkSchema;\n _this.polymorphic = false;\n _this.reflection = type;\n } else {\n if (linkSchema.type === undefined) {\n $log.error('Schema of link without a type: ', linkSchema, linkName);\n }\n\n if (linkSchema.type !== 'hasMany' && linkSchema.type !== 'hasOne') {\n $log.error('Schema of link with wrong type: ', linkSchema.type, 'available: hasOne, hasMany');\n }\n\n _this.model = linkSchema.model || pluralize.plural(linkName);\n _this.type = linkSchema.type;\n _this.polymorphic = linkSchema.polymorphic || false;\n\n if (linkSchema.reflection === undefined) {\n _this.reflection = _this.type === 'hasMany' ? pluralize.singular(type) : type;\n } else {\n _this.reflection = linkSchema.reflection;\n }\n\n _this.included = linkSchema.included || false;\n }\n }\n\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper);\n\n function AngularJsonAPIResourceWrapper(\n AngularJsonAPIModel,\n AngularJsonAPISchema,\n AngularJsonAPIResourceCache,\n AngularJsonAPICollection,\n $rootScope,\n $log,\n $q\n ) {\n AngularJsonAPIResource.prototype.get = get;\n AngularJsonAPIResource.prototype.all = all;\n AngularJsonAPIResource.prototype.remove = remove;\n AngularJsonAPIResource.prototype.initialize = initialize;\n\n AngularJsonAPIResource.prototype.clearCache = clearCache;\n\n return {\n create: AngularJsonAPIResourceFactory\n };\n\n function AngularJsonAPIResourceFactory(schema, synchronizer) {\n return new AngularJsonAPIResource(schema, synchronizer);\n }\n\n /**\n * AngularJsonAPIResource constructor\n * @param {json} schema Schema object\n * @param {AngularJsonAPISynchronizer} synchronizer Synchronizer for the resource\n */\n function AngularJsonAPIResource(schema, synchronizer) {\n var _this = this;\n var config = {\n action: 'init'\n };\n\n _this.schema = AngularJsonAPISchema.create(schema);\n _this.cache = AngularJsonAPIResourceCache.create(_this);\n\n _this.synchronizer = synchronizer;\n _this.synchronizer.resource = _this;\n\n _this.modelFactory = AngularJsonAPIModel.modelFactory(\n _this.schema,\n _this\n );\n\n _this.initialized = false;\n _this.type = _this.schema.type;\n\n synchronizer.resource = _this;\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'resolved', response);\n _this.cache.fromJson(response.data);\n _this.initialized = true;\n\n response.finish();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'rejected', response);\n response.finish();\n _this.initialized = true;\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'notify', response);\n }\n }\n\n /**\n * Get request\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id, synchronized\n */\n function get(id, params) {\n var _this = this;\n\n if (!_this.schema.id.validate(id)) {\n return $q.reject({errors: [{status: 0, statusText: 'Invalid id'}]});\n }\n\n var object = _this.cache.get(id);\n\n object.promise = object.refresh(params);\n\n return object;\n }\n\n /**\n * All request\n * @param {object} params Object associated with params (for filters/pagination etc.)\n * @return {AngularJsonAPICollection} Collection of AngularJsonAPIModel, synchronized\n */\n function all(params) {\n var _this = this;\n params = angular.extend({}, _this.schema.params.all, params);\n\n var collection = AngularJsonAPICollection.create(\n _this,\n params\n );\n\n collection.promise = collection.fetch();\n\n return collection;\n }\n\n /**\n * Remove request\n * @param {uuid} id\n * @return {promise} Promise associated with the synchronization, in case of\n * fail object is reverted to previous state\n */\n function remove(id) {\n var _this = this;\n var object = _this.cache.remove(id);\n\n return object.remove();\n }\n\n /**\n * Initialize new AngularJsonAPIModel\n * @return {AngularJsonAPIModel} New model\n */\n function initialize() {\n var _this = this;\n var relationships = {};\n\n angular.forEach(_this.schema.relationships, function(relationshipSchema, relationshipName) {\n if (relationshipSchema.type === 'hasOne') {\n relationships[relationshipName] = {\n data: null\n };\n } else if (relationshipSchema.type === 'hasMany') {\n relationships[relationshipName] = {\n data: []\n };\n }\n });\n\n var data = {\n type: _this.type,\n id: _this.schema.id.generate(),\n attributes: {},\n relationships: relationships\n };\n\n var config = {\n new: true,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: false\n };\n\n var object = _this.modelFactory(data, config);\n\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:initialize', 'resolved', object);\n\n return object;\n }\n\n /**\n * Clears localy saved data\n * @return {promise} Promise associated with the synchronization resolves to nothing\n */\n function clearCache() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: 'clearCache'\n };\n\n _this.cache.clear();\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n return deferred;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.resolve(response);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.reject(response);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'notify', response);\n\n deferred.notify(response);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModel', AngularJsonAPIModel);\n\n function AngularJsonAPIModel(\n AngularJsonAPIAbstractModel,\n AngularJsonAPISchema,\n namedFunction,\n pluralize,\n $log\n ) {\n\n return {\n modelFactory: createModelFactory\n };\n\n function createModelFactory(schemaObj, resource) {\n var constructorName = pluralize.plural(schemaObj.type, 1);\n\n var Model = namedFunction(constructorName, function(data, config, updatedAt) {\n var _this = this;\n\n if (data.type !== _this.schema.type) {\n $log.error('Data type other then declared in schema: ', data.type, ' instead of ', _this.schema.type);\n }\n\n AngularJsonAPIAbstractModel.call(_this, data, config, updatedAt);\n\n _this.form.parent = _this;\n });\n\n Model.prototype = Object.create(AngularJsonAPIAbstractModel.prototype);\n Model.prototype.constructor = Model;\n\n Model.prototype.schema = schemaObj;\n Model.prototype.resource = resource;\n Model.prototype.synchronize = resource.synchronizer.synchronize.bind(resource.synchronizer);\n\n angular.forEach(schemaObj.functions, function(metaFunction, metaFunctionName) {\n Model.prototype[metaFunctionName] = function() {\n return metaFunction.apply(this, arguments);\n };\n });\n\n return modelFactory;\n\n function modelFactory(data, updatedAt, isNew) {\n return new Model(data, updatedAt, isNew);\n }\n }\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper);\n\n function AngularJsonAPICollectionWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelErrorsManager,\n $rootScope,\n $injector,\n $q\n ) {\n\n AngularJsonAPICollection.prototype.fetch = fetch;\n AngularJsonAPICollection.prototype.refresh = fetch;\n AngularJsonAPICollection.prototype.get = get;\n AngularJsonAPICollection.prototype.hasErrors = hasErrors;\n\n return {\n create: AngularJsonAPICollectionFactory\n };\n\n function AngularJsonAPICollectionFactory(resource, params) {\n return new AngularJsonAPICollection(resource, params);\n }\n\n /**\n * Constructor\n * @param {AngularJsonAPIResource} resource Factory associated with the collection\n * @param {object} params Params associated with this resource (such as filters)\n */\n function AngularJsonAPICollection(resource, params) {\n var _this = this;\n\n _this.resource = resource;\n _this.type = resource.schema.type;\n _this.params = params || {};\n\n _this.errors = {\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.data = _this.resource.cache.index(_this.params);\n\n _this.loading = false;\n _this.loadingCount = 0;\n _this.synchronized = false;\n _this.pristine = _this.data === undefined;\n\n _this.promise = $q.resolve(_this);\n\n var onObjectRemove = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:remove', remove);\n var onFactoryClear = $rootScope.$on('angularJsonAPI:' + _this.type + ':resource:clearCache', clear);\n var onObjectAdd = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:add', add);\n\n $rootScope.$on('$destroy', clearWatchers);\n\n function remove(event, status, object) {\n var index;\n\n if (status === 'resolved' && _this.data !== undefined) {\n index = _this.data.indexOf(object);\n if (index > -1) {\n _this.data.splice(index, 1);\n _this.resource.cache.setIndexIds(_this.data);\n }\n }\n }\n\n function clear() {\n _this.data = undefined;\n _this.pristine = true;\n }\n\n function add(event, status, object) {\n if (status === 'resolved') {\n _this.data = _this.data || [];\n _this.data.push(object);\n }\n }\n\n function clearWatchers() {\n onObjectRemove();\n onFactoryClear();\n onObjectAdd();\n }\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /**\n * Shortcut to this.resource.get\n * @param {string} id Id of object]\n * @return {AngularJsonAPIModel} Model with id\n */\n function get(id, params) {\n var _this = this;\n\n return _this.resource.get(id, params);\n }\n\n /**\n * Synchronizes collection with the server\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function fetch() {\n var _this = this;\n var deferred = $q.defer();\n var $jsonapi = $injector.get('$jsonapi');\n var config = {\n action: 'all',\n params: _this.params\n };\n\n __incrementLoadingCounter(_this);\n\n angular.forEach(_this.data, __incrementLoadingCounter);\n\n _this.resource.synchronizer.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n\n _this.data = results.data;\n _this.links = response.data.links;\n\n _this.updatedAt = Date.now();\n _this.synchronized = true;\n _this.pristine = false;\n\n _this.resource.cache.setIndexIds(_this.data);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'rejected', _this, response);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n }\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n})();\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .provider('$jsonapi', jsonapiProvider);\n\n function jsonapiProvider(validateJS) {\n var memory = {};\n var names = [];\n this.$get = jsonapiFactory;\n\n function jsonapiFactory(\n $log,\n AngularJsonAPIResource,\n AngularJsonAPISynchronizerSimple\n ) {\n return {\n addResource: addResource,\n getResource: getResource,\n clearCache: clearCache,\n allResources: allResources,\n listResources: listResources,\n addValidator: addValidator,\n synchronizerSimple: AngularJsonAPISynchronizerSimple,\n\n __proccesResults: __proccesResults\n };\n\n function addResource(schema, synchronizer) {\n var resource = AngularJsonAPIResource.create(schema, synchronizer);\n\n memory[schema.type] = resource;\n names.push(schema.type);\n }\n\n function getResource(type) {\n return memory[type];\n }\n\n function allResources() {\n return memory;\n }\n\n function listResources() {\n return names;\n }\n\n function clearCache() {\n angular.forEach(memory, function(resource) {\n resource.clearCache();\n });\n }\n\n function addValidator(name, validator) {\n if (!angular.isString(name)) {\n $log.error('Validator name is not a string', name);\n return;\n } else if (validateJS.validators[name] === undefined) {\n $log.warn('Redeclaring validator', name);\n }\n\n validateJS.validators[name] = validator;\n }\n\n function __proccesResults(results) {\n var objects = {\n data: [],\n included: []\n };\n\n if (results === undefined) {\n $log.error('Can\\'t proccess results:', results);\n return;\n }\n\n var config = {\n new: false,\n synchronized: true,\n stable: true,\n pristine: false,\n initialization: false\n };\n\n angular.forEach(results.included, function(data) {\n objects.included.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n\n if (angular.isArray(results.data)) {\n angular.forEach(results.data, function(data) {\n objects.data.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n } else if (results.data !== undefined) {\n objects.data.push(getResource(results.data.type).cache.addOrUpdate(results.data, config));\n }\n\n return objects;\n }\n }\n }\n\n})();\n\n\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(function($logProvider) {\n $logProvider.debugEnabled(false);\n })\n .run(function(validateJS, $q) {\n validateJS.Promise = $q;\n });\n})();\n"],"sourceRoot":"/source/"} diff --git a/dist-demo/scripts/lib-f2c7ec66be.js b/dist-demo/scripts/lib-f2c7ec66be.js index 9ea81dc..27bbc2e 100644 --- a/dist-demo/scripts/lib-f2c7ec66be.js +++ b/dist-demo/scripts/lib-f2c7ec66be.js @@ -1,3 +1,3 @@ -!function(){"use strict";angular.module("angular-jsonapi-rest",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t,r,a,o){function i(e,n){return new s(e,n)}function s(r,i){function s(e){return o({method:"GET",headers:m,url:i,params:c(e.params)}).then(y,g.bind(null,"all"))}function u(e){return o({method:"GET",headers:m,url:i+"/"+e.object.data.id,params:c(e.params)}).then(y,g.bind(null,"get"))}function l(e){return o({method:"DELETE",headers:m,url:i+"/"+e.object.data.id}).then(y,g.bind(null,"remove"))}function d(n){var t=a.defer(),r=n.object.schema.relationships[n.key];return n.object.removed===!0?t.reject(e.create("Object has been removed",v,0,"unlink")):void 0!==n.target&&void 0===n.target.data.id?t.reject(e.create("Can't unlink object without id through rest call",v,0,"unlink")):"hasOne"===r.type?o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"get")).then(t.resolve,t.reject):"hasMany"===r.type&&(void 0===n.target?o({method:"PUT",headers:m,data:{data:[]},url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject):o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key+"/"+n.target.data.id}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject)),t.promise}function h(e){var n=a.defer(),r=e.object.schema.relationships[e.key];return e.object.removed===!0?n.reject({errors:[{status:0,statusText:"Object has been removed"}]}):void 0===e.target||void 0===e.target.data.id?n.reject({errors:[{status:0,statusText:"Can't link object without id through rest call"}]}):"hasOne"===r.type?o({method:"PUT",headers:m,data:{data:t.toLinkData(e.target)},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject):"hasMany"===r.type&&o({method:"POST",headers:m,data:{data:[t.toLinkData(e.target)]},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject),n.promise}function p(e){return o({method:"PUT",headers:m,url:i+"/"+e.object.data.id,data:e.object.form.toJson()}).then(y,g.bind(null,"update"))}function f(e){return o({method:"POST",headers:m,url:i,data:e.object.form.toJson()}).then(y,g.bind(null,"add"))}function y(e){return a.resolve(e.data)}function g(n,t){function r(t){s.reject(e.create("Server is offline",v,t.status,n))}function i(){s.reject(e.create("No internet connection",v,t.status,n))}var s=a.defer();return 0===t.status?o({method:"GET",url:"https://status.cloud.google.com/incidents.schema.json"}).then(r,i):s.reject(e.create(t.statusText,v,t.status,n)),s.promise}var v=this,m={Accept:"application/vnd.api+json","Content-Type":"application/vnd.api+json"};n.apply(v,arguments),v.synchronization("remove",l),v.synchronization("unlink",d),v.synchronization("link",h),v.synchronization("update",p),v.synchronization("add",f),v.synchronization("all",s),v.synchronization("get",u),v.synchronization("refresh",u)}function c(e){function n(e){return angular.isArray(e)?e.join(","):e}var t={};return void 0===e?{}:(angular.forEach(e,function(e,r){angular.isArray(e)?t[r]=n(e):angular.isObject(e)?angular.forEach(e,function(e,a){t[r+"["+a+"]"]=n(e)}):t[r]=e}),t)}function u(e){var n={};return angular.forEach(e,function(e,t){var r=t.indexOf("[");if(e=e.split(","),r>-1){var a=t.substr(0,r),o=t.substr(r+1,t.indexOf("]")-r-1);n[a]=n[a]||{},n[a][o]=e}else n[t]=e}),n}return s.prototype=Object.create(n.prototype),s.prototype.constructor=s,{create:i,encodeParams:c,decodeParams:u}}angular.module("angular-jsonapi-rest").factory("AngularJsonAPISourceRest",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceRest=n,t}angular.module("angular-jsonapi-rest").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceRest"]}(),function(){"use strict";angular.module("angular-jsonapi-parse",["angular-jsonapi"]).constant("Parse",Parse)}(),function(){"use strict";function e(e,n,t,r,a,o,i){function s(e,n){return new c(e,n)}function c(e,t){function s(e){var n=new a.Query(y.ParseObject);return void 0!==e.params.limit&&n.limit(e.params.limit),angular.forEach(e.params.filter,function(e){n.equalTo(e.key,e.value)}),n.find().then(p,f.bind(null,"all"))}function c(e){var n=new a.Query(y.ParseObject);return n.get(e.object.data.id).then(p,f.bind(null,"get"))}function u(e){var n=new y.ParseObject;return n.set("id",e.object.data.id),n.destroy().then(p,f.bind(null,"remove"))}function l(e){var n=d(e.object);return n.save(null).then(p,f.bind(null,"update"))}function d(e){var n=new y.ParseObject;return angular.forEach(e.form.data.attributes,function(e,t){n.set(t,e)}),angular.forEach(e.schema.relationships,function(t,o){if("hasOne"===t.type&&null!==e.form.data.relationships[o].data&&void 0!==e.form.data.relationships[o].data){var i=r(o,1).charAt(0).toUpperCase()+r(o,1).slice(1),s=new(a.Object.extend(i));s.set("id",e.form.data.relationships[o].data.id),n.set(o,s)}}),n}function h(e){var n=y.synchronizer.resource.schema.relationships;return e.type=y.type,e.relationships=e.relationships||[],angular.forEach(n,function(n,t){e.attributes[t]&&"hasOne"===n.type&&(e.relationships[t]={data:{type:n.model,id:e.attributes[t].id}})}),e}function p(e){return angular.isArray(e)?angular.forEach(e,function(n,t){e[t]=h(n)}):angular.isObject(e)&&(e=h(e)),i.resolve({data:e})}function f(e,n){return o.error("Parse error for",e,n),i.reject(n)}var y=this;y.ParseObject=a.Object.extend(t),y.type=r(t).charAt(0).toLowerCase()+r(t).slice(1),n.apply(y,arguments),y.synchronization("remove",u),y.synchronization("update",l),y.synchronization("add",l),y.synchronization("all",s),y.synchronization("get",c),y.synchronization("refresh",c)}function u(e,n){a.initialize(e,n)}return c.prototype=Object.create(n.prototype),c.prototype.constructor=c,c.prototype.initialize=u,{create:s}}angular.module("angular-jsonapi-parse").factory("AngularJsonAPISourceParse",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","pluralize","Parse","$log","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-parse").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceParse"]}(),function(){"use strict";angular.module("angular-jsonapi-local",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t){function r(e,n){return new a(e,n)}function a(r,a){function i(){var e=l.synchronizer.resource.schema.type;return t.resolve(n.localStorage.getItem(a+"."+e))}function s(){var e=l.synchronizer.resource.schema.type,t=a+"."+e;o.all-=o.list[t],delete o.list[t],o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.removeItem(t)}function c(){var e=l.synchronizer.resource.schema.type,t=l.synchronizer.resource.cache,r=t.toJson(),i=a+"."+e;o.list[i]=void 0===o.list[i]?0:o.list[i],o.all+=r.length-o.list[i],o.list[i]=r.length,o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.setItem(i,r)}function u(e){return Object.keys(e).reduce(function(n,t){return e[t]>e[n]?t:n},Object.keys(e)[0])}var l=this;a=a||"AngularJsonAPI",l.__updateStorage=c,e.apply(l,arguments),l.synchronization("init",i),l.begin("clearCache",s),l.finish("init",c),l.finish("clearCache",c),l.finish("remove",c),l.finish("refresh",c),l.finish("unlink",c),l.finish("unlinkReflection",c),l.finish("link",c),l.finish("linkReflection",c),l.finish("update",c),l.finish("add",c),l.finish("get",c),l.finish("all",c),l.finish("include",c)}var o={max:0,all:0,limit:52e5,list:{}};return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,{create:r,size:o}}angular.module("angular-jsonapi-local").factory("AngularJsonAPISourceLocal",e),e.$inject=["AngularJsonAPISourcePrototype","$window","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-local").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceLocal"]}(),function(){"use strict";angular.module("angular-jsonapi",["uuid4"]).constant("pluralize",pluralize).constant("validateJS",validate)}(),function(){"use strict";function e(e,n){function t(e){return new r(e)}function r(e){var n=this;n.resource=e,n.data={},n.removed={},n.size=0,n.indexIds=void 0}function a(e,t,r){var a=this,o=e.id;return void 0===o?void n.error("Can't add data without id!",e):(void 0===a.data[o]?(a.data[o]=a.resource.modelFactory(e,t,r),a.size+=1):a.data[o].update(e,!t["new"],t.initialization),a.data[o])}function o(e){var n=this,t=angular.fromJson(e),r={"new":!1,"synchronized":!1,stable:!1,pristine:!1,initialization:!0};angular.isObject(t)&&void 0!==t.data&&(n.updatedAt=t.updatedAt,n.indexIds=t.indexIds,angular.forEach(t.data,function(e){var t=e.data;n.addOrUpdate(t,r,e.updatedAt)}))}function i(){var e=this,n={data:[],updatedAt:e.updatedAt,indexIds:e.indexIds};return angular.forEach(e.data,function(e){e.hasErrors()===!1&&n.data.push(e.toJson())}),angular.toJson(n)}function s(){var e=this;e.indexIds=void 0,e.data={},e.removed={}}function c(e){var n=this,t={id:e,type:n.resource.schema.type},r={"new":!1,"synchronized":!1,stable:!1,pristine:!0};return void 0===n.data[e]&&(n.data[e]=n.resource.modelFactory(t,r)),n.data[e]}function u(e){function n(n){var t=e.filter,r=!0;return angular.forEach(t,function(e){r=r&&n.data.attributes[e.key]===e.value}),r}var t=this;return e=e||{},void 0===t.indexIds?t.indexIds:t.indexIds.map(t.get.bind(t)).filter(n)}function l(e){var n=this;n.indexIds=[],angular.forEach(e,function(e){angular.isString(e)&&n.resource.schema.id.validate(e)?n.indexIds.push(e):angular.isObject(e)&&n.resource.schema.id.validate(e.data.id)&&n.indexIds.push(e.data.id)})}function d(e){var n=this;return void 0!==n.data[e]&&(n.removed[e]=n.data[e],delete n.data[e],n.size-=1),n.removed[e]}function h(e){var n=this;return void 0!==n.removed[e]&&(n.data[e]=n.removed[e],delete n.removed[e],n.size+=1),n.data[e]}function p(e){var n=this;delete n.removed[e]}return r.prototype.get=c,r.prototype.index=u,r.prototype.setIndexIds=l,r.prototype.addOrUpdate=a,r.prototype.fromJson=o,r.prototype.toJson=i,r.prototype.clear=s,r.prototype.remove=d,r.prototype.revertRemove=h,r.prototype.clearRemoved=p,{create:t}}angular.module("angular-jsonapi").factory("AngularJsonAPIResourceCache",e),e.$inject=["uuid4","$log"]}(),function(){"use strict";function e(e){function n(e){return null===e?null:{type:e.data.type,id:e.data.id}}function t(n,t,r,i,u){var l;return u=void 0===u?!1:u,void 0===n?(e.error("Can't add link to non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(l=n.schema.relationships[t],void 0===r?(e.error("Can't link non existing object",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):void 0===l?(e.error("Can't add link not present in schema:",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):null!==r&&l.polymorphic===!1&&l.model!==r.data.type?(e.error("This relation is not polymorphic, expected: "+l.model+" instead of "+r.data.type),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):"hasMany"===l.type?i===!0?(c(n,t,r,u),[]):a(n,t,r,u):"hasOne"===l.type?i===!0?(s(n,t,r,u),[]):o(n,t,r,u):void 0)}function r(n,t,r,a,o){var s;return o=void 0===o?!1:o,void 0===n?(e.error("Can't remove link from non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(s=n.schema.relationships[t],void 0===s?(e.error("Can't remove link not present in schema:",n,t,r,s),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",s),[]):a===!0?(l(n,t,r,o),[]):i(n,t,r,o))}function a(n,t,r,a){var i,s=n.schema.relationships[t].reflection;return s===!1?(c(n,t,r,a),[]):(i=r.schema.relationships[s],void 0===i?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):"hasOne"===i.type?h(d(n,t,r),d(r,s,n),o(r,s,n,a)):"hasMany"===i.type?(c(n,t,r,a),c(r,s,n,a),[d(r,s,n)]):void 0)}function o(n,t,r,a){var o,i,h=n.schema.relationships[t].reflection,p=n.relationships[t],f=[];return s(n,t,r,a),h===!1?[]:(void 0!==p&&null!==p&&(i=p.schema.relationships[h],void 0!==i?("hasOne"===i.type?u(p,h,n,a):"hasMany"===i.type&&l(p,h,n,a),f.push(d(p,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),void 0!==r&&null!==r&&h!==!1&&(o=r.schema.relationships[h],void 0!==o?("hasOne"===o.type?s(r,h,n,a):"hasMany"===o.type&&c(r,h,n,a),f.push(d(r,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),f)}function i(n,t,r,a){var o,i=n.schema.relationships[t],s=i.reflection;return"hasMany"===i.type?l(n,t,r,a):"hasOne"===i.type&&u(n,t,r,a),s===!1?[]:(o=r.schema.relationships[s],void 0===o?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):("hasOne"===o.type?u(r,s,n,a):"hasMany"===o.type&&l(r,s,n,a),[d(r,s,n)]))}function s(t,r,a,o){return e.debug("addHasOne",t,r,a),o===!0&&(t=t.form),t.relationships[r]=a,t.data.relationships[r].data=n(a),o===!1&&t.reset(!0),!0}function c(t,r,a,o){e.debug("addHasMany",t,r,a);var i=n(a);return o===!0&&(t=t.form),angular.isArray(t.relationships[r])&&t.relationships[r].indexOf(a)>-1?!1:(t.relationships[r]=t.relationships[r]||[],t.data.relationships[r].data=t.data.relationships[r].data||[],t.relationships[r].push(a),t.data.relationships[r].data.push(i),o===!1&&t.reset(!0),!0)}function u(n,t,r,a){return e.debug("removeHasOne",n,t,r),a===!0&&(n=n.form),void 0!==r&&n.relationships[t]!==r?!1:(n.relationships[t]=null,n.data.relationships[t].data=void 0,a===!1&&n.reset(!0),!0)}function l(n,t,r,a){if(e.debug("removeHasMany",n,t,r),a===!0&&(n=n.form),void 0!==n.relationships[t]){if(void 0===r)return n.relationships[t]=[],n.data.relationships[t].data=[],a===!1&&n.reset(!0),!0;var o=n.relationships[t].indexOf(r);return-1===o?!1:(n.relationships[t].splice(o,1),n.data.relationships[t].data.splice(o,1),a===!1&&n.reset(!0),!0)}}function d(e,n,t){return{object:e,key:n,target:t}}function h(e,n,t){var r=-1;return angular.forEach(t,function(n,t){n.object===e.object&&n.key===e.key&&n.target===e.target&&(r=t)}),r>-1?t[r]=n:t.push(n),t}var p=this;return p.toLinkData=n,p.link=t,p.unlink=r,this}angular.module("angular-jsonapi").service("AngularJsonAPIModelLinkerService",e),e.$inject=["$log"]}(),function(){"use strict";function e(e,n,t,r){function a(e){return new o(e)}function o(e){var n=this;n.data={id:e.data.id,type:e.data.type,attributes:{},relationships:{}},n.relationships={},n.parent=e,n.schema=e.schema,n.reset()}function i(){var e=this,n=angular.copy(e.data),t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n}}function s(){var e=this;return e.parent.save()}function c(e){var n=this;angular.forEach(n.schema.relationships,function(e,t){n.data.relationships[t]=angular.copy(n.parent.data.relationships[t])||{},angular.isArray(n.relationships[t])?n.relationships[t]=n.parent.relationships[t].slice():n.relationships[t]=n.parent.relationships[t]}),(e!==!0||n.parent["synchronized"]!==!0)&&(angular.forEach(n.schema.attributes,function(e,t){n.data.attributes[t]=angular.copy(n.parent.data.attributes[t])}),n.parent.errors.validation.clear())}function u(n){function a(){void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),u.resolve()}function o(t){c.parent.error=!0,void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),angular.forEach(t,function(n,t){angular.forEach(n,function(n){c.parent.errors.validation.add(t,e.create(n,t))})}),u.reject(c.parent.errors.validation)}var i,s,c=this,u=r.defer();return void 0===n?(i=c.data.attributes,s=c.schema.attributes):(i={},s={},i[n]=c.data.attributes[n],s[n]=c.schema.attributes[n]),t.async(i,s).then(a,o),u.promise}function l(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.link(o.parent,e,t,a,!0))}function d(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.unlink(o.parent,e,t,a,!0))}return o.prototype.save=s,o.prototype.reset=c,o.prototype.validate=u,o.prototype.link=l,o.prototype.unlink=d,o.prototype.toJson=i,{create:a}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelForm",e),e.$inject=["AngularJsonAPIModelValidationError","AngularJsonAPIModelLinkerService","validateJS","$q"]}(),function(){"use strict";function e(e,o,i,s,c,u,l,d,h){function p(n,t,r){var a=this;n.relationships=n.relationships||{},a["new"]=void 0===t["new"]?!1:t["new"],a.stable=void 0===t.stable?!0:t.stable,a["synchronized"]=void 0===t["synchronized"]?!0:t["synchronized"],a.pristine=void 0===t.pristine?!0:t.pristine,a.removed=!1,a.loading=!1,a.saving=!1,a.updatedAt=a["synchronized"]===!0?Date.now():r,a.loadingCount=0,a.savingCount=0,a.data={relationships:{},attributes:{}},a.relationships={},angular.forEach(a.schema.relationships,function(e,n){a.relationships[n]=void 0}),a.errors={validation:i.create("Validation","Errors of attributes validation",o),synchronization:i.create("Source","Errors of synchronizations",e)},a.promise=h.resolve(a),P(a,n),a.form=c.create(a)}function f(){function e(){i.synchronize(c).then(n,t,o)}function n(e){u.$emit("angularJsonAPI:"+i.data.type+":object:"+c.action,"resolved",i,e),i.update(e.data.data),i["new"]===!0&&(i.resource.cache.indexIds=i.resource.cache.indexIds||[],i.resource.cache.indexIds.push(i.data.id)),i["synchronized"]=!0,i["new"]=!1,i.pristine=!1,i.stable=!0,e.finish(),i.errors.synchronization.concat(e.errors),s.resolve(e.data.meta)}function t(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","rejected",i,e),e.finish(),i.errors.synchronization.concat(e.errors),s.reject(i)}function o(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","notify",i,e),s.notify(e)}var i=this,s=h.defer(),c={action:i["new"]===!0?"add":"update",object:i};return i.form.validate().then(e,s.reject)["finally"](a.bind(i,void 0)),r(i),s.promise}function y(){var e=this;void 0!==e.form&&e.form.reset()}function g(r){function a(e){function r(e){return n(e),e.synchronize({action:"include",object:e})["finally"](t.bind(e,void 0))}function a(n){angular.forEach(n,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+o.included[n].data.type+":object:include","resolved",o.included[n],e),e.value.finish())}),c.resolve(e.data.meta)}var o=s.__proccesResults(e.data);u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","resolved",d,e),h.allSettled(o.included.map(r)).then(a,c.reject),d["synchronized"]=!0,d.stable=!0,d.pristine=!1,e.finish(),d.errors.synchronization.concat(e.errors)}function o(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","rejected",d,e),e.finish(),d.errors.synchronization.concat(e.errors),c.reject(d)}function i(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","notify",d,e),c.notify(e)}var s=l.get("$jsonapi"),c=h.defer(),d=this;r=void 0===r?d.schema.params.get:r;var p={action:"refresh",object:d,params:r};if(d["new"]===!0){var f=e.create("Can't refresh new object",null,0,"refresh");d.errors.synchronization.add("refresh",f),c.reject(f)}else n(d),d.synchronize(p).then(a,o,i)["finally"](t.bind(d,void 0));return c.promise}function v(){var e=this,n=e.data,t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n,updatedAt:e.updatedAt}}function m(){function e(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","resolved",o,e),o.removed=!0,o.unlinkAll(),o.resource.cache.clearRemoved(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function n(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","rejected",o,e),o.resource.cache.revertRemove(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function t(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","notify",o,e),i.notify(e)}var o=this,i=h.defer(),s={action:"remove",object:o};return o.resource.cache.remove(o.data.id),o["new"]===!0?i.resolve():(r(o),o.synchronize(s).then(e,n,t)["finally"](a.bind(o,void 0))),i.promise}function j(e){function r(e,n){var t=o.schema.relationships[n],r=t.reflection;angular.isArray(e)?angular.forEach(e,a.bind(void 0,r)):angular.isObject(e)&&a(r,e),"hasOne"===t.type?o.relationships[n]=null:"hasMany"===t.type&&(o.relationships[n]=[])}function a(e,r){function a(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","resolve",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function c(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","rejected",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function l(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","notify",o,e),e.finish(),i.notify(e)}var d=r.schema.relationships[e],h={action:"unlinkReflection",object:r,target:o,key:e};n(r),s.unlink(r,e,o,d),r.synchronize(h).then(a,c,l)["finally"](t.bind(r,void 0))}var o=this,i=h.defer();return n(o),void 0===e?angular.forEach(o.relationships,r):r(o.relationships[e],e),t(o),i.promise}function b(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"linkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+c[n].object.data.type+":object:linkReflection","resolved",c[n],e),e.value.finish())}),f.resolve(e.data.meta)}u.$emit("angularJsonAPI:"+y.data.type+":object:link","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"link",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't link undefined",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):y["new"]===!0?(p=e.create("Can't link new object",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function A(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"unlinkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(n){n.success===!0&&(u.$emit("angularJsonAPI:"+c[o].data.type+":object:unlinkReflection","resolved",c[o],n),e.value.finish())}),f.resolve()}u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"unlink",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't unlink undefined",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):y["new"]===!0?(p=e.create("Can't unlink new object",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function k(e,r,a){var o=this;n(o),P(o,e),o.reset(r),o["synchronized"]=a===!0?!1:!0,o.stable=a===!0?!1:!0,o.updatedAt=Date.now(),t(o)}function z(){var e=this,n=!1;return angular.forEach(e.errors,function(e){n=e.hasErrors()||n}),n}function P(e,n){function t(t,r){e.data.attributes[r]=n.attributes[r]}function r(t,r){var i=n.relationships[r];return void 0===i?void(void 0===e.data.relationships[r]&&(e.data.relationships[r]={data:void 0})):(e.data.relationships[r]=e.data.relationships[r]||{},e.data.relationships[r].links=i.links,void("hasOne"===t.type?a(e,r,i.data):"hasMany"===t.type&&angular.isArray(i.data)&&(0===i.data.length?(e.data.relationships[r].data=[],e.unlinkAll(r)):(angular.forEach(e.relationships[r],o.bind(void 0,e,r,i.data)),angular.forEach(i.data,a.bind(void 0,e,r))))))}function a(e,n,t){var r;if(null===t)return void s.link(e,n,null);if(void 0!==t){if(r=i.getResource(t.type),void 0===r)return void d.error("Factory not found",t.type,t);var a=r.cache.get(t.id);s.link(e,n,a)}}function o(e,n,t,r){t.indexOf(r.data.id)>-1||s.unlink(e,n,r)}var i=l.get("$jsonapi"),c=e.schema;return e.data.id=n.id,e.data.type=n.type,e.resource.schema.type!==n.type?(d.error("Different type then resource",e.resource.schema.type,n),!1):e.schema.id.validate(e.data.id)?(e.data.links=n.links,n.attributes=n.attributes||{},n.relationships=n.relationships||{},angular.forEach(c.attributes,t),angular.forEach(c.relationships,r),!0):(d.error("Invalid id"),!1)}return p.prototype.refresh=g,p.prototype.remove=m,p.prototype.reset=y,p.prototype.save=f,p.prototype.update=k,p.prototype.link=b,p.prototype.unlink=A,p.prototype.unlinkAll=j,p.prototype.toJson=v,p.prototype.hasErrors=z,p}function n(e){e=void 0===e?this:e,e.loadingCount+=1,e.loading=!0}function t(e){e=void 0===e?this:e,e.loadingCount-=1,e.loading=e.loadingCount>0}function r(e){e=void 0===e?this:e,e.savingCount+=1,e.saving=!0}function a(e){e=void 0===e?this:e,e.savingCount-=1,e.saving=e.savingCount>0}angular.module("angular-jsonapi").factory("AngularJsonAPIAbstractModel",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelValidationError","AngularJsonAPIModelErrorsManager","AngularJsonAPIModelLinkerService","AngularJsonAPIModelForm","$rootScope","$injector","$log","$q"]}(),function(){"use strict";function e(){function e(e,t){return new n(e,t)}function n(e,n){var t=this;t.message=e,t.context={attribute:n}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="ValidationError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelValidationError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.message=e,a.context={source:n,code:t,action:r}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="SourceError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelSourceError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.name=e,a.description=n,a.ErrorConstructor=t,a.errors={},a.defaultFilter=r||function(){return!0}}function t(e){var n=this;void 0===e?angular.forEach(n.errors,function(e,t){n.errors[t]=[]}):n.errors[e]=[]}function r(e,n){var t=this;t.errors[e]=t.errors[e]||[],t.errors[e].push(n)}function a(e){var n=this;angular.forEach(e,function(e){n.errors[e.key]=[]}),angular.forEach(e,function(e){n.errors[e.key].push(e.object)})}function o(e){var n=this;if(void 0===e){var t=!1;return angular.forEach(n.errors,function(e){t=t||e.length>0}),t}return void 0!==n.errors[e]&&n.errors[e].length>0}return n.prototype.constructor=n,n.prototype.concat=a,n.prototype.clear=t,n.prototype.add=r,n.prototype.hasErrors=o,{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelErrorsManager",e)}(),function(){"use strict";function e(e,n){return new Function("fn","return function "+e+"(){ return fn.apply(this,arguments)}")(n)}angular.module("angular-jsonapi").constant("namedFunction",e)}(),function(){"use strict";angular.module("angular-jsonapi").constant("lazyProperty",function(e,n,t){var r,a;Object.defineProperty(e,n,{get:function(){return a||(a=!0,r=t.call(e)),r},enumerable:!0,configurable:!0})})}(),function(){"use strict";angular.module("angular-jsonapi").constant("toKebabCase",function(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()})}(),function(){"use strict";function e(e){e.decorator("$q",n)}function n(e){function n(e,n,r){function a(e){return t.resolve(e).then(function(e){return angular.isFunction(n)&&n(e),{success:!0,value:e}},function(e){return angular.isFunction(r)&&r(e),{success:!1,reason:e}})}var o=angular.isArray(e)?[]:{};return angular.forEach(e,function(e,n){o.hasOwnProperty(n)||(o[n]=a(e))}),t.all(o)}var t=e;return t.allSettled=t.allSettled||n,t}angular.module("angular-jsonapi").config(e),e.$inject=["$provide"],n.$inject=["$delegate"]}(),function(){"use strict";function e(e,n,t){function r(e){return new a(e)}function a(n){var t=this;t.state={},e.call(t,n),angular.forEach(n,function(e){e.synchronizer=t})}function o(r){function a(e){d.notify({step:"synchronization",data:e})}function o(e){d.notify({step:"synchronization",errors:e})}function i(e){u.state[h]=u.state[h]||{},u.state[h].success=!0,angular.forEach(e,function(e){e.success===!1&&(u.state[h].success=!1)}),angular.forEach(u.sources,function(n){angular.forEach(n.afterHooks[h],function(n){d.notify({step:"after",errors:n.call(u,r,e)})})});var n,t=[];angular.forEach(e,function(e){e.success===!0?n=e.value:t.push({key:h,object:e.reason})}),t.length>0?d.reject({data:n||{},finish:s,errors:t}):d.resolve({data:n||{},finish:s,errors:t})}function s(){angular.forEach(u.sources,function(e){angular.forEach(e.finishHooks[h],function(e){d.notify({step:"finish",errors:e.call(u,r)})})})}function c(e){t.error("All settled rejected! Something went wrong"),d.reject({finish:angular.noop,errors:e})}var u=this,l=[],d=n.defer(),h=r.action;return e.prototype.synchronize.call(u,r),angular.forEach(u.sources,function(e){angular.forEach(e.beginHooks[h],function(e){d.notify({step:"begin",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.beforeHooks[h],function(e){d.notify({step:"before",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.synchronizationHooks[h],function(e){l.push(e.call(u,r))})}),n.allSettled(l,a,o).then(i,c),d.promise}return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,a.prototype.synchronize=o,{create:r}}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerSimple",e),e.$inject=["AngularJsonAPISynchronizerPrototype","$q","$log"]}(),function(){"use strict";function e(e){function n(e){var n=this;n.sources=e}function t(n){var t=this;e.debug("Synchro Collection",t.resource.schema.type,n),void 0===n.action&&e.error("Can't synchronize undefined action",n)}return n.prototype.synchronize=t,n}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerPrototype",e),e.$inject=["$log"]}(),function(){"use strict";function e(){function e(e){var n=this,t=["add","init","get","all","clearCache","remove","unlink","unlinkReflection","link","linkReflection","update","refresh","include"];n.name=e,n.state={},n.beginHooks={},n.beforeHooks={},n.synchronizationHooks={},n.afterHooks={},n.finishHooks={},n.options={},angular.forEach(t,function(e){n.beginHooks[e]=[],n.beforeHooks[e]=[],n.synchronizationHooks[e]=[],n.afterHooks[e]=[],n.finishHooks[e]=[],n.state[e]={loading:!1,success:!0}})}function n(e,n){var t=this;t.beginHooks[e].push(n)}function t(e,n){var t=this;t.finishHooks[e].push(n)}function r(e,n){var t=this;t.beforeHooks[e].push(n)}function a(e,n){var t=this;t.afterHooks[e].push(n)}function o(e,n){var t=this;t.synchronizationHooks[e].push(n)}return e.prototype.before=r, +!function(){"use strict";angular.module("angular-jsonapi-rest",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t,r,a,o){function i(e,n){return new s(e,n)}function s(r,i){function s(e){return o({method:"GET",headers:m,url:i,params:c(e.params)}).then(y,g.bind(null,"all"))}function u(e){return o({method:"GET",headers:m,url:i+"/"+e.object.data.id,params:c(e.params)}).then(y,g.bind(null,"get"))}function l(e){return o({method:"DELETE",headers:m,url:i+"/"+e.object.data.id}).then(y,g.bind(null,"remove"))}function d(n){var t=a.defer(),r=n.object.schema.relationships[n.key];return n.object.removed===!0?t.reject(e.create("Object has been removed",v,0,"unlink")):void 0!==n.target&&void 0===n.target.data.id?t.reject(e.create("Can't unlink object without id through rest call",v,0,"unlink")):"hasOne"===r.type?o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"get")).then(t.resolve,t.reject):"hasMany"===r.type&&(void 0===n.target?o({method:"PATCH",headers:m,data:{data:[]},url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject):o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key+"/"+n.target.data.id}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject)),t.promise}function h(e){var n=a.defer(),r=e.object.schema.relationships[e.key];return e.object.removed===!0?n.reject({errors:[{status:0,statusText:"Object has been removed"}]}):void 0===e.target||void 0===e.target.data.id?n.reject({errors:[{status:0,statusText:"Can't link object without id through rest call"}]}):"hasOne"===r.type?o({method:"PATCH",headers:m,data:{data:t.toLinkData(e.target)},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject):"hasMany"===r.type&&o({method:"POST",headers:m,data:{data:[t.toLinkData(e.target)]},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject),n.promise}function p(e){return o({method:"PATCH",headers:m,url:i+"/"+e.object.data.id,data:e.object.form.toJson()}).then(y,g.bind(null,"update"))}function f(e){return o({method:"POST",headers:m,url:i,data:e.object.form.toJson()}).then(y,g.bind(null,"add"))}function y(e){return a.resolve(e.data)}function g(n,t){function r(t){s.reject(e.create("Server is offline",v,t.status,n))}function i(){s.reject(e.create("No internet connection",v,t.status,n))}var s=a.defer();return 0===t.status?o({method:"GET",url:"https://status.cloud.google.com/incidents.schema.json"}).then(r,i):s.reject(e.create(t.statusText,v,t.status,n)),s.promise}var v=this,m={Accept:"application/vnd.api+json","Content-Type":"application/vnd.api+json"};n.apply(v,arguments),v.synchronization("remove",l),v.synchronization("unlink",d),v.synchronization("link",h),v.synchronization("update",p),v.synchronization("add",f),v.synchronization("all",s),v.synchronization("get",u),v.synchronization("refresh",u)}function c(e){function n(e){return angular.isArray(e)?e.join(","):e}var t={};return void 0===e?{}:(angular.forEach(e,function(e,r){angular.isArray(e)?t[r]=n(e):angular.isObject(e)?angular.forEach(e,function(e,a){t[r+"["+a+"]"]=n(e)}):t[r]=e}),t)}function u(e){var n={};return angular.forEach(e,function(e,t){var r=t.indexOf("[");if(e=e.split(","),r>-1){var a=t.substr(0,r),o=t.substr(r+1,t.indexOf("]")-r-1);n[a]=n[a]||{},n[a][o]=e}else n[t]=e}),n}return s.prototype=Object.create(n.prototype),s.prototype.constructor=s,{create:i,encodeParams:c,decodeParams:u}}angular.module("angular-jsonapi-rest").factory("AngularJsonAPISourceRest",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceRest=n,t}angular.module("angular-jsonapi-rest").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceRest"]}(),function(){"use strict";angular.module("angular-jsonapi-parse",["angular-jsonapi"]).constant("Parse",Parse)}(),function(){"use strict";function e(e,n,t,r,a,o,i){function s(e,n){return new c(e,n)}function c(e,t){function s(e){var n=new a.Query(y.ParseObject);return void 0!==e.params.limit&&n.limit(e.params.limit),angular.forEach(e.params.filter,function(e){n.equalTo(e.key,e.value)}),n.find().then(p,f.bind(null,"all"))}function c(e){var n=new a.Query(y.ParseObject);return n.get(e.object.data.id).then(p,f.bind(null,"get"))}function u(e){var n=new y.ParseObject;return n.set("id",e.object.data.id),n.destroy().then(p,f.bind(null,"remove"))}function l(e){var n=d(e.object);return n.save(null).then(p,f.bind(null,"update"))}function d(e){var n=new y.ParseObject;return angular.forEach(e.form.data.attributes,function(e,t){n.set(t,e)}),angular.forEach(e.schema.relationships,function(t,o){if("hasOne"===t.type&&null!==e.form.data.relationships[o].data&&void 0!==e.form.data.relationships[o].data){var i=r(o,1).charAt(0).toUpperCase()+r(o,1).slice(1),s=new(a.Object.extend(i));s.set("id",e.form.data.relationships[o].data.id),n.set(o,s)}}),n}function h(e){var n=y.synchronizer.resource.schema.relationships;return e.type=y.type,e.relationships=e.relationships||[],angular.forEach(n,function(n,t){e.attributes[t]&&"hasOne"===n.type&&(e.relationships[t]={data:{type:n.model,id:e.attributes[t].id}})}),e}function p(e){return angular.isArray(e)?angular.forEach(e,function(n,t){e[t]=h(n)}):angular.isObject(e)&&(e=h(e)),i.resolve({data:e})}function f(e,n){return o.error("Parse error for",e,n),i.reject(n)}var y=this;y.ParseObject=a.Object.extend(t),y.type=r(t).charAt(0).toLowerCase()+r(t).slice(1),n.apply(y,arguments),y.synchronization("remove",u),y.synchronization("update",l),y.synchronization("add",l),y.synchronization("all",s),y.synchronization("get",c),y.synchronization("refresh",c)}function u(e,n){a.initialize(e,n)}return c.prototype=Object.create(n.prototype),c.prototype.constructor=c,c.prototype.initialize=u,{create:s}}angular.module("angular-jsonapi-parse").factory("AngularJsonAPISourceParse",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","pluralize","Parse","$log","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-parse").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceParse"]}(),function(){"use strict";angular.module("angular-jsonapi-local",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t){function r(e,n){return new a(e,n)}function a(r,a){function i(){var e=l.synchronizer.resource.schema.type;return t.resolve(n.localStorage.getItem(a+"."+e))}function s(){var e=l.synchronizer.resource.schema.type,t=a+"."+e;o.all-=o.list[t],delete o.list[t],o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.removeItem(t)}function c(){var e=l.synchronizer.resource.schema.type,t=l.synchronizer.resource.cache,r=t.toJson(),i=a+"."+e;o.list[i]=void 0===o.list[i]?0:o.list[i],o.all+=r.length-o.list[i],o.list[i]=r.length,o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.setItem(i,r)}function u(e){return Object.keys(e).reduce(function(n,t){return e[t]>e[n]?t:n},Object.keys(e)[0])}var l=this;a=a||"AngularJsonAPI",l.__updateStorage=c,e.apply(l,arguments),l.synchronization("init",i),l.begin("clearCache",s),l.finish("init",c),l.finish("clearCache",c),l.finish("remove",c),l.finish("refresh",c),l.finish("unlink",c),l.finish("unlinkReflection",c),l.finish("link",c),l.finish("linkReflection",c),l.finish("update",c),l.finish("add",c),l.finish("get",c),l.finish("all",c),l.finish("include",c)}var o={max:0,all:0,limit:52e5,list:{}};return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,{create:r,size:o}}angular.module("angular-jsonapi-local").factory("AngularJsonAPISourceLocal",e),e.$inject=["AngularJsonAPISourcePrototype","$window","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-local").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceLocal"]}(),function(){"use strict";angular.module("angular-jsonapi",["uuid4"]).constant("pluralize",pluralize).constant("validateJS",validate)}(),function(){"use strict";function e(e,n){function t(e){return new r(e)}function r(e){var n=this;n.resource=e,n.data={},n.removed={},n.size=0,n.indexIds=void 0}function a(e,t,r){var a=this,o=e.id;return void 0===o?void n.error("Can't add data without id!",e):(void 0===a.data[o]?(a.data[o]=a.resource.modelFactory(e,t,r),a.size+=1):a.data[o].update(e,!t["new"],t.initialization),a.data[o])}function o(e){var n=this,t=angular.fromJson(e),r={"new":!1,"synchronized":!1,stable:!1,pristine:!1,initialization:!0};angular.isObject(t)&&void 0!==t.data&&(n.updatedAt=t.updatedAt,n.indexIds=t.indexIds,angular.forEach(t.data,function(e){var t=e.data;n.addOrUpdate(t,r,e.updatedAt)}))}function i(){var e=this,n={data:[],updatedAt:e.updatedAt,indexIds:e.indexIds};return angular.forEach(e.data,function(e){e.hasErrors()===!1&&n.data.push(e.toJson())}),angular.toJson(n)}function s(){var e=this;e.indexIds=void 0,e.data={},e.removed={}}function c(e){var n=this,t={id:e,type:n.resource.schema.type},r={"new":!1,"synchronized":!1,stable:!1,pristine:!0};return void 0===n.data[e]&&(n.data[e]=n.resource.modelFactory(t,r)),n.data[e]}function u(e){function n(n){var t=e.filter,r=!0;return angular.forEach(t,function(e){r=r&&n.data.attributes[e.key]===e.value}),r}var t=this;return e=e||{},void 0===t.indexIds?t.indexIds:t.indexIds.map(t.get.bind(t)).filter(n)}function l(e){var n=this;n.indexIds=[],angular.forEach(e,function(e){angular.isString(e)&&n.resource.schema.id.validate(e)?n.indexIds.push(e):angular.isObject(e)&&n.resource.schema.id.validate(e.data.id)&&n.indexIds.push(e.data.id)})}function d(e){var n=this;return void 0!==n.data[e]&&(n.removed[e]=n.data[e],delete n.data[e],n.size-=1),n.removed[e]}function h(e){var n=this;return void 0!==n.removed[e]&&(n.data[e]=n.removed[e],delete n.removed[e],n.size+=1),n.data[e]}function p(e){var n=this;delete n.removed[e]}return r.prototype.get=c,r.prototype.index=u,r.prototype.setIndexIds=l,r.prototype.addOrUpdate=a,r.prototype.fromJson=o,r.prototype.toJson=i,r.prototype.clear=s,r.prototype.remove=d,r.prototype.revertRemove=h,r.prototype.clearRemoved=p,{create:t}}angular.module("angular-jsonapi").factory("AngularJsonAPIResourceCache",e),e.$inject=["uuid4","$log"]}(),function(){"use strict";function e(e){function n(e){return null===e?null:{type:e.data.type,id:e.data.id}}function t(n,t,r,i,u){var l;return u=void 0===u?!1:u,void 0===n?(e.error("Can't add link to non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(l=n.schema.relationships[t],void 0===r?(e.error("Can't link non existing object",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):void 0===l?(e.error("Can't add link not present in schema:",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):null!==r&&l.polymorphic===!1&&l.model!==r.data.type?(e.error("This relation is not polymorphic, expected: "+l.model+" instead of "+r.data.type),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):"hasMany"===l.type?i===!0?(c(n,t,r,u),[]):a(n,t,r,u):"hasOne"===l.type?i===!0?(s(n,t,r,u),[]):o(n,t,r,u):void 0)}function r(n,t,r,a,o){var s;return o=void 0===o?!1:o,void 0===n?(e.error("Can't remove link from non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(s=n.schema.relationships[t],void 0===s?(e.error("Can't remove link not present in schema:",n,t,r,s),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",s),[]):a===!0?(l(n,t,r,o),[]):i(n,t,r,o))}function a(n,t,r,a){var i,s=n.schema.relationships[t].reflection;return s===!1?(c(n,t,r,a),[]):(i=r.schema.relationships[s],void 0===i?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):"hasOne"===i.type?h(d(n,t,r),d(r,s,n),o(r,s,n,a)):"hasMany"===i.type?(c(n,t,r,a),c(r,s,n,a),[d(r,s,n)]):void 0)}function o(n,t,r,a){var o,i,h=n.schema.relationships[t].reflection,p=n.relationships[t],f=[];return s(n,t,r,a),h===!1?[]:(void 0!==p&&null!==p&&(i=p.schema.relationships[h],void 0!==i?("hasOne"===i.type?u(p,h,n,a):"hasMany"===i.type&&l(p,h,n,a),f.push(d(p,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),void 0!==r&&null!==r&&h!==!1&&(o=r.schema.relationships[h],void 0!==o?("hasOne"===o.type?s(r,h,n,a):"hasMany"===o.type&&c(r,h,n,a),f.push(d(r,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),f)}function i(n,t,r,a){var o,i=n.schema.relationships[t],s=i.reflection;return"hasMany"===i.type?l(n,t,r,a):"hasOne"===i.type&&u(n,t,r,a),s===!1?[]:(o=r.schema.relationships[s],void 0===o?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):("hasOne"===o.type?u(r,s,n,a):"hasMany"===o.type&&l(r,s,n,a),[d(r,s,n)]))}function s(t,r,a,o){return e.debug("addHasOne",t,r,a),o===!0&&(t=t.form),t.relationships[r]=a,t.data.relationships[r].data=n(a),o===!1&&t.reset(!0),!0}function c(t,r,a,o){e.debug("addHasMany",t,r,a);var i=n(a);return o===!0&&(t=t.form),angular.isArray(t.relationships[r])&&t.relationships[r].indexOf(a)>-1?!1:(t.relationships[r]=t.relationships[r]||[],t.data.relationships[r].data=t.data.relationships[r].data||[],t.relationships[r].push(a),t.data.relationships[r].data.push(i),o===!1&&t.reset(!0),!0)}function u(n,t,r,a){return e.debug("removeHasOne",n,t,r),a===!0&&(n=n.form),void 0!==r&&n.relationships[t]!==r?!1:(n.relationships[t]=null,n.data.relationships[t].data=void 0,a===!1&&n.reset(!0),!0)}function l(n,t,r,a){if(e.debug("removeHasMany",n,t,r),a===!0&&(n=n.form),void 0!==n.relationships[t]){if(void 0===r)return n.relationships[t]=[],n.data.relationships[t].data=[],a===!1&&n.reset(!0),!0;var o=n.relationships[t].indexOf(r);return-1===o?!1:(n.relationships[t].splice(o,1),n.data.relationships[t].data.splice(o,1),a===!1&&n.reset(!0),!0)}}function d(e,n,t){return{object:e,key:n,target:t}}function h(e,n,t){var r=-1;return angular.forEach(t,function(n,t){n.object===e.object&&n.key===e.key&&n.target===e.target&&(r=t)}),r>-1?t[r]=n:t.push(n),t}var p=this;return p.toLinkData=n,p.link=t,p.unlink=r,this}angular.module("angular-jsonapi").service("AngularJsonAPIModelLinkerService",e),e.$inject=["$log"]}(),function(){"use strict";function e(e,n,t,r){function a(e){return new o(e)}function o(e){var n=this;n.data={id:e.data.id,type:e.data.type,attributes:{},relationships:{}},n.relationships={},n.parent=e,n.schema=e.schema,n.reset()}function i(){var e=this,n=angular.copy(e.data),t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n}}function s(){var e=this;return e.parent.save()}function c(e){var n=this;angular.forEach(n.schema.relationships,function(e,t){n.data.relationships[t]=angular.copy(n.parent.data.relationships[t])||{},angular.isArray(n.relationships[t])?n.relationships[t]=n.parent.relationships[t].slice():n.relationships[t]=n.parent.relationships[t]}),(e!==!0||n.parent["synchronized"]!==!0)&&(angular.forEach(n.schema.attributes,function(e,t){n.data.attributes[t]=angular.copy(n.parent.data.attributes[t])}),n.parent.errors.validation.clear())}function u(n){function a(){void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),u.resolve()}function o(t){c.parent.error=!0,void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),angular.forEach(t,function(n,t){angular.forEach(n,function(n){c.parent.errors.validation.add(t,e.create(n,t))})}),u.reject(c.parent.errors.validation)}var i,s,c=this,u=r.defer();return void 0===n?(i=c.data.attributes,s=c.schema.attributes):(i={},s={},i[n]=c.data.attributes[n],s[n]=c.schema.attributes[n]),t.async(i,s).then(a,o),u.promise}function l(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.link(o.parent,e,t,a,!0))}function d(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.unlink(o.parent,e,t,a,!0))}return o.prototype.save=s,o.prototype.reset=c,o.prototype.validate=u,o.prototype.link=l,o.prototype.unlink=d,o.prototype.toJson=i,{create:a}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelForm",e),e.$inject=["AngularJsonAPIModelValidationError","AngularJsonAPIModelLinkerService","validateJS","$q"]}(),function(){"use strict";function e(e,o,i,s,c,u,l,d,h){function p(n,t,r){var a=this;n.relationships=n.relationships||{},a["new"]=void 0===t["new"]?!1:t["new"],a.stable=void 0===t.stable?!0:t.stable,a["synchronized"]=void 0===t["synchronized"]?!0:t["synchronized"],a.pristine=void 0===t.pristine?!0:t.pristine,a.removed=!1,a.loading=!1,a.saving=!1,a.updatedAt=a["synchronized"]===!0?Date.now():r,a.loadingCount=0,a.savingCount=0,a.data={relationships:{},attributes:{}},a.relationships={},angular.forEach(a.schema.relationships,function(e,n){a.relationships[n]=void 0}),a.errors={validation:i.create("Validation","Errors of attributes validation",o),synchronization:i.create("Source","Errors of synchronizations",e)},a.promise=h.resolve(a),P(a,n),a.form=c.create(a)}function f(){function e(){i.synchronize(c).then(n,t,o)}function n(e){u.$emit("angularJsonAPI:"+i.data.type+":object:"+c.action,"resolved",i,e),i.update(e.data.data),i["new"]===!0&&(i.resource.cache.indexIds=i.resource.cache.indexIds||[],i.resource.cache.indexIds.push(i.data.id)),i["synchronized"]=!0,i["new"]=!1,i.pristine=!1,i.stable=!0,e.finish(),i.errors.synchronization.concat(e.errors),s.resolve(e.data.meta)}function t(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","rejected",i,e),e.finish(),i.errors.synchronization.concat(e.errors),s.reject(i)}function o(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","notify",i,e),s.notify(e)}var i=this,s=h.defer(),c={action:i["new"]===!0?"add":"update",object:i};return i.form.validate().then(e,s.reject)["finally"](a.bind(i,void 0)),r(i),s.promise}function y(){var e=this;void 0!==e.form&&e.form.reset()}function g(r){function a(e){function r(e){return n(e),e.synchronize({action:"include",object:e})["finally"](t.bind(e,void 0))}function a(n){angular.forEach(n,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+o.included[n].data.type+":object:include","resolved",o.included[n],e),e.value.finish())}),c.resolve(e.data.meta)}var o=s.__proccesResults(e.data);u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","resolved",d,e),h.allSettled(o.included.map(r)).then(a,c.reject),d["synchronized"]=!0,d.stable=!0,d.pristine=!1,e.finish(),d.errors.synchronization.concat(e.errors)}function o(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","rejected",d,e),e.finish(),d.errors.synchronization.concat(e.errors),c.reject(d)}function i(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","notify",d,e),c.notify(e)}var s=l.get("$jsonapi"),c=h.defer(),d=this;r=void 0===r?d.schema.params.get:r;var p={action:"refresh",object:d,params:r};if(d["new"]===!0){var f=e.create("Can't refresh new object",null,0,"refresh");d.errors.synchronization.add("refresh",f),c.reject(f)}else n(d),d.synchronize(p).then(a,o,i)["finally"](t.bind(d,void 0));return c.promise}function v(){var e=this,n=e.data,t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n,updatedAt:e.updatedAt}}function m(){function e(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","resolved",o,e),o.removed=!0,o.unlinkAll(),o.resource.cache.clearRemoved(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function n(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","rejected",o,e),o.resource.cache.revertRemove(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function t(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","notify",o,e),i.notify(e)}var o=this,i=h.defer(),s={action:"remove",object:o};return o.resource.cache.remove(o.data.id),o["new"]===!0?i.resolve():(r(o),o.synchronize(s).then(e,n,t)["finally"](a.bind(o,void 0))),i.promise}function j(e){function r(e,n){var t=o.schema.relationships[n],r=t.reflection;angular.isArray(e)?angular.forEach(e,a.bind(void 0,r)):angular.isObject(e)&&a(r,e),"hasOne"===t.type?o.relationships[n]=null:"hasMany"===t.type&&(o.relationships[n]=[])}function a(e,r){function a(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","resolve",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function c(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","rejected",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function l(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","notify",o,e),e.finish(),i.notify(e)}var d=r.schema.relationships[e],h={action:"unlinkReflection",object:r,target:o,key:e};n(r),s.unlink(r,e,o,d),r.synchronize(h).then(a,c,l)["finally"](t.bind(r,void 0))}var o=this,i=h.defer();return n(o),void 0===e?angular.forEach(o.relationships,r):r(o.relationships[e],e),t(o),i.promise}function b(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"linkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+c[n].object.data.type+":object:linkReflection","resolved",c[n],e),e.value.finish())}),f.resolve(e.data.meta)}u.$emit("angularJsonAPI:"+y.data.type+":object:link","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"link",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't link undefined",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):y["new"]===!0?(p=e.create("Can't link new object",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function A(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"unlinkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(n){n.success===!0&&(u.$emit("angularJsonAPI:"+c[o].data.type+":object:unlinkReflection","resolved",c[o],n),e.value.finish())}),f.resolve()}u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"unlink",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't unlink undefined",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):y["new"]===!0?(p=e.create("Can't unlink new object",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function k(e,r,a){var o=this;n(o),P(o,e),o.reset(r),o["synchronized"]=a===!0?!1:!0,o.stable=a===!0?!1:!0,o.updatedAt=Date.now(),t(o)}function z(){var e=this,n=!1;return angular.forEach(e.errors,function(e){n=e.hasErrors()||n}),n}function P(e,n){function t(t,r){e.data.attributes[r]=n.attributes[r]}function r(t,r){var i=n.relationships[r];return void 0===i?void(void 0===e.data.relationships[r]&&(e.data.relationships[r]={data:void 0})):(e.data.relationships[r]=e.data.relationships[r]||{},e.data.relationships[r].links=i.links,void("hasOne"===t.type?a(e,r,i.data):"hasMany"===t.type&&angular.isArray(i.data)&&(0===i.data.length?(e.data.relationships[r].data=[],e.unlinkAll(r)):(angular.forEach(e.relationships[r],o.bind(void 0,e,r,i.data)),angular.forEach(i.data,a.bind(void 0,e,r))))))}function a(e,n,t){var r;if(null===t)return void s.link(e,n,null);if(void 0!==t){if(r=i.getResource(t.type),void 0===r)return void d.error("Factory not found",t.type,t);var a=r.cache.get(t.id);s.link(e,n,a)}}function o(e,n,t,r){t.indexOf(r.data.id)>-1||s.unlink(e,n,r)}var i=l.get("$jsonapi"),c=e.schema;return e.data.id=n.id,e.data.type=n.type,e.resource.schema.type!==n.type?(d.error("Different type then resource",e.resource.schema.type,n),!1):e.schema.id.validate(e.data.id)?(e.data.links=n.links,n.attributes=n.attributes||{},n.relationships=n.relationships||{},angular.forEach(c.attributes,t),angular.forEach(c.relationships,r),!0):(d.error("Invalid id"),!1)}return p.prototype.refresh=g,p.prototype.remove=m,p.prototype.reset=y,p.prototype.save=f,p.prototype.update=k,p.prototype.link=b,p.prototype.unlink=A,p.prototype.unlinkAll=j,p.prototype.toJson=v,p.prototype.hasErrors=z,p}function n(e){e=void 0===e?this:e,e.loadingCount+=1,e.loading=!0}function t(e){e=void 0===e?this:e,e.loadingCount-=1,e.loading=e.loadingCount>0}function r(e){e=void 0===e?this:e,e.savingCount+=1,e.saving=!0}function a(e){e=void 0===e?this:e,e.savingCount-=1,e.saving=e.savingCount>0}angular.module("angular-jsonapi").factory("AngularJsonAPIAbstractModel",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelValidationError","AngularJsonAPIModelErrorsManager","AngularJsonAPIModelLinkerService","AngularJsonAPIModelForm","$rootScope","$injector","$log","$q"]}(),function(){"use strict";function e(){function e(e,t){return new n(e,t)}function n(e,n){var t=this;t.message=e,t.context={attribute:n}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="ValidationError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelValidationError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.message=e,a.context={source:n,code:t,action:r}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="SourceError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelSourceError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.name=e,a.description=n,a.ErrorConstructor=t,a.errors={},a.defaultFilter=r||function(){return!0}}function t(e){var n=this;void 0===e?angular.forEach(n.errors,function(e,t){n.errors[t]=[]}):n.errors[e]=[]}function r(e,n){var t=this;t.errors[e]=t.errors[e]||[],t.errors[e].push(n)}function a(e){var n=this;angular.forEach(e,function(e){n.errors[e.key]=[]}),angular.forEach(e,function(e){n.errors[e.key].push(e.object)})}function o(e){var n=this;if(void 0===e){var t=!1;return angular.forEach(n.errors,function(e){t=t||e.length>0}),t}return void 0!==n.errors[e]&&n.errors[e].length>0}return n.prototype.constructor=n,n.prototype.concat=a,n.prototype.clear=t,n.prototype.add=r,n.prototype.hasErrors=o,{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelErrorsManager",e)}(),function(){"use strict";function e(e,n){return new Function("fn","return function "+e+"(){ return fn.apply(this,arguments)}")(n)}angular.module("angular-jsonapi").constant("namedFunction",e)}(),function(){"use strict";angular.module("angular-jsonapi").constant("lazyProperty",function(e,n,t){var r,a;Object.defineProperty(e,n,{get:function(){return a||(a=!0,r=t.call(e)),r},enumerable:!0,configurable:!0})})}(),function(){"use strict";angular.module("angular-jsonapi").constant("toKebabCase",function(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()})}(),function(){"use strict";function e(e){e.decorator("$q",n)}function n(e){function n(e,n,r){function a(e){return t.resolve(e).then(function(e){return angular.isFunction(n)&&n(e),{success:!0,value:e}},function(e){return angular.isFunction(r)&&r(e),{success:!1,reason:e}})}var o=angular.isArray(e)?[]:{};return angular.forEach(e,function(e,n){o.hasOwnProperty(n)||(o[n]=a(e))}),t.all(o)}var t=e;return t.allSettled=t.allSettled||n,t}angular.module("angular-jsonapi").config(e),e.$inject=["$provide"],n.$inject=["$delegate"]}(),function(){"use strict";function e(e,n,t){function r(e){return new a(e)}function a(n){var t=this;t.state={},e.call(t,n),angular.forEach(n,function(e){e.synchronizer=t})}function o(r){function a(e){d.notify({step:"synchronization",data:e})}function o(e){d.notify({step:"synchronization",errors:e})}function i(e){u.state[h]=u.state[h]||{},u.state[h].success=!0,angular.forEach(e,function(e){e.success===!1&&(u.state[h].success=!1)}),angular.forEach(u.sources,function(n){angular.forEach(n.afterHooks[h],function(n){d.notify({step:"after",errors:n.call(u,r,e)})})});var n,t=[];angular.forEach(e,function(e){e.success===!0?n=e.value:t.push({key:h,object:e.reason})}),t.length>0?d.reject({data:n||{},finish:s,errors:t}):d.resolve({data:n||{},finish:s,errors:t})}function s(){angular.forEach(u.sources,function(e){angular.forEach(e.finishHooks[h],function(e){d.notify({step:"finish",errors:e.call(u,r)})})})}function c(e){t.error("All settled rejected! Something went wrong"),d.reject({finish:angular.noop,errors:e})}var u=this,l=[],d=n.defer(),h=r.action;return e.prototype.synchronize.call(u,r),angular.forEach(u.sources,function(e){angular.forEach(e.beginHooks[h],function(e){d.notify({step:"begin",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.beforeHooks[h],function(e){d.notify({step:"before",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.synchronizationHooks[h],function(e){l.push(e.call(u,r))})}),n.allSettled(l,a,o).then(i,c),d.promise}return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,a.prototype.synchronize=o,{create:r}}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerSimple",e),e.$inject=["AngularJsonAPISynchronizerPrototype","$q","$log"]}(),function(){"use strict";function e(e){function n(e){var n=this;n.sources=e}function t(n){var t=this;e.debug("Synchro Collection",t.resource.schema.type,n),void 0===n.action&&e.error("Can't synchronize undefined action",n)}return n.prototype.synchronize=t,n}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerPrototype",e),e.$inject=["$log"]}(),function(){"use strict";function e(){function e(e){var n=this,t=["add","init","get","all","clearCache","remove","unlink","unlinkReflection","link","linkReflection","update","refresh","include"];n.name=e,n.state={},n.beginHooks={},n.beforeHooks={},n.synchronizationHooks={},n.afterHooks={},n.finishHooks={},n.options={},angular.forEach(t,function(e){n.beginHooks[e]=[],n.beforeHooks[e]=[],n.synchronizationHooks[e]=[],n.afterHooks[e]=[],n.finishHooks[e]=[],n.state[e]={loading:!1,success:!0}})}function n(e,n){var t=this;t.beginHooks[e].push(n)}function t(e,n){var t=this;t.finishHooks[e].push(n)}function r(e,n){var t=this;t.beforeHooks[e].push(n)}function a(e,n){var t=this;t.afterHooks[e].push(n)}function o(e,n){var t=this;t.synchronizationHooks[e].push(n)}return e.prototype.before=r, e.prototype.after=a,e.prototype.begin=n,e.prototype.finish=t,e.prototype.synchronization=o,e}angular.module("angular-jsonapi").factory("AngularJsonAPISourcePrototype",e)}(),function(){"use strict";function e(e,n,t,r){function a(e){return new o(e)}function o(e){var n=this,a=e.include||{};e.include=a,a.get=e.include.get||[],a.all=e.include.all||[],n.params={get:{},all:{}},"uuid4"===e.id?e.id=t:"int"===e.id?e.id={generate:angular.noop,validate:angular.isNumber}:angular.isObject(e.id)?angular.isFunction(e.id.generate)||(e.id.generate=angular.noop):e.id={generate:angular.noop,validate:angular.identity.bind(null,!0)},angular.forEach(e.relationships,function(n,t){var o=r.create(n,t,e.type);e.relationships[t]=o,o.included===!0&&(a.get.push(t),"hasOne"===o.type&&a.all.push(t))}),angular.extend(n,e),a.get.length>0&&(n.params.get.include=a.get),a.all.length>0&&(n.params.all.include=a.all)}return{create:a}}angular.module("angular-jsonapi").factory("AngularJsonAPISchema",e),e.$inject=["$log","pluralize","uuid4","AngularJsonAPISchemaLink"]}(),function(){"use strict";function e(e,n){function t(e,n,t){return new r(e,n,t)}function r(t,r,a){var o=this;angular.isString(t)?(o.model=n.plural(r),o.type=t,o.polymorphic=!1,o.reflection=a):(void 0===t.type&&e.error("Schema of link without a type: ",t,r),"hasMany"!==t.type&&"hasOne"!==t.type&&e.error("Schema of link with wrong type: ",t.type,"available: hasOne, hasMany"),o.model=t.model||n.plural(r),o.type=t.type,o.polymorphic=t.polymorphic||!1,void 0===t.reflection?o.reflection="hasMany"===o.type?n.singular(a):a:o.reflection=t.reflection,o.included=t.included||!1)}return{create:t}}angular.module("angular-jsonapi").factory("AngularJsonAPISchemaLink",e),e.$inject=["$log","pluralize"]}(),function(){"use strict";function e(e,n,t,r,a,o,i){function s(e,n){return new c(e,n)}function c(r,o){function i(e){a.$emit("angularJsonAPI:"+u.type+":resource:init","resolved",e),u.cache.fromJson(e.data),u.initialized=!0,e.finish()}function s(e){a.$emit("angularJsonAPI:"+u.type+":resource:init","rejected",e),e.finish(),u.initialized=!0}function c(e){a.$emit("angularJsonAPI:"+u.type+":resource:init","notify",e)}var u=this,l={action:"init"};u.schema=n.create(r),u.cache=t.create(u),u.synchronizer=o,u.synchronizer.resource=u,u.modelFactory=e.modelFactory(u.schema,u),u.initialized=!1,u.type=u.schema.type,o.resource=u,u.synchronizer.synchronize(l).then(i,s,c)}function u(e,n){var t=this;if(!t.schema.id.validate(e))return i.reject({errors:[{status:0,statusText:"Invalid id"}]});var r=t.cache.get(e);return r.promise=r.refresh(n),r}function l(e){var n=this;e=angular.extend({},n.schema.params.all,e);var t=r.create(n,e);return t.promise=t.fetch(),t}function d(e){var n=this,t=n.cache.remove(e);return t.remove()}function h(){var e=this,n={};angular.forEach(e.schema.relationships,function(e,t){"hasOne"===e.type?n[t]={data:null}:"hasMany"===e.type&&(n[t]={data:[]})});var t={type:e.type,id:e.schema.id.generate(),attributes:{},relationships:n},r={"new":!0,"synchronized":!1,stable:!1,pristine:!1,initialization:!1},o=e.modelFactory(t,r);return a.$emit("angularJsonAPI:"+e.type+":resource:initialize","resolved",o),o}function p(){function e(e){a.$emit("angularJsonAPI:"+r.type+":resource:clearCache","resolved",e),e.finish(),o.resolve(e)}function n(e){a.$emit("angularJsonAPI:"+r.type+":resource:clearCache","resolved",e),e.finish(),o.reject(e)}function t(e){a.$emit("angularJsonAPI:"+r.type+":resource:clearCache","notify",e),o.notify(e)}var r=this,o=i.defer(),s={action:"clearCache"};return r.cache.clear(),r.synchronizer.synchronize(s).then(e,n,t),o}return c.prototype.get=u,c.prototype.all=l,c.prototype.remove=d,c.prototype.initialize=h,c.prototype.clearCache=p,{create:s}}angular.module("angular-jsonapi").factory("AngularJsonAPIResource",e),e.$inject=["AngularJsonAPIModel","AngularJsonAPISchema","AngularJsonAPIResourceCache","AngularJsonAPICollection","$rootScope","$log","$q"]}(),function(){"use strict";function e(e,n,t,r,a){function o(n,o){function i(e,n,t){return new c(e,n,t)}var s=r.plural(n.type,1),c=t(s,function(n,t,r){var o=this;n.type!==o.schema.type&&a.error("Data type other then declared in schema: ",n.type," instead of ",o.schema.type),e.call(o,n,t,r),o.form.parent=o});return c.prototype=Object.create(e.prototype),c.prototype.constructor=c,c.prototype.schema=n,c.prototype.resource=o,c.prototype.synchronize=o.synchronizer.synchronize.bind(o.synchronizer),angular.forEach(n.functions,function(e,n){c.prototype[n]=function(){return e.apply(this,arguments)}}),i}return{modelFactory:o}}angular.module("angular-jsonapi").factory("AngularJsonAPIModel",e),e.$inject=["AngularJsonAPIAbstractModel","AngularJsonAPISchema","namedFunction","pluralize","$log"]}(),function(){"use strict";function e(e,r,a,o,i){function s(e,n){return new c(e,n)}function c(n,t){function o(e,n,t){var r;"resolved"===n&&void 0!==l.data&&(r=l.data.indexOf(t),r>-1&&(l.data.splice(r,1),l.resource.cache.setIndexIds(l.data)))}function s(){l.data=void 0,l.pristine=!0}function c(e,n,t){"resolved"===n&&(l.data=l.data||[],l.data.push(t))}function u(){d(),h(),p()}var l=this;l.resource=n,l.type=n.schema.type,l.params=t||{},l.errors={synchronization:r.create("Source","Errors of synchronizations",e)},l.data=l.resource.cache.index(l.params),l.loading=!1,l.loadingCount=0,l["synchronized"]=!1,l.pristine=void 0===l.data,l.promise=i.resolve(l);var d=a.$on("angularJsonAPI:"+l.type+":object:remove",o),h=a.$on("angularJsonAPI:"+l.type+":resource:clearCache",s),p=a.$on("angularJsonAPI:"+l.type+":object:add",c);a.$on("$destroy",u)}function u(){var e=this,n=!1;return angular.forEach(e.errors,function(e){n=e.hasErrors()||n}),n}function l(e,n){var t=this;return t.resource.get(e,n)}function d(){function e(e){function r(e){return n(e),e.synchronize({action:"include",object:e})["finally"](t.bind(e,void 0))}function o(n){angular.forEach(n,function(e,n){e.success===!0&&(a.$emit("angularJsonAPI:"+s.included[n].data.type+":object:include","resolved",s.included[n],e),e.value.finish())}),u.resolve(e.data.meta)}var s=l.__proccesResults(e.data);a.$emit("angularJsonAPI:"+c.type+":collection:fetch","resolved",c,e),i.allSettled(s.included.map(r)).then(o,u.reject),angular.forEach(c.data,t),c.data=s.data,c.links=e.data.links,c.updatedAt=Date.now(),c["synchronized"]=!0,c.pristine=!1,c.resource.cache.setIndexIds(c.data),e.finish(),c.errors.synchronization.concat(e.errors)}function r(e){a.$emit("angularJsonAPI:"+c.type+":collection:fetch","rejected",c,e),angular.forEach(c.data,t),e.finish(),c.errors.synchronization.concat(e.errors),u.reject(c)}function s(e){a.$emit("angularJsonAPI:"+c.type+":collection:fetch","notify",c,e),u.notify(e)}var c=this,u=i.defer(),l=o.get("$jsonapi"),d={action:"all",params:c.params};return n(c),angular.forEach(c.data,n),c.resource.synchronizer.synchronize(d).then(e,r,s)["finally"](t.bind(c,void 0)),u.promise}return c.prototype.fetch=d,c.prototype.refresh=d,c.prototype.get=l,c.prototype.hasErrors=u,{create:s}}function n(e){e=void 0===e?this:e,e.loadingCount+=1,e.loading=!0}function t(e){e=void 0===e?this:e,e.loadingCount-=1,e.loading=e.loadingCount>0}angular.module("angular-jsonapi").factory("AngularJsonAPICollection",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelErrorsManager","$rootScope","$injector","$q"]}(),function(){"use strict";function e(e){function n(n,a,o){function i(e,n){var o=a.create(e,n);t[e.type]=o,r.push(e.type)}function s(e){return t[e]}function c(){return t}function u(){return r}function l(){angular.forEach(t,function(e){e.clearCache()})}function d(t,r){return angular.isString(t)?(void 0===e.validators[t]&&n.warn("Redeclaring validator",t),void(e.validators[t]=r)):void n.error("Validator name is not a string",t)}function h(e){var t={data:[],included:[]};if(void 0===e)return void n.error("Can't proccess results:",e);var r={"new":!1,"synchronized":!0,stable:!0,pristine:!1,initialization:!1};return angular.forEach(e.included,function(e){t.included.push(s(e.type).cache.addOrUpdate(e,r))}),angular.isArray(e.data)?angular.forEach(e.data,function(e){t.data.push(s(e.type).cache.addOrUpdate(e,r))}):void 0!==e.data&&t.data.push(s(e.data.type).cache.addOrUpdate(e.data,r)),t}return{addResource:i,getResource:s,clearCache:l,allResources:c,listResources:u,addValidator:d,synchronizerSimple:o,__proccesResults:h}}var t={},r=[];this.$get=n,n.$inject=["$log","AngularJsonAPIResource","AngularJsonAPISynchronizerSimple"]}angular.module("angular-jsonapi").provider("$jsonapi",e),e.$inject=["validateJS"]}(),function(){"use strict";angular.module("angular-jsonapi").config(["$logProvider",function(e){e.debugEnabled(!1)}]).run(["validateJS","$q",function(e,n){e.Promise=n}])}(); -//# sourceMappingURL=../maps/scripts/lib-f2c7ec66be.js.map \ No newline at end of file +//# sourceMappingURL=../maps/scripts/lib-f2c7ec66be.js.map diff --git a/dist-demo/scripts/vendor-5f48f0c060.js b/dist-demo/scripts/vendor-5f48f0c060.js index 0f7c49d..8cc908a 100644 --- a/dist-demo/scripts/vendor-5f48f0c060.js +++ b/dist-demo/scripts/vendor-5f48f0c060.js @@ -57,7 +57,7 @@ function(e,t,n){"use strict";var a=function(e,t,n){n=r.extend({},r.options,n);va * of patent rights can be found in the PATENTS file in the same directory. */ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Parse=e()}}(function(){return function e(t,n,a){function r(o,s){if(!n[o]){if(!t[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(i)return i(o,!0);var u=new Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[o]={exports:{}};t[o][0].call(c.exports,function(e){var n=t[o][1][e];return r(n?n:e)},c,c.exports,e,t,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;on;n++)t[n]=arguments[n];return c["default"].getRESTController().request.apply(null,t)},v._ajax=function(){for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];return c["default"].getRESTController().ajax.apply(null,t)},v._decode=function(e,t){return o["default"](t)},v._encode=function(e,t,n){return l["default"](e,n)},v._getInstallationId=function(){return c["default"].getInstallationController().currentInstallationId()},c["default"].setInstallationController(f["default"]),c["default"].setRESTController(g["default"]),v.Parse=v,t.exports=v},{"./Analytics":1,"./Cloud":2,"./CoreManager":3,"./FacebookUtils":4,"./InstallationController":5,"./ParseACL":8,"./ParseConfig":9,"./ParseError":10,"./ParseFile":11,"./ParseGeoPoint":12,"./ParseInstallation":13,"./ParseObject":14,"./ParseOp":15,"./ParsePromise":16,"./ParseQuery":17,"./ParseRelation":18,"./ParseRole":19,"./ParseSession":20,"./ParseUser":21,"./Push":22,"./RESTController":23,"./Storage":24,"./decode":29,"./encode":30,"babel-runtime/helpers/interop-require-default":47,"babel-runtime/helpers/interop-require-wildcard":48}],8:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/create-class")["default"],r=e("babel-runtime/helpers/class-call-check")["default"],i=e("babel-runtime/core-js/object/keys")["default"],o=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var s=e("./ParseRole"),l=o(s),u=e("./ParseUser"),c=o(u),d="*",f=function(){function e(t){if(r(this,e),this.permissionsById={},t&&"object"==typeof t)if(t instanceof c["default"])this.setReadAccess(t,!0),this.setWriteAccess(t,!0);else for(var n in t){var a=t[n];if("string"!=typeof n)throw new TypeError("Tried to create an ACL with an invalid user id.");this.permissionsById[n]={};for(var i in a){var o=a[i];if("read"!==i&&"write"!==i)throw new TypeError("Tried to create an ACL with an invalid permission type.");if("boolean"!=typeof o)throw new TypeError("Tried to create an ACL with an invalid permission value.");this.permissionsById[n][i]=o}}else if("function"==typeof t)throw new TypeError("ParseACL constructed with a function. Did you forget ()?")}return a(e,[{key:"toJSON",value:function(){var e={};for(var t in this.permissionsById)e[t]=this.permissionsById[t];return e}},{key:"equals",value:function(t){if(!(t instanceof e))return!1;var n=i(this.permissionsById),a=i(t.permissionsById);if(n.length!==a.length)return!1;for(var r in this.permissionsById){if(!t.permissionsById[r])return!1;if(this.permissionsById[r].read!==t.permissionsById[r].read)return!1;if(this.permissionsById[r].write!==t.permissionsById[r].write)return!1}return!0}},{key:"_setAccess",value:function(e,t,n){if(t instanceof c["default"]?t=t.id:t instanceof l["default"]&&(t="role:"+t.getName()),"string"!=typeof t)throw new TypeError("userId must be a string.");if("boolean"!=typeof n)throw new TypeError("allowed must be either true or false.");var a=this.permissionsById[t];if(!a){if(!n)return;a={},this.permissionsById[t]=a}n?this.permissionsById[t][e]=!0:(delete a[e],0===i(a).length&&delete this.permissionsById[t])}},{key:"_getAccess",value:function(e,t){t instanceof c["default"]?t=t.id:t instanceof l["default"]&&(t="role:"+t.getName());var n=this.permissionsById[t];return n?!!n[e]:!1}},{key:"setReadAccess",value:function(e,t){this._setAccess("read",e,t)}},{key:"getReadAccess",value:function(e){return this._getAccess("read",e)}},{key:"setWriteAccess",value:function(e,t){this._setAccess("write",e,t)}},{key:"getWriteAccess",value:function(e){return this._getAccess("write",e)}},{key:"setPublicReadAccess",value:function(e){this.setReadAccess(d,e)}},{key:"getPublicReadAccess",value:function(){return this.getReadAccess(d)}},{key:"setPublicWriteAccess",value:function(e){this.setWriteAccess(d,e)}},{key:"getPublicWriteAccess",value:function(){return this.getWriteAccess(d)}},{key:"getRoleReadAccess",value:function(e){if(e instanceof l["default"]&&(e=e.getName()),"string"!=typeof e)throw new TypeError("role must be a ParseRole or a String");return this.getReadAccess("role:"+e)}},{key:"getRoleWriteAccess",value:function(e){if(e instanceof l["default"]&&(e=e.getName()),"string"!=typeof e)throw new TypeError("role must be a ParseRole or a String");return this.getWriteAccess("role:"+e)}},{key:"setRoleReadAccess",value:function(e,t){if(e instanceof l["default"]&&(e=e.getName()),"string"!=typeof e)throw new TypeError("role must be a ParseRole or a String");this.setReadAccess("role:"+e,t)}},{key:"setRoleWriteAccess",value:function(e,t){if(e instanceof l["default"]&&(e=e.getName()),"string"!=typeof e)throw new TypeError("role must be a ParseRole or a String");this.setWriteAccess("role:"+e,t)}}]),e}();n["default"]=f,t.exports=n["default"]},{"./ParseRole":19,"./ParseUser":21,"babel-runtime/core-js/object/keys":41,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47}],9:[function(e,t,n){"use strict";function a(e){try{var t=JSON.parse(e);if(t&&"object"==typeof t)return c["default"](t)}catch(n){return null}}var r=e("babel-runtime/helpers/create-class")["default"],i=e("babel-runtime/helpers/class-call-check")["default"],o=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var s=e("./CoreManager"),l=o(s),u=e("./decode"),c=o(u),d=e("./encode"),f=(o(d),e("./escape")),m=o(f),h=e("./ParseError"),p=o(h),g=e("./ParsePromise"),v=o(g),b=e("./Storage"),y=o(b),k=function(){function e(){i(this,e),this.attributes={},this._escapedAttributes={}}return r(e,[{key:"get",value:function(e){return this.attributes[e]}},{key:"escape",value:function(e){var t=this._escapedAttributes[e];if(t)return t;var n=this.attributes[e],a="";return null!=n&&(a=m["default"](n.toString())),this._escapedAttributes[e]=a,a}}],[{key:"current",value:function(){var e=l["default"].getConfigController();return e.current()}},{key:"get",value:function(e){e=e||{};var t=l["default"].getConfigController();return t.get()._thenRunCallbacks(e)}}]),e}();n["default"]=k;var S=null,w="currentConfig";l["default"].setConfigController({current:function(){if(S)return S;var e,t=new k,n=y["default"].generatePath(w);if(!y["default"].async()){if(e=y["default"].getItem(n)){var r=a(e);r&&(t.attributes=r,S=t)}return t}return y["default"].getItemAsync(n).then(function(e){if(e){var n=a(e);n&&(t.attributes=n,S=t)}return t})},get:function(){var e=l["default"].getRESTController();return e.request("GET","config",{},{}).then(function(e){if(!e||!e.params){var t=new p["default"](p["default"].INVALID_JSON,"Config JSON response invalid.");return v["default"].error(t)}var n=new k;n.attributes={};for(var a in e.params)n.attributes[a]=c["default"](e.params[a]);return S=n,y["default"].setItemAsync(y["default"].generatePath(w),JSON.stringify(e.params)).then(function(){return n})})}}),t.exports=n["default"]},{"./CoreManager":3,"./ParseError":10,"./ParsePromise":16,"./Storage":24,"./decode":29,"./encode":30,"./escape":32,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47}],10:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/class-call-check")["default"];Object.defineProperty(n,"__esModule",{value:!0});var r=function i(e,t){a(this,i),this.code=e,this.message=t};n["default"]=r,r.OTHER_CAUSE=-1,r.INTERNAL_SERVER_ERROR=1,r.CONNECTION_FAILED=100,r.OBJECT_NOT_FOUND=101,r.INVALID_QUERY=102,r.INVALID_CLASS_NAME=103,r.MISSING_OBJECT_ID=104,r.INVALID_KEY_NAME=105,r.INVALID_POINTER=106,r.INVALID_JSON=107,r.COMMAND_UNAVAILABLE=108,r.NOT_INITIALIZED=109,r.INCORRECT_TYPE=111,r.INVALID_CHANNEL_NAME=112,r.PUSH_MISCONFIGURED=115,r.OBJECT_TOO_LARGE=116,r.OPERATION_FORBIDDEN=119,r.CACHE_MISS=120,r.INVALID_NESTED_KEY=121,r.INVALID_FILE_NAME=122,r.INVALID_ACL=123,r.TIMEOUT=124,r.INVALID_EMAIL_ADDRESS=125,r.MISSING_CONTENT_TYPE=126,r.MISSING_CONTENT_LENGTH=127,r.INVALID_CONTENT_LENGTH=128,r.FILE_TOO_LARGE=129,r.FILE_SAVE_ERROR=130,r.DUPLICATE_VALUE=137,r.INVALID_ROLE_NAME=139,r.EXCEEDED_QUOTA=140,r.SCRIPT_FAILED=141,r.VALIDATION_ERROR=142,r.INVALID_IMAGE_DATA=143,r.UNSAVED_FILE_ERROR=151,r.INVALID_PUSH_TIME_ERROR=152,r.FILE_DELETE_ERROR=153,r.REQUEST_LIMIT_EXCEEDED=155,r.INVALID_EVENT_NAME=160,r.USERNAME_MISSING=200,r.PASSWORD_MISSING=201,r.USERNAME_TAKEN=202,r.EMAIL_TAKEN=203,r.EMAIL_MISSING=204,r.EMAIL_NOT_FOUND=205,r.SESSION_MISSING=206,r.MUST_CREATE_USER_THROUGH_SIGNUP=207,r.ACCOUNT_ALREADY_LINKED=208,r.INVALID_SESSION_TOKEN=209,r.LINKED_ID_MISSING=250,r.INVALID_LINKED_SESSION=251,r.UNSUPPORTED_SERVICE=252,r.AGGREGATE_ERROR=600,r.FILE_READ_ERROR=601,r.X_DOMAIN_REQUEST=602,t.exports=n["default"]},{"babel-runtime/helpers/class-call-check":43}],11:[function(e,t,n){"use strict";function a(e){if(26>e)return String.fromCharCode(65+e);if(52>e)return String.fromCharCode(97+(e-26));if(62>e)return String.fromCharCode(48+(e-52));if(62===e)return"+";if(63===e)return"/";throw new TypeError("Tried to encode large digit "+e+" in base64.")}var r=e("babel-runtime/helpers/create-class")["default"],i=e("babel-runtime/helpers/class-call-check")["default"],o=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var s=e("./CoreManager"),l=o(s),u=e("./ParsePromise"),c=(o(u),function(){function e(t,n,a){i(this,e);var r=a||"";if(this._name=t,Array.isArray(n))this._source={format:"base64",base64:e.encodeBase64(n),type:r};else if("undefined"!=typeof File&&n instanceof File)this._source={format:"file",file:n,type:r};else if(n&&n.hasOwnProperty("base64")){var o=/^data:([a-zA-Z]*\/[a-zA-Z+.-]*);(charset=[a-zA-Z0-9\-\/\s]*,)?base64,(\S+)/.exec(n.base64);o&&o.length>0?this._source={format:"base64",base64:4===o.length?o[3]:o[2],type:o[1]}:this._source={format:"base64",base64:n.base64,type:r}}else if("undefined"!=typeof n)throw new TypeError("Cannot create a Parse.File with that data.")}return r(e,[{key:"name",value:function(){return this._name}},{key:"url",value:function(){return this._url}},{key:"save",value:function(e){var t=this;e=e||{};var n=l["default"].getFileController();return this._previousSave||("file"===this._source.format?this._previousSave=n.saveFile(this._name,this._source).then(function(e){return t._name=e.name,t._url=e.url,t}):this._previousSave=n.saveBase64(this._name,this._source).then(function(e){return t._name=e.name,t._url=e.url,t})),this._previousSave?this._previousSave._thenRunCallbacks(e):void 0}},{key:"toJSON",value:function(){return{__type:"File",name:this._name,url:this._url}}},{key:"equals",value:function(t){return this===t?!0:t instanceof e&&this.name()===t.name()&&this.url()===t.url()&&"undefined"!=typeof this.url()}}],[{key:"fromJSON",value:function(t){if("File"!==t.__type)throw new TypeError("JSON object does not represent a ParseFile");var n=new e(t.name);return n._url=t.url,n}},{key:"encodeBase64",value:function(e){var t=[];t.length=Math.ceil(e.length/3);for(var n=0;n>2&63),a(r<<4&48|i>>4&15),s?a(i<<2&60|o>>6&3):"=",l?a(63&o):"="].join("")}return t.join("")}}]),e}());n["default"]=c,l["default"].setFileController({saveFile:function(e,t){if("file"!==t.format)throw new Error("saveFile can only be used with File-type sources.");var n={"X-Parse-Application-ID":l["default"].get("APPLICATION_ID"),"X-Parse-JavaScript-Key":l["default"].get("JAVASCRIPT_KEY")},a=l["default"].get("SERVER_URL");return a+="/1/files/"+e,l["default"].getRESTController().ajax("POST",a,t.file,n)},saveBase64:function(e,t){if("base64"!==t.format)throw new Error("saveBase64 can only be used with Base64-type sources.");var n={base64:t.base64};return t.type&&(n._ContentType=t.type),l["default"].getRESTController().request("POST","files/"+e,n)}}),t.exports=n["default"]},{"./CoreManager":3,"./ParsePromise":16,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47}],12:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/create-class")["default"],r=e("babel-runtime/helpers/class-call-check")["default"],i=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var o=e("./ParsePromise"),s=i(o),l=function(){function e(t,n){r(this,e),Array.isArray(t)?(e._validate(t[0],t[1]),this._latitude=t[0],this._longitude=t[1]):"object"==typeof t?(e._validate(t.latitude,t.longitude),this._latitude=t.latitude,this._longitude=t.longitude):"number"==typeof t&&"number"==typeof n?(e._validate(t,n),this._latitude=t,this._longitude=n):(this._latitude=0,this._longitude=0)}return a(e,[{key:"toJSON",value:function(){return e._validate(this._latitude,this._longitude),{__type:"GeoPoint",latitude:this._latitude,longitude:this._longitude}}},{key:"equals",value:function(t){return t instanceof e&&this.latitude===t.latitude&&this.longitude===t.longitude}},{key:"radiansTo",value:function(e){var t=Math.PI/180,n=this.latitude*t,a=this.longitude*t,r=e.latitude*t,i=e.longitude*t,o=Math.sin((n-r)/2),s=Math.sin((a-i)/2),l=o*o+Math.cos(n)*Math.cos(r)*s*s;return l=Math.min(1,l),2*Math.asin(Math.sqrt(l))}},{key:"kilometersTo",value:function(e){return 6371*this.radiansTo(e)}},{key:"milesTo",value:function(e){return 3958.8*this.radiansTo(e)}},{key:"latitude",get:function(){return this._latitude},set:function(t){e._validate(t,this.longitude),this._latitude=t}},{key:"longitude",get:function(){return this._longitude},set:function(t){e._validate(this.latitude,t),this._longitude=t}}],[{key:"_validate",value:function(e,t){if(e!==e||t!==t)throw new TypeError("GeoPoint latitude and longitude must be valid numbers");if(-90>e)throw new TypeError("GeoPoint latitude out of bounds: "+e+" < -90.0.");if(e>90)throw new TypeError("GeoPoint latitude out of bounds: "+e+" > 90.0.");if(-180>t)throw new TypeError("GeoPoint longitude out of bounds: "+t+" < -180.0.");if(t>180)throw new TypeError("GeoPoint longitude out of bounds: "+t+" > 180.0.")}},{key:"current",value:function(t){var n=new s["default"];return navigator.geolocation.getCurrentPosition(function(t){n.resolve(new e(t.coords.latitude,t.coords.longitude))},function(e){n.reject(e)}),n._thenRunCallbacks(t)}}]),e}();n["default"]=l,t.exports=n["default"]},{"./ParsePromise":16,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47}],13:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/get")["default"],r=e("babel-runtime/helpers/inherits")["default"],i=e("babel-runtime/helpers/class-call-check")["default"],o=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var s=e("./ParseObject"),l=o(s),u=function(e){function t(e){if(i(this,t),a(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,"_Installation"),e&&"object"==typeof e&&!this.set(e||{}))throw new Error("Can't create an invalid Session")}return r(t,e),t}(l["default"]);n["default"]=u,l["default"].registerSubclass("_Installation",u),t.exports=n["default"]},{"./ParseObject":14,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/get":45,"babel-runtime/helpers/inherits":46,"babel-runtime/helpers/interop-require-default":47}],14:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/create-class")["default"],r=e("babel-runtime/helpers/class-call-check")["default"],i=e("babel-runtime/core-js/object/keys")["default"],o=e("babel-runtime/core-js/object/freeze")["default"],s=e("babel-runtime/core-js/object/create")["default"],l=e("babel-runtime/core-js/object/define-property")["default"],u=e("babel-runtime/helpers/interop-require-default")["default"],c=e("babel-runtime/helpers/interop-require-wildcard")["default"];Object.defineProperty(n,"__esModule",{value:!0});var d=e("./CoreManager"),f=u(d),m=e("./canBeSerialized"),h=u(m),p=e("./decode"),g=u(p),v=e("./encode"),b=u(v),y=e("./equals"),k=(u(y),e("./escape")),S=u(k),w=e("./ObjectState"),A=c(w),C=e("./ParseACL"),j=u(C),x=e("./parseDate"),M=u(x),_=e("./ParseError"),T=u(_),z=e("./ParseFile"),E=u(z),P=e("./ParseOp"),$=e("./ParsePromise"),R=u($),D=e("./ParseQuery"),L=u(D),B=e("./ParseRelation"),N=u(B),O=e("./unique"),K=u(O),I=e("./unsavedChildren"),F=u(I),H={},G=0,q=0,J=!f["default"].get("IS_NODE"),V=function(){function e(t,n){r(this,e);var a=null;if(this._objCount=q++,"string"==typeof t)this.className=t,n&&"object"==typeof n&&(a=n);else if(t&&"object"==typeof t){this.className=t.className,a={};for(var i in t)"className"!==i&&(a[i]=t[i])}if(a&&!this.set(a))throw new Error("Can't create an invalid Parse Object");"function"==typeof this.initialize&&this.initialize.apply(this,arguments); -}return a(e,[{key:"_getId",value:function(){if("string"==typeof this.id)return this.id;if("string"==typeof this._localId)return this._localId;var e="local"+String(G++);return this._localId=e,e}},{key:"_getStateIdentifier",value:function(){return"string"==typeof this.id?J?this.id:this.id+"_"+String(this._objCount):this._getId()}},{key:"_getServerData",value:function(){return A.getServerData(this.className,this._getStateIdentifier())}},{key:"_clearServerData",value:function(){var e=this._getServerData(),t={};for(var n in e)t[n]=void 0;A.setServerData(this.className,this._getStateIdentifier(),t)}},{key:"_getPendingOps",value:function(){return A.getPendingOps(this.className,this._getStateIdentifier())}},{key:"_clearPendingOps",value:function(){var e=this._getPendingOps(),t=e[e.length-1],n=i(t);n.forEach(function(e){delete t[e]})}},{key:"_getDirtyObjectAttributes",value:function(){var t=this.attributes,n=A.getObjectCache(this.className,this._getStateIdentifier()),a={};for(var r in t){var i=t[r];if(i&&"object"==typeof i&&!(i instanceof e)&&!(i instanceof E["default"])&&!(i instanceof N["default"])){var o=b["default"](i,!1,!0),s=JSON.stringify(o);n[r]!==s&&(a[r]=i)}}return a}},{key:"_toFullJSON",value:function(){var e=this.toJSON();return e.__type="Object",e.className=this.className,e}},{key:"_getSaveJSON",value:function(){var e,t=this._getPendingOps(),n=this._getDirtyObjectAttributes(),a={};for(e in n)a[e]=new P.SetOp(n[e]).toJSON();for(e in t[0])a[e]=t[0][e].toJSON();return a}},{key:"_getSaveParams",value:function(){var e=this.id?"PUT":"POST",t=this._getSaveJSON(),n="classes/"+this.className;return this.id?n+="/"+this.id:"_User"===this.className&&(n="users"),{method:e,body:t,path:n}}},{key:"_finishFetch",value:function(e){!this.id&&e.objectId&&(this.id=e.objectId),A.initializeState(this.className,this._getStateIdentifier());var t={};for(var n in e)"ACL"===n?t[n]=new j["default"](e[n]):"objectId"!==n&&(t[n]=g["default"](e[n]),t[n]instanceof N["default"]&&t[n]._ensureParentAndKey(this,n));t.createdAt&&"string"==typeof t.createdAt&&(t.createdAt=M["default"](t.createdAt)),t.updatedAt&&"string"==typeof t.updatedAt&&(t.updatedAt=M["default"](t.updatedAt)),!t.updatedAt&&t.createdAt&&(t.updatedAt=t.createdAt),A.commitServerChanges(this.className,this._getStateIdentifier(),t)}},{key:"_setExisted",value:function(e){var t=A.getState(this.className,this._getStateIdentifier());t&&(t.existed=e)}},{key:"_migrateId",value:function(e){if(this._localId&&e){var t=A.removeState(this.className,this._getStateIdentifier());this.id=e,delete this._localId,t&&A.initializeState(this.className,this._getStateIdentifier(),t)}}},{key:"_handleSaveResponse",value:function(e,t){var n,a={},r=A.popPendingState(this.className,this._getStateIdentifier());for(n in r)r[n]instanceof P.RelationOp?a[n]=r[n].applyTo(void 0,this,n):n in e||(a[n]=r[n].applyTo(void 0));for(n in e)"createdAt"!==n&&"updatedAt"!==n||"string"!=typeof e[n]?"objectId"!==n&&(a[n]=g["default"](e[n])):a[n]=M["default"](e[n]);a.createdAt&&!a.updatedAt&&(a.updatedAt=a.createdAt),this._migrateId(e.objectId),201!==t&&this._setExisted(!0),A.commitServerChanges(this.className,this._getStateIdentifier(),a)}},{key:"_handleSaveError",value:function(){var e=this._getPendingOps();e.length>2&&A.mergeFirstPendingState(this.className,this._getStateIdentifier())}},{key:"initialize",value:function(){}},{key:"toJSON",value:function(){var e=this.id?this.className+":"+this.id:this,t={},n=this.attributes;for(var a in n)"createdAt"!==a&&"updatedAt"!==a||!n[a].toJSON?t[a]=b["default"](n[a],!1,!1,[e]):t[a]=n[a].toJSON();var r=this._getPendingOps();for(var a in r[0])t[a]=r[0][a].toJSON();return this.id&&(t.objectId=this.id),t}},{key:"equals",value:function(t){return this===t?!0:t instanceof e&&this.className===t.className&&this.id===t.id&&"undefined"!=typeof this.id}},{key:"dirty",value:function(e){if(!this.id)return!0;var t=this._getPendingOps(),n=this._getDirtyObjectAttributes();if(e){if(n.hasOwnProperty(e))return!0;for(var a=0;a-1)throw new Error("Cannot modify readonly attribute: "+o);n.unset?r[o]=new P.UnsetOp:a[o]instanceof P.Op?r[o]=a[o]:a[o]&&"object"==typeof a[o]&&"string"==typeof a[o].__op?r[o]=P.opFromJSON(a[o]):"objectId"===o||"id"===o?this.id=a[o]:"ACL"!==o||"object"!=typeof a[o]||a[o]instanceof j["default"]?r[o]=new P.SetOp(a[o]):r[o]=new P.SetOp(new j["default"](a[o]))}var s=this.attributes,l={};for(var u in r)r[u]instanceof P.RelationOp?l[u]=r[u].applyTo(s[u],this,u):r[u]instanceof P.UnsetOp||(l[u]=r[u].applyTo(s[u]));var c=this.validate(l);if(c)return"function"==typeof n.error&&n.error(this,c),!1;var d=this._getPendingOps(),f=d.length-1;for(var u in r){var m=r[u].mergeWith(d[f][u]);A.setPendingOp(this.className,this._getStateIdentifier(),u,m)}return this}},{key:"unset",value:function(e,t){return t=t||{},t.unset=!0,this.set(e,null,t)}},{key:"increment",value:function(e,t){if("undefined"==typeof t&&(t=1),"number"!=typeof t)throw new Error("Cannot increment by a non-numeric amount.");return this.set(e,new P.IncrementOp(t))}},{key:"add",value:function(e,t){return this.set(e,new P.AddOp([t]))}},{key:"addUnique",value:function(e,t){return this.set(e,new P.AddUniqueOp([t]))}},{key:"remove",value:function(e,t){return this.set(e,new P.RemoveOp([t]))}},{key:"op",value:function(e){for(var t=this._getPendingOps(),n=t.length;n--;)if(t[n][e])return t[n][e]}},{key:"clone",value:function t(){var t=new this.constructor;return t.set&&t.set(this.attributes),t.className||(t.className=this.className),t}},{key:"isNew",value:function(){return!this.id}},{key:"existed",value:function(){if(!this.id)return!1;var e=A.getState(this.className,this._getStateIdentifier());return e?e.existed:!1}},{key:"isValid",value:function(){return!this.validate(this.attributes)}},{key:"validate",value:function(e){if(e.hasOwnProperty("ACL")&&!(e.ACL instanceof j["default"]))return new T["default"](T["default"].OTHER_CAUSE,"ACL must be a Parse ACL.");for(var t in e)if(!/^[A-Za-z][0-9A-Za-z_]*$/.test(t))return new T["default"](T["default"].INVALID_KEY_NAME);return!1}},{key:"getACL",value:function(){var e=this.get("ACL");return e instanceof j["default"]?e:null}},{key:"setACL",value:function(e,t){return this.set("ACL",e,t)}},{key:"clear",value:function(){var e=this.attributes,t={},n=["createdAt","updatedAt"];"function"==typeof this.constructor.readOnlyAttributes&&(n=n.concat(this.constructor.readOnlyAttributes()));for(var a in e)n.indexOf(a)<0&&(t[a]=!0);return this.set(t,{unset:!0})}},{key:"fetch",value:function(e){e=e||{};var t={};e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(t.sessionToken=e.sessionToken);var n=f["default"].getObjectController();return n.fetch(this,!0,t)._thenRunCallbacks(e)}},{key:"save",value:function(e,t,n){var a,r,i=this;if("object"==typeof e||"undefined"==typeof e?(a=e,r=t):(a={},a[e]=t,r=n),!r&&a&&(r={},"function"==typeof a.success&&(r.success=a.success,delete a.success),"function"==typeof a.error&&(r.error=a.error,delete a.error)),a){var o=this.validate(a);if(o)return r&&"function"==typeof r.error&&r.error(this,o),R["default"].error(o);this.set(a,r)}r=r||{};var s={};r.hasOwnProperty("useMasterKey")&&(s.useMasterKey=r.useMasterKey),r.hasOwnProperty("sessionToken")&&(s.sessionToken=r.sessionToken);var l=f["default"].getObjectController(),u=F["default"](this);return l.save(u,s).then(function(){return l.save(i,s)})._thenRunCallbacks(r,this)}},{key:"destroy",value:function(e){e=e||{};var t={};return e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(t.sessionToken=e.sessionToken),this.id?f["default"].getObjectController().destroy(this,t)._thenRunCallbacks(e):R["default"].as()._thenRunCallbacks(e)}},{key:"attributes",get:function(){return o(A.estimateAttributes(this.className,this._getStateIdentifier()))}},{key:"createdAt",get:function(){return this._getServerData().createdAt}},{key:"updatedAt",get:function(){return this._getServerData().updatedAt}}],[{key:"_clearAllState",value:function(){A._clearAllState()}},{key:"fetchAll",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().fetch(e,!0,n)._thenRunCallbacks(t)}},{key:"fetchAllIfNeeded",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().fetch(e,!1,n)._thenRunCallbacks(t)}},{key:"destroyAll",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().destroy(e,n)._thenRunCallbacks(t)}},{key:"saveAll",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().save(e,n)._thenRunCallbacks(t)}},{key:"createWithoutData",value:function(e){var t=new this;return t.id=e,t}},{key:"fromJSON",value:function(t){if(!t.className)throw new Error("Cannot create an object without a className");var n=H[t.className],a=n?new n:new e(t.className),r={};for(var i in t)"className"!==i&&"__type"!==i&&(r[i]=t[i]);return a._finishFetch(r),t.objectId&&a._setExisted(!0),a}},{key:"registerSubclass",value:function(e,t){if("string"!=typeof e)throw new TypeError("The first argument must be a valid class name.");if("undefined"==typeof t)throw new TypeError("You must supply a subclass constructor.");if("function"!=typeof t)throw new TypeError("You must register the subclass constructor. Did you attempt to register an instance of the subclass?");H[e]=t,t.className||(t.className=e)}},{key:"extend",value:function(t,n,a){if("string"!=typeof t){if(t&&"string"==typeof t.className)return e.extend(t.className,t,n);throw new Error("Parse.Object.extend's first argument should be the className.")}var r=t;"User"===r&&f["default"].get("PERFORM_USER_REWRITE")&&(r="_User");var i=e.prototype;this.hasOwnProperty("__super__")&&this.__super__?i=this.prototype:H[r]&&(i=H[r].prototype);var o=function(e){if(this.className=r,this._objCount=q++,e&&"object"==typeof e&&!this.set(e||{}))throw new Error("Can't create an invalid Parse Object");"function"==typeof this.initialize&&this.initialize.apply(this,arguments)};if(o.className=r,o.__super__=i,o.prototype=s(i,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),n)for(var u in n)"className"!==u&&l(o.prototype,u,{value:n[u],enumerable:!1,writable:!0,configurable:!0});if(a)for(var u in a)"className"!==u&&l(o,u,{value:a[u],enumerable:!1,writable:!0,configurable:!0});return o.extend=function(t,n,a){return"string"==typeof t?e.extend.call(o,t,n,a):e.extend.call(o,r,t,n)},o.createWithoutData=e.createWithoutData,H[r]=o,o}},{key:"enableSingleInstance",value:function(){J=!0}},{key:"disableSingleInstance",value:function(){J=!1}}]),e}();n["default"]=V,f["default"].setObjectController({fetch:function(e,t,n){if(Array.isArray(e)){if(e.length<1)return R["default"].as([]);var a=[],r=[],o=null,s=[],l=null;if(e.forEach(function(e,n){l||(o||(o=e.className),o!==e.className&&(l=new T["default"](T["default"].INVALID_CLASS_NAME,"All objects should be of the same class")),e.id||(l=new T["default"](T["default"].MISSING_OBJECT_ID,"All objects must have an ID")),(t||0===i(e._getServerData()).length)&&(r.push(e.id),a.push(e)),s.push(e))}),l)return R["default"].error(l);var u=new L["default"](o);return u.containedIn("objectId",r),u._limit=r.length,u.find(n).then(function(e){var n={};e.forEach(function(e){n[e.id]=e});for(var r=0;r=20&&a.push([]))}),0===a[a.length-1].length&&a.pop();var r=R["default"].as(),i=[];return a.forEach(function(e){r=r.then(function(){return n.request("POST","batch",{requests:e.map(function(e){return{method:"DELETE",path:"/1/classes/"+e.className+"/"+e._getId(),body:{}}})},t).then(function(t){for(var n=0;n0},function(){var e=[],r=[];if(o.forEach(function(t){e.length<20&&h["default"](t)?e.push(t):r.push(t)}),o=r,e.length<1)return R["default"].error(new T["default"](T["default"].OTHER_CAUSE,"Tried to save a batch with a cycle."));var i=new R["default"],s=[],l=[];return e.forEach(function(e,t){var n=new R["default"];s.push(n);var r=function(){return n.resolve(),i.then(function(n,r){if(n[t].hasOwnProperty("success"))e._handleSaveResponse(n[t].success,r);else{if(!a&&n[t].hasOwnProperty("error")){var i=n[t].error;a=new T["default"](i.code,i.error),o=[]}e._handleSaveError()}})};A.pushPendingState(e.className,e._getStateIdentifier()),l.push(A.enqueueTask(e.className,e._getStateIdentifier(),r))}),R["default"].when(s).then(function(){return n.request("POST","batch",{requests:e.map(function(e){var t=e._getSaveParams();return t.path="/1/"+t.path,t})},t)}).then(function(e,t,n){i.resolve(e,t)}),R["default"].when(l)}).then(function(){return a?R["default"].error(a):R["default"].as(e)})})}if(e instanceof V){var s=e,l=function(){var e=s._getSaveParams();return n.request(e.method,e.path,e.body,t).then(function(e,t){s._handleSaveResponse(e,t)},function(e){return s._handleSaveError(),R["default"].error(e)})};return A.pushPendingState(e.className,e._getStateIdentifier()),A.enqueueTask(e.className,e._getStateIdentifier(),l).then(function(){return e},function(e){return e})}return R["default"].as()}}),t.exports=n["default"]},{"./CoreManager":3,"./ObjectState":6,"./ParseACL":8,"./ParseError":10,"./ParseFile":11,"./ParseOp":15,"./ParsePromise":16,"./ParseQuery":17,"./ParseRelation":18,"./canBeSerialized":28,"./decode":29,"./encode":30,"./equals":31,"./escape":32,"./parseDate":34,"./unique":35,"./unsavedChildren":36,"babel-runtime/core-js/object/create":37,"babel-runtime/core-js/object/define-property":38,"babel-runtime/core-js/object/freeze":39,"babel-runtime/core-js/object/keys":41,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47,"babel-runtime/helpers/interop-require-wildcard":48}],15:[function(e,t,n){"use strict";function a(e){if(!e||!e.__op)return null;switch(e.__op){case"Delete":return new A;case"Increment":return new C(e.amount);case"Add":return new j(f["default"](e.objects));case"AddUnique":return new x(f["default"](e.objects));case"Remove":return new M(f["default"](e.objects));case"AddRelation":var t=f["default"](e.objects);return Array.isArray(t)?new _(t,[]):new _([],[]);case"RemoveRelation":var n=f["default"](e.objects);return Array.isArray(n)?new _([],n):new _([],[]);case"Batch":for(var t=[],n=[],a=0;a-1;)n.splice(a,1),a=n.indexOf(this._value[t]);if(this._value[t]instanceof g["default"]&&this._value[t].id)for(var r=0;r-1&&n.splice(t,1)}),this.relationsToAdd.forEach(function(e){var t=n.indexOf(e);0>t&&n.push(e)});var a=e.relationsToRemove.concat([]);this.relationsToAdd.forEach(function(e){var t=a.indexOf(e);t>-1&&a.splice(t,1)}),this.relationsToRemove.forEach(function(e){var t=a.indexOf(e);0>t&&a.push(e)});var r=new t(n,a);return r._targetClassName=this._targetClassName,r}throw new Error("Cannot merge Relation Op with the previous Op")}},{key:"toJSON",value:function(){var e=this,t=function(t){return{__type:"Pointer",className:e._targetClassName,objectId:t}},n=null,a=null,r=null;return this.relationsToAdd.length>0&&(r=this.relationsToAdd.map(t),n={__op:"AddRelation",objects:r}),this.relationsToRemove.length>0&&(r=this.relationsToRemove.map(t),a={__op:"RemoveRelation",objects:r}),n&&a?{__op:"Batch",ops:[n,a]}:n||a||{}}}]),t}(S);n.RelationOp=_},{"./ParseObject":14,"./ParseRelation":18,"./arrayContainsObject":27,"./decode":29,"./encode":30,"./unique":35,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/get":45,"babel-runtime/helpers/inherits":46,"babel-runtime/helpers/interop-require-default":47}],16:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/create-class")["default"],r=e("babel-runtime/helpers/class-call-check")["default"];Object.defineProperty(n,"__esModule",{value:!0});var i=!1,o=function(){function e(){r(this,e),this._resolved=!1,this._rejected=!1,this._resolvedCallbacks=[],this._rejectedCallbacks=[]}return a(e,[{key:"resolve",value:function(){if(this._resolved||this._rejected)throw new Error("A promise was resolved even though it had already been "+(this._resolved?"resolved":"rejected")+".");this._resolved=!0;for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];this._result=t;for(var a=0;ai;i++)a[i]=arguments[i];"function"==typeof t&&(a=[t.apply(this,a)]),1===a.length&&e.is(a[0])?a[0].then(function(){r.resolve.apply(r,arguments)},function(e){r.reject(e)}):r.resolve.apply(r,a)},o=function(t){var a=[];"function"==typeof n?(a=[n(t)],1===a.length&&e.is(a[0])?a[0].then(function(){r.resolve.apply(r,arguments)},function(e){r.reject(e)}):r.reject(a[0])):r.reject(t)},s=function(e){e.call()};return this._resolved?s(function(){i.apply(a,a._result)}):this._rejected?s(function(){o(a._error)}):(this._resolvedCallbacks.push(i),this._rejectedCallbacks.push(o)),r}},{key:"always",value:function(e){return this.then(e,e)}},{key:"done",value:function(e){return this.then(e)}},{key:"fail",value:function(e){return this.then(null,e)}},{key:"_thenRunCallbacks",value:function(t,n){var a={};return"function"==typeof t?(a.success=function(e){t(e,null)},a.error=function(e){t(null,e)}):"object"==typeof t&&("function"==typeof t.success&&(a.success=t.success),"function"==typeof t.error&&(a.error=t.error)),this.then(function(){for(var t=arguments.length,n=Array(t),r=0;t>r;r++)n[r]=arguments[r];return a.success&&a.success.apply(this,n),e.as.apply(e,arguments)},function(t){return a.error&&("undefined"!=typeof n?a.error(n,t):a.error(t)),e.error(t)})}},{key:"_continueWith",value:function(e){return this.then(function(){return e(arguments,null)},function(t){return e(null,t)})}}],[{key:"is",value:function(e){return"undefined"!=typeof e&&"function"==typeof e.then}},{key:"as",value:function(){for(var t=new e,n=arguments.length,a=Array(n),r=0;n>r;r++)a[r]=arguments[r];return t.resolve.apply(t,a),t}},{key:"error",value:function(){for(var t=new e,n=arguments.length,a=Array(n),r=0;n>r;r++)a[r]=arguments[r];return t.reject.apply(t,a),t}},{key:"when",value:function(t){var n;n=Array.isArray(t)?t:arguments;var a=n.length,r=!1,i=[],o=[];if(i.length=n.length,o.length=n.length,0===a)return e.as.apply(this,i);for(var s=new e,l=function(){a--,0>=a&&(r?s.reject(o):s.resolve.apply(s,i))},u=function(t,n){e.is(t)?t.then(function(e){i[n]=e,l()},function(e){o[n]=e,r=!0,l()}):(i[c]=t,l())},c=0;c=0&&(e.limit=this._limit),this._skip>0&&(e.skip=this._skip),this._order&&(e.order=this._order.join(","));for(var t in this._extraOptions)e[t]=this._extraOptions[t];return e}},{key:"get",value:function(e,t){this.equalTo("objectId",e);var n={};return t&&t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t&&t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),this.first(n).then(function(e){if(e)return e;var t=new f["default"](f["default"].OBJECT_NOT_FOUND,"Object not found.");return b["default"].error(t)})._thenRunCallbacks(t,null)}},{key:"find",value:function(e){var t=this;e=e||{};var n={};e.hasOwnProperty("useMasterKey")&&(n.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(n.sessionToken=e.sessionToken);var a=l["default"].getQueryController();return a.find(this.className,this.toJSON(),n).then(function(e){return e.results.map(function(e){return e.className=t.className,g["default"].fromJSON(e)})})._thenRunCallbacks(e)}},{key:"count",value:function(e){e=e||{};var t={};e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(t.sessionToken=e.sessionToken); +}return a(e,[{key:"_getId",value:function(){if("string"==typeof this.id)return this.id;if("string"==typeof this._localId)return this._localId;var e="local"+String(G++);return this._localId=e,e}},{key:"_getStateIdentifier",value:function(){return"string"==typeof this.id?J?this.id:this.id+"_"+String(this._objCount):this._getId()}},{key:"_getServerData",value:function(){return A.getServerData(this.className,this._getStateIdentifier())}},{key:"_clearServerData",value:function(){var e=this._getServerData(),t={};for(var n in e)t[n]=void 0;A.setServerData(this.className,this._getStateIdentifier(),t)}},{key:"_getPendingOps",value:function(){return A.getPendingOps(this.className,this._getStateIdentifier())}},{key:"_clearPendingOps",value:function(){var e=this._getPendingOps(),t=e[e.length-1],n=i(t);n.forEach(function(e){delete t[e]})}},{key:"_getDirtyObjectAttributes",value:function(){var t=this.attributes,n=A.getObjectCache(this.className,this._getStateIdentifier()),a={};for(var r in t){var i=t[r];if(i&&"object"==typeof i&&!(i instanceof e)&&!(i instanceof E["default"])&&!(i instanceof N["default"])){var o=b["default"](i,!1,!0),s=JSON.stringify(o);n[r]!==s&&(a[r]=i)}}return a}},{key:"_toFullJSON",value:function(){var e=this.toJSON();return e.__type="Object",e.className=this.className,e}},{key:"_getSaveJSON",value:function(){var e,t=this._getPendingOps(),n=this._getDirtyObjectAttributes(),a={};for(e in n)a[e]=new P.SetOp(n[e]).toJSON();for(e in t[0])a[e]=t[0][e].toJSON();return a}},{key:"_getSaveParams",value:function(){var e=this.id?"PATCH":"POST",t=this._getSaveJSON(),n="classes/"+this.className;return this.id?n+="/"+this.id:"_User"===this.className&&(n="users"),{method:e,body:t,path:n}}},{key:"_finishFetch",value:function(e){!this.id&&e.objectId&&(this.id=e.objectId),A.initializeState(this.className,this._getStateIdentifier());var t={};for(var n in e)"ACL"===n?t[n]=new j["default"](e[n]):"objectId"!==n&&(t[n]=g["default"](e[n]),t[n]instanceof N["default"]&&t[n]._ensureParentAndKey(this,n));t.createdAt&&"string"==typeof t.createdAt&&(t.createdAt=M["default"](t.createdAt)),t.updatedAt&&"string"==typeof t.updatedAt&&(t.updatedAt=M["default"](t.updatedAt)),!t.updatedAt&&t.createdAt&&(t.updatedAt=t.createdAt),A.commitServerChanges(this.className,this._getStateIdentifier(),t)}},{key:"_setExisted",value:function(e){var t=A.getState(this.className,this._getStateIdentifier());t&&(t.existed=e)}},{key:"_migrateId",value:function(e){if(this._localId&&e){var t=A.removeState(this.className,this._getStateIdentifier());this.id=e,delete this._localId,t&&A.initializeState(this.className,this._getStateIdentifier(),t)}}},{key:"_handleSaveResponse",value:function(e,t){var n,a={},r=A.popPendingState(this.className,this._getStateIdentifier());for(n in r)r[n]instanceof P.RelationOp?a[n]=r[n].applyTo(void 0,this,n):n in e||(a[n]=r[n].applyTo(void 0));for(n in e)"createdAt"!==n&&"updatedAt"!==n||"string"!=typeof e[n]?"objectId"!==n&&(a[n]=g["default"](e[n])):a[n]=M["default"](e[n]);a.createdAt&&!a.updatedAt&&(a.updatedAt=a.createdAt),this._migrateId(e.objectId),201!==t&&this._setExisted(!0),A.commitServerChanges(this.className,this._getStateIdentifier(),a)}},{key:"_handleSaveError",value:function(){var e=this._getPendingOps();e.length>2&&A.mergeFirstPendingState(this.className,this._getStateIdentifier())}},{key:"initialize",value:function(){}},{key:"toJSON",value:function(){var e=this.id?this.className+":"+this.id:this,t={},n=this.attributes;for(var a in n)"createdAt"!==a&&"updatedAt"!==a||!n[a].toJSON?t[a]=b["default"](n[a],!1,!1,[e]):t[a]=n[a].toJSON();var r=this._getPendingOps();for(var a in r[0])t[a]=r[0][a].toJSON();return this.id&&(t.objectId=this.id),t}},{key:"equals",value:function(t){return this===t?!0:t instanceof e&&this.className===t.className&&this.id===t.id&&"undefined"!=typeof this.id}},{key:"dirty",value:function(e){if(!this.id)return!0;var t=this._getPendingOps(),n=this._getDirtyObjectAttributes();if(e){if(n.hasOwnProperty(e))return!0;for(var a=0;a-1)throw new Error("Cannot modify readonly attribute: "+o);n.unset?r[o]=new P.UnsetOp:a[o]instanceof P.Op?r[o]=a[o]:a[o]&&"object"==typeof a[o]&&"string"==typeof a[o].__op?r[o]=P.opFromJSON(a[o]):"objectId"===o||"id"===o?this.id=a[o]:"ACL"!==o||"object"!=typeof a[o]||a[o]instanceof j["default"]?r[o]=new P.SetOp(a[o]):r[o]=new P.SetOp(new j["default"](a[o]))}var s=this.attributes,l={};for(var u in r)r[u]instanceof P.RelationOp?l[u]=r[u].applyTo(s[u],this,u):r[u]instanceof P.UnsetOp||(l[u]=r[u].applyTo(s[u]));var c=this.validate(l);if(c)return"function"==typeof n.error&&n.error(this,c),!1;var d=this._getPendingOps(),f=d.length-1;for(var u in r){var m=r[u].mergeWith(d[f][u]);A.setPendingOp(this.className,this._getStateIdentifier(),u,m)}return this}},{key:"unset",value:function(e,t){return t=t||{},t.unset=!0,this.set(e,null,t)}},{key:"increment",value:function(e,t){if("undefined"==typeof t&&(t=1),"number"!=typeof t)throw new Error("Cannot increment by a non-numeric amount.");return this.set(e,new P.IncrementOp(t))}},{key:"add",value:function(e,t){return this.set(e,new P.AddOp([t]))}},{key:"addUnique",value:function(e,t){return this.set(e,new P.AddUniqueOp([t]))}},{key:"remove",value:function(e,t){return this.set(e,new P.RemoveOp([t]))}},{key:"op",value:function(e){for(var t=this._getPendingOps(),n=t.length;n--;)if(t[n][e])return t[n][e]}},{key:"clone",value:function t(){var t=new this.constructor;return t.set&&t.set(this.attributes),t.className||(t.className=this.className),t}},{key:"isNew",value:function(){return!this.id}},{key:"existed",value:function(){if(!this.id)return!1;var e=A.getState(this.className,this._getStateIdentifier());return e?e.existed:!1}},{key:"isValid",value:function(){return!this.validate(this.attributes)}},{key:"validate",value:function(e){if(e.hasOwnProperty("ACL")&&!(e.ACL instanceof j["default"]))return new T["default"](T["default"].OTHER_CAUSE,"ACL must be a Parse ACL.");for(var t in e)if(!/^[A-Za-z][0-9A-Za-z_]*$/.test(t))return new T["default"](T["default"].INVALID_KEY_NAME);return!1}},{key:"getACL",value:function(){var e=this.get("ACL");return e instanceof j["default"]?e:null}},{key:"setACL",value:function(e,t){return this.set("ACL",e,t)}},{key:"clear",value:function(){var e=this.attributes,t={},n=["createdAt","updatedAt"];"function"==typeof this.constructor.readOnlyAttributes&&(n=n.concat(this.constructor.readOnlyAttributes()));for(var a in e)n.indexOf(a)<0&&(t[a]=!0);return this.set(t,{unset:!0})}},{key:"fetch",value:function(e){e=e||{};var t={};e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(t.sessionToken=e.sessionToken);var n=f["default"].getObjectController();return n.fetch(this,!0,t)._thenRunCallbacks(e)}},{key:"save",value:function(e,t,n){var a,r,i=this;if("object"==typeof e||"undefined"==typeof e?(a=e,r=t):(a={},a[e]=t,r=n),!r&&a&&(r={},"function"==typeof a.success&&(r.success=a.success,delete a.success),"function"==typeof a.error&&(r.error=a.error,delete a.error)),a){var o=this.validate(a);if(o)return r&&"function"==typeof r.error&&r.error(this,o),R["default"].error(o);this.set(a,r)}r=r||{};var s={};r.hasOwnProperty("useMasterKey")&&(s.useMasterKey=r.useMasterKey),r.hasOwnProperty("sessionToken")&&(s.sessionToken=r.sessionToken);var l=f["default"].getObjectController(),u=F["default"](this);return l.save(u,s).then(function(){return l.save(i,s)})._thenRunCallbacks(r,this)}},{key:"destroy",value:function(e){e=e||{};var t={};return e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(t.sessionToken=e.sessionToken),this.id?f["default"].getObjectController().destroy(this,t)._thenRunCallbacks(e):R["default"].as()._thenRunCallbacks(e)}},{key:"attributes",get:function(){return o(A.estimateAttributes(this.className,this._getStateIdentifier()))}},{key:"createdAt",get:function(){return this._getServerData().createdAt}},{key:"updatedAt",get:function(){return this._getServerData().updatedAt}}],[{key:"_clearAllState",value:function(){A._clearAllState()}},{key:"fetchAll",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().fetch(e,!0,n)._thenRunCallbacks(t)}},{key:"fetchAllIfNeeded",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().fetch(e,!1,n)._thenRunCallbacks(t)}},{key:"destroyAll",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().destroy(e,n)._thenRunCallbacks(t)}},{key:"saveAll",value:function(e,t){var t=t||{},n={};return t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),f["default"].getObjectController().save(e,n)._thenRunCallbacks(t)}},{key:"createWithoutData",value:function(e){var t=new this;return t.id=e,t}},{key:"fromJSON",value:function(t){if(!t.className)throw new Error("Cannot create an object without a className");var n=H[t.className],a=n?new n:new e(t.className),r={};for(var i in t)"className"!==i&&"__type"!==i&&(r[i]=t[i]);return a._finishFetch(r),t.objectId&&a._setExisted(!0),a}},{key:"registerSubclass",value:function(e,t){if("string"!=typeof e)throw new TypeError("The first argument must be a valid class name.");if("undefined"==typeof t)throw new TypeError("You must supply a subclass constructor.");if("function"!=typeof t)throw new TypeError("You must register the subclass constructor. Did you attempt to register an instance of the subclass?");H[e]=t,t.className||(t.className=e)}},{key:"extend",value:function(t,n,a){if("string"!=typeof t){if(t&&"string"==typeof t.className)return e.extend(t.className,t,n);throw new Error("Parse.Object.extend's first argument should be the className.")}var r=t;"User"===r&&f["default"].get("PERFORM_USER_REWRITE")&&(r="_User");var i=e.prototype;this.hasOwnProperty("__super__")&&this.__super__?i=this.prototype:H[r]&&(i=H[r].prototype);var o=function(e){if(this.className=r,this._objCount=q++,e&&"object"==typeof e&&!this.set(e||{}))throw new Error("Can't create an invalid Parse Object");"function"==typeof this.initialize&&this.initialize.apply(this,arguments)};if(o.className=r,o.__super__=i,o.prototype=s(i,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),n)for(var u in n)"className"!==u&&l(o.prototype,u,{value:n[u],enumerable:!1,writable:!0,configurable:!0});if(a)for(var u in a)"className"!==u&&l(o,u,{value:a[u],enumerable:!1,writable:!0,configurable:!0});return o.extend=function(t,n,a){return"string"==typeof t?e.extend.call(o,t,n,a):e.extend.call(o,r,t,n)},o.createWithoutData=e.createWithoutData,H[r]=o,o}},{key:"enableSingleInstance",value:function(){J=!0}},{key:"disableSingleInstance",value:function(){J=!1}}]),e}();n["default"]=V,f["default"].setObjectController({fetch:function(e,t,n){if(Array.isArray(e)){if(e.length<1)return R["default"].as([]);var a=[],r=[],o=null,s=[],l=null;if(e.forEach(function(e,n){l||(o||(o=e.className),o!==e.className&&(l=new T["default"](T["default"].INVALID_CLASS_NAME,"All objects should be of the same class")),e.id||(l=new T["default"](T["default"].MISSING_OBJECT_ID,"All objects must have an ID")),(t||0===i(e._getServerData()).length)&&(r.push(e.id),a.push(e)),s.push(e))}),l)return R["default"].error(l);var u=new L["default"](o);return u.containedIn("objectId",r),u._limit=r.length,u.find(n).then(function(e){var n={};e.forEach(function(e){n[e.id]=e});for(var r=0;r=20&&a.push([]))}),0===a[a.length-1].length&&a.pop();var r=R["default"].as(),i=[];return a.forEach(function(e){r=r.then(function(){return n.request("POST","batch",{requests:e.map(function(e){return{method:"DELETE",path:"/1/classes/"+e.className+"/"+e._getId(),body:{}}})},t).then(function(t){for(var n=0;n0},function(){var e=[],r=[];if(o.forEach(function(t){e.length<20&&h["default"](t)?e.push(t):r.push(t)}),o=r,e.length<1)return R["default"].error(new T["default"](T["default"].OTHER_CAUSE,"Tried to save a batch with a cycle."));var i=new R["default"],s=[],l=[];return e.forEach(function(e,t){var n=new R["default"];s.push(n);var r=function(){return n.resolve(),i.then(function(n,r){if(n[t].hasOwnProperty("success"))e._handleSaveResponse(n[t].success,r);else{if(!a&&n[t].hasOwnProperty("error")){var i=n[t].error;a=new T["default"](i.code,i.error),o=[]}e._handleSaveError()}})};A.pushPendingState(e.className,e._getStateIdentifier()),l.push(A.enqueueTask(e.className,e._getStateIdentifier(),r))}),R["default"].when(s).then(function(){return n.request("POST","batch",{requests:e.map(function(e){var t=e._getSaveParams();return t.path="/1/"+t.path,t})},t)}).then(function(e,t,n){i.resolve(e,t)}),R["default"].when(l)}).then(function(){return a?R["default"].error(a):R["default"].as(e)})})}if(e instanceof V){var s=e,l=function(){var e=s._getSaveParams();return n.request(e.method,e.path,e.body,t).then(function(e,t){s._handleSaveResponse(e,t)},function(e){return s._handleSaveError(),R["default"].error(e)})};return A.pushPendingState(e.className,e._getStateIdentifier()),A.enqueueTask(e.className,e._getStateIdentifier(),l).then(function(){return e},function(e){return e})}return R["default"].as()}}),t.exports=n["default"]},{"./CoreManager":3,"./ObjectState":6,"./ParseACL":8,"./ParseError":10,"./ParseFile":11,"./ParseOp":15,"./ParsePromise":16,"./ParseQuery":17,"./ParseRelation":18,"./canBeSerialized":28,"./decode":29,"./encode":30,"./equals":31,"./escape":32,"./parseDate":34,"./unique":35,"./unsavedChildren":36,"babel-runtime/core-js/object/create":37,"babel-runtime/core-js/object/define-property":38,"babel-runtime/core-js/object/freeze":39,"babel-runtime/core-js/object/keys":41,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47,"babel-runtime/helpers/interop-require-wildcard":48}],15:[function(e,t,n){"use strict";function a(e){if(!e||!e.__op)return null;switch(e.__op){case"Delete":return new A;case"Increment":return new C(e.amount);case"Add":return new j(f["default"](e.objects));case"AddUnique":return new x(f["default"](e.objects));case"Remove":return new M(f["default"](e.objects));case"AddRelation":var t=f["default"](e.objects);return Array.isArray(t)?new _(t,[]):new _([],[]);case"RemoveRelation":var n=f["default"](e.objects);return Array.isArray(n)?new _([],n):new _([],[]);case"Batch":for(var t=[],n=[],a=0;a-1;)n.splice(a,1),a=n.indexOf(this._value[t]);if(this._value[t]instanceof g["default"]&&this._value[t].id)for(var r=0;r-1&&n.splice(t,1)}),this.relationsToAdd.forEach(function(e){var t=n.indexOf(e);0>t&&n.push(e)});var a=e.relationsToRemove.concat([]);this.relationsToAdd.forEach(function(e){var t=a.indexOf(e);t>-1&&a.splice(t,1)}),this.relationsToRemove.forEach(function(e){var t=a.indexOf(e);0>t&&a.push(e)});var r=new t(n,a);return r._targetClassName=this._targetClassName,r}throw new Error("Cannot merge Relation Op with the previous Op")}},{key:"toJSON",value:function(){var e=this,t=function(t){return{__type:"Pointer",className:e._targetClassName,objectId:t}},n=null,a=null,r=null;return this.relationsToAdd.length>0&&(r=this.relationsToAdd.map(t),n={__op:"AddRelation",objects:r}),this.relationsToRemove.length>0&&(r=this.relationsToRemove.map(t),a={__op:"RemoveRelation",objects:r}),n&&a?{__op:"Batch",ops:[n,a]}:n||a||{}}}]),t}(S);n.RelationOp=_},{"./ParseObject":14,"./ParseRelation":18,"./arrayContainsObject":27,"./decode":29,"./encode":30,"./unique":35,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/get":45,"babel-runtime/helpers/inherits":46,"babel-runtime/helpers/interop-require-default":47}],16:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/create-class")["default"],r=e("babel-runtime/helpers/class-call-check")["default"];Object.defineProperty(n,"__esModule",{value:!0});var i=!1,o=function(){function e(){r(this,e),this._resolved=!1,this._rejected=!1,this._resolvedCallbacks=[],this._rejectedCallbacks=[]}return a(e,[{key:"resolve",value:function(){if(this._resolved||this._rejected)throw new Error("A promise was resolved even though it had already been "+(this._resolved?"resolved":"rejected")+".");this._resolved=!0;for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];this._result=t;for(var a=0;ai;i++)a[i]=arguments[i];"function"==typeof t&&(a=[t.apply(this,a)]),1===a.length&&e.is(a[0])?a[0].then(function(){r.resolve.apply(r,arguments)},function(e){r.reject(e)}):r.resolve.apply(r,a)},o=function(t){var a=[];"function"==typeof n?(a=[n(t)],1===a.length&&e.is(a[0])?a[0].then(function(){r.resolve.apply(r,arguments)},function(e){r.reject(e)}):r.reject(a[0])):r.reject(t)},s=function(e){e.call()};return this._resolved?s(function(){i.apply(a,a._result)}):this._rejected?s(function(){o(a._error)}):(this._resolvedCallbacks.push(i),this._rejectedCallbacks.push(o)),r}},{key:"always",value:function(e){return this.then(e,e)}},{key:"done",value:function(e){return this.then(e)}},{key:"fail",value:function(e){return this.then(null,e)}},{key:"_thenRunCallbacks",value:function(t,n){var a={};return"function"==typeof t?(a.success=function(e){t(e,null)},a.error=function(e){t(null,e)}):"object"==typeof t&&("function"==typeof t.success&&(a.success=t.success),"function"==typeof t.error&&(a.error=t.error)),this.then(function(){for(var t=arguments.length,n=Array(t),r=0;t>r;r++)n[r]=arguments[r];return a.success&&a.success.apply(this,n),e.as.apply(e,arguments)},function(t){return a.error&&("undefined"!=typeof n?a.error(n,t):a.error(t)),e.error(t)})}},{key:"_continueWith",value:function(e){return this.then(function(){return e(arguments,null)},function(t){return e(null,t)})}}],[{key:"is",value:function(e){return"undefined"!=typeof e&&"function"==typeof e.then}},{key:"as",value:function(){for(var t=new e,n=arguments.length,a=Array(n),r=0;n>r;r++)a[r]=arguments[r];return t.resolve.apply(t,a),t}},{key:"error",value:function(){for(var t=new e,n=arguments.length,a=Array(n),r=0;n>r;r++)a[r]=arguments[r];return t.reject.apply(t,a),t}},{key:"when",value:function(t){var n;n=Array.isArray(t)?t:arguments;var a=n.length,r=!1,i=[],o=[];if(i.length=n.length,o.length=n.length,0===a)return e.as.apply(this,i);for(var s=new e,l=function(){a--,0>=a&&(r?s.reject(o):s.resolve.apply(s,i))},u=function(t,n){e.is(t)?t.then(function(e){i[n]=e,l()},function(e){o[n]=e,r=!0,l()}):(i[c]=t,l())},c=0;c=0&&(e.limit=this._limit),this._skip>0&&(e.skip=this._skip),this._order&&(e.order=this._order.join(","));for(var t in this._extraOptions)e[t]=this._extraOptions[t];return e}},{key:"get",value:function(e,t){this.equalTo("objectId",e);var n={};return t&&t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey),t&&t.hasOwnProperty("sessionToken")&&(n.sessionToken=t.sessionToken),this.first(n).then(function(e){if(e)return e;var t=new f["default"](f["default"].OBJECT_NOT_FOUND,"Object not found.");return b["default"].error(t)})._thenRunCallbacks(t,null)}},{key:"find",value:function(e){var t=this;e=e||{};var n={};e.hasOwnProperty("useMasterKey")&&(n.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(n.sessionToken=e.sessionToken);var a=l["default"].getQueryController();return a.find(this.className,this.toJSON(),n).then(function(e){return e.results.map(function(e){return e.className=t.className,g["default"].fromJSON(e)})})._thenRunCallbacks(e)}},{key:"count",value:function(e){e=e||{};var t={};e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(t.sessionToken=e.sessionToken); var n=l["default"].getQueryController(),a=this.toJSON();return a.limit=0,a.count=1,n.find(this.className,a,t).then(function(e){return e.count})._thenRunCallbacks(e)}},{key:"first",value:function(e){var t=this;e=e||{};var n={};e.hasOwnProperty("useMasterKey")&&(n.useMasterKey=e.useMasterKey),e.hasOwnProperty("sessionToken")&&(n.sessionToken=e.sessionToken);var a=l["default"].getQueryController(),r=this.toJSON();return r.limit=1,a.find(this.className,r,n).then(function(e){var n=e.results;return n[0]?(n[0].className=t.className,g["default"].fromJSON(n[0])):void 0})._thenRunCallbacks(e)}},{key:"each",value:function(t,n){if(n=n||{},this._order||this._skip||this._limit>=0)return b["default"].error("Cannot iterate on a query with sort, skip, or limit.")._thenRunCallbacks(n);var a=(new b["default"],new e(this.className));a._limit=n.batchSize||100,a._include=this._include.map(function(e){return e}),this._select&&(a._select=this._select.map(function(e){return e})),a._where={};for(var r in this._where){var i=this._where[r];if(Array.isArray(i))a._where[r]=i.map(function(e){return e});else if(i&&"object"==typeof i){var o={};a._where[r]=o;for(var s in i)o[s]=i[s]}else a._where[r]=i}a.ascending("objectId");var l={};n.hasOwnProperty("useMasterKey")&&(l.useMasterKey=n.useMasterKey),n.hasOwnProperty("sessionToken")&&(l.sessionToken=n.sessionToken);var u=!1;return b["default"]._continueWhile(function(){return!u},function(){return a.find(l).then(function(e){var n=b["default"].as();return e.forEach(function(e){n=n.then(function(){return t(e)})}),n.then(function(){e.length>=a._limit?a.greaterThan("objectId",e[e.length-1].id):u=!0})})})._thenRunCallbacks(n)}},{key:"equalTo",value:function(e,t){return"undefined"==typeof t?this.doesNotExist(e):(this._where[e]=c["default"](t,!1,!0),this)}},{key:"notEqualTo",value:function(e,t){return this._addCondition(e,"$ne",t)}},{key:"lessThan",value:function(e,t){return this._addCondition(e,"$lt",t)}},{key:"greaterThan",value:function(e,t){return this._addCondition(e,"$gt",t)}},{key:"lessThanOrEqualTo",value:function(e,t){return this._addCondition(e,"$lte",t)}},{key:"greaterThanOrEqualTo",value:function(e,t){return this._addCondition(e,"$gte",t)}},{key:"containedIn",value:function(e,t){return this._addCondition(e,"$in",t)}},{key:"notContainedIn",value:function(e,t){return this._addCondition(e,"$nin",t)}},{key:"containsAll",value:function(e,t){return this._addCondition(e,"$all",t)}},{key:"exists",value:function(e){return this._addCondition(e,"$exists",!0)}},{key:"doesNotExist",value:function(e){return this._addCondition(e,"$exists",!1)}},{key:"matches",value:function(e,t,n){return this._addCondition(e,"$regex",t),n||(n=""),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),n.length&&this._addCondition(e,"$options",n),this}},{key:"matchesQuery",value:function(e,t){var n=t.toJSON();return n.className=t.className,this._addCondition(e,"$inQuery",n)}},{key:"doesNotMatchQuery",value:function(e,t){var n=t.toJSON();return n.className=t.className,this._addCondition(e,"$notInQuery",n)}},{key:"matchesKeyInQuery",value:function(e,t,n){var a=n.toJSON();return a.className=n.className,this._addCondition(e,"$select",{key:t,query:a})}},{key:"doesNotMatchKeyInQuery",value:function(e,t,n){var a=n.toJSON();return a.className=n.className,this._addCondition(e,"$dontSelect",{key:t,query:a})}},{key:"contains",value:function(e,t){if("string"!=typeof t)throw new Error("The value being searched for must be a string.");return this._addCondition(e,"$regex",a(t))}},{key:"startsWith",value:function(e,t){if("string"!=typeof t)throw new Error("The value being searched for must be a string.");return this._addCondition(e,"$regex","^"+a(t))}},{key:"endsWith",value:function(e,t){if("string"!=typeof t)throw new Error("The value being searched for must be a string.");return this._addCondition(e,"$regex",a(t)+"$")}},{key:"near",value:function(e,t){return t instanceof h["default"]||(t=new h["default"](t)),this._addCondition(e,"$nearSphere",t)}},{key:"withinRadians",value:function(e,t,n){return this.near(e,t),this._addCondition(e,"$maxDistance",n)}},{key:"withinMiles",value:function(e,t,n){return this.withinRadians(e,t,n/3958.8)}},{key:"withinKilometers",value:function(e,t,n){return this.withinRadians(e,t,n/6371)}},{key:"withinGeoBox",value:function(e,t,n){return t instanceof h["default"]||(t=new h["default"](t)),n instanceof h["default"]||(n=new h["default"](n)),this._addCondition(e,"$within",{$box:[t,n]}),this}},{key:"ascending",value:function(){this._order=[];for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];return this.addAscending.apply(this,t)}},{key:"addAscending",value:function(){var e=this;this._order||(this._order=[]);for(var t=arguments.length,n=Array(t),a=0;t>a;a++)n[a]=arguments[a];return n.forEach(function(t){Array.isArray(t)&&(t=t.join()),e._order=e._order.concat(t.replace(/\s/g,"").split(","))}),this}},{key:"descending",value:function(){this._order=[];for(var e=arguments.length,t=Array(e),n=0;e>n;n++)t[n]=arguments[n];return this.addDescending.apply(this,t)}},{key:"addDescending",value:function(){var e=this;this._order||(this._order=[]);for(var t=arguments.length,n=Array(t),a=0;t>a;a++)n[a]=arguments[a];return n.forEach(function(t){Array.isArray(t)&&(t=t.join()),e._order=e._order.concat(t.replace(/\s/g,"").split(",").map(function(e){return"-"+e}))}),this}},{key:"skip",value:function(e){if("number"!=typeof e||0>e)throw new Error("You can only skip by a positive number");return this._skip=e,this}},{key:"limit",value:function(e){if("number"!=typeof e)throw new Error("You can only set the limit to a numeric value");return this._limit=e,this}},{key:"include",value:function(){for(var e=this,t=arguments.length,n=Array(t),a=0;t>a;a++)n[a]=arguments[a];return n.forEach(function(t){Array.isArray(t)?e._include=e._include.concat(t):e._include.push(t)}),this}},{key:"select",value:function(){var e=this;this._select||(this._select=[]);for(var t=arguments.length,n=Array(t),a=0;t>a;a++)n[a]=arguments[a];return n.forEach(function(t){Array.isArray(t)?e._select=e._select.concat(t):e._select.push(t)}),this}}],[{key:"or",value:function(){for(var t=null,n=arguments.length,a=Array(n),r=0;n>r;r++)a[r]=arguments[r];a.forEach(function(e){if(t||(t=e.className),t!==e.className)throw new Error("All queries must be for the same class.")});var i=new e(t);return i._orQuery(a),i}}]),e}();n["default"]=y,l["default"].setQueryController({find:function(e,t,n){var a=l["default"].getRESTController();return a.request("GET","classes/"+e,t,n)}}),t.exports=n["default"]},{"./CoreManager":3,"./ParseError":10,"./ParseGeoPoint":12,"./ParseObject":14,"./ParsePromise":16,"./encode":30,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47}],18:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/create-class")["default"],r=e("babel-runtime/helpers/class-call-check")["default"],i=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var o=e("./ParseOp"),s=e("./ParseObject"),l=(i(s),e("./ParseQuery")),u=i(l),c=function(){function e(t,n){r(this,e),this.parent=t,this.key=n,this.targetClassName=null}return a(e,[{key:"_ensureParentAndKey",value:function(e,t){if(this.key=this.key||t,this.key!==t)throw new Error("Internal Error. Relation retrieved from two different keys.");if(this.parent){if(this.parent.className!==e.className)throw new Error("Internal Error. Relation retrieved from two different Objects.");if(this.parent.id){if(this.parent.id!==e.id)throw new Error("Internal Error. Relation retrieved from two different Objects.")}else e.id&&(this.parent=e)}else this.parent=e}},{key:"add",value:function(e){Array.isArray(e)||(e=[e]);var t=new o.RelationOp(e,[]);return this.parent.set(this.key,t),this.targetClassName=t._targetClassName,this.parent}},{key:"remove",value:function(e){Array.isArray(e)||(e=[e]);var t=new o.RelationOp([],e);this.parent.set(this.key,t),this.targetClassName=t._targetClassName}},{key:"toJSON",value:function(){return{__type:"Relation",className:this.targetClassName}}},{key:"query",value:function t(){var t;return this.targetClassName?t=new u["default"](this.targetClassName):(t=new u["default"](this.parent.className),t._extraOptions.redirectClassNameForKey=this.key),t._addCondition("$relatedTo","object",{__type:"Pointer",className:this.parent.className,objectId:this.parent.id}),t._addCondition("$relatedTo","key",this.key),t}}]),e}();n["default"]=c,t.exports=n["default"]},{"./ParseObject":14,"./ParseOp":15,"./ParseQuery":17,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/interop-require-default":47}],19:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/get")["default"],r=e("babel-runtime/helpers/inherits")["default"],i=e("babel-runtime/helpers/create-class")["default"],o=e("babel-runtime/helpers/class-call-check")["default"],s=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var l=e("./ParseACL"),u=s(l),c=e("./ParseError"),d=s(c),f=e("./ParseObject"),m=s(f),h=function(e){function t(e,n){o(this,t),a(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,"_Role"),"string"==typeof e&&n instanceof u["default"]&&(this.setName(e),this.setACL(n))}return r(t,e),i(t,[{key:"getName",value:function(){return this.get("name")}},{key:"setName",value:function(e,t){return this.set("name",e,t)}},{key:"getUsers",value:function(){return this.relation("users")}},{key:"getRoles",value:function(){return this.relation("roles")}},{key:"validate",value:function(e,n){var r=a(Object.getPrototypeOf(t.prototype),"validate",this).call(this,e,n);if(r)return r;if("name"in e&&e.name!==this.getName()){var i=e.name;if(this.id&&this.id!==e.objectId)return new d["default"](d["default"].OTHER_CAUSE,"A role's name can only be set before it has been saved.");if("string"!=typeof i)return new d["default"](d["default"].OTHER_CAUSE,"A role's name must be a String.");if(!/^[0-9a-zA-Z\-_ ]+$/.test(i))return new d["default"](d["default"].OTHER_CAUSE,"A role's name can be only contain alphanumeric characters, _, -, and spaces.")}return!1}}]),t}(m["default"]);n["default"]=h,m["default"].registerSubclass("_Role",h),t.exports=n["default"]},{"./ParseACL":8,"./ParseError":10,"./ParseObject":14,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/get":45,"babel-runtime/helpers/inherits":46,"babel-runtime/helpers/interop-require-default":47}],20:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/get")["default"],r=e("babel-runtime/helpers/inherits")["default"],i=e("babel-runtime/helpers/create-class")["default"],o=e("babel-runtime/helpers/class-call-check")["default"],s=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var l=e("./CoreManager"),u=s(l),c=e("./isRevocableSession"),d=s(c),f=e("./ParseObject"),m=s(f),h=e("./ParsePromise"),p=s(h),g=e("./ParseUser"),v=s(g),b=function(e){function t(e){if(o(this,t),a(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,"_Session"),e&&"object"==typeof e&&!this.set(e||{}))throw new Error("Can't create an invalid Session")}return r(t,e),i(t,[{key:"getSessionToken",value:function(){return this.get("sessionToken")}}],[{key:"readOnlyAttributes",value:function(){return["createdWith","expiresAt","installationId","restricted","sessionToken","user"]}},{key:"current",value:function(e){e=e||{};var t=u["default"].getSessionController(),n={};return e.hasOwnProperty("useMasterKey")&&(n.useMasterKey=e.useMasterKey),v["default"].currentAsync().then(function(e){return e?(e.getSessionToken(),n.sessionToken=e.getSessionToken(),t.getSession(n)):p["default"].error("There is no current user.")})}},{key:"isCurrentSessionRevocable",value:function(){var e=v["default"].current();return e?d["default"](e.getSessionToken()||""):!1}}]),t}(m["default"]);n["default"]=b,m["default"].registerSubclass("_Session",b),u["default"].setSessionController({getSession:function(e){var t=u["default"].getRESTController(),n=new b;return t.request("GET","sessions/me",{},e).then(function(e){return n._finishFetch(e),n._setExisted(!0),n})}}),t.exports=n["default"]},{"./CoreManager":3,"./ParseObject":14,"./ParsePromise":16,"./ParseUser":21,"./isRevocableSession":33,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/get":45,"babel-runtime/helpers/inherits":46,"babel-runtime/helpers/interop-require-default":47}],21:[function(e,t,n){"use strict";var a=e("babel-runtime/helpers/get")["default"],r=e("babel-runtime/helpers/inherits")["default"],i=e("babel-runtime/helpers/create-class")["default"],o=e("babel-runtime/helpers/class-call-check")["default"],s=e("babel-runtime/core-js/object/define-property")["default"],l=e("babel-runtime/helpers/interop-require-default")["default"],u=e("babel-runtime/helpers/interop-require-wildcard")["default"];Object.defineProperty(n,"__esModule",{value:!0});var c=e("./CoreManager"),d=l(c),f=e("./isRevocableSession"),m=l(f),h=e("./ObjectState"),p=u(h),g=e("./ParseError"),v=l(g),b=e("./ParseObject"),y=l(b),k=e("./ParsePromise"),S=l(k),w=e("./ParseSession"),A=l(w),C=e("./Storage"),j=l(C),x="currentUser",M=!d["default"].get("IS_NODE"),_=!1,T=null,z={},E=function(e){function t(e){if(o(this,t),a(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,"_User"),e&&"object"==typeof e&&!this.set(e||{}))throw new Error("Can't create an invalid Parse User")}return r(t,e),i(t,[{key:"_upgradeToRevocableSession",value:function(e){e=e||{};var t={};e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey);var n=d["default"].getUserController();return n.upgradeToRevocableSession(this,t)._thenRunCallbacks(e)}},{key:"_linkWith",value:function(e,t){var n,a=this;if("string"==typeof e?(n=e,e=z[e]):n=e.getAuthType(),t&&t.hasOwnProperty("authData")){var r=this.get("authData")||{};r[n]=t.authData;var i=d["default"].getUserController();return i.linkWith(this,r)._thenRunCallbacks(t,this)}var o=new S["default"];return e.authenticate({success:function(e,n){var r={};r.authData=n,t.success&&(r.success=t.success),t.error&&(r.error=t.error),a._linkWith(e,r).then(function(){o.resolve(a)},function(e){o.reject(e)})},error:function(e,n){t.error&&t.error(a,n),o.reject(n)}}),o}},{key:"_synchronizeAuthData",value:function(e){if(this.isCurrent()&&e){var t;"string"==typeof e?(t=e,e=z[t]):t=e.getAuthType();var n=this.get("authData");if(e&&"object"==typeof n){var a=e.restoreAuthentication(n[t]);a||this._unlinkFrom(e)}}}},{key:"_synchronizeAllAuthData",value:function(){var e=this.get("authData");if("object"==typeof e)for(var t in e)this._synchronizeAuthData(t)}},{key:"_cleanupAuthData",value:function(){if(this.isCurrent()){var e=this.get("authData");if("object"==typeof e)for(var t in e)e[t]||delete e[t]}}},{key:"_unlinkFrom",value:function(e,t){var n,a=this;return"string"==typeof e?(n=e,e=z[e]):n=e.getAuthType(),this._linkWith(e,{authData:null}).then(function(){return a._synchronizeAuthData(e),S["default"].as(a)})._thenRunCallbacks(t)}},{key:"_isLinked",value:function(e){var t;t="string"==typeof e?e:e.getAuthType();var n=this.get("authData")||{};return!!n[t]}},{key:"_logOutWithAll",value:function(){var e=this.get("authData");if("object"==typeof e)for(var t in e)this._logOutWith(t)}},{key:"_logOutWith",value:function(e){this.isCurrent()&&("string"==typeof e&&(e=z[e]),e&&e.deauthenticate&&e.deauthenticate())}},{key:"isCurrent",value:function(){var e=t.current();return!!e&&e.id===this.id}},{key:"getUsername",value:function(){return this.get("username")}},{key:"setUsername",value:function(e){this.set("username",e)}},{key:"setPassword",value:function(e){this.set("password",e)}},{key:"getEmail",value:function(){return this.get("email")}},{key:"setEmail",value:function(e){this.set("email",e)}},{key:"getSessionToken",value:function(){return this.get("sessionToken")}},{key:"authenticated",value:function(){var e=t.current();return!!this.get("sessionToken")&&!!e&&e.id===this.id}},{key:"signUp",value:function(e,t){t=t||{};var n={};t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey);var a=d["default"].getUserController();return a.signUp(this,e,n)._thenRunCallbacks(t,this)}},{key:"logIn",value:function(e){e=e||{};var t={};e.hasOwnProperty("useMasterKey")&&(t.useMasterKey=e.useMasterKey);var n=d["default"].getUserController();return n.logIn(this,t)._thenRunCallbacks(e,this)}}],[{key:"readOnlyAttributes",value:function(){return["sessionToken"]}},{key:"extend",value:function(e,n){if(e)for(var a in e)"className"!==a&&s(t.prototype,a,{value:e[a],enumerable:!1,writable:!0,configurable:!0});if(n)for(var a in n)"className"!==a&&s(t,a,{value:n[a],enumerable:!1,writable:!0,configurable:!0});return t}},{key:"current",value:function(){if(!M)return null;var e=d["default"].getUserController();return e.currentUser()}},{key:"currentAsync",value:function(){if(!M)return S["default"].as(null);var e=d["default"].getUserController();return e.currentUserAsync()}},{key:"signUp",value:function(e,n,a,r){a=a||{},a.username=e,a.password=n;var i=new t(a);return i.signUp({},r)}},{key:"logIn",value:function(e,n,a){var r=new t;return r._finishFetch({username:e,password:n}),r.logIn(a)}},{key:"become",value:function(e,t){if(!M)throw new Error("It is not memory-safe to become a user in a server environment");t=t||{};var n={sessionToken:e};t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey);var a=d["default"].getUserController();return a.become(n)._thenRunCallbacks(t)}},{key:"logInWith",value:function(e,n){return t._logInWith(e,n)}},{key:"logOut",value:function(){if(!M)throw new Error("There is no current user user on a node.js server environment.");var e=d["default"].getUserController();return e.logOut()}},{key:"requestPasswordReset",value:function(e,t){t=t||{};var n={};t.hasOwnProperty("useMasterKey")&&(n.useMasterKey=t.useMasterKey);var a=d["default"].getUserController();return a.requestPasswordReset(e,n)._thenRunCallbacks(t)}},{key:"allowCustomUserClass",value:function(e){d["default"].set("PERFORM_USER_REWRITE",!e)}},{key:"enableRevocableSession",value:function(e){if(e=e||{},d["default"].set("FORCE_REVOCABLE_SESSION",!0),M){var n=t.current();if(n)return n._upgradeToRevocableSession(e)}return S["default"].as()._thenRunCallbacks(e)}},{key:"enableUnsafeCurrentUser",value:function(){M=!0}},{key:"disableUnsafeCurrentUser",value:function(){M=!1}},{key:"_registerAuthenticationProvider",value:function(e){z[e.getAuthType()]=e;var n=t.current();n&&n._synchronizeAuthData(e.getAuthType())}},{key:"_logInWith",value:function(e,n){var a=new t;return a._linkWith(e,n)}},{key:"_clearCache",value:function(){T=null,_=!1}},{key:"_setCurrentUserCache",value:function(e){T=e}}]),t}(y["default"]);n["default"]=E,y["default"].registerSubclass("_User",E);var P={setCurrentUser:function(e){T=e,e._cleanupAuthData(),e._synchronizeAllAuthData();var t=j["default"].generatePath(x),n=e.toJSON();return n.className="_User",j["default"].setItemAsync(t,JSON.stringify(n)).then(function(){return e})},currentUser:function(){if(T)return T;if(_)return null;if(j["default"].async())throw new Error("Cannot call currentUser() when using a platform with an async storage system. Call currentUserAsync() instead.");var e=j["default"].generatePath(x),t=j["default"].getItem(e);if(_=!0,!t)return T=null,null;t=JSON.parse(t),t.className||(t.className="_User"),t._id&&(t.objectId!==t._id&&(t.objectId=t._id),delete t._id),t._sessionToken&&(t.sessionToken=t._sessionToken,delete t._sessionToken);var n=E.fromJSON(t);return T=n,n._synchronizeAllAuthData(),n},currentUserAsync:function(){if(T)return S["default"].as(T);if(_)return S["default"].as(null);var e=j["default"].generatePath(x);return j["default"].getItemAsync(e).then(function(e){if(_=!0,!e)return T=null,S["default"].as(null);e=JSON.parse(e),e.className||(e.className="_User"),e._id&&(e.objectId!==e._id&&(e.objectId=e._id),delete e._id),e._sessionToken&&(e.sessionToken=e._sessionToken,delete e._sessionToken);var t=E.fromJSON(e);return T=t,t._synchronizeAllAuthData(),S["default"].as(t)})},signUp:function(e,t,n){var a=t&&t.username||e.get("username"),r=t&&t.password||e.get("password");return a&&a.length?r&&r.length?e.save(t,n).then(function(){return e._finishFetch({password:void 0}),M?P.setCurrentUser(e):e}):S["default"].error(new v["default"](v["default"].OTHER_CAUSE,"Cannot sign up user with an empty password.")):S["default"].error(new v["default"](v["default"].OTHER_CAUSE,"Cannot sign up user with an empty name."))},logIn:function(e,t){var n=d["default"].getRESTController(),a={username:e.get("username"),password:e.get("password")};return n.request("GET","login",a,t).then(function(t,n){return e._migrateId(t.objectId),e._setExisted(!0),p.setPendingOp(e.className,e._getId(),"username",void 0),p.setPendingOp(e.className,e._getId(),"password",void 0),t.password=void 0,e._finishFetch(t),M?P.setCurrentUser(e):S["default"].as(e)})},become:function(e){var t=new E,n=d["default"].getRESTController();return n.request("GET","users/me",{},e).then(function(e,n){return t._finishFetch(e),t._setExisted(!0),P.setCurrentUser(t)})},logOut:function(){return P.currentUserAsync().then(function(e){var t=j["default"].generatePath(x),n=j["default"].removeItemAsync(t),a=d["default"].getRESTController();if(null!==e){var r=e.getSessionToken();r&&m["default"](r)&&n.then(function(){return a.request("POST","logout",{},{sessionToken:r})}),e._logOutWithAll(),e._finishFetch({sessionToken:void 0})}return _=!0,T=null,n})},requestPasswordReset:function(e,t){var n=d["default"].getRESTController();return n.request("POST","requestPasswordReset",{email:e},t)},upgradeToRevocableSession:function(e,t){var n=e.getSessionToken();if(!n)return S["default"].error(new v["default"](v["default"].SESSION_MISSING,"Cannot upgrade a user with no session token"));t.sessionToken=n;var a=d["default"].getRESTController();return a.request("POST","upgradeToRevocableSession",{},t).then(function(t){var n=new A["default"];return n._finishFetch(t),e._finishFetch({sessionToken:n.getSessionToken()}),e.isCurrent()?P.setCurrentUser(e):S["default"].as(e)})},linkWith:function(e,t){return e.save({authData:t}).then(function(){return M?P.setCurrentUser(e):e})}};d["default"].setUserController(P),t.exports=n["default"]},{"./CoreManager":3,"./ObjectState":6,"./ParseError":10,"./ParseObject":14,"./ParsePromise":16,"./ParseSession":20,"./Storage":24,"./isRevocableSession":33,"babel-runtime/core-js/object/define-property":38,"babel-runtime/helpers/class-call-check":43,"babel-runtime/helpers/create-class":44,"babel-runtime/helpers/get":45,"babel-runtime/helpers/inherits":46,"babel-runtime/helpers/interop-require-default":47,"babel-runtime/helpers/interop-require-wildcard":48}],22:[function(e,t,n){"use strict";function a(e,t){if(t=t||{},e.where&&e.where instanceof l["default"]&&(e.where=e.where.toJSON().where),e.push_time&&"object"==typeof e.push_time&&(e.push_time=e.push_time.toJSON()),e.expiration_time&&"object"==typeof e.expiration_time&&(e.expiration_time=e.expiration_time.toJSON()),e.expiration_time&&e.expiration_interval)throw new Error("expiration_time and expiration_interval cannot both be set.");return o["default"].getPushController().send(e,{useMasterKey:t.useMasterKey})._thenRunCallbacks(t)}var r=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0}),n.send=a;var i=e("./CoreManager"),o=r(i),s=e("./ParseQuery"),l=r(s);o["default"].setPushController({send:function(e,t){var n=o["default"].getRESTController(),a=n.request("POST","push",e,{useMasterKey:!!t.useMasterKey});return a._thenRunCallbacks(t)}})},{"./CoreManager":3,"./ParseQuery":17,"babel-runtime/helpers/interop-require-default":47}],23:[function(e,t,n){(function(a){"use strict";function r(e,t,n){var a=new d["default"],r=new XDomainRequest;return r.onload=function(){var e;try{e=JSON.parse(r.responseText)}catch(t){a.reject(t)}a.resolve(e)},r.onerror=r.ontimeout=function(){var e={responseText:JSON.stringify({code:u["default"].X_DOMAIN_REQUEST,error:"IE's XDomainRequest does not supply error info."})};a.reject(e)},r.onprogress=function(){},r.open(e,t),r.send(n),a}var i=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var o=e("./CoreManager"),s=i(o),l=e("./ParseError"),u=i(l),c=e("./ParsePromise"),d=i(c),f=e("./Storage"),m=(i(f),null);"undefined"!=typeof XMLHttpRequest&&(m=XMLHttpRequest);var h=!1;"undefined"==typeof XDomainRequest||"withCredentials"in new XMLHttpRequest||(h=!0);var p={ajax:function(e,t,n,i){if(h)return r(e,t,n,i);var o=new d["default"],l=0,u=function c(){if(null==m)throw new Error("Cannot make a request: No definition of XMLHttpRequest was found.");var r=!1,u=new m;u.onreadystatechange=function(){if(4===u.readyState&&!r)if(r=!0,u.status>=200&&u.status<300){var e;try{e=JSON.parse(u.responseText)}catch(t){o.reject(t)}o.resolve(e,u.status,u)}else if(u.status>=500)if(++l-1)return!0;for(var n=0;n-1||e.dirty()||r(e._getServerData()).length<1)return e.toPointer();i=i.concat(o);var l=a(e.attributes,t,n,i);return l.createdAt&&(l.createdAt=l.createdAt.iso),l.updatedAt&&(l.updatedAt=l.updatedAt.iso),l.className=e.className,l.__type="Object",e.id&&(l.objectId=e.id),l}if(e instanceof h.Op||e instanceof s["default"]||e instanceof d["default"]||e instanceof g["default"])return e.toJSON();if(e instanceof u["default"]){if(!e.url())throw new Error("Tried to encode an unsaved file.");return e.toJSON()}if("[object Date]"===v.call(e)){if(isNaN(e))throw new Error("Tried to encode an invalid date.");return{__type:"Date",iso:e.toJSON()}}if("[object RegExp]"===v.call(e)&&"string"==typeof e.source)return e.source;if(Array.isArray(e))return e.map(function(e){return a(e,t,n,i)});if(e&&"object"==typeof e){var c={};for(var f in e)c[f]=a(e[f],t,n,i);return c}return e}var r=e("babel-runtime/core-js/object/keys")["default"],i=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0});var o=e("./ParseACL"),s=i(o),l=e("./ParseFile"),u=i(l),c=e("./ParseGeoPoint"),d=i(c),f=e("./ParseObject"),m=i(f),h=e("./ParseOp"),p=e("./ParseRelation"),g=i(p),v=Object.prototype.toString;n["default"]=function(e,t,n,r){return a(e,!!t,!!n,r||[])},t.exports=n["default"]},{"./ParseACL":8,"./ParseFile":11,"./ParseGeoPoint":12,"./ParseObject":14,"./ParseOp":15,"./ParseRelation":18,"babel-runtime/core-js/object/keys":41,"babel-runtime/helpers/interop-require-default":47}],31:[function(e,t,n){"use strict";function a(e,t){if(typeof e!=typeof t)return!1;if(!e||"object"!=typeof e)return e===t;if(Array.isArray(e)||Array.isArray(t)){if(!Array.isArray(e)||!Array.isArray(t))return!1;if(e.length!==t.length)return!1;for(var n=e.length;n--;)if(!a(e[n],t[n]))return!1;return!0}if(e instanceof s["default"]||e instanceof u["default"]||e instanceof d["default"]||e instanceof m["default"])return e.equals(t);if(r(e).length!==r(t).length)return!1;for(var i in e)if(!a(e[i],t[i]))return!1;return!0}var r=e("babel-runtime/core-js/object/keys")["default"],i=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=a;var o=e("./ParseACL"),s=i(o),l=e("./ParseFile"),u=i(l),c=e("./ParseGeoPoint"),d=i(c),f=e("./ParseObject"),m=i(f);t.exports=n["default"]},{"./ParseACL":8,"./ParseFile":11,"./ParseGeoPoint":12,"./ParseObject":14,"babel-runtime/core-js/object/keys":41,"babel-runtime/helpers/interop-require-default":47}],32:[function(e,t,n){"use strict";function a(e){return e.replace(/[&<>\/'"]/g,function(e){return{"&":"&","<":"<",">":">","/":"/","'":"'",'"':"""}[e]})}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=a,t.exports=n["default"]},{}],33:[function(e,t,n){"use strict";function a(e){return e.indexOf("r:")>-1}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=a,t.exports=n["default"]},{}],34:[function(e,t,n){"use strict";function a(e){var t=new RegExp("^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})T([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})(.([0-9]+))?Z$"),n=t.exec(e);if(!n)return null;var a=n[1]||0,r=(n[2]||1)-1,i=n[3]||0,o=n[4]||0,s=n[5]||0,l=n[6]||0,u=n[8]||0;return new Date(Date.UTC(a,r,i,o,s,l,u))}Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=a,t.exports=n["default"]},{}],35:[function(e,t,n){"use strict";function a(e){var t=[];return e.forEach(function(e){e instanceof l["default"]?o["default"](t,e)||t.push(e):t.indexOf(e)<0&&t.push(e)}),t}var r=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=a;var i=e("./arrayContainsObject"),o=r(i),s=e("./ParseObject"),l=r(s);t.exports=n["default"]},{"./ParseObject":14,"./arrayContainsObject":27,"babel-runtime/helpers/interop-require-default":47}],36:[function(e,t,n){"use strict";function a(e,t){var n={objects:{},files:[]},a=e.className+":"+e._getId();n.objects[a]=e.dirty()?e:!0;var i=e.attributes;for(var o in i)"object"==typeof i[o]&&r(i[o],n,!1,!!t);var s=[];for(var l in n.objects)l!==a&&n.objects[l]!==!0&&s.push(n.objects[l]);return s.concat(n.files)}function r(e,t,n,a){if(e instanceof u["default"]){if(!e.id&&n)throw new Error("Cannot create a pointer to an unsaved Object.");var i=e.className+":"+e._getId();if(!t.objects[i]){t.objects[i]=e.dirty()?e:!0;var o=e.attributes;for(var l in o)"object"==typeof o[l]&&r(o[l],t,!a,a)}}else{if(e instanceof s["default"])return void(!e.url()&&t.files.indexOf(e)<0&&t.files.push(e));if(!(e instanceof d["default"])){Array.isArray(e)&&e.forEach(function(e){r(e,t,n,a)});for(var c in e)"object"==typeof e[c]&&r(e[c],t,n,a)}}}var i=e("babel-runtime/helpers/interop-require-default")["default"];Object.defineProperty(n,"__esModule",{value:!0}),n["default"]=a;var o=e("./ParseFile"),s=i(o),l=e("./ParseObject"),u=i(l),c=e("./ParseRelation"),d=i(c);t.exports=n["default"]},{"./ParseFile":11,"./ParseObject":14,"./ParseRelation":18,"babel-runtime/helpers/interop-require-default":47}],37:[function(e,t,n){t.exports={"default":e("core-js/library/fn/object/create"),__esModule:!0}},{"core-js/library/fn/object/create":50}],38:[function(e,t,n){t.exports={"default":e("core-js/library/fn/object/define-property"),__esModule:!0}},{"core-js/library/fn/object/define-property":51}],39:[function(e,t,n){t.exports={"default":e("core-js/library/fn/object/freeze"),__esModule:!0}},{"core-js/library/fn/object/freeze":52}],40:[function(e,t,n){t.exports={"default":e("core-js/library/fn/object/get-own-property-descriptor"),__esModule:!0}},{"core-js/library/fn/object/get-own-property-descriptor":53}],41:[function(e,t,n){t.exports={"default":e("core-js/library/fn/object/keys"),__esModule:!0}},{"core-js/library/fn/object/keys":54}],42:[function(e,t,n){t.exports={"default":e("core-js/library/fn/object/set-prototype-of"),__esModule:!0}},{"core-js/library/fn/object/set-prototype-of":55}],43:[function(e,t,n){"use strict";n["default"]=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n.__esModule=!0},{}],44:[function(e,t,n){"use strict";var a=e("babel-runtime/core-js/object/define-property")["default"];n["default"]=function(){function e(e,t){for(var n=0;n=0,v.ie=/*@cc_on!@*/!1,v.safari=Object.prototype.toString.call(window.HTMLElement).indexOf("Constructor")>0,v.supported=v.chrome||v.ff||v.opera;var w=[];p=function(){},f=g=!1;var A=function(){i=a(S,e),i.bgColor=n(i.bgColor),i.textColor=n(i.textColor),i.position=i.position.toLowerCase(),i.animation=P.types[""+i.animation]?i.animation:S.animation,k=i.win.document;var t=i.position.indexOf("up")>-1,r=i.position.indexOf("left")>-1;if(t||r)for(var f=0;f0?d.height:32,l=d.width>0?d.width:32,u.height=s,u.width=l,c=u.getContext("2d"),C.ready()},d.setAttribute("src",o.getAttribute("href"))):(d.onload=function(){s=32,l=32,d.height=s,d.width=l,u.height=s,u.width=l,c=u.getContext("2d"),C.ready()},d.setAttribute("src",""))},C={};C.ready=function(){f=!0,C.reset(),p()},C.reset=function(){f&&(w=[],m=!1,h=!1,c.clearRect(0,0,l,s),c.drawImage(d,0,0,l,s),E.setIcon(u),window.clearTimeout(b),window.clearTimeout(y))},C.start=function(){if(f&&!h){var e=function(){m=w[0],h=!1,w.length>0&&(w.shift(),C.start())};if(w.length>0){h=!0;var t=function(){["type","animation","bgColor","textColor","fontFamily","fontStyle"].forEach(function(e){e in w[0].options&&(i[e]=w[0].options[e])}),P.run(w[0].options,function(){e()},!1)};m?P.run(m.options,function(){t()},!0):t()}}};var j={},x=function(e){return e.n="number"==typeof e.n?Math.abs(0|e.n):e.n,e.x=l*e.x,e.y=s*e.y,e.w=l*e.w,e.h=s*e.h,e.len=(""+e.n).length,e};j.circle=function(e){e=x(e);var t=!1;2===e.len?(e.x=e.x-.4*e.w,e.w=1.4*e.w,t=!0):e.len>=3&&(e.x=e.x-.65*e.w,e.w=1.65*e.w,t=!0),c.clearRect(0,0,l,s),c.drawImage(d,0,0,l,s),c.beginPath(),c.font=i.fontStyle+" "+Math.floor(e.h*(e.n>99?.85:1))+"px "+i.fontFamily,c.textAlign="center",t?(c.moveTo(e.x+e.w/2,e.y),c.lineTo(e.x+e.w-e.h/2,e.y),c.quadraticCurveTo(e.x+e.w,e.y,e.x+e.w,e.y+e.h/2),c.lineTo(e.x+e.w,e.y+e.h-e.h/2),c.quadraticCurveTo(e.x+e.w,e.y+e.h,e.x+e.w-e.h/2,e.y+e.h),c.lineTo(e.x+e.h/2,e.y+e.h),c.quadraticCurveTo(e.x,e.y+e.h,e.x,e.y+e.h-e.h/2),c.lineTo(e.x,e.y+e.h/2),c.quadraticCurveTo(e.x,e.y,e.x+e.h/2,e.y)):c.arc(e.x+e.w/2,e.y+e.h/2,e.h/2,0,2*Math.PI),c.fillStyle="rgba("+i.bgColor.r+","+i.bgColor.g+","+i.bgColor.b+","+e.o+")",c.fill(),c.closePath(),c.beginPath(),c.stroke(),c.fillStyle="rgba("+i.textColor.r+","+i.textColor.g+","+i.textColor.b+","+e.o+")","number"==typeof e.n&&e.n>999?c.fillText((e.n>9999?9:Math.floor(e.n/1e3))+"k+",Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.2*e.h)):c.fillText(e.n,Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.15*e.h)),c.closePath()},j.rectangle=function(e){e=x(e);var t=!1;2===e.len?(e.x=e.x-.4*e.w,e.w=1.4*e.w,t=!0):e.len>=3&&(e.x=e.x-.65*e.w,e.w=1.65*e.w,t=!0),c.clearRect(0,0,l,s),c.drawImage(d,0,0,l,s),c.beginPath(),c.font=i.fontStyle+" "+Math.floor(e.h*(e.n>99?.9:1))+"px "+i.fontFamily,c.textAlign="center",c.fillStyle="rgba("+i.bgColor.r+","+i.bgColor.g+","+i.bgColor.b+","+e.o+")",c.fillRect(e.x,e.y,e.w,e.h),c.fillStyle="rgba("+i.textColor.r+","+i.textColor.g+","+i.textColor.b+","+e.o+")","number"==typeof e.n&&e.n>999?c.fillText((e.n>9999?9:Math.floor(e.n/1e3))+"k+",Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.2*e.h)):c.fillText(e.n,Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.15*e.h)),c.closePath()};var M=function(e,t){t=("string"==typeof t?{animation:t}:t)||{},p=function(){try{if("number"==typeof e?e>0:""!==e){var a={type:"badge",options:{n:e}};if("animation"in t&&P.types[""+t.animation]&&(a.options.animation=""+t.animation),"type"in t&&j[""+t.type]&&(a.options.type=""+t.type),["bgColor","textColor"].forEach(function(e){e in t&&(a.options[e]=n(t[e]))}),["fontStyle","fontFamily"].forEach(function(e){e in t&&(a.options[e]=t[e])}),w.push(a),w.length>100)throw new Error("Too many badges requests in queue.");C.start()}else C.reset()}catch(r){throw new Error("Error setting badge. Message: "+r.message)}},f&&p()},_=function(e){p=function(){try{var t=e.width,n=e.height,a=document.createElement("img"),r=n/s>t/l?t/l:n/s;a.setAttribute("crossOrigin","anonymous"),a.onload=function(){c.clearRect(0,0,l,s),c.drawImage(a,0,0,l,s),E.setIcon(u)},a.setAttribute("src",e.getAttribute("src")),a.height=n/r,a.width=t/r}catch(i){throw new Error("Error setting image. Message: "+i.message)}},f&&p()},T=function(e){p=function(){try{if("stop"===e)return g=!0,C.reset(),void(g=!1);e.addEventListener("play",function(){t(this)},!1)}catch(n){throw new Error("Error setting video. Message: "+n.message)}},f&&p()},z=function(e){if(window.URL&&window.URL.createObjectURL||(window.URL=window.URL||{},window.URL.createObjectURL=function(e){return e}),v.supported){var n=!1;navigator.getUserMedia=navigator.getUserMedia||navigator.oGetUserMedia||navigator.msGetUserMedia||navigator.mozGetUserMedia||navigator.webkitGetUserMedia,p=function(){try{if("stop"===e)return g=!0,C.reset(),void(g=!1);n=document.createElement("video"),n.width=l,n.height=s,navigator.getUserMedia({video:!0,audio:!1},function(e){n.src=URL.createObjectURL(e),n.play(),t(n)},function(){})}catch(a){throw new Error("Error setting webcam. Message: "+a.message)}},f&&p()}},E={};E.getIcon=function(){var e=!1,t=function(){for(var e=k.getElementsByTagName("head")[0].getElementsByTagName("link"),t=e.length,n=t-1;n>=0;n--)if(/(^|\s)icon(\s|$)/i.test(e[n].getAttribute("rel")))return e[n];return!1};return i.element?e=i.element:i.elementId?(e=k.getElementById(i.elementId),e.setAttribute("href",e.getAttribute("src"))):(e=t(),e===!1&&(e=k.createElement("link"),e.setAttribute("rel","icon"),k.getElementsByTagName("head")[0].appendChild(e))),e.setAttribute("type","image/png"),e},E.setIcon=function(e){var t=e.toDataURL("image/png");if(i.dataUrl&&i.dataUrl(t),i.element)i.element.setAttribute("href",t),i.element.setAttribute("src",t);else if(i.elementId){var n=k.getElementById(i.elementId);n.setAttribute("href",t),n.setAttribute("src",t)}else if(v.ff||v.opera){var a=o;o=k.createElement("link"),v.opera&&o.setAttribute("rel","icon"),o.setAttribute("rel","icon"),o.setAttribute("type","image/png"),k.getElementsByTagName("head")[0].appendChild(o),o.setAttribute("href",t),a.parentNode&&a.parentNode.removeChild(a)}else o.setAttribute("href",t)};var P={};return P.duration=40,P.types={},P.types.fade=[{x:.4,y:.4,w:.6,h:.6,o:0},{x:.4,y:.4,w:.6,h:.6,o:.1},{x:.4,y:.4,w:.6,h:.6,o:.2},{x:.4,y:.4,w:.6,h:.6,o:.3},{x:.4,y:.4,w:.6,h:.6,o:.4},{x:.4,y:.4,w:.6,h:.6,o:.5},{x:.4,y:.4,w:.6,h:.6,o:.6},{x:.4,y:.4,w:.6,h:.6,o:.7},{x:.4,y:.4,w:.6,h:.6,o:.8},{x:.4,y:.4,w:.6,h:.6,o:.9},{x:.4,y:.4,w:.6,h:.6,o:1}],P.types.none=[{x:.4,y:.4,w:.6,h:.6,o:1}],P.types.pop=[{x:1,y:1,w:0,h:0,o:1},{x:.9,y:.9,w:.1,h:.1,o:1},{x:.8,y:.8,w:.2,h:.2,o:1},{x:.7,y:.7,w:.3,h:.3,o:1},{x:.6,y:.6,w:.4,h:.4,o:1},{x:.5,y:.5,w:.5,h:.5,o:1},{x:.4,y:.4,w:.6,h:.6,o:1}],P.types.popFade=[{x:.75,y:.75,w:0,h:0,o:0},{x:.65,y:.65,w:.1,h:.1,o:.2},{x:.6,y:.6,w:.2,h:.2,o:.4},{x:.55,y:.55,w:.3,h:.3,o:.6},{x:.5,y:.5,w:.4,h:.4,o:.8},{x:.45,y:.45,w:.5,h:.5,o:.9},{x:.4,y:.4,w:.6,h:.6,o:1}],P.types.slide=[{x:.4,y:1,w:.6,h:.6,o:1},{x:.4,y:.9,w:.6,h:.6,o:1},{x:.4,y:.9,w:.6,h:.6,o:1},{x:.4,y:.8,w:.6,h:.6,o:1},{x:.4,y:.7,w:.6,h:.6,o:1},{x:.4,y:.6,w:.6,h:.6,o:1},{x:.4,y:.5,w:.6,h:.6,o:1},{x:.4,y:.4,w:.6,h:.6,o:1}],P.run=function(e,t,n,o){var s=P.types[r()?"none":i.animation];return o=n===!0?"undefined"!=typeof o?o:s.length-1:"undefined"!=typeof o?o:0,t=t?t:function(){},o=0?(j[i.type](a(e,s[o])),b=setTimeout(function(){n?o-=1:o+=1,P.run(e,t,n,o)},P.duration),E.setIcon(u),void 0):void t()},A(),{badge:M,video:T,image:_,webcam:z,reset:C.reset,browser:{supported:v.supported}}};"undefined"!=typeof define&&define.amd?define([],function(){return e}):"undefined"!=typeof module&&module.exports?module.exports=e:this.Favico=e}(); -//# sourceMappingURL=../maps/scripts/vendor-5f48f0c060.js.map \ No newline at end of file +//# sourceMappingURL=../maps/scripts/vendor-5f48f0c060.js.map diff --git a/dist/angular-jsonapi.js b/dist/angular-jsonapi.js index 1a13d1d..2665ebd 100644 --- a/dist/angular-jsonapi.js +++ b/dist/angular-jsonapi.js @@ -94,7 +94,7 @@ } else if (schema.type === 'hasMany') { if (config.target === undefined) { $http({ - method: 'PUT', + method: 'PATCH', headers: headers, data: {data: []}, url: url + '/' + config.object.data.id + '/relationships/' + config.key @@ -121,7 +121,7 @@ deferred.reject({errors: [{status: 0, statusText: 'Can\'t link object without id through rest call'}]}); } else if (schema.type === 'hasOne') { $http({ - method: 'PUT', + method: 'PATCH', headers: headers, data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)}, url: url + '/' + config.object.data.id + '/relationships/' + config.key @@ -140,7 +140,7 @@ function update(config) { return $http({ - method: 'PUT', + method: 'PATCH', headers: headers, url: url + '/' + config.object.data.id, data: config.object.form.toJson() @@ -3362,4 +3362,4 @@ }]); })(); -//# sourceMappingURL=angular-jsonapi.js.map \ No newline at end of file +//# sourceMappingURL=angular-jsonapi.js.map diff --git a/dist/angular-jsonapi.js.map b/dist/angular-jsonapi.js.map index c77493c..872a6bc 100644 --- a/dist/angular-jsonapi.js.map +++ b/dist/angular-jsonapi.js.map @@ -1 +1 @@ -{"version":3,"sources":["sources/rest/source-rest.module.js","sources/rest/source-rest.factory.js","sources/rest/source-rest.decorator.js","sources/parse/source-parse.module.js","sources/parse/source-parse.factory.js","sources/parse/source-parse.decorator.js","sources/local/source-local.module.js","sources/local/source-local.factory.js","sources/local/source-local.decorator.js","jsonapi.module.js","resource/resource-cache/resource-cache.factory.js","model/model-linker/model-linker.js","model/model-form/model-form.factory.js","model/abstract-model/abstract-model.js","errors/validation-error/validation-error.factory.js","errors/source-error/source-error.factory.js","errors/errors-manager/errors-manager.factory.js","utils/named-function.js","utils/lazy-property.js","utils/kebab-case.js","utils/all-settled.js","synchronizers/synchronizer-simple.factory.js","synchronizers/synchronizer-prototype.js","sources/source-prototype.js","schema/schema.factory.js","schema/schema-link.factory.js","resource/resource.factory.js","model/model-factory.factory.js","collection/collection.factory.js","jsonapi.provider.js","jsonapi.config.js"],"names":[],"mappings":"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","file":"angular-jsonapi.js","sourcesContent":["(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper);\n\n function AngularJsonAPISourceRestWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n toKebabCase,\n $q,\n $http\n ) {\n\n AngularJsonAPISourceRest.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceRest.prototype.constructor = AngularJsonAPISourceRest;\n\n return {\n create: AngularJsonAPISourceRestFactory,\n encodeParams: encodeParams,\n decodeParams: decodeParams\n };\n\n function AngularJsonAPISourceRestFactory(name, url) {\n return new AngularJsonAPISourceRest(name, url);\n }\n\n function AngularJsonAPISourceRest(name, url) {\n var _this = this;\n var headers = { // jscs:disable disallowQuotedKeysInObjects\n 'Accept': 'application/vnd.api+json',\n 'Content-Type': 'application/vnd.api+json'\n }; // jscs:enable disallowQuotedKeysInObjects\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('unlink', unlink);\n _this.synchronization('link', link);\n _this.synchronization('update', update);\n _this.synchronization('add', add);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'all'));\n }\n\n function get(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url + '/' + config.object.data.id,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'get'));\n }\n\n function remove(config) {\n return $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'remove'));\n }\n\n function unlink(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Object has been removed', _this, 0, 'unlink'));\n } else if (config.target !== undefined && config.target.data.id === undefined) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Can\\'t unlink object without id through rest call', _this, 0, 'unlink'));\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'get')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n if (config.target === undefined) {\n $http({\n method: 'PUT',\n headers: headers,\n data: {data: []},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n } else {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key + '/' + config.target.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n }\n }\n\n return deferred.promise;\n }\n\n function link(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject({errors: [{status: 0, statusText: 'Object has been removed'}]});\n } else if (config.target === undefined || config.target.data.id === undefined) {\n deferred.reject({errors: [{status: 0, statusText: 'Can\\'t link object without id through rest call'}]});\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'PUT',\n headers: headers,\n data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n $http({\n method: 'POST',\n headers: headers,\n data: {data: [AngularJsonAPIModelLinkerService.toLinkData(config.target)]},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n }\n\n return deferred.promise;\n }\n\n function update(config) {\n return $http({\n method: 'PUT',\n headers: headers,\n url: url + '/' + config.object.data.id,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'update'));\n }\n\n function add(config) {\n return $http({\n method: 'POST',\n headers: headers,\n url: url,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'add'));\n }\n\n function resolveHttp(response) {\n return $q.resolve(response.data);\n }\n\n function rejectHttp(action, response) {\n var deferred = $q.defer();\n\n if (response.status === 0) {\n $http({\n method: 'GET',\n url: 'https://status.cloud.google.com/incidents.schema.json'\n }).then(rejectServerOffline, rejectNoConnection);\n } else {\n deferred.reject(AngularJsonAPIModelSourceError.create(response.statusText, _this, response.status, action));\n }\n\n return deferred.promise;\n\n function rejectServerOffline(response) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Server is offline', _this, response.status, action));\n }\n\n function rejectNoConnection() {\n deferred.reject(AngularJsonAPIModelSourceError.create('No internet connection', _this, response.status, action));\n }\n }\n }\n\n function encodeParams(params) {\n var encodedParams = {};\n\n if (params === undefined) {\n return {};\n }\n\n angular.forEach(params, function(paramValue, paramKey) {\n if (angular.isArray(paramValue)) {\n encodedParams[paramKey] = encodeValue(paramValue);\n } else if (angular.isObject(paramValue)) {\n angular.forEach(paramValue, function(paramInnerValue, paramInnerKey) {\n encodedParams[paramKey + '[' + paramInnerKey + ']'] = encodeValue(paramInnerValue);\n });\n } else {\n encodedParams[paramKey] = paramValue;\n }\n });\n\n return encodedParams;\n\n function encodeValue(argument) {\n if (angular.isArray(argument)) {\n return argument.join(',');\n } else {\n return argument;\n }\n }\n }\n\n function decodeParams(params) {\n var decodedParams = {};\n\n angular.forEach(params, function(value, key) {\n var objectKeyStart = key.indexOf('[');\n value = value.split(',');\n\n if (objectKeyStart > -1) {\n var objectKey = key.substr(0, objectKeyStart);\n var objectElementKey = key.substr(objectKeyStart + 1, key.indexOf(']') - objectKeyStart - 1);\n\n decodedParams[objectKey] = decodedParams[objectKey] || {};\n decodedParams[objectKey][objectElementKey] = value;\n } else {\n decodedParams[key] = value;\n }\n });\n\n return decodedParams;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceRest) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceRest = AngularJsonAPISourceRest;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n /* global Parse: false */\n angular.module('angular-jsonapi-parse', ['angular-jsonapi'])\n .constant('Parse', Parse);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper);\n\n function AngularJsonAPISourceParseWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n pluralize,\n Parse,\n $log,\n $q\n ) {\n\n AngularJsonAPISourceParse.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceParse.prototype.constructor = AngularJsonAPISourceParse;\n AngularJsonAPISourceParse.prototype.initialize = initialize;\n\n return {\n create: AngularJsonAPISourceParseFactory\n };\n\n function AngularJsonAPISourceParseFactory(name, table) {\n return new AngularJsonAPISourceParse(name, table);\n }\n\n function AngularJsonAPISourceParse(name, table) {\n var _this = this;\n\n _this.ParseObject = Parse.Object.extend(table);\n _this.type = pluralize(table).charAt(0).toLowerCase() + pluralize(table).slice(1);\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('update', update);\n _this.synchronization('add', update);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n var query = new Parse.Query(_this.ParseObject);\n\n if (config.params.limit !== undefined) {\n query.limit(config.params.limit);\n }\n\n angular.forEach(config.params.filter, function(filter) {\n query.equalTo(filter.key, filter.value);\n });\n\n return query.find().then(resolveParse, rejectParse.bind(null, 'all'));\n }\n\n function get(config) {\n var query = new Parse.Query(_this.ParseObject);\n return query.get(config.object.data.id).then(resolveParse, rejectParse.bind(null, 'get'));\n }\n\n function remove(config) {\n var object = new _this.ParseObject();\n object.set('id', config.object.data.id);\n return object.destroy().then(resolveParse, rejectParse.bind(null, 'remove'));\n }\n\n function update(config) {\n var object = toParseObject(config.object);\n return object.save(null).then(resolveParse, rejectParse.bind(null, 'update'));\n }\n\n function toParseObject(object) {\n var parseObject = new _this.ParseObject();\n angular.forEach(object.form.data.attributes, function(attribute, key) {\n parseObject.set(key, attribute);\n });\n\n angular.forEach(object.schema.relationships, function(relationship, key) {\n if (relationship.type === 'hasOne'\n && object.form.data.relationships[key].data !== null\n && object.form.data.relationships[key].data !== undefined\n ) {\n var table = pluralize(key, 1).charAt(0).toUpperCase() + pluralize(key, 1).slice(1);\n var parsePointer = new (Parse.Object.extend(table))();\n parsePointer.set('id', object.form.data.relationships[key].data.id);\n parseObject.set(key, parsePointer);\n }\n });\n\n return parseObject;\n }\n\n function fromParseObject(object) {\n var relationships = _this.synchronizer.resource.schema.relationships;\n object.type = _this.type;\n object.relationships = object.relationships || [];\n angular.forEach(relationships, function(relationship, key) {\n if (object.attributes[key] && relationship.type === 'hasOne') {\n object.relationships[key] = {\n data: {\n type: relationship.model,\n id: object.attributes[key].id\n }\n };\n }\n });\n\n return object;\n }\n\n function resolveParse(response) {\n if (angular.isArray(response)) {\n angular.forEach(response, function(elem, key) {\n response[key] = fromParseObject(elem);\n });\n } else if (angular.isObject(response)) {\n response = fromParseObject(response);\n }\n\n return $q.resolve({\n data: response\n });\n }\n\n function rejectParse(action, response) {\n $log.error('Parse error for', action, response);\n return $q.reject(response);\n }\n }\n\n function initialize(appId, jsKey) {\n Parse.initialize(appId, jsKey);\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceParse) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceParse;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper);\n\n function AngularJsonAPISourceLocalWrapper(\n AngularJsonAPISourcePrototype,\n $window,\n $q\n ) {\n var size = {\n max: 0,\n all: 0,\n limit: 5200000,\n list: {}\n };\n\n AngularJsonAPISourceLocal.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceLocal.prototype.constructor = AngularJsonAPISourceLocal;\n\n return {\n create: AngularJsonAPISourceLocalFactory,\n size: size\n };\n\n function AngularJsonAPISourceLocalFactory(name, prefix) {\n return new AngularJsonAPISourceLocal(name, prefix);\n }\n\n function AngularJsonAPISourceLocal(name, prefix) {\n var _this = this;\n\n prefix = prefix || 'AngularJsonAPI';\n\n _this.__updateStorage = updateStorage;\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('init', init);\n\n _this.begin('clearCache', clear);\n\n _this.finish('init', updateStorage);\n _this.finish('clearCache', updateStorage);\n _this.finish('remove', updateStorage);\n _this.finish('refresh', updateStorage);\n _this.finish('unlink', updateStorage);\n _this.finish('unlinkReflection', updateStorage);\n _this.finish('link', updateStorage);\n _this.finish('linkReflection', updateStorage);\n _this.finish('update', updateStorage);\n _this.finish('add', updateStorage);\n _this.finish('get', updateStorage);\n _this.finish('all', updateStorage);\n _this.finish('include', updateStorage);\n\n function init() {\n var type = _this.synchronizer.resource.schema.type;\n return $q.resolve($window.localStorage.getItem(prefix + '.' + type));\n }\n\n function clear() {\n var type = _this.synchronizer.resource.schema.type;\n var key = prefix + '.' + type;\n\n size.all -= size.list[key];\n delete size.list[key];\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.removeItem(key);\n }\n\n function updateStorage() {\n var type = _this.synchronizer.resource.schema.type;\n var cache = _this.synchronizer.resource.cache;\n var json = cache.toJson();\n var key = prefix + '.' + type;\n\n size.list[key] = size.list[key] === undefined ? 0 : size.list[key];\n size.all += json.length - size.list[key];\n size.list[key] = json.length;\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.setItem(key, json);\n }\n\n function objectMaxKey(object) {\n return Object.keys(object).reduce(function(m, k) {\n return object[k] > object[m] ? k : m;\n }, Object.keys(object)[0]);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceLocal) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceLocal;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi', ['uuid4'])\n /* global pluralize: false, validate: false */\n .constant('pluralize', pluralize)\n .constant('validateJS', validate);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper);\n\n function AngularJsonAPIResourceCacheWrapper(\n uuid4,\n $log\n ) {\n\n AngularJsonAPIResourceCache.prototype.get = get;\n AngularJsonAPIResourceCache.prototype.index = index;\n AngularJsonAPIResourceCache.prototype.setIndexIds = setIndexIds;\n AngularJsonAPIResourceCache.prototype.addOrUpdate = addOrUpdate;\n\n AngularJsonAPIResourceCache.prototype.fromJson = fromJson;\n AngularJsonAPIResourceCache.prototype.toJson = toJson;\n AngularJsonAPIResourceCache.prototype.clear = clear;\n\n AngularJsonAPIResourceCache.prototype.remove = remove;\n AngularJsonAPIResourceCache.prototype.revertRemove = revertRemove;\n AngularJsonAPIResourceCache.prototype.clearRemoved = clearRemoved;\n\n return {\n create: AngularJsonAPIResourceCacheFactory\n };\n\n function AngularJsonAPIResourceCacheFactory(resource) {\n return new AngularJsonAPIResourceCache(resource);\n }\n\n /**\n * Constructor\n */\n function AngularJsonAPIResourceCache(resource) {\n var _this = this;\n\n _this.resource = resource;\n _this.data = {};\n _this.removed = {};\n _this.size = 0;\n\n _this.indexIds = undefined;\n }\n\n /**\n * Add new model or update existing with data\n * @param {object} validatedData Data that are used to update or create an object, has to be valid\n * @return {AngularJsonAPIModel} Created model\n */\n function addOrUpdate(validatedData, config, updatedAt) {\n var _this = this;\n var id = validatedData.id;\n\n if (id === undefined) {\n $log.error('Can\\'t add data without id!', validatedData);\n return;\n }\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(validatedData, config, updatedAt);\n _this.size += 1;\n } else {\n _this.data[id].update(validatedData, !config.new, config.initialization);\n }\n\n return _this.data[id];\n }\n\n\n /**\n * Recreate object structure from json data\n * @param {json} json Json data\n * @return {undefined}\n */\n function fromJson(json) {\n var _this = this;\n var collection = angular.fromJson(json);\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: true\n };\n\n if (angular.isObject(collection) && collection.data !== undefined) {\n _this.updatedAt = collection.updatedAt;\n _this.indexIds = collection.indexIds;\n\n angular.forEach(collection.data, function(objectData) {\n var data = objectData.data;\n _this.addOrUpdate(data, config, objectData.updatedAt);\n });\n }\n }\n\n /**\n * Encodes memory into json format\n * @return {json} Json encoded memory\n */\n function toJson() {\n var _this = this;\n var json = {\n data: [],\n updatedAt: _this.updatedAt,\n indexIds: _this.indexIds\n };\n\n angular.forEach(_this.data, function(object) {\n if (object.hasErrors() === false) {\n json.data.push(object.toJson());\n }\n });\n\n return angular.toJson(json);\n }\n\n /**\n * Clear memory\n * @return {undefined}\n */\n function clear() {\n var _this = this;\n\n _this.indexIds = undefined;\n _this.data = {};\n _this.removed = {};\n }\n\n /**\n * Low level get used internally, does not run any synchronization\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function get(id) {\n var _this = this;\n\n var data = {\n id: id,\n type: _this.resource.schema.type\n };\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: true\n };\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(data, config);\n }\n\n return _this.data[id];\n }\n\n /**\n * Low level get used internally, does not run any synchronization, used for index requests\n * @param {objec} params\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function index(params) {\n var _this = this;\n params = params || {};\n\n if (_this.indexIds === undefined) {\n return _this.indexIds;\n }\n\n return _this.indexIds.map(_this.get.bind(_this)).filter(filter);\n\n function filter(argument) {\n var filterParams = params.filter;\n var valid = true;\n\n angular.forEach(filterParams, function(constraint) {\n valid = valid && argument.data.attributes[constraint.key] === constraint.value;\n });\n\n return valid;\n }\n }\n\n /**\n * Cache ids of objects returned by index request\n * @param {ids array or AngularJsonAPIModel array} array Objects or ids to be cached\n */\n function setIndexIds(array) {\n var _this = this;\n\n _this.indexIds = [];\n\n angular.forEach(array, function(element) {\n if (angular.isString(element) && _this.resource.schema.id.validate(element)) {\n _this.indexIds.push(element);\n } else if (angular.isObject(element) && _this.resource.schema.id.validate(element.data.id)) {\n _this.indexIds.push(element.data.id);\n }\n });\n }\n\n /**\n * Remove object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function remove(id) {\n var _this = this;\n\n if (_this.data[id] !== undefined) {\n _this.removed[id] = _this.data[id];\n delete _this.data[id];\n _this.size -= 1;\n }\n\n return _this.removed[id];\n }\n\n /**\n * Revert removal of an object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function revertRemove(id) {\n var _this = this;\n\n if (_this.removed[id] !== undefined) {\n _this.data[id] = _this.removed[id];\n delete _this.removed[id];\n _this.size += 1;\n }\n\n return _this.data[id];\n }\n\n /**\n * Clear removed object from memory\n * @param {uuid} id\n * @return {undefined}\n */\n function clearRemoved(id) {\n var _this = this;\n\n delete _this.removed[id];\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService);\n\n function AngularJsonAPIModelLinkerService($log) {\n var _this = this;\n\n _this.toLinkData = toLinkData;\n\n _this.link = link;\n _this.unlink = unlink;\n\n return this;\n\n /**\n * Extracts data needed for relationship linking from object\n * @param {AngularJsonAPIModel} object Object\n * @return {json} Link data\n */\n function toLinkData(object) {\n if (object === null) {\n return null;\n }\n\n return {type: object.data.type, id: object.data.id};\n }\n\n /**\n * Add target to object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function link(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t add link to non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (target === undefined) {\n $log.error('Can\\'t link non existing object', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema === undefined) {\n $log.error('Can\\'t add link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (target !== null && schema.polymorphic === false && schema.model !== target.data.type) {\n $log.error('This relation is not polymorphic, expected: ' + schema.model + ' instead of ' + target.data.type);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema.type === 'hasMany') {\n if (oneWay === true) {\n __addHasMany(object, key, target, form);\n return [];\n } else {\n return __processAddHasMany(object, key, target, form);\n }\n } else if (schema.type === 'hasOne') {\n if (oneWay === true) {\n __addHasOne(object, key, target, form);\n return [];\n } else {\n return __processAddHasOne(object, key, target, form);\n }\n }\n }\n\n /**\n * Remove target from object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function unlink(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t remove link from non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (schema === undefined) {\n $log.error('Can\\'t remove link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (oneWay === true) {\n __removeHasMany(object, key, target, form);\n return [];\n } else {\n return __processRemove(object, key, target, form);\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __processAddHasMany(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var reflectionSchema;\n\n if (reflectionKey === false) {\n __addHasMany(object, key, target, form);\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema === undefined) {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n } else if (reflectionSchema.type === 'hasOne') {\n return __swapResults(\n __wrapResults(object, key, target),\n __wrapResults(target, reflectionKey, object),\n __processAddHasOne(target, reflectionKey, object, form)\n );\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(object, key, target, form);\n __addHasMany(target, reflectionKey, object, form);\n return [__wrapResults(target, reflectionKey, object)];\n }\n }\n\n function __processAddHasOne(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var oldReflection = object.relationships[key];\n var reflectionSchema;\n var oldReflectionSchema;\n var result = [];\n\n __addHasOne(object, key, target, form);\n\n if (reflectionKey === false) {\n return [];\n }\n\n if (oldReflection !== undefined && oldReflection !== null) {\n oldReflectionSchema = oldReflection.schema.relationships[reflectionKey];\n\n if (oldReflectionSchema !== undefined) {\n if (oldReflectionSchema.type === 'hasOne') {\n __removeHasOne(oldReflection, reflectionKey, object, form);\n } else if (oldReflectionSchema.type === 'hasMany') {\n __removeHasMany(oldReflection, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(oldReflection, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n if (target !== undefined && target !== null && reflectionKey !== false) {\n reflectionSchema = target.schema.relationships[reflectionKey];\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __addHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(target, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(target, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n return result;\n }\n\n function __processRemove(object, key, target, form) {\n var schema = object.schema.relationships[key];\n var reflectionKey = schema.reflection;\n var reflectionSchema;\n\n if (schema.type === 'hasMany') {\n __removeHasMany(object, key, target, form);\n } else if (schema.type === 'hasOne') {\n __removeHasOne(object, key, target, form);\n }\n\n if (reflectionKey === false) {\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __removeHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __removeHasMany(target, reflectionKey, object, form);\n }\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n }\n\n return [__wrapResults(target, reflectionKey, object)];\n }\n\n function __addHasOne(object, key, target, form) {\n $log.debug('addHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n object.relationships[key] = target;\n object.data.relationships[key].data = toLinkData(target);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __addHasMany(object, key, target, form) {\n $log.debug('addHasMany', object, key, target);\n\n var linkData = toLinkData(target);\n if (form === true) {\n object = object.form;\n }\n\n if (angular.isArray(object.relationships[key]) && object.relationships[key].indexOf(target) > -1) {\n return false;\n }\n\n object.relationships[key] = object.relationships[key] || [];\n object.data.relationships[key].data = object.data.relationships[key].data || [];\n\n object.relationships[key].push(target);\n object.data.relationships[key].data.push(linkData);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasOne(object, key, target, form) {\n $log.debug('removeHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (target !== undefined && object.relationships[key] !== target) {\n return false;\n }\n\n object.relationships[key] = null;\n object.data.relationships[key].data = undefined;\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasMany(object, key, target, form) {\n $log.debug('removeHasMany', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (object.relationships[key] === undefined) {\n return;\n }\n\n if (target === undefined) {\n object.relationships[key] = [];\n object.data.relationships[key].data = [];\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n var index = object.relationships[key].indexOf(target);\n\n if (index === -1) {\n return false;\n }\n\n object.relationships[key].splice(index, 1);\n object.data.relationships[key].data.splice(index, 1);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __wrapResults(object, key, target) {\n return {\n object: object,\n key: key,\n target: target\n };\n }\n\n function __swapResults(value, newValue, array) {\n var index = -1;\n angular.forEach(array, function(item, i) {\n if (item.object === value.object && item.key === value.key && item.target === value.target) {\n index = i;\n }\n });\n\n if (index > -1) {\n array[index] = newValue;\n } else {\n array.push(newValue);\n }\n\n return array;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper);\n\n function AngularJsonAPIModelFormWrapper(\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelLinkerService,\n validateJS,\n $q\n ) {\n\n AngularJsonAPIModelForm.prototype.save = save;\n AngularJsonAPIModelForm.prototype.reset = reset;\n AngularJsonAPIModelForm.prototype.validate = validate;\n\n AngularJsonAPIModelForm.prototype.link = link;\n AngularJsonAPIModelForm.prototype.unlink = unlink;\n\n AngularJsonAPIModelForm.prototype.toJson = toJson;\n\n return {\n create: AngularJsonAPIModelFormFactory\n };\n\n function AngularJsonAPIModelFormFactory(parent) {\n return new AngularJsonAPIModelForm(parent);\n }\n\n function AngularJsonAPIModelForm(parent) {\n var _this = this;\n\n _this.data = {\n id: parent.data.id,\n type: parent.data.type,\n attributes: {},\n relationships: {}\n };\n\n _this.relationships = {};\n _this.parent = parent;\n _this.schema = parent.schema;\n _this.reset();\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = angular.copy(_this.data);\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data\n };\n }\n\n /**\n * Saves form, shortcut to parent.save()\n * @return {promise} Promise associated with synchronization\n */\n function save() {\n var _this = this;\n\n return _this.parent.save();\n }\n\n /**\n * Resets form to state of a parent\n * @return {undefined}\n */\n function reset(auto) {\n var _this = this;\n\n angular.forEach(_this.schema.relationships, function(data, key) {\n _this.data.relationships[key] = angular.copy(_this.parent.data.relationships[key]) || {};\n if (angular.isArray(_this.relationships[key])) {\n _this.relationships[key] = _this.parent.relationships[key].slice();\n } else {\n _this.relationships[key] = _this.parent.relationships[key];\n }\n });\n\n if (auto === true && _this.parent.synchronized === true) {\n return;\n }\n\n angular.forEach(_this.schema.attributes, function(validator, key) {\n _this.data.attributes[key] = angular.copy(_this.parent.data.attributes[key]);\n });\n\n _this.parent.errors.validation.clear();\n }\n\n /**\n * Validates form\n * @return {promise} Promise rejected to errors object indexed by keys. If the\n * key param i stated it only validates an attribute, else all attributes.\n */\n function validate(key) {\n var _this = this;\n var attributesWrapper;\n var constraintsWrapper;\n var deferred = $q.defer();\n\n if (key === undefined) {\n attributesWrapper = _this.data.attributes;\n constraintsWrapper = _this.schema.attributes;\n } else {\n attributesWrapper = {};\n constraintsWrapper = {};\n\n attributesWrapper[key] = _this.data.attributes[key];\n constraintsWrapper[key] = _this.schema.attributes[key];\n }\n\n validateJS.async(\n attributesWrapper,\n constraintsWrapper\n ).then(resolve, reject);\n\n function resolve() {\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n deferred.resolve();\n }\n\n function reject(errorsMap) {\n _this.parent.error = true;\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n angular.forEach(errorsMap, function(errors, attribute) {\n angular.forEach(errors, function(error) {\n _this.parent.errors.validation.add(attribute, AngularJsonAPIModelValidationError.create(error, attribute));\n });\n });\n\n deferred.reject(_this.parent.errors.validation);\n }\n\n return deferred.promise;\n }\n\n /**\n * Adds link to a form without synchronization\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function link(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.link(_this.parent, key, target, oneWay, true));\n }\n\n /**\n * Removes link from form without synchronization\n * @param {[type]} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function unlink(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true));\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper);\n\n function AngularJsonAPIAbstractModelWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelErrorsManager,\n AngularJsonAPIModelLinkerService,\n AngularJsonAPIModelForm,\n $rootScope,\n $injector,\n $log,\n $q\n ) {\n AngularJsonAPIAbstractModel.prototype.refresh = refresh;\n AngularJsonAPIAbstractModel.prototype.remove = remove;\n AngularJsonAPIAbstractModel.prototype.reset = reset;\n AngularJsonAPIAbstractModel.prototype.save = save;\n\n AngularJsonAPIAbstractModel.prototype.update = update;\n\n AngularJsonAPIAbstractModel.prototype.link = link;\n AngularJsonAPIAbstractModel.prototype.unlink = unlink;\n AngularJsonAPIAbstractModel.prototype.unlinkAll = unlinkAll;\n\n AngularJsonAPIAbstractModel.prototype.toJson = toJson;\n\n AngularJsonAPIAbstractModel.prototype.hasErrors = hasErrors;\n\n return AngularJsonAPIAbstractModel;\n\n /**\n * Constructor\n * @param {json} data Validated data used to create an object\n * @param {object} config Is object new (for form)\n */\n function AngularJsonAPIAbstractModel(data, config, updatedAt) {\n var _this = this;\n\n data.relationships = data.relationships || {};\n\n /**\n * Is not a new record\n * @type {Boolean}\n */\n _this.new = config.new === undefined ? false : config.new;\n\n /**\n * Is present on the server\n * @type {Boolean}\n */\n _this.stable = config.stable === undefined ? true : config.stable;\n\n /**\n * Has been synchronized with the server\n * @type {Boolean}\n */\n _this.synchronized = config.synchronized === undefined ? true : config.synchronized;\n\n /**\n * Has just been created by request and may not exist on the server\n * @type {Boolean}\n */\n _this.pristine = config.pristine === undefined ? true : config.pristine;\n\n _this.removed = false;\n _this.loading = false;\n _this.saving = false;\n _this.updatedAt = _this.synchronized === true ? Date.now() : updatedAt;\n\n _this.loadingCount = 0;\n _this.savingCount = 0;\n\n _this.data = {\n relationships: {},\n attributes: {}\n };\n _this.relationships = {};\n\n angular.forEach(_this.schema.relationships, function(schema, key) {\n _this.relationships[key] = undefined;\n });\n\n _this.errors = {\n validation: AngularJsonAPIModelErrorsManager.create(\n 'Validation',\n 'Errors of attributes validation',\n AngularJsonAPIModelValidationError\n ),\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.promise = $q.resolve(_this);\n\n __setData(_this, data);\n\n _this.form = AngularJsonAPIModelForm.create(_this);\n }\n\n /**\n * Saves model's form\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function save() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: _this.new === true ? 'add' : 'update',\n object: _this\n };\n\n _this.form.validate().then(\n synchronize,\n deferred.reject\n ).finally(__decrementSavingCounter.bind(_this, undefined));\n\n __incrementSavingCounter(_this);\n\n return deferred.promise;\n\n function synchronize() {\n _this.synchronize(config).then(resolve, reject, notify);\n }\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:' + config.action, 'resolved', _this, response);\n _this.update(response.data.data);\n\n if (_this.new === true) {\n _this.resource.cache.indexIds = _this.resource.cache.indexIds || [];\n _this.resource.cache.indexIds.push(_this.data.id);\n }\n\n _this.synchronized = true;\n _this.new = false;\n _this.pristine = false;\n _this.stable = true;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve(response.data.meta);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Reset object form\n * @return {undefined}\n */\n function reset() {\n var _this = this;\n\n if (_this.form !== undefined) {\n _this.form.reset();\n }\n }\n\n /**\n * Synchronize object with remote\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function refresh(params) {\n var $jsonapi = $injector.get('$jsonapi');\n var deferred = $q.defer();\n var _this = this;\n params = params === undefined ? _this.schema.params.get : params;\n\n var config = {\n action: 'refresh',\n object: _this,\n params: params\n };\n\n if (_this.new === true) {\n var error = AngularJsonAPIModelSourceError.create('Can\\'t refresh new object', null, 0, 'refresh');\n _this.errors.synchronization.add('refresh', error);\n deferred.reject(error);\n } else {\n __incrementLoadingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n _this.synchronized = true;\n _this.stable = true;\n _this.pristine = false;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = _this.data;\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data,\n updatedAt: _this.updatedAt\n };\n }\n\n /**\n * Remove object\n * @return {promise} Promise associated with synchronization that resolves to nothing\n */\n function remove() {\n var _this = this;\n var deferred = $q.defer();\n\n var config = {\n action: 'remove',\n object: _this\n };\n\n _this.resource.cache.remove(_this.data.id);\n\n if (_this.new === true) {\n deferred.resolve();\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'resolved', _this, response);\n _this.removed = true;\n _this.unlinkAll();\n _this.resource.cache.clearRemoved(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'rejected', _this, response);\n _this.resource.cache.revertRemove(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlink all reflection relationships of the object **without synchronization**\n * @return {boolean} Result\n */\n function unlinkAll(key) {\n var _this = this;\n var deferred = $q.defer();\n\n __incrementLoadingCounter(_this);\n\n if (key === undefined) {\n angular.forEach(_this.relationships, removeLink);\n } else {\n removeLink(_this.relationships[key], key);\n }\n\n __decrementLoadingCounter(_this);\n\n return deferred.promise;\n\n function removeLink(linksObj, key) {\n var schema = _this.schema.relationships[key];\n var reflectionKey = schema.reflection;\n\n if (angular.isArray(linksObj)) {\n angular.forEach(linksObj, removeReflectionLink.bind(undefined, reflectionKey));\n } else if (angular.isObject(linksObj)) {\n removeReflectionLink(reflectionKey, linksObj);\n }\n\n if (schema.type === 'hasOne') {\n _this.relationships[key] = null;\n } else if (schema.type === 'hasMany') {\n _this.relationships[key] = [];\n }\n }\n\n function removeReflectionLink(reflectionKey, target) {\n var reflectionSchema = target.schema.relationships[reflectionKey];\n var config = {\n action: 'unlinkReflection',\n object: target,\n target: _this,\n key: reflectionKey\n };\n\n __incrementLoadingCounter(target);\n AngularJsonAPIModelLinkerService.unlink(target, reflectionKey, _this, reflectionSchema);\n\n target.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(target, undefined));\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'resolve', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'notify', _this, response);\n\n response.finish();\n deferred.notify(response);\n }\n }\n }\n\n /**\n * Links object to relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {promise} Promise associated with synchronizations\n */\n function link(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'link',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link undefined', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link new object', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'linkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].object.data.type + ':object:linkReflection', 'resolved', targets[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlinks object from relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked if undefined unlinks all\n * @return {promise} Promise associated with synchronizations\n */\n function unlink(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'unlink',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink undefined', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink new object', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'unlinkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].data.type + ':object:unlinkReflection', 'resolved', targets[key], operation);\n response.value.finish();\n }\n });\n\n deferred.resolve();\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Sets object state to data\n * @param {object} validatedData JsonAPI object with data\n * @return {bool} Result\n */\n function update(validatedData, auto, initialization) {\n var _this = this;\n\n __incrementLoadingCounter(_this);\n\n __setData(_this, validatedData);\n _this.reset(auto);\n _this.synchronized = initialization === true ? false : true;\n _this.stable = initialization === true ? false : true;\n _this.updatedAt = Date.now();\n\n __decrementLoadingCounter(_this);\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /////////////\n // PRIVATE //\n /////////////\n\n /**\n * Low level set data function, use only with validated data\n * @param {AngularJsonAPIModel} object object to be modified\n * @param {object} validatedData Validated data\n * @return {boolean} Status\n */\n function __setData(object, validatedData) {\n\n var $jsonapi = $injector.get('$jsonapi');\n var schema = object.schema;\n\n object.data.id = validatedData.id;\n object.data.type = validatedData.type;\n\n if (object.resource.schema.type !== validatedData.type) {\n $log.error('Different type then resource', object.resource.schema.type, validatedData);\n return false;\n }\n\n if (!object.schema.id.validate(object.data.id)) {\n $log.error('Invalid id');\n return false;\n }\n\n object.data.links = validatedData.links;\n validatedData.attributes = validatedData.attributes || {};\n validatedData.relationships = validatedData.relationships || {};\n\n angular.forEach(schema.attributes, setAttributes);\n angular.forEach(schema.relationships, setRelationships);\n\n return true;\n\n function setAttributes(validators, key) {\n object.data.attributes[key] = validatedData.attributes[key];\n }\n\n function setRelationships(schema, key) {\n var relationshipData = validatedData.relationships[key];\n\n if (relationshipData === undefined) {\n if (object.data.relationships[key] === undefined) {\n object.data.relationships[key] = {data: undefined};\n }\n\n return;\n }\n\n object.data.relationships[key] = object.data.relationships[key] || {};\n object.data.relationships[key].links = relationshipData.links;\n\n if (schema.type === 'hasOne') {\n linkOne(object, key, relationshipData.data);\n } else if (schema.type === 'hasMany') {\n if (angular.isArray(relationshipData.data)) {\n if (relationshipData.data.length === 0) {\n object.data.relationships[key].data = [];\n object.unlinkAll(key);\n } else {\n angular.forEach(\n object.relationships[key],\n unlinkOne.bind(undefined, object, key, relationshipData.data)\n );\n angular.forEach(\n relationshipData.data,\n linkOne.bind(undefined, object, key)\n );\n }\n }\n }\n }\n\n function linkOne(object, key, data) {\n var resource;\n\n if (data === null) {\n AngularJsonAPIModelLinkerService.link(object, key, null);\n return;\n }\n\n if (data === undefined) {\n return;\n }\n\n resource = $jsonapi.getResource(data.type);\n\n if (resource === undefined) {\n $log.error('Factory not found', data.type, data);\n return;\n }\n\n var target = resource.cache.get(data.id);\n\n AngularJsonAPIModelLinkerService.link(object, key, target);\n }\n\n function unlinkOne(object, key, relationshipData, target) {\n if (relationshipData.indexOf(target.data.id) > -1) {\n return;\n }\n\n AngularJsonAPIModelLinkerService.unlink(object, key, target);\n }\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n\n function __incrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount += 1;\n object.saving = true;\n }\n\n function __decrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount -= 1;\n object.saving = object.savingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelValidationError', AngularJsonAPIModelValidationErrorWrapper);\n\n function AngularJsonAPIModelValidationErrorWrapper() {\n ValidationError.prototype = Object.create(Error.prototype);\n ValidationError.prototype.constructor = ValidationError;\n ValidationError.prototype.name = 'ValidationError';\n\n return {\n create: ValidationErrorFactory\n };\n\n function ValidationErrorFactory(message, attribute) {\n return new ValidationError(message, attribute);\n }\n\n function ValidationError(message, attribute) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n attribute: attribute\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelSourceError', AngularJsonAPIModelSourceErrorWrapper);\n\n function AngularJsonAPIModelSourceErrorWrapper() {\n SourceError.prototype = Object.create(Error.prototype);\n SourceError.prototype.constructor = SourceError;\n SourceError.prototype.name = 'SourceError';\n\n return {\n create: SourceErrorFactory\n };\n\n function SourceErrorFactory(message, source, code, action) {\n return new SourceError(message, source, code, action);\n }\n\n function SourceError(message, source, code, action) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n source: source,\n code: code,\n action: action\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelErrorsManager', AngularJsonAPIModelErrorsManagerWrapper);\n\n function AngularJsonAPIModelErrorsManagerWrapper() {\n ErrorsManager.prototype.constructor = ErrorsManager;\n ErrorsManager.prototype.concat = concat;\n ErrorsManager.prototype.clear = clear;\n ErrorsManager.prototype.add = add;\n ErrorsManager.prototype.hasErrors = hasErrors;\n\n return {\n create: ErrorsManagerFactory\n };\n\n function ErrorsManagerFactory(name, description, ErrorConstructor, defaultFilter) {\n return new ErrorsManager(name, description, ErrorConstructor, defaultFilter);\n }\n\n function ErrorsManager(name, description, ErrorConstructor, defaultFilter) {\n var _this = this;\n _this.name = name;\n _this.description = description;\n\n _this.ErrorConstructor = ErrorConstructor;\n _this.errors = {};\n _this.defaultFilter = defaultFilter || function() { return true; };\n }\n\n function clear(key) {\n var _this = this;\n\n if (key === undefined) {\n angular.forEach(_this.errors, function(obj, key) {\n _this.errors[key] = [];\n });\n } else {\n _this.errors[key] = [];\n }\n }\n\n function add(key, error) {\n var _this = this;\n\n _this.errors[key] = _this.errors[key] || [];\n _this.errors[key].push(error);\n }\n\n function concat(errors) {\n var _this = this;\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key] = [];\n });\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key].push(error.object);\n });\n\n }\n\n function hasErrors(key) {\n var _this = this;\n\n if (key === undefined) {\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = answer || error.length > 0;\n });\n\n return answer;\n } else {\n return _this.errors[key] !== undefined && _this.errors[key].length > 0;\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('namedFunction', namedFunction);\n\n function namedFunction(name, fn) {\n return new Function('fn',\n 'return function ' + name + '(){ return fn.apply(this,arguments)}'\n )(fn);\n }\n})();\n","// from https://www.sitepen.com/blog/2012/10/19/lazy-property-access/\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('lazyProperty', function(target, propertyName, callback) {\n var result;\n var done;\n Object.defineProperty(target, propertyName, {\n get: function() { // Define the getter\n if (!done) {\n // We cache the result and only compute once.\n done = true;\n result = callback.call(target);\n }\n\n return result;\n },\n\n // Keep it enumerable and configurable, certainly not necessary.\n enumerable: true,\n configurable: true\n });\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('toKebabCase', function(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$q', decorator);\n }\n\n function decorator($delegate) {\n var $q = $delegate;\n\n $q.allSettled = $q.allSettled || allSettled;\n\n function allSettled(promises, resolvedCallback, rejectedCallback) {\n // Implementation of allSettled function from Kris Kowal's Q:\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\n // by Michael Kropat from http://stackoverflow.com/a/27114615/1400432 slightly modified\n\n var wrapped = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function(promise, key) {\n if (!wrapped.hasOwnProperty(key)) {\n wrapped[key] = wrap(promise);\n }\n });\n\n return $q.all(wrapped);\n\n function wrap(promise) {\n return $q.resolve(promise)\n .then(function(value) {\n if (angular.isFunction(resolvedCallback)) {\n resolvedCallback(value);\n }\n\n return { success: true, value: value };\n },\n\n function(reason) {\n if (angular.isFunction(rejectedCallback)) {\n rejectedCallback(reason);\n }\n\n return { success: false, reason: reason };\n });\n }\n }\n\n return $q;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper);\n\n function AngularJsonAPISynchronizerSimpleWrapper(AngularJsonAPISynchronizerPrototype, $q, $log) {\n\n AngularJsonAPISynchronizerSimple.prototype = Object.create(AngularJsonAPISynchronizerPrototype.prototype);\n AngularJsonAPISynchronizerSimple.prototype.constructor = AngularJsonAPISynchronizerSimple;\n\n AngularJsonAPISynchronizerSimple.prototype.synchronize = synchronize;\n\n return {\n create: AngularJsonAPISynchronizerSimpleFactory\n };\n\n function AngularJsonAPISynchronizerSimpleFactory(sources) {\n return new AngularJsonAPISynchronizerSimple(sources);\n }\n\n function AngularJsonAPISynchronizerSimple(sources) {\n var _this = this;\n\n _this.state = {};\n\n AngularJsonAPISynchronizerPrototype.call(_this, sources);\n\n angular.forEach(sources, function(source) {\n source.synchronizer = _this;\n });\n }\n\n function synchronize(config) {\n var _this = this;\n var promises = [];\n var deferred = $q.defer();\n var action = config.action;\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize.call(_this, config);\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beginHooks[action], function(hook) {\n deferred.notify({step: 'begin', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beforeHooks[action], function(hook) {\n deferred.notify({step: 'before', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.synchronizationHooks[action], function(hook) {\n promises.push(hook.call(_this, config));\n });\n });\n\n $q.allSettled(promises, resolvedCallback, rejectedCallback).then(resolved, rejected);\n\n function resolvedCallback(value) {\n deferred.notify({step: 'synchronization', data: value});\n }\n\n function rejectedCallback(reason) {\n deferred.notify({step: 'synchronization', errors: reason});\n }\n\n function resolved(results) {\n _this.state[action] = _this.state[action] || {};\n _this.state[action].success = true;\n\n angular.forEach(results, function(result) {\n if (result.success === false) {\n _this.state[action].success = false;\n }\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.afterHooks[action], function(hook) {\n deferred.notify({step: 'after', errors: hook.call(_this, config, results)});\n });\n });\n\n var data;\n var errors = [];\n\n angular.forEach(results, function(result) {\n if (result.success === true) {\n data = result.value;\n } else {\n errors.push({\n key: action,\n object: result.reason\n });\n }\n });\n\n if (errors.length > 0) {\n deferred.reject({data: data || {}, finish: finish, errors: errors});\n } else {\n deferred.resolve({data: data || {}, finish: finish, errors: errors});\n }\n }\n\n function finish() {\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.finishHooks[action], function(hook) {\n deferred.notify({step: 'finish', errors: hook.call(_this, config)});\n });\n });\n }\n\n function rejected(errors) {\n $log.error('All settled rejected! Something went wrong');\n\n deferred.reject({finish: angular.noop, errors: errors});\n }\n\n return deferred.promise;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper);\n\n function AngularJsonAPISynchronizerPrototypeWrapper($log) {\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize = synchronize;\n\n return AngularJsonAPISynchronizerPrototype;\n\n function AngularJsonAPISynchronizerPrototype(sources) {\n var _this = this;\n\n _this.sources = sources;\n }\n\n function synchronize(config) {\n var _this = this;\n\n $log.debug('Synchro Collection', _this.resource.schema.type, config);\n\n if (config.action === undefined) {\n $log.error('Can\\'t synchronize undefined action', config);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISourcePrototype', AngularJsonAPISourcePrototypeWrapper);\n\n function AngularJsonAPISourcePrototypeWrapper() {\n AngularJsonAPISourcePrototype.prototype.before = beforeSynchro;\n AngularJsonAPISourcePrototype.prototype.after = afterSynchro;\n AngularJsonAPISourcePrototype.prototype.begin = begin;\n AngularJsonAPISourcePrototype.prototype.finish = finish;\n AngularJsonAPISourcePrototype.prototype.synchronization = synchronization;\n\n return AngularJsonAPISourcePrototype;\n\n function AngularJsonAPISourcePrototype(name) {\n var _this = this;\n var allHooks = [\n 'add',\n 'init',\n 'get',\n 'all',\n 'clearCache',\n 'remove',\n 'unlink',\n 'unlinkReflection',\n 'link',\n 'linkReflection',\n 'update',\n 'refresh',\n 'include'\n ];\n\n _this.name = name;\n _this.state = {};\n\n _this.beginHooks = {};\n _this.beforeHooks = {};\n _this.synchronizationHooks = {};\n _this.afterHooks = {};\n _this.finishHooks = {};\n\n _this.options = {};\n\n angular.forEach(allHooks, function(hookName) {\n _this.beginHooks[hookName] = [];\n _this.beforeHooks[hookName] = [];\n _this.synchronizationHooks[hookName] = [];\n _this.afterHooks[hookName] = [];\n _this.finishHooks[hookName] = [];\n _this.state[hookName] = {\n loading: false,\n success: true\n };\n });\n }\n\n function begin(action, callback) {\n var _this = this;\n\n _this.beginHooks[action].push(callback);\n }\n\n function finish(action, callback) {\n var _this = this;\n\n _this.finishHooks[action].push(callback);\n }\n\n function beforeSynchro(action, callback) {\n var _this = this;\n\n _this.beforeHooks[action].push(callback);\n }\n\n function afterSynchro(action, callback) {\n var _this = this;\n\n _this.afterHooks[action].push(callback);\n }\n\n function synchronization(action, callback) {\n var _this = this;\n\n _this.synchronizationHooks[action].push(callback);\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper);\n\n function AngularJsonAPISchemaWrapper(\n $log,\n pluralize,\n uuid4,\n AngularJsonAPISchemaLink\n ) {\n\n return {\n create: AngularJsonAPISchemaFactory\n };\n\n function AngularJsonAPISchemaFactory(schema) {\n return new AngularJsonAPISchema(schema);\n }\n\n function AngularJsonAPISchema(schema) {\n var _this = this;\n var include = schema.include || {};\n schema.include = include;\n include.get = schema.include.get || [];\n include.all = schema.include.all || [];\n\n _this.params = {\n get: {},\n all: {}\n };\n\n if (schema.id === 'uuid4') {\n schema.id = uuid4;\n } else if (schema.id === 'int') {\n schema.id = {\n generate: angular.noop,\n validate: angular.isNumber\n };\n } else if (angular.isObject(schema.id)) {\n if (!angular.isFunction(schema.id.generate)) {\n schema.id.generate = angular.noop;\n }\n } else {\n schema.id = {\n generate: angular.noop,\n validate: angular.identity.bind(null, true)\n };\n }\n\n angular.forEach(schema.relationships, function(linkSchema, linkName) {\n var linkSchemaObj = AngularJsonAPISchemaLink.create(linkSchema, linkName, schema.type);\n schema.relationships[linkName] = linkSchemaObj;\n if (linkSchemaObj.included === true) {\n include.get.push(linkName);\n if (linkSchemaObj.type === 'hasOne') {\n include.all.push(linkName);\n }\n }\n });\n\n angular.extend(_this, schema);\n\n if (include.get.length > 0) {\n _this.params.get.include = include.get;\n }\n\n if (include.all.length > 0) {\n _this.params.all.include = include.all;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink);\n\n function AngularJsonAPILinkSchrapperLink($log, pluralize) {\n\n return {\n create: AngularJsonAPISchemaLinkFactory\n };\n\n function AngularJsonAPISchemaLinkFactory(linkSchema, linkName, type) {\n return new AngularJsonAPISchemaLink(linkSchema, linkName, type);\n }\n\n function AngularJsonAPISchemaLink(linkSchema, linkName, type) {\n var _this = this;\n\n if (angular.isString(linkSchema)) {\n _this.model = pluralize.plural(linkName);\n _this.type = linkSchema;\n _this.polymorphic = false;\n _this.reflection = type;\n } else {\n if (linkSchema.type === undefined) {\n $log.error('Schema of link without a type: ', linkSchema, linkName);\n }\n\n if (linkSchema.type !== 'hasMany' && linkSchema.type !== 'hasOne') {\n $log.error('Schema of link with wrong type: ', linkSchema.type, 'available: hasOne, hasMany');\n }\n\n _this.model = linkSchema.model || pluralize.plural(linkName);\n _this.type = linkSchema.type;\n _this.polymorphic = linkSchema.polymorphic || false;\n\n if (linkSchema.reflection === undefined) {\n _this.reflection = _this.type === 'hasMany' ? pluralize.singular(type) : type;\n } else {\n _this.reflection = linkSchema.reflection;\n }\n\n _this.included = linkSchema.included || false;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper);\n\n function AngularJsonAPIResourceWrapper(\n AngularJsonAPIModel,\n AngularJsonAPISchema,\n AngularJsonAPIResourceCache,\n AngularJsonAPICollection,\n $rootScope,\n $log,\n $q\n ) {\n AngularJsonAPIResource.prototype.get = get;\n AngularJsonAPIResource.prototype.all = all;\n AngularJsonAPIResource.prototype.remove = remove;\n AngularJsonAPIResource.prototype.initialize = initialize;\n\n AngularJsonAPIResource.prototype.clearCache = clearCache;\n\n return {\n create: AngularJsonAPIResourceFactory\n };\n\n function AngularJsonAPIResourceFactory(schema, synchronizer) {\n return new AngularJsonAPIResource(schema, synchronizer);\n }\n\n /**\n * AngularJsonAPIResource constructor\n * @param {json} schema Schema object\n * @param {AngularJsonAPISynchronizer} synchronizer Synchronizer for the resource\n */\n function AngularJsonAPIResource(schema, synchronizer) {\n var _this = this;\n var config = {\n action: 'init'\n };\n\n _this.schema = AngularJsonAPISchema.create(schema);\n _this.cache = AngularJsonAPIResourceCache.create(_this);\n\n _this.synchronizer = synchronizer;\n _this.synchronizer.resource = _this;\n\n _this.modelFactory = AngularJsonAPIModel.modelFactory(\n _this.schema,\n _this\n );\n\n _this.initialized = false;\n _this.type = _this.schema.type;\n\n synchronizer.resource = _this;\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'resolved', response);\n _this.cache.fromJson(response.data);\n _this.initialized = true;\n\n response.finish();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'rejected', response);\n response.finish();\n _this.initialized = true;\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'notify', response);\n }\n }\n\n /**\n * Get request\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id, synchronized\n */\n function get(id, params) {\n var _this = this;\n\n if (!_this.schema.id.validate(id)) {\n return $q.reject({errors: [{status: 0, statusText: 'Invalid id'}]});\n }\n\n var object = _this.cache.get(id);\n\n object.promise = object.refresh(params);\n\n return object;\n }\n\n /**\n * All request\n * @param {object} params Object associated with params (for filters/pagination etc.)\n * @return {AngularJsonAPICollection} Collection of AngularJsonAPIModel, synchronized\n */\n function all(params) {\n var _this = this;\n params = angular.extend({}, _this.schema.params.all, params);\n\n var collection = AngularJsonAPICollection.create(\n _this,\n params\n );\n\n collection.promise = collection.fetch();\n\n return collection;\n }\n\n /**\n * Remove request\n * @param {uuid} id\n * @return {promise} Promise associated with the synchronization, in case of\n * fail object is reverted to previous state\n */\n function remove(id) {\n var _this = this;\n var object = _this.cache.remove(id);\n\n return object.remove();\n }\n\n /**\n * Initialize new AngularJsonAPIModel\n * @return {AngularJsonAPIModel} New model\n */\n function initialize() {\n var _this = this;\n var relationships = {};\n\n angular.forEach(_this.schema.relationships, function(relationshipSchema, relationshipName) {\n if (relationshipSchema.type === 'hasOne') {\n relationships[relationshipName] = {\n data: null\n };\n } else if (relationshipSchema.type === 'hasMany') {\n relationships[relationshipName] = {\n data: []\n };\n }\n });\n\n var data = {\n type: _this.type,\n id: _this.schema.id.generate(),\n attributes: {},\n relationships: relationships\n };\n\n var config = {\n new: true,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: false\n };\n\n var object = _this.modelFactory(data, config);\n\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:initialize', 'resolved', object);\n\n return object;\n }\n\n /**\n * Clears localy saved data\n * @return {promise} Promise associated with the synchronization resolves to nothing\n */\n function clearCache() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: 'clearCache'\n };\n\n _this.cache.clear();\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n return deferred;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.resolve(response);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.reject(response);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'notify', response);\n\n deferred.notify(response);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModel', AngularJsonAPIModel);\n\n function AngularJsonAPIModel(\n AngularJsonAPIAbstractModel,\n AngularJsonAPISchema,\n namedFunction,\n pluralize,\n $log\n ) {\n\n return {\n modelFactory: createModelFactory\n };\n\n function createModelFactory(schemaObj, resource) {\n var constructorName = pluralize.plural(schemaObj.type, 1);\n\n var Model = namedFunction(constructorName, function(data, config, updatedAt) {\n var _this = this;\n\n if (data.type !== _this.schema.type) {\n $log.error('Data type other then declared in schema: ', data.type, ' instead of ', _this.schema.type);\n }\n\n AngularJsonAPIAbstractModel.call(_this, data, config, updatedAt);\n\n _this.form.parent = _this;\n });\n\n Model.prototype = Object.create(AngularJsonAPIAbstractModel.prototype);\n Model.prototype.constructor = Model;\n\n Model.prototype.schema = schemaObj;\n Model.prototype.resource = resource;\n Model.prototype.synchronize = resource.synchronizer.synchronize.bind(resource.synchronizer);\n\n angular.forEach(schemaObj.functions, function(metaFunction, metaFunctionName) {\n Model.prototype[metaFunctionName] = function() {\n return metaFunction.apply(this, arguments);\n };\n });\n\n return modelFactory;\n\n function modelFactory(data, updatedAt, isNew) {\n return new Model(data, updatedAt, isNew);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper);\n\n function AngularJsonAPICollectionWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelErrorsManager,\n $rootScope,\n $injector,\n $q\n ) {\n\n AngularJsonAPICollection.prototype.fetch = fetch;\n AngularJsonAPICollection.prototype.refresh = fetch;\n AngularJsonAPICollection.prototype.get = get;\n AngularJsonAPICollection.prototype.hasErrors = hasErrors;\n\n return {\n create: AngularJsonAPICollectionFactory\n };\n\n function AngularJsonAPICollectionFactory(resource, params) {\n return new AngularJsonAPICollection(resource, params);\n }\n\n /**\n * Constructor\n * @param {AngularJsonAPIResource} resource Factory associated with the collection\n * @param {object} params Params associated with this resource (such as filters)\n */\n function AngularJsonAPICollection(resource, params) {\n var _this = this;\n\n _this.resource = resource;\n _this.type = resource.schema.type;\n _this.params = params || {};\n\n _this.errors = {\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.data = _this.resource.cache.index(_this.params);\n\n _this.loading = false;\n _this.loadingCount = 0;\n _this.synchronized = false;\n _this.pristine = _this.data === undefined;\n\n _this.promise = $q.resolve(_this);\n\n var onObjectRemove = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:remove', remove);\n var onFactoryClear = $rootScope.$on('angularJsonAPI:' + _this.type + ':resource:clearCache', clear);\n var onObjectAdd = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:add', add);\n\n $rootScope.$on('$destroy', clearWatchers);\n\n function remove(event, status, object) {\n var index;\n\n if (status === 'resolved' && _this.data !== undefined) {\n index = _this.data.indexOf(object);\n if (index > -1) {\n _this.data.splice(index, 1);\n _this.resource.cache.setIndexIds(_this.data);\n }\n }\n }\n\n function clear() {\n _this.data = undefined;\n _this.pristine = true;\n }\n\n function add(event, status, object) {\n if (status === 'resolved') {\n _this.data = _this.data || [];\n _this.data.push(object);\n }\n }\n\n function clearWatchers() {\n onObjectRemove();\n onFactoryClear();\n onObjectAdd();\n }\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /**\n * Shortcut to this.resource.get\n * @param {string} id Id of object]\n * @return {AngularJsonAPIModel} Model with id\n */\n function get(id, params) {\n var _this = this;\n\n return _this.resource.get(id, params);\n }\n\n /**\n * Synchronizes collection with the server\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function fetch() {\n var _this = this;\n var deferred = $q.defer();\n var $jsonapi = $injector.get('$jsonapi');\n var config = {\n action: 'all',\n params: _this.params\n };\n\n __incrementLoadingCounter(_this);\n\n angular.forEach(_this.data, __incrementLoadingCounter);\n\n _this.resource.synchronizer.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n\n _this.data = results.data;\n _this.links = response.data.links;\n\n _this.updatedAt = Date.now();\n _this.synchronized = true;\n _this.pristine = false;\n\n _this.resource.cache.setIndexIds(_this.data);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'rejected', _this, response);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n }\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .provider('$jsonapi', jsonapiProvider);\n\n function jsonapiProvider(validateJS) {\n var memory = {};\n var names = [];\n this.$get = jsonapiFactory;\n\n function jsonapiFactory(\n $log,\n AngularJsonAPIResource,\n AngularJsonAPISynchronizerSimple\n ) {\n return {\n addResource: addResource,\n getResource: getResource,\n clearCache: clearCache,\n allResources: allResources,\n listResources: listResources,\n addValidator: addValidator,\n synchronizerSimple: AngularJsonAPISynchronizerSimple,\n\n __proccesResults: __proccesResults\n };\n\n function addResource(schema, synchronizer) {\n var resource = AngularJsonAPIResource.create(schema, synchronizer);\n\n memory[schema.type] = resource;\n names.push(schema.type);\n }\n\n function getResource(type) {\n return memory[type];\n }\n\n function allResources() {\n return memory;\n }\n\n function listResources() {\n return names;\n }\n\n function clearCache() {\n angular.forEach(memory, function(resource) {\n resource.clearCache();\n });\n }\n\n function addValidator(name, validator) {\n if (!angular.isString(name)) {\n $log.error('Validator name is not a string', name);\n return;\n } else if (validateJS.validators[name] === undefined) {\n $log.warn('Redeclaring validator', name);\n }\n\n validateJS.validators[name] = validator;\n }\n\n function __proccesResults(results) {\n var objects = {\n data: [],\n included: []\n };\n\n if (results === undefined) {\n $log.error('Can\\'t proccess results:', results);\n return;\n }\n\n var config = {\n new: false,\n synchronized: true,\n stable: true,\n pristine: false,\n initialization: false\n };\n\n angular.forEach(results.included, function(data) {\n objects.included.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n\n if (angular.isArray(results.data)) {\n angular.forEach(results.data, function(data) {\n objects.data.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n } else if (results.data !== undefined) {\n objects.data.push(getResource(results.data.type).cache.addOrUpdate(results.data, config));\n }\n\n return objects;\n }\n }\n }\n\n})();\n\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(function($logProvider) {\n $logProvider.debugEnabled(false);\n })\n .run(function(validateJS, $q) {\n validateJS.Promise = $q;\n });\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["sources/rest/source-rest.module.js","sources/rest/source-rest.factory.js","sources/rest/source-rest.decorator.js","sources/parse/source-parse.module.js","sources/parse/source-parse.factory.js","sources/parse/source-parse.decorator.js","sources/local/source-local.module.js","sources/local/source-local.factory.js","sources/local/source-local.decorator.js","jsonapi.module.js","resource/resource-cache/resource-cache.factory.js","model/model-linker/model-linker.js","model/model-form/model-form.factory.js","model/abstract-model/abstract-model.js","errors/validation-error/validation-error.factory.js","errors/source-error/source-error.factory.js","errors/errors-manager/errors-manager.factory.js","utils/named-function.js","utils/lazy-property.js","utils/kebab-case.js","utils/all-settled.js","synchronizers/synchronizer-simple.factory.js","synchronizers/synchronizer-prototype.js","sources/source-prototype.js","schema/schema.factory.js","schema/schema-link.factory.js","resource/resource.factory.js","model/model-factory.factory.js","collection/collection.factory.js","jsonapi.provider.js","jsonapi.config.js"],"names":[],"mappings":"AAAA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO,wBAAwB,CAAC;;;AAG1C;ACNA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,4BAA4B;;EAErC,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA,yBAAyB,YAAY,OAAO,OAAO,8BAA8B;IACjF,yBAAyB,UAAU,cAAc;;IAEjD,OAAO;MACL,QAAQ;MACR,cAAc;MACd,cAAc;;;IAGhB,SAAS,gCAAgC,MAAM,KAAK;MAClD,OAAO,IAAI,yBAAyB,MAAM;;;IAG5C,SAAS,yBAAyB,MAAM,KAAK;MAC3C,IAAI,QAAQ;MACZ,IAAI,UAAU;QACZ,UAAU;QACV,gBAAgB;;;MAGlB,8BAA8B,MAAM,OAAO;;MAE3C,MAAM,gBAAgB,UAAU;MAChC,MAAM,gBAAgB,UAAU;MAChC,MAAM,gBAAgB,QAAQ;MAC9B,MAAM,gBAAgB,UAAU;MAChC,MAAM,gBAAgB,OAAO;MAC7B,MAAM,gBAAgB,OAAO;MAC7B,MAAM,gBAAgB,OAAO;MAC7B,MAAM,gBAAgB,WAAW;;MAEjC,SAAS,IAAI,QAAQ;QACnB,OAAO,MAAM;UACX,QAAQ;UACR,SAAS;UACT,KAAK;UACL,QAAQ,aAAa,OAAO;WAC3B,KAAK,aAAa,WAAW,KAAK,MAAM;;;MAG7C,SAAS,IAAI,QAAQ;QACnB,OAAO,MAAM;UACX,QAAQ;UACR,SAAS;UACT,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK;UACpC,QAAQ,aAAa,OAAO;WAC3B,KAAK,aAAa,WAAW,KAAK,MAAM;;;MAG7C,SAAS,OAAO,QAAQ;QACtB,OAAO,MAAM;UACX,QAAQ;UACR,SAAS;UACT,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK;WACnC,KAAK,aAAa,WAAW,KAAK,MAAM;;;MAG7C,SAAS,OAAO,QAAQ;QACtB,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,OAAO,OAAO,OAAO,cAAc,OAAO;;QAEvD,IAAI,OAAO,OAAO,YAAY,MAAM;UAClC,SAAS,OAAO,+BAA+B,OAAO,2BAA2B,OAAO,GAAG;eACtF,IAAI,OAAO,WAAW,aAAa,OAAO,OAAO,KAAK,OAAO,WAAW;UAC7E,SAAS,OAAO,+BAA+B,OAAO,qDAAqD,OAAO,GAAG;eAChH,IAAI,OAAO,SAAS,UAAU;UACnC,MAAM;YACJ,QAAQ;YACR,SAAS;YACT,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB,OAAO;aACnE,KAAK,aAAa,WAAW,KAAK,MAAM,QAAQ,KAAK,SAAS,SAAS,SAAS;eAC9E,IAAI,OAAO,SAAS,WAAW;UACpC,IAAI,OAAO,WAAW,WAAW;YAC/B,MAAM;cACJ,QAAQ;cACR,SAAS;cACT,MAAM,CAAC,MAAM;cACb,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB,OAAO;eACnE,KAAK,aAAa,WAAW,KAAK,MAAM,WAAW,KAAK,SAAS,SAAS,SAAS;iBACjF;YACL,MAAM;cACJ,QAAQ;cACR,SAAS;cACT,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB,OAAO,MAAM,MAAM,OAAO,OAAO,KAAK;eAClG,KAAK,aAAa,WAAW,KAAK,MAAM,WAAW,KAAK,SAAS,SAAS,SAAS;;;;QAI1F,OAAO,SAAS;;;MAGlB,SAAS,KAAK,QAAQ;QACpB,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,OAAO,OAAO,OAAO,cAAc,OAAO;;QAEvD,IAAI,OAAO,OAAO,YAAY,MAAM;UAClC,SAAS,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,YAAY;eAC7C,IAAI,OAAO,WAAW,aAAa,OAAO,OAAO,KAAK,OAAO,WAAW;UAC7E,SAAS,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,YAAY;eAC7C,IAAI,OAAO,SAAS,UAAU;UACnC,MAAM;YACJ,QAAQ;YACR,SAAS;YACT,MAAM,CAAC,MAAM,iCAAiC,WAAW,OAAO;YAChE,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB,OAAO;aACnE,KAAK,aAAa,WAAW,KAAK,MAAM,SAAS,KAAK,SAAS,SAAS,SAAS;eAC/E,IAAI,OAAO,SAAS,WAAW;UACpC,MAAM;YACJ,QAAQ;YACR,SAAS;YACT,MAAM,CAAC,MAAM,CAAC,iCAAiC,WAAW,OAAO;YACjE,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB,OAAO;aACnE,KAAK,aAAa,WAAW,KAAK,MAAM,SAAS,KAAK,SAAS,SAAS,SAAS;;;QAGtF,OAAO,SAAS;;;MAGlB,SAAS,OAAO,QAAQ;QACtB,OAAO,MAAM;UACX,QAAQ;UACR,SAAS;UACT,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK;UACpC,MAAM,OAAO,OAAO,KAAK;WACxB,KAAK,aAAa,WAAW,KAAK,MAAM;;;MAG7C,SAAS,IAAI,QAAQ;QACnB,OAAO,MAAM;UACX,QAAQ;UACR,SAAS;UACT,KAAK;UACL,MAAM,OAAO,OAAO,KAAK;WACxB,KAAK,aAAa,WAAW,KAAK,MAAM;;;MAG7C,SAAS,YAAY,UAAU;QAC7B,OAAO,GAAG,QAAQ,SAAS;;;MAG7B,SAAS,WAAW,QAAQ,UAAU;QACpC,IAAI,WAAW,GAAG;;QAElB,IAAI,SAAS,WAAW,GAAG;UACzB,MAAM;YACJ,QAAQ;YACR,KAAK;aACJ,KAAK,qBAAqB;eACxB;UACL,SAAS,OAAO,+BAA+B,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ;;;QAGrG,OAAO,SAAS;;QAEhB,SAAS,oBAAoB,UAAU;UACrC,SAAS,OAAO,+BAA+B,OAAO,qBAAqB,OAAO,SAAS,QAAQ;;;QAGrG,SAAS,qBAAqB;UAC5B,SAAS,OAAO,+BAA+B,OAAO,0BAA0B,OAAO,SAAS,QAAQ;;;;;IAK9G,SAAS,aAAa,QAAQ;MAC5B,IAAI,gBAAgB;;MAEpB,IAAI,WAAW,WAAW;QACxB,OAAO;;;MAGT,QAAQ,QAAQ,QAAQ,SAAS,YAAY,UAAU;QACrD,IAAI,QAAQ,QAAQ,aAAa;UAC/B,cAAc,YAAY,YAAY;eACjC,IAAI,QAAQ,SAAS,aAAa;UACvC,QAAQ,QAAQ,YAAY,SAAS,iBAAiB,eAAe;YACnE,cAAc,WAAW,MAAM,gBAAgB,OAAO,YAAY;;eAE/D;UACL,cAAc,YAAY;;;;MAI9B,OAAO;;MAEP,SAAS,YAAY,UAAU;QAC7B,IAAI,QAAQ,QAAQ,WAAW;UAC7B,OAAO,SAAS,KAAK;eAChB;UACL,OAAO;;;;;IAKb,SAAS,aAAa,QAAQ;MAC5B,IAAI,gBAAgB;;MAEpB,QAAQ,QAAQ,QAAQ,SAAS,OAAO,KAAK;QAC3C,IAAI,iBAAiB,IAAI,QAAQ;QACjC,QAAQ,MAAM,MAAM;;QAEpB,IAAI,iBAAiB,CAAC,GAAG;UACvB,IAAI,YAAY,IAAI,OAAO,GAAG;UAC9B,IAAI,mBAAmB,IAAI,OAAO,iBAAiB,GAAG,IAAI,QAAQ,OAAO,iBAAiB;;UAE1F,cAAc,aAAa,cAAc,cAAc;UACvD,cAAc,WAAW,oBAAoB;eACxC;UACL,cAAc,OAAO;;;;MAIzB,OAAO;;;;;AAIb;ACvOA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,OAAO;;EAER,SAAS,QAAQ,UAAU;IACzB,SAAS,UAAU,YAAY;;;;EAGjC,SAAS,UAAU,WAAW,0BAA0B;IACtD,IAAI,WAAW;;IAEf,SAAS,aAAa;;IAEtB,OAAO;;;;AAGX;AClBA,CAAC,WAAW;EACV;;;EAGA,QAAQ,OAAO,yBAAyB,CAAC;KACtC,SAAS,SAAS;;AAEvB;ACPA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,6BAA6B;;EAEtC,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA,0BAA0B,YAAY,OAAO,OAAO,8BAA8B;IAClF,0BAA0B,UAAU,cAAc;IAClD,0BAA0B,UAAU,aAAa;;IAEjD,OAAO;MACL,QAAQ;;;IAGV,SAAS,iCAAiC,MAAM,OAAO;MACrD,OAAO,IAAI,0BAA0B,MAAM;;;IAG7C,SAAS,0BAA0B,MAAM,OAAO;MAC9C,IAAI,QAAQ;;MAEZ,MAAM,cAAc,MAAM,OAAO,OAAO;MACxC,MAAM,OAAO,UAAU,OAAO,OAAO,GAAG,gBAAgB,UAAU,OAAO,MAAM;;MAE/E,8BAA8B,MAAM,OAAO;;MAE3C,MAAM,gBAAgB,UAAU;MAChC,MAAM,gBAAgB,UAAU;MAChC,MAAM,gBAAgB,OAAO;MAC7B,MAAM,gBAAgB,OAAO;MAC7B,MAAM,gBAAgB,OAAO;MAC7B,MAAM,gBAAgB,WAAW;;MAEjC,SAAS,IAAI,QAAQ;QACnB,IAAI,QAAQ,IAAI,MAAM,MAAM,MAAM;;QAElC,IAAI,OAAO,OAAO,UAAU,WAAW;UACrC,MAAM,MAAM,OAAO,OAAO;;;QAG5B,QAAQ,QAAQ,OAAO,OAAO,QAAQ,SAAS,QAAQ;UACrD,MAAM,QAAQ,OAAO,KAAK,OAAO;;;QAGnC,OAAO,MAAM,OAAO,KAAK,cAAc,YAAY,KAAK,MAAM;;;MAGhE,SAAS,IAAI,QAAQ;QACnB,IAAI,QAAQ,IAAI,MAAM,MAAM,MAAM;QAClC,OAAO,MAAM,IAAI,OAAO,OAAO,KAAK,IAAI,KAAK,cAAc,YAAY,KAAK,MAAM;;;MAGpF,SAAS,OAAO,QAAQ;QACtB,IAAI,SAAS,IAAI,MAAM;QACvB,OAAO,IAAI,MAAM,OAAO,OAAO,KAAK;QACpC,OAAO,OAAO,UAAU,KAAK,cAAc,YAAY,KAAK,MAAM;;;MAGpE,SAAS,OAAO,QAAQ;QACtB,IAAI,SAAS,cAAc,OAAO;QAClC,OAAO,OAAO,KAAK,MAAM,KAAK,cAAc,YAAY,KAAK,MAAM;;;MAGrE,SAAS,cAAc,QAAQ;QAC7B,IAAI,cAAc,IAAI,MAAM;QAC5B,QAAQ,QAAQ,OAAO,KAAK,KAAK,YAAY,SAAS,WAAW,KAAK;UACpE,YAAY,IAAI,KAAK;;;QAGvB,QAAQ,QAAQ,OAAO,OAAO,eAAe,SAAS,cAAc,KAAK;UACvE,IAAI,aAAa,SAAS;eACrB,OAAO,KAAK,KAAK,cAAc,KAAK,SAAS;eAC7C,OAAO,KAAK,KAAK,cAAc,KAAK,SAAS;YAChD;YACA,IAAI,QAAQ,UAAU,KAAK,GAAG,OAAO,GAAG,gBAAgB,UAAU,KAAK,GAAG,MAAM;YAChF,IAAI,eAAe,KAAK,MAAM,OAAO,OAAO;YAC5C,aAAa,IAAI,MAAM,OAAO,KAAK,KAAK,cAAc,KAAK,KAAK;YAChE,YAAY,IAAI,KAAK;;;;QAIzB,OAAO;;;MAGT,SAAS,gBAAgB,QAAQ;QAC/B,IAAI,gBAAgB,MAAM,aAAa,SAAS,OAAO;QACvD,OAAO,OAAO,MAAM;QACpB,OAAO,gBAAgB,OAAO,iBAAiB;QAC/C,QAAQ,QAAQ,eAAe,SAAS,cAAc,KAAK;UACzD,IAAI,OAAO,WAAW,QAAQ,aAAa,SAAS,UAAU;YAC5D,OAAO,cAAc,OAAO;cAC1B,MAAM;gBACJ,MAAM,aAAa;gBACnB,IAAI,OAAO,WAAW,KAAK;;;;;;QAMnC,OAAO;;;MAGT,SAAS,aAAa,UAAU;QAC9B,IAAI,QAAQ,QAAQ,WAAW;UAC7B,QAAQ,QAAQ,UAAU,SAAS,MAAM,KAAK;YAC5C,SAAS,OAAO,gBAAgB;;eAE7B,IAAI,QAAQ,SAAS,WAAW;UACrC,WAAW,gBAAgB;;;QAG7B,OAAO,GAAG,QAAQ;UAChB,MAAM;;;;MAIV,SAAS,YAAY,QAAQ,UAAU;QACrC,KAAK,MAAM,mBAAmB,QAAQ;QACtC,OAAO,GAAG,OAAO;;;;IAIrB,SAAS,WAAW,OAAO,OAAO;MAChC,MAAM,WAAW,OAAO;;;;;AAI9B;ACzIA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,OAAO;;EAER,SAAS,QAAQ,UAAU;IACzB,SAAS,UAAU,YAAY;;;;EAGjC,SAAS,UAAU,WAAW,2BAA2B;IACvD,IAAI,WAAW;;IAEf,SAAS,cAAc;;IAEvB,OAAO;;;;AAGX;AClBA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO,yBAAyB,CAAC;;;AAG3C;ACNA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,6BAA6B;;EAEtC,SAAS;IACP;IACA;IACA;IACA;IACA,IAAI,OAAO;MACT,KAAK;MACL,KAAK;MACL,OAAO;MACP,MAAM;;;IAGR,0BAA0B,YAAY,OAAO,OAAO,8BAA8B;IAClF,0BAA0B,UAAU,cAAc;;IAElD,OAAO;MACL,QAAQ;MACR,MAAM;;;IAGR,SAAS,iCAAiC,MAAM,QAAQ;MACtD,OAAO,IAAI,0BAA0B,MAAM;;;IAG7C,SAAS,0BAA0B,MAAM,QAAQ;MAC/C,IAAI,QAAQ;;MAEZ,SAAS,UAAU;;MAEnB,MAAM,kBAAkB;;MAExB,8BAA8B,MAAM,OAAO;;MAE3C,MAAM,gBAAgB,QAAQ;;MAE9B,MAAM,MAAM,cAAc;;MAE1B,MAAM,OAAO,QAAQ;MACrB,MAAM,OAAO,cAAc;MAC3B,MAAM,OAAO,UAAU;MACvB,MAAM,OAAO,WAAW;MACxB,MAAM,OAAO,UAAU;MACvB,MAAM,OAAO,oBAAoB;MACjC,MAAM,OAAO,QAAQ;MACrB,MAAM,OAAO,kBAAkB;MAC/B,MAAM,OAAO,UAAU;MACvB,MAAM,OAAO,OAAO;MACpB,MAAM,OAAO,OAAO;MACpB,MAAM,OAAO,OAAO;MACpB,MAAM,OAAO,WAAW;;MAExB,SAAS,OAAO;QACd,IAAI,OAAO,MAAM,aAAa,SAAS,OAAO;QAC9C,OAAO,GAAG,QAAQ,QAAQ,aAAa,QAAQ,SAAS,MAAM;;;MAGhE,SAAS,QAAQ;QACf,IAAI,OAAO,MAAM,aAAa,SAAS,OAAO;QAC9C,IAAI,MAAM,SAAS,MAAM;;QAEzB,KAAK,OAAO,KAAK,KAAK;QACtB,OAAO,KAAK,KAAK;QACjB,KAAK,MAAM,aAAa,KAAK;QAC7B,KAAK,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ;;QAEnD,QAAQ,aAAa,WAAW;;;MAGlC,SAAS,gBAAgB;QACvB,IAAI,OAAO,MAAM,aAAa,SAAS,OAAO;QAC9C,IAAI,QAAQ,MAAM,aAAa,SAAS;QACxC,IAAI,OAAO,MAAM;QACjB,IAAI,MAAM,SAAS,MAAM;;QAEzB,KAAK,KAAK,OAAO,KAAK,KAAK,SAAS,YAAY,IAAI,KAAK,KAAK;QAC9D,KAAK,OAAO,KAAK,SAAS,KAAK,KAAK;QACpC,KAAK,KAAK,OAAO,KAAK;QACtB,KAAK,MAAM,aAAa,KAAK;QAC7B,KAAK,WAAW,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ;;QAEnD,QAAQ,aAAa,QAAQ,KAAK;;;MAGpC,SAAS,aAAa,QAAQ;QAC5B,OAAO,OAAO,KAAK,QAAQ,OAAO,SAAS,GAAG,GAAG;UAC/C,OAAO,OAAO,KAAK,OAAO,KAAK,IAAI;WAClC,OAAO,KAAK,QAAQ;;;;;;AAK/B;ACjGA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,OAAO;;EAER,SAAS,QAAQ,UAAU;IACzB,SAAS,UAAU,YAAY;;;;EAGjC,SAAS,UAAU,WAAW,2BAA2B;IACvD,IAAI,WAAW;;IAEf,SAAS,cAAc;;IAEvB,OAAO;;;;AAGX;AClBA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO,mBAAmB,CAAC;;GAElC,SAAS,aAAa;GACtB,SAAS,cAAc;;AAE1B;ACRA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,+BAA+B;;EAExC,SAAS;IACP;IACA;IACA;;IAEA,4BAA4B,UAAU,MAAM;IAC5C,4BAA4B,UAAU,QAAQ;IAC9C,4BAA4B,UAAU,cAAc;IACpD,4BAA4B,UAAU,cAAc;;IAEpD,4BAA4B,UAAU,WAAW;IACjD,4BAA4B,UAAU,SAAS;IAC/C,4BAA4B,UAAU,QAAQ;;IAE9C,4BAA4B,UAAU,SAAS;IAC/C,4BAA4B,UAAU,eAAe;IACrD,4BAA4B,UAAU,eAAe;;IAErD,OAAO;MACL,QAAQ;;;IAGV,SAAS,mCAAmC,UAAU;MACpD,OAAO,IAAI,4BAA4B;;;;;;IAMzC,SAAS,4BAA4B,UAAU;MAC7C,IAAI,QAAQ;;MAEZ,MAAM,WAAW;MACjB,MAAM,OAAO;MACb,MAAM,UAAU;MAChB,MAAM,OAAO;;MAEb,MAAM,WAAW;;;;;;;;IAQnB,SAAS,YAAY,eAAe,QAAQ,WAAW;MACrD,IAAI,QAAQ;MACZ,IAAI,KAAK,cAAc;;MAEvB,IAAI,OAAO,WAAW;QACpB,KAAK,MAAM,+BAA+B;QAC1C;;;MAGF,IAAI,MAAM,KAAK,QAAQ,WAAW;QAChC,MAAM,KAAK,MAAM,MAAM,SAAS,aAAa,eAAe,QAAQ;QACpE,MAAM,QAAQ;aACT;QACL,MAAM,KAAK,IAAI,OAAO,eAAe,CAAC,OAAO,KAAK,OAAO;;;MAG3D,OAAO,MAAM,KAAK;;;;;;;;;IASpB,SAAS,SAAS,MAAM;MACtB,IAAI,QAAQ;MACZ,IAAI,aAAa,QAAQ,SAAS;;MAElC,IAAI,SAAS;QACX,KAAK;QACL,cAAc;QACd,QAAQ;QACR,UAAU;QACV,gBAAgB;;;MAGlB,IAAI,QAAQ,SAAS,eAAe,WAAW,SAAS,WAAW;QACjE,MAAM,YAAY,WAAW;QAC7B,MAAM,WAAW,WAAW;;QAE5B,QAAQ,QAAQ,WAAW,MAAM,SAAS,YAAY;UACpD,IAAI,OAAO,WAAW;UACtB,MAAM,YAAY,MAAM,QAAQ,WAAW;;;;;;;;;IASjD,SAAS,SAAS;MAChB,IAAI,QAAQ;MACZ,IAAI,OAAO;QACT,MAAM;QACN,WAAW,MAAM;QACjB,UAAU,MAAM;;;MAGlB,QAAQ,QAAQ,MAAM,MAAM,SAAS,QAAQ;QAC3C,IAAI,OAAO,gBAAgB,OAAO;UAChC,KAAK,KAAK,KAAK,OAAO;;;;MAI1B,OAAO,QAAQ,OAAO;;;;;;;IAOxB,SAAS,QAAQ;MACf,IAAI,QAAQ;;MAEZ,MAAM,WAAW;MACjB,MAAM,OAAO;MACb,MAAM,UAAU;;;;;;;;IAQlB,SAAS,IAAI,IAAI;MACf,IAAI,QAAQ;;MAEZ,IAAI,OAAO;QACT,IAAI;QACJ,MAAM,MAAM,SAAS,OAAO;;;MAG9B,IAAI,SAAS;QACX,KAAK;QACL,cAAc;QACd,QAAQ;QACR,UAAU;;;MAGZ,IAAI,MAAM,KAAK,QAAQ,WAAW;QAChC,MAAM,KAAK,MAAM,MAAM,SAAS,aAAa,MAAM;;;MAGrD,OAAO,MAAM,KAAK;;;;;;;;IAQpB,SAAS,MAAM,QAAQ;MACrB,IAAI,QAAQ;MACZ,SAAS,UAAU;;MAEnB,IAAI,MAAM,aAAa,WAAW;QAChC,OAAO,MAAM;;;MAGf,OAAO,MAAM,SAAS,IAAI,MAAM,IAAI,KAAK,QAAQ,OAAO;;MAExD,SAAS,OAAO,UAAU;QACxB,IAAI,gBAAgB,OAAO;QAC3B,IAAI,QAAQ;;QAEZ,QAAQ,QAAQ,cAAc,SAAS,YAAY;UACjD,QAAQ,SAAS,SAAS,KAAK,WAAW,WAAW,SAAS,WAAW;;;QAG3E,OAAO;;;;;;;;IAQX,SAAS,YAAY,OAAO;MAC1B,IAAI,QAAQ;;MAEZ,MAAM,WAAW;;MAEjB,QAAQ,QAAQ,OAAO,SAAS,SAAS;QACvC,IAAI,QAAQ,SAAS,YAAY,MAAM,SAAS,OAAO,GAAG,SAAS,UAAU;UAC3E,MAAM,SAAS,KAAK;eACf,IAAI,QAAQ,SAAS,YAAY,MAAM,SAAS,OAAO,GAAG,SAAS,QAAQ,KAAK,KAAK;UAC1F,MAAM,SAAS,KAAK,QAAQ,KAAK;;;;;;;;;;;IAWvC,SAAS,OAAO,IAAI;MAClB,IAAI,QAAQ;;MAEZ,IAAI,MAAM,KAAK,QAAQ,WAAW;QAChC,MAAM,QAAQ,MAAM,MAAM,KAAK;QAC/B,OAAO,MAAM,KAAK;QAClB,MAAM,QAAQ;;;MAGhB,OAAO,MAAM,QAAQ;;;;;;;;;IASvB,SAAS,aAAa,IAAI;MACxB,IAAI,QAAQ;;MAEZ,IAAI,MAAM,QAAQ,QAAQ,WAAW;QACnC,MAAM,KAAK,MAAM,MAAM,QAAQ;QAC/B,OAAO,MAAM,QAAQ;QACrB,MAAM,QAAQ;;;MAGhB,OAAO,MAAM,KAAK;;;;;;;;IAQpB,SAAS,aAAa,IAAI;MACxB,IAAI,QAAQ;;MAEZ,OAAO,MAAM,QAAQ;;;;;AAI3B;AC5PA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,oCAAoC;;EAE7C,SAAS,iCAAiC,MAAM;IAC9C,IAAI,QAAQ;;IAEZ,MAAM,aAAa;;IAEnB,MAAM,OAAO;IACb,MAAM,SAAS;;IAEf,OAAO;;;;;;;IAOP,SAAS,WAAW,QAAQ;MAC1B,IAAI,WAAW,MAAM;QACnB,OAAO;;;MAGT,OAAO,CAAC,MAAM,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK;;;;;;;;;;IAUlD,SAAS,KAAK,QAAQ,KAAK,QAAQ,QAAQ,MAAM;MAC/C,IAAI;MACJ,OAAO,SAAS,YAAY,QAAQ;;MAEpC,IAAI,WAAW,WAAW;QACxB,KAAK,MAAM,0CAA0C,QAAQ,KAAK;QAClE,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,QAAQ;QACnB,OAAO;;;MAGT,SAAS,OAAO,OAAO,cAAc;;MAErC,IAAI,WAAW,WAAW;QACxB,KAAK,MAAM,mCAAmC,QAAQ,KAAK,QAAQ;QACnE,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,QAAQ;QACnB,KAAK,MAAM,WAAW;QACtB,OAAO;;;MAGT,IAAI,WAAW,WAAW;QACxB,KAAK,MAAM,0CAA0C,QAAQ,KAAK,QAAQ;QAC1E,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,QAAQ;QACnB,KAAK,MAAM,WAAW;QACtB,OAAO;;;MAGT,IAAI,WAAW,QAAQ,OAAO,gBAAgB,SAAS,OAAO,UAAU,OAAO,KAAK,MAAM;QACxF,KAAK,MAAM,iDAAiD,OAAO,QAAQ,iBAAiB,OAAO,KAAK;QACxG,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,QAAQ;QACnB,KAAK,MAAM,WAAW;QACtB,OAAO;;;MAGT,IAAI,OAAO,SAAS,WAAW;QAC7B,IAAI,WAAW,MAAM;UACnB,aAAa,QAAQ,KAAK,QAAQ;UAClC,OAAO;eACF;UACL,OAAO,oBAAoB,QAAQ,KAAK,QAAQ;;aAE7C,IAAI,OAAO,SAAS,UAAU;QACnC,IAAI,WAAW,MAAM;UACnB,YAAY,QAAQ,KAAK,QAAQ;UACjC,OAAO;eACF;UACL,OAAO,mBAAmB,QAAQ,KAAK,QAAQ;;;;;;;;;;;;IAYrD,SAAS,OAAO,QAAQ,KAAK,QAAQ,QAAQ,MAAM;MACjD,IAAI;MACJ,OAAO,SAAS,YAAY,QAAQ;;MAEpC,IAAI,WAAW,WAAW;QACxB,KAAK,MAAM,+CAA+C,QAAQ,KAAK;QACvE,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,QAAQ;QACnB,OAAO;;;MAGT,SAAS,OAAO,OAAO,cAAc;;MAErC,IAAI,WAAW,WAAW;QACxB,KAAK,MAAM,6CAA6C,QAAQ,KAAK,QAAQ;QAC7E,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,WAAW,OAAO,KAAK,MAAM;QACxC,KAAK,MAAM,QAAQ;QACnB,KAAK,MAAM,WAAW;QACtB,OAAO;;;MAGT,IAAI,WAAW,MAAM;QACnB,gBAAgB,QAAQ,KAAK,QAAQ;QACrC,OAAO;aACF;QACL,OAAO,gBAAgB,QAAQ,KAAK,QAAQ;;;;;;;;IAQhD,SAAS,oBAAoB,QAAQ,KAAK,QAAQ,MAAM;MACtD,IAAI,gBAAgB,OAAO,OAAO,cAAc,KAAK;MACrD,IAAI;;MAEJ,IAAI,kBAAkB,OAAO;QAC3B,aAAa,QAAQ,KAAK,QAAQ;QAClC,OAAO;;;MAGT,mBAAmB,OAAO,OAAO,cAAc;;MAE/C,IAAI,qBAAqB,WAAW;QAClC,KAAK,MAAM,6BAA6B,KAAK,oBAAoB,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK;QACrG,KAAK,MAAM;QACX,OAAO;aACF,IAAI,iBAAiB,SAAS,UAAU;QAC7C,OAAO;UACL,cAAc,QAAQ,KAAK;UAC3B,cAAc,QAAQ,eAAe;UACrC,mBAAmB,QAAQ,eAAe,QAAQ;;aAE/C,IAAI,iBAAiB,SAAS,WAAW;QAC9C,aAAa,QAAQ,KAAK,QAAQ;QAClC,aAAa,QAAQ,eAAe,QAAQ;QAC5C,OAAO,CAAC,cAAc,QAAQ,eAAe;;;;IAIjD,SAAS,mBAAmB,QAAQ,KAAK,QAAQ,MAAM;MACrD,IAAI,gBAAgB,OAAO,OAAO,cAAc,KAAK;MACrD,IAAI,gBAAgB,OAAO,cAAc;MACzC,IAAI;MACJ,IAAI;MACJ,IAAI,SAAS;;MAEb,YAAY,QAAQ,KAAK,QAAQ;;MAEjC,IAAI,kBAAkB,OAAO;QAC3B,OAAO;;;MAGT,IAAI,kBAAkB,aAAa,kBAAkB,MAAM;QACzD,sBAAsB,cAAc,OAAO,cAAc;;QAEzD,IAAI,wBAAwB,WAAW;UACrC,IAAI,oBAAoB,SAAS,UAAU;YACzC,eAAe,eAAe,eAAe,QAAQ;iBAChD,IAAI,oBAAoB,SAAS,WAAW;YACjD,gBAAgB,eAAe,eAAe,QAAQ;;;UAGxD,OAAO,KAAK,cAAc,eAAe,eAAe;eACnD;UACL,KAAK,MAAM,6BAA6B,KAAK,oBAAoB,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK;UACrG,KAAK,MAAM;;;;MAIf,IAAI,WAAW,aAAa,WAAW,QAAQ,kBAAkB,OAAO;QACtE,mBAAmB,OAAO,OAAO,cAAc;QAC/C,IAAI,qBAAqB,WAAW;UAClC,IAAI,iBAAiB,SAAS,UAAU;YACtC,YAAY,QAAQ,eAAe,QAAQ;iBACtC,IAAI,iBAAiB,SAAS,WAAW;YAC9C,aAAa,QAAQ,eAAe,QAAQ;;;UAG9C,OAAO,KAAK,cAAc,QAAQ,eAAe;eAC5C;UACL,KAAK,MAAM,6BAA6B,KAAK,oBAAoB,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK;UACrG,KAAK,MAAM;;;;MAIf,OAAO;;;IAGT,SAAS,gBAAgB,QAAQ,KAAK,QAAQ,MAAM;MAClD,IAAI,SAAS,OAAO,OAAO,cAAc;MACzC,IAAI,gBAAgB,OAAO;MAC3B,IAAI;;MAEJ,IAAI,OAAO,SAAS,WAAW;QAC7B,gBAAgB,QAAQ,KAAK,QAAQ;aAChC,IAAI,OAAO,SAAS,UAAU;QACnC,eAAe,QAAQ,KAAK,QAAQ;;;MAGtC,IAAI,kBAAkB,OAAO;QAC3B,OAAO;;;MAGT,mBAAmB,OAAO,OAAO,cAAc;;MAE/C,IAAI,qBAAqB,WAAW;QAClC,IAAI,iBAAiB,SAAS,UAAU;UACtC,eAAe,QAAQ,eAAe,QAAQ;eACzC,IAAI,iBAAiB,SAAS,WAAW;UAC9C,gBAAgB,QAAQ,eAAe,QAAQ;;aAE5C;QACL,KAAK,MAAM,6BAA6B,KAAK,oBAAoB,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK;QACrG,KAAK,MAAM;QACX,OAAO;;;MAGT,OAAO,CAAC,cAAc,QAAQ,eAAe;;;IAG/C,SAAS,YAAY,QAAQ,KAAK,QAAQ,MAAM;MAC9C,KAAK,MAAM,aAAa,QAAQ,KAAK;;MAErC,IAAI,SAAS,MAAM;QACjB,SAAS,OAAO;;;MAGlB,OAAO,cAAc,OAAO;MAC5B,OAAO,KAAK,cAAc,KAAK,OAAO,WAAW;;MAEjD,IAAI,SAAS,OAAO;QAClB,OAAO,MAAM;;;MAGf,OAAO;;;IAGT,SAAS,aAAa,QAAQ,KAAK,QAAQ,MAAM;MAC/C,KAAK,MAAM,cAAc,QAAQ,KAAK;;MAEtC,IAAI,WAAW,WAAW;MAC1B,IAAI,SAAS,MAAM;QACjB,SAAS,OAAO;;;MAGlB,IAAI,QAAQ,QAAQ,OAAO,cAAc,SAAS,OAAO,cAAc,KAAK,QAAQ,UAAU,CAAC,GAAG;QAChG,OAAO;;;MAGT,OAAO,cAAc,OAAO,OAAO,cAAc,QAAQ;MACzD,OAAO,KAAK,cAAc,KAAK,OAAO,OAAO,KAAK,cAAc,KAAK,QAAQ;;MAE7E,OAAO,cAAc,KAAK,KAAK;MAC/B,OAAO,KAAK,cAAc,KAAK,KAAK,KAAK;;MAEzC,IAAI,SAAS,OAAO;QAClB,OAAO,MAAM;;;MAGf,OAAO;;;IAGT,SAAS,eAAe,QAAQ,KAAK,QAAQ,MAAM;MACjD,KAAK,MAAM,gBAAgB,QAAQ,KAAK;;MAExC,IAAI,SAAS,MAAM;QACjB,SAAS,OAAO;;;MAGlB,IAAI,WAAW,aAAa,OAAO,cAAc,SAAS,QAAQ;QAChE,OAAO;;;MAGT,OAAO,cAAc,OAAO;MAC5B,OAAO,KAAK,cAAc,KAAK,OAAO;;MAEtC,IAAI,SAAS,OAAO;QAClB,OAAO,MAAM;;;MAGf,OAAO;;;IAGT,SAAS,gBAAgB,QAAQ,KAAK,QAAQ,MAAM;MAClD,KAAK,MAAM,iBAAiB,QAAQ,KAAK;;MAEzC,IAAI,SAAS,MAAM;QACjB,SAAS,OAAO;;;MAGlB,IAAI,OAAO,cAAc,SAAS,WAAW;QAC3C;;;MAGF,IAAI,WAAW,WAAW;QACxB,OAAO,cAAc,OAAO;QAC5B,OAAO,KAAK,cAAc,KAAK,OAAO;QACtC,IAAI,SAAS,OAAO;UAClB,OAAO,MAAM;;;QAGf,OAAO;;;MAGT,IAAI,QAAQ,OAAO,cAAc,KAAK,QAAQ;;MAE9C,IAAI,UAAU,CAAC,GAAG;QAChB,OAAO;;;MAGT,OAAO,cAAc,KAAK,OAAO,OAAO;MACxC,OAAO,KAAK,cAAc,KAAK,KAAK,OAAO,OAAO;;MAElD,IAAI,SAAS,OAAO;QAClB,OAAO,MAAM;;;MAGf,OAAO;;;IAGT,SAAS,cAAc,QAAQ,KAAK,QAAQ;MAC1C,OAAO;QACL,QAAQ;QACR,KAAK;QACL,QAAQ;;;;IAIZ,SAAS,cAAc,OAAO,UAAU,OAAO;MAC7C,IAAI,QAAQ,CAAC;MACb,QAAQ,QAAQ,OAAO,SAAS,MAAM,GAAG;QACvC,IAAI,KAAK,WAAW,MAAM,UAAU,KAAK,QAAQ,MAAM,OAAO,KAAK,WAAW,MAAM,QAAQ;UAC1F,QAAQ;;;;MAIZ,IAAI,QAAQ,CAAC,GAAG;QACd,MAAM,SAAS;aACV;QACL,MAAM,KAAK;;;MAGb,OAAO;;;;;AAIb;ACnXA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,2BAA2B;;EAEpC,SAAS;IACP;IACA;IACA;IACA;IACA;;IAEA,wBAAwB,UAAU,OAAO;IACzC,wBAAwB,UAAU,QAAQ;IAC1C,wBAAwB,UAAU,WAAW;;IAE7C,wBAAwB,UAAU,OAAO;IACzC,wBAAwB,UAAU,SAAS;;IAE3C,wBAAwB,UAAU,SAAS;;IAE3C,OAAO;MACL,QAAQ;;;IAGV,SAAS,+BAA+B,QAAQ;MAC9C,OAAO,IAAI,wBAAwB;;;IAGrC,SAAS,wBAAwB,QAAQ;MACvC,IAAI,QAAQ;;MAEZ,MAAM,OAAO;QACX,IAAI,OAAO,KAAK;QAChB,MAAM,OAAO,KAAK;QAClB,YAAY;QACZ,eAAe;;;MAGjB,MAAM,gBAAgB;MACtB,MAAM,SAAS;MACf,MAAM,SAAS,OAAO;MACtB,MAAM;;;;;;;IAOR,SAAS,SAAS;MAChB,IAAI,QAAQ;MACZ,IAAI,OAAO,QAAQ,KAAK,MAAM;MAC9B,IAAI,gBAAgB;;MAEpB,QAAQ,QAAQ,KAAK,eAAe,SAAS,OAAO,KAAK;QACvD,IAAI,MAAM,SAAS,WAAW;UAC5B,cAAc,OAAO;;;;MAIzB,KAAK,gBAAgB;;MAErB,OAAO;QACL,MAAM;;;;;;;;IAQV,SAAS,OAAO;MACd,IAAI,QAAQ;;MAEZ,OAAO,MAAM,OAAO;;;;;;;IAOtB,SAAS,MAAM,MAAM;MACnB,IAAI,QAAQ;;MAEZ,QAAQ,QAAQ,MAAM,OAAO,eAAe,SAAS,MAAM,KAAK;QAC9D,MAAM,KAAK,cAAc,OAAO,QAAQ,KAAK,MAAM,OAAO,KAAK,cAAc,SAAS;QACtF,IAAI,QAAQ,QAAQ,MAAM,cAAc,OAAO;UAC7C,MAAM,cAAc,OAAO,MAAM,OAAO,cAAc,KAAK;eACtD;UACL,MAAM,cAAc,OAAO,MAAM,OAAO,cAAc;;;;MAI1D,IAAI,SAAS,QAAQ,MAAM,OAAO,iBAAiB,MAAM;QACvD;;;MAGF,QAAQ,QAAQ,MAAM,OAAO,YAAY,SAAS,WAAW,KAAK;QAChE,MAAM,KAAK,WAAW,OAAO,QAAQ,KAAK,MAAM,OAAO,KAAK,WAAW;;;MAGzE,MAAM,OAAO,OAAO,WAAW;;;;;;;;IAQjC,SAAS,SAAS,KAAK;MACrB,IAAI,QAAQ;MACZ,IAAI;MACJ,IAAI;MACJ,IAAI,WAAW,GAAG;;MAElB,IAAI,QAAQ,WAAW;QACrB,oBAAoB,MAAM,KAAK;QAC/B,qBAAqB,MAAM,OAAO;aAC7B;QACL,oBAAoB;QACpB,qBAAqB;;QAErB,kBAAkB,OAAO,MAAM,KAAK,WAAW;QAC/C,mBAAmB,OAAO,MAAM,OAAO,WAAW;;;MAGpD,WAAW;QACT;QACA;QACA,KAAK,SAAS;;MAEhB,SAAS,UAAU;QACjB,IAAI,QAAQ,WAAW;UACrB,MAAM,OAAO,OAAO,WAAW;eAC1B;UACL,MAAM,OAAO,OAAO,WAAW,MAAM;;;QAGvC,SAAS;;;MAGX,SAAS,OAAO,WAAW;QACzB,MAAM,OAAO,QAAQ;QACrB,IAAI,QAAQ,WAAW;UACrB,MAAM,OAAO,OAAO,WAAW;eAC1B;UACL,MAAM,OAAO,OAAO,WAAW,MAAM;;;QAGvC,QAAQ,QAAQ,WAAW,SAAS,QAAQ,WAAW;UACrD,QAAQ,QAAQ,QAAQ,SAAS,OAAO;YACtC,MAAM,OAAO,OAAO,WAAW,IAAI,WAAW,mCAAmC,OAAO,OAAO;;;;QAInG,SAAS,OAAO,MAAM,OAAO,OAAO;;;MAGtC,OAAO,SAAS;;;;;;;;;IASlB,SAAS,KAAK,KAAK,QAAQ,QAAQ;MACjC,IAAI,QAAQ;MACZ,SAAS,WAAW,YAAY,QAAQ;;MAExC,OAAO,GAAG,QAAQ,iCAAiC,KAAK,MAAM,QAAQ,KAAK,QAAQ,QAAQ;;;;;;;;;IAS7F,SAAS,OAAO,KAAK,QAAQ,QAAQ;MACnC,IAAI,QAAQ;MACZ,SAAS,WAAW,YAAY,QAAQ;;MAExC,OAAO,GAAG,QAAQ,iCAAiC,OAAO,MAAM,QAAQ,KAAK,QAAQ,QAAQ;;;;;AAInG;AC7LA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,+BAA+B;;EAExC,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,4BAA4B,UAAU,UAAU;IAChD,4BAA4B,UAAU,SAAS;IAC/C,4BAA4B,UAAU,QAAQ;IAC9C,4BAA4B,UAAU,OAAO;;IAE7C,4BAA4B,UAAU,SAAS;;IAE/C,4BAA4B,UAAU,OAAO;IAC7C,4BAA4B,UAAU,SAAS;IAC/C,4BAA4B,UAAU,YAAY;;IAElD,4BAA4B,UAAU,SAAS;;IAE/C,4BAA4B,UAAU,YAAY;;IAElD,OAAO;;;;;;;IAOP,SAAS,4BAA4B,MAAM,QAAQ,WAAW;MAC5D,IAAI,QAAQ;;MAEZ,KAAK,gBAAgB,KAAK,iBAAiB;;;;;;MAM3C,MAAM,MAAM,OAAO,QAAQ,YAAY,QAAQ,OAAO;;;;;;MAMtD,MAAM,SAAS,OAAO,WAAW,YAAY,OAAO,OAAO;;;;;;MAM3D,MAAM,eAAe,OAAO,iBAAiB,YAAY,OAAO,OAAO;;;;;;MAMvE,MAAM,WAAW,OAAO,aAAa,YAAY,OAAO,OAAO;;MAE/D,MAAM,UAAU;MAChB,MAAM,UAAU;MAChB,MAAM,SAAS;MACf,MAAM,YAAY,MAAM,iBAAiB,OAAO,KAAK,QAAQ;;MAE7D,MAAM,eAAe;MACrB,MAAM,cAAc;;MAEpB,MAAM,OAAO;QACX,eAAe;QACf,YAAY;;MAEd,MAAM,gBAAgB;;MAEtB,QAAQ,QAAQ,MAAM,OAAO,eAAe,SAAS,QAAQ,KAAK;QAChE,MAAM,cAAc,OAAO;;;MAG7B,MAAM,SAAS;QACb,YAAY,iCAAiC;UAC3C;UACA;UACA;;QAEF,iBAAiB,iCAAiC;UAChD;UACA;UACA;;;;MAIJ,MAAM,UAAU,GAAG,QAAQ;;MAE3B,UAAU,OAAO;;MAEjB,MAAM,OAAO,wBAAwB,OAAO;;;;;;;IAO9C,SAAS,OAAO;MACd,IAAI,QAAQ;MACZ,IAAI,WAAW,GAAG;MAClB,IAAI,SAAS;QACX,QAAQ,MAAM,QAAQ,OAAO,QAAQ;QACrC,QAAQ;;;MAGV,MAAM,KAAK,WAAW;QACpB;QACA,SAAS;QACT,QAAQ,yBAAyB,KAAK,OAAO;;MAE/C,yBAAyB;;MAEzB,OAAO,SAAS;;MAEhB,SAAS,cAAc;QACrB,MAAM,YAAY,QAAQ,KAAK,SAAS,QAAQ;;;MAGlD,SAAS,QAAQ,UAAU;QACzB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,aAAa,OAAO,QAAQ,YAAY,OAAO;QACtG,MAAM,OAAO,SAAS,KAAK;;QAE3B,IAAI,MAAM,QAAQ,MAAM;UACtB,MAAM,SAAS,MAAM,WAAW,MAAM,SAAS,MAAM,YAAY;UACjE,MAAM,SAAS,MAAM,SAAS,KAAK,MAAM,KAAK;;;QAGhD,MAAM,eAAe;QACrB,MAAM,MAAM;QACZ,MAAM,WAAW;QACjB,MAAM,SAAS;;QAEf,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,QAAQ,SAAS,KAAK;;;MAGjC,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB,YAAY,OAAO;;QAE1F,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB,UAAU,OAAO;;QAExF,SAAS,OAAO;;;;;;;;IAQpB,SAAS,QAAQ;MACf,IAAI,QAAQ;;MAEZ,IAAI,MAAM,SAAS,WAAW;QAC5B,MAAM,KAAK;;;;;;;;IAQf,SAAS,QAAQ,QAAQ;MACvB,IAAI,WAAW,UAAU,IAAI;MAC7B,IAAI,WAAW,GAAG;MAClB,IAAI,QAAQ;MACZ,SAAS,WAAW,YAAY,MAAM,OAAO,OAAO,MAAM;;MAE1D,IAAI,SAAS;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;;;MAGV,IAAI,MAAM,QAAQ,MAAM;QACtB,IAAI,QAAQ,+BAA+B,OAAO,6BAA6B,MAAM,GAAG;QACxF,MAAM,OAAO,gBAAgB,IAAI,WAAW;QAC5C,SAAS,OAAO;aACX;QACL,0BAA0B;;QAE1B,MAAM,YAAY;WACf,KAAK,SAAS,QAAQ;WACtB,QAAQ,0BAA0B,KAAK,OAAO;;;MAGnD,OAAO,SAAS;;MAEhB,SAAS,QAAQ,UAAU;QACzB,IAAI,UAAU,SAAS,iBAAiB,SAAS;QACjD,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,mBAAmB,YAAY,OAAO;QAC7F,GAAG,WAAW,QAAQ,SAAS,IAAI,sBAAsB,KAAK,iBAAiB,SAAS;;QAExF,MAAM,eAAe;QACrB,MAAM,SAAS;QACf,MAAM,WAAW;;QAEjB,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;;QAE7C,SAAS,oBAAoB,QAAQ;UACnC,0BAA0B;;UAE1B,OAAO,OAAO,YAAY;YACxB,QAAQ;YACR,QAAQ;aACP,QAAQ,0BAA0B,KAAK,QAAQ;;;QAGpD,SAAS,gBAAgB,kBAAkB;UACzC,QAAQ,QAAQ,kBAAkB,SAAS,WAAW,KAAK;YACzD,IAAI,UAAU,YAAY,MAAM;cAC9B,WAAW,MAAM,oBAAoB,QAAQ,SAAS,KAAK,KAAK,OAAO,mBAAmB,YAAY,QAAQ,SAAS,MAAM;cAC7H,UAAU,MAAM;;;;UAIpB,SAAS,QAAQ,SAAS,KAAK;;;;MAInC,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,mBAAmB,YAAY,OAAO;;QAE7F,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,mBAAmB,UAAU,OAAO;;QAE3F,SAAS,OAAO;;;;;;;;IAQpB,SAAS,SAAS;MAChB,IAAI,QAAQ;MACZ,IAAI,OAAO,MAAM;MACjB,IAAI,gBAAgB;;MAEpB,QAAQ,QAAQ,KAAK,eAAe,SAAS,OAAO,KAAK;QACvD,IAAI,MAAM,SAAS,WAAW;UAC5B,cAAc,OAAO;;;;MAIzB,KAAK,gBAAgB;;MAErB,OAAO;QACL,MAAM;QACN,WAAW,MAAM;;;;;;;;IAQrB,SAAS,SAAS;MAChB,IAAI,QAAQ;MACZ,IAAI,WAAW,GAAG;;MAElB,IAAI,SAAS;QACX,QAAQ;QACR,QAAQ;;;MAGV,MAAM,SAAS,MAAM,OAAO,MAAM,KAAK;;MAEvC,IAAI,MAAM,QAAQ,MAAM;QACtB,SAAS;aACJ;QACL,yBAAyB;;QAEzB,MAAM,YAAY;WACf,KAAK,SAAS,QAAQ;WACtB,QAAQ,yBAAyB,KAAK,OAAO;;;MAGlD,OAAO,SAAS;;MAEhB,SAAS,QAAQ,UAAU;QACzB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,kBAAkB,YAAY,OAAO;QAC5F,MAAM,UAAU;QAChB,MAAM;QACN,MAAM,SAAS,MAAM,aAAa,MAAM,KAAK;;QAE7C,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;;QAE7C,SAAS;;;MAGX,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,kBAAkB,YAAY,OAAO;QAC5F,MAAM,SAAS,MAAM,aAAa,MAAM,KAAK;;QAE7C,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,kBAAkB,UAAU,OAAO;;QAE1F,SAAS,OAAO;;;;;;;;IAQpB,SAAS,UAAU,KAAK;MACtB,IAAI,QAAQ;MACZ,IAAI,WAAW,GAAG;;MAElB,0BAA0B;;MAE1B,IAAI,QAAQ,WAAW;QACrB,QAAQ,QAAQ,MAAM,eAAe;aAChC;QACL,WAAW,MAAM,cAAc,MAAM;;;MAGvC,0BAA0B;;MAE1B,OAAO,SAAS;;MAEhB,SAAS,WAAW,UAAU,KAAK;QACjC,IAAI,SAAS,MAAM,OAAO,cAAc;QACxC,IAAI,gBAAgB,OAAO;;QAE3B,IAAI,QAAQ,QAAQ,WAAW;UAC7B,QAAQ,QAAQ,UAAU,qBAAqB,KAAK,WAAW;eAC1D,IAAI,QAAQ,SAAS,WAAW;UACrC,qBAAqB,eAAe;;;QAGtC,IAAI,OAAO,SAAS,UAAU;UAC5B,MAAM,cAAc,OAAO;eACtB,IAAI,OAAO,SAAS,WAAW;UACpC,MAAM,cAAc,OAAO;;;;MAI/B,SAAS,qBAAqB,eAAe,QAAQ;QACnD,IAAI,mBAAmB,OAAO,OAAO,cAAc;QACnD,IAAI,SAAS;UACX,QAAQ;UACR,QAAQ;UACR,QAAQ;UACR,KAAK;;;QAGP,0BAA0B;QAC1B,iCAAiC,OAAO,QAAQ,eAAe,OAAO;;QAEtE,OAAO,YAAY;WAChB,KAAK,SAAS,QAAQ;WACtB,QAAQ,0BAA0B,KAAK,QAAQ;;QAElD,SAAS,QAAQ,UAAU;UACzB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,4BAA4B,WAAW,OAAO;;UAErG,SAAS;UACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;UAC7C,SAAS;;;QAGX,SAAS,OAAO,UAAU;UACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,4BAA4B,YAAY,OAAO;;UAEtG,SAAS;UACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;UAC7C,SAAS,OAAO;;;QAGlB,SAAS,OAAO,UAAU;UACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,4BAA4B,UAAU,OAAO;;UAEpG,SAAS;UACT,SAAS,OAAO;;;;;;;;;;;IAWtB,SAAS,KAAK,KAAK,QAAQ;MACzB,IAAI,WAAW,GAAG;MAClB,IAAI,QAAQ;MACZ,IAAI;MACJ,IAAI,SAAS;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,KAAK;;;MAGP,IAAI,WAAW,WAAW;QACxB,QAAQ,+BAA+B,OAAO,yBAAyB,MAAM,GAAG;QAChF,MAAM,OAAO,gBAAgB,IAAI,QAAQ;QACzC,SAAS,OAAO;aACX,IAAI,MAAM,QAAQ,MAAM;QAC7B,QAAQ,+BAA+B,OAAO,0BAA0B,MAAM,GAAG;QACjF,MAAM,OAAO,gBAAgB,IAAI,QAAQ;QACzC,SAAS,OAAO;aACX;QACL,yBAAyB;;QAEzB,MAAM,YAAY;WACf,KAAK,SAAS,QAAQ;WACtB,QAAQ,yBAAyB,KAAK,OAAO;;;MAGlD,OAAO,SAAS;;MAEhB,SAAS,QAAQ,UAAU;QACzB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB,YAAY,OAAO;;QAE1F,IAAI,UAAU,iCAAiC,KAAK,OAAO,KAAK;;QAEhE,MAAM,SAAS;QACf,MAAM,WAAW;QACjB,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;;QAE7C,GAAG,WAAW,QAAQ,IAAI;WACvB,KAAK,mBAAmB,SAAS;;QAEpC,SAAS,YAAY,QAAQ;UAC3B,0BAA0B;;UAE1B,OAAO,OAAO,YAAY;YACxB,QAAQ;YACR,QAAQ,OAAO;YACf,QAAQ,OAAO;YACf,KAAK,OAAO;aACX,QAAQ,0BAA0B,KAAK,QAAQ;;;QAGpD,SAAS,kBAAkB,UAAU;UACnC,QAAQ,QAAQ,UAAU,SAAS,WAAW,KAAK;YACjD,IAAI,UAAU,YAAY,MAAM;cAC9B,WAAW,MAAM,oBAAoB,QAAQ,KAAK,OAAO,KAAK,OAAO,0BAA0B,YAAY,QAAQ,MAAM;cACzH,UAAU,MAAM;;;;UAIpB,SAAS,QAAQ,SAAS,KAAK;;;;MAInC,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB,YAAY,OAAO;;QAE1F,SAAS,OAAO,SAAS;QACzB,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB,UAAU,OAAO;;QAExF,SAAS,OAAO;;;;;;;;;;IAUpB,SAAS,OAAO,KAAK,QAAQ;MAC3B,IAAI,WAAW,GAAG;MAClB,IAAI,QAAQ;MACZ,IAAI;MACJ,IAAI,SAAS;QACX,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,KAAK;;;MAGP,IAAI,WAAW,WAAW;QACxB,QAAQ,+BAA+B,OAAO,2BAA2B,MAAM,GAAG;QAClF,MAAM,OAAO,gBAAgB,IAAI,UAAU;QAC3C,SAAS,OAAO;aACX,IAAI,MAAM,QAAQ,MAAM;QAC7B,QAAQ,+BAA+B,OAAO,4BAA4B,MAAM,GAAG;QACnF,MAAM,OAAO,gBAAgB,IAAI,UAAU;QAC3C,SAAS,OAAO;aACX;QACL,yBAAyB;;QAEzB,MAAM,YAAY;WACf,KAAK,SAAS,QAAQ;WACtB,QAAQ,yBAAyB,KAAK,OAAO;;;MAGlD,OAAO,SAAS;;MAEhB,SAAS,QAAQ,UAAU;QACzB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,kBAAkB,YAAY,OAAO;;QAE5F,IAAI,UAAU,iCAAiC,KAAK,OAAO,KAAK;;QAEhE,MAAM,SAAS;QACf,MAAM,WAAW;QACjB,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;;QAE7C,GAAG,WAAW,QAAQ,IAAI;WACvB,KAAK,mBAAmB,SAAS;;QAEpC,SAAS,YAAY,QAAQ;UAC3B,0BAA0B;;UAE1B,OAAO,OAAO,YAAY;YACxB,QAAQ;YACR,QAAQ,OAAO;YACf,QAAQ,OAAO;YACf,KAAK,OAAO;aACX,QAAQ,0BAA0B,KAAK,QAAQ;;;QAGpD,SAAS,kBAAkB,UAAU;UACnC,QAAQ,QAAQ,UAAU,SAAS,WAAW;YAC5C,IAAI,UAAU,YAAY,MAAM;cAC9B,WAAW,MAAM,oBAAoB,QAAQ,KAAK,KAAK,OAAO,4BAA4B,YAAY,QAAQ,MAAM;cACpH,SAAS,MAAM;;;;UAInB,SAAS;;;;MAIb,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,kBAAkB,YAAY,OAAO;;QAE5F,SAAS,OAAO,SAAS;QACzB,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,KAAK,OAAO,kBAAkB,UAAU,OAAO;;QAE1F,SAAS,OAAO;;;;;;;;;IASpB,SAAS,OAAO,eAAe,MAAM,gBAAgB;MACnD,IAAI,QAAQ;;MAEZ,0BAA0B;;MAE1B,UAAU,OAAO;MACjB,MAAM,MAAM;MACZ,MAAM,eAAe,mBAAmB,OAAO,QAAQ;MACvD,MAAM,SAAS,mBAAmB,OAAO,QAAQ;MACjD,MAAM,YAAY,KAAK;;MAEvB,0BAA0B;;;;;;;IAO5B,SAAS,YAAY;MACnB,IAAI,QAAQ;MACZ,IAAI,SAAS;;MAEb,QAAQ,QAAQ,MAAM,QAAQ,SAAS,OAAO;QAC5C,SAAS,MAAM,eAAe;;;MAGhC,OAAO;;;;;;;;;;;;;IAaT,SAAS,UAAU,QAAQ,eAAe;;MAExC,IAAI,WAAW,UAAU,IAAI;MAC7B,IAAI,SAAS,OAAO;;MAEpB,OAAO,KAAK,KAAK,cAAc;MAC/B,OAAO,KAAK,OAAO,cAAc;;MAEjC,IAAI,OAAO,SAAS,OAAO,SAAS,cAAc,MAAM;QACtD,KAAK,MAAM,gCAAgC,OAAO,SAAS,OAAO,MAAM;QACxE,OAAO;;;MAGT,IAAI,CAAC,OAAO,OAAO,GAAG,SAAS,OAAO,KAAK,KAAK;QAC9C,KAAK,MAAM;QACX,OAAO;;;MAGT,OAAO,KAAK,QAAQ,cAAc;MAClC,cAAc,aAAa,cAAc,cAAc;MACvD,cAAc,gBAAgB,cAAc,iBAAiB;;MAE7D,QAAQ,QAAQ,OAAO,YAAY;MACnC,QAAQ,QAAQ,OAAO,eAAe;;MAEtC,OAAO;;MAEP,SAAS,cAAc,YAAY,KAAK;QACtC,OAAO,KAAK,WAAW,OAAO,cAAc,WAAW;;;MAGzD,SAAS,iBAAiB,QAAQ,KAAK;QACrC,IAAI,mBAAmB,cAAc,cAAc;;QAEnD,IAAI,qBAAqB,WAAW;UAClC,IAAI,OAAO,KAAK,cAAc,SAAS,WAAW;YAChD,OAAO,KAAK,cAAc,OAAO,CAAC,MAAM;;;UAG1C;;;QAGF,OAAO,KAAK,cAAc,OAAO,OAAO,KAAK,cAAc,QAAQ;QACnE,OAAO,KAAK,cAAc,KAAK,QAAQ,iBAAiB;;QAExD,IAAI,OAAO,SAAS,UAAU;UAC5B,QAAQ,QAAQ,KAAK,iBAAiB;eACjC,IAAI,OAAO,SAAS,WAAW;UACpC,IAAI,QAAQ,QAAQ,iBAAiB,OAAO;YAC1C,IAAI,iBAAiB,KAAK,WAAW,GAAG;cACtC,OAAO,KAAK,cAAc,KAAK,OAAO;cACtC,OAAO,UAAU;mBACZ;cACL,QAAQ;gBACN,OAAO,cAAc;gBACrB,UAAU,KAAK,WAAW,QAAQ,KAAK,iBAAiB;;cAE1D,QAAQ;gBACN,iBAAiB;gBACjB,QAAQ,KAAK,WAAW,QAAQ;;;;;;;MAO1C,SAAS,QAAQ,QAAQ,KAAK,MAAM;QAClC,IAAI;;QAEJ,IAAI,SAAS,MAAM;UACjB,iCAAiC,KAAK,QAAQ,KAAK;UACnD;;;QAGF,IAAI,SAAS,WAAW;UACtB;;;QAGF,WAAW,SAAS,YAAY,KAAK;;QAErC,IAAI,aAAa,WAAW;UAC1B,KAAK,MAAM,qBAAqB,KAAK,MAAM;UAC3C;;;QAGF,IAAI,SAAS,SAAS,MAAM,IAAI,KAAK;;QAErC,iCAAiC,KAAK,QAAQ,KAAK;;;MAGrD,SAAS,UAAU,QAAQ,KAAK,kBAAkB,QAAQ;QACxD,IAAI,iBAAiB,QAAQ,OAAO,KAAK,MAAM,CAAC,GAAG;UACjD;;;QAGF,iCAAiC,OAAO,QAAQ,KAAK;;;;;;;;;;EAS3D,SAAS,0BAA0B,QAAQ;IACzC,SAAS,WAAW,YAAY,OAAO;IACvC,OAAO,gBAAgB;IACvB,OAAO,UAAU;;;EAGnB,SAAS,0BAA0B,QAAQ;IACzC,SAAS,WAAW,YAAY,OAAO;IACvC,OAAO,gBAAgB;IACvB,OAAO,UAAU,OAAO,eAAe;;;EAGzC,SAAS,yBAAyB,QAAQ;IACxC,SAAS,WAAW,YAAY,OAAO;IACvC,OAAO,eAAe;IACtB,OAAO,SAAS;;;EAGlB,SAAS,yBAAyB,QAAQ;IACxC,SAAS,WAAW,YAAY,OAAO;IACvC,OAAO,eAAe;IACtB,OAAO,SAAS,OAAO,cAAc;;;AAGzC;ACrvBA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,sCAAsC;;EAE/C,SAAS,4CAA4C;IACnD,gBAAgB,YAAY,OAAO,OAAO,MAAM;IAChD,gBAAgB,UAAU,cAAc;IACxC,gBAAgB,UAAU,OAAO;;IAEjC,OAAO;MACL,QAAQ;;;IAGV,SAAS,uBAAuB,SAAS,WAAW;MAClD,OAAO,IAAI,gBAAgB,SAAS;;;IAGtC,SAAS,gBAAgB,SAAS,WAAW;MAC3C,IAAI,QAAQ;;MAEZ,MAAM,UAAU;MAChB,MAAM,UAAU;QACd,WAAW;;;;;AAKnB;AC7BA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,kCAAkC;;EAE3C,SAAS,wCAAwC;IAC/C,YAAY,YAAY,OAAO,OAAO,MAAM;IAC5C,YAAY,UAAU,cAAc;IACpC,YAAY,UAAU,OAAO;;IAE7B,OAAO;MACL,QAAQ;;;IAGV,SAAS,mBAAmB,SAAS,QAAQ,MAAM,QAAQ;MACzD,OAAO,IAAI,YAAY,SAAS,QAAQ,MAAM;;;IAGhD,SAAS,YAAY,SAAS,QAAQ,MAAM,QAAQ;MAClD,IAAI,QAAQ;;MAEZ,MAAM,UAAU;MAChB,MAAM,UAAU;QACd,QAAQ;QACR,MAAM;QACN,QAAQ;;;;;AAKhB;AC/BA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,oCAAoC;;EAE7C,SAAS,0CAA0C;IACjD,cAAc,UAAU,cAAc;IACtC,cAAc,UAAU,SAAS;IACjC,cAAc,UAAU,QAAQ;IAChC,cAAc,UAAU,MAAM;IAC9B,cAAc,UAAU,YAAY;;IAEpC,OAAO;MACL,QAAQ;;;IAGV,SAAS,qBAAqB,MAAM,aAAa,kBAAkB,eAAe;MAChF,OAAO,IAAI,cAAc,MAAM,aAAa,kBAAkB;;;IAGhE,SAAS,cAAc,MAAM,aAAa,kBAAkB,eAAe;MACzE,IAAI,QAAQ;MACZ,MAAM,OAAO;MACb,MAAM,cAAc;;MAEpB,MAAM,mBAAmB;MACzB,MAAM,SAAS;MACf,MAAM,gBAAgB,iBAAiB,WAAW,EAAE,OAAO;;;IAG7D,SAAS,MAAM,KAAK;MAClB,IAAI,QAAQ;;MAEZ,IAAI,QAAQ,WAAW;QACrB,QAAQ,QAAQ,MAAM,QAAQ,SAAS,KAAK,KAAK;UAC/C,MAAM,OAAO,OAAO;;aAEjB;QACL,MAAM,OAAO,OAAO;;;;IAIxB,SAAS,IAAI,KAAK,OAAO;MACvB,IAAI,QAAQ;;MAEZ,MAAM,OAAO,OAAO,MAAM,OAAO,QAAQ;MACzC,MAAM,OAAO,KAAK,KAAK;;;IAGzB,SAAS,OAAO,QAAQ;MACtB,IAAI,QAAQ;;MAEZ,QAAQ,QAAQ,QAAQ,SAAS,OAAO;QACtC,MAAM,OAAO,MAAM,OAAO;;;MAG5B,QAAQ,QAAQ,QAAQ,SAAS,OAAO;QACtC,MAAM,OAAO,MAAM,KAAK,KAAK,MAAM;;;;;IAKvC,SAAS,UAAU,KAAK;MACtB,IAAI,QAAQ;;MAEZ,IAAI,QAAQ,WAAW;QACrB,IAAI,SAAS;;QAEb,QAAQ,QAAQ,MAAM,QAAQ,SAAS,OAAO;UAC5C,SAAS,UAAU,MAAM,SAAS;;;QAGpC,OAAO;aACF;QACL,OAAO,MAAM,OAAO,SAAS,aAAa,MAAM,OAAO,KAAK,SAAS;;;;;AAK7E;AChFA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;KACZ,SAAS,iBAAiB;;EAE7B,SAAS,cAAc,MAAM,IAAI;IAC/B,OAAO,IAAI,SAAS;MAClB,qBAAqB,OAAO;MAC5B;;;AAGN;ACZA;AACA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;KACZ,SAAS,gBAAgB,SAAS,QAAQ,cAAc,UAAU;MACjE,IAAI;MACJ,IAAI;MACJ,OAAO,eAAe,QAAQ,cAAc;QAC1C,KAAK,WAAW;UACd,IAAI,CAAC,MAAM;;YAET,OAAO;YACP,SAAS,SAAS,KAAK;;;UAGzB,OAAO;;;;QAIT,YAAY;QACZ,cAAc;;;;;AAKtB;AC1BA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;KACZ,SAAS,eAAe,SAAS,KAAK;MACrC,OAAO,IAAI,QAAQ,mBAAmB,SAAS;;;;AAIrD;ACTA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,OAAO;;EAER,SAAS,QAAQ,UAAU;IACzB,SAAS,UAAU,MAAM;;;;EAG3B,SAAS,UAAU,WAAW;IAC5B,IAAI,KAAK;;IAET,GAAG,aAAa,GAAG,cAAc;;IAEjC,SAAS,WAAW,UAAU,kBAAkB,kBAAkB;;;;;MAKhE,IAAI,UAAU,QAAQ,QAAQ,YAAY,KAAK;;MAE/C,QAAQ,QAAQ,UAAU,SAAS,SAAS,KAAK;QAC/C,IAAI,CAAC,QAAQ,eAAe,MAAM;UAChC,QAAQ,OAAO,KAAK;;;;MAIxB,OAAO,GAAG,IAAI;;MAEd,SAAS,KAAK,SAAS;QACrB,OAAO,GAAG,QAAQ;WACf,KAAK,SAAS,OAAO;YACpB,IAAI,QAAQ,WAAW,mBAAmB;cACxC,iBAAiB;;;YAGnB,OAAO,EAAE,SAAS,MAAM,OAAO;;;UAGjC,SAAS,QAAQ;YACf,IAAI,QAAQ,WAAW,mBAAmB;cACxC,iBAAiB;;;YAGnB,OAAO,EAAE,SAAS,OAAO,QAAQ;;;;;IAKzC,OAAO;;;;AAGX;ACrDA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,oCAAoC;;EAE7C,SAAS,wCAAwC,qCAAqC,IAAI,MAAM;;IAE9F,iCAAiC,YAAY,OAAO,OAAO,oCAAoC;IAC/F,iCAAiC,UAAU,cAAc;;IAEzD,iCAAiC,UAAU,cAAc;;IAEzD,OAAO;MACL,QAAQ;;;IAGV,SAAS,wCAAwC,SAAS;MACxD,OAAO,IAAI,iCAAiC;;;IAG9C,SAAS,iCAAiC,SAAS;MACjD,IAAI,QAAQ;;MAEZ,MAAM,QAAQ;;MAEd,oCAAoC,KAAK,OAAO;;MAEhD,QAAQ,QAAQ,SAAS,SAAS,QAAQ;QACxC,OAAO,eAAe;;;;IAI1B,SAAS,YAAY,QAAQ;MAC3B,IAAI,QAAQ;MACZ,IAAI,WAAW;MACf,IAAI,WAAW,GAAG;MAClB,IAAI,SAAS,OAAO;;MAEpB,oCAAoC,UAAU,YAAY,KAAK,OAAO;;MAEtE,QAAQ,QAAQ,MAAM,SAAS,SAAS,QAAQ;QAC9C,QAAQ,QAAQ,OAAO,WAAW,SAAS,SAAS,MAAM;UACxD,SAAS,OAAO,CAAC,MAAM,SAAS,MAAM,KAAK,KAAK,OAAO;;;;MAI3D,QAAQ,QAAQ,MAAM,SAAS,SAAS,QAAQ;QAC9C,QAAQ,QAAQ,OAAO,YAAY,SAAS,SAAS,MAAM;UACzD,SAAS,OAAO,CAAC,MAAM,UAAU,MAAM,KAAK,KAAK,OAAO;;;;MAI5D,QAAQ,QAAQ,MAAM,SAAS,SAAS,QAAQ;QAC9C,QAAQ,QAAQ,OAAO,qBAAqB,SAAS,SAAS,MAAM;UAClE,SAAS,KAAK,KAAK,KAAK,OAAO;;;;MAInC,GAAG,WAAW,UAAU,kBAAkB,kBAAkB,KAAK,UAAU;;MAE3E,SAAS,iBAAiB,OAAO;QAC/B,SAAS,OAAO,CAAC,MAAM,mBAAmB,MAAM;;;MAGlD,SAAS,iBAAiB,QAAQ;QAChC,SAAS,OAAO,CAAC,MAAM,mBAAmB,QAAQ;;;MAGpD,SAAS,SAAS,SAAS;QACzB,MAAM,MAAM,UAAU,MAAM,MAAM,WAAW;QAC7C,MAAM,MAAM,QAAQ,UAAU;;QAE9B,QAAQ,QAAQ,SAAS,SAAS,QAAQ;UACxC,IAAI,OAAO,YAAY,OAAO;YAC5B,MAAM,MAAM,QAAQ,UAAU;;;;QAIlC,QAAQ,QAAQ,MAAM,SAAS,SAAS,QAAQ;UAC9C,QAAQ,QAAQ,OAAO,WAAW,SAAS,SAAS,MAAM;YACxD,SAAS,OAAO,CAAC,MAAM,SAAS,QAAQ,KAAK,KAAK,OAAO,QAAQ;;;;QAIrE,IAAI;QACJ,IAAI,SAAS;;QAEb,QAAQ,QAAQ,SAAS,SAAS,QAAQ;UACxC,IAAI,OAAO,YAAY,MAAM;YAC3B,OAAO,OAAO;iBACT;YACL,OAAO,KAAK;cACV,KAAK;cACL,QAAQ,OAAO;;;;;QAKrB,IAAI,OAAO,SAAS,GAAG;UACrB,SAAS,OAAO,CAAC,MAAM,QAAQ,IAAI,QAAQ,QAAQ,QAAQ;eACtD;UACL,SAAS,QAAQ,CAAC,MAAM,QAAQ,IAAI,QAAQ,QAAQ,QAAQ;;;;MAIhE,SAAS,SAAS;QAChB,QAAQ,QAAQ,MAAM,SAAS,SAAS,QAAQ;UAC9C,QAAQ,QAAQ,OAAO,YAAY,SAAS,SAAS,MAAM;YACzD,SAAS,OAAO,CAAC,MAAM,UAAU,QAAQ,KAAK,KAAK,OAAO;;;;;MAKhE,SAAS,SAAS,QAAQ;QACxB,KAAK,MAAM;;QAEX,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,QAAQ;;;MAGjD,OAAO,SAAS;;;;;AAItB;AC5HA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,uCAAuC;;EAEhD,SAAS,2CAA2C,MAAM;;IAExD,oCAAoC,UAAU,cAAc;;IAE5D,OAAO;;IAEP,SAAS,oCAAoC,SAAS;MACpD,IAAI,QAAQ;;MAEZ,MAAM,UAAU;;;IAGlB,SAAS,YAAY,QAAQ;MAC3B,IAAI,QAAQ;;MAEZ,KAAK,MAAM,sBAAsB,MAAM,SAAS,OAAO,MAAM;;MAE7D,IAAI,OAAO,WAAW,WAAW;QAC/B,KAAK,MAAM,uCAAuC;;;;;;AAK1D;AC7BA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,iCAAiC;;EAE1C,SAAS,uCAAuC;IAC9C,8BAA8B,UAAU,SAAS;IACjD,8BAA8B,UAAU,QAAQ;IAChD,8BAA8B,UAAU,QAAQ;IAChD,8BAA8B,UAAU,SAAS;IACjD,8BAA8B,UAAU,kBAAkB;;IAE1D,OAAO;;IAEP,SAAS,8BAA8B,MAAM;MAC3C,IAAI,QAAQ;MACZ,IAAI,WAAW;QACb;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;;MAGF,MAAM,OAAO;MACb,MAAM,QAAQ;;MAEd,MAAM,aAAa;MACnB,MAAM,cAAc;MACpB,MAAM,uBAAuB;MAC7B,MAAM,aAAa;MACnB,MAAM,cAAc;;MAEpB,MAAM,UAAU;;MAEhB,QAAQ,QAAQ,UAAU,SAAS,UAAU;QAC3C,MAAM,WAAW,YAAY;QAC7B,MAAM,YAAY,YAAY;QAC9B,MAAM,qBAAqB,YAAY;QACvC,MAAM,WAAW,YAAY;QAC7B,MAAM,YAAY,YAAY;QAC9B,MAAM,MAAM,YAAY;UACtB,SAAS;UACT,SAAS;;;;;IAKf,SAAS,MAAM,QAAQ,UAAU;MAC/B,IAAI,QAAQ;;MAEZ,MAAM,WAAW,QAAQ,KAAK;;;IAGhC,SAAS,OAAO,QAAQ,UAAU;MAChC,IAAI,QAAQ;;MAEZ,MAAM,YAAY,QAAQ,KAAK;;;IAGjC,SAAS,cAAc,QAAQ,UAAU;MACvC,IAAI,QAAQ;;MAEZ,MAAM,YAAY,QAAQ,KAAK;;;IAGjC,SAAS,aAAa,QAAQ,UAAU;MACtC,IAAI,QAAQ;;MAEZ,MAAM,WAAW,QAAQ,KAAK;;;IAGhC,SAAS,gBAAgB,QAAQ,UAAU;MACzC,IAAI,QAAQ;;MAEZ,MAAM,qBAAqB,QAAQ,KAAK;;;;;AAK9C;ACzFA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,wBAAwB;;EAEjC,SAAS;IACP;IACA;IACA;IACA;IACA;;IAEA,OAAO;MACL,QAAQ;;;IAGV,SAAS,4BAA4B,QAAQ;MAC3C,OAAO,IAAI,qBAAqB;;;IAGlC,SAAS,qBAAqB,QAAQ;MACpC,IAAI,QAAQ;MACZ,IAAI,UAAU,OAAO,WAAW;MAChC,OAAO,UAAU;MACjB,QAAQ,MAAM,OAAO,QAAQ,OAAO;MACpC,QAAQ,MAAM,OAAO,QAAQ,OAAO;;MAEpC,MAAM,SAAS;QACb,KAAK;QACL,KAAK;;;MAGP,IAAI,OAAO,OAAO,SAAS;QACzB,OAAO,KAAK;aACP,IAAI,OAAO,OAAO,OAAO;QAC9B,OAAO,KAAK;UACV,UAAU,QAAQ;UAClB,UAAU,QAAQ;;aAEf,IAAI,QAAQ,SAAS,OAAO,KAAK;QACtC,IAAI,CAAC,QAAQ,WAAW,OAAO,GAAG,WAAW;UAC3C,OAAO,GAAG,WAAW,QAAQ;;aAE1B;QACL,OAAO,KAAK;UACV,UAAU,QAAQ;UAClB,UAAU,QAAQ,SAAS,KAAK,MAAM;;;;MAI1C,QAAQ,QAAQ,OAAO,eAAe,SAAS,YAAY,UAAU;QACnE,IAAI,gBAAgB,yBAAyB,OAAO,YAAY,UAAU,OAAO;QACjF,OAAO,cAAc,YAAY;QACjC,IAAI,cAAc,aAAa,MAAM;UACnC,QAAQ,IAAI,KAAK;UACjB,IAAI,cAAc,SAAS,UAAU;YACnC,QAAQ,IAAI,KAAK;;;;;MAKvB,QAAQ,OAAO,OAAO;;MAEtB,IAAI,QAAQ,IAAI,SAAS,GAAG;QAC1B,MAAM,OAAO,IAAI,UAAU,QAAQ;;;MAGrC,IAAI,QAAQ,IAAI,SAAS,GAAG;QAC1B,MAAM,OAAO,IAAI,UAAU,QAAQ;;;;;;;AAM3C;AC3EA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,4BAA4B;;EAErC,SAAS,gCAAgC,MAAM,WAAW;;IAExD,OAAO;MACL,QAAQ;;;IAGV,SAAS,gCAAgC,YAAY,UAAU,MAAM;MACnE,OAAO,IAAI,yBAAyB,YAAY,UAAU;;;IAG5D,SAAS,yBAAyB,YAAY,UAAU,MAAM;MAC5D,IAAI,QAAQ;;MAEZ,IAAI,QAAQ,SAAS,aAAa;QAChC,MAAM,QAAQ,UAAU,OAAO;QAC/B,MAAM,OAAO;QACb,MAAM,cAAc;QACpB,MAAM,aAAa;aACd;QACL,IAAI,WAAW,SAAS,WAAW;UACjC,KAAK,MAAM,mCAAmC,YAAY;;;QAG5D,IAAI,WAAW,SAAS,aAAa,WAAW,SAAS,UAAU;UACjE,KAAK,MAAM,oCAAoC,WAAW,MAAM;;;QAGlE,MAAM,QAAQ,WAAW,SAAS,UAAU,OAAO;QACnD,MAAM,OAAO,WAAW;QACxB,MAAM,cAAc,WAAW,eAAe;;QAE9C,IAAI,WAAW,eAAe,WAAW;UACvC,MAAM,aAAa,MAAM,SAAS,YAAY,UAAU,SAAS,QAAQ;eACpE;UACL,MAAM,aAAa,WAAW;;;QAGhC,MAAM,WAAW,WAAW,YAAY;;;;;;;AAMhD;ACjDA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,0BAA0B;;EAEnC,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,uBAAuB,UAAU,MAAM;IACvC,uBAAuB,UAAU,MAAM;IACvC,uBAAuB,UAAU,SAAS;IAC1C,uBAAuB,UAAU,aAAa;;IAE9C,uBAAuB,UAAU,aAAa;;IAE9C,OAAO;MACL,QAAQ;;;IAGV,SAAS,8BAA8B,QAAQ,cAAc;MAC3D,OAAO,IAAI,uBAAuB,QAAQ;;;;;;;;IAQ5C,SAAS,uBAAuB,QAAQ,cAAc;MACpD,IAAI,QAAQ;MACZ,IAAI,SAAS;QACX,QAAQ;;;MAGV,MAAM,SAAS,qBAAqB,OAAO;MAC3C,MAAM,QAAQ,4BAA4B,OAAO;;MAEjD,MAAM,eAAe;MACrB,MAAM,aAAa,WAAW;;MAE9B,MAAM,eAAe,oBAAoB;QACvC,MAAM;QACN;;;MAGF,MAAM,cAAc;MACpB,MAAM,OAAO,MAAM,OAAO;;MAE1B,aAAa,WAAW;;MAExB,MAAM,aAAa,YAAY,QAAQ,KAAK,SAAS,QAAQ;;MAE7D,SAAS,QAAQ,UAAU;QACzB,WAAW,MAAM,oBAAoB,MAAM,OAAO,kBAAkB,YAAY;QAChF,MAAM,MAAM,SAAS,SAAS;QAC9B,MAAM,cAAc;;QAEpB,SAAS;;;MAGX,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,OAAO,kBAAkB,YAAY;QAChF,SAAS;QACT,MAAM,cAAc;;;MAGtB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,OAAO,kBAAkB,UAAU;;;;;;;;;IASlF,SAAS,IAAI,IAAI,QAAQ;MACvB,IAAI,QAAQ;;MAEZ,IAAI,CAAC,MAAM,OAAO,GAAG,SAAS,KAAK;QACjC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,YAAY;;;MAGrD,IAAI,SAAS,MAAM,MAAM,IAAI;;MAE7B,OAAO,UAAU,OAAO,QAAQ;;MAEhC,OAAO;;;;;;;;IAQT,SAAS,IAAI,QAAQ;MACnB,IAAI,QAAQ;MACZ,SAAS,QAAQ,OAAO,IAAI,MAAM,OAAO,OAAO,KAAK;;MAErD,IAAI,aAAa,yBAAyB;QACxC;QACA;;;MAGF,WAAW,UAAU,WAAW;;MAEhC,OAAO;;;;;;;;;IAST,SAAS,OAAO,IAAI;MAClB,IAAI,QAAQ;MACZ,IAAI,SAAS,MAAM,MAAM,OAAO;;MAEhC,OAAO,OAAO;;;;;;;IAOhB,SAAS,aAAa;MACpB,IAAI,QAAQ;MACZ,IAAI,gBAAgB;;MAEpB,QAAQ,QAAQ,MAAM,OAAO,eAAe,SAAS,oBAAoB,kBAAkB;QACzF,IAAI,mBAAmB,SAAS,UAAU;UACxC,cAAc,oBAAoB;YAChC,MAAM;;eAEH,IAAI,mBAAmB,SAAS,WAAW;UAChD,cAAc,oBAAoB;YAChC,MAAM;;;;;MAKZ,IAAI,OAAO;QACT,MAAM,MAAM;QACZ,IAAI,MAAM,OAAO,GAAG;QACpB,YAAY;QACZ,eAAe;;;MAGjB,IAAI,SAAS;QACX,KAAK;QACL,cAAc;QACd,QAAQ;QACR,UAAU;QACV,gBAAgB;;;MAGlB,IAAI,SAAS,MAAM,aAAa,MAAM;;MAEtC,WAAW,MAAM,oBAAoB,MAAM,OAAO,wBAAwB,YAAY;;MAEtF,OAAO;;;;;;;IAOT,SAAS,aAAa;MACpB,IAAI,QAAQ;MACZ,IAAI,WAAW,GAAG;MAClB,IAAI,SAAS;QACX,QAAQ;;;MAGV,MAAM,MAAM;;MAEZ,MAAM,aAAa,YAAY,QAAQ,KAAK,SAAS,QAAQ;;MAE7D,OAAO;;MAEP,SAAS,QAAQ,UAAU;QACzB,WAAW,MAAM,oBAAoB,MAAM,OAAO,wBAAwB,YAAY;QACtF,SAAS;;QAET,SAAS,QAAQ;;;MAGnB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,OAAO,wBAAwB,YAAY;QACtF,SAAS;;QAET,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,OAAO,wBAAwB,UAAU;;QAEpF,SAAS,OAAO;;;;;;AAKxB;AClNA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,uBAAuB;;EAEhC,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;;IAEA,OAAO;MACL,cAAc;;;IAGhB,SAAS,mBAAmB,WAAW,UAAU;MAC/C,IAAI,kBAAkB,UAAU,OAAO,UAAU,MAAM;;MAEvD,IAAI,QAAQ,cAAc,iBAAiB,SAAS,MAAM,QAAQ,WAAW;QAC3E,IAAI,QAAQ;;QAEZ,IAAI,KAAK,SAAS,MAAM,OAAO,MAAM;UACnC,KAAK,MAAM,6CAA6C,KAAK,MAAM,gBAAgB,MAAM,OAAO;;;QAGlG,4BAA4B,KAAK,OAAO,MAAM,QAAQ;;QAEtD,MAAM,KAAK,SAAS;;;MAGtB,MAAM,YAAY,OAAO,OAAO,4BAA4B;MAC5D,MAAM,UAAU,cAAc;;MAE9B,MAAM,UAAU,SAAS;MACzB,MAAM,UAAU,WAAW;MAC3B,MAAM,UAAU,cAAc,SAAS,aAAa,YAAY,KAAK,SAAS;;MAE9E,QAAQ,QAAQ,UAAU,WAAW,SAAS,cAAc,kBAAkB;QAC5E,MAAM,UAAU,oBAAoB,WAAW;UAC7C,OAAO,aAAa,MAAM,MAAM;;;;MAIpC,OAAO;;MAEP,SAAS,aAAa,MAAM,WAAW,OAAO;QAC5C,OAAO,IAAI,MAAM,MAAM,WAAW;;;;;;AAK1C;ACtDA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,QAAQ,4BAA4B;;EAErC,SAAS;IACP;IACA;IACA;IACA;IACA;IACA;;IAEA,yBAAyB,UAAU,QAAQ;IAC3C,yBAAyB,UAAU,UAAU;IAC7C,yBAAyB,UAAU,MAAM;IACzC,yBAAyB,UAAU,YAAY;;IAE/C,OAAO;MACL,QAAQ;;;IAGV,SAAS,gCAAgC,UAAU,QAAQ;MACzD,OAAO,IAAI,yBAAyB,UAAU;;;;;;;;IAQhD,SAAS,yBAAyB,UAAU,QAAQ;MAClD,IAAI,QAAQ;;MAEZ,MAAM,WAAW;MACjB,MAAM,OAAO,SAAS,OAAO;MAC7B,MAAM,SAAS,UAAU;;MAEzB,MAAM,SAAS;QACb,iBAAiB,iCAAiC;UAChD;UACA;UACA;;;;MAIJ,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM;;MAE9C,MAAM,UAAU;MAChB,MAAM,eAAe;MACrB,MAAM,eAAe;MACrB,MAAM,WAAW,MAAM,SAAS;;MAEhC,MAAM,UAAU,GAAG,QAAQ;;MAE3B,IAAI,iBAAiB,WAAW,IAAI,oBAAoB,MAAM,OAAO,kBAAkB;MACvF,IAAI,iBAAiB,WAAW,IAAI,oBAAoB,MAAM,OAAO,wBAAwB;MAC7F,IAAI,cAAc,WAAW,IAAI,oBAAoB,MAAM,OAAO,eAAe;;MAEjF,WAAW,IAAI,YAAY;;MAE3B,SAAS,OAAO,OAAO,QAAQ,QAAQ;QACrC,IAAI;;QAEJ,IAAI,WAAW,cAAc,MAAM,SAAS,WAAW;UACrD,QAAQ,MAAM,KAAK,QAAQ;UAC3B,IAAI,QAAQ,CAAC,GAAG;YACd,MAAM,KAAK,OAAO,OAAO;YACzB,MAAM,SAAS,MAAM,YAAY,MAAM;;;;;MAK7C,SAAS,QAAQ;QACf,MAAM,OAAO;QACb,MAAM,WAAW;;;MAGnB,SAAS,IAAI,OAAO,QAAQ,QAAQ;QAClC,IAAI,WAAW,YAAY;UACzB,MAAM,OAAO,MAAM,QAAQ;UAC3B,MAAM,KAAK,KAAK;;;;MAIpB,SAAS,gBAAgB;QACvB;QACA;QACA;;;;;;;;IAQJ,SAAS,YAAY;MACnB,IAAI,QAAQ;MACZ,IAAI,SAAS;;MAEb,QAAQ,QAAQ,MAAM,QAAQ,SAAS,OAAO;QAC5C,SAAS,MAAM,eAAe;;;MAGhC,OAAO;;;;;;;;IAQT,SAAS,IAAI,IAAI,QAAQ;MACvB,IAAI,QAAQ;;MAEZ,OAAO,MAAM,SAAS,IAAI,IAAI;;;;;;;IAOhC,SAAS,QAAQ;MACf,IAAI,QAAQ;MACZ,IAAI,WAAW,GAAG;MAClB,IAAI,WAAW,UAAU,IAAI;MAC7B,IAAI,SAAS;QACX,QAAQ;QACR,QAAQ,MAAM;;;MAGhB,0BAA0B;;MAE1B,QAAQ,QAAQ,MAAM,MAAM;;MAE5B,MAAM,SAAS,aAAa,YAAY;SACrC,KAAK,SAAS,QAAQ;SACtB,QAAQ,0BAA0B,KAAK,OAAO;;MAEjD,OAAO,SAAS;;MAEhB,SAAS,QAAQ,UAAU;QACzB,IAAI,UAAU,SAAS,iBAAiB,SAAS;QACjD,WAAW,MAAM,oBAAoB,MAAM,OAAO,qBAAqB,YAAY,OAAO;QAC1F,GAAG,WAAW,QAAQ,SAAS,IAAI,sBAAsB,KAAK,iBAAiB,SAAS;;QAExF,QAAQ,QAAQ,MAAM,MAAM;;QAE5B,MAAM,OAAO,QAAQ;QACrB,MAAM,QAAQ,SAAS,KAAK;;QAE5B,MAAM,YAAY,KAAK;QACvB,MAAM,eAAe;QACrB,MAAM,WAAW;;QAEjB,MAAM,SAAS,MAAM,YAAY,MAAM;QACvC,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;;QAE7C,SAAS,oBAAoB,QAAQ;UACnC,0BAA0B;;UAE1B,OAAO,OAAO,YAAY;YACxB,QAAQ;YACR,QAAQ;aACP,QAAQ,0BAA0B,KAAK,QAAQ;;;QAGpD,SAAS,gBAAgB,kBAAkB;UACzC,QAAQ,QAAQ,kBAAkB,SAAS,WAAW,KAAK;YACzD,IAAI,UAAU,YAAY,MAAM;cAC9B,WAAW,MAAM,oBAAoB,QAAQ,SAAS,KAAK,KAAK,OAAO,mBAAmB,YAAY,QAAQ,SAAS,MAAM;;cAE7H,UAAU,MAAM;;;;UAIpB,SAAS,QAAQ,SAAS,KAAK;;;;MAInC,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,OAAO,qBAAqB,YAAY,OAAO;;QAE1F,QAAQ,QAAQ,MAAM,MAAM;QAC5B,SAAS;QACT,MAAM,OAAO,gBAAgB,OAAO,SAAS;QAC7C,SAAS,OAAO;;;MAGlB,SAAS,OAAO,UAAU;QACxB,WAAW,MAAM,oBAAoB,MAAM,OAAO,qBAAqB,UAAU,OAAO;;QAExF,SAAS,OAAO;;;;;;EAKtB,SAAS,0BAA0B,QAAQ;IACzC,SAAS,WAAW,YAAY,OAAO;IACvC,OAAO,gBAAgB;IACvB,OAAO,UAAU;;;EAGnB,SAAS,0BAA0B,QAAQ;IACzC,SAAS,WAAW,YAAY,OAAO;IACvC,OAAO,gBAAgB;IACvB,OAAO,UAAU,OAAO,eAAe;;;AAG3C;ACnNA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,SAAS,YAAY;;EAEtB,SAAS,gBAAgB,YAAY;IACnC,IAAI,SAAS;IACb,IAAI,QAAQ;IACZ,KAAK,OAAO;;IAEZ,SAAS;MACP;MACA;MACA;MACA;MACA,OAAO;QACL,aAAa;QACb,aAAa;QACb,YAAY;QACZ,cAAc;QACd,eAAe;QACf,cAAc;QACd,oBAAoB;;QAEpB,kBAAkB;;;MAGpB,SAAS,YAAY,QAAQ,cAAc;QACzC,IAAI,WAAW,uBAAuB,OAAO,QAAQ;;QAErD,OAAO,OAAO,QAAQ;QACtB,MAAM,KAAK,OAAO;;;MAGpB,SAAS,YAAY,MAAM;QACzB,OAAO,OAAO;;;MAGhB,SAAS,eAAe;QACtB,OAAO;;;MAGT,SAAS,gBAAgB;QACvB,OAAO;;;MAGT,SAAS,aAAa;QACpB,QAAQ,QAAQ,QAAQ,SAAS,UAAU;UACzC,SAAS;;;;MAIb,SAAS,aAAa,MAAM,WAAW;QACrC,IAAI,CAAC,QAAQ,SAAS,OAAO;UAC3B,KAAK,MAAM,kCAAkC;UAC7C;eACK,IAAI,WAAW,WAAW,UAAU,WAAW;UACpD,KAAK,KAAK,yBAAyB;;;QAGrC,WAAW,WAAW,QAAQ;;;MAGhC,SAAS,iBAAiB,SAAS;QACjC,IAAI,UAAU;UACZ,MAAM;UACN,UAAU;;;QAGZ,IAAI,YAAY,WAAW;UACzB,KAAK,MAAM,4BAA4B;UACvC;;;QAGF,IAAI,SAAS;UACX,KAAK;UACL,cAAc;UACd,QAAQ;UACR,UAAU;UACV,gBAAgB;;;QAGlB,QAAQ,QAAQ,QAAQ,UAAU,SAAS,MAAM;UAC/C,QAAQ,SAAS,KAAK,YAAY,KAAK,MAAM,MAAM,YAAY,MAAM;;;QAGvE,IAAI,QAAQ,QAAQ,QAAQ,OAAO;UACjC,QAAQ,QAAQ,QAAQ,MAAM,SAAS,MAAM;YAC3C,QAAQ,KAAK,KAAK,YAAY,KAAK,MAAM,MAAM,YAAY,MAAM;;eAE9D,IAAI,QAAQ,SAAS,WAAW;UACrC,QAAQ,KAAK,KAAK,YAAY,QAAQ,KAAK,MAAM,MAAM,YAAY,QAAQ,MAAM;;;QAGnF,OAAO;;;;;;;;;AAOf;ACtGA,CAAC,WAAW;EACV;;EAEA,QAAQ,OAAO;GACd,wBAAO,SAAS,cAAc;IAC7B,aAAa,aAAa;;GAE3B,yBAAI,SAAS,YAAY,IAAI;IAC5B,WAAW,UAAU;;;AAGzB","file":"angular-jsonapi.js","sourcesContent":["(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper);\n\n function AngularJsonAPISourceRestWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n toKebabCase,\n $q,\n $http\n ) {\n\n AngularJsonAPISourceRest.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceRest.prototype.constructor = AngularJsonAPISourceRest;\n\n return {\n create: AngularJsonAPISourceRestFactory,\n encodeParams: encodeParams,\n decodeParams: decodeParams\n };\n\n function AngularJsonAPISourceRestFactory(name, url) {\n return new AngularJsonAPISourceRest(name, url);\n }\n\n function AngularJsonAPISourceRest(name, url) {\n var _this = this;\n var headers = { // jscs:disable disallowQuotedKeysInObjects\n 'Accept': 'application/vnd.api+json',\n 'Content-Type': 'application/vnd.api+json'\n }; // jscs:enable disallowQuotedKeysInObjects\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('unlink', unlink);\n _this.synchronization('link', link);\n _this.synchronization('update', update);\n _this.synchronization('add', add);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'all'));\n }\n\n function get(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url + '/' + config.object.data.id,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'get'));\n }\n\n function remove(config) {\n return $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'remove'));\n }\n\n function unlink(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Object has been removed', _this, 0, 'unlink'));\n } else if (config.target !== undefined && config.target.data.id === undefined) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Can\\'t unlink object without id through rest call', _this, 0, 'unlink'));\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'get')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n if (config.target === undefined) {\n $http({\n method: 'PATCH',\n headers: headers,\n data: {data: []},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n } else {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key + '/' + config.target.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n }\n }\n\n return deferred.promise;\n }\n\n function link(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject({errors: [{status: 0, statusText: 'Object has been removed'}]});\n } else if (config.target === undefined || config.target.data.id === undefined) {\n deferred.reject({errors: [{status: 0, statusText: 'Can\\'t link object without id through rest call'}]});\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'PATCH',\n headers: headers,\n data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n $http({\n method: 'POST',\n headers: headers,\n data: {data: [AngularJsonAPIModelLinkerService.toLinkData(config.target)]},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n }\n\n return deferred.promise;\n }\n\n function update(config) {\n return $http({\n method: 'PATCH',\n headers: headers,\n url: url + '/' + config.object.data.id,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'update'));\n }\n\n function add(config) {\n return $http({\n method: 'POST',\n headers: headers,\n url: url,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'add'));\n }\n\n function resolveHttp(response) {\n return $q.resolve(response.data);\n }\n\n function rejectHttp(action, response) {\n var deferred = $q.defer();\n\n if (response.status === 0) {\n $http({\n method: 'GET',\n url: 'https://status.cloud.google.com/incidents.schema.json'\n }).then(rejectServerOffline, rejectNoConnection);\n } else {\n deferred.reject(AngularJsonAPIModelSourceError.create(response.statusText, _this, response.status, action));\n }\n\n return deferred.promise;\n\n function rejectServerOffline(response) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Server is offline', _this, response.status, action));\n }\n\n function rejectNoConnection() {\n deferred.reject(AngularJsonAPIModelSourceError.create('No internet connection', _this, response.status, action));\n }\n }\n }\n\n function encodeParams(params) {\n var encodedParams = {};\n\n if (params === undefined) {\n return {};\n }\n\n angular.forEach(params, function(paramValue, paramKey) {\n if (angular.isArray(paramValue)) {\n encodedParams[paramKey] = encodeValue(paramValue);\n } else if (angular.isObject(paramValue)) {\n angular.forEach(paramValue, function(paramInnerValue, paramInnerKey) {\n encodedParams[paramKey + '[' + paramInnerKey + ']'] = encodeValue(paramInnerValue);\n });\n } else {\n encodedParams[paramKey] = paramValue;\n }\n });\n\n return encodedParams;\n\n function encodeValue(argument) {\n if (angular.isArray(argument)) {\n return argument.join(',');\n } else {\n return argument;\n }\n }\n }\n\n function decodeParams(params) {\n var decodedParams = {};\n\n angular.forEach(params, function(value, key) {\n var objectKeyStart = key.indexOf('[');\n value = value.split(',');\n\n if (objectKeyStart > -1) {\n var objectKey = key.substr(0, objectKeyStart);\n var objectElementKey = key.substr(objectKeyStart + 1, key.indexOf(']') - objectKeyStart - 1);\n\n decodedParams[objectKey] = decodedParams[objectKey] || {};\n decodedParams[objectKey][objectElementKey] = value;\n } else {\n decodedParams[key] = value;\n }\n });\n\n return decodedParams;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceRest) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceRest = AngularJsonAPISourceRest;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n /* global Parse: false */\n angular.module('angular-jsonapi-parse', ['angular-jsonapi'])\n .constant('Parse', Parse);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper);\n\n function AngularJsonAPISourceParseWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n pluralize,\n Parse,\n $log,\n $q\n ) {\n\n AngularJsonAPISourceParse.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceParse.prototype.constructor = AngularJsonAPISourceParse;\n AngularJsonAPISourceParse.prototype.initialize = initialize;\n\n return {\n create: AngularJsonAPISourceParseFactory\n };\n\n function AngularJsonAPISourceParseFactory(name, table) {\n return new AngularJsonAPISourceParse(name, table);\n }\n\n function AngularJsonAPISourceParse(name, table) {\n var _this = this;\n\n _this.ParseObject = Parse.Object.extend(table);\n _this.type = pluralize(table).charAt(0).toLowerCase() + pluralize(table).slice(1);\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('update', update);\n _this.synchronization('add', update);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n var query = new Parse.Query(_this.ParseObject);\n\n if (config.params.limit !== undefined) {\n query.limit(config.params.limit);\n }\n\n angular.forEach(config.params.filter, function(filter) {\n query.equalTo(filter.key, filter.value);\n });\n\n return query.find().then(resolveParse, rejectParse.bind(null, 'all'));\n }\n\n function get(config) {\n var query = new Parse.Query(_this.ParseObject);\n return query.get(config.object.data.id).then(resolveParse, rejectParse.bind(null, 'get'));\n }\n\n function remove(config) {\n var object = new _this.ParseObject();\n object.set('id', config.object.data.id);\n return object.destroy().then(resolveParse, rejectParse.bind(null, 'remove'));\n }\n\n function update(config) {\n var object = toParseObject(config.object);\n return object.save(null).then(resolveParse, rejectParse.bind(null, 'update'));\n }\n\n function toParseObject(object) {\n var parseObject = new _this.ParseObject();\n angular.forEach(object.form.data.attributes, function(attribute, key) {\n parseObject.set(key, attribute);\n });\n\n angular.forEach(object.schema.relationships, function(relationship, key) {\n if (relationship.type === 'hasOne'\n && object.form.data.relationships[key].data !== null\n && object.form.data.relationships[key].data !== undefined\n ) {\n var table = pluralize(key, 1).charAt(0).toUpperCase() + pluralize(key, 1).slice(1);\n var parsePointer = new (Parse.Object.extend(table))();\n parsePointer.set('id', object.form.data.relationships[key].data.id);\n parseObject.set(key, parsePointer);\n }\n });\n\n return parseObject;\n }\n\n function fromParseObject(object) {\n var relationships = _this.synchronizer.resource.schema.relationships;\n object.type = _this.type;\n object.relationships = object.relationships || [];\n angular.forEach(relationships, function(relationship, key) {\n if (object.attributes[key] && relationship.type === 'hasOne') {\n object.relationships[key] = {\n data: {\n type: relationship.model,\n id: object.attributes[key].id\n }\n };\n }\n });\n\n return object;\n }\n\n function resolveParse(response) {\n if (angular.isArray(response)) {\n angular.forEach(response, function(elem, key) {\n response[key] = fromParseObject(elem);\n });\n } else if (angular.isObject(response)) {\n response = fromParseObject(response);\n }\n\n return $q.resolve({\n data: response\n });\n }\n\n function rejectParse(action, response) {\n $log.error('Parse error for', action, response);\n return $q.reject(response);\n }\n }\n\n function initialize(appId, jsKey) {\n Parse.initialize(appId, jsKey);\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceParse) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceParse;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper);\n\n function AngularJsonAPISourceLocalWrapper(\n AngularJsonAPISourcePrototype,\n $window,\n $q\n ) {\n var size = {\n max: 0,\n all: 0,\n limit: 5200000,\n list: {}\n };\n\n AngularJsonAPISourceLocal.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceLocal.prototype.constructor = AngularJsonAPISourceLocal;\n\n return {\n create: AngularJsonAPISourceLocalFactory,\n size: size\n };\n\n function AngularJsonAPISourceLocalFactory(name, prefix) {\n return new AngularJsonAPISourceLocal(name, prefix);\n }\n\n function AngularJsonAPISourceLocal(name, prefix) {\n var _this = this;\n\n prefix = prefix || 'AngularJsonAPI';\n\n _this.__updateStorage = updateStorage;\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('init', init);\n\n _this.begin('clearCache', clear);\n\n _this.finish('init', updateStorage);\n _this.finish('clearCache', updateStorage);\n _this.finish('remove', updateStorage);\n _this.finish('refresh', updateStorage);\n _this.finish('unlink', updateStorage);\n _this.finish('unlinkReflection', updateStorage);\n _this.finish('link', updateStorage);\n _this.finish('linkReflection', updateStorage);\n _this.finish('update', updateStorage);\n _this.finish('add', updateStorage);\n _this.finish('get', updateStorage);\n _this.finish('all', updateStorage);\n _this.finish('include', updateStorage);\n\n function init() {\n var type = _this.synchronizer.resource.schema.type;\n return $q.resolve($window.localStorage.getItem(prefix + '.' + type));\n }\n\n function clear() {\n var type = _this.synchronizer.resource.schema.type;\n var key = prefix + '.' + type;\n\n size.all -= size.list[key];\n delete size.list[key];\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.removeItem(key);\n }\n\n function updateStorage() {\n var type = _this.synchronizer.resource.schema.type;\n var cache = _this.synchronizer.resource.cache;\n var json = cache.toJson();\n var key = prefix + '.' + type;\n\n size.list[key] = size.list[key] === undefined ? 0 : size.list[key];\n size.all += json.length - size.list[key];\n size.list[key] = json.length;\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.setItem(key, json);\n }\n\n function objectMaxKey(object) {\n return Object.keys(object).reduce(function(m, k) {\n return object[k] > object[m] ? k : m;\n }, Object.keys(object)[0]);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceLocal) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceLocal;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi', ['uuid4'])\n /* global pluralize: false, validate: false */\n .constant('pluralize', pluralize)\n .constant('validateJS', validate);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper);\n\n function AngularJsonAPIResourceCacheWrapper(\n uuid4,\n $log\n ) {\n\n AngularJsonAPIResourceCache.prototype.get = get;\n AngularJsonAPIResourceCache.prototype.index = index;\n AngularJsonAPIResourceCache.prototype.setIndexIds = setIndexIds;\n AngularJsonAPIResourceCache.prototype.addOrUpdate = addOrUpdate;\n\n AngularJsonAPIResourceCache.prototype.fromJson = fromJson;\n AngularJsonAPIResourceCache.prototype.toJson = toJson;\n AngularJsonAPIResourceCache.prototype.clear = clear;\n\n AngularJsonAPIResourceCache.prototype.remove = remove;\n AngularJsonAPIResourceCache.prototype.revertRemove = revertRemove;\n AngularJsonAPIResourceCache.prototype.clearRemoved = clearRemoved;\n\n return {\n create: AngularJsonAPIResourceCacheFactory\n };\n\n function AngularJsonAPIResourceCacheFactory(resource) {\n return new AngularJsonAPIResourceCache(resource);\n }\n\n /**\n * Constructor\n */\n function AngularJsonAPIResourceCache(resource) {\n var _this = this;\n\n _this.resource = resource;\n _this.data = {};\n _this.removed = {};\n _this.size = 0;\n\n _this.indexIds = undefined;\n }\n\n /**\n * Add new model or update existing with data\n * @param {object} validatedData Data that are used to update or create an object, has to be valid\n * @return {AngularJsonAPIModel} Created model\n */\n function addOrUpdate(validatedData, config, updatedAt) {\n var _this = this;\n var id = validatedData.id;\n\n if (id === undefined) {\n $log.error('Can\\'t add data without id!', validatedData);\n return;\n }\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(validatedData, config, updatedAt);\n _this.size += 1;\n } else {\n _this.data[id].update(validatedData, !config.new, config.initialization);\n }\n\n return _this.data[id];\n }\n\n\n /**\n * Recreate object structure from json data\n * @param {json} json Json data\n * @return {undefined}\n */\n function fromJson(json) {\n var _this = this;\n var collection = angular.fromJson(json);\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: true\n };\n\n if (angular.isObject(collection) && collection.data !== undefined) {\n _this.updatedAt = collection.updatedAt;\n _this.indexIds = collection.indexIds;\n\n angular.forEach(collection.data, function(objectData) {\n var data = objectData.data;\n _this.addOrUpdate(data, config, objectData.updatedAt);\n });\n }\n }\n\n /**\n * Encodes memory into json format\n * @return {json} Json encoded memory\n */\n function toJson() {\n var _this = this;\n var json = {\n data: [],\n updatedAt: _this.updatedAt,\n indexIds: _this.indexIds\n };\n\n angular.forEach(_this.data, function(object) {\n if (object.hasErrors() === false) {\n json.data.push(object.toJson());\n }\n });\n\n return angular.toJson(json);\n }\n\n /**\n * Clear memory\n * @return {undefined}\n */\n function clear() {\n var _this = this;\n\n _this.indexIds = undefined;\n _this.data = {};\n _this.removed = {};\n }\n\n /**\n * Low level get used internally, does not run any synchronization\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function get(id) {\n var _this = this;\n\n var data = {\n id: id,\n type: _this.resource.schema.type\n };\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: true\n };\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(data, config);\n }\n\n return _this.data[id];\n }\n\n /**\n * Low level get used internally, does not run any synchronization, used for index requests\n * @param {objec} params\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function index(params) {\n var _this = this;\n params = params || {};\n\n if (_this.indexIds === undefined) {\n return _this.indexIds;\n }\n\n return _this.indexIds.map(_this.get.bind(_this)).filter(filter);\n\n function filter(argument) {\n var filterParams = params.filter;\n var valid = true;\n\n angular.forEach(filterParams, function(constraint) {\n valid = valid && argument.data.attributes[constraint.key] === constraint.value;\n });\n\n return valid;\n }\n }\n\n /**\n * Cache ids of objects returned by index request\n * @param {ids array or AngularJsonAPIModel array} array Objects or ids to be cached\n */\n function setIndexIds(array) {\n var _this = this;\n\n _this.indexIds = [];\n\n angular.forEach(array, function(element) {\n if (angular.isString(element) && _this.resource.schema.id.validate(element)) {\n _this.indexIds.push(element);\n } else if (angular.isObject(element) && _this.resource.schema.id.validate(element.data.id)) {\n _this.indexIds.push(element.data.id);\n }\n });\n }\n\n /**\n * Remove object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function remove(id) {\n var _this = this;\n\n if (_this.data[id] !== undefined) {\n _this.removed[id] = _this.data[id];\n delete _this.data[id];\n _this.size -= 1;\n }\n\n return _this.removed[id];\n }\n\n /**\n * Revert removal of an object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function revertRemove(id) {\n var _this = this;\n\n if (_this.removed[id] !== undefined) {\n _this.data[id] = _this.removed[id];\n delete _this.removed[id];\n _this.size += 1;\n }\n\n return _this.data[id];\n }\n\n /**\n * Clear removed object from memory\n * @param {uuid} id\n * @return {undefined}\n */\n function clearRemoved(id) {\n var _this = this;\n\n delete _this.removed[id];\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService);\n\n function AngularJsonAPIModelLinkerService($log) {\n var _this = this;\n\n _this.toLinkData = toLinkData;\n\n _this.link = link;\n _this.unlink = unlink;\n\n return this;\n\n /**\n * Extracts data needed for relationship linking from object\n * @param {AngularJsonAPIModel} object Object\n * @return {json} Link data\n */\n function toLinkData(object) {\n if (object === null) {\n return null;\n }\n\n return {type: object.data.type, id: object.data.id};\n }\n\n /**\n * Add target to object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function link(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t add link to non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (target === undefined) {\n $log.error('Can\\'t link non existing object', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema === undefined) {\n $log.error('Can\\'t add link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (target !== null && schema.polymorphic === false && schema.model !== target.data.type) {\n $log.error('This relation is not polymorphic, expected: ' + schema.model + ' instead of ' + target.data.type);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema.type === 'hasMany') {\n if (oneWay === true) {\n __addHasMany(object, key, target, form);\n return [];\n } else {\n return __processAddHasMany(object, key, target, form);\n }\n } else if (schema.type === 'hasOne') {\n if (oneWay === true) {\n __addHasOne(object, key, target, form);\n return [];\n } else {\n return __processAddHasOne(object, key, target, form);\n }\n }\n }\n\n /**\n * Remove target from object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function unlink(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t remove link from non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (schema === undefined) {\n $log.error('Can\\'t remove link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (oneWay === true) {\n __removeHasMany(object, key, target, form);\n return [];\n } else {\n return __processRemove(object, key, target, form);\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __processAddHasMany(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var reflectionSchema;\n\n if (reflectionKey === false) {\n __addHasMany(object, key, target, form);\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema === undefined) {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n } else if (reflectionSchema.type === 'hasOne') {\n return __swapResults(\n __wrapResults(object, key, target),\n __wrapResults(target, reflectionKey, object),\n __processAddHasOne(target, reflectionKey, object, form)\n );\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(object, key, target, form);\n __addHasMany(target, reflectionKey, object, form);\n return [__wrapResults(target, reflectionKey, object)];\n }\n }\n\n function __processAddHasOne(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var oldReflection = object.relationships[key];\n var reflectionSchema;\n var oldReflectionSchema;\n var result = [];\n\n __addHasOne(object, key, target, form);\n\n if (reflectionKey === false) {\n return [];\n }\n\n if (oldReflection !== undefined && oldReflection !== null) {\n oldReflectionSchema = oldReflection.schema.relationships[reflectionKey];\n\n if (oldReflectionSchema !== undefined) {\n if (oldReflectionSchema.type === 'hasOne') {\n __removeHasOne(oldReflection, reflectionKey, object, form);\n } else if (oldReflectionSchema.type === 'hasMany') {\n __removeHasMany(oldReflection, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(oldReflection, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n if (target !== undefined && target !== null && reflectionKey !== false) {\n reflectionSchema = target.schema.relationships[reflectionKey];\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __addHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(target, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(target, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n return result;\n }\n\n function __processRemove(object, key, target, form) {\n var schema = object.schema.relationships[key];\n var reflectionKey = schema.reflection;\n var reflectionSchema;\n\n if (schema.type === 'hasMany') {\n __removeHasMany(object, key, target, form);\n } else if (schema.type === 'hasOne') {\n __removeHasOne(object, key, target, form);\n }\n\n if (reflectionKey === false) {\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __removeHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __removeHasMany(target, reflectionKey, object, form);\n }\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n }\n\n return [__wrapResults(target, reflectionKey, object)];\n }\n\n function __addHasOne(object, key, target, form) {\n $log.debug('addHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n object.relationships[key] = target;\n object.data.relationships[key].data = toLinkData(target);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __addHasMany(object, key, target, form) {\n $log.debug('addHasMany', object, key, target);\n\n var linkData = toLinkData(target);\n if (form === true) {\n object = object.form;\n }\n\n if (angular.isArray(object.relationships[key]) && object.relationships[key].indexOf(target) > -1) {\n return false;\n }\n\n object.relationships[key] = object.relationships[key] || [];\n object.data.relationships[key].data = object.data.relationships[key].data || [];\n\n object.relationships[key].push(target);\n object.data.relationships[key].data.push(linkData);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasOne(object, key, target, form) {\n $log.debug('removeHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (target !== undefined && object.relationships[key] !== target) {\n return false;\n }\n\n object.relationships[key] = null;\n object.data.relationships[key].data = undefined;\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasMany(object, key, target, form) {\n $log.debug('removeHasMany', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (object.relationships[key] === undefined) {\n return;\n }\n\n if (target === undefined) {\n object.relationships[key] = [];\n object.data.relationships[key].data = [];\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n var index = object.relationships[key].indexOf(target);\n\n if (index === -1) {\n return false;\n }\n\n object.relationships[key].splice(index, 1);\n object.data.relationships[key].data.splice(index, 1);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __wrapResults(object, key, target) {\n return {\n object: object,\n key: key,\n target: target\n };\n }\n\n function __swapResults(value, newValue, array) {\n var index = -1;\n angular.forEach(array, function(item, i) {\n if (item.object === value.object && item.key === value.key && item.target === value.target) {\n index = i;\n }\n });\n\n if (index > -1) {\n array[index] = newValue;\n } else {\n array.push(newValue);\n }\n\n return array;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper);\n\n function AngularJsonAPIModelFormWrapper(\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelLinkerService,\n validateJS,\n $q\n ) {\n\n AngularJsonAPIModelForm.prototype.save = save;\n AngularJsonAPIModelForm.prototype.reset = reset;\n AngularJsonAPIModelForm.prototype.validate = validate;\n\n AngularJsonAPIModelForm.prototype.link = link;\n AngularJsonAPIModelForm.prototype.unlink = unlink;\n\n AngularJsonAPIModelForm.prototype.toJson = toJson;\n\n return {\n create: AngularJsonAPIModelFormFactory\n };\n\n function AngularJsonAPIModelFormFactory(parent) {\n return new AngularJsonAPIModelForm(parent);\n }\n\n function AngularJsonAPIModelForm(parent) {\n var _this = this;\n\n _this.data = {\n id: parent.data.id,\n type: parent.data.type,\n attributes: {},\n relationships: {}\n };\n\n _this.relationships = {};\n _this.parent = parent;\n _this.schema = parent.schema;\n _this.reset();\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = angular.copy(_this.data);\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data\n };\n }\n\n /**\n * Saves form, shortcut to parent.save()\n * @return {promise} Promise associated with synchronization\n */\n function save() {\n var _this = this;\n\n return _this.parent.save();\n }\n\n /**\n * Resets form to state of a parent\n * @return {undefined}\n */\n function reset(auto) {\n var _this = this;\n\n angular.forEach(_this.schema.relationships, function(data, key) {\n _this.data.relationships[key] = angular.copy(_this.parent.data.relationships[key]) || {};\n if (angular.isArray(_this.relationships[key])) {\n _this.relationships[key] = _this.parent.relationships[key].slice();\n } else {\n _this.relationships[key] = _this.parent.relationships[key];\n }\n });\n\n if (auto === true && _this.parent.synchronized === true) {\n return;\n }\n\n angular.forEach(_this.schema.attributes, function(validator, key) {\n _this.data.attributes[key] = angular.copy(_this.parent.data.attributes[key]);\n });\n\n _this.parent.errors.validation.clear();\n }\n\n /**\n * Validates form\n * @return {promise} Promise rejected to errors object indexed by keys. If the\n * key param i stated it only validates an attribute, else all attributes.\n */\n function validate(key) {\n var _this = this;\n var attributesWrapper;\n var constraintsWrapper;\n var deferred = $q.defer();\n\n if (key === undefined) {\n attributesWrapper = _this.data.attributes;\n constraintsWrapper = _this.schema.attributes;\n } else {\n attributesWrapper = {};\n constraintsWrapper = {};\n\n attributesWrapper[key] = _this.data.attributes[key];\n constraintsWrapper[key] = _this.schema.attributes[key];\n }\n\n validateJS.async(\n attributesWrapper,\n constraintsWrapper\n ).then(resolve, reject);\n\n function resolve() {\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n deferred.resolve();\n }\n\n function reject(errorsMap) {\n _this.parent.error = true;\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n angular.forEach(errorsMap, function(errors, attribute) {\n angular.forEach(errors, function(error) {\n _this.parent.errors.validation.add(attribute, AngularJsonAPIModelValidationError.create(error, attribute));\n });\n });\n\n deferred.reject(_this.parent.errors.validation);\n }\n\n return deferred.promise;\n }\n\n /**\n * Adds link to a form without synchronization\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function link(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.link(_this.parent, key, target, oneWay, true));\n }\n\n /**\n * Removes link from form without synchronization\n * @param {[type]} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function unlink(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true));\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper);\n\n function AngularJsonAPIAbstractModelWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelErrorsManager,\n AngularJsonAPIModelLinkerService,\n AngularJsonAPIModelForm,\n $rootScope,\n $injector,\n $log,\n $q\n ) {\n AngularJsonAPIAbstractModel.prototype.refresh = refresh;\n AngularJsonAPIAbstractModel.prototype.remove = remove;\n AngularJsonAPIAbstractModel.prototype.reset = reset;\n AngularJsonAPIAbstractModel.prototype.save = save;\n\n AngularJsonAPIAbstractModel.prototype.update = update;\n\n AngularJsonAPIAbstractModel.prototype.link = link;\n AngularJsonAPIAbstractModel.prototype.unlink = unlink;\n AngularJsonAPIAbstractModel.prototype.unlinkAll = unlinkAll;\n\n AngularJsonAPIAbstractModel.prototype.toJson = toJson;\n\n AngularJsonAPIAbstractModel.prototype.hasErrors = hasErrors;\n\n return AngularJsonAPIAbstractModel;\n\n /**\n * Constructor\n * @param {json} data Validated data used to create an object\n * @param {object} config Is object new (for form)\n */\n function AngularJsonAPIAbstractModel(data, config, updatedAt) {\n var _this = this;\n\n data.relationships = data.relationships || {};\n\n /**\n * Is not a new record\n * @type {Boolean}\n */\n _this.new = config.new === undefined ? false : config.new;\n\n /**\n * Is present on the server\n * @type {Boolean}\n */\n _this.stable = config.stable === undefined ? true : config.stable;\n\n /**\n * Has been synchronized with the server\n * @type {Boolean}\n */\n _this.synchronized = config.synchronized === undefined ? true : config.synchronized;\n\n /**\n * Has just been created by request and may not exist on the server\n * @type {Boolean}\n */\n _this.pristine = config.pristine === undefined ? true : config.pristine;\n\n _this.removed = false;\n _this.loading = false;\n _this.saving = false;\n _this.updatedAt = _this.synchronized === true ? Date.now() : updatedAt;\n\n _this.loadingCount = 0;\n _this.savingCount = 0;\n\n _this.data = {\n relationships: {},\n attributes: {}\n };\n _this.relationships = {};\n\n angular.forEach(_this.schema.relationships, function(schema, key) {\n _this.relationships[key] = undefined;\n });\n\n _this.errors = {\n validation: AngularJsonAPIModelErrorsManager.create(\n 'Validation',\n 'Errors of attributes validation',\n AngularJsonAPIModelValidationError\n ),\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.promise = $q.resolve(_this);\n\n __setData(_this, data);\n\n _this.form = AngularJsonAPIModelForm.create(_this);\n }\n\n /**\n * Saves model's form\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function save() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: _this.new === true ? 'add' : 'update',\n object: _this\n };\n\n _this.form.validate().then(\n synchronize,\n deferred.reject\n ).finally(__decrementSavingCounter.bind(_this, undefined));\n\n __incrementSavingCounter(_this);\n\n return deferred.promise;\n\n function synchronize() {\n _this.synchronize(config).then(resolve, reject, notify);\n }\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:' + config.action, 'resolved', _this, response);\n _this.update(response.data.data);\n\n if (_this.new === true) {\n _this.resource.cache.indexIds = _this.resource.cache.indexIds || [];\n _this.resource.cache.indexIds.push(_this.data.id);\n }\n\n _this.synchronized = true;\n _this.new = false;\n _this.pristine = false;\n _this.stable = true;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve(response.data.meta);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Reset object form\n * @return {undefined}\n */\n function reset() {\n var _this = this;\n\n if (_this.form !== undefined) {\n _this.form.reset();\n }\n }\n\n /**\n * Synchronize object with remote\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function refresh(params) {\n var $jsonapi = $injector.get('$jsonapi');\n var deferred = $q.defer();\n var _this = this;\n params = params === undefined ? _this.schema.params.get : params;\n\n var config = {\n action: 'refresh',\n object: _this,\n params: params\n };\n\n if (_this.new === true) {\n var error = AngularJsonAPIModelSourceError.create('Can\\'t refresh new object', null, 0, 'refresh');\n _this.errors.synchronization.add('refresh', error);\n deferred.reject(error);\n } else {\n __incrementLoadingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n _this.synchronized = true;\n _this.stable = true;\n _this.pristine = false;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = _this.data;\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data,\n updatedAt: _this.updatedAt\n };\n }\n\n /**\n * Remove object\n * @return {promise} Promise associated with synchronization that resolves to nothing\n */\n function remove() {\n var _this = this;\n var deferred = $q.defer();\n\n var config = {\n action: 'remove',\n object: _this\n };\n\n _this.resource.cache.remove(_this.data.id);\n\n if (_this.new === true) {\n deferred.resolve();\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'resolved', _this, response);\n _this.removed = true;\n _this.unlinkAll();\n _this.resource.cache.clearRemoved(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'rejected', _this, response);\n _this.resource.cache.revertRemove(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlink all reflection relationships of the object **without synchronization**\n * @return {boolean} Result\n */\n function unlinkAll(key) {\n var _this = this;\n var deferred = $q.defer();\n\n __incrementLoadingCounter(_this);\n\n if (key === undefined) {\n angular.forEach(_this.relationships, removeLink);\n } else {\n removeLink(_this.relationships[key], key);\n }\n\n __decrementLoadingCounter(_this);\n\n return deferred.promise;\n\n function removeLink(linksObj, key) {\n var schema = _this.schema.relationships[key];\n var reflectionKey = schema.reflection;\n\n if (angular.isArray(linksObj)) {\n angular.forEach(linksObj, removeReflectionLink.bind(undefined, reflectionKey));\n } else if (angular.isObject(linksObj)) {\n removeReflectionLink(reflectionKey, linksObj);\n }\n\n if (schema.type === 'hasOne') {\n _this.relationships[key] = null;\n } else if (schema.type === 'hasMany') {\n _this.relationships[key] = [];\n }\n }\n\n function removeReflectionLink(reflectionKey, target) {\n var reflectionSchema = target.schema.relationships[reflectionKey];\n var config = {\n action: 'unlinkReflection',\n object: target,\n target: _this,\n key: reflectionKey\n };\n\n __incrementLoadingCounter(target);\n AngularJsonAPIModelLinkerService.unlink(target, reflectionKey, _this, reflectionSchema);\n\n target.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(target, undefined));\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'resolve', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'notify', _this, response);\n\n response.finish();\n deferred.notify(response);\n }\n }\n }\n\n /**\n * Links object to relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {promise} Promise associated with synchronizations\n */\n function link(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'link',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link undefined', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link new object', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'linkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].object.data.type + ':object:linkReflection', 'resolved', targets[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlinks object from relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked if undefined unlinks all\n * @return {promise} Promise associated with synchronizations\n */\n function unlink(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'unlink',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink undefined', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink new object', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'unlinkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].data.type + ':object:unlinkReflection', 'resolved', targets[key], operation);\n response.value.finish();\n }\n });\n\n deferred.resolve();\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Sets object state to data\n * @param {object} validatedData JsonAPI object with data\n * @return {bool} Result\n */\n function update(validatedData, auto, initialization) {\n var _this = this;\n\n __incrementLoadingCounter(_this);\n\n __setData(_this, validatedData);\n _this.reset(auto);\n _this.synchronized = initialization === true ? false : true;\n _this.stable = initialization === true ? false : true;\n _this.updatedAt = Date.now();\n\n __decrementLoadingCounter(_this);\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /////////////\n // PRIVATE //\n /////////////\n\n /**\n * Low level set data function, use only with validated data\n * @param {AngularJsonAPIModel} object object to be modified\n * @param {object} validatedData Validated data\n * @return {boolean} Status\n */\n function __setData(object, validatedData) {\n\n var $jsonapi = $injector.get('$jsonapi');\n var schema = object.schema;\n\n object.data.id = validatedData.id;\n object.data.type = validatedData.type;\n\n if (object.resource.schema.type !== validatedData.type) {\n $log.error('Different type then resource', object.resource.schema.type, validatedData);\n return false;\n }\n\n if (!object.schema.id.validate(object.data.id)) {\n $log.error('Invalid id');\n return false;\n }\n\n object.data.links = validatedData.links;\n validatedData.attributes = validatedData.attributes || {};\n validatedData.relationships = validatedData.relationships || {};\n\n angular.forEach(schema.attributes, setAttributes);\n angular.forEach(schema.relationships, setRelationships);\n\n return true;\n\n function setAttributes(validators, key) {\n object.data.attributes[key] = validatedData.attributes[key];\n }\n\n function setRelationships(schema, key) {\n var relationshipData = validatedData.relationships[key];\n\n if (relationshipData === undefined) {\n if (object.data.relationships[key] === undefined) {\n object.data.relationships[key] = {data: undefined};\n }\n\n return;\n }\n\n object.data.relationships[key] = object.data.relationships[key] || {};\n object.data.relationships[key].links = relationshipData.links;\n\n if (schema.type === 'hasOne') {\n linkOne(object, key, relationshipData.data);\n } else if (schema.type === 'hasMany') {\n if (angular.isArray(relationshipData.data)) {\n if (relationshipData.data.length === 0) {\n object.data.relationships[key].data = [];\n object.unlinkAll(key);\n } else {\n angular.forEach(\n object.relationships[key],\n unlinkOne.bind(undefined, object, key, relationshipData.data)\n );\n angular.forEach(\n relationshipData.data,\n linkOne.bind(undefined, object, key)\n );\n }\n }\n }\n }\n\n function linkOne(object, key, data) {\n var resource;\n\n if (data === null) {\n AngularJsonAPIModelLinkerService.link(object, key, null);\n return;\n }\n\n if (data === undefined) {\n return;\n }\n\n resource = $jsonapi.getResource(data.type);\n\n if (resource === undefined) {\n $log.error('Factory not found', data.type, data);\n return;\n }\n\n var target = resource.cache.get(data.id);\n\n AngularJsonAPIModelLinkerService.link(object, key, target);\n }\n\n function unlinkOne(object, key, relationshipData, target) {\n if (relationshipData.indexOf(target.data.id) > -1) {\n return;\n }\n\n AngularJsonAPIModelLinkerService.unlink(object, key, target);\n }\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n\n function __incrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount += 1;\n object.saving = true;\n }\n\n function __decrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount -= 1;\n object.saving = object.savingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelValidationError', AngularJsonAPIModelValidationErrorWrapper);\n\n function AngularJsonAPIModelValidationErrorWrapper() {\n ValidationError.prototype = Object.create(Error.prototype);\n ValidationError.prototype.constructor = ValidationError;\n ValidationError.prototype.name = 'ValidationError';\n\n return {\n create: ValidationErrorFactory\n };\n\n function ValidationErrorFactory(message, attribute) {\n return new ValidationError(message, attribute);\n }\n\n function ValidationError(message, attribute) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n attribute: attribute\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelSourceError', AngularJsonAPIModelSourceErrorWrapper);\n\n function AngularJsonAPIModelSourceErrorWrapper() {\n SourceError.prototype = Object.create(Error.prototype);\n SourceError.prototype.constructor = SourceError;\n SourceError.prototype.name = 'SourceError';\n\n return {\n create: SourceErrorFactory\n };\n\n function SourceErrorFactory(message, source, code, action) {\n return new SourceError(message, source, code, action);\n }\n\n function SourceError(message, source, code, action) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n source: source,\n code: code,\n action: action\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelErrorsManager', AngularJsonAPIModelErrorsManagerWrapper);\n\n function AngularJsonAPIModelErrorsManagerWrapper() {\n ErrorsManager.prototype.constructor = ErrorsManager;\n ErrorsManager.prototype.concat = concat;\n ErrorsManager.prototype.clear = clear;\n ErrorsManager.prototype.add = add;\n ErrorsManager.prototype.hasErrors = hasErrors;\n\n return {\n create: ErrorsManagerFactory\n };\n\n function ErrorsManagerFactory(name, description, ErrorConstructor, defaultFilter) {\n return new ErrorsManager(name, description, ErrorConstructor, defaultFilter);\n }\n\n function ErrorsManager(name, description, ErrorConstructor, defaultFilter) {\n var _this = this;\n _this.name = name;\n _this.description = description;\n\n _this.ErrorConstructor = ErrorConstructor;\n _this.errors = {};\n _this.defaultFilter = defaultFilter || function() { return true; };\n }\n\n function clear(key) {\n var _this = this;\n\n if (key === undefined) {\n angular.forEach(_this.errors, function(obj, key) {\n _this.errors[key] = [];\n });\n } else {\n _this.errors[key] = [];\n }\n }\n\n function add(key, error) {\n var _this = this;\n\n _this.errors[key] = _this.errors[key] || [];\n _this.errors[key].push(error);\n }\n\n function concat(errors) {\n var _this = this;\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key] = [];\n });\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key].push(error.object);\n });\n\n }\n\n function hasErrors(key) {\n var _this = this;\n\n if (key === undefined) {\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = answer || error.length > 0;\n });\n\n return answer;\n } else {\n return _this.errors[key] !== undefined && _this.errors[key].length > 0;\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('namedFunction', namedFunction);\n\n function namedFunction(name, fn) {\n return new Function('fn',\n 'return function ' + name + '(){ return fn.apply(this,arguments)}'\n )(fn);\n }\n})();\n","// from https://www.sitepen.com/blog/2012/10/19/lazy-property-access/\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('lazyProperty', function(target, propertyName, callback) {\n var result;\n var done;\n Object.defineProperty(target, propertyName, {\n get: function() { // Define the getter\n if (!done) {\n // We cache the result and only compute once.\n done = true;\n result = callback.call(target);\n }\n\n return result;\n },\n\n // Keep it enumerable and configurable, certainly not necessary.\n enumerable: true,\n configurable: true\n });\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('toKebabCase', function(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$q', decorator);\n }\n\n function decorator($delegate) {\n var $q = $delegate;\n\n $q.allSettled = $q.allSettled || allSettled;\n\n function allSettled(promises, resolvedCallback, rejectedCallback) {\n // Implementation of allSettled function from Kris Kowal's Q:\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\n // by Michael Kropat from http://stackoverflow.com/a/27114615/1400432 slightly modified\n\n var wrapped = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function(promise, key) {\n if (!wrapped.hasOwnProperty(key)) {\n wrapped[key] = wrap(promise);\n }\n });\n\n return $q.all(wrapped);\n\n function wrap(promise) {\n return $q.resolve(promise)\n .then(function(value) {\n if (angular.isFunction(resolvedCallback)) {\n resolvedCallback(value);\n }\n\n return { success: true, value: value };\n },\n\n function(reason) {\n if (angular.isFunction(rejectedCallback)) {\n rejectedCallback(reason);\n }\n\n return { success: false, reason: reason };\n });\n }\n }\n\n return $q;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper);\n\n function AngularJsonAPISynchronizerSimpleWrapper(AngularJsonAPISynchronizerPrototype, $q, $log) {\n\n AngularJsonAPISynchronizerSimple.prototype = Object.create(AngularJsonAPISynchronizerPrototype.prototype);\n AngularJsonAPISynchronizerSimple.prototype.constructor = AngularJsonAPISynchronizerSimple;\n\n AngularJsonAPISynchronizerSimple.prototype.synchronize = synchronize;\n\n return {\n create: AngularJsonAPISynchronizerSimpleFactory\n };\n\n function AngularJsonAPISynchronizerSimpleFactory(sources) {\n return new AngularJsonAPISynchronizerSimple(sources);\n }\n\n function AngularJsonAPISynchronizerSimple(sources) {\n var _this = this;\n\n _this.state = {};\n\n AngularJsonAPISynchronizerPrototype.call(_this, sources);\n\n angular.forEach(sources, function(source) {\n source.synchronizer = _this;\n });\n }\n\n function synchronize(config) {\n var _this = this;\n var promises = [];\n var deferred = $q.defer();\n var action = config.action;\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize.call(_this, config);\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beginHooks[action], function(hook) {\n deferred.notify({step: 'begin', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beforeHooks[action], function(hook) {\n deferred.notify({step: 'before', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.synchronizationHooks[action], function(hook) {\n promises.push(hook.call(_this, config));\n });\n });\n\n $q.allSettled(promises, resolvedCallback, rejectedCallback).then(resolved, rejected);\n\n function resolvedCallback(value) {\n deferred.notify({step: 'synchronization', data: value});\n }\n\n function rejectedCallback(reason) {\n deferred.notify({step: 'synchronization', errors: reason});\n }\n\n function resolved(results) {\n _this.state[action] = _this.state[action] || {};\n _this.state[action].success = true;\n\n angular.forEach(results, function(result) {\n if (result.success === false) {\n _this.state[action].success = false;\n }\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.afterHooks[action], function(hook) {\n deferred.notify({step: 'after', errors: hook.call(_this, config, results)});\n });\n });\n\n var data;\n var errors = [];\n\n angular.forEach(results, function(result) {\n if (result.success === true) {\n data = result.value;\n } else {\n errors.push({\n key: action,\n object: result.reason\n });\n }\n });\n\n if (errors.length > 0) {\n deferred.reject({data: data || {}, finish: finish, errors: errors});\n } else {\n deferred.resolve({data: data || {}, finish: finish, errors: errors});\n }\n }\n\n function finish() {\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.finishHooks[action], function(hook) {\n deferred.notify({step: 'finish', errors: hook.call(_this, config)});\n });\n });\n }\n\n function rejected(errors) {\n $log.error('All settled rejected! Something went wrong');\n\n deferred.reject({finish: angular.noop, errors: errors});\n }\n\n return deferred.promise;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper);\n\n function AngularJsonAPISynchronizerPrototypeWrapper($log) {\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize = synchronize;\n\n return AngularJsonAPISynchronizerPrototype;\n\n function AngularJsonAPISynchronizerPrototype(sources) {\n var _this = this;\n\n _this.sources = sources;\n }\n\n function synchronize(config) {\n var _this = this;\n\n $log.debug('Synchro Collection', _this.resource.schema.type, config);\n\n if (config.action === undefined) {\n $log.error('Can\\'t synchronize undefined action', config);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISourcePrototype', AngularJsonAPISourcePrototypeWrapper);\n\n function AngularJsonAPISourcePrototypeWrapper() {\n AngularJsonAPISourcePrototype.prototype.before = beforeSynchro;\n AngularJsonAPISourcePrototype.prototype.after = afterSynchro;\n AngularJsonAPISourcePrototype.prototype.begin = begin;\n AngularJsonAPISourcePrototype.prototype.finish = finish;\n AngularJsonAPISourcePrototype.prototype.synchronization = synchronization;\n\n return AngularJsonAPISourcePrototype;\n\n function AngularJsonAPISourcePrototype(name) {\n var _this = this;\n var allHooks = [\n 'add',\n 'init',\n 'get',\n 'all',\n 'clearCache',\n 'remove',\n 'unlink',\n 'unlinkReflection',\n 'link',\n 'linkReflection',\n 'update',\n 'refresh',\n 'include'\n ];\n\n _this.name = name;\n _this.state = {};\n\n _this.beginHooks = {};\n _this.beforeHooks = {};\n _this.synchronizationHooks = {};\n _this.afterHooks = {};\n _this.finishHooks = {};\n\n _this.options = {};\n\n angular.forEach(allHooks, function(hookName) {\n _this.beginHooks[hookName] = [];\n _this.beforeHooks[hookName] = [];\n _this.synchronizationHooks[hookName] = [];\n _this.afterHooks[hookName] = [];\n _this.finishHooks[hookName] = [];\n _this.state[hookName] = {\n loading: false,\n success: true\n };\n });\n }\n\n function begin(action, callback) {\n var _this = this;\n\n _this.beginHooks[action].push(callback);\n }\n\n function finish(action, callback) {\n var _this = this;\n\n _this.finishHooks[action].push(callback);\n }\n\n function beforeSynchro(action, callback) {\n var _this = this;\n\n _this.beforeHooks[action].push(callback);\n }\n\n function afterSynchro(action, callback) {\n var _this = this;\n\n _this.afterHooks[action].push(callback);\n }\n\n function synchronization(action, callback) {\n var _this = this;\n\n _this.synchronizationHooks[action].push(callback);\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper);\n\n function AngularJsonAPISchemaWrapper(\n $log,\n pluralize,\n uuid4,\n AngularJsonAPISchemaLink\n ) {\n\n return {\n create: AngularJsonAPISchemaFactory\n };\n\n function AngularJsonAPISchemaFactory(schema) {\n return new AngularJsonAPISchema(schema);\n }\n\n function AngularJsonAPISchema(schema) {\n var _this = this;\n var include = schema.include || {};\n schema.include = include;\n include.get = schema.include.get || [];\n include.all = schema.include.all || [];\n\n _this.params = {\n get: {},\n all: {}\n };\n\n if (schema.id === 'uuid4') {\n schema.id = uuid4;\n } else if (schema.id === 'int') {\n schema.id = {\n generate: angular.noop,\n validate: angular.isNumber\n };\n } else if (angular.isObject(schema.id)) {\n if (!angular.isFunction(schema.id.generate)) {\n schema.id.generate = angular.noop;\n }\n } else {\n schema.id = {\n generate: angular.noop,\n validate: angular.identity.bind(null, true)\n };\n }\n\n angular.forEach(schema.relationships, function(linkSchema, linkName) {\n var linkSchemaObj = AngularJsonAPISchemaLink.create(linkSchema, linkName, schema.type);\n schema.relationships[linkName] = linkSchemaObj;\n if (linkSchemaObj.included === true) {\n include.get.push(linkName);\n if (linkSchemaObj.type === 'hasOne') {\n include.all.push(linkName);\n }\n }\n });\n\n angular.extend(_this, schema);\n\n if (include.get.length > 0) {\n _this.params.get.include = include.get;\n }\n\n if (include.all.length > 0) {\n _this.params.all.include = include.all;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink);\n\n function AngularJsonAPILinkSchrapperLink($log, pluralize) {\n\n return {\n create: AngularJsonAPISchemaLinkFactory\n };\n\n function AngularJsonAPISchemaLinkFactory(linkSchema, linkName, type) {\n return new AngularJsonAPISchemaLink(linkSchema, linkName, type);\n }\n\n function AngularJsonAPISchemaLink(linkSchema, linkName, type) {\n var _this = this;\n\n if (angular.isString(linkSchema)) {\n _this.model = pluralize.plural(linkName);\n _this.type = linkSchema;\n _this.polymorphic = false;\n _this.reflection = type;\n } else {\n if (linkSchema.type === undefined) {\n $log.error('Schema of link without a type: ', linkSchema, linkName);\n }\n\n if (linkSchema.type !== 'hasMany' && linkSchema.type !== 'hasOne') {\n $log.error('Schema of link with wrong type: ', linkSchema.type, 'available: hasOne, hasMany');\n }\n\n _this.model = linkSchema.model || pluralize.plural(linkName);\n _this.type = linkSchema.type;\n _this.polymorphic = linkSchema.polymorphic || false;\n\n if (linkSchema.reflection === undefined) {\n _this.reflection = _this.type === 'hasMany' ? pluralize.singular(type) : type;\n } else {\n _this.reflection = linkSchema.reflection;\n }\n\n _this.included = linkSchema.included || false;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper);\n\n function AngularJsonAPIResourceWrapper(\n AngularJsonAPIModel,\n AngularJsonAPISchema,\n AngularJsonAPIResourceCache,\n AngularJsonAPICollection,\n $rootScope,\n $log,\n $q\n ) {\n AngularJsonAPIResource.prototype.get = get;\n AngularJsonAPIResource.prototype.all = all;\n AngularJsonAPIResource.prototype.remove = remove;\n AngularJsonAPIResource.prototype.initialize = initialize;\n\n AngularJsonAPIResource.prototype.clearCache = clearCache;\n\n return {\n create: AngularJsonAPIResourceFactory\n };\n\n function AngularJsonAPIResourceFactory(schema, synchronizer) {\n return new AngularJsonAPIResource(schema, synchronizer);\n }\n\n /**\n * AngularJsonAPIResource constructor\n * @param {json} schema Schema object\n * @param {AngularJsonAPISynchronizer} synchronizer Synchronizer for the resource\n */\n function AngularJsonAPIResource(schema, synchronizer) {\n var _this = this;\n var config = {\n action: 'init'\n };\n\n _this.schema = AngularJsonAPISchema.create(schema);\n _this.cache = AngularJsonAPIResourceCache.create(_this);\n\n _this.synchronizer = synchronizer;\n _this.synchronizer.resource = _this;\n\n _this.modelFactory = AngularJsonAPIModel.modelFactory(\n _this.schema,\n _this\n );\n\n _this.initialized = false;\n _this.type = _this.schema.type;\n\n synchronizer.resource = _this;\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'resolved', response);\n _this.cache.fromJson(response.data);\n _this.initialized = true;\n\n response.finish();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'rejected', response);\n response.finish();\n _this.initialized = true;\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'notify', response);\n }\n }\n\n /**\n * Get request\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id, synchronized\n */\n function get(id, params) {\n var _this = this;\n\n if (!_this.schema.id.validate(id)) {\n return $q.reject({errors: [{status: 0, statusText: 'Invalid id'}]});\n }\n\n var object = _this.cache.get(id);\n\n object.promise = object.refresh(params);\n\n return object;\n }\n\n /**\n * All request\n * @param {object} params Object associated with params (for filters/pagination etc.)\n * @return {AngularJsonAPICollection} Collection of AngularJsonAPIModel, synchronized\n */\n function all(params) {\n var _this = this;\n params = angular.extend({}, _this.schema.params.all, params);\n\n var collection = AngularJsonAPICollection.create(\n _this,\n params\n );\n\n collection.promise = collection.fetch();\n\n return collection;\n }\n\n /**\n * Remove request\n * @param {uuid} id\n * @return {promise} Promise associated with the synchronization, in case of\n * fail object is reverted to previous state\n */\n function remove(id) {\n var _this = this;\n var object = _this.cache.remove(id);\n\n return object.remove();\n }\n\n /**\n * Initialize new AngularJsonAPIModel\n * @return {AngularJsonAPIModel} New model\n */\n function initialize() {\n var _this = this;\n var relationships = {};\n\n angular.forEach(_this.schema.relationships, function(relationshipSchema, relationshipName) {\n if (relationshipSchema.type === 'hasOne') {\n relationships[relationshipName] = {\n data: null\n };\n } else if (relationshipSchema.type === 'hasMany') {\n relationships[relationshipName] = {\n data: []\n };\n }\n });\n\n var data = {\n type: _this.type,\n id: _this.schema.id.generate(),\n attributes: {},\n relationships: relationships\n };\n\n var config = {\n new: true,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: false\n };\n\n var object = _this.modelFactory(data, config);\n\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:initialize', 'resolved', object);\n\n return object;\n }\n\n /**\n * Clears localy saved data\n * @return {promise} Promise associated with the synchronization resolves to nothing\n */\n function clearCache() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: 'clearCache'\n };\n\n _this.cache.clear();\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n return deferred;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.resolve(response);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.reject(response);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'notify', response);\n\n deferred.notify(response);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModel', AngularJsonAPIModel);\n\n function AngularJsonAPIModel(\n AngularJsonAPIAbstractModel,\n AngularJsonAPISchema,\n namedFunction,\n pluralize,\n $log\n ) {\n\n return {\n modelFactory: createModelFactory\n };\n\n function createModelFactory(schemaObj, resource) {\n var constructorName = pluralize.plural(schemaObj.type, 1);\n\n var Model = namedFunction(constructorName, function(data, config, updatedAt) {\n var _this = this;\n\n if (data.type !== _this.schema.type) {\n $log.error('Data type other then declared in schema: ', data.type, ' instead of ', _this.schema.type);\n }\n\n AngularJsonAPIAbstractModel.call(_this, data, config, updatedAt);\n\n _this.form.parent = _this;\n });\n\n Model.prototype = Object.create(AngularJsonAPIAbstractModel.prototype);\n Model.prototype.constructor = Model;\n\n Model.prototype.schema = schemaObj;\n Model.prototype.resource = resource;\n Model.prototype.synchronize = resource.synchronizer.synchronize.bind(resource.synchronizer);\n\n angular.forEach(schemaObj.functions, function(metaFunction, metaFunctionName) {\n Model.prototype[metaFunctionName] = function() {\n return metaFunction.apply(this, arguments);\n };\n });\n\n return modelFactory;\n\n function modelFactory(data, updatedAt, isNew) {\n return new Model(data, updatedAt, isNew);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper);\n\n function AngularJsonAPICollectionWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelErrorsManager,\n $rootScope,\n $injector,\n $q\n ) {\n\n AngularJsonAPICollection.prototype.fetch = fetch;\n AngularJsonAPICollection.prototype.refresh = fetch;\n AngularJsonAPICollection.prototype.get = get;\n AngularJsonAPICollection.prototype.hasErrors = hasErrors;\n\n return {\n create: AngularJsonAPICollectionFactory\n };\n\n function AngularJsonAPICollectionFactory(resource, params) {\n return new AngularJsonAPICollection(resource, params);\n }\n\n /**\n * Constructor\n * @param {AngularJsonAPIResource} resource Factory associated with the collection\n * @param {object} params Params associated with this resource (such as filters)\n */\n function AngularJsonAPICollection(resource, params) {\n var _this = this;\n\n _this.resource = resource;\n _this.type = resource.schema.type;\n _this.params = params || {};\n\n _this.errors = {\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.data = _this.resource.cache.index(_this.params);\n\n _this.loading = false;\n _this.loadingCount = 0;\n _this.synchronized = false;\n _this.pristine = _this.data === undefined;\n\n _this.promise = $q.resolve(_this);\n\n var onObjectRemove = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:remove', remove);\n var onFactoryClear = $rootScope.$on('angularJsonAPI:' + _this.type + ':resource:clearCache', clear);\n var onObjectAdd = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:add', add);\n\n $rootScope.$on('$destroy', clearWatchers);\n\n function remove(event, status, object) {\n var index;\n\n if (status === 'resolved' && _this.data !== undefined) {\n index = _this.data.indexOf(object);\n if (index > -1) {\n _this.data.splice(index, 1);\n _this.resource.cache.setIndexIds(_this.data);\n }\n }\n }\n\n function clear() {\n _this.data = undefined;\n _this.pristine = true;\n }\n\n function add(event, status, object) {\n if (status === 'resolved') {\n _this.data = _this.data || [];\n _this.data.push(object);\n }\n }\n\n function clearWatchers() {\n onObjectRemove();\n onFactoryClear();\n onObjectAdd();\n }\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /**\n * Shortcut to this.resource.get\n * @param {string} id Id of object]\n * @return {AngularJsonAPIModel} Model with id\n */\n function get(id, params) {\n var _this = this;\n\n return _this.resource.get(id, params);\n }\n\n /**\n * Synchronizes collection with the server\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function fetch() {\n var _this = this;\n var deferred = $q.defer();\n var $jsonapi = $injector.get('$jsonapi');\n var config = {\n action: 'all',\n params: _this.params\n };\n\n __incrementLoadingCounter(_this);\n\n angular.forEach(_this.data, __incrementLoadingCounter);\n\n _this.resource.synchronizer.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n\n _this.data = results.data;\n _this.links = response.data.links;\n\n _this.updatedAt = Date.now();\n _this.synchronized = true;\n _this.pristine = false;\n\n _this.resource.cache.setIndexIds(_this.data);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'rejected', _this, response);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n }\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .provider('$jsonapi', jsonapiProvider);\n\n function jsonapiProvider(validateJS) {\n var memory = {};\n var names = [];\n this.$get = jsonapiFactory;\n\n function jsonapiFactory(\n $log,\n AngularJsonAPIResource,\n AngularJsonAPISynchronizerSimple\n ) {\n return {\n addResource: addResource,\n getResource: getResource,\n clearCache: clearCache,\n allResources: allResources,\n listResources: listResources,\n addValidator: addValidator,\n synchronizerSimple: AngularJsonAPISynchronizerSimple,\n\n __proccesResults: __proccesResults\n };\n\n function addResource(schema, synchronizer) {\n var resource = AngularJsonAPIResource.create(schema, synchronizer);\n\n memory[schema.type] = resource;\n names.push(schema.type);\n }\n\n function getResource(type) {\n return memory[type];\n }\n\n function allResources() {\n return memory;\n }\n\n function listResources() {\n return names;\n }\n\n function clearCache() {\n angular.forEach(memory, function(resource) {\n resource.clearCache();\n });\n }\n\n function addValidator(name, validator) {\n if (!angular.isString(name)) {\n $log.error('Validator name is not a string', name);\n return;\n } else if (validateJS.validators[name] === undefined) {\n $log.warn('Redeclaring validator', name);\n }\n\n validateJS.validators[name] = validator;\n }\n\n function __proccesResults(results) {\n var objects = {\n data: [],\n included: []\n };\n\n if (results === undefined) {\n $log.error('Can\\'t proccess results:', results);\n return;\n }\n\n var config = {\n new: false,\n synchronized: true,\n stable: true,\n pristine: false,\n initialization: false\n };\n\n angular.forEach(results.included, function(data) {\n objects.included.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n\n if (angular.isArray(results.data)) {\n angular.forEach(results.data, function(data) {\n objects.data.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n } else if (results.data !== undefined) {\n objects.data.push(getResource(results.data.type).cache.addOrUpdate(results.data, config));\n }\n\n return objects;\n }\n }\n }\n\n})();\n\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(function($logProvider) {\n $logProvider.debugEnabled(false);\n })\n .run(function(validateJS, $q) {\n validateJS.Promise = $q;\n });\n})();\n"],"sourceRoot":"/source/"} diff --git a/dist/angular-jsonapi.min.js b/dist/angular-jsonapi.min.js index 70ba468..07a2f33 100644 --- a/dist/angular-jsonapi.min.js +++ b/dist/angular-jsonapi.min.js @@ -1,3 +1,3 @@ -!function(){"use strict";angular.module("angular-jsonapi-rest",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t,r,a,o){function i(e,n){return new s(e,n)}function s(r,i){function s(e){return o({method:"GET",headers:m,url:i,params:c(e.params)}).then(y,g.bind(null,"all"))}function u(e){return o({method:"GET",headers:m,url:i+"/"+e.object.data.id,params:c(e.params)}).then(y,g.bind(null,"get"))}function l(e){return o({method:"DELETE",headers:m,url:i+"/"+e.object.data.id}).then(y,g.bind(null,"remove"))}function d(n){var t=a.defer(),r=n.object.schema.relationships[n.key];return n.object.removed===!0?t.reject(e.create("Object has been removed",v,0,"unlink")):void 0!==n.target&&void 0===n.target.data.id?t.reject(e.create("Can't unlink object without id through rest call",v,0,"unlink")):"hasOne"===r.type?o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"get")).then(t.resolve,t.reject):"hasMany"===r.type&&(void 0===n.target?o({method:"PUT",headers:m,data:{data:[]},url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject):o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key+"/"+n.target.data.id}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject)),t.promise}function h(e){var n=a.defer(),r=e.object.schema.relationships[e.key];return e.object.removed===!0?n.reject({errors:[{status:0,statusText:"Object has been removed"}]}):void 0===e.target||void 0===e.target.data.id?n.reject({errors:[{status:0,statusText:"Can't link object without id through rest call"}]}):"hasOne"===r.type?o({method:"PUT",headers:m,data:{data:t.toLinkData(e.target)},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject):"hasMany"===r.type&&o({method:"POST",headers:m,data:{data:[t.toLinkData(e.target)]},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject),n.promise}function p(e){return o({method:"PUT",headers:m,url:i+"/"+e.object.data.id,data:e.object.form.toJson()}).then(y,g.bind(null,"update"))}function f(e){return o({method:"POST",headers:m,url:i,data:e.object.form.toJson()}).then(y,g.bind(null,"add"))}function y(e){return a.resolve(e.data)}function g(n,t){function r(t){s.reject(e.create("Server is offline",v,t.status,n))}function i(){s.reject(e.create("No internet connection",v,t.status,n))}var s=a.defer();return 0===t.status?o({method:"GET",url:"https://status.cloud.google.com/incidents.schema.json"}).then(r,i):s.reject(e.create(t.statusText,v,t.status,n)),s.promise}var v=this,m={Accept:"application/vnd.api+json","Content-Type":"application/vnd.api+json"};n.apply(v,arguments),v.synchronization("remove",l),v.synchronization("unlink",d),v.synchronization("link",h),v.synchronization("update",p),v.synchronization("add",f),v.synchronization("all",s),v.synchronization("get",u),v.synchronization("refresh",u)}function c(e){function n(e){return angular.isArray(e)?e.join(","):e}var t={};return void 0===e?{}:(angular.forEach(e,function(e,r){angular.isArray(e)?t[r]=n(e):angular.isObject(e)?angular.forEach(e,function(e,a){t[r+"["+a+"]"]=n(e)}):t[r]=e}),t)}function u(e){var n={};return angular.forEach(e,function(e,t){var r=t.indexOf("[");if(e=e.split(","),r>-1){var a=t.substr(0,r),o=t.substr(r+1,t.indexOf("]")-r-1);n[a]=n[a]||{},n[a][o]=e}else n[t]=e}),n}return s.prototype=Object.create(n.prototype),s.prototype.constructor=s,{create:i,encodeParams:c,decodeParams:u}}angular.module("angular-jsonapi-rest").factory("AngularJsonAPISourceRest",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceRest=n,t}angular.module("angular-jsonapi-rest").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceRest"]}(),function(){"use strict";angular.module("angular-jsonapi-parse",["angular-jsonapi"]).constant("Parse",Parse)}(),function(){"use strict";function e(e,n,t,r,a,o,i){function s(e,n){return new c(e,n)}function c(e,t){function s(e){var n=new a.Query(y.ParseObject);return void 0!==e.params.limit&&n.limit(e.params.limit),angular.forEach(e.params.filter,function(e){n.equalTo(e.key,e.value)}),n.find().then(p,f.bind(null,"all"))}function c(e){var n=new a.Query(y.ParseObject);return n.get(e.object.data.id).then(p,f.bind(null,"get"))}function u(e){var n=new y.ParseObject;return n.set("id",e.object.data.id),n.destroy().then(p,f.bind(null,"remove"))}function l(e){var n=d(e.object);return n.save(null).then(p,f.bind(null,"update"))}function d(e){var n=new y.ParseObject;return angular.forEach(e.form.data.attributes,function(e,t){n.set(t,e)}),angular.forEach(e.schema.relationships,function(t,o){if("hasOne"===t.type&&null!==e.form.data.relationships[o].data&&void 0!==e.form.data.relationships[o].data){var i=r(o,1).charAt(0).toUpperCase()+r(o,1).slice(1),s=new(a.Object.extend(i));s.set("id",e.form.data.relationships[o].data.id),n.set(o,s)}}),n}function h(e){var n=y.synchronizer.resource.schema.relationships;return e.type=y.type,e.relationships=e.relationships||[],angular.forEach(n,function(n,t){e.attributes[t]&&"hasOne"===n.type&&(e.relationships[t]={data:{type:n.model,id:e.attributes[t].id}})}),e}function p(e){return angular.isArray(e)?angular.forEach(e,function(n,t){e[t]=h(n)}):angular.isObject(e)&&(e=h(e)),i.resolve({data:e})}function f(e,n){return o.error("Parse error for",e,n),i.reject(n)}var y=this;y.ParseObject=a.Object.extend(t),y.type=r(t).charAt(0).toLowerCase()+r(t).slice(1),n.apply(y,arguments),y.synchronization("remove",u),y.synchronization("update",l),y.synchronization("add",l),y.synchronization("all",s),y.synchronization("get",c),y.synchronization("refresh",c)}function u(e,n){a.initialize(e,n)}return c.prototype=Object.create(n.prototype),c.prototype.constructor=c,c.prototype.initialize=u,{create:s}}angular.module("angular-jsonapi-parse").factory("AngularJsonAPISourceParse",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","pluralize","Parse","$log","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-parse").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceParse"]}(),function(){"use strict";angular.module("angular-jsonapi-local",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t){function r(e,n){return new a(e,n)}function a(r,a){function i(){var e=l.synchronizer.resource.schema.type;return t.resolve(n.localStorage.getItem(a+"."+e))}function s(){var e=l.synchronizer.resource.schema.type,t=a+"."+e;o.all-=o.list[t],delete o.list[t],o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.removeItem(t)}function c(){var e=l.synchronizer.resource.schema.type,t=l.synchronizer.resource.cache,r=t.toJson(),i=a+"."+e;o.list[i]=void 0===o.list[i]?0:o.list[i],o.all+=r.length-o.list[i],o.list[i]=r.length,o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.setItem(i,r)}function u(e){return Object.keys(e).reduce(function(n,t){return e[t]>e[n]?t:n},Object.keys(e)[0])}var l=this;a=a||"AngularJsonAPI",l.__updateStorage=c,e.apply(l,arguments),l.synchronization("init",i),l.begin("clearCache",s),l.finish("init",c),l.finish("clearCache",c),l.finish("remove",c),l.finish("refresh",c),l.finish("unlink",c),l.finish("unlinkReflection",c),l.finish("link",c),l.finish("linkReflection",c),l.finish("update",c),l.finish("add",c),l.finish("get",c),l.finish("all",c),l.finish("include",c)}var o={max:0,all:0,limit:52e5,list:{}};return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,{create:r,size:o}}angular.module("angular-jsonapi-local").factory("AngularJsonAPISourceLocal",e),e.$inject=["AngularJsonAPISourcePrototype","$window","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-local").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceLocal"]}(),function(){"use strict";angular.module("angular-jsonapi",["uuid4"]).constant("pluralize",pluralize).constant("validateJS",validate)}(),function(){"use strict";function e(e,n){function t(e){return new r(e)}function r(e){var n=this;n.resource=e,n.data={},n.removed={},n.size=0,n.indexIds=void 0}function a(e,t,r){var a=this,o=e.id;return void 0===o?void n.error("Can't add data without id!",e):(void 0===a.data[o]?(a.data[o]=a.resource.modelFactory(e,t,r),a.size+=1):a.data[o].update(e,!t["new"],t.initialization),a.data[o])}function o(e){var n=this,t=angular.fromJson(e),r={"new":!1,"synchronized":!1,stable:!1,pristine:!1,initialization:!0};angular.isObject(t)&&void 0!==t.data&&(n.updatedAt=t.updatedAt,n.indexIds=t.indexIds,angular.forEach(t.data,function(e){var t=e.data;n.addOrUpdate(t,r,e.updatedAt)}))}function i(){var e=this,n={data:[],updatedAt:e.updatedAt,indexIds:e.indexIds};return angular.forEach(e.data,function(e){e.hasErrors()===!1&&n.data.push(e.toJson())}),angular.toJson(n)}function s(){var e=this;e.indexIds=void 0,e.data={},e.removed={}}function c(e){var n=this,t={id:e,type:n.resource.schema.type},r={"new":!1,"synchronized":!1,stable:!1,pristine:!0};return void 0===n.data[e]&&(n.data[e]=n.resource.modelFactory(t,r)),n.data[e]}function u(e){function n(n){var t=e.filter,r=!0;return angular.forEach(t,function(e){r=r&&n.data.attributes[e.key]===e.value}),r}var t=this;return e=e||{},void 0===t.indexIds?t.indexIds:t.indexIds.map(t.get.bind(t)).filter(n)}function l(e){var n=this;n.indexIds=[],angular.forEach(e,function(e){angular.isString(e)&&n.resource.schema.id.validate(e)?n.indexIds.push(e):angular.isObject(e)&&n.resource.schema.id.validate(e.data.id)&&n.indexIds.push(e.data.id)})}function d(e){var n=this;return void 0!==n.data[e]&&(n.removed[e]=n.data[e],delete n.data[e],n.size-=1),n.removed[e]}function h(e){var n=this;return void 0!==n.removed[e]&&(n.data[e]=n.removed[e],delete n.removed[e],n.size+=1),n.data[e]}function p(e){var n=this;delete n.removed[e]}return r.prototype.get=c,r.prototype.index=u,r.prototype.setIndexIds=l,r.prototype.addOrUpdate=a,r.prototype.fromJson=o,r.prototype.toJson=i,r.prototype.clear=s,r.prototype.remove=d,r.prototype.revertRemove=h,r.prototype.clearRemoved=p,{create:t}}angular.module("angular-jsonapi").factory("AngularJsonAPIResourceCache",e),e.$inject=["uuid4","$log"]}(),function(){"use strict";function e(e){function n(e){return null===e?null:{type:e.data.type,id:e.data.id}}function t(n,t,r,i,u){var l;return u=void 0===u?!1:u,void 0===n?(e.error("Can't add link to non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(l=n.schema.relationships[t],void 0===r?(e.error("Can't link non existing object",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):void 0===l?(e.error("Can't add link not present in schema:",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):null!==r&&l.polymorphic===!1&&l.model!==r.data.type?(e.error("This relation is not polymorphic, expected: "+l.model+" instead of "+r.data.type),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):"hasMany"===l.type?i===!0?(c(n,t,r,u),[]):a(n,t,r,u):"hasOne"===l.type?i===!0?(s(n,t,r,u),[]):o(n,t,r,u):void 0)}function r(n,t,r,a,o){var s;return o=void 0===o?!1:o,void 0===n?(e.error("Can't remove link from non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(s=n.schema.relationships[t],void 0===s?(e.error("Can't remove link not present in schema:",n,t,r,s),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",s),[]):a===!0?(l(n,t,r,o),[]):i(n,t,r,o))}function a(n,t,r,a){var i,s=n.schema.relationships[t].reflection;return s===!1?(c(n,t,r,a),[]):(i=r.schema.relationships[s],void 0===i?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):"hasOne"===i.type?h(d(n,t,r),d(r,s,n),o(r,s,n,a)):"hasMany"===i.type?(c(n,t,r,a),c(r,s,n,a),[d(r,s,n)]):void 0)}function o(n,t,r,a){var o,i,h=n.schema.relationships[t].reflection,p=n.relationships[t],f=[];return s(n,t,r,a),h===!1?[]:(void 0!==p&&null!==p&&(i=p.schema.relationships[h],void 0!==i?("hasOne"===i.type?u(p,h,n,a):"hasMany"===i.type&&l(p,h,n,a),f.push(d(p,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),void 0!==r&&null!==r&&h!==!1&&(o=r.schema.relationships[h],void 0!==o?("hasOne"===o.type?s(r,h,n,a):"hasMany"===o.type&&c(r,h,n,a),f.push(d(r,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),f)}function i(n,t,r,a){var o,i=n.schema.relationships[t],s=i.reflection;return"hasMany"===i.type?l(n,t,r,a):"hasOne"===i.type&&u(n,t,r,a),s===!1?[]:(o=r.schema.relationships[s],void 0===o?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):("hasOne"===o.type?u(r,s,n,a):"hasMany"===o.type&&l(r,s,n,a),[d(r,s,n)]))}function s(t,r,a,o){return e.debug("addHasOne",t,r,a),o===!0&&(t=t.form),t.relationships[r]=a,t.data.relationships[r].data=n(a),o===!1&&t.reset(!0),!0}function c(t,r,a,o){e.debug("addHasMany",t,r,a);var i=n(a);return o===!0&&(t=t.form),angular.isArray(t.relationships[r])&&t.relationships[r].indexOf(a)>-1?!1:(t.relationships[r]=t.relationships[r]||[],t.data.relationships[r].data=t.data.relationships[r].data||[],t.relationships[r].push(a),t.data.relationships[r].data.push(i),o===!1&&t.reset(!0),!0)}function u(n,t,r,a){return e.debug("removeHasOne",n,t,r),a===!0&&(n=n.form),void 0!==r&&n.relationships[t]!==r?!1:(n.relationships[t]=null,n.data.relationships[t].data=void 0,a===!1&&n.reset(!0),!0)}function l(n,t,r,a){if(e.debug("removeHasMany",n,t,r),a===!0&&(n=n.form),void 0!==n.relationships[t]){if(void 0===r)return n.relationships[t]=[],n.data.relationships[t].data=[],a===!1&&n.reset(!0),!0;var o=n.relationships[t].indexOf(r);return-1===o?!1:(n.relationships[t].splice(o,1),n.data.relationships[t].data.splice(o,1),a===!1&&n.reset(!0),!0)}}function d(e,n,t){return{object:e,key:n,target:t}}function h(e,n,t){var r=-1;return angular.forEach(t,function(n,t){n.object===e.object&&n.key===e.key&&n.target===e.target&&(r=t)}),r>-1?t[r]=n:t.push(n),t}var p=this;return p.toLinkData=n,p.link=t,p.unlink=r,this}angular.module("angular-jsonapi").service("AngularJsonAPIModelLinkerService",e),e.$inject=["$log"]}(),function(){"use strict";function e(e,n,t,r){function a(e){return new o(e)}function o(e){var n=this;n.data={id:e.data.id,type:e.data.type,attributes:{},relationships:{}},n.relationships={},n.parent=e,n.schema=e.schema,n.reset()}function i(){var e=this,n=angular.copy(e.data),t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n}}function s(){var e=this;return e.parent.save()}function c(e){var n=this;angular.forEach(n.schema.relationships,function(e,t){n.data.relationships[t]=angular.copy(n.parent.data.relationships[t])||{},angular.isArray(n.relationships[t])?n.relationships[t]=n.parent.relationships[t].slice():n.relationships[t]=n.parent.relationships[t]}),(e!==!0||n.parent["synchronized"]!==!0)&&(angular.forEach(n.schema.attributes,function(e,t){n.data.attributes[t]=angular.copy(n.parent.data.attributes[t])}),n.parent.errors.validation.clear())}function u(n){function a(){void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),u.resolve()}function o(t){c.parent.error=!0,void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),angular.forEach(t,function(n,t){angular.forEach(n,function(n){c.parent.errors.validation.add(t,e.create(n,t))})}),u.reject(c.parent.errors.validation)}var i,s,c=this,u=r.defer();return void 0===n?(i=c.data.attributes,s=c.schema.attributes):(i={},s={},i[n]=c.data.attributes[n],s[n]=c.schema.attributes[n]),t.async(i,s).then(a,o),u.promise}function l(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.link(o.parent,e,t,a,!0))}function d(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.unlink(o.parent,e,t,a,!0))}return o.prototype.save=s,o.prototype.reset=c,o.prototype.validate=u,o.prototype.link=l,o.prototype.unlink=d,o.prototype.toJson=i,{create:a}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelForm",e),e.$inject=["AngularJsonAPIModelValidationError","AngularJsonAPIModelLinkerService","validateJS","$q"]}(),function(){"use strict";function e(e,o,i,s,c,u,l,d,h){function p(n,t,r){var a=this;n.relationships=n.relationships||{},a["new"]=void 0===t["new"]?!1:t["new"],a.stable=void 0===t.stable?!0:t.stable,a["synchronized"]=void 0===t["synchronized"]?!0:t["synchronized"],a.pristine=void 0===t.pristine?!0:t.pristine,a.removed=!1,a.loading=!1,a.saving=!1,a.updatedAt=a["synchronized"]===!0?Date.now():r,a.loadingCount=0,a.savingCount=0,a.data={relationships:{},attributes:{}},a.relationships={},angular.forEach(a.schema.relationships,function(e,n){a.relationships[n]=void 0}),a.errors={validation:i.create("Validation","Errors of attributes validation",o),synchronization:i.create("Source","Errors of synchronizations",e)},a.promise=h.resolve(a),P(a,n),a.form=c.create(a)}function f(){function e(){i.synchronize(c).then(n,t,o)}function n(e){u.$emit("angularJsonAPI:"+i.data.type+":object:"+c.action,"resolved",i,e),i.update(e.data.data),i["new"]===!0&&(i.resource.cache.indexIds=i.resource.cache.indexIds||[],i.resource.cache.indexIds.push(i.data.id)),i["synchronized"]=!0,i["new"]=!1,i.pristine=!1,i.stable=!0,e.finish(),i.errors.synchronization.concat(e.errors),s.resolve(e.data.meta)}function t(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","rejected",i,e),e.finish(),i.errors.synchronization.concat(e.errors),s.reject(i)}function o(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","notify",i,e),s.notify(e)}var i=this,s=h.defer(),c={action:i["new"]===!0?"add":"update",object:i};return i.form.validate().then(e,s.reject)["finally"](a.bind(i,void 0)),r(i),s.promise}function y(){var e=this;void 0!==e.form&&e.form.reset()}function g(r){function a(e){function r(e){return n(e),e.synchronize({action:"include",object:e})["finally"](t.bind(e,void 0))}function a(n){angular.forEach(n,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+o.included[n].data.type+":object:include","resolved",o.included[n],e),e.value.finish())}),c.resolve(e.data.meta)}var o=s.__proccesResults(e.data);u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","resolved",d,e),h.allSettled(o.included.map(r)).then(a,c.reject),d["synchronized"]=!0,d.stable=!0,d.pristine=!1,e.finish(),d.errors.synchronization.concat(e.errors)}function o(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","rejected",d,e),e.finish(),d.errors.synchronization.concat(e.errors),c.reject(d)}function i(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","notify",d,e),c.notify(e)}var s=l.get("$jsonapi"),c=h.defer(),d=this;r=void 0===r?d.schema.params.get:r;var p={action:"refresh",object:d,params:r};if(d["new"]===!0){var f=e.create("Can't refresh new object",null,0,"refresh");d.errors.synchronization.add("refresh",f),c.reject(f)}else n(d),d.synchronize(p).then(a,o,i)["finally"](t.bind(d,void 0));return c.promise}function v(){var e=this,n=e.data,t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n,updatedAt:e.updatedAt}}function m(){function e(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","resolved",o,e),o.removed=!0,o.unlinkAll(),o.resource.cache.clearRemoved(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function n(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","rejected",o,e),o.resource.cache.revertRemove(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function t(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","notify",o,e),i.notify(e)}var o=this,i=h.defer(),s={action:"remove",object:o};return o.resource.cache.remove(o.data.id),o["new"]===!0?i.resolve():(r(o),o.synchronize(s).then(e,n,t)["finally"](a.bind(o,void 0))),i.promise}function j(e){function r(e,n){var t=o.schema.relationships[n],r=t.reflection;angular.isArray(e)?angular.forEach(e,a.bind(void 0,r)):angular.isObject(e)&&a(r,e),"hasOne"===t.type?o.relationships[n]=null:"hasMany"===t.type&&(o.relationships[n]=[])}function a(e,r){function a(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","resolve",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function c(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","rejected",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function l(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","notify",o,e),e.finish(),i.notify(e)}var d=r.schema.relationships[e],h={action:"unlinkReflection",object:r,target:o,key:e};n(r),s.unlink(r,e,o,d),r.synchronize(h).then(a,c,l)["finally"](t.bind(r,void 0))}var o=this,i=h.defer();return n(o),void 0===e?angular.forEach(o.relationships,r):r(o.relationships[e],e),t(o),i.promise}function b(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"linkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+c[n].object.data.type+":object:linkReflection","resolved",c[n],e),e.value.finish())}),f.resolve(e.data.meta)}u.$emit("angularJsonAPI:"+y.data.type+":object:link","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"link",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't link undefined",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):y["new"]===!0?(p=e.create("Can't link new object",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function A(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"unlinkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(n){n.success===!0&&(u.$emit("angularJsonAPI:"+c[o].data.type+":object:unlinkReflection","resolved",c[o],n),e.value.finish())}),f.resolve()}u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"unlink",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't unlink undefined",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):y["new"]===!0?(p=e.create("Can't unlink new object",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function k(e,r,a){var o=this;n(o),P(o,e),o.reset(r),o["synchronized"]=a===!0?!1:!0,o.stable=a===!0?!1:!0,o.updatedAt=Date.now(),t(o)}function z(){var e=this,n=!1;return angular.forEach(e.errors,function(e){n=e.hasErrors()||n}),n}function P(e,n){function t(t,r){e.data.attributes[r]=n.attributes[r]}function r(t,r){var i=n.relationships[r];return void 0===i?void(void 0===e.data.relationships[r]&&(e.data.relationships[r]={data:void 0})):(e.data.relationships[r]=e.data.relationships[r]||{},e.data.relationships[r].links=i.links,void("hasOne"===t.type?a(e,r,i.data):"hasMany"===t.type&&angular.isArray(i.data)&&(0===i.data.length?(e.data.relationships[r].data=[],e.unlinkAll(r)):(angular.forEach(e.relationships[r],o.bind(void 0,e,r,i.data)),angular.forEach(i.data,a.bind(void 0,e,r))))))}function a(e,n,t){var r;if(null===t)return void s.link(e,n,null);if(void 0!==t){if(r=i.getResource(t.type),void 0===r)return void d.error("Factory not found",t.type,t);var a=r.cache.get(t.id);s.link(e,n,a)}}function o(e,n,t,r){t.indexOf(r.data.id)>-1||s.unlink(e,n,r)}var i=l.get("$jsonapi"),c=e.schema;return e.data.id=n.id,e.data.type=n.type,e.resource.schema.type!==n.type?(d.error("Different type then resource",e.resource.schema.type,n),!1):e.schema.id.validate(e.data.id)?(e.data.links=n.links,n.attributes=n.attributes||{},n.relationships=n.relationships||{},angular.forEach(c.attributes,t),angular.forEach(c.relationships,r),!0):(d.error("Invalid id"),!1)}return p.prototype.refresh=g,p.prototype.remove=m,p.prototype.reset=y,p.prototype.save=f,p.prototype.update=k,p.prototype.link=b,p.prototype.unlink=A,p.prototype.unlinkAll=j,p.prototype.toJson=v,p.prototype.hasErrors=z,p}function n(e){e=void 0===e?this:e,e.loadingCount+=1,e.loading=!0}function t(e){e=void 0===e?this:e,e.loadingCount-=1,e.loading=e.loadingCount>0}function r(e){e=void 0===e?this:e,e.savingCount+=1,e.saving=!0}function a(e){e=void 0===e?this:e,e.savingCount-=1,e.saving=e.savingCount>0}angular.module("angular-jsonapi").factory("AngularJsonAPIAbstractModel",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelValidationError","AngularJsonAPIModelErrorsManager","AngularJsonAPIModelLinkerService","AngularJsonAPIModelForm","$rootScope","$injector","$log","$q"]}(),function(){"use strict";function e(){function e(e,t){return new n(e,t)}function n(e,n){var t=this;t.message=e,t.context={attribute:n}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="ValidationError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelValidationError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.message=e,a.context={source:n,code:t,action:r}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="SourceError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelSourceError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.name=e,a.description=n,a.ErrorConstructor=t,a.errors={},a.defaultFilter=r||function(){return!0}}function t(e){var n=this;void 0===e?angular.forEach(n.errors,function(e,t){n.errors[t]=[]}):n.errors[e]=[]}function r(e,n){var t=this;t.errors[e]=t.errors[e]||[],t.errors[e].push(n)}function a(e){var n=this;angular.forEach(e,function(e){n.errors[e.key]=[]}),angular.forEach(e,function(e){n.errors[e.key].push(e.object)})}function o(e){var n=this;if(void 0===e){var t=!1;return angular.forEach(n.errors,function(e){t=t||e.length>0}),t}return void 0!==n.errors[e]&&n.errors[e].length>0}return n.prototype.constructor=n,n.prototype.concat=a,n.prototype.clear=t,n.prototype.add=r,n.prototype.hasErrors=o,{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelErrorsManager",e)}(),function(){"use strict";function e(e,n){return new Function("fn","return function "+e+"(){ return fn.apply(this,arguments)}")(n)}angular.module("angular-jsonapi").constant("namedFunction",e)}(),function(){"use strict";angular.module("angular-jsonapi").constant("lazyProperty",function(e,n,t){var r,a;Object.defineProperty(e,n,{get:function(){return a||(a=!0,r=t.call(e)),r},enumerable:!0,configurable:!0})})}(),function(){"use strict";angular.module("angular-jsonapi").constant("toKebabCase",function(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()})}(),function(){"use strict";function e(e){e.decorator("$q",n)}function n(e){function n(e,n,r){function a(e){return t.resolve(e).then(function(e){return angular.isFunction(n)&&n(e),{success:!0,value:e}},function(e){return angular.isFunction(r)&&r(e),{success:!1,reason:e}})}var o=angular.isArray(e)?[]:{};return angular.forEach(e,function(e,n){o.hasOwnProperty(n)||(o[n]=a(e))}),t.all(o)}var t=e;return t.allSettled=t.allSettled||n,t}angular.module("angular-jsonapi").config(e),e.$inject=["$provide"],n.$inject=["$delegate"]}(),function(){"use strict";function e(e,n,t){function r(e){return new a(e)}function a(n){var t=this;t.state={},e.call(t,n),angular.forEach(n,function(e){e.synchronizer=t})}function o(r){function a(e){d.notify({step:"synchronization",data:e})}function o(e){d.notify({step:"synchronization",errors:e})}function i(e){u.state[h]=u.state[h]||{},u.state[h].success=!0,angular.forEach(e,function(e){e.success===!1&&(u.state[h].success=!1)}),angular.forEach(u.sources,function(n){angular.forEach(n.afterHooks[h],function(n){d.notify({step:"after",errors:n.call(u,r,e)})})});var n,t=[];angular.forEach(e,function(e){e.success===!0?n=e.value:t.push({key:h,object:e.reason})}),t.length>0?d.reject({data:n||{},finish:s,errors:t}):d.resolve({data:n||{},finish:s,errors:t})}function s(){angular.forEach(u.sources,function(e){angular.forEach(e.finishHooks[h],function(e){d.notify({step:"finish",errors:e.call(u,r)})})})}function c(e){t.error("All settled rejected! Something went wrong"),d.reject({finish:angular.noop,errors:e})}var u=this,l=[],d=n.defer(),h=r.action;return e.prototype.synchronize.call(u,r),angular.forEach(u.sources,function(e){angular.forEach(e.beginHooks[h],function(e){d.notify({step:"begin",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.beforeHooks[h],function(e){d.notify({step:"before",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.synchronizationHooks[h],function(e){l.push(e.call(u,r))})}),n.allSettled(l,a,o).then(i,c),d.promise}return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,a.prototype.synchronize=o,{create:r}}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerSimple",e),e.$inject=["AngularJsonAPISynchronizerPrototype","$q","$log"]}(),function(){"use strict";function e(e){function n(e){var n=this;n.sources=e}function t(n){var t=this;e.debug("Synchro Collection",t.resource.schema.type,n),void 0===n.action&&e.error("Can't synchronize undefined action",n)}return n.prototype.synchronize=t,n}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerPrototype",e),e.$inject=["$log"]}(),function(){"use strict";function e(){function e(e){var n=this,t=["add","init","get","all","clearCache","remove","unlink","unlinkReflection","link","linkReflection","update","refresh","include"];n.name=e,n.state={},n.beginHooks={},n.beforeHooks={},n.synchronizationHooks={},n.afterHooks={},n.finishHooks={},n.options={},angular.forEach(t,function(e){n.beginHooks[e]=[],n.beforeHooks[e]=[],n.synchronizationHooks[e]=[],n.afterHooks[e]=[],n.finishHooks[e]=[],n.state[e]={loading:!1,success:!0}})}function n(e,n){var t=this;t.beginHooks[e].push(n)}function t(e,n){var t=this;t.finishHooks[e].push(n)}function r(e,n){var t=this;t.beforeHooks[e].push(n)}function a(e,n){var t=this;t.afterHooks[e].push(n)}function o(e,n){var t=this;t.synchronizationHooks[e].push(n)}return e.prototype.before=r, +!function(){"use strict";angular.module("angular-jsonapi-rest",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t,r,a,o){function i(e,n){return new s(e,n)}function s(r,i){function s(e){return o({method:"GET",headers:m,url:i,params:c(e.params)}).then(y,g.bind(null,"all"))}function u(e){return o({method:"GET",headers:m,url:i+"/"+e.object.data.id,params:c(e.params)}).then(y,g.bind(null,"get"))}function l(e){return o({method:"DELETE",headers:m,url:i+"/"+e.object.data.id}).then(y,g.bind(null,"remove"))}function d(n){var t=a.defer(),r=n.object.schema.relationships[n.key];return n.object.removed===!0?t.reject(e.create("Object has been removed",v,0,"unlink")):void 0!==n.target&&void 0===n.target.data.id?t.reject(e.create("Can't unlink object without id through rest call",v,0,"unlink")):"hasOne"===r.type?o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"get")).then(t.resolve,t.reject):"hasMany"===r.type&&(void 0===n.target?o({method:"PATCH",headers:m,data:{data:[]},url:i+"/"+n.object.data.id+"/relationships/"+n.key}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject):o({method:"DELETE",headers:m,url:i+"/"+n.object.data.id+"/relationships/"+n.key+"/"+n.target.data.id}).then(y,g.bind(null,"unlink")).then(t.resolve,t.reject)),t.promise}function h(e){var n=a.defer(),r=e.object.schema.relationships[e.key];return e.object.removed===!0?n.reject({errors:[{status:0,statusText:"Object has been removed"}]}):void 0===e.target||void 0===e.target.data.id?n.reject({errors:[{status:0,statusText:"Can't link object without id through rest call"}]}):"hasOne"===r.type?o({method:"PATCH",headers:m,data:{data:t.toLinkData(e.target)},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject):"hasMany"===r.type&&o({method:"POST",headers:m,data:{data:[t.toLinkData(e.target)]},url:i+"/"+e.object.data.id+"/relationships/"+e.key}).then(y,g.bind(null,"link")).then(n.resolve,n.reject),n.promise}function p(e){return o({method:"PATCH",headers:m,url:i+"/"+e.object.data.id,data:e.object.form.toJson()}).then(y,g.bind(null,"update"))}function f(e){return o({method:"POST",headers:m,url:i,data:e.object.form.toJson()}).then(y,g.bind(null,"add"))}function y(e){return a.resolve(e.data)}function g(n,t){function r(t){s.reject(e.create("Server is offline",v,t.status,n))}function i(){s.reject(e.create("No internet connection",v,t.status,n))}var s=a.defer();return 0===t.status?o({method:"GET",url:"https://status.cloud.google.com/incidents.schema.json"}).then(r,i):s.reject(e.create(t.statusText,v,t.status,n)),s.promise}var v=this,m={Accept:"application/vnd.api+json","Content-Type":"application/vnd.api+json"};n.apply(v,arguments),v.synchronization("remove",l),v.synchronization("unlink",d),v.synchronization("link",h),v.synchronization("update",p),v.synchronization("add",f),v.synchronization("all",s),v.synchronization("get",u),v.synchronization("refresh",u)}function c(e){function n(e){return angular.isArray(e)?e.join(","):e}var t={};return void 0===e?{}:(angular.forEach(e,function(e,r){angular.isArray(e)?t[r]=n(e):angular.isObject(e)?angular.forEach(e,function(e,a){t[r+"["+a+"]"]=n(e)}):t[r]=e}),t)}function u(e){var n={};return angular.forEach(e,function(e,t){var r=t.indexOf("[");if(e=e.split(","),r>-1){var a=t.substr(0,r),o=t.substr(r+1,t.indexOf("]")-r-1);n[a]=n[a]||{},n[a][o]=e}else n[t]=e}),n}return s.prototype=Object.create(n.prototype),s.prototype.constructor=s,{create:i,encodeParams:c,decodeParams:u}}angular.module("angular-jsonapi-rest").factory("AngularJsonAPISourceRest",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceRest=n,t}angular.module("angular-jsonapi-rest").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceRest"]}(),function(){"use strict";angular.module("angular-jsonapi-parse",["angular-jsonapi"]).constant("Parse",Parse)}(),function(){"use strict";function e(e,n,t,r,a,o,i){function s(e,n){return new c(e,n)}function c(e,t){function s(e){var n=new a.Query(y.ParseObject);return void 0!==e.params.limit&&n.limit(e.params.limit),angular.forEach(e.params.filter,function(e){n.equalTo(e.key,e.value)}),n.find().then(p,f.bind(null,"all"))}function c(e){var n=new a.Query(y.ParseObject);return n.get(e.object.data.id).then(p,f.bind(null,"get"))}function u(e){var n=new y.ParseObject;return n.set("id",e.object.data.id),n.destroy().then(p,f.bind(null,"remove"))}function l(e){var n=d(e.object);return n.save(null).then(p,f.bind(null,"update"))}function d(e){var n=new y.ParseObject;return angular.forEach(e.form.data.attributes,function(e,t){n.set(t,e)}),angular.forEach(e.schema.relationships,function(t,o){if("hasOne"===t.type&&null!==e.form.data.relationships[o].data&&void 0!==e.form.data.relationships[o].data){var i=r(o,1).charAt(0).toUpperCase()+r(o,1).slice(1),s=new(a.Object.extend(i));s.set("id",e.form.data.relationships[o].data.id),n.set(o,s)}}),n}function h(e){var n=y.synchronizer.resource.schema.relationships;return e.type=y.type,e.relationships=e.relationships||[],angular.forEach(n,function(n,t){e.attributes[t]&&"hasOne"===n.type&&(e.relationships[t]={data:{type:n.model,id:e.attributes[t].id}})}),e}function p(e){return angular.isArray(e)?angular.forEach(e,function(n,t){e[t]=h(n)}):angular.isObject(e)&&(e=h(e)),i.resolve({data:e})}function f(e,n){return o.error("Parse error for",e,n),i.reject(n)}var y=this;y.ParseObject=a.Object.extend(t),y.type=r(t).charAt(0).toLowerCase()+r(t).slice(1),n.apply(y,arguments),y.synchronization("remove",u),y.synchronization("update",l),y.synchronization("add",l),y.synchronization("all",s),y.synchronization("get",c),y.synchronization("refresh",c)}function u(e,n){a.initialize(e,n)}return c.prototype=Object.create(n.prototype),c.prototype.constructor=c,c.prototype.initialize=u,{create:s}}angular.module("angular-jsonapi-parse").factory("AngularJsonAPISourceParse",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","pluralize","Parse","$log","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-parse").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceParse"]}(),function(){"use strict";angular.module("angular-jsonapi-local",["angular-jsonapi"])}(),function(){"use strict";function e(e,n,t){function r(e,n){return new a(e,n)}function a(r,a){function i(){var e=l.synchronizer.resource.schema.type;return t.resolve(n.localStorage.getItem(a+"."+e))}function s(){var e=l.synchronizer.resource.schema.type,t=a+"."+e;o.all-=o.list[t],delete o.list[t],o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.removeItem(t)}function c(){var e=l.synchronizer.resource.schema.type,t=l.synchronizer.resource.cache,r=t.toJson(),i=a+"."+e;o.list[i]=void 0===o.list[i]?0:o.list[i],o.all+=r.length-o.list[i],o.list[i]=r.length,o.max=u(o.list),o.fraction=o.list[o.max]/o.limit*100,n.localStorage.setItem(i,r)}function u(e){return Object.keys(e).reduce(function(n,t){return e[t]>e[n]?t:n},Object.keys(e)[0])}var l=this;a=a||"AngularJsonAPI",l.__updateStorage=c,e.apply(l,arguments),l.synchronization("init",i),l.begin("clearCache",s),l.finish("init",c),l.finish("clearCache",c),l.finish("remove",c),l.finish("refresh",c),l.finish("unlink",c),l.finish("unlinkReflection",c),l.finish("link",c),l.finish("linkReflection",c),l.finish("update",c),l.finish("add",c),l.finish("get",c),l.finish("all",c),l.finish("include",c)}var o={max:0,all:0,limit:52e5,list:{}};return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,{create:r,size:o}}angular.module("angular-jsonapi-local").factory("AngularJsonAPISourceLocal",e),e.$inject=["AngularJsonAPISourcePrototype","$window","$q"]}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}angular.module("angular-jsonapi-local").config(e),e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceLocal"]}(),function(){"use strict";angular.module("angular-jsonapi",["uuid4"]).constant("pluralize",pluralize).constant("validateJS",validate)}(),function(){"use strict";function e(e,n){function t(e){return new r(e)}function r(e){var n=this;n.resource=e,n.data={},n.removed={},n.size=0,n.indexIds=void 0}function a(e,t,r){var a=this,o=e.id;return void 0===o?void n.error("Can't add data without id!",e):(void 0===a.data[o]?(a.data[o]=a.resource.modelFactory(e,t,r),a.size+=1):a.data[o].update(e,!t["new"],t.initialization),a.data[o])}function o(e){var n=this,t=angular.fromJson(e),r={"new":!1,"synchronized":!1,stable:!1,pristine:!1,initialization:!0};angular.isObject(t)&&void 0!==t.data&&(n.updatedAt=t.updatedAt,n.indexIds=t.indexIds,angular.forEach(t.data,function(e){var t=e.data;n.addOrUpdate(t,r,e.updatedAt)}))}function i(){var e=this,n={data:[],updatedAt:e.updatedAt,indexIds:e.indexIds};return angular.forEach(e.data,function(e){e.hasErrors()===!1&&n.data.push(e.toJson())}),angular.toJson(n)}function s(){var e=this;e.indexIds=void 0,e.data={},e.removed={}}function c(e){var n=this,t={id:e,type:n.resource.schema.type},r={"new":!1,"synchronized":!1,stable:!1,pristine:!0};return void 0===n.data[e]&&(n.data[e]=n.resource.modelFactory(t,r)),n.data[e]}function u(e){function n(n){var t=e.filter,r=!0;return angular.forEach(t,function(e){r=r&&n.data.attributes[e.key]===e.value}),r}var t=this;return e=e||{},void 0===t.indexIds?t.indexIds:t.indexIds.map(t.get.bind(t)).filter(n)}function l(e){var n=this;n.indexIds=[],angular.forEach(e,function(e){angular.isString(e)&&n.resource.schema.id.validate(e)?n.indexIds.push(e):angular.isObject(e)&&n.resource.schema.id.validate(e.data.id)&&n.indexIds.push(e.data.id)})}function d(e){var n=this;return void 0!==n.data[e]&&(n.removed[e]=n.data[e],delete n.data[e],n.size-=1),n.removed[e]}function h(e){var n=this;return void 0!==n.removed[e]&&(n.data[e]=n.removed[e],delete n.removed[e],n.size+=1),n.data[e]}function p(e){var n=this;delete n.removed[e]}return r.prototype.get=c,r.prototype.index=u,r.prototype.setIndexIds=l,r.prototype.addOrUpdate=a,r.prototype.fromJson=o,r.prototype.toJson=i,r.prototype.clear=s,r.prototype.remove=d,r.prototype.revertRemove=h,r.prototype.clearRemoved=p,{create:t}}angular.module("angular-jsonapi").factory("AngularJsonAPIResourceCache",e),e.$inject=["uuid4","$log"]}(),function(){"use strict";function e(e){function n(e){return null===e?null:{type:e.data.type,id:e.data.id}}function t(n,t,r,i,u){var l;return u=void 0===u?!1:u,void 0===n?(e.error("Can't add link to non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(l=n.schema.relationships[t],void 0===r?(e.error("Can't link non existing object",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):void 0===l?(e.error("Can't add link not present in schema:",n,t,r,l),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):null!==r&&l.polymorphic===!1&&l.model!==r.data.type?(e.error("This relation is not polymorphic, expected: "+l.model+" instead of "+r.data.type),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",l),[]):"hasMany"===l.type?i===!0?(c(n,t,r,u),[]):a(n,t,r,u):"hasOne"===l.type?i===!0?(s(n,t,r,u),[]):o(n,t,r,u):void 0)}function r(n,t,r,a,o){var s;return o=void 0===o?!1:o,void 0===n?(e.error("Can't remove link from non existing object",n,t,r),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),[]):(s=n.schema.relationships[t],void 0===s?(e.error("Can't remove link not present in schema:",n,t,r,s),e.error("Object:",n.data.type,n),e.error("Target:",r.data.type,r),e.error("Key:",t),e.error("Schema:",s),[]):a===!0?(l(n,t,r,o),[]):i(n,t,r,o))}function a(n,t,r,a){var i,s=n.schema.relationships[t].reflection;return s===!1?(c(n,t,r,a),[]):(i=r.schema.relationships[s],void 0===i?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):"hasOne"===i.type?h(d(n,t,r),d(r,s,n),o(r,s,n,a)):"hasMany"===i.type?(c(n,t,r,a),c(r,s,n,a),[d(r,s,n)]):void 0)}function o(n,t,r,a){var o,i,h=n.schema.relationships[t].reflection,p=n.relationships[t],f=[];return s(n,t,r,a),h===!1?[]:(void 0!==p&&null!==p&&(i=p.schema.relationships[h],void 0!==i?("hasOne"===i.type?u(p,h,n,a):"hasMany"===i.type&&l(p,h,n,a),f.push(d(p,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),void 0!==r&&null!==r&&h!==!1&&(o=r.schema.relationships[h],void 0!==o?("hasOne"===o.type?s(r,h,n,a):"hasMany"===o.type&&c(r,h,n,a),f.push(d(r,h,n))):(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"))),f)}function i(n,t,r,a){var o,i=n.schema.relationships[t],s=i.reflection;return"hasMany"===i.type?l(n,t,r,a):"hasOne"===i.type&&u(n,t,r,a),s===!1?[]:(o=r.schema.relationships[s],void 0===o?(e.error("Cannot find reflection of",t,"relationship for",n.data.type,"in",r.data.type),e.error("For one side relationships set schema.reflection to false"),[]):("hasOne"===o.type?u(r,s,n,a):"hasMany"===o.type&&l(r,s,n,a),[d(r,s,n)]))}function s(t,r,a,o){return e.debug("addHasOne",t,r,a),o===!0&&(t=t.form),t.relationships[r]=a,t.data.relationships[r].data=n(a),o===!1&&t.reset(!0),!0}function c(t,r,a,o){e.debug("addHasMany",t,r,a);var i=n(a);return o===!0&&(t=t.form),angular.isArray(t.relationships[r])&&t.relationships[r].indexOf(a)>-1?!1:(t.relationships[r]=t.relationships[r]||[],t.data.relationships[r].data=t.data.relationships[r].data||[],t.relationships[r].push(a),t.data.relationships[r].data.push(i),o===!1&&t.reset(!0),!0)}function u(n,t,r,a){return e.debug("removeHasOne",n,t,r),a===!0&&(n=n.form),void 0!==r&&n.relationships[t]!==r?!1:(n.relationships[t]=null,n.data.relationships[t].data=void 0,a===!1&&n.reset(!0),!0)}function l(n,t,r,a){if(e.debug("removeHasMany",n,t,r),a===!0&&(n=n.form),void 0!==n.relationships[t]){if(void 0===r)return n.relationships[t]=[],n.data.relationships[t].data=[],a===!1&&n.reset(!0),!0;var o=n.relationships[t].indexOf(r);return-1===o?!1:(n.relationships[t].splice(o,1),n.data.relationships[t].data.splice(o,1),a===!1&&n.reset(!0),!0)}}function d(e,n,t){return{object:e,key:n,target:t}}function h(e,n,t){var r=-1;return angular.forEach(t,function(n,t){n.object===e.object&&n.key===e.key&&n.target===e.target&&(r=t)}),r>-1?t[r]=n:t.push(n),t}var p=this;return p.toLinkData=n,p.link=t,p.unlink=r,this}angular.module("angular-jsonapi").service("AngularJsonAPIModelLinkerService",e),e.$inject=["$log"]}(),function(){"use strict";function e(e,n,t,r){function a(e){return new o(e)}function o(e){var n=this;n.data={id:e.data.id,type:e.data.type,attributes:{},relationships:{}},n.relationships={},n.parent=e,n.schema=e.schema,n.reset()}function i(){var e=this,n=angular.copy(e.data),t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n}}function s(){var e=this;return e.parent.save()}function c(e){var n=this;angular.forEach(n.schema.relationships,function(e,t){n.data.relationships[t]=angular.copy(n.parent.data.relationships[t])||{},angular.isArray(n.relationships[t])?n.relationships[t]=n.parent.relationships[t].slice():n.relationships[t]=n.parent.relationships[t]}),(e!==!0||n.parent["synchronized"]!==!0)&&(angular.forEach(n.schema.attributes,function(e,t){n.data.attributes[t]=angular.copy(n.parent.data.attributes[t])}),n.parent.errors.validation.clear())}function u(n){function a(){void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),u.resolve()}function o(t){c.parent.error=!0,void 0===n?c.parent.errors.validation.clear():c.parent.errors.validation.clear(n),angular.forEach(t,function(n,t){angular.forEach(n,function(n){c.parent.errors.validation.add(t,e.create(n,t))})}),u.reject(c.parent.errors.validation)}var i,s,c=this,u=r.defer();return void 0===n?(i=c.data.attributes,s=c.schema.attributes):(i={},s={},i[n]=c.data.attributes[n],s[n]=c.schema.attributes[n]),t.async(i,s).then(a,o),u.promise}function l(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.link(o.parent,e,t,a,!0))}function d(e,t,a){var o=this;return a=void 0===a?!1:!0,r.resolve(n.unlink(o.parent,e,t,a,!0))}return o.prototype.save=s,o.prototype.reset=c,o.prototype.validate=u,o.prototype.link=l,o.prototype.unlink=d,o.prototype.toJson=i,{create:a}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelForm",e),e.$inject=["AngularJsonAPIModelValidationError","AngularJsonAPIModelLinkerService","validateJS","$q"]}(),function(){"use strict";function e(e,o,i,s,c,u,l,d,h){function p(n,t,r){var a=this;n.relationships=n.relationships||{},a["new"]=void 0===t["new"]?!1:t["new"],a.stable=void 0===t.stable?!0:t.stable,a["synchronized"]=void 0===t["synchronized"]?!0:t["synchronized"],a.pristine=void 0===t.pristine?!0:t.pristine,a.removed=!1,a.loading=!1,a.saving=!1,a.updatedAt=a["synchronized"]===!0?Date.now():r,a.loadingCount=0,a.savingCount=0,a.data={relationships:{},attributes:{}},a.relationships={},angular.forEach(a.schema.relationships,function(e,n){a.relationships[n]=void 0}),a.errors={validation:i.create("Validation","Errors of attributes validation",o),synchronization:i.create("Source","Errors of synchronizations",e)},a.promise=h.resolve(a),P(a,n),a.form=c.create(a)}function f(){function e(){i.synchronize(c).then(n,t,o)}function n(e){u.$emit("angularJsonAPI:"+i.data.type+":object:"+c.action,"resolved",i,e),i.update(e.data.data),i["new"]===!0&&(i.resource.cache.indexIds=i.resource.cache.indexIds||[],i.resource.cache.indexIds.push(i.data.id)),i["synchronized"]=!0,i["new"]=!1,i.pristine=!1,i.stable=!0,e.finish(),i.errors.synchronization.concat(e.errors),s.resolve(e.data.meta)}function t(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","rejected",i,e),e.finish(),i.errors.synchronization.concat(e.errors),s.reject(i)}function o(e){u.$emit("angularJsonAPI:"+i.data.type+":object:save","notify",i,e),s.notify(e)}var i=this,s=h.defer(),c={action:i["new"]===!0?"add":"update",object:i};return i.form.validate().then(e,s.reject)["finally"](a.bind(i,void 0)),r(i),s.promise}function y(){var e=this;void 0!==e.form&&e.form.reset()}function g(r){function a(e){function r(e){return n(e),e.synchronize({action:"include",object:e})["finally"](t.bind(e,void 0))}function a(n){angular.forEach(n,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+o.included[n].data.type+":object:include","resolved",o.included[n],e),e.value.finish())}),c.resolve(e.data.meta)}var o=s.__proccesResults(e.data);u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","resolved",d,e),h.allSettled(o.included.map(r)).then(a,c.reject),d["synchronized"]=!0,d.stable=!0,d.pristine=!1,e.finish(),d.errors.synchronization.concat(e.errors)}function o(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","rejected",d,e),e.finish(),d.errors.synchronization.concat(e.errors),c.reject(d)}function i(e){u.$emit("angularJsonAPI:"+d.data.type+":object:refresh","notify",d,e),c.notify(e)}var s=l.get("$jsonapi"),c=h.defer(),d=this;r=void 0===r?d.schema.params.get:r;var p={action:"refresh",object:d,params:r};if(d["new"]===!0){var f=e.create("Can't refresh new object",null,0,"refresh");d.errors.synchronization.add("refresh",f),c.reject(f)}else n(d),d.synchronize(p).then(a,o,i)["finally"](t.bind(d,void 0));return c.promise}function v(){var e=this,n=e.data,t={};return angular.forEach(n.relationships,function(e,n){void 0!==e.data&&(t[n]=e)}),n.relationships=t,{data:n,updatedAt:e.updatedAt}}function m(){function e(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","resolved",o,e),o.removed=!0,o.unlinkAll(),o.resource.cache.clearRemoved(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function n(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","rejected",o,e),o.resource.cache.revertRemove(o.data.id),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function t(e){u.$emit("angularJsonAPI:"+o.data.type+":object:remove","notify",o,e),i.notify(e)}var o=this,i=h.defer(),s={action:"remove",object:o};return o.resource.cache.remove(o.data.id),o["new"]===!0?i.resolve():(r(o),o.synchronize(s).then(e,n,t)["finally"](a.bind(o,void 0))),i.promise}function j(e){function r(e,n){var t=o.schema.relationships[n],r=t.reflection;angular.isArray(e)?angular.forEach(e,a.bind(void 0,r)):angular.isObject(e)&&a(r,e),"hasOne"===t.type?o.relationships[n]=null:"hasMany"===t.type&&(o.relationships[n]=[])}function a(e,r){function a(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","resolve",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.resolve()}function c(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","rejected",o,e),e.finish(),o.errors.synchronization.concat(e.errors),i.reject(o)}function l(e){u.$emit("angularJsonAPI:"+o.data.type+":object:unlinkReflection","notify",o,e),e.finish(),i.notify(e)}var d=r.schema.relationships[e],h={action:"unlinkReflection",object:r,target:o,key:e};n(r),s.unlink(r,e,o,d),r.synchronize(h).then(a,c,l)["finally"](t.bind(r,void 0))}var o=this,i=h.defer();return n(o),void 0===e?angular.forEach(o.relationships,r):r(o.relationships[e],e),t(o),i.promise}function b(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"linkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(e,n){e.success===!0&&(u.$emit("angularJsonAPI:"+c[n].object.data.type+":object:linkReflection","resolved",c[n],e),e.value.finish())}),f.resolve(e.data.meta)}u.$emit("angularJsonAPI:"+y.data.type+":object:link","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:link","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"link",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't link undefined",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):y["new"]===!0?(p=e.create("Can't link new object",null,0,"link"),y.errors.synchronization.add("link",p),f.reject(p)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function A(o,i){function c(e){function r(e){return n(i),i.synchronize({action:"unlinkReflection",object:e.object,target:e.target,key:e.key})["finally"](t.bind(i,void 0))}function a(e){angular.forEach(e,function(n){n.success===!0&&(u.$emit("angularJsonAPI:"+c[o].data.type+":object:unlinkReflection","resolved",c[o],n),e.value.finish())}),f.resolve()}u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","resolved",y,e);var c=s.link(y,o,i);y.stable=!0,y.pristine=!1,e.finish(),y.errors.synchronization.concat(e.errors),h.allSettled(c.map(r)).then(a,f.reject)}function l(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","rejected",y,e),f.reject(e.errors),e.finish(),y.errors.synchronization.concat(e.errors),f.reject(y)}function d(e){u.$emit("angularJsonAPI:"+y.data.type+":object:unlink","notify",y,e),f.notify(e)}var p,f=h.defer(),y=this,g={action:"unlink",object:y,target:i,key:o};return void 0===i?(p=e.create("Can't unlink undefined",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):y["new"]===!0?(p=e.create("Can't unlink new object",null,0,"unlink"),y.errors.synchronization.add("unlink",p),f.reject(y)):(r(y),y.synchronize(g).then(c,l,d)["finally"](a.bind(y,void 0))),f.promise}function k(e,r,a){var o=this;n(o),P(o,e),o.reset(r),o["synchronized"]=a===!0?!1:!0,o.stable=a===!0?!1:!0,o.updatedAt=Date.now(),t(o)}function z(){var e=this,n=!1;return angular.forEach(e.errors,function(e){n=e.hasErrors()||n}),n}function P(e,n){function t(t,r){e.data.attributes[r]=n.attributes[r]}function r(t,r){var i=n.relationships[r];return void 0===i?void(void 0===e.data.relationships[r]&&(e.data.relationships[r]={data:void 0})):(e.data.relationships[r]=e.data.relationships[r]||{},e.data.relationships[r].links=i.links,void("hasOne"===t.type?a(e,r,i.data):"hasMany"===t.type&&angular.isArray(i.data)&&(0===i.data.length?(e.data.relationships[r].data=[],e.unlinkAll(r)):(angular.forEach(e.relationships[r],o.bind(void 0,e,r,i.data)),angular.forEach(i.data,a.bind(void 0,e,r))))))}function a(e,n,t){var r;if(null===t)return void s.link(e,n,null);if(void 0!==t){if(r=i.getResource(t.type),void 0===r)return void d.error("Factory not found",t.type,t);var a=r.cache.get(t.id);s.link(e,n,a)}}function o(e,n,t,r){t.indexOf(r.data.id)>-1||s.unlink(e,n,r)}var i=l.get("$jsonapi"),c=e.schema;return e.data.id=n.id,e.data.type=n.type,e.resource.schema.type!==n.type?(d.error("Different type then resource",e.resource.schema.type,n),!1):e.schema.id.validate(e.data.id)?(e.data.links=n.links,n.attributes=n.attributes||{},n.relationships=n.relationships||{},angular.forEach(c.attributes,t),angular.forEach(c.relationships,r),!0):(d.error("Invalid id"),!1)}return p.prototype.refresh=g,p.prototype.remove=m,p.prototype.reset=y,p.prototype.save=f,p.prototype.update=k,p.prototype.link=b,p.prototype.unlink=A,p.prototype.unlinkAll=j,p.prototype.toJson=v,p.prototype.hasErrors=z,p}function n(e){e=void 0===e?this:e,e.loadingCount+=1,e.loading=!0}function t(e){e=void 0===e?this:e,e.loadingCount-=1,e.loading=e.loadingCount>0}function r(e){e=void 0===e?this:e,e.savingCount+=1,e.saving=!0}function a(e){e=void 0===e?this:e,e.savingCount-=1,e.saving=e.savingCount>0}angular.module("angular-jsonapi").factory("AngularJsonAPIAbstractModel",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelValidationError","AngularJsonAPIModelErrorsManager","AngularJsonAPIModelLinkerService","AngularJsonAPIModelForm","$rootScope","$injector","$log","$q"]}(),function(){"use strict";function e(){function e(e,t){return new n(e,t)}function n(e,n){var t=this;t.message=e,t.context={attribute:n}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="ValidationError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelValidationError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.message=e,a.context={source:n,code:t,action:r}}return n.prototype=Object.create(Error.prototype),n.prototype.constructor=n,n.prototype.name="SourceError",{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelSourceError",e)}(),function(){"use strict";function e(){function e(e,t,r,a){return new n(e,t,r,a)}function n(e,n,t,r){var a=this;a.name=e,a.description=n,a.ErrorConstructor=t,a.errors={},a.defaultFilter=r||function(){return!0}}function t(e){var n=this;void 0===e?angular.forEach(n.errors,function(e,t){n.errors[t]=[]}):n.errors[e]=[]}function r(e,n){var t=this;t.errors[e]=t.errors[e]||[],t.errors[e].push(n)}function a(e){var n=this;angular.forEach(e,function(e){n.errors[e.key]=[]}),angular.forEach(e,function(e){n.errors[e.key].push(e.object)})}function o(e){var n=this;if(void 0===e){var t=!1;return angular.forEach(n.errors,function(e){t=t||e.length>0}),t}return void 0!==n.errors[e]&&n.errors[e].length>0}return n.prototype.constructor=n,n.prototype.concat=a,n.prototype.clear=t,n.prototype.add=r,n.prototype.hasErrors=o,{create:e}}angular.module("angular-jsonapi").factory("AngularJsonAPIModelErrorsManager",e)}(),function(){"use strict";function e(e,n){return new Function("fn","return function "+e+"(){ return fn.apply(this,arguments)}")(n)}angular.module("angular-jsonapi").constant("namedFunction",e)}(),function(){"use strict";angular.module("angular-jsonapi").constant("lazyProperty",function(e,n,t){var r,a;Object.defineProperty(e,n,{get:function(){return a||(a=!0,r=t.call(e)),r},enumerable:!0,configurable:!0})})}(),function(){"use strict";angular.module("angular-jsonapi").constant("toKebabCase",function(e){return e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()})}(),function(){"use strict";function e(e){e.decorator("$q",n)}function n(e){function n(e,n,r){function a(e){return t.resolve(e).then(function(e){return angular.isFunction(n)&&n(e),{success:!0,value:e}},function(e){return angular.isFunction(r)&&r(e),{success:!1,reason:e}})}var o=angular.isArray(e)?[]:{};return angular.forEach(e,function(e,n){o.hasOwnProperty(n)||(o[n]=a(e))}),t.all(o)}var t=e;return t.allSettled=t.allSettled||n,t}angular.module("angular-jsonapi").config(e),e.$inject=["$provide"],n.$inject=["$delegate"]}(),function(){"use strict";function e(e,n,t){function r(e){return new a(e)}function a(n){var t=this;t.state={},e.call(t,n),angular.forEach(n,function(e){e.synchronizer=t})}function o(r){function a(e){d.notify({step:"synchronization",data:e})}function o(e){d.notify({step:"synchronization",errors:e})}function i(e){u.state[h]=u.state[h]||{},u.state[h].success=!0,angular.forEach(e,function(e){e.success===!1&&(u.state[h].success=!1)}),angular.forEach(u.sources,function(n){angular.forEach(n.afterHooks[h],function(n){d.notify({step:"after",errors:n.call(u,r,e)})})});var n,t=[];angular.forEach(e,function(e){e.success===!0?n=e.value:t.push({key:h,object:e.reason})}),t.length>0?d.reject({data:n||{},finish:s,errors:t}):d.resolve({data:n||{},finish:s,errors:t})}function s(){angular.forEach(u.sources,function(e){angular.forEach(e.finishHooks[h],function(e){d.notify({step:"finish",errors:e.call(u,r)})})})}function c(e){t.error("All settled rejected! Something went wrong"),d.reject({finish:angular.noop,errors:e})}var u=this,l=[],d=n.defer(),h=r.action;return e.prototype.synchronize.call(u,r),angular.forEach(u.sources,function(e){angular.forEach(e.beginHooks[h],function(e){d.notify({step:"begin",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.beforeHooks[h],function(e){d.notify({step:"before",data:e.call(u,r)})})}),angular.forEach(u.sources,function(e){angular.forEach(e.synchronizationHooks[h],function(e){l.push(e.call(u,r))})}),n.allSettled(l,a,o).then(i,c),d.promise}return a.prototype=Object.create(e.prototype),a.prototype.constructor=a,a.prototype.synchronize=o,{create:r}}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerSimple",e),e.$inject=["AngularJsonAPISynchronizerPrototype","$q","$log"]}(),function(){"use strict";function e(e){function n(e){var n=this;n.sources=e}function t(n){var t=this;e.debug("Synchro Collection",t.resource.schema.type,n),void 0===n.action&&e.error("Can't synchronize undefined action",n)}return n.prototype.synchronize=t,n}angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerPrototype",e),e.$inject=["$log"]}(),function(){"use strict";function e(){function e(e){var n=this,t=["add","init","get","all","clearCache","remove","unlink","unlinkReflection","link","linkReflection","update","refresh","include"];n.name=e,n.state={},n.beginHooks={},n.beforeHooks={},n.synchronizationHooks={},n.afterHooks={},n.finishHooks={},n.options={},angular.forEach(t,function(e){n.beginHooks[e]=[],n.beforeHooks[e]=[],n.synchronizationHooks[e]=[],n.afterHooks[e]=[],n.finishHooks[e]=[],n.state[e]={loading:!1,success:!0}})}function n(e,n){var t=this;t.beginHooks[e].push(n)}function t(e,n){var t=this;t.finishHooks[e].push(n)}function r(e,n){var t=this;t.beforeHooks[e].push(n)}function a(e,n){var t=this;t.afterHooks[e].push(n)}function o(e,n){var t=this;t.synchronizationHooks[e].push(n)}return e.prototype.before=r, e.prototype.after=a,e.prototype.begin=n,e.prototype.finish=t,e.prototype.synchronization=o,e}angular.module("angular-jsonapi").factory("AngularJsonAPISourcePrototype",e)}(),function(){"use strict";function e(e,n,t,r){function a(e){return new o(e)}function o(e){var n=this,a=e.include||{};e.include=a,a.get=e.include.get||[],a.all=e.include.all||[],n.params={get:{},all:{}},"uuid4"===e.id?e.id=t:"int"===e.id?e.id={generate:angular.noop,validate:angular.isNumber}:angular.isObject(e.id)?angular.isFunction(e.id.generate)||(e.id.generate=angular.noop):e.id={generate:angular.noop,validate:angular.identity.bind(null,!0)},angular.forEach(e.relationships,function(n,t){var o=r.create(n,t,e.type);e.relationships[t]=o,o.included===!0&&(a.get.push(t),"hasOne"===o.type&&a.all.push(t))}),angular.extend(n,e),a.get.length>0&&(n.params.get.include=a.get),a.all.length>0&&(n.params.all.include=a.all)}return{create:a}}angular.module("angular-jsonapi").factory("AngularJsonAPISchema",e),e.$inject=["$log","pluralize","uuid4","AngularJsonAPISchemaLink"]}(),function(){"use strict";function e(e,n){function t(e,n,t){return new r(e,n,t)}function r(t,r,a){var o=this;angular.isString(t)?(o.model=n.plural(r),o.type=t,o.polymorphic=!1,o.reflection=a):(void 0===t.type&&e.error("Schema of link without a type: ",t,r),"hasMany"!==t.type&&"hasOne"!==t.type&&e.error("Schema of link with wrong type: ",t.type,"available: hasOne, hasMany"),o.model=t.model||n.plural(r),o.type=t.type,o.polymorphic=t.polymorphic||!1,void 0===t.reflection?o.reflection="hasMany"===o.type?n.singular(a):a:o.reflection=t.reflection,o.included=t.included||!1)}return{create:t}}angular.module("angular-jsonapi").factory("AngularJsonAPISchemaLink",e),e.$inject=["$log","pluralize"]}(),function(){"use strict";function e(e,n,t,r,a,o,i){function s(e,n){return new c(e,n)}function c(r,o){function i(e){a.$emit("angularJsonAPI:"+u.type+":resource:init","resolved",e),u.cache.fromJson(e.data),u.initialized=!0,e.finish()}function s(e){a.$emit("angularJsonAPI:"+u.type+":resource:init","rejected",e),e.finish(),u.initialized=!0}function c(e){a.$emit("angularJsonAPI:"+u.type+":resource:init","notify",e)}var u=this,l={action:"init"};u.schema=n.create(r),u.cache=t.create(u),u.synchronizer=o,u.synchronizer.resource=u,u.modelFactory=e.modelFactory(u.schema,u),u.initialized=!1,u.type=u.schema.type,o.resource=u,u.synchronizer.synchronize(l).then(i,s,c)}function u(e,n){var t=this;if(!t.schema.id.validate(e))return i.reject({errors:[{status:0,statusText:"Invalid id"}]});var r=t.cache.get(e);return r.promise=r.refresh(n),r}function l(e){var n=this;e=angular.extend({},n.schema.params.all,e);var t=r.create(n,e);return t.promise=t.fetch(),t}function d(e){var n=this,t=n.cache.remove(e);return t.remove()}function h(){var e=this,n={};angular.forEach(e.schema.relationships,function(e,t){"hasOne"===e.type?n[t]={data:null}:"hasMany"===e.type&&(n[t]={data:[]})});var t={type:e.type,id:e.schema.id.generate(),attributes:{},relationships:n},r={"new":!0,"synchronized":!1,stable:!1,pristine:!1,initialization:!1},o=e.modelFactory(t,r);return a.$emit("angularJsonAPI:"+e.type+":resource:initialize","resolved",o),o}function p(){function e(e){a.$emit("angularJsonAPI:"+r.type+":resource:clearCache","resolved",e),e.finish(),o.resolve(e)}function n(e){a.$emit("angularJsonAPI:"+r.type+":resource:clearCache","resolved",e),e.finish(),o.reject(e)}function t(e){a.$emit("angularJsonAPI:"+r.type+":resource:clearCache","notify",e),o.notify(e)}var r=this,o=i.defer(),s={action:"clearCache"};return r.cache.clear(),r.synchronizer.synchronize(s).then(e,n,t),o}return c.prototype.get=u,c.prototype.all=l,c.prototype.remove=d,c.prototype.initialize=h,c.prototype.clearCache=p,{create:s}}angular.module("angular-jsonapi").factory("AngularJsonAPIResource",e),e.$inject=["AngularJsonAPIModel","AngularJsonAPISchema","AngularJsonAPIResourceCache","AngularJsonAPICollection","$rootScope","$log","$q"]}(),function(){"use strict";function e(e,n,t,r,a){function o(n,o){function i(e,n,t){return new c(e,n,t)}var s=r.plural(n.type,1),c=t(s,function(n,t,r){var o=this;n.type!==o.schema.type&&a.error("Data type other then declared in schema: ",n.type," instead of ",o.schema.type),e.call(o,n,t,r),o.form.parent=o});return c.prototype=Object.create(e.prototype),c.prototype.constructor=c,c.prototype.schema=n,c.prototype.resource=o,c.prototype.synchronize=o.synchronizer.synchronize.bind(o.synchronizer),angular.forEach(n.functions,function(e,n){c.prototype[n]=function(){return e.apply(this,arguments)}}),i}return{modelFactory:o}}angular.module("angular-jsonapi").factory("AngularJsonAPIModel",e),e.$inject=["AngularJsonAPIAbstractModel","AngularJsonAPISchema","namedFunction","pluralize","$log"]}(),function(){"use strict";function e(e,r,a,o,i){function s(e,n){return new c(e,n)}function c(n,t){function o(e,n,t){var r;"resolved"===n&&void 0!==l.data&&(r=l.data.indexOf(t),r>-1&&(l.data.splice(r,1),l.resource.cache.setIndexIds(l.data)))}function s(){l.data=void 0,l.pristine=!0}function c(e,n,t){"resolved"===n&&(l.data=l.data||[],l.data.push(t))}function u(){d(),h(),p()}var l=this;l.resource=n,l.type=n.schema.type,l.params=t||{},l.errors={synchronization:r.create("Source","Errors of synchronizations",e)},l.data=l.resource.cache.index(l.params),l.loading=!1,l.loadingCount=0,l["synchronized"]=!1,l.pristine=void 0===l.data,l.promise=i.resolve(l);var d=a.$on("angularJsonAPI:"+l.type+":object:remove",o),h=a.$on("angularJsonAPI:"+l.type+":resource:clearCache",s),p=a.$on("angularJsonAPI:"+l.type+":object:add",c);a.$on("$destroy",u)}function u(){var e=this,n=!1;return angular.forEach(e.errors,function(e){n=e.hasErrors()||n}),n}function l(e,n){var t=this;return t.resource.get(e,n)}function d(){function e(e){function r(e){return n(e),e.synchronize({action:"include",object:e})["finally"](t.bind(e,void 0))}function o(n){angular.forEach(n,function(e,n){e.success===!0&&(a.$emit("angularJsonAPI:"+s.included[n].data.type+":object:include","resolved",s.included[n],e),e.value.finish())}),u.resolve(e.data.meta)}var s=l.__proccesResults(e.data);a.$emit("angularJsonAPI:"+c.type+":collection:fetch","resolved",c,e),i.allSettled(s.included.map(r)).then(o,u.reject),angular.forEach(c.data,t),c.data=s.data,c.links=e.data.links,c.updatedAt=Date.now(),c["synchronized"]=!0,c.pristine=!1,c.resource.cache.setIndexIds(c.data),e.finish(),c.errors.synchronization.concat(e.errors)}function r(e){a.$emit("angularJsonAPI:"+c.type+":collection:fetch","rejected",c,e),angular.forEach(c.data,t),e.finish(),c.errors.synchronization.concat(e.errors),u.reject(c)}function s(e){a.$emit("angularJsonAPI:"+c.type+":collection:fetch","notify",c,e),u.notify(e)}var c=this,u=i.defer(),l=o.get("$jsonapi"),d={action:"all",params:c.params};return n(c),angular.forEach(c.data,n),c.resource.synchronizer.synchronize(d).then(e,r,s)["finally"](t.bind(c,void 0)),u.promise}return c.prototype.fetch=d,c.prototype.refresh=d,c.prototype.get=l,c.prototype.hasErrors=u,{create:s}}function n(e){e=void 0===e?this:e,e.loadingCount+=1,e.loading=!0}function t(e){e=void 0===e?this:e,e.loadingCount-=1,e.loading=e.loadingCount>0}angular.module("angular-jsonapi").factory("AngularJsonAPICollection",e),e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelErrorsManager","$rootScope","$injector","$q"]}(),function(){"use strict";function e(e){function n(n,a,o){function i(e,n){var o=a.create(e,n);t[e.type]=o,r.push(e.type)}function s(e){return t[e]}function c(){return t}function u(){return r}function l(){angular.forEach(t,function(e){e.clearCache()})}function d(t,r){return angular.isString(t)?(void 0===e.validators[t]&&n.warn("Redeclaring validator",t),void(e.validators[t]=r)):void n.error("Validator name is not a string",t)}function h(e){var t={data:[],included:[]};if(void 0===e)return void n.error("Can't proccess results:",e);var r={"new":!1,"synchronized":!0,stable:!0,pristine:!1,initialization:!1};return angular.forEach(e.included,function(e){t.included.push(s(e.type).cache.addOrUpdate(e,r))}),angular.isArray(e.data)?angular.forEach(e.data,function(e){t.data.push(s(e.type).cache.addOrUpdate(e,r))}):void 0!==e.data&&t.data.push(s(e.data.type).cache.addOrUpdate(e.data,r)),t}return{addResource:i,getResource:s,clearCache:l,allResources:c,listResources:u,addValidator:d,synchronizerSimple:o,__proccesResults:h}}var t={},r=[];this.$get=n,n.$inject=["$log","AngularJsonAPIResource","AngularJsonAPISynchronizerSimple"]}angular.module("angular-jsonapi").provider("$jsonapi",e),e.$inject=["validateJS"]}(),function(){"use strict";angular.module("angular-jsonapi").config(["$logProvider",function(e){e.debugEnabled(!1)}]).run(["validateJS","$q",function(e,n){e.Promise=n}])}(); -//# sourceMappingURL=angular-jsonapi.min.js.map \ No newline at end of file +//# sourceMappingURL=angular-jsonapi.min.js.map diff --git a/dist/angular-jsonapi.min.js.map b/dist/angular-jsonapi.min.js.map index 0ffc21b..ed07905 100644 --- a/dist/angular-jsonapi.min.js.map +++ b/dist/angular-jsonapi.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["/source/sources/rest/source-rest.module.js","/source/sources/rest/source-rest.factory.js","angular-jsonapi.min.js","/source/sources/rest/source-rest.decorator.js","/source/sources/parse/source-parse.module.js","/source/sources/parse/source-parse.factory.js","/source/sources/parse/source-parse.decorator.js","/source/sources/local/source-local.module.js","/source/sources/local/source-local.factory.js","/source/sources/local/source-local.decorator.js","/source/jsonapi.module.js","/source/resource/resource-cache/resource-cache.factory.js","/source/model/model-linker/model-linker.js","/source/model/model-form/model-form.factory.js","/source/model/abstract-model/abstract-model.js","/source/errors/validation-error/validation-error.factory.js","/source/errors/source-error/source-error.factory.js","/source/errors/errors-manager/errors-manager.factory.js","/source/utils/named-function.js","/source/utils/lazy-property.js","/source/utils/kebab-case.js","/source/utils/all-settled.js","/source/synchronizers/synchronizer-simple.factory.js","/source/synchronizers/synchronizer-prototype.js","/source/sources/source-prototype.js","/source/schema/schema.factory.js","/source/schema/schema-link.factory.js","/source/resource/resource.factory.js","/source/model/model-factory.factory.js","/source/collection/collection.factory.js","/source/jsonapi.provider.js","/source/jsonapi.config.js"],"names":["angular","module","AngularJsonAPISourceRestWrapper","AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http","AngularJsonAPISourceRestFactory","name","url","AngularJsonAPISourceRest","all","config","method","headers","params","encodeParams","then","resolveHttp","rejectHttp","bind","get","object","data","id","remove","unlink","deferred","defer","schema","relationships","key","removed","reject","create","_this","undefined","target","type","resolve","promise","link","errors","status","statusText","toLinkData","update","form","toJson","add","response","action","rejectServerOffline","rejectNoConnection","this","Accept","Content-Type","apply","arguments","synchronization","encodeValue","argument","isArray","join","encodedParams","forEach","paramValue","paramKey","isObject","paramInnerValue","paramInnerKey","decodeParams","decodedParams","value","objectKeyStart","indexOf","split","objectKey","substr","objectElementKey","prototype","Object","constructor","factory","$inject","provide","$provide","decorator","$delegate","$jsonapi","sourceRest","constant","Parse","AngularJsonAPISourceParseWrapper","pluralize","$log","AngularJsonAPISourceParseFactory","table","AngularJsonAPISourceParse","query","Query","ParseObject","limit","filter","equalTo","find","resolveParse","rejectParse","set","destroy","toParseObject","save","parseObject","attributes","attribute","relationship","charAt","toUpperCase","slice","parsePointer","extend","fromParseObject","synchronizer","resource","model","elem","error","toLowerCase","initialize","appId","jsKey","sourceLocal","AngularJsonAPISourceLocalWrapper","$window","AngularJsonAPISourceLocalFactory","prefix","AngularJsonAPISourceLocal","init","localStorage","getItem","clear","size","list","max","objectMaxKey","fraction","removeItem","updateStorage","cache","json","length","setItem","keys","reduce","m","k","__updateStorage","begin","finish","validate","AngularJsonAPIResourceCacheWrapper","uuid4","AngularJsonAPIResourceCacheFactory","AngularJsonAPIResourceCache","indexIds","addOrUpdate","validatedData","updatedAt","modelFactory","initialization","fromJson","collection","new","synchronized","stable","pristine","objectData","hasErrors","push","index","filterParams","valid","constraint","map","setIndexIds","array","element","isString","revertRemove","clearRemoved","oneWay","polymorphic","__addHasMany","__processAddHasMany","__addHasOne","__processAddHasOne","__removeHasMany","__processRemove","reflectionSchema","reflectionKey","reflection","__swapResults","__wrapResults","oldReflectionSchema","oldReflection","result","__removeHasOne","debug","reset","linkData","splice","newValue","item","i","service","AngularJsonAPIModelFormWrapper","AngularJsonAPIModelValidationError","validateJS","AngularJsonAPIModelFormFactory","parent","AngularJsonAPIModelForm","copy","auto","validator","validation","errorsMap","attributesWrapper","constraintsWrapper","async","AngularJsonAPIAbstractModelWrapper","AngularJsonAPIModelErrorsManager","$rootScope","$injector","AngularJsonAPIAbstractModel","loading","saving","Date","now","loadingCount","savingCount","__setData","synchronize","notify","$emit","concat","meta","__decrementSavingCounter","__incrementSavingCounter","refresh","synchronizeIncluded","__incrementLoadingCounter","__decrementLoadingCounter","resolveIncluded","includedResponse","operation","success","results","included","__proccesResults","allSettled","unlinkAll","removeLink","linksObj","removeReflectionLink","resolveReflection","targets","answer","setAttributes","validators","setRelationships","relationshipData","links","linkOne","unlinkOne","getResource","AngularJsonAPIModelValidationErrorWrapper","ValidationErrorFactory","message","ValidationError","context","Error","AngularJsonAPIModelSourceErrorWrapper","SourceErrorFactory","source","code","SourceError","AngularJsonAPIModelErrorsManagerWrapper","ErrorsManagerFactory","description","ErrorConstructor","defaultFilter","ErrorsManager","obj","namedFunction","fn","Function","propertyName","callback","done","defineProperty","call","enumerable","configurable","str","replace","promises","resolvedCallback","rejectedCallback","wrap","isFunction","reason","wrapped","hasOwnProperty","AngularJsonAPISynchronizerSimpleWrapper","AngularJsonAPISynchronizerPrototype","AngularJsonAPISynchronizerSimpleFactory","sources","AngularJsonAPISynchronizerSimple","state","step","resolved","afterHooks","hook","finishHooks","rejected","noop","beginHooks","beforeHooks","synchronizationHooks","AngularJsonAPISynchronizerPrototypeWrapper","AngularJsonAPISourcePrototypeWrapper","allHooks","options","hookName","beforeSynchro","afterSynchro","before","after","AngularJsonAPISchemaWrapper","AngularJsonAPISchemaLink","AngularJsonAPISchemaFactory","AngularJsonAPISchema","include","generate","isNumber","identity","linkSchema","linkName","linkSchemaObj","AngularJsonAPILinkSchrapperLink","AngularJsonAPISchemaLinkFactory","plural","singular","AngularJsonAPIResourceWrapper","AngularJsonAPIModel","AngularJsonAPICollection","AngularJsonAPIResourceFactory","AngularJsonAPIResource","initialized","fetch","relationshipSchema","relationshipName","clearCache","createModelFactory","schemaObj","isNew","Model","constructorName","functions","metaFunction","metaFunctionName","AngularJsonAPICollectionWrapper","AngularJsonAPICollectionFactory","event","clearWatchers","onObjectRemove","onFactoryClear","onObjectAdd","$on","jsonapiProvider","jsonapiFactory","addResource","memory","names","allResources","listResources","addValidator","warn","objects","synchronizerSimple","$get","provider","$logProvider","debugEnabled","run","Promise"],"mappings":"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","file":"angular-jsonapi.min.js","sourcesContent":["(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper);\n\n function AngularJsonAPISourceRestWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n toKebabCase,\n $q,\n $http\n ) {\n\n AngularJsonAPISourceRest.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceRest.prototype.constructor = AngularJsonAPISourceRest;\n\n return {\n create: AngularJsonAPISourceRestFactory,\n encodeParams: encodeParams,\n decodeParams: decodeParams\n };\n\n function AngularJsonAPISourceRestFactory(name, url) {\n return new AngularJsonAPISourceRest(name, url);\n }\n\n function AngularJsonAPISourceRest(name, url) {\n var _this = this;\n var headers = { // jscs:disable disallowQuotedKeysInObjects\n 'Accept': 'application/vnd.api+json',\n 'Content-Type': 'application/vnd.api+json'\n }; // jscs:enable disallowQuotedKeysInObjects\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('unlink', unlink);\n _this.synchronization('link', link);\n _this.synchronization('update', update);\n _this.synchronization('add', add);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'all'));\n }\n\n function get(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url + '/' + config.object.data.id,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'get'));\n }\n\n function remove(config) {\n return $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'remove'));\n }\n\n function unlink(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Object has been removed', _this, 0, 'unlink'));\n } else if (config.target !== undefined && config.target.data.id === undefined) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Can\\'t unlink object without id through rest call', _this, 0, 'unlink'));\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'get')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n if (config.target === undefined) {\n $http({\n method: 'PUT',\n headers: headers,\n data: {data: []},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n } else {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key + '/' + config.target.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n }\n }\n\n return deferred.promise;\n }\n\n function link(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject({errors: [{status: 0, statusText: 'Object has been removed'}]});\n } else if (config.target === undefined || config.target.data.id === undefined) {\n deferred.reject({errors: [{status: 0, statusText: 'Can\\'t link object without id through rest call'}]});\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'PUT',\n headers: headers,\n data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n $http({\n method: 'POST',\n headers: headers,\n data: {data: [AngularJsonAPIModelLinkerService.toLinkData(config.target)]},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n }\n\n return deferred.promise;\n }\n\n function update(config) {\n return $http({\n method: 'PUT',\n headers: headers,\n url: url + '/' + config.object.data.id,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'update'));\n }\n\n function add(config) {\n return $http({\n method: 'POST',\n headers: headers,\n url: url,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'add'));\n }\n\n function resolveHttp(response) {\n return $q.resolve(response.data);\n }\n\n function rejectHttp(action, response) {\n var deferred = $q.defer();\n\n if (response.status === 0) {\n $http({\n method: 'GET',\n url: 'https://status.cloud.google.com/incidents.schema.json'\n }).then(rejectServerOffline, rejectNoConnection);\n } else {\n deferred.reject(AngularJsonAPIModelSourceError.create(response.statusText, _this, response.status, action));\n }\n\n return deferred.promise;\n\n function rejectServerOffline(response) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Server is offline', _this, response.status, action));\n }\n\n function rejectNoConnection() {\n deferred.reject(AngularJsonAPIModelSourceError.create('No internet connection', _this, response.status, action));\n }\n }\n }\n\n function encodeParams(params) {\n var encodedParams = {};\n\n if (params === undefined) {\n return {};\n }\n\n angular.forEach(params, function(paramValue, paramKey) {\n if (angular.isArray(paramValue)) {\n encodedParams[paramKey] = encodeValue(paramValue);\n } else if (angular.isObject(paramValue)) {\n angular.forEach(paramValue, function(paramInnerValue, paramInnerKey) {\n encodedParams[paramKey + '[' + paramInnerKey + ']'] = encodeValue(paramInnerValue);\n });\n } else {\n encodedParams[paramKey] = paramValue;\n }\n });\n\n return encodedParams;\n\n function encodeValue(argument) {\n if (angular.isArray(argument)) {\n return argument.join(',');\n } else {\n return argument;\n }\n }\n }\n\n function decodeParams(params) {\n var decodedParams = {};\n\n angular.forEach(params, function(value, key) {\n var objectKeyStart = key.indexOf('[');\n value = value.split(',');\n\n if (objectKeyStart > -1) {\n var objectKey = key.substr(0, objectKeyStart);\n var objectElementKey = key.substr(objectKeyStart + 1, key.indexOf(']') - objectKeyStart - 1);\n\n decodedParams[objectKey] = decodedParams[objectKey] || {};\n decodedParams[objectKey][objectElementKey] = value;\n } else {\n decodedParams[key] = value;\n }\n });\n\n return decodedParams;\n }\n }\n})();\n",null,"(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceRest) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceRest = AngularJsonAPISourceRest;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n /* global Parse: false */\n angular.module('angular-jsonapi-parse', ['angular-jsonapi'])\n .constant('Parse', Parse);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper);\n\n function AngularJsonAPISourceParseWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n pluralize,\n Parse,\n $log,\n $q\n ) {\n\n AngularJsonAPISourceParse.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceParse.prototype.constructor = AngularJsonAPISourceParse;\n AngularJsonAPISourceParse.prototype.initialize = initialize;\n\n return {\n create: AngularJsonAPISourceParseFactory\n };\n\n function AngularJsonAPISourceParseFactory(name, table) {\n return new AngularJsonAPISourceParse(name, table);\n }\n\n function AngularJsonAPISourceParse(name, table) {\n var _this = this;\n\n _this.ParseObject = Parse.Object.extend(table);\n _this.type = pluralize(table).charAt(0).toLowerCase() + pluralize(table).slice(1);\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('update', update);\n _this.synchronization('add', update);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n var query = new Parse.Query(_this.ParseObject);\n\n if (config.params.limit !== undefined) {\n query.limit(config.params.limit);\n }\n\n angular.forEach(config.params.filter, function(filter) {\n query.equalTo(filter.key, filter.value);\n });\n\n return query.find().then(resolveParse, rejectParse.bind(null, 'all'));\n }\n\n function get(config) {\n var query = new Parse.Query(_this.ParseObject);\n return query.get(config.object.data.id).then(resolveParse, rejectParse.bind(null, 'get'));\n }\n\n function remove(config) {\n var object = new _this.ParseObject();\n object.set('id', config.object.data.id);\n return object.destroy().then(resolveParse, rejectParse.bind(null, 'remove'));\n }\n\n function update(config) {\n var object = toParseObject(config.object);\n return object.save(null).then(resolveParse, rejectParse.bind(null, 'update'));\n }\n\n function toParseObject(object) {\n var parseObject = new _this.ParseObject();\n angular.forEach(object.form.data.attributes, function(attribute, key) {\n parseObject.set(key, attribute);\n });\n\n angular.forEach(object.schema.relationships, function(relationship, key) {\n if (relationship.type === 'hasOne'\n && object.form.data.relationships[key].data !== null\n && object.form.data.relationships[key].data !== undefined\n ) {\n var table = pluralize(key, 1).charAt(0).toUpperCase() + pluralize(key, 1).slice(1);\n var parsePointer = new (Parse.Object.extend(table))();\n parsePointer.set('id', object.form.data.relationships[key].data.id);\n parseObject.set(key, parsePointer);\n }\n });\n\n return parseObject;\n }\n\n function fromParseObject(object) {\n var relationships = _this.synchronizer.resource.schema.relationships;\n object.type = _this.type;\n object.relationships = object.relationships || [];\n angular.forEach(relationships, function(relationship, key) {\n if (object.attributes[key] && relationship.type === 'hasOne') {\n object.relationships[key] = {\n data: {\n type: relationship.model,\n id: object.attributes[key].id\n }\n };\n }\n });\n\n return object;\n }\n\n function resolveParse(response) {\n if (angular.isArray(response)) {\n angular.forEach(response, function(elem, key) {\n response[key] = fromParseObject(elem);\n });\n } else if (angular.isObject(response)) {\n response = fromParseObject(response);\n }\n\n return $q.resolve({\n data: response\n });\n }\n\n function rejectParse(action, response) {\n $log.error('Parse error for', action, response);\n return $q.reject(response);\n }\n }\n\n function initialize(appId, jsKey) {\n Parse.initialize(appId, jsKey);\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceParse) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceParse;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper);\n\n function AngularJsonAPISourceLocalWrapper(\n AngularJsonAPISourcePrototype,\n $window,\n $q\n ) {\n var size = {\n max: 0,\n all: 0,\n limit: 5200000,\n list: {}\n };\n\n AngularJsonAPISourceLocal.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceLocal.prototype.constructor = AngularJsonAPISourceLocal;\n\n return {\n create: AngularJsonAPISourceLocalFactory,\n size: size\n };\n\n function AngularJsonAPISourceLocalFactory(name, prefix) {\n return new AngularJsonAPISourceLocal(name, prefix);\n }\n\n function AngularJsonAPISourceLocal(name, prefix) {\n var _this = this;\n\n prefix = prefix || 'AngularJsonAPI';\n\n _this.__updateStorage = updateStorage;\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('init', init);\n\n _this.begin('clearCache', clear);\n\n _this.finish('init', updateStorage);\n _this.finish('clearCache', updateStorage);\n _this.finish('remove', updateStorage);\n _this.finish('refresh', updateStorage);\n _this.finish('unlink', updateStorage);\n _this.finish('unlinkReflection', updateStorage);\n _this.finish('link', updateStorage);\n _this.finish('linkReflection', updateStorage);\n _this.finish('update', updateStorage);\n _this.finish('add', updateStorage);\n _this.finish('get', updateStorage);\n _this.finish('all', updateStorage);\n _this.finish('include', updateStorage);\n\n function init() {\n var type = _this.synchronizer.resource.schema.type;\n return $q.resolve($window.localStorage.getItem(prefix + '.' + type));\n }\n\n function clear() {\n var type = _this.synchronizer.resource.schema.type;\n var key = prefix + '.' + type;\n\n size.all -= size.list[key];\n delete size.list[key];\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.removeItem(key);\n }\n\n function updateStorage() {\n var type = _this.synchronizer.resource.schema.type;\n var cache = _this.synchronizer.resource.cache;\n var json = cache.toJson();\n var key = prefix + '.' + type;\n\n size.list[key] = size.list[key] === undefined ? 0 : size.list[key];\n size.all += json.length - size.list[key];\n size.list[key] = json.length;\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.setItem(key, json);\n }\n\n function objectMaxKey(object) {\n return Object.keys(object).reduce(function(m, k) {\n return object[k] > object[m] ? k : m;\n }, Object.keys(object)[0]);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceLocal) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceLocal;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi', ['uuid4'])\n /* global pluralize: false, validate: false */\n .constant('pluralize', pluralize)\n .constant('validateJS', validate);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper);\n\n function AngularJsonAPIResourceCacheWrapper(\n uuid4,\n $log\n ) {\n\n AngularJsonAPIResourceCache.prototype.get = get;\n AngularJsonAPIResourceCache.prototype.index = index;\n AngularJsonAPIResourceCache.prototype.setIndexIds = setIndexIds;\n AngularJsonAPIResourceCache.prototype.addOrUpdate = addOrUpdate;\n\n AngularJsonAPIResourceCache.prototype.fromJson = fromJson;\n AngularJsonAPIResourceCache.prototype.toJson = toJson;\n AngularJsonAPIResourceCache.prototype.clear = clear;\n\n AngularJsonAPIResourceCache.prototype.remove = remove;\n AngularJsonAPIResourceCache.prototype.revertRemove = revertRemove;\n AngularJsonAPIResourceCache.prototype.clearRemoved = clearRemoved;\n\n return {\n create: AngularJsonAPIResourceCacheFactory\n };\n\n function AngularJsonAPIResourceCacheFactory(resource) {\n return new AngularJsonAPIResourceCache(resource);\n }\n\n /**\n * Constructor\n */\n function AngularJsonAPIResourceCache(resource) {\n var _this = this;\n\n _this.resource = resource;\n _this.data = {};\n _this.removed = {};\n _this.size = 0;\n\n _this.indexIds = undefined;\n }\n\n /**\n * Add new model or update existing with data\n * @param {object} validatedData Data that are used to update or create an object, has to be valid\n * @return {AngularJsonAPIModel} Created model\n */\n function addOrUpdate(validatedData, config, updatedAt) {\n var _this = this;\n var id = validatedData.id;\n\n if (id === undefined) {\n $log.error('Can\\'t add data without id!', validatedData);\n return;\n }\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(validatedData, config, updatedAt);\n _this.size += 1;\n } else {\n _this.data[id].update(validatedData, !config.new, config.initialization);\n }\n\n return _this.data[id];\n }\n\n\n /**\n * Recreate object structure from json data\n * @param {json} json Json data\n * @return {undefined}\n */\n function fromJson(json) {\n var _this = this;\n var collection = angular.fromJson(json);\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: true\n };\n\n if (angular.isObject(collection) && collection.data !== undefined) {\n _this.updatedAt = collection.updatedAt;\n _this.indexIds = collection.indexIds;\n\n angular.forEach(collection.data, function(objectData) {\n var data = objectData.data;\n _this.addOrUpdate(data, config, objectData.updatedAt);\n });\n }\n }\n\n /**\n * Encodes memory into json format\n * @return {json} Json encoded memory\n */\n function toJson() {\n var _this = this;\n var json = {\n data: [],\n updatedAt: _this.updatedAt,\n indexIds: _this.indexIds\n };\n\n angular.forEach(_this.data, function(object) {\n if (object.hasErrors() === false) {\n json.data.push(object.toJson());\n }\n });\n\n return angular.toJson(json);\n }\n\n /**\n * Clear memory\n * @return {undefined}\n */\n function clear() {\n var _this = this;\n\n _this.indexIds = undefined;\n _this.data = {};\n _this.removed = {};\n }\n\n /**\n * Low level get used internally, does not run any synchronization\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function get(id) {\n var _this = this;\n\n var data = {\n id: id,\n type: _this.resource.schema.type\n };\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: true\n };\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(data, config);\n }\n\n return _this.data[id];\n }\n\n /**\n * Low level get used internally, does not run any synchronization, used for index requests\n * @param {objec} params\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function index(params) {\n var _this = this;\n params = params || {};\n\n if (_this.indexIds === undefined) {\n return _this.indexIds;\n }\n\n return _this.indexIds.map(_this.get.bind(_this)).filter(filter);\n\n function filter(argument) {\n var filterParams = params.filter;\n var valid = true;\n\n angular.forEach(filterParams, function(constraint) {\n valid = valid && argument.data.attributes[constraint.key] === constraint.value;\n });\n\n return valid;\n }\n }\n\n /**\n * Cache ids of objects returned by index request\n * @param {ids array or AngularJsonAPIModel array} array Objects or ids to be cached\n */\n function setIndexIds(array) {\n var _this = this;\n\n _this.indexIds = [];\n\n angular.forEach(array, function(element) {\n if (angular.isString(element) && _this.resource.schema.id.validate(element)) {\n _this.indexIds.push(element);\n } else if (angular.isObject(element) && _this.resource.schema.id.validate(element.data.id)) {\n _this.indexIds.push(element.data.id);\n }\n });\n }\n\n /**\n * Remove object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function remove(id) {\n var _this = this;\n\n if (_this.data[id] !== undefined) {\n _this.removed[id] = _this.data[id];\n delete _this.data[id];\n _this.size -= 1;\n }\n\n return _this.removed[id];\n }\n\n /**\n * Revert removal of an object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function revertRemove(id) {\n var _this = this;\n\n if (_this.removed[id] !== undefined) {\n _this.data[id] = _this.removed[id];\n delete _this.removed[id];\n _this.size += 1;\n }\n\n return _this.data[id];\n }\n\n /**\n * Clear removed object from memory\n * @param {uuid} id\n * @return {undefined}\n */\n function clearRemoved(id) {\n var _this = this;\n\n delete _this.removed[id];\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService);\n\n function AngularJsonAPIModelLinkerService($log) {\n var _this = this;\n\n _this.toLinkData = toLinkData;\n\n _this.link = link;\n _this.unlink = unlink;\n\n return this;\n\n /**\n * Extracts data needed for relationship linking from object\n * @param {AngularJsonAPIModel} object Object\n * @return {json} Link data\n */\n function toLinkData(object) {\n if (object === null) {\n return null;\n }\n\n return {type: object.data.type, id: object.data.id};\n }\n\n /**\n * Add target to object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function link(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t add link to non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (target === undefined) {\n $log.error('Can\\'t link non existing object', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema === undefined) {\n $log.error('Can\\'t add link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (target !== null && schema.polymorphic === false && schema.model !== target.data.type) {\n $log.error('This relation is not polymorphic, expected: ' + schema.model + ' instead of ' + target.data.type);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema.type === 'hasMany') {\n if (oneWay === true) {\n __addHasMany(object, key, target, form);\n return [];\n } else {\n return __processAddHasMany(object, key, target, form);\n }\n } else if (schema.type === 'hasOne') {\n if (oneWay === true) {\n __addHasOne(object, key, target, form);\n return [];\n } else {\n return __processAddHasOne(object, key, target, form);\n }\n }\n }\n\n /**\n * Remove target from object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function unlink(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t remove link from non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (schema === undefined) {\n $log.error('Can\\'t remove link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (oneWay === true) {\n __removeHasMany(object, key, target, form);\n return [];\n } else {\n return __processRemove(object, key, target, form);\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __processAddHasMany(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var reflectionSchema;\n\n if (reflectionKey === false) {\n __addHasMany(object, key, target, form);\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema === undefined) {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n } else if (reflectionSchema.type === 'hasOne') {\n return __swapResults(\n __wrapResults(object, key, target),\n __wrapResults(target, reflectionKey, object),\n __processAddHasOne(target, reflectionKey, object, form)\n );\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(object, key, target, form);\n __addHasMany(target, reflectionKey, object, form);\n return [__wrapResults(target, reflectionKey, object)];\n }\n }\n\n function __processAddHasOne(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var oldReflection = object.relationships[key];\n var reflectionSchema;\n var oldReflectionSchema;\n var result = [];\n\n __addHasOne(object, key, target, form);\n\n if (reflectionKey === false) {\n return [];\n }\n\n if (oldReflection !== undefined && oldReflection !== null) {\n oldReflectionSchema = oldReflection.schema.relationships[reflectionKey];\n\n if (oldReflectionSchema !== undefined) {\n if (oldReflectionSchema.type === 'hasOne') {\n __removeHasOne(oldReflection, reflectionKey, object, form);\n } else if (oldReflectionSchema.type === 'hasMany') {\n __removeHasMany(oldReflection, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(oldReflection, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n if (target !== undefined && target !== null && reflectionKey !== false) {\n reflectionSchema = target.schema.relationships[reflectionKey];\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __addHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(target, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(target, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n return result;\n }\n\n function __processRemove(object, key, target, form) {\n var schema = object.schema.relationships[key];\n var reflectionKey = schema.reflection;\n var reflectionSchema;\n\n if (schema.type === 'hasMany') {\n __removeHasMany(object, key, target, form);\n } else if (schema.type === 'hasOne') {\n __removeHasOne(object, key, target, form);\n }\n\n if (reflectionKey === false) {\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __removeHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __removeHasMany(target, reflectionKey, object, form);\n }\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n }\n\n return [__wrapResults(target, reflectionKey, object)];\n }\n\n function __addHasOne(object, key, target, form) {\n $log.debug('addHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n object.relationships[key] = target;\n object.data.relationships[key].data = toLinkData(target);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __addHasMany(object, key, target, form) {\n $log.debug('addHasMany', object, key, target);\n\n var linkData = toLinkData(target);\n if (form === true) {\n object = object.form;\n }\n\n if (angular.isArray(object.relationships[key]) && object.relationships[key].indexOf(target) > -1) {\n return false;\n }\n\n object.relationships[key] = object.relationships[key] || [];\n object.data.relationships[key].data = object.data.relationships[key].data || [];\n\n object.relationships[key].push(target);\n object.data.relationships[key].data.push(linkData);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasOne(object, key, target, form) {\n $log.debug('removeHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (target !== undefined && object.relationships[key] !== target) {\n return false;\n }\n\n object.relationships[key] = null;\n object.data.relationships[key].data = undefined;\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasMany(object, key, target, form) {\n $log.debug('removeHasMany', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (object.relationships[key] === undefined) {\n return;\n }\n\n if (target === undefined) {\n object.relationships[key] = [];\n object.data.relationships[key].data = [];\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n var index = object.relationships[key].indexOf(target);\n\n if (index === -1) {\n return false;\n }\n\n object.relationships[key].splice(index, 1);\n object.data.relationships[key].data.splice(index, 1);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __wrapResults(object, key, target) {\n return {\n object: object,\n key: key,\n target: target\n };\n }\n\n function __swapResults(value, newValue, array) {\n var index = -1;\n angular.forEach(array, function(item, i) {\n if (item.object === value.object && item.key === value.key && item.target === value.target) {\n index = i;\n }\n });\n\n if (index > -1) {\n array[index] = newValue;\n } else {\n array.push(newValue);\n }\n\n return array;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper);\n\n function AngularJsonAPIModelFormWrapper(\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelLinkerService,\n validateJS,\n $q\n ) {\n\n AngularJsonAPIModelForm.prototype.save = save;\n AngularJsonAPIModelForm.prototype.reset = reset;\n AngularJsonAPIModelForm.prototype.validate = validate;\n\n AngularJsonAPIModelForm.prototype.link = link;\n AngularJsonAPIModelForm.prototype.unlink = unlink;\n\n AngularJsonAPIModelForm.prototype.toJson = toJson;\n\n return {\n create: AngularJsonAPIModelFormFactory\n };\n\n function AngularJsonAPIModelFormFactory(parent) {\n return new AngularJsonAPIModelForm(parent);\n }\n\n function AngularJsonAPIModelForm(parent) {\n var _this = this;\n\n _this.data = {\n id: parent.data.id,\n type: parent.data.type,\n attributes: {},\n relationships: {}\n };\n\n _this.relationships = {};\n _this.parent = parent;\n _this.schema = parent.schema;\n _this.reset();\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = angular.copy(_this.data);\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data\n };\n }\n\n /**\n * Saves form, shortcut to parent.save()\n * @return {promise} Promise associated with synchronization\n */\n function save() {\n var _this = this;\n\n return _this.parent.save();\n }\n\n /**\n * Resets form to state of a parent\n * @return {undefined}\n */\n function reset(auto) {\n var _this = this;\n\n angular.forEach(_this.schema.relationships, function(data, key) {\n _this.data.relationships[key] = angular.copy(_this.parent.data.relationships[key]) || {};\n if (angular.isArray(_this.relationships[key])) {\n _this.relationships[key] = _this.parent.relationships[key].slice();\n } else {\n _this.relationships[key] = _this.parent.relationships[key];\n }\n });\n\n if (auto === true && _this.parent.synchronized === true) {\n return;\n }\n\n angular.forEach(_this.schema.attributes, function(validator, key) {\n _this.data.attributes[key] = angular.copy(_this.parent.data.attributes[key]);\n });\n\n _this.parent.errors.validation.clear();\n }\n\n /**\n * Validates form\n * @return {promise} Promise rejected to errors object indexed by keys. If the\n * key param i stated it only validates an attribute, else all attributes.\n */\n function validate(key) {\n var _this = this;\n var attributesWrapper;\n var constraintsWrapper;\n var deferred = $q.defer();\n\n if (key === undefined) {\n attributesWrapper = _this.data.attributes;\n constraintsWrapper = _this.schema.attributes;\n } else {\n attributesWrapper = {};\n constraintsWrapper = {};\n\n attributesWrapper[key] = _this.data.attributes[key];\n constraintsWrapper[key] = _this.schema.attributes[key];\n }\n\n validateJS.async(\n attributesWrapper,\n constraintsWrapper\n ).then(resolve, reject);\n\n function resolve() {\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n deferred.resolve();\n }\n\n function reject(errorsMap) {\n _this.parent.error = true;\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n angular.forEach(errorsMap, function(errors, attribute) {\n angular.forEach(errors, function(error) {\n _this.parent.errors.validation.add(attribute, AngularJsonAPIModelValidationError.create(error, attribute));\n });\n });\n\n deferred.reject(_this.parent.errors.validation);\n }\n\n return deferred.promise;\n }\n\n /**\n * Adds link to a form without synchronization\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function link(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.link(_this.parent, key, target, oneWay, true));\n }\n\n /**\n * Removes link from form without synchronization\n * @param {[type]} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function unlink(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true));\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper);\n\n function AngularJsonAPIAbstractModelWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelErrorsManager,\n AngularJsonAPIModelLinkerService,\n AngularJsonAPIModelForm,\n $rootScope,\n $injector,\n $log,\n $q\n ) {\n AngularJsonAPIAbstractModel.prototype.refresh = refresh;\n AngularJsonAPIAbstractModel.prototype.remove = remove;\n AngularJsonAPIAbstractModel.prototype.reset = reset;\n AngularJsonAPIAbstractModel.prototype.save = save;\n\n AngularJsonAPIAbstractModel.prototype.update = update;\n\n AngularJsonAPIAbstractModel.prototype.link = link;\n AngularJsonAPIAbstractModel.prototype.unlink = unlink;\n AngularJsonAPIAbstractModel.prototype.unlinkAll = unlinkAll;\n\n AngularJsonAPIAbstractModel.prototype.toJson = toJson;\n\n AngularJsonAPIAbstractModel.prototype.hasErrors = hasErrors;\n\n return AngularJsonAPIAbstractModel;\n\n /**\n * Constructor\n * @param {json} data Validated data used to create an object\n * @param {object} config Is object new (for form)\n */\n function AngularJsonAPIAbstractModel(data, config, updatedAt) {\n var _this = this;\n\n data.relationships = data.relationships || {};\n\n /**\n * Is not a new record\n * @type {Boolean}\n */\n _this.new = config.new === undefined ? false : config.new;\n\n /**\n * Is present on the server\n * @type {Boolean}\n */\n _this.stable = config.stable === undefined ? true : config.stable;\n\n /**\n * Has been synchronized with the server\n * @type {Boolean}\n */\n _this.synchronized = config.synchronized === undefined ? true : config.synchronized;\n\n /**\n * Has just been created by request and may not exist on the server\n * @type {Boolean}\n */\n _this.pristine = config.pristine === undefined ? true : config.pristine;\n\n _this.removed = false;\n _this.loading = false;\n _this.saving = false;\n _this.updatedAt = _this.synchronized === true ? Date.now() : updatedAt;\n\n _this.loadingCount = 0;\n _this.savingCount = 0;\n\n _this.data = {\n relationships: {},\n attributes: {}\n };\n _this.relationships = {};\n\n angular.forEach(_this.schema.relationships, function(schema, key) {\n _this.relationships[key] = undefined;\n });\n\n _this.errors = {\n validation: AngularJsonAPIModelErrorsManager.create(\n 'Validation',\n 'Errors of attributes validation',\n AngularJsonAPIModelValidationError\n ),\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.promise = $q.resolve(_this);\n\n __setData(_this, data);\n\n _this.form = AngularJsonAPIModelForm.create(_this);\n }\n\n /**\n * Saves model's form\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function save() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: _this.new === true ? 'add' : 'update',\n object: _this\n };\n\n _this.form.validate().then(\n synchronize,\n deferred.reject\n ).finally(__decrementSavingCounter.bind(_this, undefined));\n\n __incrementSavingCounter(_this);\n\n return deferred.promise;\n\n function synchronize() {\n _this.synchronize(config).then(resolve, reject, notify);\n }\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:' + config.action, 'resolved', _this, response);\n _this.update(response.data.data);\n\n if (_this.new === true) {\n _this.resource.cache.indexIds = _this.resource.cache.indexIds || [];\n _this.resource.cache.indexIds.push(_this.data.id);\n }\n\n _this.synchronized = true;\n _this.new = false;\n _this.pristine = false;\n _this.stable = true;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve(response.data.meta);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Reset object form\n * @return {undefined}\n */\n function reset() {\n var _this = this;\n\n if (_this.form !== undefined) {\n _this.form.reset();\n }\n }\n\n /**\n * Synchronize object with remote\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function refresh(params) {\n var $jsonapi = $injector.get('$jsonapi');\n var deferred = $q.defer();\n var _this = this;\n params = params === undefined ? _this.schema.params.get : params;\n\n var config = {\n action: 'refresh',\n object: _this,\n params: params\n };\n\n if (_this.new === true) {\n var error = AngularJsonAPIModelSourceError.create('Can\\'t refresh new object', null, 0, 'refresh');\n _this.errors.synchronization.add('refresh', error);\n deferred.reject(error);\n } else {\n __incrementLoadingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n _this.synchronized = true;\n _this.stable = true;\n _this.pristine = false;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = _this.data;\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data,\n updatedAt: _this.updatedAt\n };\n }\n\n /**\n * Remove object\n * @return {promise} Promise associated with synchronization that resolves to nothing\n */\n function remove() {\n var _this = this;\n var deferred = $q.defer();\n\n var config = {\n action: 'remove',\n object: _this\n };\n\n _this.resource.cache.remove(_this.data.id);\n\n if (_this.new === true) {\n deferred.resolve();\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'resolved', _this, response);\n _this.removed = true;\n _this.unlinkAll();\n _this.resource.cache.clearRemoved(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'rejected', _this, response);\n _this.resource.cache.revertRemove(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlink all reflection relationships of the object **without synchronization**\n * @return {boolean} Result\n */\n function unlinkAll(key) {\n var _this = this;\n var deferred = $q.defer();\n\n __incrementLoadingCounter(_this);\n\n if (key === undefined) {\n angular.forEach(_this.relationships, removeLink);\n } else {\n removeLink(_this.relationships[key], key);\n }\n\n __decrementLoadingCounter(_this);\n\n return deferred.promise;\n\n function removeLink(linksObj, key) {\n var schema = _this.schema.relationships[key];\n var reflectionKey = schema.reflection;\n\n if (angular.isArray(linksObj)) {\n angular.forEach(linksObj, removeReflectionLink.bind(undefined, reflectionKey));\n } else if (angular.isObject(linksObj)) {\n removeReflectionLink(reflectionKey, linksObj);\n }\n\n if (schema.type === 'hasOne') {\n _this.relationships[key] = null;\n } else if (schema.type === 'hasMany') {\n _this.relationships[key] = [];\n }\n }\n\n function removeReflectionLink(reflectionKey, target) {\n var reflectionSchema = target.schema.relationships[reflectionKey];\n var config = {\n action: 'unlinkReflection',\n object: target,\n target: _this,\n key: reflectionKey\n };\n\n __incrementLoadingCounter(target);\n AngularJsonAPIModelLinkerService.unlink(target, reflectionKey, _this, reflectionSchema);\n\n target.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(target, undefined));\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'resolve', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'notify', _this, response);\n\n response.finish();\n deferred.notify(response);\n }\n }\n }\n\n /**\n * Links object to relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {promise} Promise associated with synchronizations\n */\n function link(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'link',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link undefined', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link new object', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'linkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].object.data.type + ':object:linkReflection', 'resolved', targets[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlinks object from relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked if undefined unlinks all\n * @return {promise} Promise associated with synchronizations\n */\n function unlink(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'unlink',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink undefined', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink new object', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'unlinkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].data.type + ':object:unlinkReflection', 'resolved', targets[key], operation);\n response.value.finish();\n }\n });\n\n deferred.resolve();\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Sets object state to data\n * @param {object} validatedData JsonAPI object with data\n * @return {bool} Result\n */\n function update(validatedData, auto, initialization) {\n var _this = this;\n\n __incrementLoadingCounter(_this);\n\n __setData(_this, validatedData);\n _this.reset(auto);\n _this.synchronized = initialization === true ? false : true;\n _this.stable = initialization === true ? false : true;\n _this.updatedAt = Date.now();\n\n __decrementLoadingCounter(_this);\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /////////////\n // PRIVATE //\n /////////////\n\n /**\n * Low level set data function, use only with validated data\n * @param {AngularJsonAPIModel} object object to be modified\n * @param {object} validatedData Validated data\n * @return {boolean} Status\n */\n function __setData(object, validatedData) {\n\n var $jsonapi = $injector.get('$jsonapi');\n var schema = object.schema;\n\n object.data.id = validatedData.id;\n object.data.type = validatedData.type;\n\n if (object.resource.schema.type !== validatedData.type) {\n $log.error('Different type then resource', object.resource.schema.type, validatedData);\n return false;\n }\n\n if (!object.schema.id.validate(object.data.id)) {\n $log.error('Invalid id');\n return false;\n }\n\n object.data.links = validatedData.links;\n validatedData.attributes = validatedData.attributes || {};\n validatedData.relationships = validatedData.relationships || {};\n\n angular.forEach(schema.attributes, setAttributes);\n angular.forEach(schema.relationships, setRelationships);\n\n return true;\n\n function setAttributes(validators, key) {\n object.data.attributes[key] = validatedData.attributes[key];\n }\n\n function setRelationships(schema, key) {\n var relationshipData = validatedData.relationships[key];\n\n if (relationshipData === undefined) {\n if (object.data.relationships[key] === undefined) {\n object.data.relationships[key] = {data: undefined};\n }\n\n return;\n }\n\n object.data.relationships[key] = object.data.relationships[key] || {};\n object.data.relationships[key].links = relationshipData.links;\n\n if (schema.type === 'hasOne') {\n linkOne(object, key, relationshipData.data);\n } else if (schema.type === 'hasMany') {\n if (angular.isArray(relationshipData.data)) {\n if (relationshipData.data.length === 0) {\n object.data.relationships[key].data = [];\n object.unlinkAll(key);\n } else {\n angular.forEach(\n object.relationships[key],\n unlinkOne.bind(undefined, object, key, relationshipData.data)\n );\n angular.forEach(\n relationshipData.data,\n linkOne.bind(undefined, object, key)\n );\n }\n }\n }\n }\n\n function linkOne(object, key, data) {\n var resource;\n\n if (data === null) {\n AngularJsonAPIModelLinkerService.link(object, key, null);\n return;\n }\n\n if (data === undefined) {\n return;\n }\n\n resource = $jsonapi.getResource(data.type);\n\n if (resource === undefined) {\n $log.error('Factory not found', data.type, data);\n return;\n }\n\n var target = resource.cache.get(data.id);\n\n AngularJsonAPIModelLinkerService.link(object, key, target);\n }\n\n function unlinkOne(object, key, relationshipData, target) {\n if (relationshipData.indexOf(target.data.id) > -1) {\n return;\n }\n\n AngularJsonAPIModelLinkerService.unlink(object, key, target);\n }\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n\n function __incrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount += 1;\n object.saving = true;\n }\n\n function __decrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount -= 1;\n object.saving = object.savingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelValidationError', AngularJsonAPIModelValidationErrorWrapper);\n\n function AngularJsonAPIModelValidationErrorWrapper() {\n ValidationError.prototype = Object.create(Error.prototype);\n ValidationError.prototype.constructor = ValidationError;\n ValidationError.prototype.name = 'ValidationError';\n\n return {\n create: ValidationErrorFactory\n };\n\n function ValidationErrorFactory(message, attribute) {\n return new ValidationError(message, attribute);\n }\n\n function ValidationError(message, attribute) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n attribute: attribute\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelSourceError', AngularJsonAPIModelSourceErrorWrapper);\n\n function AngularJsonAPIModelSourceErrorWrapper() {\n SourceError.prototype = Object.create(Error.prototype);\n SourceError.prototype.constructor = SourceError;\n SourceError.prototype.name = 'SourceError';\n\n return {\n create: SourceErrorFactory\n };\n\n function SourceErrorFactory(message, source, code, action) {\n return new SourceError(message, source, code, action);\n }\n\n function SourceError(message, source, code, action) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n source: source,\n code: code,\n action: action\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelErrorsManager', AngularJsonAPIModelErrorsManagerWrapper);\n\n function AngularJsonAPIModelErrorsManagerWrapper() {\n ErrorsManager.prototype.constructor = ErrorsManager;\n ErrorsManager.prototype.concat = concat;\n ErrorsManager.prototype.clear = clear;\n ErrorsManager.prototype.add = add;\n ErrorsManager.prototype.hasErrors = hasErrors;\n\n return {\n create: ErrorsManagerFactory\n };\n\n function ErrorsManagerFactory(name, description, ErrorConstructor, defaultFilter) {\n return new ErrorsManager(name, description, ErrorConstructor, defaultFilter);\n }\n\n function ErrorsManager(name, description, ErrorConstructor, defaultFilter) {\n var _this = this;\n _this.name = name;\n _this.description = description;\n\n _this.ErrorConstructor = ErrorConstructor;\n _this.errors = {};\n _this.defaultFilter = defaultFilter || function() { return true; };\n }\n\n function clear(key) {\n var _this = this;\n\n if (key === undefined) {\n angular.forEach(_this.errors, function(obj, key) {\n _this.errors[key] = [];\n });\n } else {\n _this.errors[key] = [];\n }\n }\n\n function add(key, error) {\n var _this = this;\n\n _this.errors[key] = _this.errors[key] || [];\n _this.errors[key].push(error);\n }\n\n function concat(errors) {\n var _this = this;\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key] = [];\n });\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key].push(error.object);\n });\n\n }\n\n function hasErrors(key) {\n var _this = this;\n\n if (key === undefined) {\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = answer || error.length > 0;\n });\n\n return answer;\n } else {\n return _this.errors[key] !== undefined && _this.errors[key].length > 0;\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('namedFunction', namedFunction);\n\n function namedFunction(name, fn) {\n return new Function('fn',\n 'return function ' + name + '(){ return fn.apply(this,arguments)}'\n )(fn);\n }\n})();\n","// from https://www.sitepen.com/blog/2012/10/19/lazy-property-access/\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('lazyProperty', function(target, propertyName, callback) {\n var result;\n var done;\n Object.defineProperty(target, propertyName, {\n get: function() { // Define the getter\n if (!done) {\n // We cache the result and only compute once.\n done = true;\n result = callback.call(target);\n }\n\n return result;\n },\n\n // Keep it enumerable and configurable, certainly not necessary.\n enumerable: true,\n configurable: true\n });\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('toKebabCase', function(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$q', decorator);\n }\n\n function decorator($delegate) {\n var $q = $delegate;\n\n $q.allSettled = $q.allSettled || allSettled;\n\n function allSettled(promises, resolvedCallback, rejectedCallback) {\n // Implementation of allSettled function from Kris Kowal's Q:\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\n // by Michael Kropat from http://stackoverflow.com/a/27114615/1400432 slightly modified\n\n var wrapped = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function(promise, key) {\n if (!wrapped.hasOwnProperty(key)) {\n wrapped[key] = wrap(promise);\n }\n });\n\n return $q.all(wrapped);\n\n function wrap(promise) {\n return $q.resolve(promise)\n .then(function(value) {\n if (angular.isFunction(resolvedCallback)) {\n resolvedCallback(value);\n }\n\n return { success: true, value: value };\n },\n\n function(reason) {\n if (angular.isFunction(rejectedCallback)) {\n rejectedCallback(reason);\n }\n\n return { success: false, reason: reason };\n });\n }\n }\n\n return $q;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper);\n\n function AngularJsonAPISynchronizerSimpleWrapper(AngularJsonAPISynchronizerPrototype, $q, $log) {\n\n AngularJsonAPISynchronizerSimple.prototype = Object.create(AngularJsonAPISynchronizerPrototype.prototype);\n AngularJsonAPISynchronizerSimple.prototype.constructor = AngularJsonAPISynchronizerSimple;\n\n AngularJsonAPISynchronizerSimple.prototype.synchronize = synchronize;\n\n return {\n create: AngularJsonAPISynchronizerSimpleFactory\n };\n\n function AngularJsonAPISynchronizerSimpleFactory(sources) {\n return new AngularJsonAPISynchronizerSimple(sources);\n }\n\n function AngularJsonAPISynchronizerSimple(sources) {\n var _this = this;\n\n _this.state = {};\n\n AngularJsonAPISynchronizerPrototype.call(_this, sources);\n\n angular.forEach(sources, function(source) {\n source.synchronizer = _this;\n });\n }\n\n function synchronize(config) {\n var _this = this;\n var promises = [];\n var deferred = $q.defer();\n var action = config.action;\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize.call(_this, config);\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beginHooks[action], function(hook) {\n deferred.notify({step: 'begin', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beforeHooks[action], function(hook) {\n deferred.notify({step: 'before', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.synchronizationHooks[action], function(hook) {\n promises.push(hook.call(_this, config));\n });\n });\n\n $q.allSettled(promises, resolvedCallback, rejectedCallback).then(resolved, rejected);\n\n function resolvedCallback(value) {\n deferred.notify({step: 'synchronization', data: value});\n }\n\n function rejectedCallback(reason) {\n deferred.notify({step: 'synchronization', errors: reason});\n }\n\n function resolved(results) {\n _this.state[action] = _this.state[action] || {};\n _this.state[action].success = true;\n\n angular.forEach(results, function(result) {\n if (result.success === false) {\n _this.state[action].success = false;\n }\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.afterHooks[action], function(hook) {\n deferred.notify({step: 'after', errors: hook.call(_this, config, results)});\n });\n });\n\n var data;\n var errors = [];\n\n angular.forEach(results, function(result) {\n if (result.success === true) {\n data = result.value;\n } else {\n errors.push({\n key: action,\n object: result.reason\n });\n }\n });\n\n if (errors.length > 0) {\n deferred.reject({data: data || {}, finish: finish, errors: errors});\n } else {\n deferred.resolve({data: data || {}, finish: finish, errors: errors});\n }\n }\n\n function finish() {\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.finishHooks[action], function(hook) {\n deferred.notify({step: 'finish', errors: hook.call(_this, config)});\n });\n });\n }\n\n function rejected(errors) {\n $log.error('All settled rejected! Something went wrong');\n\n deferred.reject({finish: angular.noop, errors: errors});\n }\n\n return deferred.promise;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper);\n\n function AngularJsonAPISynchronizerPrototypeWrapper($log) {\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize = synchronize;\n\n return AngularJsonAPISynchronizerPrototype;\n\n function AngularJsonAPISynchronizerPrototype(sources) {\n var _this = this;\n\n _this.sources = sources;\n }\n\n function synchronize(config) {\n var _this = this;\n\n $log.debug('Synchro Collection', _this.resource.schema.type, config);\n\n if (config.action === undefined) {\n $log.error('Can\\'t synchronize undefined action', config);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISourcePrototype', AngularJsonAPISourcePrototypeWrapper);\n\n function AngularJsonAPISourcePrototypeWrapper() {\n AngularJsonAPISourcePrototype.prototype.before = beforeSynchro;\n AngularJsonAPISourcePrototype.prototype.after = afterSynchro;\n AngularJsonAPISourcePrototype.prototype.begin = begin;\n AngularJsonAPISourcePrototype.prototype.finish = finish;\n AngularJsonAPISourcePrototype.prototype.synchronization = synchronization;\n\n return AngularJsonAPISourcePrototype;\n\n function AngularJsonAPISourcePrototype(name) {\n var _this = this;\n var allHooks = [\n 'add',\n 'init',\n 'get',\n 'all',\n 'clearCache',\n 'remove',\n 'unlink',\n 'unlinkReflection',\n 'link',\n 'linkReflection',\n 'update',\n 'refresh',\n 'include'\n ];\n\n _this.name = name;\n _this.state = {};\n\n _this.beginHooks = {};\n _this.beforeHooks = {};\n _this.synchronizationHooks = {};\n _this.afterHooks = {};\n _this.finishHooks = {};\n\n _this.options = {};\n\n angular.forEach(allHooks, function(hookName) {\n _this.beginHooks[hookName] = [];\n _this.beforeHooks[hookName] = [];\n _this.synchronizationHooks[hookName] = [];\n _this.afterHooks[hookName] = [];\n _this.finishHooks[hookName] = [];\n _this.state[hookName] = {\n loading: false,\n success: true\n };\n });\n }\n\n function begin(action, callback) {\n var _this = this;\n\n _this.beginHooks[action].push(callback);\n }\n\n function finish(action, callback) {\n var _this = this;\n\n _this.finishHooks[action].push(callback);\n }\n\n function beforeSynchro(action, callback) {\n var _this = this;\n\n _this.beforeHooks[action].push(callback);\n }\n\n function afterSynchro(action, callback) {\n var _this = this;\n\n _this.afterHooks[action].push(callback);\n }\n\n function synchronization(action, callback) {\n var _this = this;\n\n _this.synchronizationHooks[action].push(callback);\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper);\n\n function AngularJsonAPISchemaWrapper(\n $log,\n pluralize,\n uuid4,\n AngularJsonAPISchemaLink\n ) {\n\n return {\n create: AngularJsonAPISchemaFactory\n };\n\n function AngularJsonAPISchemaFactory(schema) {\n return new AngularJsonAPISchema(schema);\n }\n\n function AngularJsonAPISchema(schema) {\n var _this = this;\n var include = schema.include || {};\n schema.include = include;\n include.get = schema.include.get || [];\n include.all = schema.include.all || [];\n\n _this.params = {\n get: {},\n all: {}\n };\n\n if (schema.id === 'uuid4') {\n schema.id = uuid4;\n } else if (schema.id === 'int') {\n schema.id = {\n generate: angular.noop,\n validate: angular.isNumber\n };\n } else if (angular.isObject(schema.id)) {\n if (!angular.isFunction(schema.id.generate)) {\n schema.id.generate = angular.noop;\n }\n } else {\n schema.id = {\n generate: angular.noop,\n validate: angular.identity.bind(null, true)\n };\n }\n\n angular.forEach(schema.relationships, function(linkSchema, linkName) {\n var linkSchemaObj = AngularJsonAPISchemaLink.create(linkSchema, linkName, schema.type);\n schema.relationships[linkName] = linkSchemaObj;\n if (linkSchemaObj.included === true) {\n include.get.push(linkName);\n if (linkSchemaObj.type === 'hasOne') {\n include.all.push(linkName);\n }\n }\n });\n\n angular.extend(_this, schema);\n\n if (include.get.length > 0) {\n _this.params.get.include = include.get;\n }\n\n if (include.all.length > 0) {\n _this.params.all.include = include.all;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink);\n\n function AngularJsonAPILinkSchrapperLink($log, pluralize) {\n\n return {\n create: AngularJsonAPISchemaLinkFactory\n };\n\n function AngularJsonAPISchemaLinkFactory(linkSchema, linkName, type) {\n return new AngularJsonAPISchemaLink(linkSchema, linkName, type);\n }\n\n function AngularJsonAPISchemaLink(linkSchema, linkName, type) {\n var _this = this;\n\n if (angular.isString(linkSchema)) {\n _this.model = pluralize.plural(linkName);\n _this.type = linkSchema;\n _this.polymorphic = false;\n _this.reflection = type;\n } else {\n if (linkSchema.type === undefined) {\n $log.error('Schema of link without a type: ', linkSchema, linkName);\n }\n\n if (linkSchema.type !== 'hasMany' && linkSchema.type !== 'hasOne') {\n $log.error('Schema of link with wrong type: ', linkSchema.type, 'available: hasOne, hasMany');\n }\n\n _this.model = linkSchema.model || pluralize.plural(linkName);\n _this.type = linkSchema.type;\n _this.polymorphic = linkSchema.polymorphic || false;\n\n if (linkSchema.reflection === undefined) {\n _this.reflection = _this.type === 'hasMany' ? pluralize.singular(type) : type;\n } else {\n _this.reflection = linkSchema.reflection;\n }\n\n _this.included = linkSchema.included || false;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper);\n\n function AngularJsonAPIResourceWrapper(\n AngularJsonAPIModel,\n AngularJsonAPISchema,\n AngularJsonAPIResourceCache,\n AngularJsonAPICollection,\n $rootScope,\n $log,\n $q\n ) {\n AngularJsonAPIResource.prototype.get = get;\n AngularJsonAPIResource.prototype.all = all;\n AngularJsonAPIResource.prototype.remove = remove;\n AngularJsonAPIResource.prototype.initialize = initialize;\n\n AngularJsonAPIResource.prototype.clearCache = clearCache;\n\n return {\n create: AngularJsonAPIResourceFactory\n };\n\n function AngularJsonAPIResourceFactory(schema, synchronizer) {\n return new AngularJsonAPIResource(schema, synchronizer);\n }\n\n /**\n * AngularJsonAPIResource constructor\n * @param {json} schema Schema object\n * @param {AngularJsonAPISynchronizer} synchronizer Synchronizer for the resource\n */\n function AngularJsonAPIResource(schema, synchronizer) {\n var _this = this;\n var config = {\n action: 'init'\n };\n\n _this.schema = AngularJsonAPISchema.create(schema);\n _this.cache = AngularJsonAPIResourceCache.create(_this);\n\n _this.synchronizer = synchronizer;\n _this.synchronizer.resource = _this;\n\n _this.modelFactory = AngularJsonAPIModel.modelFactory(\n _this.schema,\n _this\n );\n\n _this.initialized = false;\n _this.type = _this.schema.type;\n\n synchronizer.resource = _this;\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'resolved', response);\n _this.cache.fromJson(response.data);\n _this.initialized = true;\n\n response.finish();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'rejected', response);\n response.finish();\n _this.initialized = true;\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'notify', response);\n }\n }\n\n /**\n * Get request\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id, synchronized\n */\n function get(id, params) {\n var _this = this;\n\n if (!_this.schema.id.validate(id)) {\n return $q.reject({errors: [{status: 0, statusText: 'Invalid id'}]});\n }\n\n var object = _this.cache.get(id);\n\n object.promise = object.refresh(params);\n\n return object;\n }\n\n /**\n * All request\n * @param {object} params Object associated with params (for filters/pagination etc.)\n * @return {AngularJsonAPICollection} Collection of AngularJsonAPIModel, synchronized\n */\n function all(params) {\n var _this = this;\n params = angular.extend({}, _this.schema.params.all, params);\n\n var collection = AngularJsonAPICollection.create(\n _this,\n params\n );\n\n collection.promise = collection.fetch();\n\n return collection;\n }\n\n /**\n * Remove request\n * @param {uuid} id\n * @return {promise} Promise associated with the synchronization, in case of\n * fail object is reverted to previous state\n */\n function remove(id) {\n var _this = this;\n var object = _this.cache.remove(id);\n\n return object.remove();\n }\n\n /**\n * Initialize new AngularJsonAPIModel\n * @return {AngularJsonAPIModel} New model\n */\n function initialize() {\n var _this = this;\n var relationships = {};\n\n angular.forEach(_this.schema.relationships, function(relationshipSchema, relationshipName) {\n if (relationshipSchema.type === 'hasOne') {\n relationships[relationshipName] = {\n data: null\n };\n } else if (relationshipSchema.type === 'hasMany') {\n relationships[relationshipName] = {\n data: []\n };\n }\n });\n\n var data = {\n type: _this.type,\n id: _this.schema.id.generate(),\n attributes: {},\n relationships: relationships\n };\n\n var config = {\n new: true,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: false\n };\n\n var object = _this.modelFactory(data, config);\n\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:initialize', 'resolved', object);\n\n return object;\n }\n\n /**\n * Clears localy saved data\n * @return {promise} Promise associated with the synchronization resolves to nothing\n */\n function clearCache() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: 'clearCache'\n };\n\n _this.cache.clear();\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n return deferred;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.resolve(response);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.reject(response);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'notify', response);\n\n deferred.notify(response);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModel', AngularJsonAPIModel);\n\n function AngularJsonAPIModel(\n AngularJsonAPIAbstractModel,\n AngularJsonAPISchema,\n namedFunction,\n pluralize,\n $log\n ) {\n\n return {\n modelFactory: createModelFactory\n };\n\n function createModelFactory(schemaObj, resource) {\n var constructorName = pluralize.plural(schemaObj.type, 1);\n\n var Model = namedFunction(constructorName, function(data, config, updatedAt) {\n var _this = this;\n\n if (data.type !== _this.schema.type) {\n $log.error('Data type other then declared in schema: ', data.type, ' instead of ', _this.schema.type);\n }\n\n AngularJsonAPIAbstractModel.call(_this, data, config, updatedAt);\n\n _this.form.parent = _this;\n });\n\n Model.prototype = Object.create(AngularJsonAPIAbstractModel.prototype);\n Model.prototype.constructor = Model;\n\n Model.prototype.schema = schemaObj;\n Model.prototype.resource = resource;\n Model.prototype.synchronize = resource.synchronizer.synchronize.bind(resource.synchronizer);\n\n angular.forEach(schemaObj.functions, function(metaFunction, metaFunctionName) {\n Model.prototype[metaFunctionName] = function() {\n return metaFunction.apply(this, arguments);\n };\n });\n\n return modelFactory;\n\n function modelFactory(data, updatedAt, isNew) {\n return new Model(data, updatedAt, isNew);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper);\n\n function AngularJsonAPICollectionWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelErrorsManager,\n $rootScope,\n $injector,\n $q\n ) {\n\n AngularJsonAPICollection.prototype.fetch = fetch;\n AngularJsonAPICollection.prototype.refresh = fetch;\n AngularJsonAPICollection.prototype.get = get;\n AngularJsonAPICollection.prototype.hasErrors = hasErrors;\n\n return {\n create: AngularJsonAPICollectionFactory\n };\n\n function AngularJsonAPICollectionFactory(resource, params) {\n return new AngularJsonAPICollection(resource, params);\n }\n\n /**\n * Constructor\n * @param {AngularJsonAPIResource} resource Factory associated with the collection\n * @param {object} params Params associated with this resource (such as filters)\n */\n function AngularJsonAPICollection(resource, params) {\n var _this = this;\n\n _this.resource = resource;\n _this.type = resource.schema.type;\n _this.params = params || {};\n\n _this.errors = {\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.data = _this.resource.cache.index(_this.params);\n\n _this.loading = false;\n _this.loadingCount = 0;\n _this.synchronized = false;\n _this.pristine = _this.data === undefined;\n\n _this.promise = $q.resolve(_this);\n\n var onObjectRemove = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:remove', remove);\n var onFactoryClear = $rootScope.$on('angularJsonAPI:' + _this.type + ':resource:clearCache', clear);\n var onObjectAdd = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:add', add);\n\n $rootScope.$on('$destroy', clearWatchers);\n\n function remove(event, status, object) {\n var index;\n\n if (status === 'resolved' && _this.data !== undefined) {\n index = _this.data.indexOf(object);\n if (index > -1) {\n _this.data.splice(index, 1);\n _this.resource.cache.setIndexIds(_this.data);\n }\n }\n }\n\n function clear() {\n _this.data = undefined;\n _this.pristine = true;\n }\n\n function add(event, status, object) {\n if (status === 'resolved') {\n _this.data = _this.data || [];\n _this.data.push(object);\n }\n }\n\n function clearWatchers() {\n onObjectRemove();\n onFactoryClear();\n onObjectAdd();\n }\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /**\n * Shortcut to this.resource.get\n * @param {string} id Id of object]\n * @return {AngularJsonAPIModel} Model with id\n */\n function get(id, params) {\n var _this = this;\n\n return _this.resource.get(id, params);\n }\n\n /**\n * Synchronizes collection with the server\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function fetch() {\n var _this = this;\n var deferred = $q.defer();\n var $jsonapi = $injector.get('$jsonapi');\n var config = {\n action: 'all',\n params: _this.params\n };\n\n __incrementLoadingCounter(_this);\n\n angular.forEach(_this.data, __incrementLoadingCounter);\n\n _this.resource.synchronizer.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n\n _this.data = results.data;\n _this.links = response.data.links;\n\n _this.updatedAt = Date.now();\n _this.synchronized = true;\n _this.pristine = false;\n\n _this.resource.cache.setIndexIds(_this.data);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'rejected', _this, response);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n }\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .provider('$jsonapi', jsonapiProvider);\n\n function jsonapiProvider(validateJS) {\n var memory = {};\n var names = [];\n this.$get = jsonapiFactory;\n\n function jsonapiFactory(\n $log,\n AngularJsonAPIResource,\n AngularJsonAPISynchronizerSimple\n ) {\n return {\n addResource: addResource,\n getResource: getResource,\n clearCache: clearCache,\n allResources: allResources,\n listResources: listResources,\n addValidator: addValidator,\n synchronizerSimple: AngularJsonAPISynchronizerSimple,\n\n __proccesResults: __proccesResults\n };\n\n function addResource(schema, synchronizer) {\n var resource = AngularJsonAPIResource.create(schema, synchronizer);\n\n memory[schema.type] = resource;\n names.push(schema.type);\n }\n\n function getResource(type) {\n return memory[type];\n }\n\n function allResources() {\n return memory;\n }\n\n function listResources() {\n return names;\n }\n\n function clearCache() {\n angular.forEach(memory, function(resource) {\n resource.clearCache();\n });\n }\n\n function addValidator(name, validator) {\n if (!angular.isString(name)) {\n $log.error('Validator name is not a string', name);\n return;\n } else if (validateJS.validators[name] === undefined) {\n $log.warn('Redeclaring validator', name);\n }\n\n validateJS.validators[name] = validator;\n }\n\n function __proccesResults(results) {\n var objects = {\n data: [],\n included: []\n };\n\n if (results === undefined) {\n $log.error('Can\\'t proccess results:', results);\n return;\n }\n\n var config = {\n new: false,\n synchronized: true,\n stable: true,\n pristine: false,\n initialization: false\n };\n\n angular.forEach(results.included, function(data) {\n objects.included.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n\n if (angular.isArray(results.data)) {\n angular.forEach(results.data, function(data) {\n objects.data.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n } else if (results.data !== undefined) {\n objects.data.push(getResource(results.data.type).cache.addOrUpdate(results.data, config));\n }\n\n return objects;\n }\n }\n }\n\n})();\n\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(function($logProvider) {\n $logProvider.debugEnabled(false);\n })\n .run(function(validateJS, $q) {\n validateJS.Promise = $q;\n });\n})();\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["/source/sources/rest/source-rest.module.js","/source/sources/rest/source-rest.factory.js","angular-jsonapi.min.js","/source/sources/rest/source-rest.decorator.js","/source/sources/parse/source-parse.module.js","/source/sources/parse/source-parse.factory.js","/source/sources/parse/source-parse.decorator.js","/source/sources/local/source-local.module.js","/source/sources/local/source-local.factory.js","/source/sources/local/source-local.decorator.js","/source/jsonapi.module.js","/source/resource/resource-cache/resource-cache.factory.js","/source/model/model-linker/model-linker.js","/source/model/model-form/model-form.factory.js","/source/model/abstract-model/abstract-model.js","/source/errors/validation-error/validation-error.factory.js","/source/errors/source-error/source-error.factory.js","/source/errors/errors-manager/errors-manager.factory.js","/source/utils/named-function.js","/source/utils/lazy-property.js","/source/utils/kebab-case.js","/source/utils/all-settled.js","/source/synchronizers/synchronizer-simple.factory.js","/source/synchronizers/synchronizer-prototype.js","/source/sources/source-prototype.js","/source/schema/schema.factory.js","/source/schema/schema-link.factory.js","/source/resource/resource.factory.js","/source/model/model-factory.factory.js","/source/collection/collection.factory.js","/source/jsonapi.provider.js","/source/jsonapi.config.js"],"names":["angular","module","AngularJsonAPISourceRestWrapper","AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http","AngularJsonAPISourceRestFactory","name","url","AngularJsonAPISourceRest","all","config","method","headers","params","encodeParams","then","resolveHttp","rejectHttp","bind","get","object","data","id","remove","unlink","deferred","defer","schema","relationships","key","removed","reject","create","_this","undefined","target","type","resolve","promise","link","errors","status","statusText","toLinkData","update","form","toJson","add","response","action","rejectServerOffline","rejectNoConnection","this","Accept","Content-Type","apply","arguments","synchronization","encodeValue","argument","isArray","join","encodedParams","forEach","paramValue","paramKey","isObject","paramInnerValue","paramInnerKey","decodeParams","decodedParams","value","objectKeyStart","indexOf","split","objectKey","substr","objectElementKey","prototype","Object","constructor","factory","$inject","provide","$provide","decorator","$delegate","$jsonapi","sourceRest","constant","Parse","AngularJsonAPISourceParseWrapper","pluralize","$log","AngularJsonAPISourceParseFactory","table","AngularJsonAPISourceParse","query","Query","ParseObject","limit","filter","equalTo","find","resolveParse","rejectParse","set","destroy","toParseObject","save","parseObject","attributes","attribute","relationship","charAt","toUpperCase","slice","parsePointer","extend","fromParseObject","synchronizer","resource","model","elem","error","toLowerCase","initialize","appId","jsKey","sourceLocal","AngularJsonAPISourceLocalWrapper","$window","AngularJsonAPISourceLocalFactory","prefix","AngularJsonAPISourceLocal","init","localStorage","getItem","clear","size","list","max","objectMaxKey","fraction","removeItem","updateStorage","cache","json","length","setItem","keys","reduce","m","k","__updateStorage","begin","finish","validate","AngularJsonAPIResourceCacheWrapper","uuid4","AngularJsonAPIResourceCacheFactory","AngularJsonAPIResourceCache","indexIds","addOrUpdate","validatedData","updatedAt","modelFactory","initialization","fromJson","collection","new","synchronized","stable","pristine","objectData","hasErrors","push","index","filterParams","valid","constraint","map","setIndexIds","array","element","isString","revertRemove","clearRemoved","oneWay","polymorphic","__addHasMany","__processAddHasMany","__addHasOne","__processAddHasOne","__removeHasMany","__processRemove","reflectionSchema","reflectionKey","reflection","__swapResults","__wrapResults","oldReflectionSchema","oldReflection","result","__removeHasOne","debug","reset","linkData","splice","newValue","item","i","service","AngularJsonAPIModelFormWrapper","AngularJsonAPIModelValidationError","validateJS","AngularJsonAPIModelFormFactory","parent","AngularJsonAPIModelForm","copy","auto","validator","validation","errorsMap","attributesWrapper","constraintsWrapper","async","AngularJsonAPIAbstractModelWrapper","AngularJsonAPIModelErrorsManager","$rootScope","$injector","AngularJsonAPIAbstractModel","loading","saving","Date","now","loadingCount","savingCount","__setData","synchronize","notify","$emit","concat","meta","__decrementSavingCounter","__incrementSavingCounter","refresh","synchronizeIncluded","__incrementLoadingCounter","__decrementLoadingCounter","resolveIncluded","includedResponse","operation","success","results","included","__proccesResults","allSettled","unlinkAll","removeLink","linksObj","removeReflectionLink","resolveReflection","targets","answer","setAttributes","validators","setRelationships","relationshipData","links","linkOne","unlinkOne","getResource","AngularJsonAPIModelValidationErrorWrapper","ValidationErrorFactory","message","ValidationError","context","Error","AngularJsonAPIModelSourceErrorWrapper","SourceErrorFactory","source","code","SourceError","AngularJsonAPIModelErrorsManagerWrapper","ErrorsManagerFactory","description","ErrorConstructor","defaultFilter","ErrorsManager","obj","namedFunction","fn","Function","propertyName","callback","done","defineProperty","call","enumerable","configurable","str","replace","promises","resolvedCallback","rejectedCallback","wrap","isFunction","reason","wrapped","hasOwnProperty","AngularJsonAPISynchronizerSimpleWrapper","AngularJsonAPISynchronizerPrototype","AngularJsonAPISynchronizerSimpleFactory","sources","AngularJsonAPISynchronizerSimple","state","step","resolved","afterHooks","hook","finishHooks","rejected","noop","beginHooks","beforeHooks","synchronizationHooks","AngularJsonAPISynchronizerPrototypeWrapper","AngularJsonAPISourcePrototypeWrapper","allHooks","options","hookName","beforeSynchro","afterSynchro","before","after","AngularJsonAPISchemaWrapper","AngularJsonAPISchemaLink","AngularJsonAPISchemaFactory","AngularJsonAPISchema","include","generate","isNumber","identity","linkSchema","linkName","linkSchemaObj","AngularJsonAPILinkSchrapperLink","AngularJsonAPISchemaLinkFactory","plural","singular","AngularJsonAPIResourceWrapper","AngularJsonAPIModel","AngularJsonAPICollection","AngularJsonAPIResourceFactory","AngularJsonAPIResource","initialized","fetch","relationshipSchema","relationshipName","clearCache","createModelFactory","schemaObj","isNew","Model","constructorName","functions","metaFunction","metaFunctionName","AngularJsonAPICollectionWrapper","AngularJsonAPICollectionFactory","event","clearWatchers","onObjectRemove","onFactoryClear","onObjectAdd","$on","jsonapiProvider","jsonapiFactory","addResource","memory","names","allResources","listResources","addValidator","warn","objects","synchronizerSimple","$get","provider","$logProvider","debugEnabled","run","Promise"],"mappings":"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","file":"angular-jsonapi.min.js","sourcesContent":["(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper);\n\n function AngularJsonAPISourceRestWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n toKebabCase,\n $q,\n $http\n ) {\n\n AngularJsonAPISourceRest.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceRest.prototype.constructor = AngularJsonAPISourceRest;\n\n return {\n create: AngularJsonAPISourceRestFactory,\n encodeParams: encodeParams,\n decodeParams: decodeParams\n };\n\n function AngularJsonAPISourceRestFactory(name, url) {\n return new AngularJsonAPISourceRest(name, url);\n }\n\n function AngularJsonAPISourceRest(name, url) {\n var _this = this;\n var headers = { // jscs:disable disallowQuotedKeysInObjects\n 'Accept': 'application/vnd.api+json',\n 'Content-Type': 'application/vnd.api+json'\n }; // jscs:enable disallowQuotedKeysInObjects\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('unlink', unlink);\n _this.synchronization('link', link);\n _this.synchronization('update', update);\n _this.synchronization('add', add);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'all'));\n }\n\n function get(config) {\n return $http({\n method: 'GET',\n headers: headers,\n url: url + '/' + config.object.data.id,\n params: encodeParams(config.params)\n }).then(resolveHttp, rejectHttp.bind(null, 'get'));\n }\n\n function remove(config) {\n return $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'remove'));\n }\n\n function unlink(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Object has been removed', _this, 0, 'unlink'));\n } else if (config.target !== undefined && config.target.data.id === undefined) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Can\\'t unlink object without id through rest call', _this, 0, 'unlink'));\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'get')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n if (config.target === undefined) {\n $http({\n method: 'PATCH',\n headers: headers,\n data: {data: []},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n } else {\n $http({\n method: 'DELETE',\n headers: headers,\n url: url + '/' + config.object.data.id + '/relationships/' + config.key + '/' + config.target.data.id\n }).then(resolveHttp, rejectHttp.bind(null, 'unlink')).then(deferred.resolve, deferred.reject);\n }\n }\n\n return deferred.promise;\n }\n\n function link(config) {\n var deferred = $q.defer();\n var schema = config.object.schema.relationships[config.key];\n\n if (config.object.removed === true) {\n deferred.reject({errors: [{status: 0, statusText: 'Object has been removed'}]});\n } else if (config.target === undefined || config.target.data.id === undefined) {\n deferred.reject({errors: [{status: 0, statusText: 'Can\\'t link object without id through rest call'}]});\n } else if (schema.type === 'hasOne') {\n $http({\n method: 'PATCH',\n headers: headers,\n data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n } else if (schema.type === 'hasMany') {\n $http({\n method: 'POST',\n headers: headers,\n data: {data: [AngularJsonAPIModelLinkerService.toLinkData(config.target)]},\n url: url + '/' + config.object.data.id + '/relationships/' + config.key\n }).then(resolveHttp, rejectHttp.bind(null, 'link')).then(deferred.resolve, deferred.reject);\n }\n\n return deferred.promise;\n }\n\n function update(config) {\n return $http({\n method: 'PATCH',\n headers: headers,\n url: url + '/' + config.object.data.id,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'update'));\n }\n\n function add(config) {\n return $http({\n method: 'POST',\n headers: headers,\n url: url,\n data: config.object.form.toJson()\n }).then(resolveHttp, rejectHttp.bind(null, 'add'));\n }\n\n function resolveHttp(response) {\n return $q.resolve(response.data);\n }\n\n function rejectHttp(action, response) {\n var deferred = $q.defer();\n\n if (response.status === 0) {\n $http({\n method: 'GET',\n url: 'https://status.cloud.google.com/incidents.schema.json'\n }).then(rejectServerOffline, rejectNoConnection);\n } else {\n deferred.reject(AngularJsonAPIModelSourceError.create(response.statusText, _this, response.status, action));\n }\n\n return deferred.promise;\n\n function rejectServerOffline(response) {\n deferred.reject(AngularJsonAPIModelSourceError.create('Server is offline', _this, response.status, action));\n }\n\n function rejectNoConnection() {\n deferred.reject(AngularJsonAPIModelSourceError.create('No internet connection', _this, response.status, action));\n }\n }\n }\n\n function encodeParams(params) {\n var encodedParams = {};\n\n if (params === undefined) {\n return {};\n }\n\n angular.forEach(params, function(paramValue, paramKey) {\n if (angular.isArray(paramValue)) {\n encodedParams[paramKey] = encodeValue(paramValue);\n } else if (angular.isObject(paramValue)) {\n angular.forEach(paramValue, function(paramInnerValue, paramInnerKey) {\n encodedParams[paramKey + '[' + paramInnerKey + ']'] = encodeValue(paramInnerValue);\n });\n } else {\n encodedParams[paramKey] = paramValue;\n }\n });\n\n return encodedParams;\n\n function encodeValue(argument) {\n if (angular.isArray(argument)) {\n return argument.join(',');\n } else {\n return argument;\n }\n }\n }\n\n function decodeParams(params) {\n var decodedParams = {};\n\n angular.forEach(params, function(value, key) {\n var objectKeyStart = key.indexOf('[');\n value = value.split(',');\n\n if (objectKeyStart > -1) {\n var objectKey = key.substr(0, objectKeyStart);\n var objectElementKey = key.substr(objectKeyStart + 1, key.indexOf(']') - objectKeyStart - 1);\n\n decodedParams[objectKey] = decodedParams[objectKey] || {};\n decodedParams[objectKey][objectElementKey] = value;\n } else {\n decodedParams[key] = value;\n }\n });\n\n return decodedParams;\n }\n }\n})();\n",null,"(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-rest')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceRest) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceRest = AngularJsonAPISourceRest;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n /* global Parse: false */\n angular.module('angular-jsonapi-parse', ['angular-jsonapi'])\n .constant('Parse', Parse);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper);\n\n function AngularJsonAPISourceParseWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPISourcePrototype,\n AngularJsonAPIModelLinkerService,\n pluralize,\n Parse,\n $log,\n $q\n ) {\n\n AngularJsonAPISourceParse.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceParse.prototype.constructor = AngularJsonAPISourceParse;\n AngularJsonAPISourceParse.prototype.initialize = initialize;\n\n return {\n create: AngularJsonAPISourceParseFactory\n };\n\n function AngularJsonAPISourceParseFactory(name, table) {\n return new AngularJsonAPISourceParse(name, table);\n }\n\n function AngularJsonAPISourceParse(name, table) {\n var _this = this;\n\n _this.ParseObject = Parse.Object.extend(table);\n _this.type = pluralize(table).charAt(0).toLowerCase() + pluralize(table).slice(1);\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('remove', remove);\n _this.synchronization('update', update);\n _this.synchronization('add', update);\n _this.synchronization('all', all);\n _this.synchronization('get', get);\n _this.synchronization('refresh', get);\n\n function all(config) {\n var query = new Parse.Query(_this.ParseObject);\n\n if (config.params.limit !== undefined) {\n query.limit(config.params.limit);\n }\n\n angular.forEach(config.params.filter, function(filter) {\n query.equalTo(filter.key, filter.value);\n });\n\n return query.find().then(resolveParse, rejectParse.bind(null, 'all'));\n }\n\n function get(config) {\n var query = new Parse.Query(_this.ParseObject);\n return query.get(config.object.data.id).then(resolveParse, rejectParse.bind(null, 'get'));\n }\n\n function remove(config) {\n var object = new _this.ParseObject();\n object.set('id', config.object.data.id);\n return object.destroy().then(resolveParse, rejectParse.bind(null, 'remove'));\n }\n\n function update(config) {\n var object = toParseObject(config.object);\n return object.save(null).then(resolveParse, rejectParse.bind(null, 'update'));\n }\n\n function toParseObject(object) {\n var parseObject = new _this.ParseObject();\n angular.forEach(object.form.data.attributes, function(attribute, key) {\n parseObject.set(key, attribute);\n });\n\n angular.forEach(object.schema.relationships, function(relationship, key) {\n if (relationship.type === 'hasOne'\n && object.form.data.relationships[key].data !== null\n && object.form.data.relationships[key].data !== undefined\n ) {\n var table = pluralize(key, 1).charAt(0).toUpperCase() + pluralize(key, 1).slice(1);\n var parsePointer = new (Parse.Object.extend(table))();\n parsePointer.set('id', object.form.data.relationships[key].data.id);\n parseObject.set(key, parsePointer);\n }\n });\n\n return parseObject;\n }\n\n function fromParseObject(object) {\n var relationships = _this.synchronizer.resource.schema.relationships;\n object.type = _this.type;\n object.relationships = object.relationships || [];\n angular.forEach(relationships, function(relationship, key) {\n if (object.attributes[key] && relationship.type === 'hasOne') {\n object.relationships[key] = {\n data: {\n type: relationship.model,\n id: object.attributes[key].id\n }\n };\n }\n });\n\n return object;\n }\n\n function resolveParse(response) {\n if (angular.isArray(response)) {\n angular.forEach(response, function(elem, key) {\n response[key] = fromParseObject(elem);\n });\n } else if (angular.isObject(response)) {\n response = fromParseObject(response);\n }\n\n return $q.resolve({\n data: response\n });\n }\n\n function rejectParse(action, response) {\n $log.error('Parse error for', action, response);\n return $q.reject(response);\n }\n }\n\n function initialize(appId, jsKey) {\n Parse.initialize(appId, jsKey);\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-parse')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceParse) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceParse;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local', ['angular-jsonapi']);\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper);\n\n function AngularJsonAPISourceLocalWrapper(\n AngularJsonAPISourcePrototype,\n $window,\n $q\n ) {\n var size = {\n max: 0,\n all: 0,\n limit: 5200000,\n list: {}\n };\n\n AngularJsonAPISourceLocal.prototype = Object.create(AngularJsonAPISourcePrototype.prototype);\n AngularJsonAPISourceLocal.prototype.constructor = AngularJsonAPISourceLocal;\n\n return {\n create: AngularJsonAPISourceLocalFactory,\n size: size\n };\n\n function AngularJsonAPISourceLocalFactory(name, prefix) {\n return new AngularJsonAPISourceLocal(name, prefix);\n }\n\n function AngularJsonAPISourceLocal(name, prefix) {\n var _this = this;\n\n prefix = prefix || 'AngularJsonAPI';\n\n _this.__updateStorage = updateStorage;\n\n AngularJsonAPISourcePrototype.apply(_this, arguments);\n\n _this.synchronization('init', init);\n\n _this.begin('clearCache', clear);\n\n _this.finish('init', updateStorage);\n _this.finish('clearCache', updateStorage);\n _this.finish('remove', updateStorage);\n _this.finish('refresh', updateStorage);\n _this.finish('unlink', updateStorage);\n _this.finish('unlinkReflection', updateStorage);\n _this.finish('link', updateStorage);\n _this.finish('linkReflection', updateStorage);\n _this.finish('update', updateStorage);\n _this.finish('add', updateStorage);\n _this.finish('get', updateStorage);\n _this.finish('all', updateStorage);\n _this.finish('include', updateStorage);\n\n function init() {\n var type = _this.synchronizer.resource.schema.type;\n return $q.resolve($window.localStorage.getItem(prefix + '.' + type));\n }\n\n function clear() {\n var type = _this.synchronizer.resource.schema.type;\n var key = prefix + '.' + type;\n\n size.all -= size.list[key];\n delete size.list[key];\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.removeItem(key);\n }\n\n function updateStorage() {\n var type = _this.synchronizer.resource.schema.type;\n var cache = _this.synchronizer.resource.cache;\n var json = cache.toJson();\n var key = prefix + '.' + type;\n\n size.list[key] = size.list[key] === undefined ? 0 : size.list[key];\n size.all += json.length - size.list[key];\n size.list[key] = json.length;\n size.max = objectMaxKey(size.list);\n size.fraction = size.list[size.max] / size.limit * 100;\n\n $window.localStorage.setItem(key, json);\n }\n\n function objectMaxKey(object) {\n return Object.keys(object).reduce(function(m, k) {\n return object[k] > object[m] ? k : m;\n }, Object.keys(object)[0]);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi-local')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$jsonapi', decorator);\n }\n\n function decorator($delegate, AngularJsonAPISourceLocal) {\n var $jsonapi = $delegate;\n\n $jsonapi.sourceLocal = AngularJsonAPISourceLocal;\n\n return $jsonapi;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi', ['uuid4'])\n /* global pluralize: false, validate: false */\n .constant('pluralize', pluralize)\n .constant('validateJS', validate);\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper);\n\n function AngularJsonAPIResourceCacheWrapper(\n uuid4,\n $log\n ) {\n\n AngularJsonAPIResourceCache.prototype.get = get;\n AngularJsonAPIResourceCache.prototype.index = index;\n AngularJsonAPIResourceCache.prototype.setIndexIds = setIndexIds;\n AngularJsonAPIResourceCache.prototype.addOrUpdate = addOrUpdate;\n\n AngularJsonAPIResourceCache.prototype.fromJson = fromJson;\n AngularJsonAPIResourceCache.prototype.toJson = toJson;\n AngularJsonAPIResourceCache.prototype.clear = clear;\n\n AngularJsonAPIResourceCache.prototype.remove = remove;\n AngularJsonAPIResourceCache.prototype.revertRemove = revertRemove;\n AngularJsonAPIResourceCache.prototype.clearRemoved = clearRemoved;\n\n return {\n create: AngularJsonAPIResourceCacheFactory\n };\n\n function AngularJsonAPIResourceCacheFactory(resource) {\n return new AngularJsonAPIResourceCache(resource);\n }\n\n /**\n * Constructor\n */\n function AngularJsonAPIResourceCache(resource) {\n var _this = this;\n\n _this.resource = resource;\n _this.data = {};\n _this.removed = {};\n _this.size = 0;\n\n _this.indexIds = undefined;\n }\n\n /**\n * Add new model or update existing with data\n * @param {object} validatedData Data that are used to update or create an object, has to be valid\n * @return {AngularJsonAPIModel} Created model\n */\n function addOrUpdate(validatedData, config, updatedAt) {\n var _this = this;\n var id = validatedData.id;\n\n if (id === undefined) {\n $log.error('Can\\'t add data without id!', validatedData);\n return;\n }\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(validatedData, config, updatedAt);\n _this.size += 1;\n } else {\n _this.data[id].update(validatedData, !config.new, config.initialization);\n }\n\n return _this.data[id];\n }\n\n\n /**\n * Recreate object structure from json data\n * @param {json} json Json data\n * @return {undefined}\n */\n function fromJson(json) {\n var _this = this;\n var collection = angular.fromJson(json);\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: true\n };\n\n if (angular.isObject(collection) && collection.data !== undefined) {\n _this.updatedAt = collection.updatedAt;\n _this.indexIds = collection.indexIds;\n\n angular.forEach(collection.data, function(objectData) {\n var data = objectData.data;\n _this.addOrUpdate(data, config, objectData.updatedAt);\n });\n }\n }\n\n /**\n * Encodes memory into json format\n * @return {json} Json encoded memory\n */\n function toJson() {\n var _this = this;\n var json = {\n data: [],\n updatedAt: _this.updatedAt,\n indexIds: _this.indexIds\n };\n\n angular.forEach(_this.data, function(object) {\n if (object.hasErrors() === false) {\n json.data.push(object.toJson());\n }\n });\n\n return angular.toJson(json);\n }\n\n /**\n * Clear memory\n * @return {undefined}\n */\n function clear() {\n var _this = this;\n\n _this.indexIds = undefined;\n _this.data = {};\n _this.removed = {};\n }\n\n /**\n * Low level get used internally, does not run any synchronization\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function get(id) {\n var _this = this;\n\n var data = {\n id: id,\n type: _this.resource.schema.type\n };\n\n var config = {\n new: false,\n synchronized: false,\n stable: false,\n pristine: true\n };\n\n if (_this.data[id] === undefined) {\n _this.data[id] = _this.resource.modelFactory(data, config);\n }\n\n return _this.data[id];\n }\n\n /**\n * Low level get used internally, does not run any synchronization, used for index requests\n * @param {objec} params\n * @return {AngularJsonAPIModel} Model associated with id\n */\n function index(params) {\n var _this = this;\n params = params || {};\n\n if (_this.indexIds === undefined) {\n return _this.indexIds;\n }\n\n return _this.indexIds.map(_this.get.bind(_this)).filter(filter);\n\n function filter(argument) {\n var filterParams = params.filter;\n var valid = true;\n\n angular.forEach(filterParams, function(constraint) {\n valid = valid && argument.data.attributes[constraint.key] === constraint.value;\n });\n\n return valid;\n }\n }\n\n /**\n * Cache ids of objects returned by index request\n * @param {ids array or AngularJsonAPIModel array} array Objects or ids to be cached\n */\n function setIndexIds(array) {\n var _this = this;\n\n _this.indexIds = [];\n\n angular.forEach(array, function(element) {\n if (angular.isString(element) && _this.resource.schema.id.validate(element)) {\n _this.indexIds.push(element);\n } else if (angular.isObject(element) && _this.resource.schema.id.validate(element.data.id)) {\n _this.indexIds.push(element.data.id);\n }\n });\n }\n\n /**\n * Remove object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function remove(id) {\n var _this = this;\n\n if (_this.data[id] !== undefined) {\n _this.removed[id] = _this.data[id];\n delete _this.data[id];\n _this.size -= 1;\n }\n\n return _this.removed[id];\n }\n\n /**\n * Revert removal of an object with given id from cache\n * @param {uuid} id\n * @return {AngularJsonAPIModel / undefined} Removed object, undefined if\n * object does not exist\n */\n function revertRemove(id) {\n var _this = this;\n\n if (_this.removed[id] !== undefined) {\n _this.data[id] = _this.removed[id];\n delete _this.removed[id];\n _this.size += 1;\n }\n\n return _this.data[id];\n }\n\n /**\n * Clear removed object from memory\n * @param {uuid} id\n * @return {undefined}\n */\n function clearRemoved(id) {\n var _this = this;\n\n delete _this.removed[id];\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService);\n\n function AngularJsonAPIModelLinkerService($log) {\n var _this = this;\n\n _this.toLinkData = toLinkData;\n\n _this.link = link;\n _this.unlink = unlink;\n\n return this;\n\n /**\n * Extracts data needed for relationship linking from object\n * @param {AngularJsonAPIModel} object Object\n * @return {json} Link data\n */\n function toLinkData(object) {\n if (object === null) {\n return null;\n }\n\n return {type: object.data.type, id: object.data.id};\n }\n\n /**\n * Add target to object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function link(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t add link to non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (target === undefined) {\n $log.error('Can\\'t link non existing object', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema === undefined) {\n $log.error('Can\\'t add link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (target !== null && schema.polymorphic === false && schema.model !== target.data.type) {\n $log.error('This relation is not polymorphic, expected: ' + schema.model + ' instead of ' + target.data.type);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (schema.type === 'hasMany') {\n if (oneWay === true) {\n __addHasMany(object, key, target, form);\n return [];\n } else {\n return __processAddHasMany(object, key, target, form);\n }\n } else if (schema.type === 'hasOne') {\n if (oneWay === true) {\n __addHasOne(object, key, target, form);\n return [];\n } else {\n return __processAddHasOne(object, key, target, form);\n }\n }\n }\n\n /**\n * Remove target from object relationships and data.relationships\n * @param {AngularJsonAPIModel} object Object to be modified\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked\n * @param {AngularJsonAPISchema} schema Relationship schema\n */\n function unlink(object, key, target, oneWay, form) {\n var schema;\n form = form === undefined ? false : form;\n\n if (object === undefined) {\n $log.error('Can\\'t remove link from non existing object', object, key, target);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n return [];\n }\n\n schema = object.schema.relationships[key];\n\n if (schema === undefined) {\n $log.error('Can\\'t remove link not present in schema:', object, key, target, schema);\n $log.error('Object:', object.data.type, object);\n $log.error('Target:', target.data.type, target);\n $log.error('Key:', key);\n $log.error('Schema:', schema);\n return [];\n }\n\n if (oneWay === true) {\n __removeHasMany(object, key, target, form);\n return [];\n } else {\n return __processRemove(object, key, target, form);\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __processAddHasMany(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var reflectionSchema;\n\n if (reflectionKey === false) {\n __addHasMany(object, key, target, form);\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema === undefined) {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n } else if (reflectionSchema.type === 'hasOne') {\n return __swapResults(\n __wrapResults(object, key, target),\n __wrapResults(target, reflectionKey, object),\n __processAddHasOne(target, reflectionKey, object, form)\n );\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(object, key, target, form);\n __addHasMany(target, reflectionKey, object, form);\n return [__wrapResults(target, reflectionKey, object)];\n }\n }\n\n function __processAddHasOne(object, key, target, form) {\n var reflectionKey = object.schema.relationships[key].reflection;\n var oldReflection = object.relationships[key];\n var reflectionSchema;\n var oldReflectionSchema;\n var result = [];\n\n __addHasOne(object, key, target, form);\n\n if (reflectionKey === false) {\n return [];\n }\n\n if (oldReflection !== undefined && oldReflection !== null) {\n oldReflectionSchema = oldReflection.schema.relationships[reflectionKey];\n\n if (oldReflectionSchema !== undefined) {\n if (oldReflectionSchema.type === 'hasOne') {\n __removeHasOne(oldReflection, reflectionKey, object, form);\n } else if (oldReflectionSchema.type === 'hasMany') {\n __removeHasMany(oldReflection, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(oldReflection, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n if (target !== undefined && target !== null && reflectionKey !== false) {\n reflectionSchema = target.schema.relationships[reflectionKey];\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __addHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __addHasMany(target, reflectionKey, object, form);\n }\n\n result.push(__wrapResults(target, reflectionKey, object));\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n }\n }\n\n return result;\n }\n\n function __processRemove(object, key, target, form) {\n var schema = object.schema.relationships[key];\n var reflectionKey = schema.reflection;\n var reflectionSchema;\n\n if (schema.type === 'hasMany') {\n __removeHasMany(object, key, target, form);\n } else if (schema.type === 'hasOne') {\n __removeHasOne(object, key, target, form);\n }\n\n if (reflectionKey === false) {\n return [];\n }\n\n reflectionSchema = target.schema.relationships[reflectionKey];\n\n if (reflectionSchema !== undefined) {\n if (reflectionSchema.type === 'hasOne') {\n __removeHasOne(target, reflectionKey, object, form);\n } else if (reflectionSchema.type === 'hasMany') {\n __removeHasMany(target, reflectionKey, object, form);\n }\n } else {\n $log.error('Cannot find reflection of', key, 'relationship for', object.data.type, 'in', target.data.type);\n $log.error('For one side relationships set schema.reflection to false');\n return [];\n }\n\n return [__wrapResults(target, reflectionKey, object)];\n }\n\n function __addHasOne(object, key, target, form) {\n $log.debug('addHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n object.relationships[key] = target;\n object.data.relationships[key].data = toLinkData(target);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __addHasMany(object, key, target, form) {\n $log.debug('addHasMany', object, key, target);\n\n var linkData = toLinkData(target);\n if (form === true) {\n object = object.form;\n }\n\n if (angular.isArray(object.relationships[key]) && object.relationships[key].indexOf(target) > -1) {\n return false;\n }\n\n object.relationships[key] = object.relationships[key] || [];\n object.data.relationships[key].data = object.data.relationships[key].data || [];\n\n object.relationships[key].push(target);\n object.data.relationships[key].data.push(linkData);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasOne(object, key, target, form) {\n $log.debug('removeHasOne', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (target !== undefined && object.relationships[key] !== target) {\n return false;\n }\n\n object.relationships[key] = null;\n object.data.relationships[key].data = undefined;\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __removeHasMany(object, key, target, form) {\n $log.debug('removeHasMany', object, key, target);\n\n if (form === true) {\n object = object.form;\n }\n\n if (object.relationships[key] === undefined) {\n return;\n }\n\n if (target === undefined) {\n object.relationships[key] = [];\n object.data.relationships[key].data = [];\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n var index = object.relationships[key].indexOf(target);\n\n if (index === -1) {\n return false;\n }\n\n object.relationships[key].splice(index, 1);\n object.data.relationships[key].data.splice(index, 1);\n\n if (form === false) {\n object.reset(true);\n }\n\n return true;\n }\n\n function __wrapResults(object, key, target) {\n return {\n object: object,\n key: key,\n target: target\n };\n }\n\n function __swapResults(value, newValue, array) {\n var index = -1;\n angular.forEach(array, function(item, i) {\n if (item.object === value.object && item.key === value.key && item.target === value.target) {\n index = i;\n }\n });\n\n if (index > -1) {\n array[index] = newValue;\n } else {\n array.push(newValue);\n }\n\n return array;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper);\n\n function AngularJsonAPIModelFormWrapper(\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelLinkerService,\n validateJS,\n $q\n ) {\n\n AngularJsonAPIModelForm.prototype.save = save;\n AngularJsonAPIModelForm.prototype.reset = reset;\n AngularJsonAPIModelForm.prototype.validate = validate;\n\n AngularJsonAPIModelForm.prototype.link = link;\n AngularJsonAPIModelForm.prototype.unlink = unlink;\n\n AngularJsonAPIModelForm.prototype.toJson = toJson;\n\n return {\n create: AngularJsonAPIModelFormFactory\n };\n\n function AngularJsonAPIModelFormFactory(parent) {\n return new AngularJsonAPIModelForm(parent);\n }\n\n function AngularJsonAPIModelForm(parent) {\n var _this = this;\n\n _this.data = {\n id: parent.data.id,\n type: parent.data.type,\n attributes: {},\n relationships: {}\n };\n\n _this.relationships = {};\n _this.parent = parent;\n _this.schema = parent.schema;\n _this.reset();\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = angular.copy(_this.data);\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data\n };\n }\n\n /**\n * Saves form, shortcut to parent.save()\n * @return {promise} Promise associated with synchronization\n */\n function save() {\n var _this = this;\n\n return _this.parent.save();\n }\n\n /**\n * Resets form to state of a parent\n * @return {undefined}\n */\n function reset(auto) {\n var _this = this;\n\n angular.forEach(_this.schema.relationships, function(data, key) {\n _this.data.relationships[key] = angular.copy(_this.parent.data.relationships[key]) || {};\n if (angular.isArray(_this.relationships[key])) {\n _this.relationships[key] = _this.parent.relationships[key].slice();\n } else {\n _this.relationships[key] = _this.parent.relationships[key];\n }\n });\n\n if (auto === true && _this.parent.synchronized === true) {\n return;\n }\n\n angular.forEach(_this.schema.attributes, function(validator, key) {\n _this.data.attributes[key] = angular.copy(_this.parent.data.attributes[key]);\n });\n\n _this.parent.errors.validation.clear();\n }\n\n /**\n * Validates form\n * @return {promise} Promise rejected to errors object indexed by keys. If the\n * key param i stated it only validates an attribute, else all attributes.\n */\n function validate(key) {\n var _this = this;\n var attributesWrapper;\n var constraintsWrapper;\n var deferred = $q.defer();\n\n if (key === undefined) {\n attributesWrapper = _this.data.attributes;\n constraintsWrapper = _this.schema.attributes;\n } else {\n attributesWrapper = {};\n constraintsWrapper = {};\n\n attributesWrapper[key] = _this.data.attributes[key];\n constraintsWrapper[key] = _this.schema.attributes[key];\n }\n\n validateJS.async(\n attributesWrapper,\n constraintsWrapper\n ).then(resolve, reject);\n\n function resolve() {\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n deferred.resolve();\n }\n\n function reject(errorsMap) {\n _this.parent.error = true;\n if (key === undefined) {\n _this.parent.errors.validation.clear();\n } else {\n _this.parent.errors.validation.clear(key);\n }\n\n angular.forEach(errorsMap, function(errors, attribute) {\n angular.forEach(errors, function(error) {\n _this.parent.errors.validation.add(attribute, AngularJsonAPIModelValidationError.create(error, attribute));\n });\n });\n\n deferred.reject(_this.parent.errors.validation);\n }\n\n return deferred.promise;\n }\n\n /**\n * Adds link to a form without synchronization\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function link(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.link(_this.parent, key, target, oneWay, true));\n }\n\n /**\n * Removes link from form without synchronization\n * @param {[type]} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {Boolean} Status\n */\n function unlink(key, target, oneWay) {\n var _this = this;\n oneWay = oneWay === undefined ? false : true;\n\n return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true));\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper);\n\n function AngularJsonAPIAbstractModelWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelValidationError,\n AngularJsonAPIModelErrorsManager,\n AngularJsonAPIModelLinkerService,\n AngularJsonAPIModelForm,\n $rootScope,\n $injector,\n $log,\n $q\n ) {\n AngularJsonAPIAbstractModel.prototype.refresh = refresh;\n AngularJsonAPIAbstractModel.prototype.remove = remove;\n AngularJsonAPIAbstractModel.prototype.reset = reset;\n AngularJsonAPIAbstractModel.prototype.save = save;\n\n AngularJsonAPIAbstractModel.prototype.update = update;\n\n AngularJsonAPIAbstractModel.prototype.link = link;\n AngularJsonAPIAbstractModel.prototype.unlink = unlink;\n AngularJsonAPIAbstractModel.prototype.unlinkAll = unlinkAll;\n\n AngularJsonAPIAbstractModel.prototype.toJson = toJson;\n\n AngularJsonAPIAbstractModel.prototype.hasErrors = hasErrors;\n\n return AngularJsonAPIAbstractModel;\n\n /**\n * Constructor\n * @param {json} data Validated data used to create an object\n * @param {object} config Is object new (for form)\n */\n function AngularJsonAPIAbstractModel(data, config, updatedAt) {\n var _this = this;\n\n data.relationships = data.relationships || {};\n\n /**\n * Is not a new record\n * @type {Boolean}\n */\n _this.new = config.new === undefined ? false : config.new;\n\n /**\n * Is present on the server\n * @type {Boolean}\n */\n _this.stable = config.stable === undefined ? true : config.stable;\n\n /**\n * Has been synchronized with the server\n * @type {Boolean}\n */\n _this.synchronized = config.synchronized === undefined ? true : config.synchronized;\n\n /**\n * Has just been created by request and may not exist on the server\n * @type {Boolean}\n */\n _this.pristine = config.pristine === undefined ? true : config.pristine;\n\n _this.removed = false;\n _this.loading = false;\n _this.saving = false;\n _this.updatedAt = _this.synchronized === true ? Date.now() : updatedAt;\n\n _this.loadingCount = 0;\n _this.savingCount = 0;\n\n _this.data = {\n relationships: {},\n attributes: {}\n };\n _this.relationships = {};\n\n angular.forEach(_this.schema.relationships, function(schema, key) {\n _this.relationships[key] = undefined;\n });\n\n _this.errors = {\n validation: AngularJsonAPIModelErrorsManager.create(\n 'Validation',\n 'Errors of attributes validation',\n AngularJsonAPIModelValidationError\n ),\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.promise = $q.resolve(_this);\n\n __setData(_this, data);\n\n _this.form = AngularJsonAPIModelForm.create(_this);\n }\n\n /**\n * Saves model's form\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function save() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: _this.new === true ? 'add' : 'update',\n object: _this\n };\n\n _this.form.validate().then(\n synchronize,\n deferred.reject\n ).finally(__decrementSavingCounter.bind(_this, undefined));\n\n __incrementSavingCounter(_this);\n\n return deferred.promise;\n\n function synchronize() {\n _this.synchronize(config).then(resolve, reject, notify);\n }\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:' + config.action, 'resolved', _this, response);\n _this.update(response.data.data);\n\n if (_this.new === true) {\n _this.resource.cache.indexIds = _this.resource.cache.indexIds || [];\n _this.resource.cache.indexIds.push(_this.data.id);\n }\n\n _this.synchronized = true;\n _this.new = false;\n _this.pristine = false;\n _this.stable = true;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve(response.data.meta);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:save', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Reset object form\n * @return {undefined}\n */\n function reset() {\n var _this = this;\n\n if (_this.form !== undefined) {\n _this.form.reset();\n }\n }\n\n /**\n * Synchronize object with remote\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function refresh(params) {\n var $jsonapi = $injector.get('$jsonapi');\n var deferred = $q.defer();\n var _this = this;\n params = params === undefined ? _this.schema.params.get : params;\n\n var config = {\n action: 'refresh',\n object: _this,\n params: params\n };\n\n if (_this.new === true) {\n var error = AngularJsonAPIModelSourceError.create('Can\\'t refresh new object', null, 0, 'refresh');\n _this.errors.synchronization.add('refresh', error);\n deferred.reject(error);\n } else {\n __incrementLoadingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n _this.synchronized = true;\n _this.stable = true;\n _this.pristine = false;\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:refresh', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Encodes object into json\n * @return {json} Json object\n */\n function toJson() {\n var _this = this;\n var data = _this.data;\n var relationships = {};\n\n angular.forEach(data.relationships, function(value, key) {\n if (value.data !== undefined) {\n relationships[key] = value;\n }\n });\n\n data.relationships = relationships;\n\n return {\n data: data,\n updatedAt: _this.updatedAt\n };\n }\n\n /**\n * Remove object\n * @return {promise} Promise associated with synchronization that resolves to nothing\n */\n function remove() {\n var _this = this;\n var deferred = $q.defer();\n\n var config = {\n action: 'remove',\n object: _this\n };\n\n _this.resource.cache.remove(_this.data.id);\n\n if (_this.new === true) {\n deferred.resolve();\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'resolved', _this, response);\n _this.removed = true;\n _this.unlinkAll();\n _this.resource.cache.clearRemoved(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'rejected', _this, response);\n _this.resource.cache.revertRemove(_this.data.id);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:remove', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlink all reflection relationships of the object **without synchronization**\n * @return {boolean} Result\n */\n function unlinkAll(key) {\n var _this = this;\n var deferred = $q.defer();\n\n __incrementLoadingCounter(_this);\n\n if (key === undefined) {\n angular.forEach(_this.relationships, removeLink);\n } else {\n removeLink(_this.relationships[key], key);\n }\n\n __decrementLoadingCounter(_this);\n\n return deferred.promise;\n\n function removeLink(linksObj, key) {\n var schema = _this.schema.relationships[key];\n var reflectionKey = schema.reflection;\n\n if (angular.isArray(linksObj)) {\n angular.forEach(linksObj, removeReflectionLink.bind(undefined, reflectionKey));\n } else if (angular.isObject(linksObj)) {\n removeReflectionLink(reflectionKey, linksObj);\n }\n\n if (schema.type === 'hasOne') {\n _this.relationships[key] = null;\n } else if (schema.type === 'hasMany') {\n _this.relationships[key] = [];\n }\n }\n\n function removeReflectionLink(reflectionKey, target) {\n var reflectionSchema = target.schema.relationships[reflectionKey];\n var config = {\n action: 'unlinkReflection',\n object: target,\n target: _this,\n key: reflectionKey\n };\n\n __incrementLoadingCounter(target);\n AngularJsonAPIModelLinkerService.unlink(target, reflectionKey, _this, reflectionSchema);\n\n target.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(target, undefined));\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'resolve', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.resolve();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'rejected', _this, response);\n\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlinkReflection', 'notify', _this, response);\n\n response.finish();\n deferred.notify(response);\n }\n }\n }\n\n /**\n * Links object to relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be linked\n * @return {promise} Promise associated with synchronizations\n */\n function link(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'link',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link undefined', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t link new object', null, 0, 'link');\n _this.errors.synchronization.add('link', error);\n deferred.reject(error);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'linkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].object.data.type + ':object:linkReflection', 'resolved', targets[key], operation);\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:link', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Unlinks object from relationship with the key\n * @param {string} key Relationship name\n * @param {AngularJsonAPIModel} target Object to be unlinked if undefined unlinks all\n * @return {promise} Promise associated with synchronizations\n */\n function unlink(key, target) {\n var deferred = $q.defer();\n var _this = this;\n var error;\n var config = {\n action: 'unlink',\n object: _this,\n target: target,\n key: key\n };\n\n if (target === undefined) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink undefined', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else if (_this.new === true) {\n error = AngularJsonAPIModelSourceError.create('Can\\'t unlink new object', null, 0, 'unlink');\n _this.errors.synchronization.add('unlink', error);\n deferred.reject(_this);\n } else {\n __incrementSavingCounter(_this);\n\n _this.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementSavingCounter.bind(_this, undefined));\n }\n\n return deferred.promise;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'resolved', _this, response);\n\n var targets = AngularJsonAPIModelLinkerService.link(_this, key, target);\n\n _this.stable = true;\n _this.pristine = false;\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n $q.allSettled(targets.map(synchronize))\n .then(resolveReflection, deferred.reject);\n\n function synchronize(result) {\n __incrementLoadingCounter(target);\n\n return target.synchronize({\n action: 'unlinkReflection',\n object: result.object,\n target: result.target,\n key: result.key\n }).finally(__decrementLoadingCounter.bind(target, undefined));\n }\n\n function resolveReflection(response) {\n angular.forEach(response, function(operation) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + targets[key].data.type + ':object:unlinkReflection', 'resolved', targets[key], operation);\n response.value.finish();\n }\n });\n\n deferred.resolve();\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'rejected', _this, response);\n\n deferred.reject(response.errors);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.data.type + ':object:unlink', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n\n /**\n * Sets object state to data\n * @param {object} validatedData JsonAPI object with data\n * @return {bool} Result\n */\n function update(validatedData, auto, initialization) {\n var _this = this;\n\n __incrementLoadingCounter(_this);\n\n __setData(_this, validatedData);\n _this.reset(auto);\n _this.synchronized = initialization === true ? false : true;\n _this.stable = initialization === true ? false : true;\n _this.updatedAt = Date.now();\n\n __decrementLoadingCounter(_this);\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /////////////\n // PRIVATE //\n /////////////\n\n /**\n * Low level set data function, use only with validated data\n * @param {AngularJsonAPIModel} object object to be modified\n * @param {object} validatedData Validated data\n * @return {boolean} Status\n */\n function __setData(object, validatedData) {\n\n var $jsonapi = $injector.get('$jsonapi');\n var schema = object.schema;\n\n object.data.id = validatedData.id;\n object.data.type = validatedData.type;\n\n if (object.resource.schema.type !== validatedData.type) {\n $log.error('Different type then resource', object.resource.schema.type, validatedData);\n return false;\n }\n\n if (!object.schema.id.validate(object.data.id)) {\n $log.error('Invalid id');\n return false;\n }\n\n object.data.links = validatedData.links;\n validatedData.attributes = validatedData.attributes || {};\n validatedData.relationships = validatedData.relationships || {};\n\n angular.forEach(schema.attributes, setAttributes);\n angular.forEach(schema.relationships, setRelationships);\n\n return true;\n\n function setAttributes(validators, key) {\n object.data.attributes[key] = validatedData.attributes[key];\n }\n\n function setRelationships(schema, key) {\n var relationshipData = validatedData.relationships[key];\n\n if (relationshipData === undefined) {\n if (object.data.relationships[key] === undefined) {\n object.data.relationships[key] = {data: undefined};\n }\n\n return;\n }\n\n object.data.relationships[key] = object.data.relationships[key] || {};\n object.data.relationships[key].links = relationshipData.links;\n\n if (schema.type === 'hasOne') {\n linkOne(object, key, relationshipData.data);\n } else if (schema.type === 'hasMany') {\n if (angular.isArray(relationshipData.data)) {\n if (relationshipData.data.length === 0) {\n object.data.relationships[key].data = [];\n object.unlinkAll(key);\n } else {\n angular.forEach(\n object.relationships[key],\n unlinkOne.bind(undefined, object, key, relationshipData.data)\n );\n angular.forEach(\n relationshipData.data,\n linkOne.bind(undefined, object, key)\n );\n }\n }\n }\n }\n\n function linkOne(object, key, data) {\n var resource;\n\n if (data === null) {\n AngularJsonAPIModelLinkerService.link(object, key, null);\n return;\n }\n\n if (data === undefined) {\n return;\n }\n\n resource = $jsonapi.getResource(data.type);\n\n if (resource === undefined) {\n $log.error('Factory not found', data.type, data);\n return;\n }\n\n var target = resource.cache.get(data.id);\n\n AngularJsonAPIModelLinkerService.link(object, key, target);\n }\n\n function unlinkOne(object, key, relationshipData, target) {\n if (relationshipData.indexOf(target.data.id) > -1) {\n return;\n }\n\n AngularJsonAPIModelLinkerService.unlink(object, key, target);\n }\n }\n }\n\n /////////////\n // Private //\n /////////////\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n\n function __incrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount += 1;\n object.saving = true;\n }\n\n function __decrementSavingCounter(object) {\n object = object === undefined ? this : object;\n object.savingCount -= 1;\n object.saving = object.savingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelValidationError', AngularJsonAPIModelValidationErrorWrapper);\n\n function AngularJsonAPIModelValidationErrorWrapper() {\n ValidationError.prototype = Object.create(Error.prototype);\n ValidationError.prototype.constructor = ValidationError;\n ValidationError.prototype.name = 'ValidationError';\n\n return {\n create: ValidationErrorFactory\n };\n\n function ValidationErrorFactory(message, attribute) {\n return new ValidationError(message, attribute);\n }\n\n function ValidationError(message, attribute) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n attribute: attribute\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelSourceError', AngularJsonAPIModelSourceErrorWrapper);\n\n function AngularJsonAPIModelSourceErrorWrapper() {\n SourceError.prototype = Object.create(Error.prototype);\n SourceError.prototype.constructor = SourceError;\n SourceError.prototype.name = 'SourceError';\n\n return {\n create: SourceErrorFactory\n };\n\n function SourceErrorFactory(message, source, code, action) {\n return new SourceError(message, source, code, action);\n }\n\n function SourceError(message, source, code, action) {\n var _this = this;\n\n _this.message = message;\n _this.context = {\n source: source,\n code: code,\n action: action\n };\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModelErrorsManager', AngularJsonAPIModelErrorsManagerWrapper);\n\n function AngularJsonAPIModelErrorsManagerWrapper() {\n ErrorsManager.prototype.constructor = ErrorsManager;\n ErrorsManager.prototype.concat = concat;\n ErrorsManager.prototype.clear = clear;\n ErrorsManager.prototype.add = add;\n ErrorsManager.prototype.hasErrors = hasErrors;\n\n return {\n create: ErrorsManagerFactory\n };\n\n function ErrorsManagerFactory(name, description, ErrorConstructor, defaultFilter) {\n return new ErrorsManager(name, description, ErrorConstructor, defaultFilter);\n }\n\n function ErrorsManager(name, description, ErrorConstructor, defaultFilter) {\n var _this = this;\n _this.name = name;\n _this.description = description;\n\n _this.ErrorConstructor = ErrorConstructor;\n _this.errors = {};\n _this.defaultFilter = defaultFilter || function() { return true; };\n }\n\n function clear(key) {\n var _this = this;\n\n if (key === undefined) {\n angular.forEach(_this.errors, function(obj, key) {\n _this.errors[key] = [];\n });\n } else {\n _this.errors[key] = [];\n }\n }\n\n function add(key, error) {\n var _this = this;\n\n _this.errors[key] = _this.errors[key] || [];\n _this.errors[key].push(error);\n }\n\n function concat(errors) {\n var _this = this;\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key] = [];\n });\n\n angular.forEach(errors, function(error) {\n _this.errors[error.key].push(error.object);\n });\n\n }\n\n function hasErrors(key) {\n var _this = this;\n\n if (key === undefined) {\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = answer || error.length > 0;\n });\n\n return answer;\n } else {\n return _this.errors[key] !== undefined && _this.errors[key].length > 0;\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('namedFunction', namedFunction);\n\n function namedFunction(name, fn) {\n return new Function('fn',\n 'return function ' + name + '(){ return fn.apply(this,arguments)}'\n )(fn);\n }\n})();\n","// from https://www.sitepen.com/blog/2012/10/19/lazy-property-access/\n(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('lazyProperty', function(target, propertyName, callback) {\n var result;\n var done;\n Object.defineProperty(target, propertyName, {\n get: function() { // Define the getter\n if (!done) {\n // We cache the result and only compute once.\n done = true;\n result = callback.call(target);\n }\n\n return result;\n },\n\n // Keep it enumerable and configurable, certainly not necessary.\n enumerable: true,\n configurable: true\n });\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .constant('toKebabCase', function(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n });\n\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(provide);\n\n function provide($provide) {\n $provide.decorator('$q', decorator);\n }\n\n function decorator($delegate) {\n var $q = $delegate;\n\n $q.allSettled = $q.allSettled || allSettled;\n\n function allSettled(promises, resolvedCallback, rejectedCallback) {\n // Implementation of allSettled function from Kris Kowal's Q:\n // https://github.com/kriskowal/q/wiki/API-Reference#promiseallsettled\n // by Michael Kropat from http://stackoverflow.com/a/27114615/1400432 slightly modified\n\n var wrapped = angular.isArray(promises) ? [] : {};\n\n angular.forEach(promises, function(promise, key) {\n if (!wrapped.hasOwnProperty(key)) {\n wrapped[key] = wrap(promise);\n }\n });\n\n return $q.all(wrapped);\n\n function wrap(promise) {\n return $q.resolve(promise)\n .then(function(value) {\n if (angular.isFunction(resolvedCallback)) {\n resolvedCallback(value);\n }\n\n return { success: true, value: value };\n },\n\n function(reason) {\n if (angular.isFunction(rejectedCallback)) {\n rejectedCallback(reason);\n }\n\n return { success: false, reason: reason };\n });\n }\n }\n\n return $q;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper);\n\n function AngularJsonAPISynchronizerSimpleWrapper(AngularJsonAPISynchronizerPrototype, $q, $log) {\n\n AngularJsonAPISynchronizerSimple.prototype = Object.create(AngularJsonAPISynchronizerPrototype.prototype);\n AngularJsonAPISynchronizerSimple.prototype.constructor = AngularJsonAPISynchronizerSimple;\n\n AngularJsonAPISynchronizerSimple.prototype.synchronize = synchronize;\n\n return {\n create: AngularJsonAPISynchronizerSimpleFactory\n };\n\n function AngularJsonAPISynchronizerSimpleFactory(sources) {\n return new AngularJsonAPISynchronizerSimple(sources);\n }\n\n function AngularJsonAPISynchronizerSimple(sources) {\n var _this = this;\n\n _this.state = {};\n\n AngularJsonAPISynchronizerPrototype.call(_this, sources);\n\n angular.forEach(sources, function(source) {\n source.synchronizer = _this;\n });\n }\n\n function synchronize(config) {\n var _this = this;\n var promises = [];\n var deferred = $q.defer();\n var action = config.action;\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize.call(_this, config);\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beginHooks[action], function(hook) {\n deferred.notify({step: 'begin', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.beforeHooks[action], function(hook) {\n deferred.notify({step: 'before', data: hook.call(_this, config)});\n });\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.synchronizationHooks[action], function(hook) {\n promises.push(hook.call(_this, config));\n });\n });\n\n $q.allSettled(promises, resolvedCallback, rejectedCallback).then(resolved, rejected);\n\n function resolvedCallback(value) {\n deferred.notify({step: 'synchronization', data: value});\n }\n\n function rejectedCallback(reason) {\n deferred.notify({step: 'synchronization', errors: reason});\n }\n\n function resolved(results) {\n _this.state[action] = _this.state[action] || {};\n _this.state[action].success = true;\n\n angular.forEach(results, function(result) {\n if (result.success === false) {\n _this.state[action].success = false;\n }\n });\n\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.afterHooks[action], function(hook) {\n deferred.notify({step: 'after', errors: hook.call(_this, config, results)});\n });\n });\n\n var data;\n var errors = [];\n\n angular.forEach(results, function(result) {\n if (result.success === true) {\n data = result.value;\n } else {\n errors.push({\n key: action,\n object: result.reason\n });\n }\n });\n\n if (errors.length > 0) {\n deferred.reject({data: data || {}, finish: finish, errors: errors});\n } else {\n deferred.resolve({data: data || {}, finish: finish, errors: errors});\n }\n }\n\n function finish() {\n angular.forEach(_this.sources, function(source) {\n angular.forEach(source.finishHooks[action], function(hook) {\n deferred.notify({step: 'finish', errors: hook.call(_this, config)});\n });\n });\n }\n\n function rejected(errors) {\n $log.error('All settled rejected! Something went wrong');\n\n deferred.reject({finish: angular.noop, errors: errors});\n }\n\n return deferred.promise;\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper);\n\n function AngularJsonAPISynchronizerPrototypeWrapper($log) {\n\n AngularJsonAPISynchronizerPrototype.prototype.synchronize = synchronize;\n\n return AngularJsonAPISynchronizerPrototype;\n\n function AngularJsonAPISynchronizerPrototype(sources) {\n var _this = this;\n\n _this.sources = sources;\n }\n\n function synchronize(config) {\n var _this = this;\n\n $log.debug('Synchro Collection', _this.resource.schema.type, config);\n\n if (config.action === undefined) {\n $log.error('Can\\'t synchronize undefined action', config);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISourcePrototype', AngularJsonAPISourcePrototypeWrapper);\n\n function AngularJsonAPISourcePrototypeWrapper() {\n AngularJsonAPISourcePrototype.prototype.before = beforeSynchro;\n AngularJsonAPISourcePrototype.prototype.after = afterSynchro;\n AngularJsonAPISourcePrototype.prototype.begin = begin;\n AngularJsonAPISourcePrototype.prototype.finish = finish;\n AngularJsonAPISourcePrototype.prototype.synchronization = synchronization;\n\n return AngularJsonAPISourcePrototype;\n\n function AngularJsonAPISourcePrototype(name) {\n var _this = this;\n var allHooks = [\n 'add',\n 'init',\n 'get',\n 'all',\n 'clearCache',\n 'remove',\n 'unlink',\n 'unlinkReflection',\n 'link',\n 'linkReflection',\n 'update',\n 'refresh',\n 'include'\n ];\n\n _this.name = name;\n _this.state = {};\n\n _this.beginHooks = {};\n _this.beforeHooks = {};\n _this.synchronizationHooks = {};\n _this.afterHooks = {};\n _this.finishHooks = {};\n\n _this.options = {};\n\n angular.forEach(allHooks, function(hookName) {\n _this.beginHooks[hookName] = [];\n _this.beforeHooks[hookName] = [];\n _this.synchronizationHooks[hookName] = [];\n _this.afterHooks[hookName] = [];\n _this.finishHooks[hookName] = [];\n _this.state[hookName] = {\n loading: false,\n success: true\n };\n });\n }\n\n function begin(action, callback) {\n var _this = this;\n\n _this.beginHooks[action].push(callback);\n }\n\n function finish(action, callback) {\n var _this = this;\n\n _this.finishHooks[action].push(callback);\n }\n\n function beforeSynchro(action, callback) {\n var _this = this;\n\n _this.beforeHooks[action].push(callback);\n }\n\n function afterSynchro(action, callback) {\n var _this = this;\n\n _this.afterHooks[action].push(callback);\n }\n\n function synchronization(action, callback) {\n var _this = this;\n\n _this.synchronizationHooks[action].push(callback);\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper);\n\n function AngularJsonAPISchemaWrapper(\n $log,\n pluralize,\n uuid4,\n AngularJsonAPISchemaLink\n ) {\n\n return {\n create: AngularJsonAPISchemaFactory\n };\n\n function AngularJsonAPISchemaFactory(schema) {\n return new AngularJsonAPISchema(schema);\n }\n\n function AngularJsonAPISchema(schema) {\n var _this = this;\n var include = schema.include || {};\n schema.include = include;\n include.get = schema.include.get || [];\n include.all = schema.include.all || [];\n\n _this.params = {\n get: {},\n all: {}\n };\n\n if (schema.id === 'uuid4') {\n schema.id = uuid4;\n } else if (schema.id === 'int') {\n schema.id = {\n generate: angular.noop,\n validate: angular.isNumber\n };\n } else if (angular.isObject(schema.id)) {\n if (!angular.isFunction(schema.id.generate)) {\n schema.id.generate = angular.noop;\n }\n } else {\n schema.id = {\n generate: angular.noop,\n validate: angular.identity.bind(null, true)\n };\n }\n\n angular.forEach(schema.relationships, function(linkSchema, linkName) {\n var linkSchemaObj = AngularJsonAPISchemaLink.create(linkSchema, linkName, schema.type);\n schema.relationships[linkName] = linkSchemaObj;\n if (linkSchemaObj.included === true) {\n include.get.push(linkName);\n if (linkSchemaObj.type === 'hasOne') {\n include.all.push(linkName);\n }\n }\n });\n\n angular.extend(_this, schema);\n\n if (include.get.length > 0) {\n _this.params.get.include = include.get;\n }\n\n if (include.all.length > 0) {\n _this.params.all.include = include.all;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink);\n\n function AngularJsonAPILinkSchrapperLink($log, pluralize) {\n\n return {\n create: AngularJsonAPISchemaLinkFactory\n };\n\n function AngularJsonAPISchemaLinkFactory(linkSchema, linkName, type) {\n return new AngularJsonAPISchemaLink(linkSchema, linkName, type);\n }\n\n function AngularJsonAPISchemaLink(linkSchema, linkName, type) {\n var _this = this;\n\n if (angular.isString(linkSchema)) {\n _this.model = pluralize.plural(linkName);\n _this.type = linkSchema;\n _this.polymorphic = false;\n _this.reflection = type;\n } else {\n if (linkSchema.type === undefined) {\n $log.error('Schema of link without a type: ', linkSchema, linkName);\n }\n\n if (linkSchema.type !== 'hasMany' && linkSchema.type !== 'hasOne') {\n $log.error('Schema of link with wrong type: ', linkSchema.type, 'available: hasOne, hasMany');\n }\n\n _this.model = linkSchema.model || pluralize.plural(linkName);\n _this.type = linkSchema.type;\n _this.polymorphic = linkSchema.polymorphic || false;\n\n if (linkSchema.reflection === undefined) {\n _this.reflection = _this.type === 'hasMany' ? pluralize.singular(type) : type;\n } else {\n _this.reflection = linkSchema.reflection;\n }\n\n _this.included = linkSchema.included || false;\n }\n }\n\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper);\n\n function AngularJsonAPIResourceWrapper(\n AngularJsonAPIModel,\n AngularJsonAPISchema,\n AngularJsonAPIResourceCache,\n AngularJsonAPICollection,\n $rootScope,\n $log,\n $q\n ) {\n AngularJsonAPIResource.prototype.get = get;\n AngularJsonAPIResource.prototype.all = all;\n AngularJsonAPIResource.prototype.remove = remove;\n AngularJsonAPIResource.prototype.initialize = initialize;\n\n AngularJsonAPIResource.prototype.clearCache = clearCache;\n\n return {\n create: AngularJsonAPIResourceFactory\n };\n\n function AngularJsonAPIResourceFactory(schema, synchronizer) {\n return new AngularJsonAPIResource(schema, synchronizer);\n }\n\n /**\n * AngularJsonAPIResource constructor\n * @param {json} schema Schema object\n * @param {AngularJsonAPISynchronizer} synchronizer Synchronizer for the resource\n */\n function AngularJsonAPIResource(schema, synchronizer) {\n var _this = this;\n var config = {\n action: 'init'\n };\n\n _this.schema = AngularJsonAPISchema.create(schema);\n _this.cache = AngularJsonAPIResourceCache.create(_this);\n\n _this.synchronizer = synchronizer;\n _this.synchronizer.resource = _this;\n\n _this.modelFactory = AngularJsonAPIModel.modelFactory(\n _this.schema,\n _this\n );\n\n _this.initialized = false;\n _this.type = _this.schema.type;\n\n synchronizer.resource = _this;\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'resolved', response);\n _this.cache.fromJson(response.data);\n _this.initialized = true;\n\n response.finish();\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'rejected', response);\n response.finish();\n _this.initialized = true;\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:init', 'notify', response);\n }\n }\n\n /**\n * Get request\n * @param {uuid} id\n * @return {AngularJsonAPIModel} Model associated with id, synchronized\n */\n function get(id, params) {\n var _this = this;\n\n if (!_this.schema.id.validate(id)) {\n return $q.reject({errors: [{status: 0, statusText: 'Invalid id'}]});\n }\n\n var object = _this.cache.get(id);\n\n object.promise = object.refresh(params);\n\n return object;\n }\n\n /**\n * All request\n * @param {object} params Object associated with params (for filters/pagination etc.)\n * @return {AngularJsonAPICollection} Collection of AngularJsonAPIModel, synchronized\n */\n function all(params) {\n var _this = this;\n params = angular.extend({}, _this.schema.params.all, params);\n\n var collection = AngularJsonAPICollection.create(\n _this,\n params\n );\n\n collection.promise = collection.fetch();\n\n return collection;\n }\n\n /**\n * Remove request\n * @param {uuid} id\n * @return {promise} Promise associated with the synchronization, in case of\n * fail object is reverted to previous state\n */\n function remove(id) {\n var _this = this;\n var object = _this.cache.remove(id);\n\n return object.remove();\n }\n\n /**\n * Initialize new AngularJsonAPIModel\n * @return {AngularJsonAPIModel} New model\n */\n function initialize() {\n var _this = this;\n var relationships = {};\n\n angular.forEach(_this.schema.relationships, function(relationshipSchema, relationshipName) {\n if (relationshipSchema.type === 'hasOne') {\n relationships[relationshipName] = {\n data: null\n };\n } else if (relationshipSchema.type === 'hasMany') {\n relationships[relationshipName] = {\n data: []\n };\n }\n });\n\n var data = {\n type: _this.type,\n id: _this.schema.id.generate(),\n attributes: {},\n relationships: relationships\n };\n\n var config = {\n new: true,\n synchronized: false,\n stable: false,\n pristine: false,\n initialization: false\n };\n\n var object = _this.modelFactory(data, config);\n\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:initialize', 'resolved', object);\n\n return object;\n }\n\n /**\n * Clears localy saved data\n * @return {promise} Promise associated with the synchronization resolves to nothing\n */\n function clearCache() {\n var _this = this;\n var deferred = $q.defer();\n var config = {\n action: 'clearCache'\n };\n\n _this.cache.clear();\n\n _this.synchronizer.synchronize(config).then(resolve, reject, notify);\n\n return deferred;\n\n function resolve(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.resolve(response);\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'resolved', response);\n response.finish();\n\n deferred.reject(response);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':resource:clearCache', 'notify', response);\n\n deferred.notify(response);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPIModel', AngularJsonAPIModel);\n\n function AngularJsonAPIModel(\n AngularJsonAPIAbstractModel,\n AngularJsonAPISchema,\n namedFunction,\n pluralize,\n $log\n ) {\n\n return {\n modelFactory: createModelFactory\n };\n\n function createModelFactory(schemaObj, resource) {\n var constructorName = pluralize.plural(schemaObj.type, 1);\n\n var Model = namedFunction(constructorName, function(data, config, updatedAt) {\n var _this = this;\n\n if (data.type !== _this.schema.type) {\n $log.error('Data type other then declared in schema: ', data.type, ' instead of ', _this.schema.type);\n }\n\n AngularJsonAPIAbstractModel.call(_this, data, config, updatedAt);\n\n _this.form.parent = _this;\n });\n\n Model.prototype = Object.create(AngularJsonAPIAbstractModel.prototype);\n Model.prototype.constructor = Model;\n\n Model.prototype.schema = schemaObj;\n Model.prototype.resource = resource;\n Model.prototype.synchronize = resource.synchronizer.synchronize.bind(resource.synchronizer);\n\n angular.forEach(schemaObj.functions, function(metaFunction, metaFunctionName) {\n Model.prototype[metaFunctionName] = function() {\n return metaFunction.apply(this, arguments);\n };\n });\n\n return modelFactory;\n\n function modelFactory(data, updatedAt, isNew) {\n return new Model(data, updatedAt, isNew);\n }\n }\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper);\n\n function AngularJsonAPICollectionWrapper(\n AngularJsonAPIModelSourceError,\n AngularJsonAPIModelErrorsManager,\n $rootScope,\n $injector,\n $q\n ) {\n\n AngularJsonAPICollection.prototype.fetch = fetch;\n AngularJsonAPICollection.prototype.refresh = fetch;\n AngularJsonAPICollection.prototype.get = get;\n AngularJsonAPICollection.prototype.hasErrors = hasErrors;\n\n return {\n create: AngularJsonAPICollectionFactory\n };\n\n function AngularJsonAPICollectionFactory(resource, params) {\n return new AngularJsonAPICollection(resource, params);\n }\n\n /**\n * Constructor\n * @param {AngularJsonAPIResource} resource Factory associated with the collection\n * @param {object} params Params associated with this resource (such as filters)\n */\n function AngularJsonAPICollection(resource, params) {\n var _this = this;\n\n _this.resource = resource;\n _this.type = resource.schema.type;\n _this.params = params || {};\n\n _this.errors = {\n synchronization: AngularJsonAPIModelErrorsManager.create(\n 'Source',\n 'Errors of synchronizations',\n AngularJsonAPIModelSourceError\n )\n };\n\n _this.data = _this.resource.cache.index(_this.params);\n\n _this.loading = false;\n _this.loadingCount = 0;\n _this.synchronized = false;\n _this.pristine = _this.data === undefined;\n\n _this.promise = $q.resolve(_this);\n\n var onObjectRemove = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:remove', remove);\n var onFactoryClear = $rootScope.$on('angularJsonAPI:' + _this.type + ':resource:clearCache', clear);\n var onObjectAdd = $rootScope.$on('angularJsonAPI:' + _this.type + ':object:add', add);\n\n $rootScope.$on('$destroy', clearWatchers);\n\n function remove(event, status, object) {\n var index;\n\n if (status === 'resolved' && _this.data !== undefined) {\n index = _this.data.indexOf(object);\n if (index > -1) {\n _this.data.splice(index, 1);\n _this.resource.cache.setIndexIds(_this.data);\n }\n }\n }\n\n function clear() {\n _this.data = undefined;\n _this.pristine = true;\n }\n\n function add(event, status, object) {\n if (status === 'resolved') {\n _this.data = _this.data || [];\n _this.data.push(object);\n }\n }\n\n function clearWatchers() {\n onObjectRemove();\n onFactoryClear();\n onObjectAdd();\n }\n }\n\n /**\n * Check if the object has errors\n * @return {Boolean}\n */\n function hasErrors() {\n var _this = this;\n var answer = false;\n\n angular.forEach(_this.errors, function(error) {\n answer = error.hasErrors() || answer;\n });\n\n return answer;\n }\n\n /**\n * Shortcut to this.resource.get\n * @param {string} id Id of object]\n * @return {AngularJsonAPIModel} Model with id\n */\n function get(id, params) {\n var _this = this;\n\n return _this.resource.get(id, params);\n }\n\n /**\n * Synchronizes collection with the server\n * @return {promise} Promise associated with synchronization that resolves to this\n */\n function fetch() {\n var _this = this;\n var deferred = $q.defer();\n var $jsonapi = $injector.get('$jsonapi');\n var config = {\n action: 'all',\n params: _this.params\n };\n\n __incrementLoadingCounter(_this);\n\n angular.forEach(_this.data, __incrementLoadingCounter);\n\n _this.resource.synchronizer.synchronize(config)\n .then(resolve, reject, notify)\n .finally(__decrementLoadingCounter.bind(_this, undefined));\n\n return deferred.promise;\n\n function resolve(response) {\n var results = $jsonapi.__proccesResults(response.data);\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'resolved', _this, response);\n $q.allSettled(results.included.map(synchronizeIncluded)).then(resolveIncluded, deferred.reject);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n\n _this.data = results.data;\n _this.links = response.data.links;\n\n _this.updatedAt = Date.now();\n _this.synchronized = true;\n _this.pristine = false;\n\n _this.resource.cache.setIndexIds(_this.data);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n\n function synchronizeIncluded(object) {\n __incrementLoadingCounter(object);\n\n return object.synchronize({\n action: 'include',\n object: object\n }).finally(__decrementLoadingCounter.bind(object, undefined));\n }\n\n function resolveIncluded(includedResponse) {\n angular.forEach(includedResponse, function(operation, key) {\n if (operation.success === true) {\n $rootScope.$emit('angularJsonAPI:' + results.included[key].data.type + ':object:include', 'resolved', results.included[key], operation);\n\n operation.value.finish();\n }\n });\n\n deferred.resolve(response.data.meta);\n }\n }\n\n function reject(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'rejected', _this, response);\n\n angular.forEach(_this.data, __decrementLoadingCounter);\n response.finish();\n _this.errors.synchronization.concat(response.errors);\n deferred.reject(_this);\n }\n\n function notify(response) {\n $rootScope.$emit('angularJsonAPI:' + _this.type + ':collection:fetch', 'notify', _this, response);\n\n deferred.notify(response);\n }\n }\n }\n\n function __incrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount += 1;\n object.loading = true;\n }\n\n function __decrementLoadingCounter(object) {\n object = object === undefined ? this : object;\n object.loadingCount -= 1;\n object.loading = object.loadingCount > 0;\n }\n})();\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .provider('$jsonapi', jsonapiProvider);\n\n function jsonapiProvider(validateJS) {\n var memory = {};\n var names = [];\n this.$get = jsonapiFactory;\n\n function jsonapiFactory(\n $log,\n AngularJsonAPIResource,\n AngularJsonAPISynchronizerSimple\n ) {\n return {\n addResource: addResource,\n getResource: getResource,\n clearCache: clearCache,\n allResources: allResources,\n listResources: listResources,\n addValidator: addValidator,\n synchronizerSimple: AngularJsonAPISynchronizerSimple,\n\n __proccesResults: __proccesResults\n };\n\n function addResource(schema, synchronizer) {\n var resource = AngularJsonAPIResource.create(schema, synchronizer);\n\n memory[schema.type] = resource;\n names.push(schema.type);\n }\n\n function getResource(type) {\n return memory[type];\n }\n\n function allResources() {\n return memory;\n }\n\n function listResources() {\n return names;\n }\n\n function clearCache() {\n angular.forEach(memory, function(resource) {\n resource.clearCache();\n });\n }\n\n function addValidator(name, validator) {\n if (!angular.isString(name)) {\n $log.error('Validator name is not a string', name);\n return;\n } else if (validateJS.validators[name] === undefined) {\n $log.warn('Redeclaring validator', name);\n }\n\n validateJS.validators[name] = validator;\n }\n\n function __proccesResults(results) {\n var objects = {\n data: [],\n included: []\n };\n\n if (results === undefined) {\n $log.error('Can\\'t proccess results:', results);\n return;\n }\n\n var config = {\n new: false,\n synchronized: true,\n stable: true,\n pristine: false,\n initialization: false\n };\n\n angular.forEach(results.included, function(data) {\n objects.included.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n\n if (angular.isArray(results.data)) {\n angular.forEach(results.data, function(data) {\n objects.data.push(getResource(data.type).cache.addOrUpdate(data, config));\n });\n } else if (results.data !== undefined) {\n objects.data.push(getResource(results.data.type).cache.addOrUpdate(results.data, config));\n }\n\n return objects;\n }\n }\n }\n\n})();\n\n","(function() {\n 'use strict';\n\n angular.module('angular-jsonapi')\n .config(function($logProvider) {\n $logProvider.debugEnabled(false);\n })\n .run(function(validateJS, $q) {\n validateJS.Promise = $q;\n });\n})();\n"],"sourceRoot":"/source/"} diff --git a/src/sources/rest/source-rest.factory.js b/src/sources/rest/source-rest.factory.js index 8be4fd0..a779b1c 100644 --- a/src/sources/rest/source-rest.factory.js +++ b/src/sources/rest/source-rest.factory.js @@ -87,7 +87,7 @@ } else if (schema.type === 'hasMany') { if (config.target === undefined) { $http({ - method: 'PUT', + method: 'PATCH', headers: headers, data: {data: []}, url: url + '/' + config.object.data.id + '/relationships/' + config.key @@ -114,7 +114,7 @@ deferred.reject({errors: [{status: 0, statusText: 'Can\'t link object without id through rest call'}]}); } else if (schema.type === 'hasOne') { $http({ - method: 'PUT', + method: 'PATCH', headers: headers, data: {data: AngularJsonAPIModelLinkerService.toLinkData(config.target)}, url: url + '/' + config.object.data.id + '/relationships/' + config.key @@ -133,7 +133,7 @@ function update(config) { return $http({ - method: 'PUT', + method: 'PATCH', headers: headers, url: url + '/' + config.object.data.id, data: config.object.form.toJson()