fiscalapi
Version:
SDK de Node.js para FiscalAPI
170 lines • 19.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseFiscalapiService = void 0;
/**
* Implementación base de un servicio de FiscalAPI
* @template T - Tipo de DTO que maneja el servicio
*/
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
});
}
}
exports.BaseFiscalapiService = BaseFiscalapiService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maXNjYWxhcGktc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9iYXNlLWZpc2NhbGFwaS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BOzs7R0FHRztBQUNILE1BQXNCLG9CQUFvQjtJQVV4Qzs7Ozs7T0FLRztJQUNILFlBQVksVUFBZ0MsRUFBRSxZQUFvQixFQUFFLFVBQWtCO1FBQ3BGLElBQUksQ0FBQyxVQUFVO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxZQUFZO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxVQUFVO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBRTlFLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxhQUFhLENBQUMsT0FBZSxFQUFFLEVBQUUsV0FBb0M7UUFDN0UsSUFBSSxZQUFZLEdBQUcsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVqRSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsWUFBWSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO2lCQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcs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QyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBek1ELG9EQXlNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IEJhc2VEdG8gfSBmcm9tICcuLi9jb21tb24vYmFzZS1kdG8nO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi9jb21tb24vYXBpLXJlc3BvbnNlJztcbmltcG9ydCB7IFBhZ2VkTGlzdCB9IGZyb20gJy4uL2NvbW1vbi9wYWdlZC1saXN0JztcbmltcG9ydCB7IElGaXNjYWxhcGlIdHRwQ2xpZW50LCBIdHRwTWV0aG9kIH0gZnJvbSAnLi4vaHR0cC9maXNjYWxhcGktaHR0cC1jbGllbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGaXNjYWxhcGlTZXJ2aWNlLCBPcGVyYXRpb25PcHRpb25zLCBSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4uL2Fic3RyYWN0aW9ucy9maXNjYWxhcGktc2VydmljZS5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGFjacOzbiBiYXNlIGRlIHVuIHNlcnZpY2lvIGRlIEZpc2NhbEFQSVxuICogQHRlbXBsYXRlIFQgLSBUaXBvIGRlIERUTyBxdWUgbWFuZWphIGVsIHNlcnZpY2lvXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRmlzY2FsYXBpU2VydmljZTxUIGV4dGVuZHMgQmFzZUR0bz4gaW1wbGVtZW50cyBJRmlzY2FsYXBpU2VydmljZTxUPiB7XG4gIC8qKiBDbGllbnRlIEhUVFAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGh0dHBDbGllbnQ6IElGaXNjYWxhcGlIdHRwQ2xpZW50O1xuICBcbiAgLyoqIFJ1dGEgZGVsIHJlY3Vyc28gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc291cmNlUGF0aDogc3RyaW5nO1xuICBcbiAgLyoqIFZlcnNpw7NuIGRlIGxhIEFQSSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhIHVuYSBudWV2YSBpbnN0YW5jaWEgZGVsIHNlcnZpY2lvIGJhc2VcbiAgICogQHBhcmFtIHtJRmlzY2FsYXBpSHR0cENsaWVudH0gaHR0cENsaWVudCAtIENsaWVudGUgSFRUUFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzb3VyY2VQYXRoIC0gUnV0YSBkZWwgcmVjdXJzbyBlbiBsYSBBUElcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwaVZlcnNpb24gLSBWZXJzacOzbiBkZSBsYSBBUElcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBDbGllbnQ6IElGaXNjYWxhcGlIdHRwQ2xpZW50LCByZXNvdXJjZVBhdGg6IHN0cmluZywgYXBpVmVyc2lvbjogc3RyaW5nKSB7XG4gICAgaWYgKCFodHRwQ2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoJ2h0dHBDbGllbnQgbm8gcHVlZGUgc2VyIG51bG8gbyBpbmRlZmluaWRvJyk7XG4gICAgaWYgKCFyZXNvdXJjZVBhdGgpIHRocm93IG5ldyBFcnJvcigncmVzb3VyY2VQYXRoIG5vIHB1ZWRlIHNlciBudWxvIG8gaW5kZWZpbmlkbycpO1xuICAgIGlmICghYXBpVmVyc2lvbikgdGhyb3cgbmV3IEVycm9yKCdhcGlWZXJzaW9uIG5vIHB1ZWRlIHNlciBudWxvIG8gaW5kZWZpbmlkbycpO1xuICAgIFxuICAgIHRoaXMuaHR0cENsaWVudCA9IGh0dHBDbGllbnQ7XG4gICAgdGhpcy5yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7XG4gICAgdGhpcy5hcGlWZXJzaW9uID0gYXBpVmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1eWUgdW5hIFVSTCBkZSBlbmRwb2ludCBkZSBBUElcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoPScnXSAtIFNlZ21lbnRvIGRlIHJ1dGEgb3BjaW9uYWxcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbcXVlcnlQYXJhbXNdIC0gUGFyw6FtZXRyb3MgZGUgY29uc3VsdGEgb3BjaW9uYWxlc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgZGVsIGVuZHBvaW50XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEVuZHBvaW50KHBhdGg6IHN0cmluZyA9ICcnLCBxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIGxldCBiYXNlRW5kcG9pbnQgPSBgYXBpLyR7dGhpcy5hcGlWZXJzaW9ufS8ke3RoaXMucmVzb3VyY2VQYXRofWA7XG4gICAgXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIGJhc2VFbmRwb2ludCArPSBgLyR7cGF0aH1gO1xuICAgIH1cbiAgICBcbiAgICBpZiAocXVlcnlQYXJhbXMgJiYgT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmVudHJpZXMocXVlcnlQYXJhbXMpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gKVxuICAgICAgICAuam9pbignJicpO1xuICAgICAgXG4gICAgICBiYXNlRW5kcG9pbnQgKz0gYD8ke3F1ZXJ5U3RyaW5nfWA7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBiYXNlRW5kcG9pbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmllcnRlIGxvcyBwYXLDoW1ldHJvcyBkZSBjb25zdWx0YSBhIHVuIG9iamV0byBjb21wYXRpYmxlIGNvbiBsYSBjb25maWd1cmFjacOzbiBkZSBBeGlvc1xuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IHF1ZXJ5UGFyYW1zIC0gUGFyw6FtZXRyb3MgZGUgY29uc3VsdGFcbiAgICogQHJldHVybnMge0F4aW9zUmVxdWVzdENvbmZpZ30gQ29uZmlndXJhY2nDs24gZGUgQXhpb3MgY29uIGxvcyBwYXLDoW1ldHJvc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlQ29uZmlnV2l0aFBhcmFtcyhxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBBeGlvc1JlcXVlc3RDb25maWcge1xuICAgIHJldHVybiBxdWVyeVBhcmFtcyA/IHsgcGFyYW1zOiBxdWVyeVBhcmFtcyB9IDoge307XG4gIH1cblxuICAvKipcbiAgICogRWplY3V0YSB1bmEgcGV0aWNpw7NuIEhUVFAgcGVyc29uYWxpemFkYSBjb24gbcOheGltYSBmbGV4aWJpbGlkYWRcbiAgICogQHBhcmFtIHtSZXF1ZXN0T3B0aW9uczxURGF0YT59IG9wdGlvbnMgLSBPcGNpb25lcyBwYXJhIGxhIHBldGljacOzblxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcGlSZXNwb25zZTxUUmVzdWx0Pj59IFJlc3VsdGFkbyBkZSBsYSBwZXRpY2nDs25cbiAgICogQHRlbXBsYXRlIFRSZXN1bHQgLSBUaXBvIGRlIHJlc3VsdGFkbyBlc3BlcmFkb1xuICAgKiBAdGVtcGxhdGUgVERhdGEgLSBUaXBvIGRlIGRhdG9zIGRlIGVudHJhZGFcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVSZXF1ZXN0PFRSZXN1bHQsIFREYXRhID0gYW55PihcbiAgICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9uczxURGF0YT5cbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUUmVzdWx0Pj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFeHRyYWVyIG9wY2lvbmVzXG4gICAgICBjb25zdCB7IFxuICAgICAgICBtZXRob2QsIFxuICAgICAgICBwYXRoID0gJycsIFxuICAgICAgICBpZCwgXG4gICAgICAgIGRhdGEsIFxuICAgICAgICBxdWVyeVBhcmFtcyA9IHt9LCBcbiAgICAgICAgY29uZmlnID0ge30sXG4gICAgICAgIHJlc3BvbnNlVHJhbnNmb3JtZXJcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgXG4gICAgICAvLyBDb25zdHJ1aXIgZWwgZW5kcG9pbnQgY29tcGxldG9cbiAgICAgIGxldCBlbmRwb2ludCA9ICcnO1xuICAgICAgXG4gICAgICAvLyBTaSBzZSBwcm9wb3JjaW9uYSB1biBJRCwgbG8gYcOxYWRpbW9zIGEgbGEgcnV0YVxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIGVuZHBvaW50ID0gdGhpcy5idWlsZEVuZHBvaW50KGAke3BhdGggPyBgJHtwYXRofS9gIDogJyd9JHtpZH1gLCBxdWVyeVBhcmFtcyk7XG4gICAgICB9IGVsc2UgaWYgKHBhdGgpIHtcbiAgICAgICAgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkRW5kcG9pbnQocGF0aCwgcXVlcnlQYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kcG9pbnQgPSB0aGlzLmJ1aWxkRW5kcG9pbnQoJycsIHF1ZXJ5UGFyYW1zKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRWplY3V0YXIgbGEgcGV0aWNpw7NuIGEgdHJhdsOpcyBkZWwgY2xpZW50ZSBIVFRQXG4gICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmV4ZWN1dGVSZXF1ZXN0PFRSZXN1bHQsIFREYXRhPihcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlc3BvbnNlVHJhbnNmb3JtZXJcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTWFuZWpvIGNlbnRyYWxpemFkbyBkZSBlcnJvcmVzXG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBhbCBlamVjdXRhciBwZXRpY2nDs24gcGVyc29uYWxpemFkYTpgLCBlcnJvcik7XG4gICAgICBcbiAgICAgIC8vIENvbnZlcnRpciBlbCBlcnJvciBlbiB1bmEgcmVzcHVlc3RhIGRlIGVycm9yIGVzdMOhbmRhclxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JSZXNwb25zZTogQXBpUmVzcG9uc2U8VFJlc3VsdD4gPSB7XG4gICAgICAgICAgc3VjY2VlZGVkOiBmYWxzZSxcbiAgICAgICAgICBkYXRhOiBudWxsIGFzIHVua25vd24gYXMgVFJlc3VsdCxcbiAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgYWwgZWplY3V0YXIgcGV0aWNpw7NuOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICBkZXRhaWxzOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBjb2RlOiAnUkVRVUVTVF9FUlJPUicsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaHR0cFN0YXR1c0NvZGU6IDUwMFxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGVycm9yUmVzcG9uc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuICBcbiBcblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIGdldExpc3QocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKTogUHJvbWlzZTxBcGlSZXNwb25zZTxQYWdlZExpc3Q8VD4+PiB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7XG4gICAgICBQYWdlTnVtYmVyOiBwYWdlTnVtYmVyLnRvU3RyaW5nKCksXG4gICAgICBQYWdlU2l6ZTogcGFnZVNpemUudG9TdHJpbmcoKVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3Q8UGFnZWRMaXN0PFQ+Pih7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgcXVlcnlQYXJhbXNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgYXN5bmMgZ2V0QnlJZChpZDogc3RyaW5nLCBkZXRhaWxzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBkZXRhaWxzID8geyBkZXRhaWxzOiBkZXRhaWxzLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB9IDogdW5kZWZpbmVkO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0PFQ+KHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBpZCxcbiAgICAgIHF1ZXJ5UGFyYW1zXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtb2RlbDogVCk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxULCBUPih7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGRhdGE6IG1vZGVsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIHVwZGF0ZShtb2RlbDogVCk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxULCBUPih7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgaWQ6IG1vZGVsLmlkLFxuICAgICAgZGF0YTogbW9kZWxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFwaVJlc3BvbnNlPGJvb2xlYW4+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3Q8Ym9vbGVhbj4oe1xuICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgIGlkXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIHNlYXJjaChzZWFyY2hQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPEFwaVJlc3BvbnNlPFBhZ2VkTGlzdDxUPj4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxQYWdlZExpc3Q8VD4+KHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBwYXRoOiAnc2VhcmNoJyxcbiAgICAgIHF1ZXJ5UGFyYW1zOiBzZWFyY2hQYXJhbXNcbiAgICB9KTtcbiAgfVxufSJdfQ==