UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

243 lines 26.5 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(' | ')}`; } listOf(type) { return `${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; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb2NnZW4vdHJhbnNwaWxlL3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXdDO0FBQ3hDLHVEQUF5QztBQUN6QyxzQ0FBMEM7QUFDMUMsaUVBQWlFO0FBQ2pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU3QixVQUFVO0FBQ1YsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFnQixFQUFFLEVBQUU7SUFDM0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQztBQUVGLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxJQUE4QixFQUFFLEVBQUU7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM3RSxPQUFPLFNBQVMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNoRSxDQUFDLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHLENBQ2hDLElBQThCLEVBQzlCLE1BQWdCLEVBQ2hCLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUks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LGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEIsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osYUFBZ0Q7UUFFaEQsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNoQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUNILE9BQU8sbUJBQW1CLElBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUE3TUQsa0RBNk1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgdHJhbnNwaWxlIGZyb20gJy4vdHJhbnNwaWxlJztcbmltcG9ydCB7IHN1Ym1vZHVsZVBhdGggfSBmcm9tICcuLi9zY2hlbWEnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IENhc2UgPSByZXF1aXJlKCdjYXNlJyk7XG5cbi8vIEhlbHBlcnNcbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHRleHQ/OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIENhc2UuY2FtZWwodGV4dCA/PyAnJyk7XG59O1xuXG5jb25zdCBmb3JtYXRBcmd1bWVudHMgPSAoaW5wdXRzOiBzdHJpbmdbXSkgPT4ge1xuICByZXR1cm4gaW5wdXRzLmpvaW4oJywgJyk7XG59O1xuXG5jb25zdCBmb3JtYXRTdHJ1Y3RJbml0aWFsaXphdGlvbiA9ICh0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUpID0+IHtcbiAgY29uc3QgdGFyZ2V0ID0gdHlwZS5zdWJtb2R1bGUgPyBgJHt0eXBlLm5hbWVzcGFjZX0uJHt0eXBlLm5hbWV9YCA6IHR5cGUubmFtZTtcbiAgcmV0dXJuIGBjb25zdCAke3RvQ2FtZWxDYXNlKHR5cGUubmFtZSl9OiAke3RhcmdldH0gPSB7IC4uLiB9YDtcbn07XG5cbmNvbnN0IGZvcm1hdENsYXNzSW5pdGlhbGl6YXRpb24gPSAoXG4gIHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSxcbiAgaW5wdXRzOiBzdHJpbmdbXSxcbikgPT4ge1xuICBjb25zdCB0YXJnZXQgPSB0eXBlLnN1Ym1vZHVsZSA/IGAke3R5cGUubmFtZXNwYWNlfS4ke3R5cGUubmFtZX1gIDogdHlwZS5uYW1lO1xuICByZXR1cm4gYG5ldyAke3RhcmdldH0oJHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX0pYDtcbn07XG5cbmNvbnN0IGZvcm1hdEludm9jYXRpb24gPSAoXG4gIHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSxcbiAgaW5wdXRzOiBzdHJpbmdbXSxcbiAgbWV0aG9kOiBzdHJpbmcsXG4pID0+IHtcbiAgbGV0IHRhcmdldCA9IHR5cGUuc3VibW9kdWxlID8gYCR7dHlwZS5uYW1lc3BhY2V9LiR7dHlwZS5uYW1lfWAgOiB0eXBlLm5hbWU7XG4gIGlmIChtZXRob2QpIHtcbiAgICB0YXJnZXQgPSBgJHt0YXJnZXR9LiR7bWV0aG9kfWA7XG4gIH1cbiAgcmV0dXJuIGAke3RhcmdldH0oJHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX0pYDtcbn07XG5cbmNvbnN0IGZvcm1hdEltcG9ydCA9ICh0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUpID0+IHtcbiAgaWYgKHR5cGUuc3VibW9kdWxlKSB7XG4gICAgcmV0dXJuIGBpbXBvcnQgeyAke3R5cGUuc3VibW9kdWxlfSB9IGZyb20gJyR7dHlwZS5tb2R1bGV9J2A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBpbXBvcnQgeyAke3R5cGUubmFtZX0gfSBmcm9tICcke3R5cGUubW9kdWxlfSdgO1xuICB9XG59O1xuXG5jb25zdCBmb3JtYXRTaWduYXR1cmUgPSAobmFtZTogc3RyaW5nLCBpbnB1dHM6IHN0cmluZ1tdLCByZXR1cm5zPzogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBgcHVibGljICR7bmFtZX0oJHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX0pJHtyZXR1cm5zID8gJzogJyArIHJldHVybnMgOiAnJ31gO1xufTtcblxuLyoqXG4gKiBBIFR5cGVTY3JpcHQgdHJhbnNwaWxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRUcmFuc3BpbGUgZXh0ZW5kcyB0cmFuc3BpbGUuVHJhbnNwaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRyYW5zcGlsZS5MYW5ndWFnZS5UWVBFU0NSSVBUKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkbWUocmVhZG1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZWFkbWU7XG4gIH1cblxuICBwdWJsaWMgdW5pb25PZih0eXBlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0eXBlcy5qb2luKCcgfCAnKX1gO1xuICB9XG5cbiAgcHVibGljIGxpc3RPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0eXBlfVtdYDtcbiAgfVxuXG4gIHB1YmxpYyB2YXJpYWRpY09mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAuLi4ke3RoaXMubGlzdE9mKHR5cGUpfWA7XG4gIH1cblxuICBwdWJsaWMgbWFwT2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHtbIGtleTogc3RyaW5nIF06ICR7dHlwZX19YDtcbiAgfVxuXG4gIHB1YmxpYyBhbnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FueSc7XG4gIH1cblxuICBwdWJsaWMgdm9pZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAndm9pZCc7XG4gIH1cblxuICBwdWJsaWMgYm9vbGVhbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIG51bWJlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnbnVtYmVyJztcbiAgfVxuXG4gIHB1YmxpYyBkYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdEYXRlJztcbiAgfVxuXG4gIHB1YmxpYyBqc29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdvYmplY3QnO1xuICB9XG5cbiAgcHVibGljIGVudW0oZW51OiByZWZsZWN0LkVudW1UeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRFbnVtIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnFuOiB0aGlzLnR5cGUoZW51KS5mcW4sXG4gICAgICBuYW1lOiBlbnUubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVudW1NZW1iZXIoZW06IHJlZmxlY3QuRW51bU1lbWJlcik6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bU1lbWJlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogYCR7dGhpcy5lbnVtKGVtLmVudW1UeXBlKS5mcW59LiR7ZW0ubmFtZX1gLFxuICAgICAgbmFtZTogZW0ubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5KHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5KTogdHJhbnNwaWxlLlRyYW5zcGlsZWRQcm9wZXJ0eSB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwcm9wZXJ0eS50eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwcm9wZXJ0eS5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcHJvcGVydHkub3B0aW9uYWwsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNsYXNzKGtsYXNzOiByZWZsZWN0LkNsYXNzVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkQ2xhc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBrbGFzcy5uYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlKGtsYXNzKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHBhcmFtZXRlcihcbiAgICBwYXJhbWV0ZXI6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlciB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBhcmFtZXRlci5uYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHBhcmFtZXRlci5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcGFyYW1ldGVyLm9wdGlvbmFsLFxuICAgICAgdmFyaWFkaWM6IHBhcmFtZXRlci52YXJpYWRpYyxcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmZvcm1hdFByb3BlcnR5KHBhcmFtZXRlci5uYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0cnVjdChzdHJ1Y3Q6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkU3RydWN0IHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKHN0cnVjdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBzdHJ1Y3QubmFtZSxcbiAgICAgIGltcG9ydDogZm9ybWF0SW1wb3J0KHR5cGUpLFxuICAgICAgaW5pdGlhbGl6YXRpb246IGZvcm1hdFN0cnVjdEluaXRpYWxpemF0aW9uKHR5cGUpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2FsbGFibGUoY2FsbGFibGU6IHJlZmxlY3QuQ2FsbGFibGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZENhbGxhYmxlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKGNhbGxhYmxlLnBhcmVudFR5cGUpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBjYWxsYWJsZS5wYXJhbWV0ZXJzLnNvcnQodGhpcy5vcHRpb25hbGl0eUNvbXBhcmUpO1xuICAgIGNvbnN0IG5hbWUgPSBjYWxsYWJsZS5uYW1lO1xuICAgIGNvbnN0IGlucHV0cyA9IHBhcmFtZXRlcnMubWFwKChwKSA9PiB0aGlzLmZvcm1hdFBhcmFtZXRlcnModGhpcy5wYXJhbWV0ZXIocCkpKTtcblxuICAgIGNvbnN0IGludm9jYXRpb24gPSByZWZsZWN0LkluaXRpYWxpemVyLmlzSW5pdGlhbGl6ZXIoY2FsbGFibGUpXG4gICAgICA/IGZvcm1hdENsYXNzSW5pdGlhbGl6YXRpb24odHlwZSwgaW5wdXRzKVxuICAgICAgOiBmb3JtYXRJbnZvY2F0aW9uKHR5cGUsIGlucHV0cywgbmFtZSk7XG5cbiAgICBsZXQgcmV0dXJuVHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZWZsZWN0LkluaXRpYWxpemVyLmlzSW5pdGlhbGl6ZXIoY2FsbGFibGUpKSB7XG4gICAgICByZXR1cm5UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlKGNhbGxhYmxlLnBhcmVudFR5cGUucmVmZXJlbmNlKTtcbiAgICB9IGVsc2UgaWYgKHJlZmxlY3QuTWV0aG9kLmlzTWV0aG9kKGNhbGxhYmxlKSkge1xuICAgICAgcmV0dXJuVHlwZSA9IHRoaXMudHlwZVJlZmVyZW5jZShjYWxsYWJsZS5yZXR1cm5zLnR5cGUpO1xuICAgIH1cbiAgICBjb25zdCByZXR1cm5zID0gcmV0dXJuVHlwZT8udG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdHlwZSxcbiAgICAgIGltcG9ydDogZm9ybWF0SW1wb3J0KHR5cGUpLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICAgIHNpZ25hdHVyZXM6IFtmb3JtYXRTaWduYXR1cmUobmFtZSwgaW5wdXRzLCByZXR1cm5zKV0sXG4gICAgICBpbnZvY2F0aW9uczogW2ludm9jYXRpb25dLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGludGVyZmFjZShcbiAgICBpZmFjZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEludGVyZmFjZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGlmYWNlLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUoaWZhY2UpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdHlwZSh0eXBlOiByZWZsZWN0LlR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuZmluZFN1Ym1vZHVsZSh0eXBlKTtcbiAgICBjb25zdCBtb2R1bGVMaWtlID0gdGhpcy5tb2R1bGVMaWtlKHN1Ym1vZHVsZSA/IHN1Ym1vZHVsZSA6IHR5cGUuYXNzZW1ibHkpO1xuXG4gICAgY29uc3QgZnFuID0gW21vZHVsZUxpa2UubmFtZV07XG5cbiAgICBpZiAodHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIGZxbi5wdXNoKHR5cGUubmFtZXNwYWNlKTtcbiAgICB9XG4gICAgZnFuLnB1c2godHlwZS5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlKHtcbiAgICAgIGZxbjogZnFuLmpvaW4oJy4nKSxcbiAgICAgIG5hbWU6IHR5cGUubmFtZSxcbiAgICAgIG5hbWVzcGFjZTogdHlwZS5uYW1lc3BhY2UsXG4gICAgICBtb2R1bGU6IG1vZHVsZUxpa2UubmFtZSxcbiAgICAgIHN1Ym1vZHVsZTogbW9kdWxlTGlrZS5zdWJtb2R1bGUsXG4gICAgICBzdWJtb2R1bGVQYXRoOiBzdWJtb2R1bGVQYXRoKHN1Ym1vZHVsZSksXG4gICAgICBzb3VyY2U6IHR5cGUsXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb2R1bGVMaWtlKFxuICAgIG1vZHVsZUxpa2U6IHJlZmxlY3QuTW9kdWxlTGlrZSxcbiAgKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRNb2R1bGVMaWtlIHtcbiAgICBpZiAobW9kdWxlTGlrZSBpbnN0YW5jZW9mIHJlZmxlY3QuU3VibW9kdWxlKSB7XG4gICAgICBjb25zdCBmcW5QYXJ0cyA9IG1vZHVsZUxpa2UuZnFuLnNwbGl0KCcuJyk7XG4gICAgICByZXR1cm4geyBuYW1lOiBmcW5QYXJ0c1swXSwgc3VibW9kdWxlOiBmcW5QYXJ0c1sxXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBuYW1lOiBtb2R1bGVMaWtlLmZxbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXJhbWV0ZXJzKFxuICAgIHRyYW5zcGlsZWQ6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUGFyYW1ldGVyLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRmID0gdHJhbnNwaWxlZC50eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG5cbiAgICBpZiAodHJhbnNwaWxlZC52YXJpYWRpYykge1xuICAgICAgcmV0dXJuIGAke3RyYW5zcGlsZWQubmFtZX06ICR7dGhpcy52YXJpYWRpY09mKHRmKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0cmFuc3BpbGVkLm5hbWV9JHt0cmFuc3BpbGVkLm9wdGlvbmFsID8gJz8nIDogJyd9OiAke3RmfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlUmVmZXJlbmNlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdGYgPSB0eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGBwdWJsaWMgcmVhZG9ubHkgJHtuYW1lfTogJHt0Zn07YDtcbiAgfVxufVxuIl19