UNPKG

ngx-airbrush

Version:

Angular client for jsonapi/Graphiti backends

257 lines 20.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { AttributeMetadata } from './decorators/symboles'; import { ResourceMetadataWrapper } from './resource-metadata.wrapper'; import { JsonapiConverter } from './converters/jsonapi.converter'; var ResourceSerializer = /** @class */ (function () { function ResourceSerializer(model) { this.model = model; this.mdwrapper = new ResourceMetadataWrapper(model); } /** * @return {?} */ ResourceSerializer.prototype.toJsonapi = /** * @return {?} */ function () { /** @type {?} */ var result = this.serialize(); /** @type {?} */ var includeKeys = this.mdwrapper.getIncludedKeys(); /** @type {?} */ var body = new JsonapiConverter().serialize(result, includeKeys); return body; }; /** * @return {?} */ ResourceSerializer.prototype.serialize = /** * @return {?} */ function () { /** @type {?} */ var type = this.model.type; var _a = tslib_1.__read(this.serializeAll(), 3), attributes = _a[0], belongstos = _a[1], hasManys = _a[2]; /** @type {?} */ var relationshipNames = []; relationshipNames.push.apply(relationshipNames, tslib_1.__spread(Object.keys(belongstos).filter((/** * @param {?} key * @return {?} */ function (key) { return belongstos.hasOwnProperty(key); })))); relationshipNames.push.apply(relationshipNames, tslib_1.__spread(Object.keys(hasManys).filter((/** * @param {?} key * @return {?} */ function (key) { return hasManys.hasOwnProperty(key); })))); /** @type {?} */ var result = tslib_1.__assign({ id: this.model.id, type: type }, attributes, belongstos, hasManys, { relationshipNames: relationshipNames }); if (this.model.isRelation) { result.__method = this.model.relationMethod; } return result; }; /** * @return {?} */ ResourceSerializer.prototype.toHash = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var res = { id: this.model.id, type: this.model.type }; this.mdwrapper.attributesKeys({ defined: true }).forEach((/** * @param {?} key * @return {?} */ function (key) { return res[key] = _this.model[key]; })); this.mdwrapper.belongsToKeys({ defined: true }).forEach((/** * @param {?} key * @return {?} */ function (key) { return res[key] = _this.model[key].toHash(); })); this.mdwrapper.hasManyKeys({ defined: true }).forEach((/** * @param {?} key * @return {?} */ function (key) { _this.model[key].forEach((/** * @param {?} elt * @return {?} */ function (elt) { res[key] = res[key] || []; // no need to init res[key] if array has no elements. res[key].push(elt.toHash()); })); })); return res; }; /** * @private * @return {?} */ ResourceSerializer.prototype.serializeAll = /** * @private * @return {?} */ function () { /** @type {?} */ var attributes = this.serializeAttributes(); /** @type {?} */ var belongstos = this.serializeBelongsTo(); /** @type {?} */ var hasManys = this.serializeHasMany(); return [attributes, belongstos, hasManys]; }; /** * @private * @return {?} */ ResourceSerializer.prototype.serializeAttributes = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var keys = this.mdwrapper.attributesKeys({ defined: true }); keys = keys.filter((/** * @param {?} key * @return {?} */ function (key) { return _this.mdwrapper.isWritable(key); })); /** @type {?} */ var attributes = this.model[AttributeMetadata]; keys = this.model.id ? keys.filter((/** * @param {?} key * @return {?} */ function (key) { return attributes[key].hasDirtyAttributes; })) : keys; /** @type {?} */ var result = {}; keys.forEach((/** * @param {?} key * @return {?} */ function (key) { /** @type {?} */ var beKey = _this.mdwrapper.backendPropName(key); result[beKey] = attributes[key].serializedValue; })); return result; }; /** * @private * @return {?} */ ResourceSerializer.prototype.serializeBelongsTo = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var keys = this.mdwrapper.belongsToKeys({ defined: true }); keys = keys.filter((/** * @param {?} key * @return {?} */ function (key) { return _this.mdwrapper.isWritable(key); })); // Ignore untouched relationships keys = keys.filter((/** * @param {?} key * @return {?} */ function (key) { return _this.model[key].hasBeenTouched; })); /** @type {?} */ var belongstos = {}; keys.forEach((/** * @param {?} key * @return {?} */ function (key) { /** @type {?} */ var sidepostable = _this.mdwrapper.isSidepostable(key); /** @type {?} */ var beKey = _this.mdwrapper.backendPropName(key); belongstos[beKey] = sidepostable ? _this.model[key].serialize() : _this.model[key].sideload(); if (!belongstos[beKey]) { delete belongstos[beKey]; } })); return belongstos; }; /** * @private * @return {?} */ ResourceSerializer.prototype.serializeHasMany = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var keys = this.mdwrapper.hasManyKeys({ defined: true }); keys = keys.filter((/** * @param {?} key * @return {?} */ function (key) { return _this.mdwrapper.isWritable(key); })); /** @type {?} */ var hasManys = {}; keys.forEach((/** * @param {?} key * @return {?} */ function (key) { /** @type {?} */ var sidepostable = _this.mdwrapper.isSidepostable(key); /** @type {?} */ var beKey = _this.mdwrapper.backendPropName(key); hasManys[beKey] = sidepostable ? _this.model[key].filter((/** * @param {?} elt * @return {?} */ function (elt) { return elt.hasBeenTouched; })).map((/** * @param {?} elt * @return {?} */ function (elt) { return elt.serialize(); })) : _this.model[key].filter((/** * @param {?} elt * @return {?} */ function (elt) { return elt.hasBeenTouched; })).map((/** * @param {?} elt * @return {?} */ function (elt) { return elt.sideload(); })); if (hasManys[beKey].length === 0) { delete hasManys[beKey]; } })); return hasManys; }; return ResourceSerializer; }()); export { ResourceSerializer }; if (false) { /** * @type {?} * @private */ ResourceSerializer.prototype.mdwrapper; /** * @type {?} * @private */ ResourceSerializer.prototype.model; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2Uuc2VyaWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1haXJicnVzaC8iLCJzb3VyY2VzIjpbImxpYi9yZXNvdXJjZS5zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHbEU7SUFHRSw0QkFBb0IsS0FBbUI7UUFBbkIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7OztJQUVNLHNDQUFTOzs7SUFBaEI7O1lBQ1EsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUU7O1lBQ3pCLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRTs7WUFFOUMsSUFBSSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztRQUNsRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7SUFFTSxzQ0FBUzs7O0lBQWhCOztZQUNRLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7UUFFdEIsSUFBQSwyQ0FBd0QsRUFBdkQsa0JBQVUsRUFBRSxrQkFBVSxFQUFFLGdCQUErQjs7WUFDeEQsaUJBQWlCLEdBQUcsRUFBRTtRQUM1QixpQkFBaUIsQ0FBQyxJQUFJLE9BQXRCLGlCQUFpQixtQkFBUyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU07Ozs7UUFBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQTlCLENBQThCLEVB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QWtCLEVBQUMsQ0FBQyxHQUFHOzs7O2dCQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFmLENBQWUsRUFBQyxDQUFDLENBQUM7Z0JBQy9FLEtBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTTs7OztnQkFBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxjQUFjLEVBQWxCLENBQWtCLEVBQUMsQ0FBQyxHQUFHOzs7O2dCQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFkLENBQWMsRUFBQyxDQUFDO1lBQy9GLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQUUsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7YUFBRTtRQUMvRCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDSCx5QkFBQztBQUFELENBQUMsQUFyR0QsSUFxR0M7Ozs7Ozs7SUFwR0MsdUNBQTJDOzs7OztJQUUvQixtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBKc29uYXBpUmVzb3VyY2VSZXF1ZXN0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2pzb25hcGkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlc291cmNlQmFzZSB9IGZyb20gJy4vcmVzb3VyY2UtYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVNZXRhZGF0YSB9IGZyb20gJy4vZGVjb3JhdG9ycy9zeW1ib2xlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZU1ldGFkYXRhV3JhcHBlciB9IGZyb20gJy4vcmVzb3VyY2UtbWV0YWRhdGEud3JhcHBlcic7XG5pbXBvcnQgeyBKc29uYXBpQ29udmVydGVyIH0gZnJvbSAnLi9jb252ZXJ0ZXJzL2pzb25hcGkuY29udmVydGVyJztcblxuXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VTZXJpYWxpemVyIHtcbiAgcHJpdmF0ZSBtZHdyYXBwZXI6IFJlc291cmNlTWV0YWRhdGFXcmFwcGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kZWw6IFJlc291cmNlQmFzZSkge1xuICAgIHRoaXMubWR3cmFwcGVyID0gbmV3IFJlc291cmNlTWV0YWRhdGFXcmFwcGVyKG1vZGVsKTtcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb25hcGkoKTogSnNvbmFwaVJlc291cmNlUmVxdWVzdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemUoKTtcbiAgICBjb25zdCBpbmNsdWRlS2V5cyA9IHRoaXMubWR3cmFwcGVyLmdldEluY2x1ZGVkS2V5cygpO1xuXG4gICAgY29uc3QgYm9keSA9IG5ldyBKc29uYXBpQ29udmVydGVyKCkuc2VyaWFsaXplKHJlc3VsdCwgaW5jbHVkZUtleXMpO1xuICAgIHJldHVybiBib2R5O1xuICB9XG5cbiAgcHVibGljIHNlcmlhbGl6ZSgpIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5tb2RlbC50eXBlO1xuXG4gICAgY29uc3QgW2F0dHJpYnV0ZXMsIGJlbG9uZ3N0b3MsIGhhc01hbnlzXSA9IHRoaXMuc2VyaWFsaXplQWxsKCk7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZXMgPSBbXTtcbiAgICByZWxhdGlvbnNoaXBOYW1lcy5wdXNoKC4uLk9iamVjdC5rZXlzKGJlbG9uZ3N0b3MpLmZpbHRlcihrZXkgPT4gYmVsb25nc3Rvcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSk7XG4gICAgcmVsYXRpb25zaGlwTmFtZXMucHVzaCguLi5PYmplY3Qua2V5cyhoYXNNYW55cykuZmlsdGVyKGtleSA9PiBoYXNNYW55cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSk7XG4gICAgY29uc3QgcmVzdWx0OiB7IFthdHRyTmFtZTogc3RyaW5nXTogYW55OyB9ID0ge1xuICAgICAgaWQ6IHRoaXMubW9kZWwuaWQsXG4gICAgICB0eXBlLFxuICAgICAgLi4uYXR0cmlidXRlcyxcbiAgICAgIC4uLmJlbG9uZ3N0b3MsXG4gICAgICAuLi5oYXNNYW55cyxcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWVzLFxuICAgIH07XG4gICAgaWYgKHRoaXMubW9kZWwuaXNSZWxhdGlvbikge1xuICAgICAgcmVzdWx0Ll9fbWV0aG9kID0gdGhpcy5tb2RlbC5yZWxhdGlvbk1ldGhvZDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyB0b0hhc2goKTogeyBbYXR0ck5hbWU6IHN0cmluZ106IGFueTsgfSB7XG4gICAgY29uc3QgcmVzID0geyBpZDogdGhpcy5tb2RlbC5pZCwgdHlwZTogdGhpcy5tb2RlbC50eXBlIH07XG4gICAgdGhpcy5tZHdyYXBwZXIuYXR0cmlidXRlc0tleXMoeyBkZWZpbmVkOiB0cnVlIH0pLmZvckVhY2goa2V5ID0+IHJlc1trZXldID0gdGhpcy5tb2RlbFtrZXldKTtcbiAgICB0aGlzLm1kd3JhcHBlci5iZWxvbmdzVG9LZXlzKHsgZGVmaW5lZDogdHJ1ZSB9KS5mb3JFYWNoKGtleSA9PiByZXNba2V5XSA9IHRoaXMubW9kZWxba2V5XS50b0hhc2goKSk7XG4gICAgdGhpcy5tZHdyYXBwZXIuaGFzTWFueUtleXMoeyBkZWZpbmVkOiB0cnVlIH0pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMubW9kZWxba2V5XS5mb3JFYWNoKGVsdCA9PiB7XG4gICAgICAgIHJlc1trZXldID0gcmVzW2tleV0gfHwgW107IC8vIG5vIG5lZWQgdG8gaW5pdCByZXNba2V5XSBpZiBhcnJheSBoYXMgbm8gZWxlbWVudHMuXG4gICAgICAgIHJlc1trZXldLnB1c2goZWx0LnRvSGFzaCgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZUFsbCgpOiB7IFthdHRyTmFtZTogc3RyaW5nXTogYW55OyB9W10ge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLnNlcmlhbGl6ZUF0dHJpYnV0ZXMoKTtcbiAgICBjb25zdCBiZWxvbmdzdG9zID0gdGhpcy5zZXJpYWxpemVCZWxvbmdzVG8oKTtcbiAgICBjb25zdCBoYXNNYW55cyA9IHRoaXMuc2VyaWFsaXplSGFzTWFueSgpO1xuICAgIHJldHVybiBbYXR0cmlidXRlcywgYmVsb25nc3RvcywgaGFzTWFueXNdO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXJpYWxpemVBdHRyaWJ1dGVzKCk6IHsgW2F0dHJOYW1lOiBzdHJpbmddOiBhbnk7IH0ge1xuICAgIGxldCBrZXlzID0gdGhpcy5tZHdyYXBwZXIuYXR0cmlidXRlc0tleXMoeyBkZWZpbmVkOiB0cnVlIH0pO1xuICAgIGtleXMgPSBrZXlzLmZpbHRlcihrZXkgPT4gdGhpcy5tZHdyYXBwZXIuaXNXcml0YWJsZShrZXkpKTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLm1vZGVsW0F0dHJpYnV0ZU1ldGFkYXRhXTtcbiAgICBrZXlzID0gdGhpcy5tb2RlbC5pZCA/IGtleXMuZmlsdGVyKGtleSA9PiBhdHRyaWJ1dGVzW2tleV0uaGFzRGlydHlBdHRyaWJ1dGVzKSA6IGtleXM7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBiZUtleSA9IHRoaXMubWR3cmFwcGVyLmJhY2tlbmRQcm9wTmFtZShrZXkpO1xuICAgICAgcmVzdWx0W2JlS2V5XSA9IGF0dHJpYnV0ZXNba2V5XS5zZXJpYWxpemVkVmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplQmVsb25nc1RvKCk6IHsgW2F0dHJOYW1lOiBzdHJpbmddOiBhbnk7IH0ge1xuICAgIGxldCBrZXlzID0gdGhpcy5tZHdyYXBwZXIuYmVsb25nc1RvS2V5cyh7IGRlZmluZWQ6IHRydWUgfSk7XG4gICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB0aGlzLm1kd3JhcHBlci5pc1dyaXRhYmxlKGtleSkpO1xuXG4gICAgLy8gSWdub3JlIHVudG91Y2hlZCByZWxhdGlvbnNoaXBzXG4gICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB0aGlzLm1vZGVsW2tleV0uaGFzQmVlblRvdWNoZWQpO1xuICAgIGNvbnN0IGJlbG9uZ3N0b3MgPSB7fTtcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHNpZGVwb3N0YWJsZSA9IHRoaXMubWR3cmFwcGVyLmlzU2lkZXBvc3RhYmxlKGtleSk7XG4gICAgICBjb25zdCBiZUtleSA9IHRoaXMubWR3cmFwcGVyLmJhY2tlbmRQcm9wTmFtZShrZXkpO1xuICAgICAgYmVsb25nc3Rvc1tiZUtleV0gPSBzaWRlcG9zdGFibGUgPyB0aGlzLm1vZGVsW2tleV0uc2VyaWFsaXplKCkgOiB0aGlzLm1vZGVsW2tleV0uc2lkZWxvYWQoKTtcbiAgICAgIGlmICghYmVsb25nc3Rvc1tiZUtleV0pIHsgZGVsZXRlIGJlbG9uZ3N0b3NbYmVLZXldOyB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGJlbG9uZ3N0b3M7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZUhhc01hbnkoKTogeyBbYXR0ck5hbWU6IHN0cmluZ106IGFueTsgfSB7XG4gICAgbGV0IGtleXMgPSB0aGlzLm1kd3JhcHBlci5oYXNNYW55S2V5cyh7IGRlZmluZWQ6IHRydWUgfSk7XG4gICAga2V5cyA9IGtleXMuZmlsdGVyKGtleSA9PiB0aGlzLm1kd3JhcHBlci5pc1dyaXRhYmxlKGtleSkpO1xuXG4gICAgY29uc3QgaGFzTWFueXMgPSB7fTtcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHNpZGVwb3N0YWJsZSA9IHRoaXMubWR3cmFwcGVyLmlzU2lkZXBvc3RhYmxlKGtleSk7XG4gICAgICBjb25zdCBiZUtleSA9IHRoaXMubWR3cmFwcGVyLmJhY2tlbmRQcm9wTmFtZShrZXkpO1xuICAgICAgaGFzTWFueXNbYmVLZXldID0gc2lkZXBvc3RhYmxlID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxba2V5XS5maWx0ZXIoZWx0ID0+IGVsdC5oYXNCZWVuVG91Y2hlZCkubWFwKGVsdCA9PiBlbHQuc2VyaWFsaXplKCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxba2V5XS5maWx0ZXIoZWx0ID0+IGVsdC5oYXNCZWVuVG91Y2hlZCkubWFwKGVsdCA9PiBlbHQuc2lkZWxvYWQoKSk7XG4gICAgICBpZiAoaGFzTWFueXNbYmVLZXldLmxlbmd0aCA9PT0gMCkgeyBkZWxldGUgaGFzTWFueXNbYmVLZXldOyB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGhhc01hbnlzO1xuICB9XG59XG4iXX0=