jsii-docgen
Version:
generates api docs for jsii modules
261 lines • 31.3 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.GoTranspile = void 0;
const Case = __importStar(require("case"));
const reflect = __importStar(require("jsii-reflect"));
const transpile = __importStar(require("./transpile"));
const schema_1 = require("../schema");
class GoTranspile extends transpile.TranspileBase {
constructor() {
super(transpile.Language.GO);
}
moduleLike(moduleLike) {
var _a, _b, _c, _d, _e, _f, _g, _h;
if (moduleLike instanceof reflect.Submodule) {
const parent = this.moduleLike(moduleLike.parent);
const parentFqn = parent.submodule
? `${parent.name}/${parent.submodule}`
: parent.name;
// `packageName` can be specified explicitly in configuration or
// auto-generated from node package name.
// Example: @aws-cdk/aws-ecr -> awscdkawsecr
const packageName = (_c = (_b = (_a = moduleLike.targets) === null || _a === void 0 ? void 0 : _a.go) === null || _b === void 0 ? void 0 : _b.packageName) !== null && _c !== void 0 ? _c : moduleLike.name.toLowerCase().replace(/[^a-z0-9]/g, '');
return { name: parentFqn, submodule: packageName };
}
else {
// This is the root module
const moduleName = (_e = (_d = moduleLike.targets) === null || _d === void 0 ? void 0 : _d.go) === null || _e === void 0 ? void 0 : _e.moduleName;
// moduleName is required configuration for Go enabled packages
// Validation in `Documentation` class prevents this
if (!moduleName) {
throw new Error('"jsii.targets.go.moduleName" is a required field for Go enabled JSII modules');
}
const packageName = (_h = (_g = (_f = moduleLike.targets) === null || _f === void 0 ? void 0 : _f.go) === null || _g === void 0 ? void 0 : _g.packageName) !== null && _h !== void 0 ? _h : moduleLike.name.toLowerCase().replace(/[^a-z0-9]/g, '');
const version = Number.parseInt(moduleLike.version.split('.')[0]);
const versionSegment = version >= 2 ? `/v${version}` : '';
// Example: github.com/aws/constructs-go/constructs/v10
const name = `${moduleName}/${packageName}${versionSegment}`;
return { name };
}
}
type(type) {
const submodule = this.findSubmodule(type);
const moduleLike = this.moduleLike(submodule !== null && submodule !== void 0 ? submodule : type.assembly);
const fqn = [moduleLike.name];
let namespace = type.namespace;
if (namespace) {
fqn.push(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,
});
}
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(', ');
let returnType;
if (isInitializer) {
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 isStatic = reflect.Method.isMethod(callable) && callable.static;
const packageName = this.packageName(type);
const signatures = [`func ${isInitializer ? 'New' : ''}${name}(${paramsFormatted})${returns ? ` ${returns}` : ''}`];
const invocations = [isInitializer
? `${packageName}.New${name}(${paramsFormatted})${returns ? ` ${returns}` : ''}`
: `${packageName}.${type.name}${isStatic ? '_' : '.'}${name}(${paramsFormatted})${returns ? ` ${returns}` : ''}`];
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 input = struct.allProperties.map((p) => {
const property = this.property(p);
return `\t${property.name}: ${property.typeReference},`;
});
return {
type: type,
name: struct.name,
import: this.formatImport(type),
initialization: this.formatStructBuilder(type, input),
};
}
interface(iface) {
return {
name: iface.name,
type: this.type(iface),
};
}
parameter(parameter) {
const typeRef = this.typeReference(parameter.type);
const name = parameter.name;
return {
name,
parentType: this.type(parameter.parentType),
typeReference: typeRef,
optional: parameter.optional,
variadic: parameter.variadic,
declaration: this.formatParameter(name, typeRef, parameter.variadic),
};
}
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.enumType.name}_${em.name}`,
};
}
unionOf() {
return this.any();
}
intersectionOf(types) {
return `interface { ${types.join('; ')} }`;
}
listOf(type) {
return `*[]${type}`;
}
variadicOf(type) {
return `...${type}`;
}
mapOf(type) {
return `*map[string]${type}`;
}
any() {
return 'interface{}';
}
void() {
return '';
}
str() {
return '*string';
}
number() {
return '*f64';
}
boolean() {
return '*bool';
}
json() {
return this.mapOf(this.any());
}
date() {
return '*time.Time';
}
readme(readme) {
return readme;
}
formatFnParam(transpiled) {
return this.formatParameter(transpiled.name, transpiled.typeReference, transpiled.variadic);
}
formatImport(type) {
return `import "${type.module}${type.submodule ? `/${type.submodule}` : ''}"`;
}
formatParameter(name, typeReference, variadic) {
const tf = typeReference.toString({
typeFormatter: (t) => t.name,
});
if (variadic) {
return `${name} ${this.variadicOf(tf)}`;
}
return `${name} ${tf}`;
}
formatStructBuilder(type, properties) {
return [
`&${this.packageName(type)}.${type.name} {`,
properties.join('\n'),
'}',
].join('\n');
}
;
formatProperty(name, typeReference, property) {
const tf = typeReference.toString({
typeFormatter: (t) => t.name,
});
return property.parentType.isDataType() ? `${name} ${tf}` : `func ${name}() ${tf}`;
}
packageName(type) {
var _a;
return (_a = type.submodule) !== null && _a !== void 0 ? _a : type.module.split('/').slice(/\/v\d+$/.test(type.module) ? -2 : -1)[0];
}
}
exports.GoTranspile = GoTranspile;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jZ2VuL3RyYW5zcGlsZS9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0Isc0RBQXdDO0FBQ3hDLHVEQUF5QztBQUN6QyxzQ0FBMEM7QUFFMUMsTUFBYSxXQUFZLFNBQVEsU0FBUyxDQUFDLGFBQWE7SUFDdEQ7UUFDRSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sVUFBVSxDQUFDLFVBQThCOztRQUM5QyxJQUFJLFVBQVUsWUFBWSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFFaEIsZ0VBQWdFO1lBQ2hFLHlDQUF5QztZQUN6Qyw0Q0FBNEM7WUFDNUMsTUFBTSxXQUFXLEdBQUcsTUFBQSxNQUFBLE1BQUEsVUFBVSxDQUFDLE9BQU8sMENBQUUsRUFBRSwwQ0FBRSxXQUFXLG1DQUNsRCxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFN0QsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ04sMEJBQTBCO1lBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQUEsTUFBQSxVQUFVLENBQUMs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QUM7WUFDckIsR0FBRztTQUNKLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUFBLENBQUM7SUFFTSxjQUFjLENBQ3BCLElBQVksRUFDWixhQUFpRCxFQUNqRCxRQUEwQjtRQUUxQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQ2hDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDckYsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUE4Qjs7UUFDaEQsT0FBTyxNQUFBLElBQUksQ0FBQyxTQUFTLG1DQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRjtBQTVRRCxrQ0E0UUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDYXNlIGZyb20gJ2Nhc2UnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgdHJhbnNwaWxlIGZyb20gJy4vdHJhbnNwaWxlJztcbmltcG9ydCB7IHN1Ym1vZHVsZVBhdGggfSBmcm9tICcuLi9zY2hlbWEnO1xuXG5leHBvcnQgY2xhc3MgR29UcmFuc3BpbGUgZXh0ZW5kcyB0cmFuc3BpbGUuVHJhbnNwaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRyYW5zcGlsZS5MYW5ndWFnZS5HTyk7XG4gIH1cblxuICBwdWJsaWMgbW9kdWxlTGlrZShtb2R1bGVMaWtlOiByZWZsZWN0Lk1vZHVsZUxpa2UpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZE1vZHVsZUxpa2Uge1xuICAgIGlmIChtb2R1bGVMaWtlIGluc3RhbmNlb2YgcmVmbGVjdC5TdWJtb2R1bGUpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubW9kdWxlTGlrZShtb2R1bGVMaWtlLnBhcmVudCk7XG4gICAgICBjb25zdCBwYXJlbnRGcW4gPSBwYXJlbnQuc3VibW9kdWxlXG4gICAgICAgID8gYCR7cGFyZW50Lm5hbWV9LyR7cGFyZW50LnN1Ym1vZHVsZX1gXG4gICAgICAgIDogcGFyZW50Lm5hbWU7XG5cbiAgICAgIC8vIGBwYWNrYWdlTmFtZWAgY2FuIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5IGluIGNvbmZpZ3VyYXRpb24gb3JcbiAgICAgIC8vIGF1dG8tZ2VuZXJhdGVkIGZyb20gbm9kZSBwYWNrYWdlIG5hbWUuXG4gICAgICAvLyBFeGFtcGxlOiBAYXdzLWNkay9hd3MtZWNyIC0+IGF3c2Nka2F3c2VjclxuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBtb2R1bGVMaWtlLnRhcmdldHM/LmdvPy5wYWNrYWdlTmFtZVxuICAgICAgICA/PyBtb2R1bGVMaWtlLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpO1xuXG4gICAgICByZXR1cm4geyBuYW1lOiBwYXJlbnRGcW4sIHN1Ym1vZHVsZTogcGFja2FnZU5hbWUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBtb2R1bGVMaWtlLnRhcmdldHM/LmdvPy5tb2R1bGVOYW1lO1xuXG4gICAgICAvLyBtb2R1bGVOYW1lIGlzIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gZm9yIEdvIGVuYWJsZWQgcGFja2FnZXNcbiAgICAgIC8vIFZhbGlkYXRpb24gaW4gYERvY3VtZW50YXRpb25gIGNsYXNzIHByZXZlbnRzIHRoaXNcbiAgICAgIGlmICghbW9kdWxlTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wianNpaS50YXJnZXRzLmdvLm1vZHVsZU5hbWVcIiBpcyBhIHJlcXVpcmVkIGZpZWxkIGZvciBHbyBlbmFibGVkIEpTSUkgbW9kdWxlcycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IG1vZHVsZUxpa2UudGFyZ2V0cz8uZ28/LnBhY2thZ2VOYW1lXG4gICAgICAgID8/IChtb2R1bGVMaWtlIGFzIHJlZmxlY3QuQXNzZW1ibHkpLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpO1xuICAgICAgY29uc3QgdmVyc2lvbiA9IE51bWJlci5wYXJzZUludCgobW9kdWxlTGlrZSBhcyByZWZsZWN0LkFzc2VtYmx5KS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pO1xuICAgICAgY29uc3QgdmVyc2lvblNlZ21lbnQgPSB2ZXJzaW9uID49IDIgPyBgL3Yke3ZlcnNpb259YCA6ICcnO1xuXG4gICAgICAvLyBFeGFtcGxlOiBnaXRodWIuY29tL2F3cy9jb25zdHJ1Y3RzLWdvL2NvbnN0cnVjdHMvdjEwXG4gICAgICBjb25zdCBuYW1lID0gYCR7bW9kdWxlTmFtZX0vJHtwYWNrYWdlTmFtZX0ke3ZlcnNpb25TZWdtZW50fWA7XG5cbiAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdHlwZSh0eXBlOiByZWZsZWN0LlR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuZmluZFN1Ym1vZHVsZSh0eXBlKTtcbiAgICBjb25zdCBtb2R1bGVMaWtlID0gdGhpcy5tb2R1bGVMaWtlKHN1Ym1vZHVsZSA/PyB0eXBlLmFzc2VtYmx5KTtcblxuICAgIGNvbnN0IGZxbiA9IFttb2R1bGVMaWtlLm5hbWVdO1xuICAgIGxldCBuYW1lc3BhY2UgPSB0eXBlLm5hbWVzcGFjZTtcbiAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICBmcW4ucHVzaChuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBmcW4ucHVzaCh0eXBlLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUoe1xuICAgICAgZnFuOiBmcW4uam9pbignLicpLFxuICAgICAgbmFtZTogdHlwZS5uYW1lLFxuICAgICAgbmFtZXNwYWNlOiB0eXBlLm5hbWVzcGFjZSxcbiAgICAgIG1vZHVsZTogbW9kdWxlTGlrZS5uYW1lLFxuICAgICAgc3VibW9kdWxlOiBtb2R1bGVMaWtlLnN1Ym1vZHVsZSxcbiAgICAgIHN1Ym1vZHVsZVBhdGg6IHN1Ym1vZHVsZVBhdGgoc3VibW9kdWxlKSxcbiAgICAgIHNvdXJjZTogdHlwZSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNhbGxhYmxlKGNhbGxhYmxlOiByZWZsZWN0LkNhbGxhYmxlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRDYWxsYWJsZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShjYWxsYWJsZS5wYXJlbnRUeXBlKTtcbiAgICBjb25zdCBpc0luaXRpYWxpemVyID0gcmVmbGVjdC5Jbml0aWFsaXplci5pc0luaXRpYWxpemVyKGNhbGxhYmxlKTtcbiAgICBjb25zdCBuYW1lID0gaXNJbml0aWFsaXplclxuICAgICAgPyB0eXBlLm5hbWVcbiAgICAgIDogQ2FzZS5wYXNjYWwoY2FsbGFibGUubmFtZSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gY2FsbGFibGUucGFyYW1ldGVycy5zb3J0KHRoaXMub3B0aW9uYWxpdHlDb21wYXJlKTtcbiAgICBjb25zdCBwYXJhbXNGb3JtYXR0ZWQgPSBwYXJhbWV0ZXJzLm1hcChwID0+IHRoaXMuZm9ybWF0Rm5QYXJhbSh0aGlzLnBhcmFtZXRlcihwKSkpLmpvaW4oJywgJyk7XG5cbiAgICBsZXQgcmV0dXJuVHlwZTogdHJhbnNwaWxlLklUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNJbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuVHlwZSA9IHRoaXMudHlwZVJlZmVyZW5jZShjYWxsYWJsZS5wYXJlbnRUeXBlLnJlZmVyZW5jZSk7XG4gICAgfSBlbHNlIGlmIChyZWZsZWN0Lk1ldGhvZC5pc01ldGhvZChjYWxsYWJsZSkpIHtcbiAgICAgIHJldHVyblR5cGUgPSB0aGlzLnR5cGVSZWZlcmVuY2UoY2FsbGFibGUucmV0dXJucy50eXBlKTtcbiAgICB9XG4gICAgY29uc3QgcmV0dXJucyA9IHJldHVyblR5cGU/LnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpc1N0YXRpYyA9IHJlZmxlY3QuTWV0aG9kLmlzTWV0aG9kKGNhbGxhYmxlKSAmJiBjYWxsYWJsZS5zdGF0aWM7XG5cbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHRoaXMucGFja2FnZU5hbWUodHlwZSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVzID0gW2BmdW5jICR7aXNJbml0aWFsaXplciA/ICdOZXcnIDogJyd9JHtuYW1lfSgke3BhcmFtc0Zvcm1hdHRlZH0pJHtyZXR1cm5zID8gYCAke3JldHVybnN9YCA6ICcnfWBdO1xuICAgIGNvbnN0IGludm9jYXRpb25zID0gW2lzSW5pdGlhbGl6ZXJcbiAgICAgID8gYCR7cGFja2FnZU5hbWV9Lk5ldyR7bmFtZX0oJHtwYXJhbXNGb3JtYXR0ZWR9KSR7cmV0dXJucyA/IGAgJHtyZXR1cm5zfWAgOiAnJ31gXG4gICAgICA6IGAke3BhY2thZ2VOYW1lfS4ke3R5cGUubmFtZX0ke2lzU3RhdGljID8gJ18nIDogJy4nfSR7bmFtZX0oJHtwYXJhbXNGb3JtYXR0ZWR9KSR7cmV0dXJucyA/IGAgJHtyZXR1cm5zfWAgOiAnJ31gXTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdHlwZSxcbiAgICAgIGltcG9ydDogdGhpcy5mb3JtYXRJbXBvcnQodHlwZSksXG4gICAgICBwYXJhbWV0ZXJzLFxuICAgICAgc2lnbmF0dXJlcyxcbiAgICAgIGludm9jYXRpb25zLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2xhc3Moa2xhc3M6IHJlZmxlY3QuQ2xhc3NUeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRDbGFzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGtsYXNzLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUoa2xhc3MpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RydWN0KHN0cnVjdDogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRTdHJ1Y3Qge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLnR5cGUoc3RydWN0KTtcbiAgICBjb25zdCBpbnB1dCA9IHN0cnVjdC5hbGxQcm9wZXJ0aWVzLm1hcCgocCkgPT4ge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnR5KHApO1xuICAgICAgcmV0dXJuIGBcXHQke3Byb3BlcnR5Lm5hbWV9OiAke3Byb3BlcnR5LnR5cGVSZWZlcmVuY2V9LGA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBzdHJ1Y3QubmFtZSxcbiAgICAgIGltcG9ydDogdGhpcy5mb3JtYXRJbXBvcnQodHlwZSksXG4gICAgICBpbml0aWFsaXphdGlvbjogdGhpcy5mb3JtYXRTdHJ1Y3RCdWlsZGVyKHR5cGUsIGlucHV0KSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGludGVyZmFjZShpZmFjZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRJbnRlcmZhY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpZmFjZS5uYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlKGlmYWNlKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHBhcmFtZXRlcihwYXJhbWV0ZXI6IHJlZmxlY3QuUGFyYW1ldGVyKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRQYXJhbWV0ZXIge1xuICAgIGNvbnN0IHR5cGVSZWYgPSB0aGlzLnR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUpO1xuICAgIGNvbnN0IG5hbWUgPSBwYXJhbWV0ZXIubmFtZTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwYXJhbWV0ZXIucGFyZW50VHlwZSksXG4gICAgICB0eXBlUmVmZXJlbmNlOiB0eXBlUmVmLFxuICAgICAgb3B0aW9uYWw6IHBhcmFtZXRlci5vcHRpb25hbCxcbiAgICAgIHZhcmlhZGljOiBwYXJhbWV0ZXIudmFyaWFkaWMsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQYXJhbWV0ZXIobmFtZSwgdHlwZVJlZiwgcGFyYW1ldGVyLnZhcmlhZGljKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5KHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5KTogdHJhbnNwaWxlLlRyYW5zcGlsZWRQcm9wZXJ0eSB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwcm9wZXJ0eS50eXBlKTtcbiAgICBjb25zdCBuYW1lID0gQ2FzZS5wYXNjYWwocHJvcGVydHkubmFtZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXJlbnRUeXBlOiB0aGlzLnR5cGUocHJvcGVydHkucGFyZW50VHlwZSksXG4gICAgICB0eXBlUmVmZXJlbmNlOiB0eXBlUmVmLFxuICAgICAgb3B0aW9uYWw6IHByb3BlcnR5Lm9wdGlvbmFsLFxuICAgICAgZGVjbGFyYXRpb246IHRoaXMuZm9ybWF0UHJvcGVydHkobmFtZSwgdHlwZVJlZiwgcHJvcGVydHkpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZW51bShlbnU6IHJlZmxlY3QuRW51bVR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEVudW0ge1xuICAgIHJldHVybiB7XG4gICAgICBmcW46IHRoaXMudHlwZShlbnUpLmZxbixcbiAgICAgIG5hbWU6IGVudS5uYW1lLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZW51bU1lbWJlcihlbTogcmVmbGVjdC5FbnVtTWVtYmVyKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRFbnVtTWVtYmVyIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnFuOiBgJHt0aGlzLmVudW0oZW0uZW51bVR5cGUpLmZxbn1fJHtlbS5uYW1lfWAsXG4gICAgICBuYW1lOiBgJHtlbS5lbnVtVHlwZS5uYW1lfV8ke2VtLm5hbWV9YCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVuaW9uT2YoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hbnkoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbnRlcnNlY3Rpb25PZih0eXBlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgaW50ZXJmYWNlIHsgJHt0eXBlcy5qb2luKCc7ICcpfSB9YDtcbiAgfVxuXG4gIHB1YmxpYyBsaXN0T2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCpbXSR7dHlwZX1gO1xuICB9XG5cbiAgcHVibGljIHZhcmlhZGljT2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC4uLiR7dHlwZX1gO1xuICB9XG5cbiAgcHVibGljIG1hcE9mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAqbWFwW3N0cmluZ10ke3R5cGV9YDtcbiAgfVxuXG4gIHB1YmxpYyBhbnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2ludGVyZmFjZXt9JztcbiAgfVxuXG4gIHB1YmxpYyB2b2lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIHN0cigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnKnN0cmluZyc7XG4gIH1cblxuICBwdWJsaWMgbnVtYmVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcqZjY0JztcbiAgfVxuXG4gIHB1YmxpYyBib29sZWFuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcqYm9vbCc7XG4gIH1cblxuICBwdWJsaWMganNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1hcE9mKHRoaXMuYW55KCkpO1xuICB9XG5cbiAgcHVibGljIGRhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyp0aW1lLlRpbWUnO1xuICB9XG5cbiAgcHVibGljIHJlYWRtZShyZWFkbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlYWRtZTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Rm5QYXJhbShcbiAgICB0cmFuc3BpbGVkOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlcixcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRQYXJhbWV0ZXIodHJhbnNwaWxlZC5uYW1lLCB0cmFuc3BpbGVkLnR5cGVSZWZlcmVuY2UsIHRyYW5zcGlsZWQudmFyaWFkaWMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRJbXBvcnQodHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGltcG9ydCBcIiR7dHlwZS5tb2R1bGV9JHt0eXBlLnN1Ym1vZHVsZSA/IGAvJHt0eXBlLnN1Ym1vZHVsZX1gIDogJyd9XCJgO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXJhbWV0ZXIobmFtZTogc3RyaW5nLCB0eXBlUmVmZXJlbmNlOiB0cmFuc3BpbGUuSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLCB2YXJpYWRpYzogYm9vbGVhbikge1xuICAgIGNvbnN0IHRmID0gdHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgaWYgKHZhcmlhZGljKSB7XG4gICAgICByZXR1cm4gYCR7bmFtZX0gJHt0aGlzLnZhcmlhZGljT2YodGYpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke25hbWV9ICR7dGZ9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0U3RydWN0QnVpbGRlcih0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUsIHByb3BlcnRpZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgYCYke3RoaXMucGFja2FnZU5hbWUodHlwZSl9LiR7dHlwZS5uYW1lfSB7YCxcbiAgICAgIHByb3BlcnRpZXMuam9pbignXFxuJyksXG4gICAgICAnfScsXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfTtcblxuICBwcml2YXRlIGZvcm1hdFByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlUmVmZXJlbmNlOiB0cmFuc3BpbGUuSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLFxuICAgIHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRmID0gdHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3BlcnR5LnBhcmVudFR5cGUuaXNEYXRhVHlwZSgpID8gYCR7bmFtZX0gJHt0Zn1gIDogYGZ1bmMgJHtuYW1lfSgpICR7dGZ9YDtcbiAgfVxuXG4gIHByaXZhdGUgcGFja2FnZU5hbWUodHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZS5zdWJtb2R1bGUgPz9cbiAgICAgIHR5cGUubW9kdWxlLnNwbGl0KCcvJykuc2xpY2UoL1xcL3ZcXGQrJC8udGVzdCh0eXBlLm1vZHVsZSkgPyAtMiA6IC0xKVswXTtcbiAgfVxufVxuIl19