diff --git a/bower.json b/bower.json index d3630a7..ea048b7 100644 --- a/bower.json +++ b/bower.json @@ -17,6 +17,7 @@ "devDependencies": { "angular-recursion": "~1.0.5", "angular-ui-router": "~0.2.15", + "angular-mocks": "1.4.x", "faker": "https://github.com/Marak/faker.js.git#~2.1.2", "jquery": "~2.1.4", "json-formatter": "~0.2.7", diff --git a/dist/angular-jsonapi.js b/dist/angular-jsonapi.js index 1a13d1d..42c14b7 100644 --- a/dist/angular-jsonapi.js +++ b/dist/angular-jsonapi.js @@ -8,6 +8,7 @@ (function() { 'use strict'; + AngularJsonAPISourceRestWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPISourcePrototype", "AngularJsonAPIModelLinkerService", "toKebabCase", "$q", "$http"]; angular.module('angular-jsonapi-rest') .factory('AngularJsonAPISourceRest', AngularJsonAPISourceRestWrapper); @@ -235,19 +236,19 @@ return decodedParams; } } - AngularJsonAPISourceRestWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPISourcePrototype", "AngularJsonAPIModelLinkerService", "toKebabCase", "$q", "$http"]; })(); (function() { 'use strict'; + provide.$inject = ["$provide"]; + decorator.$inject = ["$delegate", "AngularJsonAPISourceRest"]; angular.module('angular-jsonapi-rest') .config(provide); function provide($provide) { $provide.decorator('$jsonapi', decorator); } - provide.$inject = ["$provide"]; function decorator($delegate, AngularJsonAPISourceRest) { var $jsonapi = $delegate; @@ -256,7 +257,6 @@ return $jsonapi; } - decorator.$inject = ["$delegate", "AngularJsonAPISourceRest"]; })(); (function() { @@ -270,6 +270,7 @@ (function() { 'use strict'; + AngularJsonAPISourceParseWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPISourcePrototype", "AngularJsonAPIModelLinkerService", "pluralize", "Parse", "$log", "$q"]; angular.module('angular-jsonapi-parse') .factory('AngularJsonAPISourceParse', AngularJsonAPISourceParseWrapper); @@ -403,19 +404,19 @@ Parse.initialize(appId, jsKey); } } - AngularJsonAPISourceParseWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPISourcePrototype", "AngularJsonAPIModelLinkerService", "pluralize", "Parse", "$log", "$q"]; })(); (function() { 'use strict'; + provide.$inject = ["$provide"]; + decorator.$inject = ["$delegate", "AngularJsonAPISourceParse"]; angular.module('angular-jsonapi-parse') .config(provide); function provide($provide) { $provide.decorator('$jsonapi', decorator); } - provide.$inject = ["$provide"]; function decorator($delegate, AngularJsonAPISourceParse) { var $jsonapi = $delegate; @@ -424,7 +425,6 @@ return $jsonapi; } - decorator.$inject = ["$delegate", "AngularJsonAPISourceParse"]; })(); (function() { @@ -437,6 +437,7 @@ (function() { 'use strict'; + AngularJsonAPISourceLocalWrapper.$inject = ["AngularJsonAPISourcePrototype", "$window", "$q"]; angular.module('angular-jsonapi-local') .factory('AngularJsonAPISourceLocal', AngularJsonAPISourceLocalWrapper); @@ -530,19 +531,19 @@ } } } - AngularJsonAPISourceLocalWrapper.$inject = ["AngularJsonAPISourcePrototype", "$window", "$q"]; })(); (function() { 'use strict'; + provide.$inject = ["$provide"]; + decorator.$inject = ["$delegate", "AngularJsonAPISourceLocal"]; angular.module('angular-jsonapi-local') .config(provide); function provide($provide) { $provide.decorator('$jsonapi', decorator); } - provide.$inject = ["$provide"]; function decorator($delegate, AngularJsonAPISourceLocal) { var $jsonapi = $delegate; @@ -551,7 +552,6 @@ return $jsonapi; } - decorator.$inject = ["$delegate", "AngularJsonAPISourceLocal"]; })(); (function() { @@ -566,6 +566,7 @@ (function() { 'use strict'; + AngularJsonAPIResourceCacheWrapper.$inject = ["uuid4", "$log"]; angular.module('angular-jsonapi') .factory('AngularJsonAPIResourceCache', AngularJsonAPIResourceCacheWrapper); @@ -814,12 +815,12 @@ delete _this.removed[id]; } } - AngularJsonAPIResourceCacheWrapper.$inject = ["uuid4", "$log"]; })(); (function() { 'use strict'; + AngularJsonAPIModelLinkerService.$inject = ["$log"]; angular.module('angular-jsonapi') .service('AngularJsonAPIModelLinkerService', AngularJsonAPIModelLinkerService); @@ -1187,12 +1188,12 @@ return array; } } - AngularJsonAPIModelLinkerService.$inject = ["$log"]; })(); (function() { 'use strict'; + AngularJsonAPIModelFormWrapper.$inject = ["AngularJsonAPIModelValidationError", "AngularJsonAPIModelLinkerService", "validateJS", "$q"]; angular.module('angular-jsonapi') .factory('AngularJsonAPIModelForm', AngularJsonAPIModelFormWrapper); @@ -1378,12 +1379,12 @@ return $q.resolve(AngularJsonAPIModelLinkerService.unlink(_this.parent, key, target, oneWay, true)); } } - AngularJsonAPIModelFormWrapper.$inject = ["AngularJsonAPIModelValidationError", "AngularJsonAPIModelLinkerService", "validateJS", "$q"]; })(); (function() { 'use strict'; + AngularJsonAPIAbstractModelWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPIModelValidationError", "AngularJsonAPIModelErrorsManager", "AngularJsonAPIModelLinkerService", "AngularJsonAPIModelForm", "$rootScope", "$injector", "$log", "$q"]; angular.module('angular-jsonapi') .factory('AngularJsonAPIAbstractModel', AngularJsonAPIAbstractModelWrapper); @@ -1617,7 +1618,7 @@ } }); - deferred.resolve(response.data.meta); + deferred.resolve(_this); } } @@ -2109,7 +2110,6 @@ } } } - AngularJsonAPIAbstractModelWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPIModelValidationError", "AngularJsonAPIModelErrorsManager", "AngularJsonAPIModelLinkerService", "AngularJsonAPIModelForm", "$rootScope", "$injector", "$log", "$q"]; ///////////// // Private // @@ -2336,13 +2336,14 @@ (function() { 'use strict'; + provide.$inject = ["$provide"]; + decorator.$inject = ["$delegate"]; angular.module('angular-jsonapi') .config(provide); function provide($provide) { $provide.decorator('$q', decorator); } - provide.$inject = ["$provide"]; function decorator($delegate) { var $q = $delegate; @@ -2386,12 +2387,12 @@ return $q; } - decorator.$inject = ["$delegate"]; })(); (function() { 'use strict'; + AngularJsonAPISynchronizerSimpleWrapper.$inject = ["AngularJsonAPISynchronizerPrototype", "$q", "$log"]; angular.module('angular-jsonapi') .factory('AngularJsonAPISynchronizerSimple', AngularJsonAPISynchronizerSimpleWrapper); @@ -2512,12 +2513,12 @@ return deferred.promise; } } - AngularJsonAPISynchronizerSimpleWrapper.$inject = ["AngularJsonAPISynchronizerPrototype", "$q", "$log"]; })(); (function() { 'use strict'; + AngularJsonAPISynchronizerPrototypeWrapper.$inject = ["$log"]; angular.module('angular-jsonapi') .factory('AngularJsonAPISynchronizerPrototype', AngularJsonAPISynchronizerPrototypeWrapper); @@ -2543,7 +2544,6 @@ } } } - AngularJsonAPISynchronizerPrototypeWrapper.$inject = ["$log"]; })(); (function() { @@ -2639,6 +2639,7 @@ (function() { 'use strict'; + AngularJsonAPISchemaWrapper.$inject = ["$log", "pluralize", "uuid4", "AngularJsonAPISchemaLink"]; angular.module('angular-jsonapi') .factory('AngularJsonAPISchema', AngularJsonAPISchemaWrapper); @@ -2710,12 +2711,12 @@ } } - AngularJsonAPISchemaWrapper.$inject = ["$log", "pluralize", "uuid4", "AngularJsonAPISchemaLink"]; })(); (function() { 'use strict'; + AngularJsonAPILinkSchrapperLink.$inject = ["$log", "pluralize"]; angular.module('angular-jsonapi') .factory('AngularJsonAPISchemaLink', AngularJsonAPILinkSchrapperLink); @@ -2761,12 +2762,12 @@ } } - AngularJsonAPILinkSchrapperLink.$inject = ["$log", "pluralize"]; })(); (function() { 'use strict'; + AngularJsonAPIResourceWrapper.$inject = ["AngularJsonAPIModel", "AngularJsonAPISchema", "AngularJsonAPIResourceCache", "AngularJsonAPICollection", "$rootScope", "$log", "$q"]; angular.module('angular-jsonapi') .factory('AngularJsonAPIResource', AngularJsonAPIResourceWrapper); @@ -2973,12 +2974,12 @@ } } } - AngularJsonAPIResourceWrapper.$inject = ["AngularJsonAPIModel", "AngularJsonAPISchema", "AngularJsonAPIResourceCache", "AngularJsonAPICollection", "$rootScope", "$log", "$q"]; })(); (function() { 'use strict'; + AngularJsonAPIModel.$inject = ["AngularJsonAPIAbstractModel", "AngularJsonAPISchema", "namedFunction", "pluralize", "$log"]; angular.module('angular-jsonapi') .factory('AngularJsonAPIModel', AngularJsonAPIModel); @@ -3029,12 +3030,12 @@ } } } - AngularJsonAPIModel.$inject = ["AngularJsonAPIAbstractModel", "AngularJsonAPISchema", "namedFunction", "pluralize", "$log"]; })(); (function() { 'use strict'; + AngularJsonAPICollectionWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPIModelErrorsManager", "$rootScope", "$injector", "$q"]; angular.module('angular-jsonapi') .factory('AngularJsonAPICollection', AngularJsonAPICollectionWrapper); @@ -3230,7 +3231,6 @@ } } } - AngularJsonAPICollectionWrapper.$inject = ["AngularJsonAPIModelSourceError", "AngularJsonAPIModelErrorsManager", "$rootScope", "$injector", "$q"]; function __incrementLoadingCounter(object) { object = object === undefined ? this : object; @@ -3248,10 +3248,12 @@ (function() { 'use strict'; + jsonapiProvider.$inject = ["validateJS"]; angular.module('angular-jsonapi') .provider('$jsonapi', jsonapiProvider); function jsonapiProvider(validateJS) { + jsonapiFactory.$inject = ["$log", "AngularJsonAPIResource", "AngularJsonAPISynchronizerSimple"]; var memory = {}; var names = []; this.$get = jsonapiFactory; @@ -3343,9 +3345,7 @@ return objects; } } - jsonapiFactory.$inject = ["$log", "AngularJsonAPIResource", "AngularJsonAPISynchronizerSimple"]; } - jsonapiProvider.$inject = ["validateJS"]; })(); diff --git a/dist/angular-jsonapi.js.map b/dist/angular-jsonapi.js.map index c77493c..7f1bb36 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":"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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(_this);\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 diff --git a/dist/angular-jsonapi.min.js b/dist/angular-jsonapi.min.js index 70ba468..72bad66 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, -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}])}(); +!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}}e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","toKebabCase","$q","$http"],angular.module("angular-jsonapi-rest").factory("AngularJsonAPISourceRest",e)}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceRest=n,t}e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceRest"],angular.module("angular-jsonapi-rest").config(e)}(),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}}e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPISourcePrototype","AngularJsonAPIModelLinkerService","pluralize","Parse","$log","$q"],angular.module("angular-jsonapi-parse").factory("AngularJsonAPISourceParse",e)}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceParse"],angular.module("angular-jsonapi-parse").config(e)}(),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}}e.$inject=["AngularJsonAPISourcePrototype","$window","$q"],angular.module("angular-jsonapi-local").factory("AngularJsonAPISourceLocal",e)}(),function(){"use strict";function e(e){e.decorator("$jsonapi",n)}function n(e,n){var t=e;return t.sourceLocal=n,t}e.$inject=["$provide"],n.$inject=["$delegate","AngularJsonAPISourceLocal"],angular.module("angular-jsonapi-local").config(e)}(),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}}e.$inject=["uuid4","$log"],angular.module("angular-jsonapi").factory("AngularJsonAPIResourceCache",e)}(),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}e.$inject=["$log"],angular.module("angular-jsonapi").service("AngularJsonAPIModelLinkerService",e)}(),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}}e.$inject=["AngularJsonAPIModelValidationError","AngularJsonAPIModelLinkerService","validateJS","$q"],angular.module("angular-jsonapi").factory("AngularJsonAPIModelForm",e)}(),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(e){angular.forEach(e,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(d)}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}e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelValidationError","AngularJsonAPIModelErrorsManager","AngularJsonAPIModelLinkerService","AngularJsonAPIModelForm","$rootScope","$injector","$log","$q"],angular.module("angular-jsonapi").factory("AngularJsonAPIAbstractModel",e)}(),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}e.$inject=["$provide"],n.$inject=["$delegate"],angular.module("angular-jsonapi").config(e)}(),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}}e.$inject=["AngularJsonAPISynchronizerPrototype","$q","$log"],angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerSimple",e)}(),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}e.$inject=["$log"],angular.module("angular-jsonapi").factory("AngularJsonAPISynchronizerPrototype",e)}(),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}}e.$inject=["$log","pluralize","uuid4","AngularJsonAPISchemaLink"],angular.module("angular-jsonapi").factory("AngularJsonAPISchema",e)}(),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}}e.$inject=["$log","pluralize"],angular.module("angular-jsonapi").factory("AngularJsonAPISchemaLink",e)}(),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}}e.$inject=["AngularJsonAPIModel","AngularJsonAPISchema","AngularJsonAPIResourceCache","AngularJsonAPICollection","$rootScope","$log","$q"],angular.module("angular-jsonapi").factory("AngularJsonAPIResource",e)}(),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}}e.$inject=["AngularJsonAPIAbstractModel","AngularJsonAPISchema","namedFunction","pluralize","$log"],angular.module("angular-jsonapi").factory("AngularJsonAPIModel",e)}(),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}e.$inject=["AngularJsonAPIModelSourceError","AngularJsonAPIModelErrorsManager","$rootScope","$injector","$q"],angular.module("angular-jsonapi").factory("AngularJsonAPICollection",e)}(),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}}n.$inject=["$log","AngularJsonAPIResource","AngularJsonAPISynchronizerSimple"];var t={},r=[];this.$get=n}e.$inject=["validateJS"],angular.module("angular-jsonapi").provider("$jsonapi",e)}(),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 diff --git a/dist/angular-jsonapi.min.js.map b/dist/angular-jsonapi.min.js.map index 0ffc21b..7f61610 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","$inject","factory","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","!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,\ne.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}])}();\n//# sourceMappingURL=angular-jsonapi.min.js.map","(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(_this);\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 diff --git a/package.json b/package.json index 86cc17c..9b45d0e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "chalk": "~1.1.1", "del": "~2.0.1", "eslint-plugin-angular": "~0.11.0", - "gulp": "~3.9.0", + "gulp": "^3.9.1", "gulp-angular-filesort": "~1.1.1", "gulp-angular-templatecache": "~1.7.0", "gulp-autoprefixer": "~3.0.1", diff --git a/src/model/abstract-model/abstract-model.js b/src/model/abstract-model/abstract-model.js index 3df02cf..af6b8b2 100644 --- a/src/model/abstract-model/abstract-model.js +++ b/src/model/abstract-model/abstract-model.js @@ -234,7 +234,7 @@ } }); - deferred.resolve(response.data.meta); + deferred.resolve(_this); } }