@orbit/record-cache
Version:
Orbit base classes used to access and maintain a set of records.
165 lines • 25.1 kB
JavaScript
import { cloneRecordIdentity, equalRecordIdentities, mergeRecords, RecordNotFoundException, recordsInclude } from '@orbit/records';
import { clone, deepGet, deepSet } from '@orbit/utils';
export const AsyncTransformOperators = {
async addRecord(cache, operation,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
options) {
const op = operation;
const { record } = op;
await cache.setRecordAsync(record);
if (cache.keyMap) {
cache.keyMap.pushRecord(record);
}
return record;
},
async updateRecord(cache, operation, options) {
const op = operation;
const { record } = op;
const currentRecord = await cache.getRecordAsync(record);
if (currentRecord === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
const mergedRecord = mergeRecords(currentRecord || null, record);
await cache.setRecordAsync(mergedRecord);
if (cache.keyMap) {
cache.keyMap.pushRecord(mergedRecord);
}
return mergedRecord;
},
async removeRecord(cache, operation, options) {
const op = operation;
const record = await cache.removeRecordAsync(op.record);
if (record === undefined) {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(op.record.type, op.record.id);
}
}
return record;
},
async replaceKey(cache, operation, options) {
const op = operation;
const currentRecord = await cache.getRecordAsync(op.record);
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
deepSet(record, ['keys', op.key], op.value);
await cache.setRecordAsync(record);
if (cache.keyMap) {
cache.keyMap.pushRecord(record);
}
return record;
},
async replaceAttribute(cache, operation, options) {
const op = operation;
const currentRecord = await cache.getRecordAsync(op.record);
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
deepSet(record, ['attributes', op.attribute], op.value);
await cache.setRecordAsync(record);
return record;
},
async addToRelatedRecords(cache, operation, options) {
const op = operation;
const { relationship, relatedRecord } = op;
const currentRecord = await cache.getRecordAsync(op.record);
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
const relatedRecords = deepGet(record, ['relationships', relationship, 'data']) || [];
if (!recordsInclude(relatedRecords, relatedRecord)) {
relatedRecords.push(relatedRecord);
deepSet(record, ['relationships', relationship, 'data'], relatedRecords);
await cache.setRecordAsync(record);
}
return record;
},
async removeFromRelatedRecords(cache, operation, options) {
const op = operation;
const currentRecord = await cache.getRecordAsync(op.record);
const { relationship, relatedRecord } = op;
let record;
if (currentRecord) {
record = clone(currentRecord);
let relatedRecords = deepGet(record, [
'relationships',
relationship,
'data'
]);
if (relatedRecords) {
relatedRecords = relatedRecords.filter((r) => !equalRecordIdentities(r, relatedRecord));
if (deepSet(record, ['relationships', relationship, 'data'], relatedRecords)) {
await cache.setRecordAsync(record);
}
}
return record;
}
else {
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(op.record.type, op.record.id);
}
}
},
async replaceRelatedRecords(cache, operation, options) {
const op = operation;
const currentRecord = await cache.getRecordAsync(op.record);
const { relationship, relatedRecords } = op;
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
if (deepSet(record, ['relationships', relationship, 'data'], relatedRecords)) {
await cache.setRecordAsync(record);
}
return record;
},
async replaceRelatedRecord(cache, operation, options) {
const op = operation;
const currentRecord = await cache.getRecordAsync(op.record);
const { relationship, relatedRecord } = op;
let record;
if (currentRecord) {
record = clone(currentRecord);
}
else {
record = cloneRecordIdentity(op.record);
if (options === null || options === void 0 ? void 0 : options.raiseNotFoundExceptions) {
throw new RecordNotFoundException(record.type, record.id);
}
}
if (deepSet(record, ['relationships', relationship, 'data'], relatedRecord)) {
await cache.setRecordAsync(record);
}
return record;
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdHJhbnNmb3JtLW9wZXJhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVyYXRvcnMvYXN5bmMtdHJhbnNmb3JtLW9wZXJhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUVyQixZQUFZLEVBRVosdUJBQXVCLEVBR3ZCLGNBQWMsRUFRZixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBUSxNQUFNLGNBQWMsQ0FBQztBQVc3RCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUM7SUFDbkUsS0FBSyxDQUFDLFNBQVMsQ0FDYixLQUEwQixFQUMxQixTQUEwQjtJQUMxQiw2REFBNkQ7SUFDN0QsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBK0IsQ0FBQztRQUMzQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDaEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FDaEIsS0FBMEIsRUFDMUIsU0FBMEIsRUFDMUIsT0FBd0I7UUFFeEIsTUFBTSxFQUFFLEdBQUcsU0FBa0MsQ0FBQztRQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDL0IsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFB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QztRQUN0RCxNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVELE1BQU0sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksTUFBeUIsQ0FBQztRQUU5QixJQUFJLGFBQWEsRUFBRTtZQUNqQixNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDTCxNQUFNLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXhDLElBQUksT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLHVCQUF1QixFQUFFO2dCQUNwQyxNQUFNLElBQUksdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDM0Q7U0FDRjtRQUVELElBQ0UsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDLEVBQ3ZFO1lBQ0EsTUFBTSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJ0BvcmJpdC9kYXRhJztcbmltcG9ydCB7XG4gIEFkZFJlY29yZE9wZXJhdGlvbixcbiAgQWRkVG9SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgY2xvbmVSZWNvcmRJZGVudGl0eSxcbiAgZXF1YWxSZWNvcmRJZGVudGl0aWVzLFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgbWVyZ2VSZWNvcmRzLFxuICBSZWNvcmRJZGVudGl0eSxcbiAgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24sXG4gIFJlY29yZE9wZXJhdGlvbixcbiAgUmVjb3JkT3BlcmF0aW9uUmVzdWx0LFxuICByZWNvcmRzSW5jbHVkZSxcbiAgUmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uLFxuICBSZW1vdmVSZWNvcmRPcGVyYXRpb24sXG4gIFJlcGxhY2VBdHRyaWJ1dGVPcGVyYXRpb24sXG4gIFJlcGxhY2VLZXlPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3JkT3BlcmF0aW9uLFxuICBSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb24sXG4gIFVwZGF0ZVJlY29yZE9wZXJhdGlvblxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQgeyBjbG9uZSwgZGVlcEdldCwgZGVlcFNldCwgRGljdCB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5pbXBvcnQgeyBBc3luY1JlY29yZEFjY2Vzc29yIH0gZnJvbSAnLi4vcmVjb3JkLWFjY2Vzc29yJztcblxuZXhwb3J0IGludGVyZmFjZSBBc3luY1RyYW5zZm9ybU9wZXJhdG9yIHtcbiAgKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvblJlc3VsdD47XG59XG5cbmV4cG9ydCBjb25zdCBBc3luY1RyYW5zZm9ybU9wZXJhdG9yczogRGljdDxBc3luY1RyYW5zZm9ybU9wZXJhdG9yPiA9IHtcbiAgYXN5bmMgYWRkUmVjb3JkKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBBZGRSZWNvcmRPcGVyYXRpb247XG4gICAgY29uc3QgeyByZWNvcmQgfSA9IG9wO1xuICAgIGF3YWl0IGNhY2hlLnNldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY2FjaGUua2V5TWFwKSB7XG4gICAgICBjYWNoZS5rZXlNYXAucHVzaFJlY29yZChyZWNvcmQpO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0sXG5cbiAgYXN5bmMgdXBkYXRlUmVjb3JkKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFVwZGF0ZVJlY29yZE9wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lcmdlZFJlY29yZCA9IG1lcmdlUmVjb3JkcyhjdXJyZW50UmVjb3JkIHx8IG51bGwsIHJlY29yZCk7XG5cbiAgICBhd2FpdCBjYWNoZS5zZXRSZWNvcmRBc3luYyhtZXJnZWRSZWNvcmQpO1xuXG4gICAgaWYgKGNhY2hlLmtleU1hcCkge1xuICAgICAgY2FjaGUua2V5TWFwLnB1c2hSZWNvcmQobWVyZ2VkUmVjb3JkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkUmVjb3JkO1xuICB9LFxuXG4gIGFzeW5jIHJlbW92ZVJlY29yZChcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZW1vdmVSZWNvcmRPcGVyYXRpb247XG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgY2FjaGUucmVtb3ZlUmVjb3JkQXN5bmMob3AucmVjb3JkKTtcblxuICAgIGlmIChyZWNvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihvcC5yZWNvcmQudHlwZSwgb3AucmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9LFxuXG4gIGFzeW5jIHJlcGxhY2VLZXkoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgUmVwbGFjZUtleU9wZXJhdGlvbjtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMob3AucmVjb3JkKTtcbiAgICBsZXQgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZDtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICByZWNvcmQgPSBjbG9uZShjdXJyZW50UmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkID0gY2xvbmVSZWNvcmRJZGVudGl0eShvcC5yZWNvcmQpO1xuXG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlZXBTZXQocmVjb3JkLCBbJ2tleXMnLCBvcC5rZXldLCBvcC52YWx1ZSk7XG4gICAgYXdhaXQgY2FjaGUuc2V0UmVjb3JkQXN5bmMocmVjb3JkKTtcblxuICAgIGlmIChjYWNoZS5rZXlNYXApIHtcbiAgICAgIGNhY2hlLmtleU1hcC5wdXNoUmVjb3JkKHJlY29yZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfSxcblxuICBhc3luYyByZXBsYWNlQXR0cmlidXRlKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VBdHRyaWJ1dGVPcGVyYXRpb247XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG4gICAgbGV0IHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQ7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmVjb3JkID0gY2xvbmUoY3VycmVudFJlY29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZCA9IGNsb25lUmVjb3JkSWRlbnRpdHkob3AucmVjb3JkKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWVwU2V0KHJlY29yZCwgWydhdHRyaWJ1dGVzJywgb3AuYXR0cmlidXRlXSwgb3AudmFsdWUpO1xuICAgIGF3YWl0IGNhY2hlLnNldFJlY29yZEFzeW5jKHJlY29yZCk7XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9LFxuXG4gIGFzeW5jIGFkZFRvUmVsYXRlZFJlY29yZHMoXG4gICAgY2FjaGU6IEFzeW5jUmVjb3JkQWNjZXNzb3IsXG4gICAgb3BlcmF0aW9uOiBSZWNvcmRPcGVyYXRpb24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVjb3JkT3BlcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3Qgb3AgPSBvcGVyYXRpb24gYXMgQWRkVG9SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCB7IHJlbGF0aW9uc2hpcCwgcmVsYXRlZFJlY29yZCB9ID0gb3A7XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG4gICAgbGV0IHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQ7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmVjb3JkID0gY2xvbmUoY3VycmVudFJlY29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY29yZCA9IGNsb25lUmVjb3JkSWRlbnRpdHkob3AucmVjb3JkKTtcblxuICAgICAgaWYgKG9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkUmVjb3JkczogUmVjb3JkSWRlbnRpdHlbXSA9XG4gICAgICBkZWVwR2V0KHJlY29yZCwgWydyZWxhdGlvbnNoaXBzJywgcmVsYXRpb25zaGlwLCAnZGF0YSddKSB8fCBbXTtcblxuICAgIGlmICghcmVjb3Jkc0luY2x1ZGUocmVsYXRlZFJlY29yZHMsIHJlbGF0ZWRSZWNvcmQpKSB7XG4gICAgICByZWxhdGVkUmVjb3Jkcy5wdXNoKHJlbGF0ZWRSZWNvcmQpO1xuXG4gICAgICBkZWVwU2V0KHJlY29yZCwgWydyZWxhdGlvbnNoaXBzJywgcmVsYXRpb25zaGlwLCAnZGF0YSddLCByZWxhdGVkUmVjb3Jkcyk7XG4gICAgICBhd2FpdCBjYWNoZS5zZXRSZWNvcmRBc3luYyhyZWNvcmQpO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH0sXG5cbiAgYXN5bmMgcmVtb3ZlRnJvbVJlbGF0ZWRSZWNvcmRzKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlbW92ZUZyb21SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbjtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gYXdhaXQgY2FjaGUuZ2V0UmVjb3JkQXN5bmMob3AucmVjb3JkKTtcbiAgICBjb25zdCB7IHJlbGF0aW9uc2hpcCwgcmVsYXRlZFJlY29yZCB9ID0gb3A7XG4gICAgbGV0IHJlY29yZDogSW5pdGlhbGl6ZWRSZWNvcmQ7XG5cbiAgICBpZiAoY3VycmVudFJlY29yZCkge1xuICAgICAgcmVjb3JkID0gY2xvbmUoY3VycmVudFJlY29yZCk7XG4gICAgICBsZXQgcmVsYXRlZFJlY29yZHM6IFJlY29yZElkZW50aXR5W10gPSBkZWVwR2V0KHJlY29yZCwgW1xuICAgICAgICAncmVsYXRpb25zaGlwcycsXG4gICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgJ2RhdGEnXG4gICAgICBdKTtcbiAgICAgIGlmIChyZWxhdGVkUmVjb3Jkcykge1xuICAgICAgICByZWxhdGVkUmVjb3JkcyA9IHJlbGF0ZWRSZWNvcmRzLmZpbHRlcihcbiAgICAgICAgICAocikgPT4gIWVxdWFsUmVjb3JkSWRlbnRpdGllcyhyLCByZWxhdGVkUmVjb3JkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWVwU2V0KFxuICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgWydyZWxhdGlvbnNoaXBzJywgcmVsYXRpb25zaGlwLCAnZGF0YSddLFxuICAgICAgICAgICAgcmVsYXRlZFJlY29yZHNcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IGNhY2hlLnNldFJlY29yZEFzeW5jKHJlY29yZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ob3AucmVjb3JkLnR5cGUsIG9wLnJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHJlcGxhY2VSZWxhdGVkUmVjb3JkcyhcbiAgICBjYWNoZTogQXN5bmNSZWNvcmRBY2Nlc3NvcixcbiAgICBvcGVyYXRpb246IFJlY29yZE9wZXJhdGlvbixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZWNvcmRPcGVyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBvcCA9IG9wZXJhdGlvbiBhcyBSZXBsYWNlUmVsYXRlZFJlY29yZHNPcGVyYXRpb247XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IGF3YWl0IGNhY2hlLmdldFJlY29yZEFzeW5jKG9wLnJlY29yZCk7XG4gICAgY29uc3QgeyByZWxhdGlvbnNoaXAsIHJlbGF0ZWRSZWNvcmRzIH0gPSBvcDtcbiAgICBsZXQgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZDtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICByZWNvcmQgPSBjbG9uZShjdXJyZW50UmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkID0gY2xvbmVSZWNvcmRJZGVudGl0eShvcC5yZWNvcmQpO1xuXG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRlZXBTZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCByZWxhdGlvbnNoaXAsICdkYXRhJ10sIHJlbGF0ZWRSZWNvcmRzKVxuICAgICkge1xuICAgICAgYXdhaXQgY2FjaGUuc2V0UmVjb3JkQXN5bmMocmVjb3JkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9LFxuXG4gIGFzeW5jIHJlcGxhY2VSZWxhdGVkUmVjb3JkKFxuICAgIGNhY2hlOiBBc3luY1JlY29yZEFjY2Vzc29yLFxuICAgIG9wZXJhdGlvbjogUmVjb3JkT3BlcmF0aW9uLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlY29yZE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IG9wID0gb3BlcmF0aW9uIGFzIFJlcGxhY2VSZWxhdGVkUmVjb3JkT3BlcmF0aW9uO1xuICAgIGNvbnN0IGN1cnJlbnRSZWNvcmQgPSBhd2FpdCBjYWNoZS5nZXRSZWNvcmRBc3luYyhvcC5yZWNvcmQpO1xuICAgIGNvbnN0IHsgcmVsYXRpb25zaGlwLCByZWxhdGVkUmVjb3JkIH0gPSBvcDtcbiAgICBsZXQgcmVjb3JkOiBJbml0aWFsaXplZFJlY29yZDtcblxuICAgIGlmIChjdXJyZW50UmVjb3JkKSB7XG4gICAgICByZWNvcmQgPSBjbG9uZShjdXJyZW50UmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVjb3JkID0gY2xvbmVSZWNvcmRJZGVudGl0eShvcC5yZWNvcmQpO1xuXG4gICAgICBpZiAob3B0aW9ucz8ucmFpc2VOb3RGb3VuZEV4Y2VwdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlY29yZE5vdEZvdW5kRXhjZXB0aW9uKHJlY29yZC50eXBlLCByZWNvcmQuaWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRlZXBTZXQocmVjb3JkLCBbJ3JlbGF0aW9uc2hpcHMnLCByZWxhdGlvbnNoaXAsICdkYXRhJ10sIHJlbGF0ZWRSZWNvcmQpXG4gICAgKSB7XG4gICAgICBhd2FpdCBjYWNoZS5zZXRSZWNvcmRBc3luYyhyZWNvcmQpO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cbn07XG4iXX0=