ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
200 lines • 18.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { HasManyMetadata } from './symboles';
import { ResourceBase } from '../resource-base.model';
import { TypesStore } from '../types-store';
/**
* @param {?=} options
* @return {?}
*/
export function HasMany(options) {
if (options === void 0) { options = {}; }
return (/**
* @param {?} target
* @param {?} propertyName
* @return {?}
*/
function (target, propertyName) {
/** @type {?} */
var setupMetadata = (/**
* @return {?}
*/
function () {
/** @type {?} */
var hasManys = Reflect.getMetadata(HasManyMetadata, target) || [];
hasManys.push({
propertyName: propertyName,
backendName: options.backendName || propertyName,
readonly: !!options.readonly,
sidepostable: !!options.sidepostable,
});
Reflect.defineMetadata(HasManyMetadata, hasManys, target);
});
/** @type {?} */
var updateSideload = (/**
* @param {?} propClass
* @param {?} oldValues
* @param {?} newValues
* @return {?}
*/
function (propClass, oldValues, newValues) {
if (!newValues) {
return oldValues;
}
/** @type {?} */
var notConcerned = oldValues && oldValues.filter((/**
* @param {?} oldVal
* @return {?}
*/
function (oldVal) { return (newValues.findIndex((/**
* @param {?} newVal
* @return {?}
*/
function (newVal) { return oldVal.id === newVal.id; })) === -1); }));
/** @type {?} */
var result = notConcerned || [];
newValues.forEach((/**
* @param {?} newVal
* @return {?}
*/
function (newVal) {
// no ids: can't create a resource. This is a sideload!
if (!newVal.id) {
return;
}
/** @type {?} */
var found = oldValues && oldValues.find((/**
* @param {?} oldVal
* @return {?}
*/
function (oldVal) { return oldVal.id === newVal.id; }));
// no old or id not found: create new relationship
if (!found) {
result.push(ResourceBase.getAsRelationship(propClass, newVal, { method: 'update' }));
return;
}
// mark for disassociation
if (newVal.deleteRelation) {
found.disassociate();
}
// keep existing relation
result.push(found);
}));
return result;
});
/** @type {?} */
var updateSidepost = (/**
* @param {?} propClass
* @param {?} oldValues
* @param {?} newValues
* @return {?}
*/
function (propClass, oldValues, newValues) {
if (!newValues) {
return oldValues;
}
/** @type {?} */
var notConcerned = oldValues && oldValues.filter((/**
* @param {?} oldVal
* @return {?}
*/
function (oldVal) { return (newValues.findIndex((/**
* @param {?} newVal
* @return {?}
*/
function (newVal) { return oldVal.id === newVal.id; })) === -1); }));
/** @type {?} */
var result = notConcerned || [];
newValues.forEach((/**
* @param {?} newVal
* @return {?}
*/
function (newVal) {
/** @type {?} */
var newHaveId = !!(newVal && newVal.id);
/** @type {?} */
var newHaveVal = !!(newVal && Object.keys(newVal).filter((/**
* @param {?} key
* @return {?}
*/
function (key) { return key !== 'id' && key !== 'type'; })).length > 0);
// new don't have id and value: do nothing!
if (!newHaveId && !newHaveVal) {
return;
}
// new don't have id but have value: create new
if (!newHaveId) {
result.push(ResourceBase.getAsRelationship(propClass, newVal, { method: 'create' }));
return;
}
/** @type {?} */
var found = oldValues && oldValues.find((/**
* @param {?} oldVal
* @return {?}
*/
function (oldVal) { return oldVal.id === newVal.id; }));
// no old or id not found: create new relationship
if (!found) {
result.push(ResourceBase.getAsRelationship(propClass, newVal, { method: 'update' }));
return;
}
// mark for disassociation
if (newVal.deleteRelation || newVal.destroyRelation) {
newVal.destroyRelation ? found.destroy() : found.disassociate();
result.push(found);
return;
}
// keep existing relation
found.assign(newVal);
result.push(found);
}));
return result;
});
/** @type {?} */
var getter = (/**
* @return {?}
*/
function () {
if (!this["_" + propertyName] && !this.modelSerialization) {
this["_" + propertyName] = [];
}
return this["_" + propertyName];
});
/** @type {?} */
var setter = (/**
* @param {?} newVal
* @return {?}
*/
function (newVal) {
// const propClass = options.class();
/** @type {?} */
var propClass = TypesStore.find(options.class);
if (this.isModelInitialization()) {
this["_" + propertyName] = newVal.map((/**
* @param {?} elt
* @return {?}
*/
function (elt) { return ResourceBase.getAsRelationship(propClass, elt, { modelInit: true }); }));
}
else {
/** @type {?} */
var oldVal = this["_" + propertyName];
this["_" + propertyName] = options.sidepostable ?
updateSidepost(propClass, oldVal, newVal) :
updateSideload(propClass, oldVal, newVal);
}
});
if (delete target[propertyName]) {
setupMetadata();
Object.defineProperty(target, propertyName, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLW1hbnkuZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFpcmJydXNoLyIsInNvdXJjZXMiOlsibGliL2RlY29yYXRvcnMvaGFzLW1hbnkuZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRzVDLE1BQU0sVUFBVSxPQUFPLENBQUMsT0FBMEM7SUFBMUMsd0JBQUEsRUFBQSxZQUEwQztJQUM5RDs7Ozs7SUFBTyxVQUFDLE1BQVcsRUFBRSxZQUFvQjs7WUFFakMsYUFBYTs7O1FBQUc7O2dCQUNkLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBRW5FLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osWUFBWSxjQUFBO2dCQUNaLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLFlBQVk7Z0JBQ2hELFFBQVEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVE7Z0JBQzVCLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVk7YUFDckMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQTs7WUFFSyxjQUFjOzs7Ozs7UUFBRyxVQUFDLFNBQWMsRUFBRSxTQUFnQixFQUFFLFNBQWdCO1lBQ3hFLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQUUsT0FBTyxTQUFTLENBQUM7YUFBRTs7Z0JBRS9CLFlBQVksR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU07Ozs7WUFBQyxVQUFBLE1BQU0sSUFBSSxPQUFBLENB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QUFJLE9BQUEsWUFBWSxDQUFDLGlCQUFpQixDQUFNLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsRUFBdEUsQ0FBc0UsRUFBQyxDQUFDO2FBQ3RIO2lCQUFNOztvQkFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQUksWUFBYyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsTUFBSSxZQUFjLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RCLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ3RFO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMvQixhQUFhLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUU7Z0JBQzFDLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEdBQUcsRUFBRSxNQUFNO2dCQUNYLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsRUFBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWxhdGlvbnNoaXBEZWNvcmF0b3JPcHRpb25zIH0gZnJvbSAnLi9vcHRpb24uaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBIYXNNYW55TWV0YWRhdGEgfSBmcm9tICcuL3N5bWJvbGVzJztcbmltcG9ydCB7IFJlc291cmNlQmFzZSB9IGZyb20gJy4uL3Jlc291cmNlLWJhc2UubW9kZWwnO1xuaW1wb3J0IHsgVHlwZXNTdG9yZSB9IGZyb20gJy4uL3R5cGVzLXN0b3JlJztcblxuXG5leHBvcnQgZnVuY3Rpb24gSGFzTWFueShvcHRpb25zOiBSZWxhdGlvbnNoaXBEZWNvcmF0b3JPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZykgPT4ge1xuXG4gICAgICBjb25zdCBzZXR1cE1ldGFkYXRhID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNNYW55cyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoSGFzTWFueU1ldGFkYXRhLCB0YXJnZXQpIHx8IFtdO1xuXG4gICAgICAgIGhhc01hbnlzLnB1c2goe1xuICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICBiYWNrZW5kTmFtZTogb3B0aW9ucy5iYWNrZW5kTmFtZSB8fCBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgcmVhZG9ubHk6ICEhb3B0aW9ucy5yZWFkb25seSxcbiAgICAgICAgICBzaWRlcG9zdGFibGU6ICEhb3B0aW9ucy5zaWRlcG9zdGFibGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoSGFzTWFueU1ldGFkYXRhLCBoYXNNYW55cywgdGFyZ2V0KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVNpZGVsb2FkID0gKHByb3BDbGFzczogYW55LCBvbGRWYWx1ZXM6IGFueVtdLCBuZXdWYWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICghbmV3VmFsdWVzKSB7IHJldHVybiBvbGRWYWx1ZXM7IH1cblxuICAgICAgICBjb25zdCBub3RDb25jZXJuZWQgPSBvbGRWYWx1ZXMgJiYgb2xkVmFsdWVzLmZpbHRlcihvbGRWYWwgPT4gKG5ld1ZhbHVlcy5maW5kSW5kZXgobmV3VmFsID0+IG9sZFZhbC5pZCA9PT0gbmV3VmFsLmlkKSA9PT0gLTEpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbm90Q29uY2VybmVkIHx8IFtdO1xuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaChuZXdWYWwgPT4ge1xuICAgICAgICAgIC8vIG5vIGlkczogY2FuJ3QgY3JlYXRlIGEgcmVzb3VyY2UuIFRoaXMgaXMgYSBzaWRlbG9hZCFcbiAgICAgICAgICBpZiAoIW5ld1ZhbC5pZCkgeyByZXR1cm47IH1cbiAgICAgICAgICBjb25zdCBmb3VuZCA9IG9sZFZhbHVlcyAmJiBvbGRWYWx1ZXMuZmluZChvbGRWYWwgPT4gb2xkVmFsLmlkID09PSBuZXdWYWwuaWQpO1xuICAgICAgICAgIC8vIG5vIG9sZCBvciBpZCBub3QgZm91bmQ6IGNyZWF0ZSBuZXcgcmVsYXRpb25zaGlwXG4gICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWwsIHttZXRob2Q6ICd1cGRhdGUnfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBtYXJrIGZvciBkaXNhc3NvY2lhdGlvblxuICAgICAgICAgIGlmIChuZXdWYWwuZGVsZXRlUmVsYXRpb24pIHsgZm91bmQuZGlzYXNzb2NpYXRlKCk7IH1cbiAgICAgICAgICAvLyBrZWVwIGV4aXN0aW5nIHJlbGF0aW9uXG4gICAgICAgICAgcmVzdWx0LnB1c2goZm91bmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdXBkYXRlU2lkZXBvc3QgPSAocHJvcENsYXNzOiBhbnksIG9sZFZhbHVlczogYW55W10sIG5ld1ZhbHVlczogYW55W10pID0+IHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZXMpIHsgcmV0dXJuIG9sZFZhbHVlczsgfVxuXG4gICAgICAgIGNvbnN0IG5vdENvbmNlcm5lZCA9IG9sZFZhbHVlcyAmJiBvbGRWYWx1ZXMuZmlsdGVyKG9sZFZhbCA9PiAobmV3VmFsdWVzLmZpbmRJbmRleChuZXdWYWwgPT4gb2xkVmFsLmlkID09PSBuZXdWYWwuaWQpID09PSAtMSkpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBub3RDb25jZXJuZWQgfHwgW107XG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKG5ld1ZhbCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3SGF2ZUlkID0gISEobmV3VmFsICYmIG5ld1ZhbC5pZCk7XG4gICAgICAgICAgY29uc3QgbmV3SGF2ZVZhbCA9ICEhKG5ld1ZhbCAmJiBPYmplY3Qua2V5cyhuZXdWYWwpLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAnaWQnICYmIGtleSAhPT0gJ3R5cGUnKS5sZW5ndGggPiAwKTtcblxuICAgICAgICAgIC8vIG5ldyBkb24ndCBoYXZlIGlkIGFuZCB2YWx1ZTogZG8gbm90aGluZyFcbiAgICAgICAgICBpZiAoIW5ld0hhdmVJZCAmJiAhbmV3SGF2ZVZhbCkgeyByZXR1cm47IH1cbiAgICAgICAgICAvLyBuZXcgZG9uJ3QgaGF2ZSBpZCBidXQgaGF2ZSB2YWx1ZTogY3JlYXRlIG5ld1xuICAgICAgICAgIGlmICghbmV3SGF2ZUlkKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIG5ld1ZhbCwge21ldGhvZDogJ2NyZWF0ZSd9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZvdW5kID0gb2xkVmFsdWVzICYmIG9sZFZhbHVlcy5maW5kKG9sZFZhbCA9PiBvbGRWYWwuaWQgPT09IG5ld1ZhbC5pZCk7XG4gICAgICAgICAgLy8gbm8gb2xkIG9yIGlkIG5vdCBmb3VuZDogY3JlYXRlIG5ldyByZWxhdGlvbnNoaXBcbiAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIG5ld1ZhbCwge21ldGhvZDogJ3VwZGF0ZSd9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG1hcmsgZm9yIGRpc2Fzc29jaWF0aW9uXG4gICAgICAgICAgaWYgKG5ld1ZhbC5kZWxldGVSZWxhdGlvbiB8fCBuZXdWYWwuZGVzdHJveVJlbGF0aW9uKSB7XG4gICAgICAgICAgICBuZXdWYWwuZGVzdHJveVJlbGF0aW9uID8gZm91bmQuZGVzdHJveSgpIDogZm91bmQuZGlzYXNzb2NpYXRlKCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChmb3VuZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGtlZXAgZXhpc3RpbmcgcmVsYXRpb25cbiAgICAgICAgICBmb3VuZC5hc3NpZ24obmV3VmFsKTtcbiAgICAgICAgICByZXN1bHQucHVzaChmb3VuZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBnZXR0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzW2BfJHtwcm9wZXJ0eU5hbWV9YF0gJiYgIXRoaXMubW9kZWxTZXJpYWxpemF0aW9uKSB7IHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IFtdOyB9XG4gICAgICAgIHJldHVybiB0aGlzW2BfJHtwcm9wZXJ0eU5hbWV9YF07XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzZXR0ZXIgPSBmdW5jdGlvbihuZXdWYWw6IGFueSkge1xuICAgICAgICAvLyBjb25zdCBwcm9wQ2xhc3MgPSBvcHRpb25zLmNsYXNzKCk7XG4gICAgICAgIGNvbnN0IHByb3BDbGFzcyA9IFR5cGVzU3RvcmUuZmluZChvcHRpb25zLmNsYXNzKTtcblxuICAgICAgICBpZiAodGhpcy5pc01vZGVsSW5pdGlhbGl6YXRpb24oKSkge1xuICAgICAgICAgIHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXSA9IG5ld1ZhbC5tYXAoZWx0ID0+IFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywgZWx0LCB7bW9kZWxJbml0OiB0cnVlfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbCA9IHRoaXNbYF8ke3Byb3BlcnR5TmFtZX1gXTtcbiAgICAgICAgICB0aGlzW2BfJHtwcm9wZXJ0eU5hbWV9YF0gPSBvcHRpb25zLnNpZGVwb3N0YWJsZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2lkZXBvc3QocHJvcENsYXNzLCBvbGRWYWwsIG5ld1ZhbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNpZGVsb2FkKHByb3BDbGFzcywgb2xkVmFsLCBuZXdWYWwpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoZGVsZXRlIHRhcmdldFtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIHNldHVwTWV0YWRhdGEoKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlOYW1lLCB7XG4gICAgICAgICAgZ2V0OiBnZXR0ZXIsXG4gICAgICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuIl19