UNPKG

axios-error-redact

Version:

Library to redact sensitive information from Axios errors

183 lines 19.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AxiosErrorRedactor = exports.redactedKeyword = void 0; exports.createErrorInterceptor = createErrorInterceptor; exports.isHttpErrorResponse = isHttpErrorResponse; __exportStar(require("./types"), exports); exports.redactedKeyword = '<REDACTED>'; const queryParamsRegex = /(?<=\?|#)\S+/ig; const pathParamsRegex = /(\?|#)\S+/ig; /** * construct the full url * @param base base url * @param path sub path * @param queryPath query path if exists * @returns full url */ function joinURL(base, path, queryPath = '') { if (!base) { return `${path}${queryPath}`; } const joint = base.endsWith('/') || path.startsWith('/') ? '' : '/'; return `${base}${joint}${path}${queryPath}`; } /** * extracts query path parameters * @param input full url * @returns query path parameters if found, otherwise empty string */ function extractQueryPath(input) { var _a; if (!input) { return ''; } const match = (_a = input.match(pathParamsRegex)) === null || _a === void 0 ? void 0 : _a.pop(); return match || ''; } /** * tries to json parse the input * @param input any input * @returns parsed data if possible, otherwise undefined */ function parseData(input) { try { return JSON.parse(input); } catch { return; } } /** * recursively redacts sensitive data from the object * @param data data to redact * @param flag whether to perform redaction * @returns redacted data */ function redactData(data, flag) { if (!data) { return data; } if (typeof data === 'object') { if (Array.isArray(data)) { return data.map(value => redactData(value, flag)); } return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, redactData(value, flag)])); } const parsedData = parseData(data); if (parsedData && typeof parsedData === 'object') { return redactData(parsedData, flag); } return flag ? exports.redactedKeyword : data; } /** * This class is used to redact sensitive data from Axios error objects. */ class AxiosErrorRedactor { constructor(options) { var _a, _b, _c; this.redactQueryData = (_a = options === null || options === void 0 ? void 0 : options.redactQueryDataEnabled) !== null && _a !== void 0 ? _a : true; this.redactRequestData = (_b = options === null || options === void 0 ? void 0 : options.redactRequestDataEnabled) !== null && _b !== void 0 ? _b : true; this.redactResponseData = (_c = options === null || options === void 0 ? void 0 : options.redactResponseDataEnabled) !== null && _c !== void 0 ? _c : true; } /** * Disables redaction of the request data * @returns the instance of the redactor */ skipRequestData() { this.redactRequestData = false; return this; } /** * Disables redaction of the response data * @returns the instance of the redactor */ skipResponseData() { this.redactResponseData = false; return this; } /** * Disables redaction of the query data * @returns the instance of the redactor */ skipQueryData() { this.redactQueryData = false; return this; } /** * redacts query string from the url * @param url raw url * @returns redacted query string */ redactUrlQueryParams(url) { if (!url) { return ''; } return this.redactQueryData ? url.replace(queryParamsRegex, exports.redactedKeyword) : url; } /** * Redacts sensitive data from the Axios rejection error * @param error any of errors that can be thrown by axios * @returns HttpErrorResponse in case of axios error, otherwise passthrough the error */ redactError(error) { var _a, _b, _c, _d, _e, _f, _g, _h; if (!error || !error.isAxiosError) { return error; } const baseURL = this.redactUrlQueryParams((_a = error.config) === null || _a === void 0 ? void 0 : _a.baseURL); const path = this.redactUrlQueryParams((_b = error.config) === null || _b === void 0 ? void 0 : _b.url); const queryPath = extractQueryPath(path) ? '' : extractQueryPath((_c = error.request) === null || _c === void 0 ? void 0 : _c.path); const fullURL = this.redactUrlQueryParams(joinURL(baseURL, path, queryPath)); return { isErrorRedactedResponse: true, fullURL, message: error.message, response: { statusCode: (_d = error.response) === null || _d === void 0 ? void 0 : _d.status, statusMessage: ((_e = error.response) === null || _e === void 0 ? void 0 : _e.statusText) || '', data: redactData((_f = error.response) === null || _f === void 0 ? void 0 : _f.data, this.redactResponseData), }, request: { baseURL, path, method: ((_g = error.config) === null || _g === void 0 ? void 0 : _g.method) || '', data: redactData((_h = error.config) === null || _h === void 0 ? void 0 : _h.data, this.redactRequestData), }, }; } } exports.AxiosErrorRedactor = AxiosErrorRedactor; /** * Simple factory function to create an error interceptor for axios * @returns error interceptor for axios */ function createErrorInterceptor() { const redactor = new AxiosErrorRedactor(); return function (error) { return Promise.reject(redactor.redactError(error)); }; } /** * predicate to check if the input is an HttpErrorResponse * @param input any input * @returns whether the input is an HttpErrorResponse */ function isHttpErrorResponse(input) { return typeof input === 'object' && Boolean(input === null || input === void 0 ? void 0 : input.isErrorRedactedResponse); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrS0Esd0RBTUM7QUFPRCxrREFHQztBQS9LRCwwQ0FBd0I7QUFFWCxRQUFBLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFFNUMsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUMxQyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFFdEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxTQUFTLEdBQUcsRUFBRTtJQUN6RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFBQSxPQUFPLEdBQUcsSUFBSSxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQUEsQ0FBQztJQUUxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3BFLE9BQU8sR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxTQUFTLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBeUI7O0lBQ2pELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUFBLE9BQU8sRUFBRSxDQUFDO0lBQUEsQ0FBQztJQUV4QixNQUFNLEtBQUssR0FBRyxNQUFBLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLDBDQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2xELE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMs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QixFQUFFLENBQUM7SUFFMUMsT0FBTyxVQUFVLEtBQW9DO1FBQ25ELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxLQUFVO0lBQzVDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUTtRQUM5QixPQUFPLENBQUMsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLHVCQUF1QixDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF4aW9zRXJyb3IgfSBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBBeGlvc0Vycm9yUmVkYWN0b3JPcHRpb25zLCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHJlZGFjdGVkS2V5d29yZCA9ICc8UkVEQUNURUQ+JztcblxuY29uc3QgcXVlcnlQYXJhbXNSZWdleCA9IC8oPzw9XFw/fCMpXFxTKy9pZztcbmNvbnN0IHBhdGhQYXJhbXNSZWdleCA9IC8oXFw/fCMpXFxTKy9pZztcblxuLyoqXG4gKiBjb25zdHJ1Y3QgdGhlIGZ1bGwgdXJsXG4gKiBAcGFyYW0gYmFzZSBiYXNlIHVybFxuICogQHBhcmFtIHBhdGggc3ViIHBhdGhcbiAqIEBwYXJhbSBxdWVyeVBhdGggcXVlcnkgcGF0aCBpZiBleGlzdHNcbiAqIEByZXR1cm5zIGZ1bGwgdXJsXG4gKi9cbmZ1bmN0aW9uIGpvaW5VUkwoYmFzZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHF1ZXJ5UGF0aCA9ICcnKSB7XG4gIGlmICghYmFzZSkge3JldHVybiBgJHtwYXRofSR7cXVlcnlQYXRofWA7fVxuXG4gIGNvbnN0IGpvaW50ID0gYmFzZS5lbmRzV2l0aCgnLycpIHx8IHBhdGguc3RhcnRzV2l0aCgnLycpID8gJycgOiAnLyc7XG4gIHJldHVybiBgJHtiYXNlfSR7am9pbnR9JHtwYXRofSR7cXVlcnlQYXRofWA7XG59XG5cbi8qKlxuICogZXh0cmFjdHMgcXVlcnkgcGF0aCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gaW5wdXQgZnVsbCB1cmxcbiAqIEByZXR1cm5zIHF1ZXJ5IHBhdGggcGFyYW1ldGVycyBpZiBmb3VuZCwgb3RoZXJ3aXNlIGVtcHR5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBleHRyYWN0UXVlcnlQYXRoKGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIWlucHV0KSB7cmV0dXJuICcnO31cblxuICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKHBhdGhQYXJhbXNSZWdleCk/LnBvcCgpO1xuICByZXR1cm4gbWF0Y2ggfHwgJyc7XG59XG5cbi8qKlxuICogdHJpZXMgdG8ganNvbiBwYXJzZSB0aGUgaW5wdXRcbiAqIEBwYXJhbSBpbnB1dCBhbnkgaW5wdXRcbiAqIEByZXR1cm5zIHBhcnNlZCBkYXRhIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGF0YShpbnB1dDogdW5rbm93bik6IGFueSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoaW5wdXQgYXMgc3RyaW5nKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogcmVjdXJzaXZlbHkgcmVkYWN0cyBzZW5zaXRpdmUgZGF0YSBmcm9tIHRoZSBvYmplY3RcbiAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gcmVkYWN0XG4gKiBAcGFyYW0gZmxhZyB3aGV0aGVyIHRvIHBlcmZvcm0gcmVkYWN0aW9uXG4gKiBAcmV0dXJucyByZWRhY3RlZCBkYXRhXG4gKi9cbmZ1bmN0aW9uIHJlZGFjdERhdGEoZGF0YTogdW5rbm93biwgZmxhZzogYm9vbGVhbik6IHVua25vd24ge1xuICBpZiAoIWRhdGEpIHtyZXR1cm4gZGF0YTt9XG5cblxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtyZXR1cm4gZGF0YS5tYXAodmFsdWUgPT4gcmVkYWN0RGF0YSh2YWx1ZSwgZmxhZykpO31cblxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhkYXRhKS5tYXAoKFtrZXksIHZhbHVlXSk9PiBba2V5LCByZWRhY3REYXRhKHZhbHVlLCBmbGFnKV0pKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZERhdGEgPSBwYXJzZURhdGEoZGF0YSk7XG5cbiAgaWYgKHBhcnNlZERhdGEgJiYgdHlwZW9mIHBhcnNlZERhdGEgPT09ICdvYmplY3QnKSB7cmV0dXJuIHJlZGFjdERhdGEocGFyc2VkRGF0YSwgZmxhZyk7fVxuXG5cbiAgcmV0dXJuIGZsYWcgPyByZWRhY3RlZEtleXdvcmQgOiBkYXRhO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWRhY3Qgc2Vuc2l0aXZlIGRhdGEgZnJvbSBBeGlvcyBlcnJvciBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgQXhpb3NFcnJvclJlZGFjdG9yIHtcbiAgcHJpdmF0ZSByZWRhY3RSZXF1ZXN0RGF0YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWRhY3RSZXNwb25zZURhdGE6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVkYWN0UXVlcnlEYXRhOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBBeGlvc0Vycm9yUmVkYWN0b3JPcHRpb25zKSB7XG4gICAgdGhpcy5yZWRhY3RRdWVyeURhdGEgPSBvcHRpb25zPy5yZWRhY3RRdWVyeURhdGFFbmFibGVkID8/IHRydWU7XG4gICAgdGhpcy5yZWRhY3RSZXF1ZXN0RGF0YSA9IG9wdGlvbnM/LnJlZGFjdFJlcXVlc3REYXRhRW5hYmxlZCA/PyB0cnVlO1xuICAgIHRoaXMucmVkYWN0UmVzcG9uc2VEYXRhID0gb3B0aW9ucz8ucmVkYWN0UmVzcG9uc2VEYXRhRW5hYmxlZCA/PyB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHJlZGFjdGlvbiBvZiB0aGUgcmVxdWVzdCBkYXRhXG4gICAqIEByZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVkYWN0b3JcbiAgICovXG4gIHNraXBSZXF1ZXN0RGF0YSgpOiBBeGlvc0Vycm9yUmVkYWN0b3Ige1xuICAgIHRoaXMucmVkYWN0UmVxdWVzdERhdGEgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlcyByZWRhY3Rpb24gb2YgdGhlIHJlc3BvbnNlIGRhdGFcbiAgICogQHJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSByZWRhY3RvclxuICAgKi9cbiAgc2tpcFJlc3BvbnNlRGF0YSgpOiBBeGlvc0Vycm9yUmVkYWN0b3Ige1xuICAgIHRoaXMucmVkYWN0UmVzcG9uc2VEYXRhID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZXMgcmVkYWN0aW9uIG9mIHRoZSBxdWVyeSBkYXRhXG4gICAqIEByZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVkYWN0b3JcbiAgICovXG4gIHNraXBRdWVyeURhdGEoKTogQXhpb3NFcnJvclJlZGFjdG9yIHtcbiAgICB0aGlzLnJlZGFjdFF1ZXJ5RGF0YSA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlZGFjdHMgcXVlcnkgc3RyaW5nIGZyb20gdGhlIHVybFxuICAgKiBAcGFyYW0gdXJsIHJhdyB1cmxcbiAgICogQHJldHVybnMgcmVkYWN0ZWQgcXVlcnkgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHJlZGFjdFVybFF1ZXJ5UGFyYW1zKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCkge3JldHVybiAnJzt9XG5cbiAgICByZXR1cm4gdGhpcy5yZWRhY3RRdWVyeURhdGEgPyB1cmwucmVwbGFjZShxdWVyeVBhcmFtc1JlZ2V4LCByZWRhY3RlZEtleXdvcmQpIDogdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGFjdHMgc2Vuc2l0aXZlIGRhdGEgZnJvbSB0aGUgQXhpb3MgcmVqZWN0aW9uIGVycm9yXG4gICAqIEBwYXJhbSBlcnJvciBhbnkgb2YgZXJyb3JzIHRoYXQgY2FuIGJlIHRocm93biBieSBheGlvc1xuICAgKiBAcmV0dXJucyBIdHRwRXJyb3JSZXNwb25zZSBpbiBjYXNlIG9mIGF4aW9zIGVycm9yLCBvdGhlcndpc2UgcGFzc3Rocm91Z2ggdGhlIGVycm9yXG4gICAqL1xuICByZWRhY3RFcnJvcihlcnJvcjogQXhpb3NFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpOiAoSHR0cEVycm9yUmVzcG9uc2UgfCBudWxsIHwgdW5kZWZpbmVkIHwgRXJyb3IpIHtcbiAgICBpZiAoIWVycm9yIHx8ICFlcnJvci5pc0F4aW9zRXJyb3IpIHtyZXR1cm4gZXJyb3I7fVxuXG4gICAgY29uc3QgYmFzZVVSTCA9IHRoaXMucmVkYWN0VXJsUXVlcnlQYXJhbXMoZXJyb3IuY29uZmlnPy5iYXNlVVJMKTtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5yZWRhY3RVcmxRdWVyeVBhcmFtcyhlcnJvci5jb25maWc/LnVybCk7XG4gICAgY29uc3QgcXVlcnlQYXRoID0gZXh0cmFjdFF1ZXJ5UGF0aChwYXRoKSA/ICcnIDogZXh0cmFjdFF1ZXJ5UGF0aChlcnJvci5yZXF1ZXN0Py5wYXRoKTtcbiAgICBjb25zdCBmdWxsVVJMID0gdGhpcy5yZWRhY3RVcmxRdWVyeVBhcmFtcyhqb2luVVJMKGJhc2VVUkwsIHBhdGgsIHF1ZXJ5UGF0aCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzRXJyb3JSZWRhY3RlZFJlc3BvbnNlOiB0cnVlLFxuICAgICAgZnVsbFVSTCxcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICByZXNwb25zZToge1xuICAgICAgICBzdGF0dXNDb2RlOiBlcnJvci5yZXNwb25zZT8uc3RhdHVzLFxuICAgICAgICBzdGF0dXNNZXNzYWdlOiBlcnJvci5yZXNwb25zZT8uc3RhdHVzVGV4dCB8fCAnJyxcbiAgICAgICAgZGF0YTogcmVkYWN0RGF0YShlcnJvci5yZXNwb25zZT8uZGF0YSwgdGhpcy5yZWRhY3RSZXNwb25zZURhdGEpLFxuICAgICAgfSxcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgYmFzZVVSTCxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWV0aG9kOiBlcnJvci5jb25maWc/Lm1ldGhvZCB8fCAnJyxcbiAgICAgICAgZGF0YTogcmVkYWN0RGF0YShlcnJvci5jb25maWc/LmRhdGEsIHRoaXMucmVkYWN0UmVxdWVzdERhdGEpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU2ltcGxlIGZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIGVycm9yIGludGVyY2VwdG9yIGZvciBheGlvc1xuICogQHJldHVybnMgZXJyb3IgaW50ZXJjZXB0b3IgZm9yIGF4aW9zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFcnJvckludGVyY2VwdG9yKCk6ICgoZXJyb3I6IEF4aW9zRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKT0+IFByb21pc2U8SHR0cEVycm9yUmVzcG9uc2UgfCBudWxsIHwgdW5kZWZpbmVkIHwgRXJyb3I+KSB7XG4gIGNvbnN0IHJlZGFjdG9yID0gbmV3IEF4aW9zRXJyb3JSZWRhY3RvcigpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyb3I6IEF4aW9zRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxIdHRwRXJyb3JSZXNwb25zZSB8IG51bGwgfCB1bmRlZmluZWQgfCBFcnJvcj4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWRhY3Rvci5yZWRhY3RFcnJvcihlcnJvcikpO1xuICB9O1xufVxuXG4vKipcbiAqIHByZWRpY2F0ZSB0byBjaGVjayBpZiB0aGUgaW5wdXQgaXMgYW4gSHR0cEVycm9yUmVzcG9uc2VcbiAqIEBwYXJhbSBpbnB1dCBhbnkgaW5wdXRcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGlucHV0IGlzIGFuIEh0dHBFcnJvclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0h0dHBFcnJvclJlc3BvbnNlKGlucHV0OiBhbnkpOiBpbnB1dCBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XG4gIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmXG4gICAgQm9vbGVhbihpbnB1dD8uaXNFcnJvclJlZGFjdGVkUmVzcG9uc2UpO1xufVxuIl19