UNPKG

@jsverse/transloco

Version:

The internationalization (i18n) library for Angular

148 lines 18.7 kB
import { inject, Injectable, InjectionToken, Injector } from '@angular/core'; import { getValue, isDefined, isObject, isString, setValue } from './helpers'; import { defaultConfig, TRANSLOCO_CONFIG, } from './transloco.config'; import * as i0 from "@angular/core"; export const TRANSLOCO_TRANSPILER = new InjectionToken('TRANSLOCO_TRANSPILER'); export class DefaultTranspiler { config = inject(TRANSLOCO_CONFIG, { optional: true }) ?? defaultConfig; get interpolationMatcher() { return resolveMatcher(this.config); } transpile({ value, params = {}, translation, key }) { if (isString(value)) { let paramMatch; let parsedValue = value; while ((paramMatch = this.interpolationMatcher.exec(parsedValue)) !== null) { const [match, paramValue] = paramMatch; parsedValue = parsedValue.replace(match, () => { const match = paramValue.trim(); const param = getValue(params, match); if (isDefined(param)) { return param; } return isDefined(translation[match]) ? this.transpile({ params, translation, key, value: translation[match], }) : ''; }); } return parsedValue; } else if (params) { if (isObject(value)) { value = this.handleObject({ value: value, params, translation, key, }); } else if (Array.isArray(value)) { value = this.handleArray({ value, params, translation, key }); } } return value; } /** * * @example * * const en = { * a: { * b: { * c: "Hello {{ value }}" * } * } * } * * const params = { * "b.c": { value: "Transloco "} * } * * service.selectTranslate('a', params); * * // the first param will be the result of `en.a`. * // the second param will be `params`. * parser.transpile(value, params, {}); * * */ handleObject({ value, params = {}, translation, key, }) { let result = value; Object.keys(params).forEach((p) => { // transpile the value => "Hello Transloco" const transpiled = this.transpile({ // get the value of "b.c" inside "a" => "Hello {{ value }}" value: getValue(result, p), // get the params of "b.c" => { value: "Transloco" } params: getValue(params, p), translation, key, }); // set "b.c" to `transpiled` result = setValue(result, p, transpiled); }); return result; } handleArray({ value, ...rest }) { return value.map((v) => this.transpile({ value: v, ...rest, })); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DefaultTranspiler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DefaultTranspiler }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: DefaultTranspiler, decorators: [{ type: Injectable }] }); function resolveMatcher(config) { const [start, end] = config.interpolation; return new RegExp(`${start}([^${start}${end}]*?)${end}`, 'g'); } export function getFunctionArgs(argsString) { const splitted = argsString ? argsString.split(',') : []; const args = []; for (let i = 0; i < splitted.length; i++) { let value = splitted[i].trim(); while (value[value.length - 1] === '\\') { i++; value = value.replace('\\', ',') + splitted[i]; } args.push(value); } return args; } export class FunctionalTranspiler extends DefaultTranspiler { injector = inject(Injector); transpile({ value, ...rest }) { let transpiled = value; if (isString(value)) { transpiled = value.replace(/\[\[\s*(\w+)\((.*?)\)\s*]]/g, (match, functionName, args) => { try { const func = this.injector.get(functionName); return func.transpile(...getFunctionArgs(args)); } catch (e) { let message = `There is an error in: '${value}'. Check that the you used the right syntax in your translation and that the implementation of ${functionName} is correct.`; if (e.message.includes('NullInjectorError')) { message = `You are using the '${functionName}' function in your translation but no provider was found!`; } throw new Error(message); } }); } return super.transpile({ value: transpiled, ...rest }); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FunctionalTranspiler, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FunctionalTranspiler }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: FunctionalTranspiler, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnRyYW5zcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby50cmFuc3BpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsR0FFakIsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFNUIsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQ3BELHNCQUFzQixDQUN2QixDQUFDO0FBZ0JGLE1BQU0sT0FBTyxpQkFBaUI7SUFDbEIsTUFBTSxHQUNkLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQztJQUVoRSxJQUFjLG9CQUFvQjtRQUNoQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQW1CO1FBQ2pFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxVQUFrQyxDQUFDO1lBQ3ZDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztZQUV4QixPQUNFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQ25FLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEtBQUssRUFB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LEVBQUUsWUFBb0IsRUFBRSxJQUFZLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUVsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztnQkFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO29CQUNwQixJQUFJLE9BQU8sR0FBRywwQkFBMEIsS0FBSzt3SEFDK0QsWUFBWSxjQUFjLENBQUM7b0JBQ3ZJLElBQUssQ0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO3dCQUN2RCxPQUFPLEdBQUcsc0JBQXNCLFlBQVksMkRBQTJELENBQUM7b0JBQzFHLENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7dUdBOUJVLG9CQUFvQjsyR0FBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSGFzaE1hcCwgVHJhbnNsYXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFZhbHVlLCBpc0RlZmluZWQsIGlzT2JqZWN0LCBpc1N0cmluZywgc2V0VmFsdWUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdENvbmZpZyxcbiAgVFJBTlNMT0NPX0NPTkZJRyxcbiAgVHJhbnNsb2NvQ29uZmlnLFxufSBmcm9tICcuL3RyYW5zbG9jby5jb25maWcnO1xuXG5leHBvcnQgY29uc3QgVFJBTlNMT0NPX1RSQU5TUElMRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHJhbnNsb2NvVHJhbnNwaWxlcj4oXG4gICdUUkFOU0xPQ09fVFJBTlNQSUxFUicsXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1RyYW5zcGlsZXIge1xuICB0cmFuc3BpbGUocGFyYW1zOiBUcmFuc3BpbGVQYXJhbXMpOiBhbnk7XG5cbiAgb25MYW5nQ2hhbmdlZD8obGFuZzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVQYXJhbXM8ViA9IHVua25vd24+IHtcbiAgdmFsdWU6IFY7XG4gIHBhcmFtcz86IEhhc2hNYXA7XG4gIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbjtcbiAga2V5OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWZhdWx0VHJhbnNwaWxlciBpbXBsZW1lbnRzIFRyYW5zbG9jb1RyYW5zcGlsZXIge1xuICBwcm90ZWN0ZWQgY29uZmlnID1cbiAgICBpbmplY3QoVFJBTlNMT0NPX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBkZWZhdWx0Q29uZmlnO1xuXG4gIHByb3RlY3RlZCBnZXQgaW50ZXJwb2xhdGlvbk1hdGNoZXIoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVNYXRjaGVyKHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHRyYW5zcGlsZSh7IHZhbHVlLCBwYXJhbXMgPSB7fSwgdHJhbnNsYXRpb24sIGtleSB9OiBUcmFuc3BpbGVQYXJhbXMpOiBhbnkge1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIGxldCBwYXJhbU1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgICAgbGV0IHBhcnNlZFZhbHVlID0gdmFsdWU7XG5cbiAgICAgIHdoaWxlIChcbiAgICAgICAgKHBhcmFtTWF0Y2ggPSB0aGlzLmludGVycG9sYXRpb25NYXRjaGVyLmV4ZWMocGFyc2VkVmFsdWUpKSAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFttYXRjaCwgcGFyYW1WYWx1ZV0gPSBwYXJhbU1hdGNoO1xuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnJlcGxhY2UobWF0Y2gsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhcmFtVmFsdWUudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW0gPSBnZXRWYWx1ZShwYXJhbXMsIG1hdGNoKTtcbiAgICAgICAgICBpZiAoaXNEZWZpbmVkKHBhcmFtKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpc0RlZmluZWQodHJhbnNsYXRpb25bbWF0Y2hdKVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zcGlsZSh7XG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHJhbnNsYXRpb25bbWF0Y2hdLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcykge1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuaGFuZGxlT2JqZWN0KHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgdHJhbnNsYXRpb24sXG4gICAgICAgICAga2V5LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmhhbmRsZUFycmF5KHsgdmFsdWUsIHBhcmFtcywgdHJhbnNsYXRpb24sIGtleSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogY29uc3QgZW4gPSB7XG4gICAqICBhOiB7XG4gICAqICAgIGI6IHtcbiAgICogICAgICBjOiBcIkhlbGxvIHt7IHZhbHVlIH19XCJcbiAgICogICAgfVxuICAgKiAgfVxuICAgKiB9XG4gICAqXG4gICAqIGNvbnN0IHBhcmFtcyA9ICB7XG4gICAqICBcImIuY1wiOiB7IHZhbHVlOiBcIlRyYW5zbG9jbyBcIn1cbiAgICogfVxuICAgKlxuICAgKiBzZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZSgnYScsIHBhcmFtcyk7XG4gICAqXG4gICAqIC8vIHRoZSBmaXJzdCBwYXJhbSB3aWxsIGJlIHRoZSByZXN1bHQgb2YgYGVuLmFgLlxuICAgKiAvLyB0aGUgc2Vjb25kIHBhcmFtIHdpbGwgYmUgYHBhcmFtc2AuXG4gICAqIHBhcnNlci50cmFuc3BpbGUodmFsdWUsIHBhcmFtcywge30pO1xuICAgKlxuICAgKlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZU9iamVjdCh7XG4gICAgdmFsdWUsXG4gICAgcGFyYW1zID0ge30sXG4gICAgdHJhbnNsYXRpb24sXG4gICAga2V5LFxuICB9OiBUcmFuc3BpbGVQYXJhbXM8UmVjb3JkPGFueSwgYW55Pj4pIHtcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWU7XG5cbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKHApID0+IHtcbiAgICAgIC8vIHRyYW5zcGlsZSB0aGUgdmFsdWUgPT4gXCJIZWxsbyBUcmFuc2xvY29cIlxuICAgICAgY29uc3QgdHJhbnNwaWxlZCA9IHRoaXMudHJhbnNwaWxlKHtcbiAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSBvZiBcImIuY1wiIGluc2lkZSBcImFcIiA9PiBcIkhlbGxvIHt7IHZhbHVlIH19XCJcbiAgICAgICAgdmFsdWU6IGdldFZhbHVlKHJlc3VsdCwgcCksXG4gICAgICAgIC8vIGdldCB0aGUgcGFyYW1zIG9mIFwiYi5jXCIgPT4geyB2YWx1ZTogXCJUcmFuc2xvY29cIiB9XG4gICAgICAgIHBhcmFtczogZ2V0VmFsdWUocGFyYW1zLCBwKSxcbiAgICAgICAgdHJhbnNsYXRpb24sXG4gICAgICAgIGtleSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXQgXCJiLmNcIiB0byBgdHJhbnNwaWxlZGBcbiAgICAgIHJlc3VsdCA9IHNldFZhbHVlKHJlc3VsdCwgcCwgdHJhbnNwaWxlZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUFycmF5KHsgdmFsdWUsIC4uLnJlc3QgfTogVHJhbnNwaWxlUGFyYW1zPHVua25vd25bXT4pIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PlxuICAgICAgdGhpcy50cmFuc3BpbGUoe1xuICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU1hdGNoZXIoY29uZmlnOiBUcmFuc2xvY29Db25maWcpOiBSZWdFeHAge1xuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBjb25maWcuaW50ZXJwb2xhdGlvbjtcblxuICByZXR1cm4gbmV3IFJlZ0V4cChgJHtzdGFydH0oW14ke3N0YXJ0fSR7ZW5kfV0qPykke2VuZH1gLCAnZycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1RyYW5zcGlsZXJGdW5jdGlvbiB7XG4gIHRyYW5zcGlsZSguLi5hcmdzOiBzdHJpbmdbXSk6IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhhcmdzU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwbGl0dGVkID0gYXJnc1N0cmluZyA/IGFyZ3NTdHJpbmcuc3BsaXQoJywnKSA6IFtdO1xuICBjb25zdCBhcmdzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgdmFsdWUgPSBzcGxpdHRlZFtpXS50cmltKCk7XG4gICAgd2hpbGUgKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgIGkrKztcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXCcsICcsJykgKyBzcGxpdHRlZFtpXTtcbiAgICB9XG4gICAgYXJncy5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25hbFRyYW5zcGlsZXJcbiAgZXh0ZW5kcyBEZWZhdWx0VHJhbnNwaWxlclxuICBpbXBsZW1lbnRzIFRyYW5zbG9jb1RyYW5zcGlsZXJcbntcbiAgcHJvdGVjdGVkIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICB0cmFuc3BpbGUoeyB2YWx1ZSwgLi4ucmVzdCB9OiBUcmFuc3BpbGVQYXJhbXMpIHtcbiAgICBsZXQgdHJhbnNwaWxlZCA9IHZhbHVlO1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHRyYW5zcGlsZWQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgICAvXFxbXFxbXFxzKihcXHcrKVxcKCguKj8pXFwpXFxzKl1dL2csXG4gICAgICAgIChtYXRjaDogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZywgYXJnczogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmM6IFRyYW5zbG9jb1RyYW5zcGlsZXJGdW5jdGlvbiA9XG4gICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KGZ1bmN0aW9uTmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jLnRyYW5zcGlsZSguLi5nZXRGdW5jdGlvbkFyZ3MoYXJncykpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYFRoZXJlIGlzIGFuIGVycm9yIGluOiAnJHt2YWx1ZX0nLiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhhdCB0aGUgeW91IHVzZWQgdGhlIHJpZ2h0IHN5bnRheCBpbiB5b3VyIHRyYW5zbGF0aW9uIGFuZCB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAke2Z1bmN0aW9uTmFtZX0gaXMgY29ycmVjdC5gO1xuICAgICAgICAgICAgaWYgKChlIGFzIEVycm9yKS5tZXNzYWdlLmluY2x1ZGVzKCdOdWxsSW5qZWN0b3JFcnJvcicpKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBgWW91IGFyZSB1c2luZyB0aGUgJyR7ZnVuY3Rpb25OYW1lfScgZnVuY3Rpb24gaW4geW91ciB0cmFuc2xhdGlvbiBidXQgbm8gcHJvdmlkZXIgd2FzIGZvdW5kIWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIudHJhbnNwaWxlKHsgdmFsdWU6IHRyYW5zcGlsZWQsIC4uLnJlc3QgfSk7XG4gIH1cbn1cbiJdfQ==