UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

254 lines 27.9 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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.TypeScriptTranspile = void 0; const reflect = __importStar(require("jsii-reflect")); const transpile = __importStar(require("./transpile")); const schema_1 = require("../schema"); // eslint-disable-next-line @typescript-eslint/no-require-imports const Case = require('case'); // Helpers const toCamelCase = (text) => { return Case.camel(text !== null && text !== void 0 ? text : ''); }; const formatArguments = (inputs) => { return inputs.join(', '); }; const formatStructInitialization = (type) => { const target = type.submodule ? `${type.namespace}.${type.name}` : type.name; return `const ${toCamelCase(type.name)}: ${target} = { ... }`; }; const formatClassInitialization = (type, inputs) => { const target = type.submodule ? `${type.namespace}.${type.name}` : type.name; return `new ${target}(${formatArguments(inputs)})`; }; const formatInvocation = (type, inputs, method) => { let target = type.submodule ? `${type.namespace}.${type.name}` : type.name; if (method) { target = `${target}.${method}`; } return `${target}(${formatArguments(inputs)})`; }; const formatImport = (type) => { if (type.submodule) { return `import { ${type.submodule} } from '${type.module}'`; } else { return `import { ${type.name} } from '${type.module}'`; } }; const formatSignature = (name, inputs, returns) => { return `public ${name}(${formatArguments(inputs)})${returns ? ': ' + returns : ''}`; }; /** * A TypeScript transpiler. */ class TypeScriptTranspile extends transpile.TranspileBase { constructor() { super(transpile.Language.TYPESCRIPT); } readme(readme) { return readme; } unionOf(types) { return `${types.join(' | ')}`; } intersectionOf(types) { return types.join(' & '); } listOf(type) { return `${parenthesize(type)}[]`; } variadicOf(type) { return `...${this.listOf(type)}`; } mapOf(type) { return `{[ key: string ]: ${type}}`; } any() { return 'any'; } void() { return 'void'; } boolean() { return 'boolean'; } str() { return 'string'; } number() { return 'number'; } date() { return 'Date'; } json() { return 'object'; } enum(enu) { return { fqn: this.type(enu).fqn, name: enu.name, }; } enumMember(em) { return { fqn: `${this.enum(em.enumType).fqn}.${em.name}`, name: em.name, }; } property(property) { const typeRef = this.typeReference(property.type); return { name: property.name, parentType: this.type(property.parentType), typeReference: typeRef, optional: property.optional, declaration: this.formatProperty(property.name, typeRef), }; } class(klass) { return { name: klass.name, type: this.type(klass), }; } parameter(parameter) { const typeRef = this.typeReference(parameter.type); return { name: parameter.name, parentType: this.type(parameter.parentType), typeReference: typeRef, optional: parameter.optional, variadic: parameter.variadic, declaration: this.formatProperty(parameter.name, typeRef), }; } struct(struct) { const type = this.type(struct); return { type: type, name: struct.name, import: formatImport(type), initialization: formatStructInitialization(type), }; } callable(callable) { const type = this.type(callable.parentType); const parameters = callable.parameters.sort(this.optionalityCompare); const name = callable.name; const inputs = parameters.map((p) => this.formatParameters(this.parameter(p))); const invocation = reflect.Initializer.isInitializer(callable) ? formatClassInitialization(type, inputs) : formatInvocation(type, inputs, name); let returnType; if (reflect.Initializer.isInitializer(callable)) { returnType = this.typeReference(callable.parentType.reference); } else if (reflect.Method.isMethod(callable)) { returnType = this.typeReference(callable.returns.type); } const returns = returnType === null || returnType === void 0 ? void 0 : returnType.toString({ typeFormatter: (t) => t.name, }); return { name, parentType: type, import: formatImport(type), parameters, signatures: [formatSignature(name, inputs, returns)], invocations: [invocation], returnType, }; } interface(iface) { return { name: iface.name, type: this.type(iface), }; } type(type) { const submodule = this.findSubmodule(type); const moduleLike = this.moduleLike(submodule ? submodule : type.assembly); const fqn = [moduleLike.name]; if (type.namespace) { fqn.push(type.namespace); } fqn.push(type.name); return new transpile.TranspiledType({ fqn: fqn.join('.'), name: type.name, namespace: type.namespace, module: moduleLike.name, submodule: moduleLike.submodule, submodulePath: (0, schema_1.submodulePath)(submodule), source: type, language: this.language, }); } moduleLike(moduleLike) { if (moduleLike instanceof reflect.Submodule) { const fqnParts = moduleLike.fqn.split('.'); return { name: fqnParts[0], submodule: fqnParts[1] }; } return { name: moduleLike.fqn }; } formatParameters(transpiled) { const tf = transpiled.typeReference.toString({ typeFormatter: (t) => t.name, }); if (transpiled.variadic) { return `${transpiled.name}: ${this.variadicOf(tf)}`; } return `${transpiled.name}${transpiled.optional ? '?' : ''}: ${tf}`; } formatProperty(name, typeReference) { const tf = typeReference.toString({ typeFormatter: (t) => t.name, }); return `public readonly ${name}: ${tf};`; } } exports.TypeScriptTranspile = TypeScriptTranspile; /** * Parenthesize a subexpression if necessary and not already done */ function parenthesize(x) { const necessary = x.includes('|') || x.includes('&'); const alreadyDone = x.startsWith('(') && x.endsWith(')'); return necessary && !alreadyDone ? `(${x})` : x; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb2NnZW4vdHJhbnNwaWxlL3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXdDO0FBQ3hDLHVEQUF5QztBQUN6QyxzQ0FBMEM7QUFDMUMsaUVBQWlFO0FBQ2pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU3QixVQUFVO0FBQ1YsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFnQixFQUFFLEVBQUU7SUFDM0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQztBQUVGLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxJQUE4QixFQUFFLEVBQUU7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM3RSxPQUFPLFNBQVMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNoRSxDQUFDLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHLENBQ2hDLElBQThCLEVBQzlCLE1BQWdCLEVBQ2hCLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUks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QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgKiBhcyB0cmFuc3BpbGUgZnJvbSAnLi90cmFuc3BpbGUnO1xuaW1wb3J0IHsgc3VibW9kdWxlUGF0aCB9IGZyb20gJy4uL3NjaGVtYSc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgQ2FzZSA9IHJlcXVpcmUoJ2Nhc2UnKTtcblxuLy8gSGVscGVyc1xuY29uc3QgdG9DYW1lbENhc2UgPSAodGV4dD86IHN0cmluZykgPT4ge1xuICByZXR1cm4gQ2FzZS5jYW1lbCh0ZXh0ID8/ICcnKTtcbn07XG5cbmNvbnN0IGZvcm1hdEFyZ3VtZW50cyA9IChpbnB1dHM6IHN0cmluZ1tdKSA9PiB7XG4gIHJldHVybiBpbnB1dHMuam9pbignLCAnKTtcbn07XG5cbmNvbnN0IGZvcm1hdFN0cnVjdEluaXRpYWxpemF0aW9uID0gKHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSkgPT4ge1xuICBjb25zdCB0YXJnZXQgPSB0eXBlLnN1Ym1vZHVsZSA/IGAke3R5cGUubmFtZXNwYWNlfS4ke3R5cGUubmFtZX1gIDogdHlwZS5uYW1lO1xuICByZXR1cm4gYGNvbnN0ICR7dG9DYW1lbENhc2UodHlwZS5uYW1lKX06ICR7dGFyZ2V0fSA9IHsgLi4uIH1gO1xufTtcblxuY29uc3QgZm9ybWF0Q2xhc3NJbml0aWFsaXphdGlvbiA9IChcbiAgdHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLFxuICBpbnB1dHM6IHN0cmluZ1tdLFxuKSA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IHR5cGUuc3VibW9kdWxlID8gYCR7dHlwZS5uYW1lc3BhY2V9LiR7dHlwZS5uYW1lfWAgOiB0eXBlLm5hbWU7XG4gIHJldHVybiBgbmV3ICR7dGFyZ2V0fSgke2Zvcm1hdEFyZ3VtZW50cyhpbnB1dHMpfSlgO1xufTtcblxuY29uc3QgZm9ybWF0SW52b2NhdGlvbiA9IChcbiAgdHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLFxuICBpbnB1dHM6IHN0cmluZ1tdLFxuICBtZXRob2Q6IHN0cmluZyxcbikgPT4ge1xuICBsZXQgdGFyZ2V0ID0gdHlwZS5zdWJtb2R1bGUgPyBgJHt0eXBlLm5hbWVzcGFjZX0uJHt0eXBlLm5hbWV9YCA6IHR5cGUubmFtZTtcbiAgaWYgKG1ldGhvZCkge1xuICAgIHRhcmdldCA9IGAke3RhcmdldH0uJHttZXRob2R9YDtcbiAgfVxuICByZXR1cm4gYCR7dGFyZ2V0fSgke2Zvcm1hdEFyZ3VtZW50cyhpbnB1dHMpfSlgO1xufTtcblxuY29uc3QgZm9ybWF0SW1wb3J0ID0gKHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSkgPT4ge1xuICBpZiAodHlwZS5zdWJtb2R1bGUpIHtcbiAgICByZXR1cm4gYGltcG9ydCB7ICR7dHlwZS5zdWJtb2R1bGV9IH0gZnJvbSAnJHt0eXBlLm1vZHVsZX0nYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYGltcG9ydCB7ICR7dHlwZS5uYW1lfSB9IGZyb20gJyR7dHlwZS5tb2R1bGV9J2A7XG4gIH1cbn07XG5cbmNvbnN0IGZvcm1hdFNpZ25hdHVyZSA9IChuYW1lOiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10sIHJldHVybnM/OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGBwdWJsaWMgJHtuYW1lfSgke2Zvcm1hdEFyZ3VtZW50cyhpbnB1dHMpfSkke3JldHVybnMgPyAnOiAnICsgcmV0dXJucyA6ICcnfWA7XG59O1xuXG4vKipcbiAqIEEgVHlwZVNjcmlwdCB0cmFuc3BpbGVyLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZVNjcmlwdFRyYW5zcGlsZSBleHRlbmRzIHRyYW5zcGlsZS5UcmFuc3BpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJhbnNwaWxlLkxhbmd1YWdlLlRZUEVTQ1JJUFQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRtZShyZWFkbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlYWRtZTtcbiAgfVxuXG4gIHB1YmxpYyB1bmlvbk9mKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3R5cGVzLmpvaW4oJyB8ICcpfWA7XG4gIH1cblxuICBwdWJsaWMgaW50ZXJzZWN0aW9uT2YodHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZXMuam9pbignICYgJyk7XG4gIH1cblxuICBwdWJsaWMgbGlzdE9mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3BhcmVudGhlc2l6ZSh0eXBlKX1bXWA7XG4gIH1cblxuICBwdWJsaWMgdmFyaWFkaWNPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLi4uJHt0aGlzLmxpc3RPZih0eXBlKX1gO1xuICB9XG5cbiAgcHVibGljIG1hcE9mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB7WyBrZXk6IHN0cmluZyBdOiAke3R5cGV9fWA7XG4gIH1cblxuICBwdWJsaWMgYW55KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdhbnknO1xuICB9XG5cbiAgcHVibGljIHZvaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3ZvaWQnO1xuICB9XG5cbiAgcHVibGljIGJvb2xlYW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICB9XG5cbiAgcHVibGljIHN0cigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBudW1iZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ251bWJlcic7XG4gIH1cblxuICBwdWJsaWMgZGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnRGF0ZSc7XG4gIH1cblxuICBwdWJsaWMganNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnb2JqZWN0JztcbiAgfVxuXG4gIHB1YmxpYyBlbnVtKGVudTogcmVmbGVjdC5FbnVtVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogdGhpcy50eXBlKGVudSkuZnFuLFxuICAgICAgbmFtZTogZW51Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlbnVtTWVtYmVyKGVtOiByZWZsZWN0LkVudW1NZW1iZXIpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEVudW1NZW1iZXIge1xuICAgIHJldHVybiB7XG4gICAgICBmcW46IGAke3RoaXMuZW51bShlbS5lbnVtVHlwZSkuZnFufS4ke2VtLm5hbWV9YCxcbiAgICAgIG5hbWU6IGVtLm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9wZXJ0eShwcm9wZXJ0eTogcmVmbGVjdC5Qcm9wZXJ0eSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUHJvcGVydHkge1xuICAgIGNvbnN0IHR5cGVSZWYgPSB0aGlzLnR5cGVSZWZlcmVuY2UocHJvcGVydHkudHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHByb3BlcnR5Lm5hbWUsXG4gICAgICBwYXJlbnRUeXBlOiB0aGlzLnR5cGUocHJvcGVydHkucGFyZW50VHlwZSksXG4gICAgICB0eXBlUmVmZXJlbmNlOiB0eXBlUmVmLFxuICAgICAgb3B0aW9uYWw6IHByb3BlcnR5Lm9wdGlvbmFsLFxuICAgICAgZGVjbGFyYXRpb246IHRoaXMuZm9ybWF0UHJvcGVydHkocHJvcGVydHkubmFtZSwgdHlwZVJlZiksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjbGFzcyhrbGFzczogcmVmbGVjdC5DbGFzc1R5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZENsYXNzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToga2xhc3MubmFtZSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZShrbGFzcyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJhbWV0ZXIoXG4gICAgcGFyYW1ldGVyOiByZWZsZWN0LlBhcmFtZXRlcixcbiAgKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRQYXJhbWV0ZXIge1xuICAgIGNvbnN0IHR5cGVSZWYgPSB0aGlzLnR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwYXJhbWV0ZXIubmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwYXJhbWV0ZXIucGFyZW50VHlwZSksXG4gICAgICB0eXBlUmVmZXJlbmNlOiB0eXBlUmVmLFxuICAgICAgb3B0aW9uYWw6IHBhcmFtZXRlci5vcHRpb25hbCxcbiAgICAgIHZhcmlhZGljOiBwYXJhbWV0ZXIudmFyaWFkaWMsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQcm9wZXJ0eShwYXJhbWV0ZXIubmFtZSwgdHlwZVJlZiksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJ1Y3Qoc3RydWN0OiByZWZsZWN0LkludGVyZmFjZVR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFN0cnVjdCB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShzdHJ1Y3QpO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbmFtZTogc3RydWN0Lm5hbWUsXG4gICAgICBpbXBvcnQ6IGZvcm1hdEltcG9ydCh0eXBlKSxcbiAgICAgIGluaXRpYWxpemF0aW9uOiBmb3JtYXRTdHJ1Y3RJbml0aWFsaXphdGlvbih0eXBlKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNhbGxhYmxlKGNhbGxhYmxlOiByZWZsZWN0LkNhbGxhYmxlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRDYWxsYWJsZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShjYWxsYWJsZS5wYXJlbnRUeXBlKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gY2FsbGFibGUucGFyYW1ldGVycy5zb3J0KHRoaXMub3B0aW9uYWxpdHlDb21wYXJlKTtcbiAgICBjb25zdCBuYW1lID0gY2FsbGFibGUubmFtZTtcbiAgICBjb25zdCBpbnB1dHMgPSBwYXJhbWV0ZXJzLm1hcCgocCkgPT4gdGhpcy5mb3JtYXRQYXJhbWV0ZXJzKHRoaXMucGFyYW1ldGVyKHApKSk7XG5cbiAgICBjb25zdCBpbnZvY2F0aW9uID0gcmVmbGVjdC5Jbml0aWFsaXplci5pc0luaXRpYWxpemVyKGNhbGxhYmxlKVxuICAgICAgPyBmb3JtYXRDbGFzc0luaXRpYWxpemF0aW9uKHR5cGUsIGlucHV0cylcbiAgICAgIDogZm9ybWF0SW52b2NhdGlvbih0eXBlLCBpbnB1dHMsIG5hbWUpO1xuXG4gICAgbGV0IHJldHVyblR5cGU6IHRyYW5zcGlsZS5JVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmxlY3QuSW5pdGlhbGl6ZXIuaXNJbml0aWFsaXplcihjYWxsYWJsZSkpIHtcbiAgICAgIHJldHVyblR5cGUgPSB0aGlzLnR5cGVSZWZlcmVuY2UoY2FsbGFibGUucGFyZW50VHlwZS5yZWZlcmVuY2UpO1xuICAgIH0gZWxzZSBpZiAocmVmbGVjdC5NZXRob2QuaXNNZXRob2QoY2FsbGFibGUpKSB7XG4gICAgICByZXR1cm5UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlKGNhbGxhYmxlLnJldHVybnMudHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHJldHVybnMgPSByZXR1cm5UeXBlPy50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXJlbnRUeXBlOiB0eXBlLFxuICAgICAgaW1wb3J0OiBmb3JtYXRJbXBvcnQodHlwZSksXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICAgc2lnbmF0dXJlczogW2Zvcm1hdFNpZ25hdHVyZShuYW1lLCBpbnB1dHMsIHJldHVybnMpXSxcbiAgICAgIGludm9jYXRpb25zOiBbaW52b2NhdGlvbl0sXG4gICAgICByZXR1cm5UeXBlLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgaW50ZXJmYWNlKFxuICAgIGlmYWNlOiByZWZsZWN0LkludGVyZmFjZVR5cGUsXG4gICk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkSW50ZXJmYWNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogaWZhY2UubmFtZSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZShpZmFjZSksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB0eXBlKHR5cGU6IHJlZmxlY3QuVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5maW5kU3VibW9kdWxlKHR5cGUpO1xuICAgIGNvbnN0IG1vZHVsZUxpa2UgPSB0aGlzLm1vZHVsZUxpa2Uoc3VibW9kdWxlID8gc3VibW9kdWxlIDogdHlwZS5hc3NlbWJseSk7XG5cbiAgICBjb25zdCBmcW4gPSBbbW9kdWxlTGlrZS5uYW1lXTtcblxuICAgIGlmICh0eXBlLm5hbWVzcGFjZSkge1xuICAgICAgZnFuLnB1c2godHlwZS5uYW1lc3BhY2UpO1xuICAgIH1cbiAgICBmcW4ucHVzaCh0eXBlLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUoe1xuICAgICAgZnFuOiBmcW4uam9pbignLicpLFxuICAgICAgbmFtZTogdHlwZS5uYW1lLFxuICAgICAgbmFtZXNwYWNlOiB0eXBlLm5hbWVzcGFjZSxcbiAgICAgIG1vZHVsZTogbW9kdWxlTGlrZS5uYW1lLFxuICAgICAgc3VibW9kdWxlOiBtb2R1bGVMaWtlLnN1Ym1vZHVsZSxcbiAgICAgIHN1Ym1vZHVsZVBhdGg6IHN1Ym1vZHVsZVBhdGgoc3VibW9kdWxlKSxcbiAgICAgIHNvdXJjZTogdHlwZSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vZHVsZUxpa2UoXG4gICAgbW9kdWxlTGlrZTogcmVmbGVjdC5Nb2R1bGVMaWtlLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZE1vZHVsZUxpa2Uge1xuICAgIGlmIChtb2R1bGVMaWtlIGluc3RhbmNlb2YgcmVmbGVjdC5TdWJtb2R1bGUpIHtcbiAgICAgIGNvbnN0IGZxblBhcnRzID0gbW9kdWxlTGlrZS5mcW4uc3BsaXQoJy4nKTtcbiAgICAgIHJldHVybiB7IG5hbWU6IGZxblBhcnRzWzBdLCBzdWJtb2R1bGU6IGZxblBhcnRzWzFdIH07XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IG1vZHVsZUxpa2UuZnFuIH07XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBhcmFtZXRlcnMoXG4gICAgdHJhbnNwaWxlZDogdHJhbnNwaWxlLlRyYW5zcGlsZWRQYXJhbWV0ZXIsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdGYgPSB0cmFuc3BpbGVkLnR5cGVSZWZlcmVuY2UudG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIGlmICh0cmFuc3BpbGVkLnZhcmlhZGljKSB7XG4gICAgICByZXR1cm4gYCR7dHJhbnNwaWxlZC5uYW1lfTogJHt0aGlzLnZhcmlhZGljT2YodGYpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3RyYW5zcGlsZWQubmFtZX0ke3RyYW5zcGlsZWQub3B0aW9uYWwgPyAnPycgOiAnJ306ICR7dGZ9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UHJvcGVydHkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGVSZWZlcmVuY2U6IHRyYW5zcGlsZS5JVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdGYgPSB0eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGBwdWJsaWMgcmVhZG9ubHkgJHtuYW1lfTogJHt0Zn07YDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcmVudGhlc2l6ZSBhIHN1YmV4cHJlc3Npb24gaWYgbmVjZXNzYXJ5IGFuZCBub3QgYWxyZWFkeSBkb25lXG4gKi9cbmZ1bmN0aW9uIHBhcmVudGhlc2l6ZSh4OiBzdHJpbmcpIHtcbiAgY29uc3QgbmVjZXNzYXJ5ID0geC5pbmNsdWRlcygnfCcpIHx8IHguaW5jbHVkZXMoJyYnKTtcbiAgY29uc3QgYWxyZWFkeURvbmUgPSB4LnN0YXJ0c1dpdGgoJygnKSAmJiB4LmVuZHNXaXRoKCcpJyk7XG5cbiAgcmV0dXJuIG5lY2Vzc2FyeSAmJiAhYWxyZWFkeURvbmUgPyBgKCR7eH0pYCA6IHg7XG59XG4iXX0=