UNPKG

fiscalapi

Version:

SDK de Node.js para FiscalAPI

166 lines 19 kB
/** * Implementación base de un servicio de FiscalAPI * @template T - Tipo de DTO que maneja el servicio */ export class BaseFiscalapiService { /** * Crea una nueva instancia del servicio base * @param {IFiscalapiHttpClient} httpClient - Cliente HTTP * @param {string} resourcePath - Ruta del recurso en la API * @param {string} apiVersion - Versión de la API */ constructor(httpClient, resourcePath, apiVersion) { if (!httpClient) throw new Error('httpClient no puede ser nulo o indefinido'); if (!resourcePath) throw new Error('resourcePath no puede ser nulo o indefinido'); if (!apiVersion) throw new Error('apiVersion no puede ser nulo o indefinido'); this.httpClient = httpClient; this.resourcePath = resourcePath; this.apiVersion = apiVersion; } /** * Construye una URL de endpoint de API * @param {string} [path=''] - Segmento de ruta opcional * @param {Record<string, string>} [queryParams] - Parámetros de consulta opcionales * @returns {string} URL del endpoint * @protected */ buildEndpoint(path = '', queryParams) { let baseEndpoint = `api/${this.apiVersion}/${this.resourcePath}`; if (path) { baseEndpoint += `/${path}`; } if (queryParams && Object.keys(queryParams).length > 0) { const queryString = Object.entries(queryParams) .filter(([key]) => key) .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`) .join('&'); baseEndpoint += `?${queryString}`; } return baseEndpoint; } /** * Convierte los parámetros de consulta a un objeto compatible con la configuración de Axios * @param {Record<string, string>} queryParams - Parámetros de consulta * @returns {AxiosRequestConfig} Configuración de Axios con los parámetros * @protected */ createConfigWithParams(queryParams) { return queryParams ? { params: queryParams } : {}; } /** * Ejecuta una petición HTTP personalizada con máxima flexibilidad * @param {RequestOptions<TData>} options - Opciones para la petición * @returns {Promise<ApiResponse<TResult>>} Resultado de la petición * @template TResult - Tipo de resultado esperado * @template TData - Tipo de datos de entrada */ async executeRequest(options) { try { // Extraer opciones const { method, path = '', id, data, queryParams = {}, config = {}, responseTransformer } = options; // Construir el endpoint completo let endpoint = ''; // Si se proporciona un ID, lo añadimos a la ruta if (id) { endpoint = this.buildEndpoint(`${path ? `${path}/` : ''}${id}`, queryParams); } else if (path) { endpoint = this.buildEndpoint(path, queryParams); } else { endpoint = this.buildEndpoint('', queryParams); } // Ejecutar la petición a través del cliente HTTP return this.httpClient.executeRequest(method, endpoint, { data, config, responseTransformer }); } catch (error) { // Manejo centralizado de errores console.error(`Error al ejecutar petición personalizada:`, error); // Convertir el error en una respuesta de error estándar if (error instanceof Error) { const errorResponse = { succeeded: false, data: null, message: `Error al ejecutar petición: ${error.message}`, details: JSON.stringify({ code: 'REQUEST_ERROR', message: error.message }), httpStatusCode: 500 }; return errorResponse; } throw error; } } /** * @inheritdoc */ async getList(pageNumber, pageSize) { const queryParams = { PageNumber: pageNumber.toString(), PageSize: pageSize.toString() }; return this.executeRequest({ method: 'GET', queryParams }); } /** * @inheritdoc */ async getById(id, details = false) { const queryParams = details ? { details: details.toString().toLowerCase() } : undefined; return this.executeRequest({ method: 'GET', id, queryParams }); } /** * @inheritdoc */ async create(model) { return this.executeRequest({ method: 'POST', data: model }); } /** * @inheritdoc */ async update(model) { return this.executeRequest({ method: 'PUT', id: model.id, data: model }); } /** * @inheritdoc */ async delete(id) { return this.executeRequest({ method: 'DELETE', id }); } /** * @inheritdoc */ async search(searchParams) { return this.executeRequest({ method: 'GET', path: 'search', queryParams: searchParams }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maXNjYWxhcGktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9iYXNlLWZpc2NhbGFwaS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BOzs7R0FHRztBQUNILE1BQU0sT0FBZ0Isb0JBQW9CO0lBVXhDOzs7OztPQUtHO0lBQ0gsWUFBWSxVQUFnQyxFQUFFLFlBQW9CLEVBQUUsVUFBa0I7UUFDcEYsSUFBSSxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFVBQVU7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNPLGFBQWEsQ0FBQyxPQUFlLEVBQUUsRUFBRSxXQUFvQztRQUM3RSxJQUFJLFlBQVksR0FBRyxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRWpFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxZQUFZLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxXQUFXLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7aUJBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FB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QUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBeGlvc1JlcXVlc3RDb25maWcgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBCYXNlRHRvIH0gZnJvbSAnLi4vY29tbW9uL2Jhc2UtZHRvJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vY29tbW9uL2FwaS1yZXNwb25zZSc7XG5pbXBvcnQgeyBQYWdlZExpc3QgfSBmcm9tICcuLi9jb21tb24vcGFnZWQtbGlzdCc7XG5pbXBvcnQgeyBJRmlzY2FsYXBpSHR0cENsaWVudCwgSHR0cE1ldGhvZCB9IGZyb20gJy4uL2h0dHAvZmlzY2FsYXBpLWh0dHAtY2xpZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRmlzY2FsYXBpU2VydmljZSwgT3BlcmF0aW9uT3B0aW9ucywgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi9hYnN0cmFjdGlvbnMvZmlzY2FsYXBpLXNlcnZpY2UuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhY2nDs24gYmFzZSBkZSB1biBzZXJ2aWNpbyBkZSBGaXNjYWxBUElcbiAqIEB0ZW1wbGF0ZSBUIC0gVGlwbyBkZSBEVE8gcXVlIG1hbmVqYSBlbCBzZXJ2aWNpb1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUZpc2NhbGFwaVNlcnZpY2U8VCBleHRlbmRzIEJhc2VEdG8+IGltcGxlbWVudHMgSUZpc2NhbGFwaVNlcnZpY2U8VD4ge1xuICAvKiogQ2xpZW50ZSBIVFRQICovXG4gIHByb3RlY3RlZCByZWFkb25seSBodHRwQ2xpZW50OiBJRmlzY2FsYXBpSHR0cENsaWVudDtcbiAgXG4gIC8qKiBSdXRhIGRlbCByZWN1cnNvICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZVBhdGg6IHN0cmluZztcbiAgXG4gIC8qKiBWZXJzacOzbiBkZSBsYSBBUEkgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwaVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYSB1bmEgbnVldmEgaW5zdGFuY2lhIGRlbCBzZXJ2aWNpbyBiYXNlXG4gICAqIEBwYXJhbSB7SUZpc2NhbGFwaUh0dHBDbGllbnR9IGh0dHBDbGllbnQgLSBDbGllbnRlIEhUVFBcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlUGF0aCAtIFJ1dGEgZGVsIHJlY3Vyc28gZW4gbGEgQVBJXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcGlWZXJzaW9uIC0gVmVyc2nDs24gZGUgbGEgQVBJXG4gICAqL1xuICBjb25zdHJ1Y3RvcihodHRwQ2xpZW50OiBJRmlzY2FsYXBpSHR0cENsaWVudCwgcmVzb3VyY2VQYXRoOiBzdHJpbmcsIGFwaVZlcnNpb246IHN0cmluZykge1xuICAgIGlmICghaHR0cENsaWVudCkgdGhyb3cgbmV3IEVycm9yKCdodHRwQ2xpZW50IG5vIHB1ZWRlIHNlciBudWxvIG8gaW5kZWZpbmlkbycpO1xuICAgIGlmICghcmVzb3VyY2VQYXRoKSB0aHJvdyBuZXcgRXJyb3IoJ3Jlc291cmNlUGF0aCBubyBwdWVkZSBzZXIgbnVsbyBvIGluZGVmaW5pZG8nKTtcbiAgICBpZiAoIWFwaVZlcnNpb24pIHRocm93IG5ldyBFcnJvcignYXBpVmVyc2lvbiBubyBwdWVkZSBzZXIgbnVsbyBvIGluZGVmaW5pZG8nKTtcbiAgICBcbiAgICB0aGlzLmh0dHBDbGllbnQgPSBodHRwQ2xpZW50O1xuICAgIHRoaXMucmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoO1xuICAgIHRoaXMuYXBpVmVyc2lvbiA9IGFwaVZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydXllIHVuYSBVUkwgZGUgZW5kcG9pbnQgZGUgQVBJXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aD0nJ10gLSBTZWdtZW50byBkZSBydXRhIG9wY2lvbmFsXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3F1ZXJ5UGFyYW1zXSAtIFBhcsOhbWV0cm9zIGRlIGNvbnN1bHRhIG9wY2lvbmFsZXNcbiAgICogQHJldHVybnMge3N0cmluZ30gVVJMIGRlbCBlbmRwb2ludFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRFbmRwb2ludChwYXRoOiBzdHJpbmcgPSAnJywgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICBsZXQgYmFzZUVuZHBvaW50ID0gYGFwaS8ke3RoaXMuYXBpVmVyc2lvbn0vJHt0aGlzLnJlc291cmNlUGF0aH1gO1xuICAgIFxuICAgIGlmIChwYXRoKSB7XG4gICAgICBiYXNlRW5kcG9pbnQgKz0gYC8ke3BhdGh9YDtcbiAgICB9XG4gICAgXG4gICAgaWYgKHF1ZXJ5UGFyYW1zICYmIE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBxdWVyeVN0cmluZyA9IE9iamVjdC5lbnRyaWVzKHF1ZXJ5UGFyYW1zKVxuICAgICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5KVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YClcbiAgICAgICAgLmpvaW4oJyYnKTtcbiAgICAgIFxuICAgICAgYmFzZUVuZHBvaW50ICs9IGA/JHtxdWVyeVN0cmluZ31gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYmFzZUVuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZpZXJ0ZSBsb3MgcGFyw6FtZXRyb3MgZGUgY29uc3VsdGEgYSB1biBvYmpldG8gY29tcGF0aWJsZSBjb24gbGEgY29uZmlndXJhY2nDs24gZGUgQXhpb3NcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBxdWVyeVBhcmFtcyAtIFBhcsOhbWV0cm9zIGRlIGNvbnN1bHRhXG4gICAqIEByZXR1cm5zIHtBeGlvc1JlcXVlc3RDb25maWd9IENvbmZpZ3VyYWNpw7NuIGRlIEF4aW9zIGNvbiBsb3MgcGFyw6FtZXRyb3NcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbmZpZ1dpdGhQYXJhbXMocXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogQXhpb3NSZXF1ZXN0Q29uZmlnIHtcbiAgICByZXR1cm4gcXVlcnlQYXJhbXMgPyB7IHBhcmFtczogcXVlcnlQYXJhbXMgfSA6IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVqZWN1dGEgdW5hIHBldGljacOzbiBIVFRQIHBlcnNvbmFsaXphZGEgY29uIG3DoXhpbWEgZmxleGliaWxpZGFkXG4gICAqIEBwYXJhbSB7UmVxdWVzdE9wdGlvbnM8VERhdGE+fSBvcHRpb25zIC0gT3BjaW9uZXMgcGFyYSBsYSBwZXRpY2nDs25cbiAgICogQHJldHVybnMge1Byb21pc2U8QXBpUmVzcG9uc2U8VFJlc3VsdD4+fSBSZXN1bHRhZG8gZGUgbGEgcGV0aWNpw7NuXG4gICAqIEB0ZW1wbGF0ZSBUUmVzdWx0IC0gVGlwbyBkZSByZXN1bHRhZG8gZXNwZXJhZG9cbiAgICogQHRlbXBsYXRlIFREYXRhIC0gVGlwbyBkZSBkYXRvcyBkZSBlbnRyYWRhXG4gICAqL1xuICBhc3luYyBleGVjdXRlUmVxdWVzdDxUUmVzdWx0LCBURGF0YSA9IGFueT4oXG4gICAgb3B0aW9uczogUmVxdWVzdE9wdGlvbnM8VERhdGE+XG4gICk6IFByb21pc2U8QXBpUmVzcG9uc2U8VFJlc3VsdD4+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRXh0cmFlciBvcGNpb25lc1xuICAgICAgY29uc3QgeyBcbiAgICAgICAgbWV0aG9kLCBcbiAgICAgICAgcGF0aCA9ICcnLCBcbiAgICAgICAgaWQsIFxuICAgICAgICBkYXRhLCBcbiAgICAgICAgcXVlcnlQYXJhbXMgPSB7fSwgXG4gICAgICAgIGNvbmZpZyA9IHt9LFxuICAgICAgICByZXNwb25zZVRyYW5zZm9ybWVyXG4gICAgICB9ID0gb3B0aW9ucztcbiAgICAgIFxuICAgICAgLy8gQ29uc3RydWlyIGVsIGVuZHBvaW50IGNvbXBsZXRvXG4gICAgICBsZXQgZW5kcG9pbnQgPSAnJztcbiAgICAgIFxuICAgICAgLy8gU2kgc2UgcHJvcG9yY2lvbmEgdW4gSUQsIGxvIGHDsWFkaW1vcyBhIGxhIHJ1dGFcbiAgICAgIGlmIChpZCkge1xuICAgICAgICBlbmRwb2ludCA9IHRoaXMuYnVpbGRFbmRwb2ludChgJHtwYXRoID8gYCR7cGF0aH0vYCA6ICcnfSR7aWR9YCwgcXVlcnlQYXJhbXMpO1xuICAgICAgfSBlbHNlIGlmIChwYXRoKSB7XG4gICAgICAgIGVuZHBvaW50ID0gdGhpcy5idWlsZEVuZHBvaW50KHBhdGgsIHF1ZXJ5UGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuZHBvaW50ID0gdGhpcy5idWlsZEVuZHBvaW50KCcnLCBxdWVyeVBhcmFtcyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVqZWN1dGFyIGxhIHBldGljacOzbiBhIHRyYXbDqXMgZGVsIGNsaWVudGUgSFRUUFxuICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5leGVjdXRlUmVxdWVzdDxUUmVzdWx0LCBURGF0YT4oXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXNwb25zZVRyYW5zZm9ybWVyXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE1hbmVqbyBjZW50cmFsaXphZG8gZGUgZXJyb3Jlc1xuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgYWwgZWplY3V0YXIgcGV0aWNpw7NuIHBlcnNvbmFsaXphZGE6YCwgZXJyb3IpO1xuICAgICAgXG4gICAgICAvLyBDb252ZXJ0aXIgZWwgZXJyb3IgZW4gdW5hIHJlc3B1ZXN0YSBkZSBlcnJvciBlc3TDoW5kYXJcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2U6IEFwaVJlc3BvbnNlPFRSZXN1bHQ+ID0ge1xuICAgICAgICAgIHN1Y2NlZWRlZDogZmFsc2UsXG4gICAgICAgICAgZGF0YTogbnVsbCBhcyB1bmtub3duIGFzIFRSZXN1bHQsXG4gICAgICAgICAgbWVzc2FnZTogYEVycm9yIGFsIGVqZWN1dGFyIHBldGljacOzbjogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgZGV0YWlsczogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY29kZTogJ1JFUVVFU1RfRVJST1InLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGh0dHBTdGF0dXNDb2RlOiA1MDBcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBlcnJvclJlc3BvbnNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gXG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBhc3luYyBnZXRMaXN0KHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8QXBpUmVzcG9uc2U8UGFnZWRMaXN0PFQ+Pj4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgUGFnZU51bWJlcjogcGFnZU51bWJlci50b1N0cmluZygpLFxuICAgICAgUGFnZVNpemU6IHBhZ2VTaXplLnRvU3RyaW5nKClcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0PFBhZ2VkTGlzdDxUPj4oe1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHF1ZXJ5UGFyYW1zXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIGdldEJ5SWQoaWQ6IHN0cmluZywgZGV0YWlsczogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gZGV0YWlscyA/IHsgZGV0YWlsczogZGV0YWlscy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxUPih7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgaWQsXG4gICAgICBxdWVyeVBhcmFtc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBhc3luYyBjcmVhdGUobW9kZWw6IFQpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3Q8VCwgVD4oe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBkYXRhOiBtb2RlbFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBhc3luYyB1cGRhdGUobW9kZWw6IFQpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3Q8VCwgVD4oe1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGlkOiBtb2RlbC5pZCxcbiAgICAgIGRhdGE6IG1vZGVsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nKTogUHJvbWlzZTxBcGlSZXNwb25zZTxib29sZWFuPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0PGJvb2xlYW4+KHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICBpZFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBhc3luYyBzZWFyY2goc2VhcmNoUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTxBcGlSZXNwb25zZTxQYWdlZExpc3Q8VD4+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3Q8UGFnZWRMaXN0PFQ+Pih7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgcGF0aDogJ3NlYXJjaCcsXG4gICAgICBxdWVyeVBhcmFtczogc2VhcmNoUGFyYW1zXG4gICAgfSk7XG4gIH1cbn0iXX0=