jsii-docgen
Version:
generates api docs for jsii modules
258 lines • 31 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(this.getParentModule(moduleLike));
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();
}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ28uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jZ2VuL3RyYW5zcGlsZS9nby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0Isc0RBQXdDO0FBQ3hDLHVEQUF5QztBQUN6QyxzQ0FBMEM7QUFFMUMsTUFBYSxXQUFZLFNBQVEsU0FBUyxDQUFDLGFBQWE7SUFDdEQ7UUFDRSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sVUFBVSxDQUFDLFVBQThCOztRQUM5QyxJQUFJLFVBQVUsWUFBWSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDakUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVM7Z0JBQ2hDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFFaEIsZ0VBQWdFO1lBQ2hFLHlDQUF5QztZQUN6Qyw0Q0FBNEM7WUFDNUMsTUFBTSxXQUFXLEdBQUcsTUFBQSxNQUFBLE1BQUEsVUFBVSxDQUFDLE9BQU8sMENBQUUsRUFBRSwwQ0FBRSxXQUFXLG1DQUNsRCxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFN0QsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3JELENBQUM7YUFBTSxDQUFDO1lBQ04sMEJBQTBCO1lBQzFCLE1BQU0sVUFBVSxHQUFHLE1BQUEs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TSxjQUFjLENBQ3BCLElBQVksRUFDWixhQUFnRCxFQUNoRCxRQUEwQjtRQUUxQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQ2hDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUM7SUFDckYsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUE4Qjs7UUFDaEQsT0FBTyxNQUFBLElBQUksQ0FBQyxTQUFTLG1DQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7Q0FDRjtBQXhRRCxrQ0F3UUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDYXNlIGZyb20gJ2Nhc2UnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgdHJhbnNwaWxlIGZyb20gJy4vdHJhbnNwaWxlJztcbmltcG9ydCB7IHN1Ym1vZHVsZVBhdGggfSBmcm9tICcuLi9zY2hlbWEnO1xuXG5leHBvcnQgY2xhc3MgR29UcmFuc3BpbGUgZXh0ZW5kcyB0cmFuc3BpbGUuVHJhbnNwaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRyYW5zcGlsZS5MYW5ndWFnZS5HTyk7XG4gIH1cblxuICBwdWJsaWMgbW9kdWxlTGlrZShtb2R1bGVMaWtlOiByZWZsZWN0Lk1vZHVsZUxpa2UpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZE1vZHVsZUxpa2Uge1xuICAgIGlmIChtb2R1bGVMaWtlIGluc3RhbmNlb2YgcmVmbGVjdC5TdWJtb2R1bGUpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubW9kdWxlTGlrZSh0aGlzLmdldFBhcmVudE1vZHVsZShtb2R1bGVMaWtlKSk7XG4gICAgICBjb25zdCBwYXJlbnRGcW4gPSBwYXJlbnQuc3VibW9kdWxlXG4gICAgICAgID8gYCR7cGFyZW50Lm5hbWV9LyR7cGFyZW50LnN1Ym1vZHVsZX1gXG4gICAgICAgIDogcGFyZW50Lm5hbWU7XG5cbiAgICAgIC8vIGBwYWNrYWdlTmFtZWAgY2FuIGJlIHNwZWNpZmllZCBleHBsaWNpdGx5IGluIGNvbmZpZ3VyYXRpb24gb3JcbiAgICAgIC8vIGF1dG8tZ2VuZXJhdGVkIGZyb20gbm9kZSBwYWNrYWdlIG5hbWUuXG4gICAgICAvLyBFeGFtcGxlOiBAYXdzLWNkay9hd3MtZWNyIC0+IGF3c2Nka2F3c2VjclxuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBtb2R1bGVMaWtlLnRhcmdldHM/LmdvPy5wYWNrYWdlTmFtZVxuICAgICAgICA/PyBtb2R1bGVMaWtlLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpO1xuXG4gICAgICByZXR1cm4geyBuYW1lOiBwYXJlbnRGcW4sIHN1Ym1vZHVsZTogcGFja2FnZU5hbWUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBtb2R1bGVMaWtlLnRhcmdldHM/LmdvPy5tb2R1bGVOYW1lO1xuXG4gICAgICAvLyBtb2R1bGVOYW1lIGlzIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gZm9yIEdvIGVuYWJsZWQgcGFja2FnZXNcbiAgICAgIC8vIFZhbGlkYXRpb24gaW4gYERvY3VtZW50YXRpb25gIGNsYXNzIHByZXZlbnRzIHRoaXNcbiAgICAgIGlmICghbW9kdWxlTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wianNpaS50YXJnZXRzLmdvLm1vZHVsZU5hbWVcIiBpcyBhIHJlcXVpcmVkIGZpZWxkIGZvciBHbyBlbmFibGVkIEpTSUkgbW9kdWxlcycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IG1vZHVsZUxpa2UudGFyZ2V0cz8uZ28/LnBhY2thZ2VOYW1lXG4gICAgICAgID8/IChtb2R1bGVMaWtlIGFzIHJlZmxlY3QuQXNzZW1ibHkpLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpO1xuICAgICAgY29uc3QgdmVyc2lvbiA9IE51bWJlci5wYXJzZUludCgobW9kdWxlTGlrZSBhcyByZWZsZWN0LkFzc2VtYmx5KS52ZXJzaW9uLnNwbGl0KCcuJylbMF0pO1xuICAgICAgY29uc3QgdmVyc2lvblNlZ21lbnQgPSB2ZXJzaW9uID49IDIgPyBgL3Yke3ZlcnNpb259YCA6ICcnO1xuXG4gICAgICAvLyBFeGFtcGxlOiBnaXRodWIuY29tL2F3cy9jb25zdHJ1Y3RzLWdvL2NvbnN0cnVjdHMvdjEwXG4gICAgICBjb25zdCBuYW1lID0gYCR7bW9kdWxlTmFtZX0vJHtwYWNrYWdlTmFtZX0ke3ZlcnNpb25TZWdtZW50fWA7XG5cbiAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdHlwZSh0eXBlOiByZWZsZWN0LlR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuZmluZFN1Ym1vZHVsZSh0eXBlKTtcbiAgICBjb25zdCBtb2R1bGVMaWtlID0gdGhpcy5tb2R1bGVMaWtlKHN1Ym1vZHVsZSA/PyB0eXBlLmFzc2VtYmx5KTtcblxuICAgIGNvbnN0IGZxbiA9IFttb2R1bGVMaWtlLm5hbWVdO1xuICAgIGxldCBuYW1lc3BhY2UgPSB0eXBlLm5hbWVzcGFjZTtcbiAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICBmcW4ucHVzaChuYW1lc3BhY2UpO1xuICAgIH1cbiAgICBmcW4ucHVzaCh0eXBlLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUoe1xuICAgICAgZnFuOiBmcW4uam9pbignLicpLFxuICAgICAgbmFtZTogdHlwZS5uYW1lLFxuICAgICAgbmFtZXNwYWNlOiB0eXBlLm5hbWVzcGFjZSxcbiAgICAgIG1vZHVsZTogbW9kdWxlTGlrZS5uYW1lLFxuICAgICAgc3VibW9kdWxlOiBtb2R1bGVMaWtlLnN1Ym1vZHVsZSxcbiAgICAgIHN1Ym1vZHVsZVBhdGg6IHN1Ym1vZHVsZVBhdGgoc3VibW9kdWxlKSxcbiAgICAgIHNvdXJjZTogdHlwZSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNhbGxhYmxlKGNhbGxhYmxlOiByZWZsZWN0LkNhbGxhYmxlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRDYWxsYWJsZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShjYWxsYWJsZS5wYXJlbnRUeXBlKTtcbiAgICBjb25zdCBpc0luaXRpYWxpemVyID0gcmVmbGVjdC5Jbml0aWFsaXplci5pc0luaXRpYWxpemVyKGNhbGxhYmxlKTtcbiAgICBjb25zdCBuYW1lID0gaXNJbml0aWFsaXplclxuICAgICAgPyB0eXBlLm5hbWVcbiAgICAgIDogQ2FzZS5wYXNjYWwoY2FsbGFibGUubmFtZSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gY2FsbGFibGUucGFyYW1ldGVycy5zb3J0KHRoaXMub3B0aW9uYWxpdHlDb21wYXJlKTtcbiAgICBjb25zdCBwYXJhbXNGb3JtYXR0ZWQgPSBwYXJhbWV0ZXJzLm1hcChwID0+IHRoaXMuZm9ybWF0Rm5QYXJhbSh0aGlzLnBhcmFtZXRlcihwKSkpLmpvaW4oJywgJyk7XG5cbiAgICBsZXQgcmV0dXJuVHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc0luaXRpYWxpemVyKSB7XG4gICAgICByZXR1cm5UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlKGNhbGxhYmxlLnBhcmVudFR5cGUucmVmZXJlbmNlKTtcbiAgICB9IGVsc2UgaWYgKHJlZmxlY3QuTWV0aG9kLmlzTWV0aG9kKGNhbGxhYmxlKSkge1xuICAgICAgcmV0dXJuVHlwZSA9IHRoaXMudHlwZVJlZmVyZW5jZShjYWxsYWJsZS5yZXR1cm5zLnR5cGUpO1xuICAgIH1cbiAgICBjb25zdCByZXR1cm5zID0gcmV0dXJuVHlwZT8udG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGlzU3RhdGljID0gcmVmbGVjdC5NZXRob2QuaXNNZXRob2QoY2FsbGFibGUpICYmIGNhbGxhYmxlLnN0YXRpYztcblxuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gdGhpcy5wYWNrYWdlTmFtZSh0eXBlKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBbYGZ1bmMgJHtpc0luaXRpYWxpemVyID8gJ05ldycgOiAnJ30ke25hbWV9KCR7cGFyYW1zRm9ybWF0dGVkfSkke3JldHVybnMgPyBgICR7cmV0dXJuc31gIDogJyd9YF07XG4gICAgY29uc3QgaW52b2NhdGlvbnMgPSBbaXNJbml0aWFsaXplclxuICAgICAgPyBgJHtwYWNrYWdlTmFtZX0uTmV3JHtuYW1lfSgke3BhcmFtc0Zvcm1hdHRlZH0pJHtyZXR1cm5zID8gYCAke3JldHVybnN9YCA6ICcnfWBcbiAgICAgIDogYCR7cGFja2FnZU5hbWV9LiR7dHlwZS5uYW1lfSR7aXNTdGF0aWMgPyAnXycgOiAnLid9JHtuYW1lfSgke3BhcmFtc0Zvcm1hdHRlZH0pJHtyZXR1cm5zID8gYCAke3JldHVybnN9YCA6ICcnfWBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXJlbnRUeXBlOiB0eXBlLFxuICAgICAgaW1wb3J0OiB0aGlzLmZvcm1hdEltcG9ydCh0eXBlKSxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICBzaWduYXR1cmVzLFxuICAgICAgaW52b2NhdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjbGFzcyhrbGFzczogcmVmbGVjdC5DbGFzc1R5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZENsYXNzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToga2xhc3MubmFtZSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZShrbGFzcyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJ1Y3Qoc3RydWN0OiByZWZsZWN0LkludGVyZmFjZVR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFN0cnVjdCB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShzdHJ1Y3QpO1xuICAgIGNvbnN0IGlucHV0ID0gc3RydWN0LmFsbFByb3BlcnRpZXMubWFwKChwKSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydHkocCk7XG4gICAgICByZXR1cm4gYFxcdCR7cHJvcGVydHkubmFtZX06ICR7cHJvcGVydHkudHlwZVJlZmVyZW5jZX0sYDtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIG5hbWU6IHN0cnVjdC5uYW1lLFxuICAgICAgaW1wb3J0OiB0aGlzLmZvcm1hdEltcG9ydCh0eXBlKSxcbiAgICAgIGluaXRpYWxpemF0aW9uOiB0aGlzLmZvcm1hdFN0cnVjdEJ1aWxkZXIodHlwZSwgaW5wdXQpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgaW50ZXJmYWNlKGlmYWNlOiByZWZsZWN0LkludGVyZmFjZVR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEludGVyZmFjZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGlmYWNlLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUoaWZhY2UpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcGFyYW1ldGVyKHBhcmFtZXRlcjogcmVmbGVjdC5QYXJhbWV0ZXIpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlciB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSk7XG4gICAgY29uc3QgbmFtZSA9IHBhcmFtZXRlci5uYW1lO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHBhcmFtZXRlci5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcGFyYW1ldGVyLm9wdGlvbmFsLFxuICAgICAgdmFyaWFkaWM6IHBhcmFtZXRlci52YXJpYWRpYyxcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmZvcm1hdFBhcmFtZXRlcihuYW1lLCB0eXBlUmVmLCBwYXJhbWV0ZXIudmFyaWFkaWMpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcHJvcGVydHkocHJvcGVydHk6IHJlZmxlY3QuUHJvcGVydHkpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFByb3BlcnR5IHtcbiAgICBjb25zdCB0eXBlUmVmID0gdGhpcy50eXBlUmVmZXJlbmNlKHByb3BlcnR5LnR5cGUpO1xuICAgIGNvbnN0IG5hbWUgPSBDYXNlLnBhc2NhbChwcm9wZXJ0eS5uYW1lKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwcm9wZXJ0eS5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcHJvcGVydHkub3B0aW9uYWwsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQcm9wZXJ0eShuYW1lLCB0eXBlUmVmLCBwcm9wZXJ0eSksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlbnVtKGVudTogcmVmbGVjdC5FbnVtVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogdGhpcy50eXBlKGVudSkuZnFuLFxuICAgICAgbmFtZTogZW51Lm5hbWUsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBlbnVtTWVtYmVyKGVtOiByZWZsZWN0LkVudW1NZW1iZXIpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEVudW1NZW1iZXIge1xuICAgIHJldHVybiB7XG4gICAgICBmcW46IGAke3RoaXMuZW51bShlbS5lbnVtVHlwZSkuZnFufV8ke2VtLm5hbWV9YCxcbiAgICAgIG5hbWU6IGAke2VtLmVudW1UeXBlLm5hbWV9XyR7ZW0ubmFtZX1gLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdW5pb25PZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFueSgpO1xuICB9XG5cbiAgcHVibGljIGxpc3RPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgKltdJHt0eXBlfWA7XG4gIH1cblxuICBwdWJsaWMgdmFyaWFkaWNPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLi4uJHt0eXBlfWA7XG4gIH1cblxuICBwdWJsaWMgbWFwT2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCptYXBbc3RyaW5nXSR7dHlwZX1gO1xuICB9XG5cbiAgcHVibGljIGFueSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnaW50ZXJmYWNle30nO1xuICB9XG5cbiAgcHVibGljIHZvaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgc3RyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcqc3RyaW5nJztcbiAgfVxuXG4gIHB1YmxpYyBudW1iZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJypmNjQnO1xuICB9XG5cbiAgcHVibGljIGJvb2xlYW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJypib29sJztcbiAgfVxuXG4gIHB1YmxpYyBqc29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWFwT2YodGhpcy5hbnkoKSk7XG4gIH1cblxuICBwdWJsaWMgZGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnKnRpbWUuVGltZSc7XG4gIH1cblxuICBwdWJsaWMgcmVhZG1lKHJlYWRtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVhZG1lO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRGblBhcmFtKFxuICAgIHRyYW5zcGlsZWQ6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUGFyYW1ldGVyLFxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdFBhcmFtZXRlcih0cmFuc3BpbGVkLm5hbWUsIHRyYW5zcGlsZWQudHlwZVJlZmVyZW5jZSwgdHJhbnNwaWxlZC52YXJpYWRpYyk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEltcG9ydCh0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgaW1wb3J0IFwiJHt0eXBlLm1vZHVsZX0ke3R5cGUuc3VibW9kdWxlID8gYC8ke3R5cGUuc3VibW9kdWxlfWAgOiAnJ31cImA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIHR5cGVSZWZlcmVuY2U6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSwgdmFyaWFkaWM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB0ZiA9IHR5cGVSZWZlcmVuY2UudG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIGlmICh2YXJpYWRpYykge1xuICAgICAgcmV0dXJuIGAke25hbWV9ICR7dGhpcy52YXJpYWRpY09mKHRmKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtuYW1lfSAke3RmfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFN0cnVjdEJ1aWxkZXIodHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGAmJHt0aGlzLnBhY2thZ2VOYW1lKHR5cGUpfS4ke3R5cGUubmFtZX0ge2AsXG4gICAgICBwcm9wZXJ0aWVzLmpvaW4oJ1xcbicpLFxuICAgICAgJ30nLFxuICAgIF0uam9pbignXFxuJyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBmb3JtYXRQcm9wZXJ0eShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZVJlZmVyZW5jZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLFxuICAgIHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRmID0gdHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3BlcnR5LnBhcmVudFR5cGUuaXNEYXRhVHlwZSgpID8gYCR7bmFtZX0gJHt0Zn1gIDogYGZ1bmMgJHtuYW1lfSgpICR7dGZ9YDtcbiAgfVxuXG4gIHByaXZhdGUgcGFja2FnZU5hbWUodHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZS5zdWJtb2R1bGUgPz9cbiAgICAgIHR5cGUubW9kdWxlLnNwbGl0KCcvJykuc2xpY2UoL1xcL3ZcXGQrJC8udGVzdCh0eXBlLm1vZHVsZSkgPyAtMiA6IC0xKVswXTtcbiAgfVxufVxuIl19
;