@energica-city/shared-amplify-utils
Version:
Shared utilities for AWS Amplify projects
136 lines • 18.6 kB
JavaScript
import { throwError } from '../error';
import { logger } from '../log';
import { ClientManager } from './ClientManager';
import { logOperation, logSuccess, validateAndReturn } from './helpers';
/**
* Creates type-safe CRUD operations for AWS Amplify Data models.
*
* @example
* ```typescript
* import { QueryFactory, initializeQueries } from '@your-package/queries';
* import { MainTypes } from './schema';
* import outputs from './amplify_outputs.json';
*
* // Initialize once at startup
* await initializeQueries<MainTypes>(outputs);
*
* // Create QueryFactory for any model
* const UserQueries = await QueryFactory<'User', MainTypes>({
* name: 'User'
* });
* ```
*/
export const QueryFactory = async function (config) {
const { name, clientKey = 'default' } = config;
const nameStr = String(name);
// Get the initialized client
const client = await getInitializedClient(nameStr, clientKey);
const model = getModelFromClient(client, nameStr);
// Return CRUD operations
return {
create: createOperation(model, nameStr),
update: updateOperation(model, nameStr),
delete: deleteOperation(model, nameStr),
get: getOperation(model, nameStr),
list: listOperation(model, nameStr),
};
};
// Helper functions to break down the QueryFactory complexity
async function getInitializedClient(nameStr, clientKey) {
try {
const manager = ClientManager.getInstance(clientKey);
return await manager.getClient();
}
catch (error) {
throw throwError(`Failed to resolve client for model: ${nameStr}. Make sure to call initializeQueries() first.`, error);
}
}
function getModelFromClient(client, nameStr) {
const modelRef = client.models[nameStr];
if (!modelRef) {
throw throwError(`Model "${nameStr}" not found in client models. Available models: ${Object.keys(client.models).join(', ')}`);
}
return modelRef;
}
function createOperation(model, nameStr) {
return async (props) => {
try {
const { input } = props;
logOperation(nameStr, 'create', input);
const response = await model.create(input);
const data = validateAndReturn(response, 'create', input);
logSuccess('create');
return data;
}
catch (error) {
throw throwError(`${nameStr} could not be created`, error);
}
};
}
function updateOperation(model, nameStr) {
return async (props) => {
try {
const { input } = props;
logOperation(nameStr, 'update', input);
const response = await model.update(input);
const data = validateAndReturn(response, 'update', input);
logSuccess('update');
return data;
}
catch (error) {
throw throwError(`${nameStr} could not be updated`, error);
}
};
}
function deleteOperation(model, nameStr) {
return async (props) => {
try {
const { input } = props;
logOperation(nameStr, 'delete', input);
const response = await model.delete(input);
const data = validateAndReturn(response, 'delete', input);
logSuccess('delete');
return data;
}
catch (error) {
throw throwError(`${nameStr} could not be deleted`, error);
}
};
}
function getOperation(model, nameStr) {
return async (props) => {
try {
const { input } = props;
logOperation(nameStr, 'get', input);
const response = await model.get(input);
const data = validateAndReturn(response, 'get', input);
logSuccess('get');
return data;
}
catch (error) {
throw throwError(`${nameStr} could not be retrieved`, error);
}
};
}
function listOperation(model, nameStr) {
return async () => {
try {
logOperation(nameStr, 'list');
const response = await model.list();
const { data, errors } = response;
if (errors && errors.length > 0) {
logger.error(`GraphQL errors during ${nameStr} list operation`, {
errors,
});
throw throwError(`${nameStr} list failed`, errors);
}
const result = data || [];
logSuccess('list', { count: result.length });
return result;
}
catch (error) {
throw throwError(`${nameStr} list could not be retrieved`, error);
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcXVlcmllcy9RdWVyeUZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlCeEU7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssV0FHL0IsTUFBNkI7SUFDN0IsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEdBQUcsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQy9DLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU3Qiw2QkFBNkI7SUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWxELHlCQUF5QjtJQUN6QixPQUFPO1FBQ0wsTUFBTSxFQUFFLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztRQUN2QyxNQUFNLEVBQUUsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7UUFDdkMsR0FBRyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO1FBQ2pDLElBQUksRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztLQUNwQyxDQUFDO0FBQ0osQ0FBQyxD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LENBQUM7WUFDcEMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUM7WUFFbEMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsT0FBTyxpQkFBaUIsRUFBRTtvQkFDOUQsTUFBTTtpQkFDUCxDQUFDLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLENBQUMsR0FBRyxPQUFPLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMxQixVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sTUFBK0IsQ0FBQztRQUN6QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sVUFBVSxDQUFDLEdBQUcsT0FBTyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRocm93RXJyb3IgfSBmcm9tICcuLi9lcnJvcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHsgQ2xpZW50TWFuYWdlciB9IGZyb20gJy4vQ2xpZW50TWFuYWdlcic7XG5pbXBvcnQgeyBsb2dPcGVyYXRpb24sIGxvZ1N1Y2Nlc3MsIHZhbGlkYXRlQW5kUmV0dXJuIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB0eXBlIHtcbiAgQW1wbGlmeU1vZGVsVHlwZSxcbiAgTW9kZWxUeXBlLFxuICBDcmVhdGVJbnB1dCxcbiAgVXBkYXRlSW5wdXQsXG4gIERlbGV0ZUlucHV0LFxuICBJZGVudGlmaWVyLFxuICBRdWVyeUZhY3RvcnlDb25maWcsXG4gIFF1ZXJ5RmFjdG9yeVJlc3VsdCxcbiAgRGF0YWJhc2VSZXNwb25zZSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBBV1MgQW1wbGlmeSBtb2RlbCBvcGVyYXRpb25zLlxuICogQGludGVybmFsXG4gKi9cbmludGVyZmFjZSBBbXBsaWZ5TW9kZWwge1xuICBjcmVhdGU6IChpbnB1dDogdW5rbm93bikgPT4gUHJvbWlzZTxEYXRhYmFzZVJlc3BvbnNlPHVua25vd24+PjtcbiAgdXBkYXRlOiAoaW5wdXQ6IHVua25vd24pID0+IFByb21pc2U8RGF0YWJhc2VSZXNwb25zZTx1bmtub3duPj47XG4gIGRlbGV0ZTogKGlucHV0OiB1bmtub3duKSA9PiBQcm9taXNlPERhdGFiYXNlUmVzcG9uc2U8dW5rbm93bj4+O1xuICBnZXQ6IChpbnB1dDogdW5rbm93bikgPT4gUHJvbWlzZTxEYXRhYmFzZVJlc3BvbnNlPHVua25vd24+PjtcbiAgbGlzdDogKCkgPT4gUHJvbWlzZTxEYXRhYmFzZVJlc3BvbnNlPHVua25vd25bXT4+O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdHlwZS1zYWZlIENSVUQgb3BlcmF0aW9ucyBmb3IgQVdTIEFtcGxpZnkgRGF0YSBtb2RlbHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFF1ZXJ5RmFjdG9yeSwgaW5pdGlhbGl6ZVF1ZXJpZXMgfSBmcm9tICdAeW91ci1wYWNrYWdlL3F1ZXJpZXMnO1xuICogaW1wb3J0IHsgTWFpblR5cGVzIH0gZnJvbSAnLi9zY2hlbWEnO1xuICogaW1wb3J0IG91dHB1dHMgZnJvbSAnLi9hbXBsaWZ5X291dHB1dHMuanNvbic7XG4gKlxuICogLy8gSW5pdGlhbGl6ZSBvbmNlIGF0IHN0YXJ0dXBcbiAqIGF3YWl0IGluaXRpYWxpemVRdWVyaWVzPE1haW5UeXBlcz4ob3V0cHV0cyk7XG4gKlxuICogLy8gQ3JlYXRlIFF1ZXJ5RmFjdG9yeSBmb3IgYW55IG1vZGVsXG4gKiBjb25zdCBVc2VyUXVlcmllcyA9IGF3YWl0IFF1ZXJ5RmFjdG9yeTwnVXNlcicsIE1haW5UeXBlcz4oe1xuICogICBuYW1lOiAnVXNlcidcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeUZhY3RvcnkgPSBhc3luYyBmdW5jdGlvbiA8XG4gIFQgZXh0ZW5kcyBzdHJpbmcsXG4gIFR5cGVzIGV4dGVuZHMgUmVjb3JkPFQsIEFtcGxpZnlNb2RlbFR5cGU+LFxuPihjb25maWc6IFF1ZXJ5RmFjdG9yeUNvbmZpZzxUPik6IFByb21pc2U8UXVlcnlGYWN0b3J5UmVzdWx0PFQsIFR5cGVzPj4ge1xuICBjb25zdCB7IG5hbWUsIGNsaWVudEtleSA9ICdkZWZhdWx0JyB9ID0gY29uZmlnO1xuICBjb25zdCBuYW1lU3RyID0gU3RyaW5nKG5hbWUpO1xuXG4gIC8vIEdldCB0aGUgaW5pdGlhbGl6ZWQgY2xpZW50XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGdldEluaXRpYWxpemVkQ2xpZW50KG5hbWVTdHIsIGNsaWVudEtleSk7XG4gIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWxGcm9tQ2xpZW50KGNsaWVudCwgbmFtZVN0cik7XG5cbiAgLy8gUmV0dXJuIENSVUQgb3BlcmF0aW9uc1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY3JlYXRlT3BlcmF0aW9uKG1vZGVsLCBuYW1lU3RyKSxcbiAgICB1cGRhdGU6IHVwZGF0ZU9wZXJhdGlvbihtb2RlbCwgbmFtZVN0ciksXG4gICAgZGVsZXRlOiBkZWxldGVPcGVyYXRpb24obW9kZWwsIG5hbWVTdHIpLFxuICAgIGdldDogZ2V0T3BlcmF0aW9uKG1vZGVsLCBuYW1lU3RyKSxcbiAgICBsaXN0OiBsaXN0T3BlcmF0aW9uKG1vZGVsLCBuYW1lU3RyKSxcbiAgfTtcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gYnJlYWsgZG93biB0aGUgUXVlcnlGYWN0b3J5IGNvbXBsZXhpdHlcblxuYXN5bmMgZnVuY3Rpb24gZ2V0SW5pdGlhbGl6ZWRDbGllbnQobmFtZVN0cjogc3RyaW5nLCBjbGllbnRLZXk6IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyLmdldEluc3RhbmNlKGNsaWVudEtleSk7XG4gICAgcmV0dXJuIGF3YWl0IG1hbmFnZXIuZ2V0Q2xpZW50PHsgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IHRocm93RXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHJlc29sdmUgY2xpZW50IGZvciBtb2RlbDogJHtuYW1lU3RyfS4gTWFrZSBzdXJlIHRvIGNhbGwgaW5pdGlhbGl6ZVF1ZXJpZXMoKSBmaXJzdC5gLFxuICAgICAgZXJyb3IsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNb2RlbEZyb21DbGllbnQoXG4gIGNsaWVudDogeyBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0sXG4gIG5hbWVTdHI6IHN0cmluZyxcbik6IEFtcGxpZnlNb2RlbCB7XG4gIGNvbnN0IG1vZGVsUmVmID0gY2xpZW50Lm1vZGVsc1tuYW1lU3RyXTtcbiAgaWYgKCFtb2RlbFJlZikge1xuICAgIHRocm93IHRocm93RXJyb3IoXG4gICAgICBgTW9kZWwgXCIke25hbWVTdHJ9XCIgbm90IGZvdW5kIGluIGNsaWVudCBtb2RlbHMuIEF2YWlsYWJsZSBtb2RlbHM6ICR7T2JqZWN0LmtleXMoY2xpZW50Lm1vZGVscykuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1vZGVsUmVmIGFzIEFtcGxpZnlNb2RlbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT3BlcmF0aW9uPFxuICBUIGV4dGVuZHMgc3RyaW5nLFxuICBUeXBlcyBleHRlbmRzIFJlY29yZDxULCBBbXBsaWZ5TW9kZWxUeXBlPixcbj4obW9kZWw6IEFtcGxpZnlNb2RlbCwgbmFtZVN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBhc3luYyAocHJvcHM6IHtcbiAgICBpbnB1dDogQ3JlYXRlSW5wdXQ8VCwgVHlwZXM+O1xuICB9KTogUHJvbWlzZTxNb2RlbFR5cGU8VCwgVHlwZXM+PiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IHByb3BzO1xuICAgICAgbG9nT3BlcmF0aW9uKG5hbWVTdHIsICdjcmVhdGUnLCBpbnB1dCk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbW9kZWwuY3JlYXRlKGlucHV0KTtcbiAgICAgIGNvbnN0IGRhdGEgPSB2YWxpZGF0ZUFuZFJldHVybjxNb2RlbFR5cGU8VCwgVHlwZXM+PihcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICdjcmVhdGUnLFxuICAgICAgICBpbnB1dCxcbiAgICAgICk7XG5cbiAgICAgIGxvZ1N1Y2Nlc3MoJ2NyZWF0ZScpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IHRocm93RXJyb3IoYCR7bmFtZVN0cn0gY291bGQgbm90IGJlIGNyZWF0ZWRgLCBlcnJvcik7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPcGVyYXRpb248XG4gIFQgZXh0ZW5kcyBzdHJpbmcsXG4gIFR5cGVzIGV4dGVuZHMgUmVjb3JkPFQsIEFtcGxpZnlNb2RlbFR5cGU+LFxuPihtb2RlbDogQW1wbGlmeU1vZGVsLCBuYW1lU3RyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIChwcm9wczoge1xuICAgIGlucHV0OiBVcGRhdGVJbnB1dDxULCBUeXBlcz47XG4gIH0pOiBQcm9taXNlPE1vZGVsVHlwZTxULCBUeXBlcz4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcHJvcHM7XG4gICAgICBsb2dPcGVyYXRpb24obmFtZVN0ciwgJ3VwZGF0ZScsIGlucHV0KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtb2RlbC51cGRhdGUoaW5wdXQpO1xuICAgICAgY29uc3QgZGF0YSA9IHZhbGlkYXRlQW5kUmV0dXJuPE1vZGVsVHlwZTxULCBUeXBlcz4+KFxuICAgICAgICByZXNwb25zZSxcbiAgICAgICAgJ3VwZGF0ZScsXG4gICAgICAgIGlucHV0LFxuICAgICAgKTtcblxuICAgICAgbG9nU3VjY2VzcygndXBkYXRlJyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgdGhyb3dFcnJvcihgJHtuYW1lU3RyfSBjb3VsZCBub3QgYmUgdXBkYXRlZGAsIGVycm9yKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZU9wZXJhdGlvbjxcbiAgVCBleHRlbmRzIHN0cmluZyxcbiAgVHlwZXMgZXh0ZW5kcyBSZWNvcmQ8VCwgQW1wbGlmeU1vZGVsVHlwZT4sXG4+KG1vZGVsOiBBbXBsaWZ5TW9kZWwsIG5hbWVTdHI6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgKHByb3BzOiB7XG4gICAgaW5wdXQ6IERlbGV0ZUlucHV0PFQsIFR5cGVzPjtcbiAgfSk6IFByb21pc2U8TW9kZWxUeXBlPFQsIFR5cGVzPj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSBwcm9wcztcbiAgICAgIGxvZ09wZXJhdGlvbihuYW1lU3RyLCAnZGVsZXRlJywgaW5wdXQpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1vZGVsLmRlbGV0ZShpbnB1dCk7XG4gICAgICBjb25zdCBkYXRhID0gdmFsaWRhdGVBbmRSZXR1cm48TW9kZWxUeXBlPFQsIFR5cGVzPj4oXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgaW5wdXQsXG4gICAgICApO1xuXG4gICAgICBsb2dTdWNjZXNzKCdkZWxldGUnKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyB0aHJvd0Vycm9yKGAke25hbWVTdHJ9IGNvdWxkIG5vdCBiZSBkZWxldGVkYCwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uPFxuICBUIGV4dGVuZHMgc3RyaW5nLFxuICBUeXBlcyBleHRlbmRzIFJlY29yZDxULCBBbXBsaWZ5TW9kZWxUeXBlPixcbj4obW9kZWw6IEFtcGxpZnlNb2RlbCwgbmFtZVN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBhc3luYyAocHJvcHM6IHtcbiAgICBpbnB1dDogSWRlbnRpZmllcjxULCBUeXBlcz47XG4gIH0pOiBQcm9taXNlPE1vZGVsVHlwZTxULCBUeXBlcz4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gcHJvcHM7XG4gICAgICBsb2dPcGVyYXRpb24obmFtZVN0ciwgJ2dldCcsIGlucHV0KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtb2RlbC5nZXQoaW5wdXQpO1xuICAgICAgY29uc3QgZGF0YSA9IHZhbGlkYXRlQW5kUmV0dXJuPE1vZGVsVHlwZTxULCBUeXBlcz4+KFxuICAgICAgICByZXNwb25zZSxcbiAgICAgICAgJ2dldCcsXG4gICAgICAgIGlucHV0LFxuICAgICAgKTtcblxuICAgICAgbG9nU3VjY2VzcygnZ2V0Jyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgdGhyb3dFcnJvcihgJHtuYW1lU3RyfSBjb3VsZCBub3QgYmUgcmV0cmlldmVkYCwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gbGlzdE9wZXJhdGlvbjxcbiAgVCBleHRlbmRzIHN0cmluZyxcbiAgVHlwZXMgZXh0ZW5kcyBSZWNvcmQ8VCwgQW1wbGlmeU1vZGVsVHlwZT4sXG4+KG1vZGVsOiBBbXBsaWZ5TW9kZWwsIG5hbWVTdHI6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgKCk6IFByb21pc2U8TW9kZWxUeXBlPFQsIFR5cGVzPltdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ09wZXJhdGlvbihuYW1lU3RyLCAnbGlzdCcpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1vZGVsLmxpc3QoKTtcbiAgICAgIGNvbnN0IHsgZGF0YSwgZXJyb3JzIH0gPSByZXNwb25zZTtcblxuICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEdyYXBoUUwgZXJyb3JzIGR1cmluZyAke25hbWVTdHJ9IGxpc3Qgb3BlcmF0aW9uYCwge1xuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IHRocm93RXJyb3IoYCR7bmFtZVN0cn0gbGlzdCBmYWlsZWRgLCBlcnJvcnMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBkYXRhIHx8IFtdO1xuICAgICAgbG9nU3VjY2VzcygnbGlzdCcsIHsgY291bnQ6IHJlc3VsdC5sZW5ndGggfSk7XG4gICAgICByZXR1cm4gcmVzdWx0IGFzIE1vZGVsVHlwZTxULCBUeXBlcz5bXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgdGhyb3dFcnJvcihgJHtuYW1lU3RyfSBsaXN0IGNvdWxkIG5vdCBiZSByZXRyaWV2ZWRgLCBlcnJvcik7XG4gICAgfVxuICB9O1xufVxuIl19