UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

301 lines 34.8 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.PythonTranspile = void 0; const Case = __importStar(require("case")); const reflect = __importStar(require("jsii-reflect")); const transpile = __importStar(require("./transpile")); const errors_1 = require("../../errors"); const schema_1 = require("../schema"); // Helpers const toSnakeCase = (text) => { return Case.snake(text !== null && text !== void 0 ? text : ''); }; const formatImport = (type) => { if (type.submodule) { return `from ${type.module} import ${type.submodule}`; } return `import ${type.module}`; }; const formatArguments = (inputs) => { return inputs.length === 0 ? '()' : [ '(', inputs.map(i => ` ${i}`).join(',\n'), ')', ].join('\n'); }; const formatInvocation = (type, inputs, method) => { let target; if (type.submodule) { if (!type.namespace) { throw new Error(`Invalid type: ${type.fqn}: Types defined in a submodule (${type.submodule}) must have a namespace. `); } // we don't include the submodule name here since it is // included in the namespace. this works because we import the submodule // in this case. // TODO - merge `formatInvocation` with `formatImport` since they are inherently coupled. target = `${type.namespace}.${type.name}`; } else { target = type.fqn; } if (method) { target = `${target}.${method}`; } return `${target}${formatArguments(inputs)}`; }; const formatSignature = (name, inputs, returns) => { const def = 'def '; return `${def}${name}${formatArguments(inputs)} -> ${returns || 'None'}`; }; /** * Hack to convert a jsii property to a parameter for * python specific parameter expansion. */ const propertyToParameter = (callable, property) => { return { docs: property.docs, method: callable, name: property.name, optional: property.optional, parentType: callable.parentType, spec: property.spec, system: property.system, type: property.type, variadic: false, }; }; /** * A python transpiler. */ class PythonTranspile extends transpile.TranspileBase { constructor() { super(transpile.Language.PYTHON); } readme(readme) { return readme; } unionOf(types) { return types.join(' | '); } intersectionOf(types) { // Not valid syntax but it gets the point across return types.join(' & '); } listOf(type) { return `${this.typing('List')}[${type}]`; } variadicOf(type) { return `*${type}`; } mapOf(type) { return `${this.typing('Mapping')}[${type}]`; } any() { return this.typing('Any'); } void() { return 'None'; } boolean() { return 'bool'; } str() { return 'str'; } number() { return `${this.typing('Union')}[int, float]`; } date() { return 'datetime.datetime'; } 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, }; } json() { return 'any'; } property(property) { const name = property.const ? property.name : toSnakeCase(property.name); const typeRef = this.typeReference(property.type); return { name, parentType: this.type(property.parentType), typeReference: typeRef, optional: property.optional, declaration: this.formatProperty(name, typeRef), }; } class(klass) { return { name: klass.name, type: this.type(klass), }; } parameter(parameter) { const name = toSnakeCase(parameter.name); const typeRef = this.typeReference(parameter.type); return { name, parentType: this.type(parameter.parentType), typeReference: typeRef, optional: parameter.optional, variadic: 'variadic' in parameter ? parameter.variadic : false, declaration: this.formatProperty(name, typeRef), }; } struct(struct) { const type = this.type(struct); const inputs = struct.allProperties.map((p) => this.formatParameters(this.parameter(p))); return { type: type, name: struct.name, import: formatImport(type), initialization: formatInvocation(type, inputs), }; } callable(callable) { const type = this.type(callable.parentType); const parameters = new Array(); for (const p of callable.parameters.sort(this.optionalityCompare)) { if (!this.isStruct(p)) { parameters.push(p); } else { // struct parameters are expanded to the individual struct properties const struct = p.parentType.system.findInterface(p.type.fqn); for (const property of struct.allProperties) { const parameter = propertyToParameter(callable, property); parameters.push(parameter); } } } const name = toSnakeCase(callable.name); const inputs = parameters.map((p) => this.formatParameters(this.parameter(p))); 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: [formatInvocation(type, inputs, callable.kind === reflect.MemberKind.Initializer ? undefined : name)], }; } 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) { var _a, _b, _c, _d; const pythonModule = (_b = (_a = moduleLike.targets) === null || _a === void 0 ? void 0 : _a.python) === null || _b === void 0 ? void 0 : _b.module; if (moduleLike instanceof reflect.Submodule) { const assembly = moduleLike.parent; const parentPythonModule = (_d = (_c = assembly.targets) === null || _c === void 0 ? void 0 : _c.python) === null || _d === void 0 ? void 0 : _d.module; // if the submodule does not explicitly defines the python module name, then // append a snake case version of the submodule name to the parent module name // see https://github.com/aws/jsii/blob/b329670bf9ec222fad5fc0d614dcddd5daca7af5/packages/jsii-pacmak/lib/targets/python/type-name.ts#L455 const submodulePythonModule = pythonModule !== null && pythonModule !== void 0 ? pythonModule : `${parentPythonModule}.${Case.snake(moduleLike.name)}`; const moduleParts = submodulePythonModule.split('.'); return { name: moduleParts[0], submodule: moduleParts[1] }; } if (!pythonModule) { throw new errors_1.LanguageNotSupportedError(`Python is not a supported target for module: ${moduleLike.fqn}`); } return { name: pythonModule }; } interface(iface) { return { name: iface.name, type: this.type(iface), }; } isStruct(p) { return p.type.fqn ? p.system.findFqn(p.type.fqn).isDataType() : false; } typing(type) { return `typing.${type}`; } formatParameters(transpiled) { const tf = transpiled.typeReference.toString({ typeFormatter: (t) => t.name, }); if (transpiled.variadic) { return `${transpiled.name}: ${this.variadicOf(tf)}`; } return `${transpiled.name}: ${tf}${transpiled.optional ? ' = None' : ''}`; } formatProperty(name, typeReference) { const tf = typeReference.toString({ typeFormatter: (t) => t.name, }); return `${name}: ${tf}`; } } exports.PythonTranspile = PythonTranspile; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi90cmFuc3BpbGUvcHl0aG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3QixzREFBd0M7QUFDeEMsdURBQXlDO0FBQ3pDLHlDQUF5RDtBQUN6RCxzQ0FBMEM7QUFFMUMsVUFBVTtBQUNWLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUU7SUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksYUFBSixJQUFJLGNBQUosSUFBSSxHQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBOEIsRUFBRSxFQUFFO0lBQ3RELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLE9BQU8sUUFBUSxJQUFJLENBQUMsTUFBTSxXQUFXLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsT0FBTyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtJQUMzQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLEdBQUc7UUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckMsR0FBRztLQUNKLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxDQUN2QixJQUE4QixFQUM5QixNQUFnQixFQUNoQixN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Q0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtTQUM3QixDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUVELE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFFTyxjQUFjLENBQ3BCLElBQVksRUFDWixhQUFpRDtRQUVqRCxNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQ2hDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUE5UEQsMENBOFBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQ2FzZSBmcm9tICdjYXNlJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCAqIGFzIHRyYW5zcGlsZSBmcm9tICcuL3RyYW5zcGlsZSc7XG5pbXBvcnQgeyBMYW5ndWFnZU5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IHN1Ym1vZHVsZVBhdGggfSBmcm9tICcuLi9zY2hlbWEnO1xuXG4vLyBIZWxwZXJzXG5jb25zdCB0b1NuYWtlQ2FzZSA9ICh0ZXh0Pzogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBDYXNlLnNuYWtlKHRleHQgPz8gJycpO1xufTtcblxuY29uc3QgZm9ybWF0SW1wb3J0ID0gKHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSkgPT4ge1xuICBpZiAodHlwZS5zdWJtb2R1bGUpIHtcbiAgICByZXR1cm4gYGZyb20gJHt0eXBlLm1vZHVsZX0gaW1wb3J0ICR7dHlwZS5zdWJtb2R1bGV9YDtcbiAgfVxuICByZXR1cm4gYGltcG9ydCAke3R5cGUubW9kdWxlfWA7XG59O1xuXG5jb25zdCBmb3JtYXRBcmd1bWVudHMgPSAoaW5wdXRzOiBzdHJpbmdbXSkgPT4ge1xuICByZXR1cm4gaW5wdXRzLmxlbmd0aCA9PT0gMCA/ICcoKScgOiBbXG4gICAgJygnLFxuICAgIGlucHV0cy5tYXAoaSA9PiBgICAke2l9YCkuam9pbignLFxcbicpLFxuICAgICcpJyxcbiAgXS5qb2luKCdcXG4nKTtcbn07XG5cbmNvbnN0IGZvcm1hdEludm9jYXRpb24gPSAoXG4gIHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSxcbiAgaW5wdXRzOiBzdHJpbmdbXSxcbiAgbWV0aG9kPzogc3RyaW5nLFxuKSA9PiB7XG4gIGxldCB0YXJnZXQ7XG4gIGlmICh0eXBlLnN1Ym1vZHVsZSkge1xuICAgIGlmICghdHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgdHlwZTogJHt0eXBlLmZxbn06IFR5cGVzIGRlZmluZWQgaW4gYSBzdWJtb2R1bGUgKCR7dHlwZS5zdWJtb2R1bGV9KSBtdXN0IGhhdmUgYSBuYW1lc3BhY2UuIGAsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyB3ZSBkb24ndCBpbmNsdWRlIHRoZSBzdWJtb2R1bGUgbmFtZSBoZXJlIHNpbmNlIGl0IGlzXG4gICAgLy8gaW5jbHVkZWQgaW4gdGhlIG5hbWVzcGFjZS4gdGhpcyB3b3JrcyBiZWNhdXNlIHdlIGltcG9ydCB0aGUgc3VibW9kdWxlXG4gICAgLy8gaW4gdGhpcyBjYXNlLlxuICAgIC8vIFRPRE8gLSBtZXJnZSBgZm9ybWF0SW52b2NhdGlvbmAgd2l0aCBgZm9ybWF0SW1wb3J0YCBzaW5jZSB0aGV5IGFyZSBpbmhlcmVudGx5IGNvdXBsZWQuXG4gICAgdGFyZ2V0ID0gYCR7dHlwZS5uYW1lc3BhY2V9LiR7dHlwZS5uYW1lfWA7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0ID0gdHlwZS5mcW47XG4gIH1cblxuICBpZiAobWV0aG9kKSB7XG4gICAgdGFyZ2V0ID0gYCR7dGFyZ2V0fS4ke21ldGhvZH1gO1xuICB9XG4gIHJldHVybiBgJHt0YXJnZXR9JHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX1gO1xufTtcblxuY29uc3QgZm9ybWF0U2lnbmF0dXJlID0gKG5hbWU6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSwgcmV0dXJucz86IHN0cmluZykgPT4ge1xuICBjb25zdCBkZWYgPSAnZGVmICc7XG4gIHJldHVybiBgJHtkZWZ9JHtuYW1lfSR7Zm9ybWF0QXJndW1lbnRzKGlucHV0cyl9IC0+ICR7cmV0dXJucyB8fCAnTm9uZSd9YDtcbn07XG5cbi8qKlxuICogSGFjayB0byBjb252ZXJ0IGEganNpaSBwcm9wZXJ0eSB0byBhIHBhcmFtZXRlciBmb3JcbiAqIHB5dGhvbiBzcGVjaWZpYyBwYXJhbWV0ZXIgZXhwYW5zaW9uLlxuICovXG5jb25zdCBwcm9wZXJ0eVRvUGFyYW1ldGVyID0gKFxuICBjYWxsYWJsZTogcmVmbGVjdC5DYWxsYWJsZSxcbiAgcHJvcGVydHk6IHJlZmxlY3QuUHJvcGVydHksXG4pOiByZWZsZWN0LlBhcmFtZXRlciA9PiB7XG4gIHJldHVybiB7XG4gICAgZG9jczogcHJvcGVydHkuZG9jcyxcbiAgICBtZXRob2Q6IGNhbGxhYmxlLFxuICAgIG5hbWU6IHByb3BlcnR5Lm5hbWUsXG4gICAgb3B0aW9uYWw6IHByb3BlcnR5Lm9wdGlvbmFsLFxuICAgIHBhcmVudFR5cGU6IGNhbGxhYmxlLnBhcmVudFR5cGUsXG4gICAgc3BlYzogcHJvcGVydHkuc3BlYyxcbiAgICBzeXN0ZW06IHByb3BlcnR5LnN5c3RlbSxcbiAgICB0eXBlOiBwcm9wZXJ0eS50eXBlLFxuICAgIHZhcmlhZGljOiBmYWxzZSxcbiAgfTtcbn07XG5cbi8qKlxuICogQSBweXRob24gdHJhbnNwaWxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFB5dGhvblRyYW5zcGlsZSBleHRlbmRzIHRyYW5zcGlsZS5UcmFuc3BpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJhbnNwaWxlLkxhbmd1YWdlLlBZVEhPTik7XG4gIH1cblxuICBwdWJsaWMgcmVhZG1lKHJlYWRtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVhZG1lO1xuICB9XG5cbiAgcHVibGljIHVuaW9uT2YodHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZXMuam9pbignIHwgJyk7XG4gIH1cblxuICBwdWJsaWMgaW50ZXJzZWN0aW9uT2YodHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAvLyBOb3QgdmFsaWQgc3ludGF4IGJ1dCBpdCBnZXRzIHRoZSBwb2ludCBhY3Jvc3NcbiAgICByZXR1cm4gdHlwZXMuam9pbignICYgJyk7XG4gIH1cblxuICBwdWJsaWMgbGlzdE9mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudHlwaW5nKCdMaXN0Jyl9WyR7dHlwZX1dYDtcbiAgfVxuXG4gIHB1YmxpYyB2YXJpYWRpY09mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAqJHt0eXBlfWA7XG4gIH1cblxuICBwdWJsaWMgbWFwT2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy50eXBpbmcoJ01hcHBpbmcnKX1bJHt0eXBlfV1gO1xuICB9XG5cbiAgcHVibGljIGFueSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGluZygnQW55Jyk7XG4gIH1cblxuICBwdWJsaWMgdm9pZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnTm9uZSc7XG4gIH1cblxuICBwdWJsaWMgYm9vbGVhbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYm9vbCc7XG4gIH1cblxuICBwdWJsaWMgc3RyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdzdHInO1xuICB9XG5cbiAgcHVibGljIG51bWJlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnR5cGluZygnVW5pb24nKX1baW50LCBmbG9hdF1gO1xuICB9XG5cbiAgcHVibGljIGRhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2RhdGV0aW1lLmRhdGV0aW1lJztcbiAgfVxuXG4gIHB1YmxpYyBlbnVtKGVudTogcmVmbGVjdC5FbnVtVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogdGhpcy50eXBlKGVudSkuZnFuLFxuICAgICAgbmFtZTogZW51Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlbnVtTWVtYmVyKGVtOiByZWZsZWN0LkVudW1NZW1iZXIpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEVudW1NZW1iZXIge1xuICAgIHJldHVybiB7XG4gICAgICBmcW46IGAke3RoaXMuZW51bShlbS5lbnVtVHlwZSkuZnFufS4ke2VtLm5hbWV9YCxcbiAgICAgIG5hbWU6IGVtLm5hbWUsXG4gICAgfTtcbiAgfVxuICBwdWJsaWMganNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYW55JztcbiAgfVxuXG4gIHB1YmxpYyBwcm9wZXJ0eShwcm9wZXJ0eTogcmVmbGVjdC5Qcm9wZXJ0eSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUHJvcGVydHkge1xuICAgIGNvbnN0IG5hbWUgPSBwcm9wZXJ0eS5jb25zdCA/IHByb3BlcnR5Lm5hbWUgOiB0b1NuYWtlQ2FzZShwcm9wZXJ0eS5uYW1lKTtcbiAgICBjb25zdCB0eXBlUmVmID0gdGhpcy50eXBlUmVmZXJlbmNlKHByb3BlcnR5LnR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHByb3BlcnR5LnBhcmVudFR5cGUpLFxuICAgICAgdHlwZVJlZmVyZW5jZTogdHlwZVJlZixcbiAgICAgIG9wdGlvbmFsOiBwcm9wZXJ0eS5vcHRpb25hbCxcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmZvcm1hdFByb3BlcnR5KG5hbWUsIHR5cGVSZWYpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2xhc3Moa2xhc3M6IHJlZmxlY3QuQ2xhc3NUeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRDbGFzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGtsYXNzLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUoa2xhc3MpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcGFyYW1ldGVyKFxuICAgIHBhcmFtZXRlcjogcmVmbGVjdC5QYXJhbWV0ZXIgfCByZWZsZWN0LlByb3BlcnR5LFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlciB7XG5cbiAgICBjb25zdCBuYW1lID0gdG9TbmFrZUNhc2UocGFyYW1ldGVyLm5hbWUpO1xuICAgIGNvbnN0IHR5cGVSZWYgPSB0aGlzLnR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHBhcmFtZXRlci5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcGFyYW1ldGVyLm9wdGlvbmFsLFxuICAgICAgdmFyaWFkaWM6ICd2YXJpYWRpYycgaW4gcGFyYW1ldGVyID8gcGFyYW1ldGVyLnZhcmlhZGljIDogZmFsc2UsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQcm9wZXJ0eShuYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0cnVjdChzdHJ1Y3Q6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkU3RydWN0IHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKHN0cnVjdCk7XG4gICAgY29uc3QgaW5wdXRzID0gc3RydWN0LmFsbFByb3BlcnRpZXMubWFwKChwKSA9PlxuICAgICAgdGhpcy5mb3JtYXRQYXJhbWV0ZXJzKHRoaXMucGFyYW1ldGVyKHApKSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbmFtZTogc3RydWN0Lm5hbWUsXG4gICAgICBpbXBvcnQ6IGZvcm1hdEltcG9ydCh0eXBlKSxcbiAgICAgIGluaXRpYWxpemF0aW9uOiBmb3JtYXRJbnZvY2F0aW9uKHR5cGUsIGlucHV0cyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjYWxsYWJsZShjYWxsYWJsZTogcmVmbGVjdC5DYWxsYWJsZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkQ2FsbGFibGUge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGUoY2FsbGFibGUucGFyZW50VHlwZSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gbmV3IEFycmF5PHJlZmxlY3QuUGFyYW1ldGVyPigpO1xuXG4gICAgZm9yIChjb25zdCBwIG9mIGNhbGxhYmxlLnBhcmFtZXRlcnMuc29ydCh0aGlzLm9wdGlvbmFsaXR5Q29tcGFyZSkpIHtcbiAgICAgIGlmICghdGhpcy5pc1N0cnVjdChwKSkge1xuICAgICAgICBwYXJhbWV0ZXJzLnB1c2gocCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdHJ1Y3QgcGFyYW1ldGVycyBhcmUgZXhwYW5kZWQgdG8gdGhlIGluZGl2aWR1YWwgc3RydWN0IHByb3BlcnRpZXNcbiAgICAgICAgY29uc3Qgc3RydWN0ID0gcC5wYXJlbnRUeXBlLnN5c3RlbS5maW5kSW50ZXJmYWNlKHAudHlwZS5mcW4hKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBzdHJ1Y3QuYWxsUHJvcGVydGllcykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtZXRlciA9IHByb3BlcnR5VG9QYXJhbWV0ZXIoY2FsbGFibGUsIHByb3BlcnR5KTtcbiAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2gocGFyYW1ldGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSB0b1NuYWtlQ2FzZShjYWxsYWJsZS5uYW1lKTtcbiAgICBjb25zdCBpbnB1dHMgPSBwYXJhbWV0ZXJzLm1hcCgocCkgPT4gdGhpcy5mb3JtYXRQYXJhbWV0ZXJzKHRoaXMucGFyYW1ldGVyKHApKSk7XG5cbiAgICBsZXQgcmV0dXJuVHlwZTogdHJhbnNwaWxlLklUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVmbGVjdC5Jbml0aWFsaXplci5pc0luaXRpYWxpemVyKGNhbGxhYmxlKSkge1xuICAgICAgcmV0dXJuVHlwZSA9IHRoaXMudHlwZVJlZmVyZW5jZShjYWxsYWJsZS5wYXJlbnRUeXBlLnJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIGlmIChyZWZsZWN0Lk1ldGhvZC5pc01ldGhvZChjYWxsYWJsZSkpIHtcbiAgICAgIHJldHVyblR5cGUgPSB0aGlzLnR5cGVSZWZlcmVuY2UoY2FsbGFibGUucmV0dXJucy50eXBlKTtcbiAgICB9XG4gICAgY29uc3QgcmV0dXJucyA9IHJldHVyblR5cGU/LnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHR5cGUsXG4gICAgICBpbXBvcnQ6IGZvcm1hdEltcG9ydCh0eXBlKSxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICBzaWduYXR1cmVzOiBbZm9ybWF0U2lnbmF0dXJlKG5hbWUsIGlucHV0cywgcmV0dXJucyldLFxuICAgICAgaW52b2NhdGlvbnM6IFtmb3JtYXRJbnZvY2F0aW9uKFxuICAgICAgICB0eXBlLFxuICAgICAgICBpbnB1dHMsXG4gICAgICAgIGNhbGxhYmxlLmtpbmQgPT09IHJlZmxlY3QuTWVtYmVyS2luZC5Jbml0aWFsaXplciA/IHVuZGVmaW5lZCA6IG5hbWUsXG4gICAgICApXSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHR5cGUodHlwZTogcmVmbGVjdC5UeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlIHtcbiAgICBjb25zdCBzdWJtb2R1bGUgPSB0aGlzLmZpbmRTdWJtb2R1bGUodHlwZSk7XG4gICAgY29uc3QgbW9kdWxlTGlrZSA9IHRoaXMubW9kdWxlTGlrZShzdWJtb2R1bGUgPyBzdWJtb2R1bGUgOiB0eXBlLmFzc2VtYmx5KTtcblxuICAgIGNvbnN0IGZxbiA9IFttb2R1bGVMaWtlLm5hbWVdO1xuXG4gICAgaWYgKHR5cGUubmFtZXNwYWNlKSB7XG4gICAgICBmcW4ucHVzaCh0eXBlLm5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGZxbi5wdXNoKHR5cGUubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSh7XG4gICAgICBmcW46IGZxbi5qb2luKCcuJyksXG4gICAgICBuYW1lOiB0eXBlLm5hbWUsXG4gICAgICBuYW1lc3BhY2U6IHR5cGUubmFtZXNwYWNlLFxuICAgICAgbW9kdWxlOiBtb2R1bGVMaWtlLm5hbWUsXG4gICAgICBzdWJtb2R1bGU6IG1vZHVsZUxpa2Uuc3VibW9kdWxlLFxuICAgICAgc3VibW9kdWxlUGF0aDogc3VibW9kdWxlUGF0aChzdWJtb2R1bGUpLFxuICAgICAgc291cmNlOiB0eXBlLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW9kdWxlTGlrZShcbiAgICBtb2R1bGVMaWtlOiByZWZsZWN0Lk1vZHVsZUxpa2UsXG4gICk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkTW9kdWxlTGlrZSB7XG4gICAgY29uc3QgcHl0aG9uTW9kdWxlID0gbW9kdWxlTGlrZS50YXJnZXRzPy5weXRob24/Lm1vZHVsZTtcblxuICAgIGlmIChtb2R1bGVMaWtlIGluc3RhbmNlb2YgcmVmbGVjdC5TdWJtb2R1bGUpIHtcbiAgICAgIGNvbnN0IGFzc2VtYmx5ID0gbW9kdWxlTGlrZS5wYXJlbnQ7XG4gICAgICBjb25zdCBwYXJlbnRQeXRob25Nb2R1bGUgPSBhc3NlbWJseS50YXJnZXRzPy5weXRob24/Lm1vZHVsZTtcblxuICAgICAgLy8gaWYgdGhlIHN1Ym1vZHVsZSBkb2VzIG5vdCBleHBsaWNpdGx5IGRlZmluZXMgdGhlIHB5dGhvbiBtb2R1bGUgbmFtZSwgdGhlblxuICAgICAgLy8gYXBwZW5kIGEgc25ha2UgY2FzZSB2ZXJzaW9uIG9mIHRoZSBzdWJtb2R1bGUgbmFtZSB0byB0aGUgcGFyZW50IG1vZHVsZSBuYW1lXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2Jsb2IvYjMyOTY3MGJmOWVjMjIyZmFkNWZjMGQ2MTRkY2RkZDVkYWNhN2FmNS9wYWNrYWdlcy9qc2lpLXBhY21hay9saWIvdGFyZ2V0cy9weXRob24vdHlwZS1uYW1lLnRzI0w0NTVcbiAgICAgIGNvbnN0IHN1Ym1vZHVsZVB5dGhvbk1vZHVsZSA9IHB5dGhvbk1vZHVsZSA/PyBgJHtwYXJlbnRQeXRob25Nb2R1bGV9LiR7Q2FzZS5zbmFrZShtb2R1bGVMaWtlLm5hbWUpfWA7XG5cbiAgICAgIGNvbnN0IG1vZHVsZVBhcnRzID0gc3VibW9kdWxlUHl0aG9uTW9kdWxlLnNwbGl0KCcuJyk7XG4gICAgICByZXR1cm4geyBuYW1lOiBtb2R1bGVQYXJ0c1swXSwgc3VibW9kdWxlOiBtb2R1bGVQYXJ0c1sxXSB9O1xuICAgIH1cblxuICAgIGlmICghcHl0aG9uTW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgTGFuZ3VhZ2VOb3RTdXBwb3J0ZWRFcnJvcihcbiAgICAgICAgYFB5dGhvbiBpcyBub3QgYSBzdXBwb3J0ZWQgdGFyZ2V0IGZvciBtb2R1bGU6ICR7bW9kdWxlTGlrZS5mcW59YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbmFtZTogcHl0aG9uTW9kdWxlIH07XG4gIH1cblxuICBwdWJsaWMgaW50ZXJmYWNlKFxuICAgIGlmYWNlOiByZWZsZWN0LkludGVyZmFjZVR5cGUsXG4gICk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkSW50ZXJmYWNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogaWZhY2UubmFtZSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZShpZmFjZSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTdHJ1Y3QocDogcmVmbGVjdC5QYXJhbWV0ZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcC50eXBlLmZxbiA/IHAuc3lzdGVtLmZpbmRGcW4ocC50eXBlLmZxbikuaXNEYXRhVHlwZSgpIDogZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHR5cGluZyh0eXBlOiAnTGlzdCcgfCAnTWFwcGluZycgfCAnQW55JyB8ICdVbmlvbicpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHlwaW5nLiR7dHlwZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXJhbWV0ZXJzKFxuICAgIHRyYW5zcGlsZWQ6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUGFyYW1ldGVyLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRmID0gdHJhbnNwaWxlZC50eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG5cbiAgICBpZiAodHJhbnNwaWxlZC52YXJpYWRpYykge1xuICAgICAgcmV0dXJuIGAke3RyYW5zcGlsZWQubmFtZX06ICR7dGhpcy52YXJpYWRpY09mKHRmKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0cmFuc3BpbGVkLm5hbWV9OiAke3RmfSR7dHJhbnNwaWxlZC5vcHRpb25hbCA/ICcgPSBOb25lJyA6ICcnfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlUmVmZXJlbmNlOiB0cmFuc3BpbGUuSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRmID0gdHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiBgJHtuYW1lfTogJHt0Zn1gO1xuICB9XG59XG4iXX0=