UNPKG

jsii-docgen

Version:

generates api docs for jsii modules

264 lines 30.4 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.CSharpTranspile = void 0; const Case = __importStar(require("case")); const reflect = __importStar(require("jsii-reflect")); const transpile = __importStar(require("./transpile")); const schema_1 = require("../schema"); class CSharpTranspile extends transpile.TranspileBase { constructor() { super(transpile.Language.CSHARP); } moduleLike(moduleLike) { var _a, _b, _c, _d; const csharpPackage = (_b = (_a = moduleLike.targets) === null || _a === void 0 ? void 0 : _a.dotnet) === null || _b === void 0 ? void 0 : _b.namespace; // if this is a submodule, we need to break the package name down into the // parent name and the submodule. we also allow submodules not to have // explicit target names, in which case we need to append the pascal-cased // submodule name to the parent package name. if (moduleLike instanceof reflect.Submodule) { const parent = moduleLike.parent; const parentFqn = (_d = (_c = parent.targets) === null || _c === void 0 ? void 0 : _c.dotnet) === null || _d === void 0 ? void 0 : _d.namespace; // if the submodule does not explicitly define a dotnet package name, we need to deduce it from the parent const submoduleCSharpPackage = csharpPackage !== null && csharpPackage !== void 0 ? csharpPackage : `${parentFqn}.${Case.pascal(moduleLike.name)}`; return { name: parentFqn, submodule: submoduleCSharpPackage }; } return { name: csharpPackage }; } type(type) { const submodule = this.findSubmodule(type); const moduleLike = this.moduleLike(submodule ? submodule : type.assembly); const fqn = []; let namespace = type.namespace; if (namespace) { fqn.push(moduleLike.name); fqn.push(namespace); } else { fqn.push(moduleLike.name); } fqn.push(type.name); return new transpile.TranspiledType({ fqn: fqn.join('.'), name: type.name, namespace: namespace, module: moduleLike.name, submodule: moduleLike.submodule, submodulePath: (0, schema_1.submodulePath)(submodule), source: type, language: this.language, }); } callable(callable) { const type = this.type(callable.parentType); const isInitializer = reflect.Initializer.isInitializer(callable); const name = isInitializer ? type.name : Case.pascal(callable.name); const parameters = callable.parameters.sort(this.optionalityCompare); const paramsFormatted = parameters.map(p => this.formatFnParam(this.parameter(p))).join(', '); const prefix = isInitializer || callable.protected ? 'protected' : 'private'; 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, }); const signatures = [`${prefix} ${returns ? returns + ' ' : ''}${name}(${paramsFormatted})`]; const invocations = [isInitializer ? `new ${name}(${paramsFormatted});` : `${type.name}.${name}(${paramsFormatted});`]; return { name, parentType: type, import: this.formatImport(type), parameters, signatures, invocations, }; } class(klass) { return { name: klass.name, type: this.type(klass), }; } struct(struct) { const type = this.type(struct); const indent = ' '.repeat(4); const inputs = struct.allProperties.map((p) => { return `${indent}${this.formatFnParam(this.property(p))}`; }).flat(); return { type: type, name: struct.name, import: this.formatImport(type), initialization: this.formatStructBuilder(type, inputs), }; } interface(iface) { return { name: iface.name, type: this.type(iface), }; } parameter(parameter) { const typeRef = this.typeReference(parameter.type); const name = Case.pascal(parameter.name); return { name, parentType: this.type(parameter.parentType), typeReference: typeRef, optional: parameter.optional, variadic: parameter.variadic, declaration: this.formatParameter(name, typeRef), }; } property(property) { const typeRef = this.typeReference(property.type); const name = Case.pascal(property.name); return { name, parentType: this.type(property.parentType), typeReference: typeRef, optional: property.optional, declaration: this.formatProperty(name, typeRef, property), }; } 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, }; } unionOf(types) { return types.join('|'); } intersectionOf(types) { return types.join('+'); } listOf(type) { return `${parenthesize(type)}[]`; } variadicOf(type) { return `params ${this.listOf(type)}`; } mapOf(type) { return `System.Collections.Generic.IDictionary<string, ${type}>`; } any() { return 'object'; } void() { return 'void'; } str() { return 'string'; } number() { return 'double'; } boolean() { return 'bool'; } json() { return 'Newtonsoft.Json.Linq.JObject'; } date() { return 'System.DateTime'; } readme(readme) { return readme; } formatImport(type) { return `using ${type.module};`; } formatFnParam(transpiled) { const tf = transpiled.typeReference.toString({ typeFormatter: (t) => t.name, }); const suffix = transpiled.optional ? ' = null' : ''; if ('variadic' in transpiled && transpiled.variadic) { return `${this.variadicOf(tf)} ${transpiled.name}`; } return `${tf} ${transpiled.name}${suffix}`; } formatStructBuilder(type, properties) { const builder = `new ${type.name} {`; return [ builder, properties.join(',\n'), '};', ].join('\n'); } ; formatParameter(name, typeReference) { const tf = typeReference.toString({ typeFormatter: (t) => t.name, }); return `public ${tf} ${name}`; } formatProperty(name, typeReference, property) { const tf = typeReference.toString({ typeFormatter: (t) => t.name, }); const prefix = property.protected ? 'protected' : 'public'; // setters are always available on struct properties const hasSetter = property.parentType.isDataType() || (!property.immutable && property.abstract); const suffix = hasSetter ? '{ get; set; }' : '{ get; }'; return `${prefix} ${tf} ${name} ${suffix}`; } } exports.CSharpTranspile = CSharpTranspile; /** * 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NoYXJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi90cmFuc3BpbGUvY3NoYXJwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3QixzREFBd0M7QUFDeEMsdURBQXlDO0FBQ3pDLHNDQUEwQztBQUUxQyxNQUFhLGVBQWdCLFNBQVEsU0FBUyxDQUFDLGFBQWE7SUFDMUQ7UUFDRSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sVUFBVSxDQUNmLFVBQThCOztRQUU5QixNQUFNLGFBQWEsR0FBVyxNQUFBLE1BQUEsVUFBVSxDQUFDLE9BQU8sMENBQUUsTUFBTSwwQ0FBRSxTQUFTLENBQUM7UUFFcEUsMEVBQTBFO1FBQzFFLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsNkNBQTZDO1FBQzdDLElBQUksVUFBVSxZQUFZLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sU0FBUyxHQUFHLE1BQUEsTUFBQSxNQUFNLENBQUMsT0FBTywwQ0FBRSxNQUFNLDBDQUFFLFNBQVMsQ0FBQztZQUVwRCwwR0FBMEc7WUFDMUcsTUFBTSxzQkFBc0IsR0FBRyxhQUFhLGFBQWIsYUFBYSxjQUFiLGFBQWEsR0FBSSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9GLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1FBQ2hFLENBQUM7UUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxJQUFJLENBQUMsSUFBa0I7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QUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFekQsT0FBTyxTQUFTLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQ2FzZSBmcm9tICdjYXNlJztcbmltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCAqIGFzIHRyYW5zcGlsZSBmcm9tICcuL3RyYW5zcGlsZSc7XG5pbXBvcnQgeyBzdWJtb2R1bGVQYXRoIH0gZnJvbSAnLi4vc2NoZW1hJztcblxuZXhwb3J0IGNsYXNzIENTaGFycFRyYW5zcGlsZSBleHRlbmRzIHRyYW5zcGlsZS5UcmFuc3BpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJhbnNwaWxlLkxhbmd1YWdlLkNTSEFSUCk7XG4gIH1cblxuICBwdWJsaWMgbW9kdWxlTGlrZShcbiAgICBtb2R1bGVMaWtlOiByZWZsZWN0Lk1vZHVsZUxpa2UsXG4gICk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkTW9kdWxlTGlrZSB7XG4gICAgY29uc3QgY3NoYXJwUGFja2FnZTogc3RyaW5nID0gbW9kdWxlTGlrZS50YXJnZXRzPy5kb3RuZXQ/Lm5hbWVzcGFjZTtcblxuICAgIC8vIGlmIHRoaXMgaXMgYSBzdWJtb2R1bGUsIHdlIG5lZWQgdG8gYnJlYWsgdGhlIHBhY2thZ2UgbmFtZSBkb3duIGludG8gdGhlXG4gICAgLy8gcGFyZW50IG5hbWUgYW5kIHRoZSBzdWJtb2R1bGUuIHdlIGFsc28gYWxsb3cgc3VibW9kdWxlcyBub3QgdG8gaGF2ZVxuICAgIC8vIGV4cGxpY2l0IHRhcmdldCBuYW1lcywgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUgcGFzY2FsLWNhc2VkXG4gICAgLy8gc3VibW9kdWxlIG5hbWUgdG8gdGhlIHBhcmVudCBwYWNrYWdlIG5hbWUuXG4gICAgaWYgKG1vZHVsZUxpa2UgaW5zdGFuY2VvZiByZWZsZWN0LlN1Ym1vZHVsZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gbW9kdWxlTGlrZS5wYXJlbnQ7XG4gICAgICBjb25zdCBwYXJlbnRGcW4gPSBwYXJlbnQudGFyZ2V0cz8uZG90bmV0Py5uYW1lc3BhY2U7XG5cbiAgICAgIC8vIGlmIHRoZSBzdWJtb2R1bGUgZG9lcyBub3QgZXhwbGljaXRseSBkZWZpbmUgYSBkb3RuZXQgcGFja2FnZSBuYW1lLCB3ZSBuZWVkIHRvIGRlZHVjZSBpdCBmcm9tIHRoZSBwYXJlbnRcbiAgICAgIGNvbnN0IHN1Ym1vZHVsZUNTaGFycFBhY2thZ2UgPSBjc2hhcnBQYWNrYWdlID8/IGAke3BhcmVudEZxbn0uJHtDYXNlLnBhc2NhbChtb2R1bGVMaWtlLm5hbWUpfWA7XG4gICAgICByZXR1cm4geyBuYW1lOiBwYXJlbnRGcW4sIHN1Ym1vZHVsZTogc3VibW9kdWxlQ1NoYXJwUGFja2FnZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IG5hbWU6IGNzaGFycFBhY2thZ2UgfTtcbiAgfVxuXG4gIHB1YmxpYyB0eXBlKHR5cGU6IHJlZmxlY3QuVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5maW5kU3VibW9kdWxlKHR5cGUpO1xuICAgIGNvbnN0IG1vZHVsZUxpa2UgPSB0aGlzLm1vZHVsZUxpa2Uoc3VibW9kdWxlID8gc3VibW9kdWxlIDogdHlwZS5hc3NlbWJseSk7XG5cbiAgICBjb25zdCBmcW4gPSBbXTtcblxuICAgIGxldCBuYW1lc3BhY2UgPSB0eXBlLm5hbWVzcGFjZTtcbiAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICBmcW4ucHVzaChtb2R1bGVMaWtlLm5hbWUpO1xuICAgICAgZnFuLnB1c2gobmFtZXNwYWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnFuLnB1c2gobW9kdWxlTGlrZS5uYW1lKTtcbiAgICB9XG4gICAgZnFuLnB1c2godHlwZS5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlKHtcbiAgICAgIGZxbjogZnFuLmpvaW4oJy4nKSxcbiAgICAgIG5hbWU6IHR5cGUubmFtZSxcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgbW9kdWxlOiBtb2R1bGVMaWtlLm5hbWUsXG4gICAgICBzdWJtb2R1bGU6IG1vZHVsZUxpa2Uuc3VibW9kdWxlLFxuICAgICAgc3VibW9kdWxlUGF0aDogc3VibW9kdWxlUGF0aChzdWJtb2R1bGUpLFxuICAgICAgc291cmNlOiB0eXBlLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2FsbGFibGUoY2FsbGFibGU6IHJlZmxlY3QuQ2FsbGFibGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZENhbGxhYmxlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKGNhbGxhYmxlLnBhcmVudFR5cGUpO1xuICAgIGNvbnN0IGlzSW5pdGlhbGl6ZXIgPSByZWZsZWN0LkluaXRpYWxpemVyLmlzSW5pdGlhbGl6ZXIoY2FsbGFibGUpO1xuICAgIGNvbnN0IG5hbWUgPSBpc0luaXRpYWxpemVyXG4gICAgICA/IHR5cGUubmFtZVxuICAgICAgOiBDYXNlLnBhc2NhbChjYWxsYWJsZS5uYW1lKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBjYWxsYWJsZS5wYXJhbWV0ZXJzLnNvcnQodGhpcy5vcHRpb25hbGl0eUNvbXBhcmUpO1xuICAgIGNvbnN0IHBhcmFtc0Zvcm1hdHRlZCA9IHBhcmFtZXRlcnMubWFwKHAgPT4gdGhpcy5mb3JtYXRGblBhcmFtKHRoaXMucGFyYW1ldGVyKHApKSkuam9pbignLCAnKTtcbiAgICBjb25zdCBwcmVmaXggPSBpc0luaXRpYWxpemVyIHx8IGNhbGxhYmxlLnByb3RlY3RlZCA/ICdwcm90ZWN0ZWQnIDogJ3ByaXZhdGUnO1xuXG4gICAgbGV0IHJldHVyblR5cGU6IHRyYW5zcGlsZS5JVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmxlY3QuSW5pdGlhbGl6ZXIuaXNJbml0aWFsaXplcihjYWxsYWJsZSkpIHtcbiAgICAgIHJldHVyblR5cGUgPSB0aGlzLnR5cGVSZWZlcmVuY2UoY2FsbGFibGUucGFyZW50VHlwZS5yZWZlcmVuY2UpO1xuICAgIH0gZWxzZSBpZiAocmVmbGVjdC5NZXRob2QuaXNNZXRob2QoY2FsbGFibGUpKSB7XG4gICAgICByZXR1cm5UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlKGNhbGxhYmxlLnJldHVybnMudHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHJldHVybnMgPSByZXR1cm5UeXBlPy50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlcyA9IFtgJHtwcmVmaXh9ICR7cmV0dXJucyA/IHJldHVybnMgKyAnICcgOiAnJ30ke25hbWV9KCR7cGFyYW1zRm9ybWF0dGVkfSlgXTtcbiAgICBjb25zdCBpbnZvY2F0aW9ucyA9IFtpc0luaXRpYWxpemVyXG4gICAgICA/IGBuZXcgJHtuYW1lfSgke3BhcmFtc0Zvcm1hdHRlZH0pO2BcbiAgICAgIDogYCR7dHlwZS5uYW1lfS4ke25hbWV9KCR7cGFyYW1zRm9ybWF0dGVkfSk7YF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHR5cGUsXG4gICAgICBpbXBvcnQ6IHRoaXMuZm9ybWF0SW1wb3J0KHR5cGUpLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICAgIHNpZ25hdHVyZXMsXG4gICAgICBpbnZvY2F0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNsYXNzKGtsYXNzOiByZWZsZWN0LkNsYXNzVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkQ2xhc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBrbGFzcy5uYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlKGtsYXNzKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0cnVjdChzdHJ1Y3Q6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkU3RydWN0IHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKHN0cnVjdCk7XG4gICAgY29uc3QgaW5kZW50ID0gJyAnLnJlcGVhdCg0KTtcbiAgICBjb25zdCBpbnB1dHMgPSBzdHJ1Y3QuYWxsUHJvcGVydGllcy5tYXAoKHApID0+IHtcbiAgICAgIHJldHVybiBgJHtpbmRlbnR9JHt0aGlzLmZvcm1hdEZuUGFyYW0odGhpcy5wcm9wZXJ0eShwKSl9YDtcbiAgICB9KS5mbGF0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBzdHJ1Y3QubmFtZSxcbiAgICAgIGltcG9ydDogdGhpcy5mb3JtYXRJbXBvcnQodHlwZSksXG4gICAgICBpbml0aWFsaXphdGlvbjogdGhpcy5mb3JtYXRTdHJ1Y3RCdWlsZGVyKHR5cGUsIGlucHV0cyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpbnRlcmZhY2UoXG4gICAgaWZhY2U6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSxcbiAgKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRJbnRlcmZhY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpZmFjZS5uYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlKGlmYWNlKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHBhcmFtZXRlcihcbiAgICBwYXJhbWV0ZXI6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlciB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSk7XG4gICAgY29uc3QgbmFtZSA9IENhc2UucGFzY2FsKHBhcmFtZXRlci5uYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwYXJhbWV0ZXIucGFyZW50VHlwZSksXG4gICAgICB0eXBlUmVmZXJlbmNlOiB0eXBlUmVmLFxuICAgICAgb3B0aW9uYWw6IHBhcmFtZXRlci5vcHRpb25hbCxcbiAgICAgIHZhcmlhZGljOiBwYXJhbWV0ZXIudmFyaWFkaWMsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQYXJhbWV0ZXIobmFtZSwgdHlwZVJlZiksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9wZXJ0eShwcm9wZXJ0eTogcmVmbGVjdC5Qcm9wZXJ0eSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUHJvcGVydHkge1xuICAgIGNvbnN0IHR5cGVSZWYgPSB0aGlzLnR5cGVSZWZlcmVuY2UocHJvcGVydHkudHlwZSk7XG4gICAgY29uc3QgbmFtZSA9IENhc2UucGFzY2FsKHByb3BlcnR5Lm5hbWUpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHByb3BlcnR5LnBhcmVudFR5cGUpLFxuICAgICAgdHlwZVJlZmVyZW5jZTogdHlwZVJlZixcbiAgICAgIG9wdGlvbmFsOiBwcm9wZXJ0eS5vcHRpb25hbCxcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmZvcm1hdFByb3BlcnR5KG5hbWUsIHR5cGVSZWYsIHByb3BlcnR5KSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVudW0oZW51OiByZWZsZWN0LkVudW1UeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRFbnVtIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnFuOiB0aGlzLnR5cGUoZW51KS5mcW4sXG4gICAgICBuYW1lOiBlbnUubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVudW1NZW1iZXIoZW06IHJlZmxlY3QuRW51bU1lbWJlcik6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bU1lbWJlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogYCR7dGhpcy5lbnVtKGVtLmVudW1UeXBlKS5mcW59LiR7ZW0ubmFtZX1gLFxuICAgICAgbmFtZTogZW0ubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVuaW9uT2YodHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZXMuam9pbignfCcpO1xuICB9XG5cbiAgcHVibGljIGludGVyc2VjdGlvbk9mKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVzLmpvaW4oJysnKTtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0T2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cGFyZW50aGVzaXplKHR5cGUpfVtdYDtcbiAgfVxuXG4gIHB1YmxpYyB2YXJpYWRpY09mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwYXJhbXMgJHt0aGlzLmxpc3RPZih0eXBlKX1gO1xuICB9XG5cbiAgcHVibGljIG1hcE9mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeTxzdHJpbmcsICR7dHlwZX0+YDtcbiAgfVxuXG4gIHB1YmxpYyBhbnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ29iamVjdCc7XG4gIH1cblxuICBwdWJsaWMgdm9pZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAndm9pZCc7XG4gIH1cblxuICBwdWJsaWMgc3RyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIG51bWJlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnZG91YmxlJztcbiAgfVxuXG4gIHB1YmxpYyBib29sZWFuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdib29sJztcbiAgfVxuXG4gIHB1YmxpYyBqc29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdOZXd0b25zb2Z0Lkpzb24uTGlucS5KT2JqZWN0JztcbiAgfVxuXG4gIHB1YmxpYyBkYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdTeXN0ZW0uRGF0ZVRpbWUnO1xuICB9XG5cbiAgcHVibGljIHJlYWRtZShyZWFkbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlYWRtZTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0SW1wb3J0KHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGB1c2luZyAke3R5cGUubW9kdWxlfTtgO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRGblBhcmFtKFxuICAgIHRyYW5zcGlsZWQ6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUHJvcGVydHkgfCB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlcixcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZiA9IHRyYW5zcGlsZWQudHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHRyYW5zcGlsZWQub3B0aW9uYWwgPyAnID0gbnVsbCcgOiAnJztcblxuICAgIGlmICgndmFyaWFkaWMnIGluIHRyYW5zcGlsZWQgJiYgdHJhbnNwaWxlZC52YXJpYWRpYykge1xuICAgICAgcmV0dXJuIGAke3RoaXMudmFyaWFkaWNPZih0Zil9ICR7dHJhbnNwaWxlZC5uYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0Zn0gJHt0cmFuc3BpbGVkLm5hbWV9JHtzdWZmaXh9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3RydWN0QnVpbGRlcih0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUsIHByb3BlcnRpZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBidWlsZGVyID0gYG5ldyAke3R5cGUubmFtZX0ge2A7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJ1aWxkZXIsXG4gICAgICBwcm9wZXJ0aWVzLmpvaW4oJyxcXG4nKSxcbiAgICAgICd9OycsXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfTtcblxuICBwcml2YXRlIGZvcm1hdFBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIHR5cGVSZWZlcmVuY2U6IHRyYW5zcGlsZS5JVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UpIHtcbiAgICBjb25zdCB0ZiA9IHR5cGVSZWZlcmVuY2UudG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBgcHVibGljICR7dGZ9ICR7bmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQcm9wZXJ0eShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZVJlZmVyZW5jZTogdHJhbnNwaWxlLklUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSxcbiAgICBwcm9wZXJ0eTogcmVmbGVjdC5Qcm9wZXJ0eSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZiA9IHR5cGVSZWZlcmVuY2UudG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHByZWZpeCA9IHByb3BlcnR5LnByb3RlY3RlZCA/ICdwcm90ZWN0ZWQnIDogJ3B1YmxpYyc7XG4gICAgLy8gc2V0dGVycyBhcmUgYWx3YXlzIGF2YWlsYWJsZSBvbiBzdHJ1Y3QgcHJvcGVydGllc1xuICAgIGNvbnN0IGhhc1NldHRlciA9IHByb3BlcnR5LnBhcmVudFR5cGUuaXNEYXRhVHlwZSgpIHx8ICghcHJvcGVydHkuaW1tdXRhYmxlICYmIHByb3BlcnR5LmFic3RyYWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBoYXNTZXR0ZXIgPyAneyBnZXQ7IHNldDsgfScgOiAneyBnZXQ7IH0nO1xuICAgIHJldHVybiBgJHtwcmVmaXh9ICR7dGZ9ICR7bmFtZX0gJHtzdWZmaXh9YDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcmVudGhlc2l6ZSBhIHN1YmV4cHJlc3Npb24gaWYgbmVjZXNzYXJ5IGFuZCBub3QgYWxyZWFkeSBkb25lXG4gKi9cbmZ1bmN0aW9uIHBhcmVudGhlc2l6ZSh4OiBzdHJpbmcpIHtcbiAgY29uc3QgbmVjZXNzYXJ5ID0geC5pbmNsdWRlcygnfCcpIHx8IHguaW5jbHVkZXMoJysnKTtcbiAgY29uc3QgYWxyZWFkeURvbmUgPSB4LnN0YXJ0c1dpdGgoJygnKSAmJiB4LmVuZHNXaXRoKCcpJyk7XG5cbiAgcmV0dXJuIG5lY2Vzc2FyeSAmJiAhYWxyZWFkeURvbmUgPyBgKCR7eH0pYCA6IHg7XG59XG4iXX0=