UNPKG

@orbit/jsonapi

Version:

JSON:API support for Orbit.

190 lines 27.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JSONAPIAtomicOperationSerializer = void 0; const jsonapi_base_serializer_1 = require("./jsonapi-base-serializer"); class JSONAPIAtomicOperationSerializer extends jsonapi_base_serializer_1.JSONAPIBaseSerializer { serialize(operation) { switch (operation.op) { case 'addRecord': return this.serializeAddRecordOperation(operation); case 'updateRecord': return this.serializeUpdateRecordOperation(operation); case 'removeRecord': return this.serializeRemoveRecordOperation(operation); case 'addToRelatedRecords': return this.serializeAddToRelatedRecordsOperation(operation); case 'removeFromRelatedRecords': return this.serializeRemoveFromRelatedRecordsOperation(operation); case 'replaceRelatedRecord': return this.serializeReplaceRelatedRecordOperation(operation); case 'replaceRelatedRecords': return this.serializeReplaceRelatedRecordsOperation(operation); case 'replaceAttribute': return this.serializeReplaceAttributeOperation(operation); default: throw new Error(`JSONAPIOperationSerializer: Unrecognized operation ${operation.op}.`); } } deserialize(operation) { if (isAddOperation(operation)) { return this.deserializeAddOperation(operation); } else if (isUpdateOperation(operation)) { return this.deserializeUpdateOperation(operation); } else if (isRemoveOperation(operation)) { return this.deserializeRemoveOperation(operation); } else { throw new Error(`JSONAPIOperationSerializer: Only "add", "update" and "remove" operations are supported at this time.`); } } serializeAddRecordOperation(operation) { const ref = this.identitySerializer.serialize(operation.record); return { op: 'add', ref, data: this.resourceSerializer.serialize(operation.record) }; } serializeUpdateRecordOperation(operation) { return { op: 'update', ref: this.identitySerializer.serialize(operation.record), data: this.resourceSerializer.serialize(operation.record) }; } serializeRemoveRecordOperation(operation) { return { op: 'remove', ref: this.identitySerializer.serialize(operation.record) }; } serializeAddToRelatedRecordsOperation(operation) { const ref = this.identitySerializer.serialize(operation.record); return { op: 'add', ref: { relationship: operation.relationship, ...ref }, data: this.identitySerializer.serialize(operation.relatedRecord) }; } serializeRemoveFromRelatedRecordsOperation(operation) { const ref = this.identitySerializer.serialize(operation.record); return { op: 'remove', ref: { relationship: operation.relationship, ...ref }, data: this.identitySerializer.serialize(operation.relatedRecord) }; } serializeReplaceRelatedRecordsOperation(operation) { const ref = this.identitySerializer.serialize(operation.record); return { op: 'update', ref: { relationship: operation.relationship, ...ref }, data: operation.relatedRecords.map((record) => this.identitySerializer.serialize(record)) }; } serializeReplaceRelatedRecordOperation(operation) { const ref = this.identitySerializer.serialize(operation.record); return { op: 'update', ref: { relationship: operation.relationship, ...ref }, data: operation.relatedRecord ? this.identitySerializer.serialize(operation.relatedRecord) : null }; } serializeReplaceAttributeOperation(operation) { const record = { id: operation.record.id, type: operation.record.type, attributes: { [operation.attribute]: operation.value } }; const resource = this.resourceSerializer.deserialize(record); const ref = { id: resource.id, type: resource.type }; return { op: 'update', ref, data: resource }; } deserializeAddOperation(operation) { if (isRelatedResourceOperation(operation)) { return { op: 'addToRelatedRecords', relationship: operation.ref.relationship, record: this.identitySerializer.deserialize(operation.ref), relatedRecord: this.identitySerializer.deserialize(operation.data) }; } else { return { op: 'addRecord', record: this.resourceSerializer.deserialize(operation.data) }; } } deserializeUpdateOperation(operation) { if (isRelatedResourceOperation(operation)) { if (Array.isArray(operation.data)) { return { op: 'replaceRelatedRecords', relationship: operation.ref.relationship, record: this.identitySerializer.deserialize(operation.ref), relatedRecords: operation.data.map((record) => this.identitySerializer.deserialize(record)) }; } else { return { op: 'replaceRelatedRecord', relationship: operation.ref.relationship, record: this.identitySerializer.deserialize(operation.ref), relatedRecord: operation.data ? this.identitySerializer.deserialize(operation.data) : null }; } } else { return { op: 'updateRecord', record: this.resourceSerializer.deserialize(operation.data) }; } } deserializeRemoveOperation(operation) { if (isRelatedResourceOperation(operation)) { return { op: 'removeFromRelatedRecords', relationship: operation.ref.relationship, record: this.identitySerializer.deserialize(operation.ref), relatedRecord: this.identitySerializer.deserialize(operation.data) }; } else { return { op: 'removeRecord', record: this.identitySerializer.deserialize(operation.ref) }; } } } exports.JSONAPIAtomicOperationSerializer = JSONAPIAtomicOperationSerializer; function isRelatedResourceOperation(operation) { return !!operation.ref.relationship; } function isAddOperation(operation) { return operation.op === 'add'; } function isUpdateOperation(operation) { return operation.op === 'update'; } function isRemoveOperation(operation) { return operation.op === 'remove'; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1hdG9taWMtb3BlcmF0aW9uLXNlcmlhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VyaWFsaXplcnMvanNvbmFwaS1hdG9taWMtb3BlcmF0aW9uLXNlcmlhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBdUJBLHVFQUFrRTtBQUVsRSxNQUFhLGdDQUFpQyxTQUFRLCtDQUtyRDtJQUNDLFNBQVMsQ0FBQyxTQUEwQjtRQUNsQyxRQUFRLFNBQVMsQ0FBQyxFQUFFLEVBQUU7WUFDcEIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3JELEtBQUssY0FBYztnQkFDakIsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEQsS0FBSyxjQUFjO2dCQUNqQixPQUFPLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN4RCxLQUFLLHFCQUFxQjtnQkFDeEIsT0FBTyxJQUFJLENBQUMscUNBQXFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0QsS0FBSywwQkFBMEI7Z0JBQzdCLE9BQU8sSUFBSSxDQUFDLDBDQUEwQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLEtBQUssc0JBQXNCO2dCQUN6QixPQUFPLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRSxLQUFLLHVCQUF1QjtnQkFDMUIsT0FBTyxJQUFJLENBQUMsdUNBQXVDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakUsS0FBSyxrQkFBa0I7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVEO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0RBQXNELFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FDdEUsQ0FBQztTQUNMO0lBQ0gsQ0FBQztJQUVELFdBQVcs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Q0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLFNBQWtDO0lBS2xDLE9BQU8sU0FBUyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFDbkMsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQ3hCLFNBQWtDO0lBSWxDLE9BQU8sU0FBUyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmRPcGVyYXRpb24sXG4gIEFkZFRvUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3JkT3BlcmF0aW9uLFxuICBSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFVwZGF0ZVJlY29yZE9wZXJhdGlvbixcbiAgUmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uLFxuICBSZW1vdmVSZWNvcmRPcGVyYXRpb24sXG4gIEFkZFJlY29yZE9wZXJhdGlvbixcbiAgUmVwbGFjZUF0dHJpYnV0ZU9wZXJhdGlvblxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQge1xuICBBZGRSZXNvdXJjZUF0b21pY09wZXJhdGlvbixcbiAgQWRkVG9SZWxhdGVkUmVzb3VyY2VzQXRvbWljT3BlcmF0aW9uLFxuICBSZW1vdmVGcm9tUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvbixcbiAgUmVtb3ZlUmVzb3VyY2VBdG9taWNPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVzb3VyY2VBdG9taWNPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVzb3VyY2VzQXRvbWljT3BlcmF0aW9uLFxuICBSZXNvdXJjZUF0b21pY09wZXJhdGlvbixcbiAgVXBkYXRlUmVzb3VyY2VBdG9taWNPcGVyYXRpb25cbn0gZnJvbSAnLi4vcmVzb3VyY2Utb3BlcmF0aW9ucyc7XG5pbXBvcnQgeyBSZXNvdXJjZSwgUmVzb3VyY2VJZGVudGl0eSB9IGZyb20gJy4uL3Jlc291cmNlLWRvY3VtZW50JztcbmltcG9ydCB7IEpTT05BUElCYXNlU2VyaWFsaXplciB9IGZyb20gJy4vanNvbmFwaS1iYXNlLXNlcmlhbGl6ZXInO1xuXG5leHBvcnQgY2xhc3MgSlNPTkFQSUF0b21pY09wZXJhdGlvblNlcmlhbGl6ZXIgZXh0ZW5kcyBKU09OQVBJQmFzZVNlcmlhbGl6ZXI8XG4gIFJlY29yZE9wZXJhdGlvbixcbiAgUmVzb3VyY2VBdG9taWNPcGVyYXRpb24sXG4gIHVua25vd24sXG4gIHVua25vd25cbj4ge1xuICBzZXJpYWxpemUob3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24pOiBSZXNvdXJjZUF0b21pY09wZXJhdGlvbiB7XG4gICAgc3dpdGNoIChvcGVyYXRpb24ub3ApIHtcbiAgICAgIGNhc2UgJ2FkZFJlY29yZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZUFkZFJlY29yZE9wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgICAgY2FzZSAndXBkYXRlUmVjb3JkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVXBkYXRlUmVjb3JkT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgICBjYXNlICdyZW1vdmVSZWNvcmQnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVSZW1vdmVSZWNvcmRPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIGNhc2UgJ2FkZFRvUmVsYXRlZFJlY29yZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgICBjYXNlICdyZW1vdmVGcm9tUmVsYXRlZFJlY29yZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVSZW1vdmVGcm9tUmVsYXRlZFJlY29yZHNPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIGNhc2UgJ3JlcGxhY2VSZWxhdGVkUmVjb3Jkcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgICAgY2FzZSAncmVwbGFjZUF0dHJpYnV0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVJlcGxhY2VBdHRyaWJ1dGVPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSlNPTkFQSU9wZXJhdGlvblNlcmlhbGl6ZXI6IFVucmVjb2duaXplZCBvcGVyYXRpb24gJHtvcGVyYXRpb24ub3B9LmBcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkZXNlcmlhbGl6ZShvcGVyYXRpb246IFJlc291cmNlQXRvbWljT3BlcmF0aW9uKTogUmVjb3JkT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNBZGRPcGVyYXRpb24ob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzZXJpYWxpemVBZGRPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICB9IGVsc2UgaWYgKGlzVXBkYXRlT3BlcmF0aW9uKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlc2VyaWFsaXplVXBkYXRlT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChpc1JlbW92ZU9wZXJhdGlvbihvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNlcmlhbGl6ZVJlbW92ZU9wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBKU09OQVBJT3BlcmF0aW9uU2VyaWFsaXplcjogT25seSBcImFkZFwiLCBcInVwZGF0ZVwiIGFuZCBcInJlbW92ZVwiIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplQWRkUmVjb3JkT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogQWRkUmVjb3JkT3BlcmF0aW9uXG4gICk6IEFkZFJlc291cmNlQXRvbWljT3BlcmF0aW9uIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUob3BlcmF0aW9uLnJlY29yZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnYWRkJyxcbiAgICAgIHJlZixcbiAgICAgIGRhdGE6IHRoaXMucmVzb3VyY2VTZXJpYWxpemVyLnNlcmlhbGl6ZShvcGVyYXRpb24ucmVjb3JkKVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplVXBkYXRlUmVjb3JkT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogVXBkYXRlUmVjb3JkT3BlcmF0aW9uXG4gICk6IFVwZGF0ZVJlc291cmNlQXRvbWljT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3A6ICd1cGRhdGUnLFxuICAgICAgcmVmOiB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUoXG4gICAgICAgIG9wZXJhdGlvbi5yZWNvcmRcbiAgICAgICkgYXMgUmVzb3VyY2VJZGVudGl0eSxcbiAgICAgIGRhdGE6IHRoaXMucmVzb3VyY2VTZXJpYWxpemVyLnNlcmlhbGl6ZShvcGVyYXRpb24ucmVjb3JkKVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplUmVtb3ZlUmVjb3JkT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjogUmVtb3ZlUmVjb3JkT3BlcmF0aW9uXG4gICk6IFJlbW92ZVJlc291cmNlQXRvbWljT3BlcmF0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3A6ICdyZW1vdmUnLFxuICAgICAgcmVmOiB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUoXG4gICAgICAgIG9wZXJhdGlvbi5yZWNvcmRcbiAgICAgICkgYXMgUmVzb3VyY2VJZGVudGl0eVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplQWRkVG9SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbihcbiAgICBvcGVyYXRpb246IEFkZFRvUmVsYXRlZFJlY29yZHNPcGVyYXRpb25cbiAgKTogQWRkVG9SZWxhdGVkUmVzb3VyY2VzQXRvbWljT3BlcmF0aW9uIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUoXG4gICAgICBvcGVyYXRpb24ucmVjb3JkXG4gICAgKSBhcyBSZXNvdXJjZUlkZW50aXR5O1xuICAgIHJldHVybiB7XG4gICAgICBvcDogJ2FkZCcsXG4gICAgICByZWY6IHsgcmVsYXRpb25zaGlwOiBvcGVyYXRpb24ucmVsYXRpb25zaGlwLCAuLi5yZWYgfSxcbiAgICAgIGRhdGE6IHRoaXMuaWRlbnRpdHlTZXJpYWxpemVyLnNlcmlhbGl6ZShvcGVyYXRpb24ucmVsYXRlZFJlY29yZClcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlcmlhbGl6ZVJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbihcbiAgICBvcGVyYXRpb246IFJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc09wZXJhdGlvblxuICApOiBSZW1vdmVGcm9tUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvbiB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5pZGVudGl0eVNlcmlhbGl6ZXIuc2VyaWFsaXplKFxuICAgICAgb3BlcmF0aW9uLnJlY29yZFxuICAgICkgYXMgUmVzb3VyY2VJZGVudGl0eTtcbiAgICByZXR1cm4ge1xuICAgICAgb3A6ICdyZW1vdmUnLFxuICAgICAgcmVmOiB7IHJlbGF0aW9uc2hpcDogb3BlcmF0aW9uLnJlbGF0aW9uc2hpcCwgLi4ucmVmIH0sXG4gICAgICBkYXRhOiB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUob3BlcmF0aW9uLnJlbGF0ZWRSZWNvcmQpXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXJpYWxpemVSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb25cbiAgKTogUmVwbGFjZVJlbGF0ZWRSZXNvdXJjZXNBdG9taWNPcGVyYXRpb24ge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuaWRlbnRpdHlTZXJpYWxpemVyLnNlcmlhbGl6ZShcbiAgICAgIG9wZXJhdGlvbi5yZWNvcmRcbiAgICApIGFzIFJlc291cmNlSWRlbnRpdHk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAndXBkYXRlJyxcbiAgICAgIHJlZjogeyByZWxhdGlvbnNoaXA6IG9wZXJhdGlvbi5yZWxhdGlvbnNoaXAsIC4uLnJlZiB9LFxuICAgICAgZGF0YTogb3BlcmF0aW9uLnJlbGF0ZWRSZWNvcmRzLm1hcCgocmVjb3JkKSA9PlxuICAgICAgICB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUocmVjb3JkKVxuICAgICAgKVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBSZXBsYWNlUmVsYXRlZFJlY29yZE9wZXJhdGlvblxuICApOiBSZXBsYWNlUmVsYXRlZFJlc291cmNlQXRvbWljT3BlcmF0aW9uIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5zZXJpYWxpemUoXG4gICAgICBvcGVyYXRpb24ucmVjb3JkXG4gICAgKSBhcyBSZXNvdXJjZUlkZW50aXR5O1xuICAgIHJldHVybiB7XG4gICAgICBvcDogJ3VwZGF0ZScsXG4gICAgICByZWY6IHsgcmVsYXRpb25zaGlwOiBvcGVyYXRpb24ucmVsYXRpb25zaGlwLCAuLi5yZWYgfSxcbiAgICAgIGRhdGE6IG9wZXJhdGlvbi5yZWxhdGVkUmVjb3JkXG4gICAgICAgID8gdGhpcy5pZGVudGl0eVNlcmlhbGl6ZXIuc2VyaWFsaXplKG9wZXJhdGlvbi5yZWxhdGVkUmVjb3JkKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlcmlhbGl6ZVJlcGxhY2VBdHRyaWJ1dGVPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBSZXBsYWNlQXR0cmlidXRlT3BlcmF0aW9uXG4gICk6IFVwZGF0ZVJlc291cmNlQXRvbWljT3BlcmF0aW9uIHtcbiAgICBjb25zdCByZWNvcmQgPSB7XG4gICAgICBpZDogb3BlcmF0aW9uLnJlY29yZC5pZCxcbiAgICAgIHR5cGU6IG9wZXJhdGlvbi5yZWNvcmQudHlwZSxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgW29wZXJhdGlvbi5hdHRyaWJ1dGVdOiBvcGVyYXRpb24udmFsdWVcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVjb3JkKTtcbiAgICBjb25zdCByZWYgPSB7XG4gICAgICBpZDogcmVzb3VyY2UuaWQsXG4gICAgICB0eXBlOiByZXNvdXJjZS50eXBlXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcDogJ3VwZGF0ZScsXG4gICAgICByZWYsXG4gICAgICBkYXRhOiByZXNvdXJjZVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzZXJpYWxpemVBZGRPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOiBBZGRSZXNvdXJjZUF0b21pY09wZXJhdGlvbiB8IEFkZFRvUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvblxuICApOiBBZGRSZWNvcmRPcGVyYXRpb24gfCBBZGRUb1JlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNSZWxhdGVkUmVzb3VyY2VPcGVyYXRpb24ob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdhZGRUb1JlbGF0ZWRSZWNvcmRzJyxcbiAgICAgICAgcmVsYXRpb25zaGlwOiBvcGVyYXRpb24ucmVmLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgcmVjb3JkOiB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShvcGVyYXRpb24ucmVmKSxcbiAgICAgICAgcmVsYXRlZFJlY29yZDogdGhpcy5pZGVudGl0eVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoXG4gICAgICAgICAgb3BlcmF0aW9uLmRhdGEgYXMgUmVjb3JkSWRlbnRpdHlcbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdhZGRSZWNvcmQnLFxuICAgICAgICByZWNvcmQ6IHRoaXMucmVzb3VyY2VTZXJpYWxpemVyLmRlc2VyaWFsaXplKG9wZXJhdGlvbi5kYXRhKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVzZXJpYWxpemVVcGRhdGVPcGVyYXRpb24oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBVcGRhdGVSZXNvdXJjZUF0b21pY09wZXJhdGlvblxuICAgICAgfCBSZXBsYWNlUmVsYXRlZFJlc291cmNlQXRvbWljT3BlcmF0aW9uXG4gICAgICB8IFJlcGxhY2VSZWxhdGVkUmVzb3VyY2VzQXRvbWljT3BlcmF0aW9uXG4gICk6XG4gICAgfCBSZXBsYWNlUmVsYXRlZFJlY29yZE9wZXJhdGlvblxuICAgIHwgUmVwbGFjZVJlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uXG4gICAgfCBVcGRhdGVSZWNvcmRPcGVyYXRpb24ge1xuICAgIGlmIChpc1JlbGF0ZWRSZXNvdXJjZU9wZXJhdGlvbihvcGVyYXRpb24pKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvcGVyYXRpb24uZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkcycsXG4gICAgICAgICAgcmVsYXRpb25zaGlwOiBvcGVyYXRpb24ucmVmLnJlbGF0aW9uc2hpcCxcbiAgICAgICAgICByZWNvcmQ6IHRoaXMuaWRlbnRpdHlTZXJpYWxpemVyLmRlc2VyaWFsaXplKG9wZXJhdGlvbi5yZWYpLFxuICAgICAgICAgIHJlbGF0ZWRSZWNvcmRzOiAob3BlcmF0aW9uLmRhdGEgYXMgUmVjb3JkSWRlbnRpdHlbXSkubWFwKChyZWNvcmQpID0+XG4gICAgICAgICAgICB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZWNvcmQpXG4gICAgICAgICAgKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvcDogJ3JlcGxhY2VSZWxhdGVkUmVjb3JkJyxcbiAgICAgICAgICByZWxhdGlvbnNoaXA6IG9wZXJhdGlvbi5yZWYucmVsYXRpb25zaGlwLFxuICAgICAgICAgIHJlY29yZDogdGhpcy5pZGVudGl0eVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUob3BlcmF0aW9uLnJlZiksXG4gICAgICAgICAgcmVsYXRlZFJlY29yZDogb3BlcmF0aW9uLmRhdGFcbiAgICAgICAgICAgID8gdGhpcy5pZGVudGl0eVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmRhdGEgYXMgUmVjb3JkSWRlbnRpdHlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9wOiAndXBkYXRlUmVjb3JkJyxcbiAgICAgICAgcmVjb3JkOiB0aGlzLnJlc291cmNlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShvcGVyYXRpb24uZGF0YSBhcyBSZXNvdXJjZSlcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplUmVtb3ZlT3BlcmF0aW9uKFxuICAgIG9wZXJhdGlvbjpcbiAgICAgIHwgUmVtb3ZlUmVzb3VyY2VBdG9taWNPcGVyYXRpb25cbiAgICAgIHwgUmVtb3ZlRnJvbVJlbGF0ZWRSZXNvdXJjZXNBdG9taWNPcGVyYXRpb25cbiAgKTogUmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uIHwgUmVtb3ZlUmVjb3JkT3BlcmF0aW9uIHtcbiAgICBpZiAoaXNSZWxhdGVkUmVzb3VyY2VPcGVyYXRpb24ob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICdyZW1vdmVGcm9tUmVsYXRlZFJlY29yZHMnLFxuICAgICAgICByZWxhdGlvbnNoaXA6IG9wZXJhdGlvbi5yZWYucmVsYXRpb25zaGlwLFxuICAgICAgICByZWNvcmQ6IHRoaXMuaWRlbnRpdHlTZXJpYWxpemVyLmRlc2VyaWFsaXplKG9wZXJhdGlvbi5yZWYpLFxuICAgICAgICByZWxhdGVkUmVjb3JkOiB0aGlzLmlkZW50aXR5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShcbiAgICAgICAgICBvcGVyYXRpb24uZGF0YSBhcyBSZWNvcmRJZGVudGl0eVxuICAgICAgICApXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcDogJ3JlbW92ZVJlY29yZCcsXG4gICAgICAgIHJlY29yZDogdGhpcy5pZGVudGl0eVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUob3BlcmF0aW9uLnJlZilcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzUmVsYXRlZFJlc291cmNlT3BlcmF0aW9uKFxuICBvcGVyYXRpb246IFJlc291cmNlQXRvbWljT3BlcmF0aW9uXG4pOiBvcGVyYXRpb24gaXNcbiAgfCBBZGRUb1JlbGF0ZWRSZXNvdXJjZXNBdG9taWNPcGVyYXRpb25cbiAgfCBSZW1vdmVGcm9tUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvblxuICB8IFJlcGxhY2VSZWxhdGVkUmVzb3VyY2VBdG9taWNPcGVyYXRpb25cbiAgfCBSZXBsYWNlUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvbiB7XG4gIHJldHVybiAhIW9wZXJhdGlvbi5yZWYucmVsYXRpb25zaGlwO1xufVxuXG5mdW5jdGlvbiBpc0FkZE9wZXJhdGlvbihcbiAgb3BlcmF0aW9uOiBSZXNvdXJjZUF0b21pY09wZXJhdGlvblxuKTogb3BlcmF0aW9uIGlzXG4gIHwgQWRkUmVzb3VyY2VBdG9taWNPcGVyYXRpb25cbiAgfCBBZGRUb1JlbGF0ZWRSZXNvdXJjZXNBdG9taWNPcGVyYXRpb24ge1xuICByZXR1cm4gb3BlcmF0aW9uLm9wID09PSAnYWRkJztcbn1cblxuZnVuY3Rpb24gaXNVcGRhdGVPcGVyYXRpb24oXG4gIG9wZXJhdGlvbjogUmVzb3VyY2VBdG9taWNPcGVyYXRpb25cbik6IG9wZXJhdGlvbiBpc1xuICB8IFVwZGF0ZVJlc291cmNlQXRvbWljT3BlcmF0aW9uXG4gIHwgUmVwbGFjZVJlbGF0ZWRSZXNvdXJjZXNBdG9taWNPcGVyYXRpb25cbiAgfCBSZXBsYWNlUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvbiB7XG4gIHJldHVybiBvcGVyYXRpb24ub3AgPT09ICd1cGRhdGUnO1xufVxuXG5mdW5jdGlvbiBpc1JlbW92ZU9wZXJhdGlvbihcbiAgb3BlcmF0aW9uOiBSZXNvdXJjZUF0b21pY09wZXJhdGlvblxuKTogb3BlcmF0aW9uIGlzXG4gIHwgUmVtb3ZlUmVzb3VyY2VBdG9taWNPcGVyYXRpb25cbiAgfCBSZW1vdmVGcm9tUmVsYXRlZFJlc291cmNlc0F0b21pY09wZXJhdGlvbiB7XG4gIHJldHVybiBvcGVyYXRpb24ub3AgPT09ICdyZW1vdmUnO1xufVxuIl19