UNPKG

@orbit/jsonapi

Version:

JSON:API support for Orbit.

173 lines 29.8 kB
import { toArray } from '@orbit/utils'; import { cloneRecordIdentity, RecordNotFoundException } from '@orbit/records'; import { buildTransform } from '@orbit/data'; import { JSONAPISerializers } from '../serializers/jsonapi-serializers'; export function getQueryRequests(requestProcessor, query) { const requests = []; for (let expression of toArray(query.expressions)) { const request = ExpressionToRequestMap[expression.op](expression, requestProcessor); const options = requestProcessor.mergeRequestOptions([ request.options, query.options, expression.options ]); if (options) request.options = options; requests.push(request); } return requests; } const ExpressionToRequestMap = { findRecord(expression) { const exp = expression; return { op: 'findRecord', record: cloneRecordIdentity(exp.record) }; }, findRecords(expression) { const exp = expression; const { filter, sort, page } = exp; return { op: 'findRecords', type: exp.type, options: { filter, sort, page } }; }, findRelatedRecord(expression) { const exp = expression; return { op: 'findRelatedRecord', record: cloneRecordIdentity(exp.record), relationship: exp.relationship }; }, findRelatedRecords(expression) { const exp = expression; const { filter, sort, page } = exp; return { op: 'findRelatedRecords', record: cloneRecordIdentity(exp.record), relationship: exp.relationship, options: { filter, sort, page } }; } }; export const QueryRequestProcessors = { async findRecord(requestProcessor, request) { var _a, _b, _c; const { record } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.resourceURL(record.type, record.id); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); const transforms = [buildTransform(operations)]; return { transforms, data: recordDoc.data, details }; } else { if ((_c = request.options) === null || _c === void 0 ? void 0 : _c.raiseNotFoundExceptions) { throw new RecordNotFoundException(record.type, record.id); } return { transforms: [] }; } }, async findRecords(requestProcessor, request) { var _a, _b; const { type } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.resourceURL(type); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); const transforms = [buildTransform(operations)]; return { transforms, data: recordDoc.data, details }; } else { return { transforms: [] }; } }, async findRelatedRecord(requestProcessor, request) { var _a, _b, _c; const { record, relationship } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.relatedResourceURL(record.type, record.id, relationship); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const relatedRecord = recordDoc.data; const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); operations.push({ op: 'replaceRelatedRecord', record, relationship, relatedRecord }); const transforms = [buildTransform(operations)]; return { transforms, data: relatedRecord, details }; } else { if ((_c = request.options) === null || _c === void 0 ? void 0 : _c.raiseNotFoundExceptions) { throw new RecordNotFoundException(record.type, record.id); } return { transforms: [] }; } }, async findRelatedRecords(requestProcessor, request) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; const { record, relationship } = request; const settings = requestProcessor.buildFetchSettings(request); const url = (_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : requestProcessor.urlBuilder.relatedResourceURL(record.type, record.id, relationship); const details = await requestProcessor.fetch(url, settings); const { document } = details; requestProcessor.preprocessResponseDocument(document, request); if (document) { const serializer = requestProcessor.serializerFor(JSONAPISerializers.ResourceDocument); const recordDoc = serializer.deserialize(document); const relatedRecords = recordDoc.data; const operations = requestProcessor.operationsFromDeserializedDocument(recordDoc); const partialSet = (_d = (_c = request.options) === null || _c === void 0 ? void 0 : _c.partialSet) !== null && _d !== void 0 ? _d : !!(((_e = request.options) === null || _e === void 0 ? void 0 : _e.filter) || ((_f = request.options) === null || _f === void 0 ? void 0 : _f.page) || ((_g = recordDoc.links) === null || _g === void 0 ? void 0 : _g.next) || ((_h = recordDoc.links) === null || _h === void 0 ? void 0 : _h.prev)); if (partialSet) { for (let relatedRecord of relatedRecords) { operations.push({ op: 'addToRelatedRecords', record, relationship, relatedRecord }); } } else { operations.push({ op: 'replaceRelatedRecords', record, relationship, relatedRecords }); } const transforms = [buildTransform(operations)]; return { transforms, data: relatedRecords, details }; } else { if ((_j = request.options) === null || _j === void 0 ? void 0 : _j.raiseNotFoundExceptions) { throw new RecordNotFoundException(record.type, record.id); } return { transforms: [] }; } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcmVxdWVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3F1ZXJ5LXJlcXVlc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBUSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQVdMLG1CQUFtQixFQUduQix1QkFBdUIsRUFDeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLGFBQWEsQ0FBQztBQUczRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW1EeEUsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixnQkFBeUMsRUFDekMsS0FBa0I7SUFFbEIsTUFBTSxRQUFRLEdBQXlCLEVBQUUsQ0FBQztJQUUxQyxLQUFLLElBQUksVUFBVSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDakQsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUNuRCxVQUFtQyxFQUNuQyxnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO1lBQ25ELE9BQU8sQ0FBQyxPQUFPO1lBQ2YsS0FBSyxDQUFDLE9BQU87WUFDYixVQUFVLENBQUMsT0FBTztTQUNuQixDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU87WUFBRSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQVNELE1BQU0sc0JBQXNCLEdBQXVDO0lBQ2pFLFVBQVUsQ0FBQyxVQUFpQztRQUMxQyxNQUFNLEdBQUcsR0FBRyxVQUF3QixDQUFDO1FBQ3JDLE9BQU87WUFDTCxFQUFFLEVBQUUsWUFB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RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgdG9BcnJheSB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5pbXBvcnQge1xuICBSZWNvcmRRdWVyeSxcbiAgQWRkVG9SZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgUmVwbGFjZVJlbGF0ZWRSZWNvcmRPcGVyYXRpb24sXG4gIFJlcGxhY2VSZWxhdGVkUmVjb3Jkc09wZXJhdGlvbixcbiAgRmluZFJlY29yZCxcbiAgRmluZFJlY29yZHMsXG4gIEZpbmRSZWxhdGVkUmVjb3JkLFxuICBGaW5kUmVsYXRlZFJlY29yZHMsXG4gIFJlY29yZElkZW50aXR5LFxuICBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gIGNsb25lUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZE9wZXJhdGlvbixcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uUmVzdWx0LFxuICBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvblxufSBmcm9tICdAb3JiaXQvcmVjb3Jkcyc7XG5pbXBvcnQgeyBidWlsZFRyYW5zZm9ybSwgRnVsbFJlc3BvbnNlIH0gZnJvbSAnQG9yYml0L2RhdGEnO1xuaW1wb3J0IHsgSlNPTkFQSVJlcXVlc3RQcm9jZXNzb3IgfSBmcm9tICcuLi9qc29uYXBpLXJlcXVlc3QtcHJvY2Vzc29yJztcbmltcG9ydCB7IEpTT05BUElSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vanNvbmFwaS1yZXF1ZXN0LW9wdGlvbnMnO1xuaW1wb3J0IHsgSlNPTkFQSVNlcmlhbGl6ZXJzIH0gZnJvbSAnLi4vc2VyaWFsaXplcnMvanNvbmFwaS1zZXJpYWxpemVycyc7XG5pbXBvcnQgeyBKU09OQVBJRG9jdW1lbnRTZXJpYWxpemVyIH0gZnJvbSAnLi4vc2VyaWFsaXplcnMvanNvbmFwaS1kb2N1bWVudC1zZXJpYWxpemVyJztcbmltcG9ydCB7IFJlY29yZERvY3VtZW50IH0gZnJvbSAnLi4vcmVjb3JkLWRvY3VtZW50JztcbmltcG9ydCB7IEpTT05BUElSZXNwb25zZSB9IGZyb20gJy4uL2pzb25hcGktcmVzcG9uc2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5UmVxdWVzdCB7XG4gIG9wOiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBKU09OQVBJUmVxdWVzdE9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZFJlY29yZFJlcXVlc3QgZXh0ZW5kcyBRdWVyeVJlcXVlc3Qge1xuICBvcDogJ2ZpbmRSZWNvcmQnO1xuICByZWNvcmQ6IFJlY29yZElkZW50aXR5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRSZWNvcmRzUmVxdWVzdCBleHRlbmRzIFF1ZXJ5UmVxdWVzdCB7XG4gIG9wOiAnZmluZFJlY29yZHMnO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZFJlbGF0ZWRSZWNvcmRSZXF1ZXN0IGV4dGVuZHMgUXVlcnlSZXF1ZXN0IHtcbiAgb3A6ICdmaW5kUmVsYXRlZFJlY29yZCc7XG4gIHJlY29yZDogUmVjb3JkSWRlbnRpdHk7XG4gIHJlbGF0aW9uc2hpcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRSZWxhdGVkUmVjb3Jkc1JlcXVlc3QgZXh0ZW5kcyBRdWVyeVJlcXVlc3Qge1xuICBvcDogJ2ZpbmRSZWxhdGVkUmVjb3Jkcyc7XG4gIHJlY29yZDogUmVjb3JkSWRlbnRpdHk7XG4gIHJlbGF0aW9uc2hpcDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZWNvcmRRdWVyeVJlcXVlc3QgPVxuICB8IEZpbmRSZWNvcmRSZXF1ZXN0XG4gIHwgRmluZFJlY29yZHNSZXF1ZXN0XG4gIHwgRmluZFJlbGF0ZWRSZWNvcmRSZXF1ZXN0XG4gIHwgRmluZFJlbGF0ZWRSZWNvcmRzUmVxdWVzdDtcblxuZXhwb3J0IHR5cGUgUXVlcnlSZXF1ZXN0UHJvY2Vzc29yUmVzcG9uc2UgPSBGdWxsUmVzcG9uc2U8XG4gIFJlY29yZFF1ZXJ5RXhwcmVzc2lvblJlc3VsdCxcbiAgSlNPTkFQSVJlc3BvbnNlLFxuICBSZWNvcmRPcGVyYXRpb25cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlSZXF1ZXN0UHJvY2Vzc29yIHtcbiAgKFxuICAgIHJlcXVlc3RQcm9jZXNzb3I6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yLFxuICAgIHJlcXVlc3Q6IFJlY29yZFF1ZXJ5UmVxdWVzdFxuICApOiBQcm9taXNlPFF1ZXJ5UmVxdWVzdFByb2Nlc3NvclJlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXJ5UmVxdWVzdHMoXG4gIHJlcXVlc3RQcm9jZXNzb3I6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yLFxuICBxdWVyeTogUmVjb3JkUXVlcnlcbik6IFJlY29yZFF1ZXJ5UmVxdWVzdFtdIHtcbiAgY29uc3QgcmVxdWVzdHM6IFJlY29yZFF1ZXJ5UmVxdWVzdFtdID0gW107XG5cbiAgZm9yIChsZXQgZXhwcmVzc2lvbiBvZiB0b0FycmF5KHF1ZXJ5LmV4cHJlc3Npb25zKSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBFeHByZXNzaW9uVG9SZXF1ZXN0TWFwW2V4cHJlc3Npb24ub3BdKFxuICAgICAgZXhwcmVzc2lvbiBhcyBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgICByZXF1ZXN0UHJvY2Vzc29yXG4gICAgKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1ZXN0UHJvY2Vzc29yLm1lcmdlUmVxdWVzdE9wdGlvbnMoW1xuICAgICAgcmVxdWVzdC5vcHRpb25zLFxuICAgICAgcXVlcnkub3B0aW9ucyxcbiAgICAgIGV4cHJlc3Npb24ub3B0aW9uc1xuICAgIF0pO1xuICAgIGlmIChvcHRpb25zKSByZXF1ZXN0Lm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgcmVxdWVzdHMucHVzaChyZXF1ZXN0KTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc2lvblRvUmVxdWVzdENvbnZlcnRlciB7XG4gIChcbiAgICBleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24sXG4gICAgcmVxdWVzdFByb2Nlc3NvcjogSlNPTkFQSVJlcXVlc3RQcm9jZXNzb3JcbiAgKTogUmVjb3JkUXVlcnlSZXF1ZXN0O1xufVxuXG5jb25zdCBFeHByZXNzaW9uVG9SZXF1ZXN0TWFwOiBEaWN0PEV4cHJlc3Npb25Ub1JlcXVlc3RDb252ZXJ0ZXI+ID0ge1xuICBmaW5kUmVjb3JkKGV4cHJlc3Npb246IFJlY29yZFF1ZXJ5RXhwcmVzc2lvbik6IEZpbmRSZWNvcmRSZXF1ZXN0IHtcbiAgICBjb25zdCBleHAgPSBleHByZXNzaW9uIGFzIEZpbmRSZWNvcmQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnZmluZFJlY29yZCcsXG4gICAgICByZWNvcmQ6IGNsb25lUmVjb3JkSWRlbnRpdHkoZXhwLnJlY29yZClcbiAgICB9O1xuICB9LFxuICBmaW5kUmVjb3JkcyhleHByZXNzaW9uOiBSZWNvcmRRdWVyeUV4cHJlc3Npb24pOiBGaW5kUmVjb3Jkc1JlcXVlc3Qge1xuICAgIGNvbnN0IGV4cCA9IGV4cHJlc3Npb24gYXMgRmluZFJlY29yZHM7XG4gICAgY29uc3QgeyBmaWx0ZXIsIHNvcnQsIHBhZ2UgfSA9IGV4cDtcbiAgICByZXR1cm4ge1xuICAgICAgb3A6ICdmaW5kUmVjb3JkcycsXG4gICAgICB0eXBlOiBleHAudHlwZSBhcyBzdHJpbmcsXG4gICAgICBvcHRpb25zOiB7IGZpbHRlciwgc29ydCwgcGFnZSB9XG4gICAgfTtcbiAgfSxcbiAgZmluZFJlbGF0ZWRSZWNvcmQoXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uXG4gICk6IEZpbmRSZWxhdGVkUmVjb3JkUmVxdWVzdCB7XG4gICAgY29uc3QgZXhwID0gZXhwcmVzc2lvbiBhcyBGaW5kUmVsYXRlZFJlY29yZDtcbiAgICByZXR1cm4ge1xuICAgICAgb3A6ICdmaW5kUmVsYXRlZFJlY29yZCcsXG4gICAgICByZWNvcmQ6IGNsb25lUmVjb3JkSWRlbnRpdHkoZXhwLnJlY29yZCksXG4gICAgICByZWxhdGlvbnNoaXA6IGV4cC5yZWxhdGlvbnNoaXBcbiAgICB9O1xuICB9LFxuICBmaW5kUmVsYXRlZFJlY29yZHMoXG4gICAgZXhwcmVzc2lvbjogUmVjb3JkUXVlcnlFeHByZXNzaW9uXG4gICk6IEZpbmRSZWxhdGVkUmVjb3Jkc1JlcXVlc3Qge1xuICAgIGNvbnN0IGV4cCA9IGV4cHJlc3Npb24gYXMgRmluZFJlbGF0ZWRSZWNvcmRzO1xuICAgIGNvbnN0IHsgZmlsdGVyLCBzb3J0LCBwYWdlIH0gPSBleHA7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnZmluZFJlbGF0ZWRSZWNvcmRzJyxcbiAgICAgIHJlY29yZDogY2xvbmVSZWNvcmRJZGVudGl0eShleHAucmVjb3JkKSxcbiAgICAgIHJlbGF0aW9uc2hpcDogZXhwLnJlbGF0aW9uc2hpcCxcbiAgICAgIG9wdGlvbnM6IHsgZmlsdGVyLCBzb3J0LCBwYWdlIH1cbiAgICB9O1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgUXVlcnlSZXF1ZXN0UHJvY2Vzc29yczogRGljdDxRdWVyeVJlcXVlc3RQcm9jZXNzb3I+ID0ge1xuICBhc3luYyBmaW5kUmVjb3JkKFxuICAgIHJlcXVlc3RQcm9jZXNzb3I6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yLFxuICAgIHJlcXVlc3Q6IFJlY29yZFF1ZXJ5UmVxdWVzdFxuICApOiBQcm9taXNlPFF1ZXJ5UmVxdWVzdFByb2Nlc3NvclJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyByZWNvcmQgfSA9IHJlcXVlc3QgYXMgRmluZFJlY29yZFJlcXVlc3Q7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSByZXF1ZXN0UHJvY2Vzc29yLmJ1aWxkRmV0Y2hTZXR0aW5ncyhyZXF1ZXN0KTtcbiAgICBjb25zdCB1cmwgPVxuICAgICAgcmVxdWVzdC5vcHRpb25zPy51cmwgPz9cbiAgICAgIHJlcXVlc3RQcm9jZXNzb3IudXJsQnVpbGRlci5yZXNvdXJjZVVSTChyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcblxuICAgIGNvbnN0IGRldGFpbHMgPSBhd2FpdCByZXF1ZXN0UHJvY2Vzc29yLmZldGNoKHVybCwgc2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgZG9jdW1lbnQgfSA9IGRldGFpbHM7XG4gICAgcmVxdWVzdFByb2Nlc3Nvci5wcmVwcm9jZXNzUmVzcG9uc2VEb2N1bWVudChkb2N1bWVudCwgcmVxdWVzdCk7XG5cbiAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSByZXF1ZXN0UHJvY2Vzc29yLnNlcmlhbGl6ZXJGb3IoXG4gICAgICAgIEpTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZURvY3VtZW50XG4gICAgICApIGFzIEpTT05BUElEb2N1bWVudFNlcmlhbGl6ZXI7XG4gICAgICBjb25zdCByZWNvcmREb2MgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGRvY3VtZW50KSBhcyBSZWNvcmREb2N1bWVudDtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSByZXF1ZXN0UHJvY2Vzc29yLm9wZXJhdGlvbnNGcm9tRGVzZXJpYWxpemVkRG9jdW1lbnQoXG4gICAgICAgIHJlY29yZERvY1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBbYnVpbGRUcmFuc2Zvcm08UmVjb3JkT3BlcmF0aW9uPihvcGVyYXRpb25zKV07XG5cbiAgICAgIHJldHVybiB7IHRyYW5zZm9ybXMsIGRhdGE6IHJlY29yZERvYy5kYXRhLCBkZXRhaWxzIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXF1ZXN0Lm9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHRyYW5zZm9ybXM6IFtdIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGZpbmRSZWNvcmRzKFxuICAgIHJlcXVlc3RQcm9jZXNzb3I6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yLFxuICAgIHJlcXVlc3Q6IFJlY29yZFF1ZXJ5UmVxdWVzdFxuICApOiBQcm9taXNlPFF1ZXJ5UmVxdWVzdFByb2Nlc3NvclJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyB0eXBlIH0gPSByZXF1ZXN0IGFzIEZpbmRSZWNvcmRzUmVxdWVzdDtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHJlcXVlc3RQcm9jZXNzb3IuYnVpbGRGZXRjaFNldHRpbmdzKHJlcXVlc3QpO1xuICAgIGNvbnN0IHVybCA9XG4gICAgICByZXF1ZXN0Lm9wdGlvbnM/LnVybCA/PyByZXF1ZXN0UHJvY2Vzc29yLnVybEJ1aWxkZXIucmVzb3VyY2VVUkwodHlwZSk7XG5cbiAgICBjb25zdCBkZXRhaWxzID0gYXdhaXQgcmVxdWVzdFByb2Nlc3Nvci5mZXRjaCh1cmwsIHNldHRpbmdzKTtcbiAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBkZXRhaWxzO1xuICAgIHJlcXVlc3RQcm9jZXNzb3IucHJlcHJvY2Vzc1Jlc3BvbnNlRG9jdW1lbnQoZG9jdW1lbnQsIHJlcXVlc3QpO1xuXG4gICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVyID0gcmVxdWVzdFByb2Nlc3Nvci5zZXJpYWxpemVyRm9yKFxuICAgICAgICBKU09OQVBJU2VyaWFsaXplcnMuUmVzb3VyY2VEb2N1bWVudFxuICAgICAgKSBhcyBKU09OQVBJRG9jdW1lbnRTZXJpYWxpemVyO1xuICAgICAgY29uc3QgcmVjb3JkRG9jID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkb2N1bWVudCkgYXMgUmVjb3JkRG9jdW1lbnQ7XG4gICAgICBjb25zdCBvcGVyYXRpb25zID0gcmVxdWVzdFByb2Nlc3Nvci5vcGVyYXRpb25zRnJvbURlc2VyaWFsaXplZERvY3VtZW50KFxuICAgICAgICByZWNvcmREb2NcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1zID0gW2J1aWxkVHJhbnNmb3JtKG9wZXJhdGlvbnMpXTtcblxuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtcywgZGF0YTogcmVjb3JkRG9jLmRhdGEsIGRldGFpbHMgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgdHJhbnNmb3JtczogW10gfTtcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgZmluZFJlbGF0ZWRSZWNvcmQoXG4gICAgcmVxdWVzdFByb2Nlc3NvcjogSlNPTkFQSVJlcXVlc3RQcm9jZXNzb3IsXG4gICAgcmVxdWVzdDogUmVjb3JkUXVlcnlSZXF1ZXN0XG4gICk6IFByb21pc2U8UXVlcnlSZXF1ZXN0UHJvY2Vzc29yUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHJlY29yZCwgcmVsYXRpb25zaGlwIH0gPSByZXF1ZXN0IGFzIEZpbmRSZWxhdGVkUmVjb3JkUmVxdWVzdDtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHJlcXVlc3RQcm9jZXNzb3IuYnVpbGRGZXRjaFNldHRpbmdzKHJlcXVlc3QpO1xuICAgIGNvbnN0IHVybCA9XG4gICAgICByZXF1ZXN0Lm9wdGlvbnM/LnVybCA/P1xuICAgICAgcmVxdWVzdFByb2Nlc3Nvci51cmxCdWlsZGVyLnJlbGF0ZWRSZXNvdXJjZVVSTChcbiAgICAgICAgcmVjb3JkLnR5cGUsXG4gICAgICAgIHJlY29yZC5pZCxcbiAgICAgICAgcmVsYXRpb25zaGlwXG4gICAgICApO1xuXG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IHJlcXVlc3RQcm9jZXNzb3IuZmV0Y2godXJsLCBzZXR0aW5ncyk7XG4gICAgY29uc3QgeyBkb2N1bWVudCB9ID0gZGV0YWlscztcbiAgICByZXF1ZXN0UHJvY2Vzc29yLnByZXByb2Nlc3NSZXNwb25zZURvY3VtZW50KGRvY3VtZW50LCByZXF1ZXN0KTtcblxuICAgIGlmIChkb2N1bWVudCkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHJlcXVlc3RQcm9jZXNzb3Iuc2VyaWFsaXplckZvcihcbiAgICAgICAgSlNPTkFQSVNlcmlhbGl6ZXJzLlJlc291cmNlRG9jdW1lbnRcbiAgICAgICkgYXMgSlNPTkFQSURvY3VtZW50U2VyaWFsaXplcjtcbiAgICAgIGNvbnN0IHJlY29yZERvYyA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZG9jdW1lbnQpIGFzIFJlY29yZERvY3VtZW50O1xuICAgICAgY29uc3QgcmVsYXRlZFJlY29yZCA9IHJlY29yZERvYy5kYXRhO1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHJlcXVlc3RQcm9jZXNzb3Iub3BlcmF0aW9uc0Zyb21EZXNlcmlhbGl6ZWREb2N1bWVudChcbiAgICAgICAgcmVjb3JkRG9jXG4gICAgICApO1xuICAgICAgb3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgb3A6ICdyZXBsYWNlUmVsYXRlZFJlY29yZCcsXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICByZWxhdGVkUmVjb3JkXG4gICAgICB9IGFzIFJlcGxhY2VSZWxhdGVkUmVjb3JkT3BlcmF0aW9uKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBbYnVpbGRUcmFuc2Zvcm0ob3BlcmF0aW9ucyldO1xuXG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm1zLCBkYXRhOiByZWxhdGVkUmVjb3JkLCBkZXRhaWxzIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXF1ZXN0Lm9wdGlvbnM/LnJhaXNlTm90Rm91bmRFeGNlcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWNvcmROb3RGb3VuZEV4Y2VwdGlvbihyZWNvcmQudHlwZSwgcmVjb3JkLmlkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHRyYW5zZm9ybXM6IFtdIH07XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIGZpbmRSZWxhdGVkUmVjb3JkcyhcbiAgICByZXF1ZXN0UHJvY2Vzc29yOiBKU09OQVBJUmVxdWVzdFByb2Nlc3NvcixcbiAgICByZXF1ZXN0OiBSZWNvcmRRdWVyeVJlcXVlc3RcbiAgKTogUHJvbWlzZTxRdWVyeVJlcXVlc3RQcm9jZXNzb3JSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcmVjb3JkLCByZWxhdGlvbnNoaXAgfSA9IHJlcXVlc3QgYXMgRmluZFJlbGF0ZWRSZWNvcmRzUmVxdWVzdDtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHJlcXVlc3RQcm9jZXNzb3IuYnVpbGRGZXRjaFNldHRpbmdzKHJlcXVlc3QpO1xuICAgIGNvbnN0IHVybCA9XG4gICAgICByZXF1ZXN0Lm9wdGlvbnM/LnVybCA/P1xuICAgICAgcmVxdWVzdFByb2Nlc3Nvci51cmxCdWlsZGVyLnJlbGF0ZWRSZXNvdXJjZVVSTChcbiAgICAgICAgcmVjb3JkLnR5cGUsXG4gICAgICAgIHJlY29yZC5pZCxcbiAgICAgICAgcmVsYXRpb25zaGlwXG4gICAgICApO1xuXG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IHJlcXVlc3RQcm9jZXNzb3IuZmV0Y2godXJsLCBzZXR0aW5ncyk7XG4gICAgY29uc3QgeyBkb2N1bWVudCB9ID0gZGV0YWlscztcbiAgICByZXF1ZXN0UHJvY2Vzc29yLnByZXByb2Nlc3NSZXNwb25zZURvY3VtZW50KGRvY3VtZW50LCByZXF1ZXN0KTtcblxuICAgIGlmIChkb2N1bWVudCkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplciA9IHJlcXVlc3RQcm9jZXNzb3Iuc2VyaWFsaXplckZvcihcbiAgICAgICAgSlNPTkFQSVNlcmlhbGl6ZXJzLlJlc291cmNlRG9jdW1lbnRcbiAgICAgICkgYXMgSlNPTkFQSURvY3VtZW50U2VyaWFsaXplcjtcbiAgICAgIGNvbnN0IHJlY29yZERvYyA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZG9jdW1lbnQpIGFzIFJlY29yZERvY3VtZW50O1xuICAgICAgY29uc3QgcmVsYXRlZFJlY29yZHMgPSByZWNvcmREb2MuZGF0YSBhcyBSZWNvcmRJZGVudGl0eVtdO1xuICAgICAgY29uc3Qgb3BlcmF0aW9ucyA9IHJlcXVlc3RQcm9jZXNzb3Iub3BlcmF0aW9uc0Zyb21EZXNlcmlhbGl6ZWREb2N1bWVudChcbiAgICAgICAgcmVjb3JkRG9jXG4gICAgICApO1xuXG4gICAgICBjb25zdCBwYXJ0aWFsU2V0ID1cbiAgICAgICAgcmVxdWVzdC5vcHRpb25zPy5wYXJ0aWFsU2V0ID8/XG4gICAgICAgICEhKFxuICAgICAgICAgIHJlcXVlc3Qub3B0aW9ucz8uZmlsdGVyIHx8XG4gICAgICAgICAgcmVxdWVzdC5vcHRpb25zPy5wYWdlIHx8XG4gICAgICAgICAgcmVjb3JkRG9jLmxpbmtzPy5uZXh0IHx8XG4gICAgICAgICAgcmVjb3JkRG9jLmxpbmtzPy5wcmV2XG4gICAgICAgICk7XG5cbiAgICAgIGlmIChwYXJ0aWFsU2V0KSB7XG4gICAgICAgIGZvciAobGV0IHJlbGF0ZWRSZWNvcmQgb2YgcmVsYXRlZFJlY29yZHMpIHtcbiAgICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgb3A6ICdhZGRUb1JlbGF0ZWRSZWNvcmRzJyxcbiAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCxcbiAgICAgICAgICAgIHJlbGF0ZWRSZWNvcmRcbiAgICAgICAgICB9IGFzIEFkZFRvUmVsYXRlZFJlY29yZHNPcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcGVyYXRpb25zLnB1c2goe1xuICAgICAgICAgIG9wOiAncmVwbGFjZVJlbGF0ZWRSZWNvcmRzJyxcbiAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgcmVsYXRpb25zaGlwLFxuICAgICAgICAgIHJlbGF0ZWRSZWNvcmRzXG4gICAgICAgIH0gYXMgUmVwbGFjZVJlbGF0ZWRSZWNvcmRzT3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zZm9ybXMgPSBbYnVpbGRUcmFuc2Zvcm0ob3BlcmF0aW9ucyldO1xuXG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm1zLCBkYXRhOiByZWxhdGVkUmVjb3JkcywgZGV0YWlscyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVxdWVzdC5vcHRpb25zPy5yYWlzZU5vdEZvdW5kRXhjZXB0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkTm90Rm91bmRFeGNlcHRpb24ocmVjb3JkLnR5cGUsIHJlY29yZC5pZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm1zOiBbXSB9O1xuICAgIH1cbiAgfVxufTtcbiJdfQ==