UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

136 lines 18.6 kB
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