ngx-airbrush
Version:
Angular client for jsonapi/Graphiti backends
199 lines • 18.5 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 = {}) {
return (/**
* @param {?} target
* @param {?} propertyName
* @return {?}
*/
(target, propertyName) => {
/** @type {?} */
const setupMetadata = (/**
* @return {?}
*/
() => {
/** @type {?} */
const hasManys = Reflect.getMetadata(HasManyMetadata, target) || [];
hasManys.push({
propertyName,
backendName: options.backendName || propertyName,
readonly: !!options.readonly,
sidepostable: !!options.sidepostable,
});
Reflect.defineMetadata(HasManyMetadata, hasManys, target);
});
/** @type {?} */
const updateSideload = (/**
* @param {?} propClass
* @param {?} oldValues
* @param {?} newValues
* @return {?}
*/
(propClass, oldValues, newValues) => {
if (!newValues) {
return oldValues;
}
/** @type {?} */
const notConcerned = oldValues && oldValues.filter((/**
* @param {?} oldVal
* @return {?}
*/
oldVal => (newValues.findIndex((/**
* @param {?} newVal
* @return {?}
*/
newVal => oldVal.id === newVal.id)) === -1)));
/** @type {?} */
const result = notConcerned || [];
newValues.forEach((/**
* @param {?} newVal
* @return {?}
*/
newVal => {
// no ids: can't create a resource. This is a sideload!
if (!newVal.id) {
return;
}
/** @type {?} */
const found = oldValues && oldValues.find((/**
* @param {?} oldVal
* @return {?}
*/
oldVal => 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 {?} */
const updateSidepost = (/**
* @param {?} propClass
* @param {?} oldValues
* @param {?} newValues
* @return {?}
*/
(propClass, oldValues, newValues) => {
if (!newValues) {
return oldValues;
}
/** @type {?} */
const notConcerned = oldValues && oldValues.filter((/**
* @param {?} oldVal
* @return {?}
*/
oldVal => (newValues.findIndex((/**
* @param {?} newVal
* @return {?}
*/
newVal => oldVal.id === newVal.id)) === -1)));
/** @type {?} */
const result = notConcerned || [];
newValues.forEach((/**
* @param {?} newVal
* @return {?}
*/
newVal => {
/** @type {?} */
const newHaveId = !!(newVal && newVal.id);
/** @type {?} */
const newHaveVal = !!(newVal && Object.keys(newVal).filter((/**
* @param {?} key
* @return {?}
*/
key => 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 {?} */
const found = oldValues && oldValues.find((/**
* @param {?} oldVal
* @return {?}
*/
oldVal => 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 {?} */
const getter = (/**
* @return {?}
*/
function () {
if (!this[`_${propertyName}`] && !this.modelSerialization) {
this[`_${propertyName}`] = [];
}
return this[`_${propertyName}`];
});
/** @type {?} */
const setter = (/**
* @param {?} newVal
* @return {?}
*/
function (newVal) {
// const propClass = options.class();
/** @type {?} */
const propClass = TypesStore.find(options.class);
if (this.isModelInitialization()) {
this[`_${propertyName}`] = newVal.map((/**
* @param {?} elt
* @return {?}
*/
elt => ResourceBase.getAsRelationship(propClass, elt, { modelInit: true })));
}
else {
/** @type {?} */
const 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzLW1hbnkuZGVjb3JhdG9yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFpcmJydXNoLyIsInNvdXJjZXMiOlsibGliL2RlY29yYXRvcnMvaGFzLW1hbnkuZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBRzVDLE1BQU0sVUFBVSxPQUFPLENBQUMsVUFBd0MsRUFBRTtJQUM5RDs7Ozs7SUFBTyxDQUFDLE1BQVcsRUFBRSxZQUFvQixFQUFFLEVBQUU7O2NBRXJDLGFBQWE7OztRQUFHLEdBQUcsRUFBRTs7a0JBQ25CLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBRW5FLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osWUFBWTtnQkFDWixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxZQUFZO2dCQUNoRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRO2dCQUM1QixZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZO2FBQ3JDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUE7O2NBRUssY0FBYzs7Ozs7O1FBQUcsQ0FBQyxTQUFjLEVBQUUsU0FBZ0IsRUFBRSxTQUFnQixFQUFFLEVBQUU7WUFDNUUsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFBRSxPQUFPLFNBQVMsQ0FBQzthQUFFOztrQkFFL0IsWUFBWSxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTTs7OztZQUFDLE1BQU0sQ0FBQyxFQUFF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RUFBRSxHQUFHLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDO2FBQ3RIO2lCQUFNOztzQkFDQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUN0QixjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxjQUFjLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN0RTtRQUNILENBQUMsQ0FBQTtRQUVELElBQUksT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDL0IsYUFBYSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFO2dCQUMxQyxHQUFHLEVBQUUsTUFBTTtnQkFDWCxHQUFHLEVBQUUsTUFBTTtnQkFDWCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDLEVBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVsYXRpb25zaGlwRGVjb3JhdG9yT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9uLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgSGFzTWFueU1ldGFkYXRhIH0gZnJvbSAnLi9zeW1ib2xlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUJhc2UgfSBmcm9tICcuLi9yZXNvdXJjZS1iYXNlLm1vZGVsJztcbmltcG9ydCB7IFR5cGVzU3RvcmUgfSBmcm9tICcuLi90eXBlcy1zdG9yZSc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIEhhc01hbnkob3B0aW9uczogUmVsYXRpb25zaGlwRGVjb3JhdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpID0+IHtcblxuICAgICAgY29uc3Qgc2V0dXBNZXRhZGF0YSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzTWFueXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKEhhc01hbnlNZXRhZGF0YSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgICAgICBoYXNNYW55cy5wdXNoKHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgYmFja2VuZE5hbWU6IG9wdGlvbnMuYmFja2VuZE5hbWUgfHwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHJlYWRvbmx5OiAhIW9wdGlvbnMucmVhZG9ubHksXG4gICAgICAgICAgc2lkZXBvc3RhYmxlOiAhIW9wdGlvbnMuc2lkZXBvc3RhYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKEhhc01hbnlNZXRhZGF0YSwgaGFzTWFueXMsIHRhcmdldCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB1cGRhdGVTaWRlbG9hZCA9IChwcm9wQ2xhc3M6IGFueSwgb2xkVmFsdWVzOiBhbnlbXSwgbmV3VmFsdWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAoIW5ld1ZhbHVlcykgeyByZXR1cm4gb2xkVmFsdWVzOyB9XG5cbiAgICAgICAgY29uc3Qgbm90Q29uY2VybmVkID0gb2xkVmFsdWVzICYmIG9sZFZhbHVlcy5maWx0ZXIob2xkVmFsID0+IChuZXdWYWx1ZXMuZmluZEluZGV4KG5ld1ZhbCA9PiBvbGRWYWwuaWQgPT09IG5ld1ZhbC5pZCkgPT09IC0xKSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5vdENvbmNlcm5lZCB8fCBbXTtcbiAgICAgICAgbmV3VmFsdWVzLmZvckVhY2gobmV3VmFsID0+IHtcbiAgICAgICAgICAvLyBubyBpZHM6IGNhbid0IGNyZWF0ZSBhIHJlc291cmNlLiBUaGlzIGlzIGEgc2lkZWxvYWQhXG4gICAgICAgICAgaWYgKCFuZXdWYWwuaWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgY29uc3QgZm91bmQgPSBvbGRWYWx1ZXMgJiYgb2xkVmFsdWVzLmZpbmQob2xkVmFsID0+IG9sZFZhbC5pZCA9PT0gbmV3VmFsLmlkKTtcbiAgICAgICAgICAvLyBubyBvbGQgb3IgaWQgbm90IGZvdW5kOiBjcmVhdGUgbmV3IHJlbGF0aW9uc2hpcFxuICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFJlc291cmNlQmFzZS5nZXRBc1JlbGF0aW9uc2hpcDxhbnk+KHByb3BDbGFzcywgbmV3VmFsLCB7bWV0aG9kOiAndXBkYXRlJ30pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbWFyayBmb3IgZGlzYXNzb2NpYXRpb25cbiAgICAgICAgICBpZiAobmV3VmFsLmRlbGV0ZVJlbGF0aW9uKSB7IGZvdW5kLmRpc2Fzc29jaWF0ZSgpOyB9XG4gICAgICAgICAgLy8ga2VlcCBleGlzdGluZyByZWxhdGlvblxuICAgICAgICAgIHJlc3VsdC5wdXNoKGZvdW5kKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHVwZGF0ZVNpZGVwb3N0ID0gKHByb3BDbGFzczogYW55LCBvbGRWYWx1ZXM6IGFueVtdLCBuZXdWYWx1ZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICghbmV3VmFsdWVzKSB7IHJldHVybiBvbGRWYWx1ZXM7IH1cblxuICAgICAgICBjb25zdCBub3RDb25jZXJuZWQgPSBvbGRWYWx1ZXMgJiYgb2xkVmFsdWVzLmZpbHRlcihvbGRWYWwgPT4gKG5ld1ZhbHVlcy5maW5kSW5kZXgobmV3VmFsID0+IG9sZFZhbC5pZCA9PT0gbmV3VmFsLmlkKSA9PT0gLTEpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbm90Q29uY2VybmVkIHx8IFtdO1xuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaChuZXdWYWwgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0hhdmVJZCA9ICEhKG5ld1ZhbCAmJiBuZXdWYWwuaWQpO1xuICAgICAgICAgIGNvbnN0IG5ld0hhdmVWYWwgPSAhIShuZXdWYWwgJiYgT2JqZWN0LmtleXMobmV3VmFsKS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gJ2lkJyAmJiBrZXkgIT09ICd0eXBlJykubGVuZ3RoID4gMCk7XG5cbiAgICAgICAgICAvLyBuZXcgZG9uJ3QgaGF2ZSBpZCBhbmQgdmFsdWU6IGRvIG5vdGhpbmchXG4gICAgICAgICAgaWYgKCFuZXdIYXZlSWQgJiYgIW5ld0hhdmVWYWwpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgLy8gbmV3IGRvbid0IGhhdmUgaWQgYnV0IGhhdmUgdmFsdWU6IGNyZWF0ZSBuZXdcbiAgICAgICAgICBpZiAoIW5ld0hhdmVJZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWwsIHttZXRob2Q6ICdjcmVhdGUnfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBmb3VuZCA9IG9sZFZhbHVlcyAmJiBvbGRWYWx1ZXMuZmluZChvbGRWYWwgPT4gb2xkVmFsLmlkID09PSBuZXdWYWwuaWQpO1xuICAgICAgICAgIC8vIG5vIG9sZCBvciBpZCBub3QgZm91bmQ6IGNyZWF0ZSBuZXcgcmVsYXRpb25zaGlwXG4gICAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goUmVzb3VyY2VCYXNlLmdldEFzUmVsYXRpb25zaGlwPGFueT4ocHJvcENsYXNzLCBuZXdWYWwsIHttZXRob2Q6ICd1cGRhdGUnfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBtYXJrIGZvciBkaXNhc3NvY2lhdGlvblxuICAgICAgICAgIGlmIChuZXdWYWwuZGVsZXRlUmVsYXRpb24gfHwgbmV3VmFsLmRlc3Ryb3lSZWxhdGlvbikge1xuICAgICAgICAgICAgbmV3VmFsLmRlc3Ryb3lSZWxhdGlvbiA/IGZvdW5kLmRlc3Ryb3koKSA6IGZvdW5kLmRpc2Fzc29jaWF0ZSgpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZm91bmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBrZWVwIGV4aXN0aW5nIHJlbGF0aW9uXG4gICAgICAgICAgZm91bmQuYXNzaWduKG5ld1ZhbCk7XG4gICAgICAgICAgcmVzdWx0LnB1c2goZm91bmQpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZ2V0dGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdICYmICF0aGlzLm1vZGVsU2VyaWFsaXphdGlvbikgeyB0aGlzW2BfJHtwcm9wZXJ0eU5hbWV9YF0gPSBbXTsgfVxuICAgICAgICByZXR1cm4gdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2V0dGVyID0gZnVuY3Rpb24obmV3VmFsOiBhbnkpIHtcbiAgICAgICAgLy8gY29uc3QgcHJvcENsYXNzID0gb3B0aW9ucy5jbGFzcygpO1xuICAgICAgICBjb25zdCBwcm9wQ2xhc3MgPSBUeXBlc1N0b3JlLmZpbmQob3B0aW9ucy5jbGFzcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNNb2RlbEluaXRpYWxpemF0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzW2BfJHtwcm9wZXJ0eU5hbWV9YF0gPSBuZXdWYWwubWFwKGVsdCA9PiBSZXNvdXJjZUJhc2UuZ2V0QXNSZWxhdGlvbnNoaXA8YW55Pihwcm9wQ2xhc3MsIGVsdCwge21vZGVsSW5pdDogdHJ1ZX0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvbGRWYWwgPSB0aGlzW2BfJHtwcm9wZXJ0eU5hbWV9YF07XG4gICAgICAgICAgdGhpc1tgXyR7cHJvcGVydHlOYW1lfWBdID0gb3B0aW9ucy5zaWRlcG9zdGFibGUgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVNpZGVwb3N0KHByb3BDbGFzcywgb2xkVmFsLCBuZXdWYWwpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTaWRlbG9hZChwcm9wQ2xhc3MsIG9sZFZhbCwgbmV3VmFsKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKGRlbGV0ZSB0YXJnZXRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBzZXR1cE1ldGFkYXRhKCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5TmFtZSwge1xuICAgICAgICAgIGdldDogZ2V0dGVyLFxuICAgICAgICAgIHNldDogc2V0dGVyLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiJdfQ==