jsii-docgen
Version:
generates api docs for jsii modules
301 lines • 34.8 kB
JavaScript
;
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=