UNPKG

@orbit/jsonapi

Version:

JSON:API support for Orbit.

206 lines 30 kB
import { deepSet } from '@orbit/utils'; import { Assertion, Orbit } from '@orbit/core'; import { JSONAPIBaseSerializer } from './jsonapi-base-serializer'; const { deprecate } = Orbit; export class JSONAPIResourceSerializer extends JSONAPIBaseSerializer { serialize(record) { const resource = this.identitySerializer.serialize(record); const model = this.schema.getModel(record.type); this.serializeAttributes(resource, record, model); this.serializeRelationships(resource, record, model); this.serializeLinks(resource, record, model); this.serializeMeta(resource, record, model); return resource; } deserialize(resource, customOptions) { const options = this.buildDeserializationOptions(customOptions); options.includeKeys = true; const record = this.identitySerializer.deserialize(resource, options); const model = this.schema.getModel(record.type); this.deserializeAttributes(record, resource, model); this.deserializeRelationships(record, resource, model); this.deserializeLinks(record, resource, model); this.deserializeMeta(record, resource, model); return record; } serializeAttributes(resource, record, model) { if (record.attributes) { for (let field of Object.keys(record.attributes)) { this.serializeAttribute(resource, record, field, model); } } } serializeAttribute(resource, record, field, model) { var _a, _b, _c, _d; const value = (_a = record.attributes) === null || _a === void 0 ? void 0 : _a[field]; if (value === undefined) { return; } const fieldOptions = (_b = model.attributes) === null || _b === void 0 ? void 0 : _b[field]; if (fieldOptions === undefined) { return; } let resValue; if (value === null) { resValue = null; } else { const type = (_c = fieldOptions.type) !== null && _c !== void 0 ? _c : 'unknown'; const serializer = this.serializerFor(type); if (serializer) { const serializationOptions = (_d = fieldOptions.serialization) !== null && _d !== void 0 ? _d : fieldOptions.serializationOptions; if (fieldOptions.serializationOptions !== undefined) { // TODO: Remove in v0.18 deprecate(`The attribute '${field}' for '${record.type}' has been assigned \`serializationOptions\` in the schema. Use \`serialization\` instead.`); } resValue = serializer.serialize(value, serializationOptions); } else { throw new Assertion(`Serializer could not be found for attribute type '${type}'`); } } const resField = this.fieldSerializer.serialize(field, { type: record.type }); deepSet(resource, ['attributes', resField], resValue); } serializeRelationships(resource, record, model) { if (record.relationships) { for (let field of Object.keys(record.relationships)) { this.serializeRelationship(resource, record, field, model); } } } serializeRelationship(resource, record, field, model) { var _a, _b; const value = (_a = record.relationships) === null || _a === void 0 ? void 0 : _a[field].data; if (value === undefined) { return; } if (((_b = model.relationships) === null || _b === void 0 ? void 0 : _b[field]) === undefined) { return; } let resValue; if (value === null) { resValue = null; } else { const identitySerializer = this.identitySerializer; if (Array.isArray(value)) { resValue = value.map((identity) => identitySerializer.serialize(identity)); } else { resValue = identitySerializer.serialize(value); } } const resField = this.fieldSerializer.serialize(field, { type: record.type }); deepSet(resource, ['relationships', resField, 'data'], resValue); } /* eslint-disable @typescript-eslint/no-unused-vars */ serializeLinks(resource, record, model) { } serializeMeta(resource, record, model) { } /* eslint-enable @typescript-eslint/no-unused-vars */ deserializeAttributes(record, resource, model) { if (resource.attributes) { for (let resField of Object.keys(resource.attributes)) { this.deserializeAttribute(record, resource, resField, model); } } } deserializeAttribute(record, resource, resField, model) { var _a, _b, _c; const resValue = (_a = resource.attributes) === null || _a === void 0 ? void 0 : _a[resField]; if (resValue === undefined) { return; } const field = this.fieldSerializer.deserialize(resField, { type: record.type }); const fieldOptions = (_b = model.attributes) === null || _b === void 0 ? void 0 : _b[field]; if (fieldOptions === undefined) { return; } let value; if (resValue === null) { value = null; } else { const type = fieldOptions.type || 'unknown'; const serializer = this.serializerFor(type); if (serializer) { const deserializationOptions = (_c = fieldOptions.deserialization) !== null && _c !== void 0 ? _c : fieldOptions.deserializationOptions; if (fieldOptions.deserializationOptions !== undefined) { // TODO: Remove in v0.18 deprecate(`The attribute '${field}' for '${record.type}' has been assigned \`deserializationOptions\` in the schema. Use \`deserialization\` instead.`); } value = serializer.deserialize(resValue, deserializationOptions); } else { throw new Assertion(`Serializer could not be found for attribute type '${type}'`); } } deepSet(record, ['attributes', field], value); } deserializeRelationships(record, resource, model) { if (resource.relationships) { for (let resField of Object.keys(resource.relationships)) { this.deserializeRelationship(record, resource, resField, model); } } } deserializeRelationship(record, resource, resField, model) { var _a, _b; const resValue = (_a = resource.relationships) === null || _a === void 0 ? void 0 : _a[resField]; if (!resValue) { return; } const field = this.fieldSerializer.deserialize(resField, { type: record.type }); const fieldOptions = (_b = model.relationships) === null || _b === void 0 ? void 0 : _b[field]; if (fieldOptions === undefined) { return; } let resData = resValue.data; if (resData !== undefined) { let data; if (resData === null) { data = null; } else { const identitySerializer = this.identitySerializer; if (Array.isArray(resData)) { data = resData.map((resourceIdentity) => identitySerializer.deserialize(resourceIdentity)); } else { data = identitySerializer.deserialize(resData); } } deepSet(record, ['relationships', field, 'data'], data); } let { links, meta } = resValue; if (links !== undefined) { deepSet(record, ['relationships', field, 'links'], links); } if (meta !== undefined) { deepSet(record, ['relationships', field, 'meta'], meta); } } deserializeLinks(record, resource, /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ model) { if (resource.links) { record.links = resource.links; } } deserializeMeta(record, resource, /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ model) { if (resource.meta) { record.meta = resource.meta; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1yZXNvdXJjZS1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6ZXJzL2pzb25hcGktcmVzb3VyY2Utc2VyaWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBTy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR2xFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFDNUIsTUFBTSxPQUFPLHlCQUEwQixTQUFRLHFCQUs5QztJQUNDLFNBQVMsQ0FBQyxNQUF5QjtRQUNqQyxNQUFNLFFBQVEsR0FBYSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sS0FBSyxHQUFvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUU1QyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsV0FBVyxDQUNULFFBQWtCLEVBQ2xCLGFBQTZEO1FBRTdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxhQUFh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LEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRS9CLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzRDtRQUVELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0QixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN6RDtJQUNILENBQUM7SUFFUyxnQkFBZ0IsQ0FDeEIsTUFBeUIsRUFDekIsUUFBa0I7SUFDbEIsZ0VBQWdFO0lBQ2hFLEtBQXNCO1FBRXRCLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtZQUNsQixNQUFNLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRVMsZUFBZSxDQUN2QixNQUF5QixFQUN6QixRQUFrQjtJQUNsQixnRUFBZ0U7SUFDaEUsS0FBc0I7UUFFdEIsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztTQUM3QjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZXBTZXQgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuaW1wb3J0IHsgQXNzZXJ0aW9uLCBPcmJpdCB9IGZyb20gJ0BvcmJpdC9jb3JlJztcbmltcG9ydCB7XG4gIEluaXRpYWxpemVkUmVjb3JkLFxuICBSZWNvcmRJZGVudGl0eSxcbiAgTW9kZWxEZWZpbml0aW9uXG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IFJlc291cmNlLCBSZXNvdXJjZUlkZW50aXR5IH0gZnJvbSAnLi4vcmVzb3VyY2UtZG9jdW1lbnQnO1xuaW1wb3J0IHsgSlNPTkFQSUJhc2VTZXJpYWxpemVyIH0gZnJvbSAnLi9qc29uYXBpLWJhc2Utc2VyaWFsaXplcic7XG5pbXBvcnQgeyBKU09OQVBJUmVzb3VyY2VJZGVudGl0eURlc2VyaWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuL2pzb25hcGktcmVzb3VyY2UtaWRlbnRpdHktc2VyaWFsaXplcic7XG5cbmNvbnN0IHsgZGVwcmVjYXRlIH0gPSBPcmJpdDtcbmV4cG9ydCBjbGFzcyBKU09OQVBJUmVzb3VyY2VTZXJpYWxpemVyIGV4dGVuZHMgSlNPTkFQSUJhc2VTZXJpYWxpemVyPFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgUmVzb3VyY2UsXG4gIHVua25vd24sXG4gIEpTT05BUElSZXNvdXJjZUlkZW50aXR5RGVzZXJpYWxpemF0aW9uT3B0aW9uc1xuPiB7XG4gIHNlcmlhbGl6ZShyZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkKTogUmVzb3VyY2Uge1xuICAgIGNvbnN0IHJlc291cmNlOiBSZXNvdXJjZSA9IHRoaXMuaWRlbnRpdHlTZXJpYWxpemVyLnNlcmlhbGl6ZShyZWNvcmQpO1xuICAgIGNvbnN0IG1vZGVsOiBNb2RlbERlZmluaXRpb24gPSB0aGlzLnNjaGVtYS5nZXRNb2RlbChyZWNvcmQudHlwZSk7XG5cbiAgICB0aGlzLnNlcmlhbGl6ZUF0dHJpYnV0ZXMocmVzb3VyY2UsIHJlY29yZCwgbW9kZWwpO1xuICAgIHRoaXMuc2VyaWFsaXplUmVsYXRpb25zaGlwcyhyZXNvdXJjZSwgcmVjb3JkLCBtb2RlbCk7XG4gICAgdGhpcy5zZXJpYWxpemVMaW5rcyhyZXNvdXJjZSwgcmVjb3JkLCBtb2RlbCk7XG4gICAgdGhpcy5zZXJpYWxpemVNZXRhKHJlc291cmNlLCByZWNvcmQsIG1vZGVsKTtcblxuICAgIHJldHVybiByZXNvdXJjZTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICBjdXN0b21PcHRpb25zPzogSlNPTkFQSVJlc291cmNlSWRlbnRpdHlEZXNlcmlhbGl6YXRpb25PcHRpb25zXG4gICk6IEluaXRpYWxpemVkUmVjb3JkIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5idWlsZERlc2VyaWFsaXphdGlvbk9wdGlvbnMoY3VzdG9tT3B0aW9ucyk7XG4gICAgb3B0aW9ucy5pbmNsdWRlS2V5cyA9IHRydWU7XG4gICAgY29uc3QgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCA9IHRoaXMuaWRlbnRpdHlTZXJpYWxpemVyLmRlc2VyaWFsaXplKFxuICAgICAgcmVzb3VyY2UgYXMgUmVzb3VyY2VJZGVudGl0eSxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIGNvbnN0IG1vZGVsOiBNb2RlbERlZmluaXRpb24gPSB0aGlzLnNjaGVtYS5nZXRNb2RlbChyZWNvcmQudHlwZSk7XG5cbiAgICB0aGlzLmRlc2VyaWFsaXplQXR0cmlidXRlcyhyZWNvcmQsIHJlc291cmNlLCBtb2RlbCk7XG4gICAgdGhpcy5kZXNlcmlhbGl6ZVJlbGF0aW9uc2hpcHMocmVjb3JkLCByZXNvdXJjZSwgbW9kZWwpO1xuICAgIHRoaXMuZGVzZXJpYWxpemVMaW5rcyhyZWNvcmQsIHJlc291cmNlLCBtb2RlbCk7XG4gICAgdGhpcy5kZXNlcmlhbGl6ZU1ldGEocmVjb3JkLCByZXNvdXJjZSwgbW9kZWwpO1xuXG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXJpYWxpemVBdHRyaWJ1dGVzKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIG1vZGVsOiBNb2RlbERlZmluaXRpb25cbiAgKTogdm9pZCB7XG4gICAgaWYgKHJlY29yZC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBmaWVsZCBvZiBPYmplY3Qua2V5cyhyZWNvcmQuYXR0cmlidXRlcykpIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemVBdHRyaWJ1dGUocmVzb3VyY2UsIHJlY29yZCwgZmllbGQsIG1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplQXR0cmlidXRlKFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIGZpZWxkOiBzdHJpbmcsXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHJlY29yZC5hdHRyaWJ1dGVzPy5bZmllbGRdO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRPcHRpb25zID0gbW9kZWwuYXR0cmlidXRlcz8uW2ZpZWxkXTtcbiAgICBpZiAoZmllbGRPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzVmFsdWU6IHVua25vd247XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXNWYWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBmaWVsZE9wdGlvbnMudHlwZSA/PyAndW5rbm93bic7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gdGhpcy5zZXJpYWxpemVyRm9yKHR5cGUpO1xuICAgICAgaWYgKHNlcmlhbGl6ZXIpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9wdGlvbnMgPVxuICAgICAgICAgIGZpZWxkT3B0aW9ucy5zZXJpYWxpemF0aW9uID8/XG4gICAgICAgICAgKGZpZWxkT3B0aW9ucyBhcyBhbnkpLnNlcmlhbGl6YXRpb25PcHRpb25zO1xuXG4gICAgICAgIGlmICgoZmllbGRPcHRpb25zIGFzIGFueSkuc2VyaWFsaXphdGlvbk9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBpbiB2MC4xOFxuICAgICAgICAgIGRlcHJlY2F0ZShcbiAgICAgICAgICAgIGBUaGUgYXR0cmlidXRlICcke2ZpZWxkfScgZm9yICcke3JlY29yZC50eXBlfScgaGFzIGJlZW4gYXNzaWduZWQgXFxgc2VyaWFsaXphdGlvbk9wdGlvbnNcXGAgaW4gdGhlIHNjaGVtYS4gVXNlIFxcYHNlcmlhbGl6YXRpb25cXGAgaW5zdGVhZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1ZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUsIHNlcmlhbGl6YXRpb25PcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb24oXG4gICAgICAgICAgYFNlcmlhbGl6ZXIgY291bGQgbm90IGJlIGZvdW5kIGZvciBhdHRyaWJ1dGUgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzRmllbGQgPSB0aGlzLmZpZWxkU2VyaWFsaXplci5zZXJpYWxpemUoZmllbGQsIHtcbiAgICAgIHR5cGU6IHJlY29yZC50eXBlXG4gICAgfSkgYXMgc3RyaW5nO1xuXG4gICAgZGVlcFNldChyZXNvdXJjZSwgWydhdHRyaWJ1dGVzJywgcmVzRmllbGRdLCByZXNWYWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VyaWFsaXplUmVsYXRpb25zaGlwcyhcbiAgICByZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCxcbiAgICBtb2RlbDogTW9kZWxEZWZpbml0aW9uXG4gICk6IHZvaWQge1xuICAgIGlmIChyZWNvcmQucmVsYXRpb25zaGlwcykge1xuICAgICAgZm9yIChsZXQgZmllbGQgb2YgT2JqZWN0LmtleXMocmVjb3JkLnJlbGF0aW9uc2hpcHMpKSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXplUmVsYXRpb25zaGlwKHJlc291cmNlLCByZWNvcmQsIGZpZWxkLCBtb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNlcmlhbGl6ZVJlbGF0aW9uc2hpcChcbiAgICByZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCxcbiAgICBmaWVsZDogc3RyaW5nLFxuICAgIG1vZGVsOiBNb2RlbERlZmluaXRpb25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSByZWNvcmQucmVsYXRpb25zaGlwcz8uW2ZpZWxkXS5kYXRhO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1vZGVsLnJlbGF0aW9uc2hpcHM/LltmaWVsZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZXNWYWx1ZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmVzVmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZGVudGl0eVNlcmlhbGl6ZXIgPSB0aGlzLmlkZW50aXR5U2VyaWFsaXplcjtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc1ZhbHVlID0gKHZhbHVlIGFzIFJlY29yZElkZW50aXR5W10pLm1hcCgoaWRlbnRpdHkpID0+XG4gICAgICAgICAgaWRlbnRpdHlTZXJpYWxpemVyLnNlcmlhbGl6ZShpZGVudGl0eSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1ZhbHVlID0gaWRlbnRpdHlTZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzRmllbGQgPSB0aGlzLmZpZWxkU2VyaWFsaXplci5zZXJpYWxpemUoZmllbGQsIHtcbiAgICAgIHR5cGU6IHJlY29yZC50eXBlXG4gICAgfSkgYXMgc3RyaW5nO1xuXG4gICAgZGVlcFNldChyZXNvdXJjZSwgWydyZWxhdGlvbnNoaXBzJywgcmVzRmllbGQsICdkYXRhJ10sIHJlc1ZhbHVlKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICBwcm90ZWN0ZWQgc2VyaWFsaXplTGlua3MoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlLFxuICAgIHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQsXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHNlcmlhbGl6ZU1ldGEoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlLFxuICAgIHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQsXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHt9XG4gIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplQXR0cmlidXRlcyhcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICBtb2RlbDogTW9kZWxEZWZpbml0aW9uXG4gICk6IHZvaWQge1xuICAgIGlmIChyZXNvdXJjZS5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCByZXNGaWVsZCBvZiBPYmplY3Qua2V5cyhyZXNvdXJjZS5hdHRyaWJ1dGVzKSkge1xuICAgICAgICB0aGlzLmRlc2VyaWFsaXplQXR0cmlidXRlKHJlY29yZCwgcmVzb3VyY2UsIHJlc0ZpZWxkLCBtb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplQXR0cmlidXRlKFxuICAgIHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQsXG4gICAgcmVzb3VyY2U6IFJlc291cmNlLFxuICAgIHJlc0ZpZWxkOiBzdHJpbmcsXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHtcbiAgICBjb25zdCByZXNWYWx1ZTogYW55ID0gcmVzb3VyY2UuYXR0cmlidXRlcz8uW3Jlc0ZpZWxkXTtcbiAgICBpZiAocmVzVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzRmllbGQsIHtcbiAgICAgIHR5cGU6IHJlY29yZC50eXBlXG4gICAgfSkgYXMgc3RyaW5nO1xuXG4gICAgY29uc3QgZmllbGRPcHRpb25zID0gbW9kZWwuYXR0cmlidXRlcz8uW2ZpZWxkXTtcbiAgICBpZiAoZmllbGRPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgaWYgKHJlc1ZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBmaWVsZE9wdGlvbnMudHlwZSB8fCAndW5rbm93bic7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gdGhpcy5zZXJpYWxpemVyRm9yKHR5cGUpO1xuICAgICAgaWYgKHNlcmlhbGl6ZXIpIHtcbiAgICAgICAgY29uc3QgZGVzZXJpYWxpemF0aW9uT3B0aW9ucyA9XG4gICAgICAgICAgZmllbGRPcHRpb25zLmRlc2VyaWFsaXphdGlvbiA/P1xuICAgICAgICAgIChmaWVsZE9wdGlvbnMgYXMgYW55KS5kZXNlcmlhbGl6YXRpb25PcHRpb25zO1xuXG4gICAgICAgIGlmICgoZmllbGRPcHRpb25zIGFzIGFueSkuZGVzZXJpYWxpemF0aW9uT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGluIHYwLjE4XG4gICAgICAgICAgZGVwcmVjYXRlKFxuICAgICAgICAgICAgYFRoZSBhdHRyaWJ1dGUgJyR7ZmllbGR9JyBmb3IgJyR7cmVjb3JkLnR5cGV9JyBoYXMgYmVlbiBhc3NpZ25lZCBcXGBkZXNlcmlhbGl6YXRpb25PcHRpb25zXFxgIGluIHRoZSBzY2hlbWEuIFVzZSBcXGBkZXNlcmlhbGl6YXRpb25cXGAgaW5zdGVhZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNWYWx1ZSwgZGVzZXJpYWxpemF0aW9uT3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uKFxuICAgICAgICAgIGBTZXJpYWxpemVyIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgYXR0cmlidXRlIHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlZXBTZXQocmVjb3JkLCBbJ2F0dHJpYnV0ZXMnLCBmaWVsZF0sIHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXNlcmlhbGl6ZVJlbGF0aW9uc2hpcHMoXG4gICAgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZCxcbiAgICByZXNvdXJjZTogUmVzb3VyY2UsXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHtcbiAgICBpZiAocmVzb3VyY2UucmVsYXRpb25zaGlwcykge1xuICAgICAgZm9yIChsZXQgcmVzRmllbGQgb2YgT2JqZWN0LmtleXMocmVzb3VyY2UucmVsYXRpb25zaGlwcykpIHtcbiAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZVJlbGF0aW9uc2hpcChyZWNvcmQsIHJlc291cmNlLCByZXNGaWVsZCwgbW9kZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXNlcmlhbGl6ZVJlbGF0aW9uc2hpcChcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICByZXNGaWVsZDogc3RyaW5nLFxuICAgIG1vZGVsOiBNb2RlbERlZmluaXRpb25cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcmVzVmFsdWU6IGFueSA9IHJlc291cmNlLnJlbGF0aW9uc2hpcHM/LltyZXNGaWVsZF07XG4gICAgaWYgKCFyZXNWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzRmllbGQsIHtcbiAgICAgIHR5cGU6IHJlY29yZC50eXBlXG4gICAgfSkgYXMgc3RyaW5nO1xuXG4gICAgY29uc3QgZmllbGRPcHRpb25zID0gbW9kZWwucmVsYXRpb25zaGlwcz8uW2ZpZWxkXTtcbiAgICBpZiAoZmllbGRPcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzRGF0YSA9IHJlc1ZhbHVlLmRhdGE7XG5cbiAgICBpZiAocmVzRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgZGF0YTtcblxuICAgICAgaWYgKHJlc0RhdGEgPT09IG51bGwpIHtcbiAgICAgICAgZGF0YSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpZGVudGl0eVNlcmlhbGl6ZXIgPSB0aGlzLmlkZW50aXR5U2VyaWFsaXplcjtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNEYXRhKSkge1xuICAgICAgICAgIGRhdGEgPSAocmVzRGF0YSBhcyBSZXNvdXJjZUlkZW50aXR5W10pLm1hcCgocmVzb3VyY2VJZGVudGl0eSkgPT5cbiAgICAgICAgICAgIGlkZW50aXR5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNvdXJjZUlkZW50aXR5KVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF0YSA9IGlkZW50aXR5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNEYXRhIGFzIFJlc291cmNlSWRlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlZXBTZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWVsZCwgJ2RhdGEnXSwgZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IHsgbGlua3MsIG1ldGEgfSA9IHJlc1ZhbHVlO1xuXG4gICAgaWYgKGxpbmtzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlZXBTZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCBmaWVsZCwgJ2xpbmtzJ10sIGxpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWVwU2V0KHJlY29yZCwgWydyZWxhdGlvbnNoaXBzJywgZmllbGQsICdtZXRhJ10sIG1ldGEpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkZXNlcmlhbGl6ZUxpbmtzKFxuICAgIHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQsXG4gICAgcmVzb3VyY2U6IFJlc291cmNlLFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbiAgICBtb2RlbDogTW9kZWxEZWZpbml0aW9uXG4gICk6IHZvaWQge1xuICAgIGlmIChyZXNvdXJjZS5saW5rcykge1xuICAgICAgcmVjb3JkLmxpbmtzID0gcmVzb3VyY2UubGlua3M7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRlc2VyaWFsaXplTWV0YShcbiAgICByZWNvcmQ6IEluaXRpYWxpemVkUmVjb3JkLFxuICAgIHJlc291cmNlOiBSZXNvdXJjZSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICAgbW9kZWw6IE1vZGVsRGVmaW5pdGlvblxuICApOiB2b2lkIHtcbiAgICBpZiAocmVzb3VyY2UubWV0YSkge1xuICAgICAgcmVjb3JkLm1ldGEgPSByZXNvdXJjZS5tZXRhO1xuICAgIH1cbiAgfVxufVxuIl19