jsii-docgen
Version:
generates api docs for jsii modules
243 lines • 26.5 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.TypeScriptTranspile = void 0;
const reflect = __importStar(require("jsii-reflect"));
const transpile = __importStar(require("./transpile"));
const schema_1 = require("../schema");
// eslint-disable-next-line @typescript-eslint/no-require-imports
const Case = require('case');
// Helpers
const toCamelCase = (text) => {
return Case.camel(text !== null && text !== void 0 ? text : '');
};
const formatArguments = (inputs) => {
return inputs.join(', ');
};
const formatStructInitialization = (type) => {
const target = type.submodule ? `${type.namespace}.${type.name}` : type.name;
return `const ${toCamelCase(type.name)}: ${target} = { ... }`;
};
const formatClassInitialization = (type, inputs) => {
const target = type.submodule ? `${type.namespace}.${type.name}` : type.name;
return `new ${target}(${formatArguments(inputs)})`;
};
const formatInvocation = (type, inputs, method) => {
let target = type.submodule ? `${type.namespace}.${type.name}` : type.name;
if (method) {
target = `${target}.${method}`;
}
return `${target}(${formatArguments(inputs)})`;
};
const formatImport = (type) => {
if (type.submodule) {
return `import { ${type.submodule} } from '${type.module}'`;
}
else {
return `import { ${type.name} } from '${type.module}'`;
}
};
const formatSignature = (name, inputs, returns) => {
return `public ${name}(${formatArguments(inputs)})${returns ? ': ' + returns : ''}`;
};
/**
* A TypeScript transpiler.
*/
class TypeScriptTranspile extends transpile.TranspileBase {
constructor() {
super(transpile.Language.TYPESCRIPT);
}
readme(readme) {
return readme;
}
unionOf(types) {
return `${types.join(' | ')}`;
}
listOf(type) {
return `${type}[]`;
}
variadicOf(type) {
return `...${this.listOf(type)}`;
}
mapOf(type) {
return `{[ key: string ]: ${type}}`;
}
any() {
return 'any';
}
void() {
return 'void';
}
boolean() {
return 'boolean';
}
str() {
return 'string';
}
number() {
return 'number';
}
date() {
return 'Date';
}
json() {
return 'object';
}
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,
};
}
property(property) {
const typeRef = this.typeReference(property.type);
return {
name: property.name,
parentType: this.type(property.parentType),
typeReference: typeRef,
optional: property.optional,
declaration: this.formatProperty(property.name, typeRef),
};
}
class(klass) {
return {
name: klass.name,
type: this.type(klass),
};
}
parameter(parameter) {
const typeRef = this.typeReference(parameter.type);
return {
name: parameter.name,
parentType: this.type(parameter.parentType),
typeReference: typeRef,
optional: parameter.optional,
variadic: parameter.variadic,
declaration: this.formatProperty(parameter.name, typeRef),
};
}
struct(struct) {
const type = this.type(struct);
return {
type: type,
name: struct.name,
import: formatImport(type),
initialization: formatStructInitialization(type),
};
}
callable(callable) {
const type = this.type(callable.parentType);
const parameters = callable.parameters.sort(this.optionalityCompare);
const name = callable.name;
const inputs = parameters.map((p) => this.formatParameters(this.parameter(p)));
const invocation = reflect.Initializer.isInitializer(callable)
? formatClassInitialization(type, inputs)
: formatInvocation(type, inputs, name);
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: [invocation],
returnType,
};
}
interface(iface) {
return {
name: iface.name,
type: this.type(iface),
};
}
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) {
if (moduleLike instanceof reflect.Submodule) {
const fqnParts = moduleLike.fqn.split('.');
return { name: fqnParts[0], submodule: fqnParts[1] };
}
return { name: moduleLike.fqn };
}
formatParameters(transpiled) {
const tf = transpiled.typeReference.toString({
typeFormatter: (t) => t.name,
});
if (transpiled.variadic) {
return `${transpiled.name}: ${this.variadicOf(tf)}`;
}
return `${transpiled.name}${transpiled.optional ? '?' : ''}: ${tf}`;
}
formatProperty(name, typeReference) {
const tf = typeReference.toString({
typeFormatter: (t) => t.name,
});
return `public readonly ${name}: ${tf};`;
}
}
exports.TypeScriptTranspile = TypeScriptTranspile;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb2NnZW4vdHJhbnNwaWxlL3R5cGVzY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXdDO0FBQ3hDLHVEQUF5QztBQUN6QyxzQ0FBMEM7QUFDMUMsaUVBQWlFO0FBQ2pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU3QixVQUFVO0FBQ1YsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRTtJQUNwQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksRUFBRSxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FBQyxNQUFnQixFQUFFLEVBQUU7SUFDM0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQztBQUVGLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxJQUE4QixFQUFFLEVBQUU7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM3RSxPQUFPLFNBQVMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNoRSxDQUFDLENBQUM7QUFFRixNQUFNLHlCQUF5QixHQUFHLENBQ2hDLElBQThCLEVBQzlCLE1BQWdCLEVBQ2hCLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUks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LGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEIsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osYUFBZ0Q7UUFFaEQsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNoQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUNILE9BQU8sbUJBQW1CLElBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUE3TUQsa0RBNk1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgdHJhbnNwaWxlIGZyb20gJy4vdHJhbnNwaWxlJztcbmltcG9ydCB7IHN1Ym1vZHVsZVBhdGggfSBmcm9tICcuLi9zY2hlbWEnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IENhc2UgPSByZXF1aXJlKCdjYXNlJyk7XG5cbi8vIEhlbHBlcnNcbmNvbnN0IHRvQ2FtZWxDYXNlID0gKHRleHQ/OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIENhc2UuY2FtZWwodGV4dCA/PyAnJyk7XG59O1xuXG5jb25zdCBmb3JtYXRBcmd1bWVudHMgPSAoaW5wdXRzOiBzdHJpbmdbXSkgPT4ge1xuICByZXR1cm4gaW5wdXRzLmpvaW4oJywgJyk7XG59O1xuXG5jb25zdCBmb3JtYXRTdHJ1Y3RJbml0aWFsaXphdGlvbiA9ICh0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUpID0+IHtcbiAgY29uc3QgdGFyZ2V0ID0gdHlwZS5zdWJtb2R1bGUgPyBgJHt0eXBlLm5hbWVzcGFjZX0uJHt0eXBlLm5hbWV9YCA6IHR5cGUubmFtZTtcbiAgcmV0dXJuIGBjb25zdCAke3RvQ2FtZWxDYXNlKHR5cGUubmFtZSl9OiAke3RhcmdldH0gPSB7IC4uLiB9YDtcbn07XG5cbmNvbnN0IGZvcm1hdENsYXNzSW5pdGlhbGl6YXRpb24gPSAoXG4gIHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSxcbiAgaW5wdXRzOiBzdHJpbmdbXSxcbikgPT4ge1xuICBjb25zdCB0YXJnZXQgPSB0eXBlLnN1Ym1vZHVsZSA/IGAke3R5cGUubmFtZXNwYWNlfS4ke3R5cGUubmFtZX1gIDogdHlwZS5uYW1lO1xuICByZXR1cm4gYG5ldyAke3RhcmdldH0oJHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX0pYDtcbn07XG5cbmNvbnN0IGZvcm1hdEludm9jYXRpb24gPSAoXG4gIHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSxcbiAgaW5wdXRzOiBzdHJpbmdbXSxcbiAgbWV0aG9kOiBzdHJpbmcsXG4pID0+IHtcbiAgbGV0IHRhcmdldCA9IHR5cGUuc3VibW9kdWxlID8gYCR7dHlwZS5uYW1lc3BhY2V9LiR7dHlwZS5uYW1lfWAgOiB0eXBlLm5hbWU7XG4gIGlmIChtZXRob2QpIHtcbiAgICB0YXJnZXQgPSBgJHt0YXJnZXR9LiR7bWV0aG9kfWA7XG4gIH1cbiAgcmV0dXJuIGAke3RhcmdldH0oJHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX0pYDtcbn07XG5cbmNvbnN0IGZvcm1hdEltcG9ydCA9ICh0eXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUpID0+IHtcbiAgaWYgKHR5cGUuc3VibW9kdWxlKSB7XG4gICAgcmV0dXJuIGBpbXBvcnQgeyAke3R5cGUuc3VibW9kdWxlfSB9IGZyb20gJyR7dHlwZS5tb2R1bGV9J2A7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBpbXBvcnQgeyAke3R5cGUubmFtZX0gfSBmcm9tICcke3R5cGUubW9kdWxlfSdgO1xuICB9XG59O1xuXG5jb25zdCBmb3JtYXRTaWduYXR1cmUgPSAobmFtZTogc3RyaW5nLCBpbnB1dHM6IHN0cmluZ1tdLCByZXR1cm5zPzogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBgcHVibGljICR7bmFtZX0oJHtmb3JtYXRBcmd1bWVudHMoaW5wdXRzKX0pJHtyZXR1cm5zID8gJzogJyArIHJldHVybnMgOiAnJ31gO1xufTtcblxuLyoqXG4gKiBBIFR5cGVTY3JpcHQgdHJhbnNwaWxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVTY3JpcHRUcmFuc3BpbGUgZXh0ZW5kcyB0cmFuc3BpbGUuVHJhbnNwaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRyYW5zcGlsZS5MYW5ndWFnZS5UWVBFU0NSSVBUKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkbWUocmVhZG1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZWFkbWU7XG4gIH1cblxuICBwdWJsaWMgdW5pb25PZih0eXBlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0eXBlcy5qb2luKCcgfCAnKX1gO1xuICB9XG5cbiAgcHVibGljIGxpc3RPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0eXBlfVtdYDtcbiAgfVxuXG4gIHB1YmxpYyB2YXJpYWRpY09mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAuLi4ke3RoaXMubGlzdE9mKHR5cGUpfWA7XG4gIH1cblxuICBwdWJsaWMgbWFwT2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHtbIGtleTogc3RyaW5nIF06ICR7dHlwZX19YDtcbiAgfVxuXG4gIHB1YmxpYyBhbnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2FueSc7XG4gIH1cblxuICBwdWJsaWMgdm9pZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAndm9pZCc7XG4gIH1cblxuICBwdWJsaWMgYm9vbGVhbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMgc3RyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdzdHJpbmcnO1xuICB9XG5cbiAgcHVibGljIG51bWJlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnbnVtYmVyJztcbiAgfVxuXG4gIHB1YmxpYyBkYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdEYXRlJztcbiAgfVxuXG4gIHB1YmxpYyBqc29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdvYmplY3QnO1xuICB9XG5cbiAgcHVibGljIGVudW0oZW51OiByZWZsZWN0LkVudW1UeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRFbnVtIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnFuOiB0aGlzLnR5cGUoZW51KS5mcW4sXG4gICAgICBuYW1lOiBlbnUubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVudW1NZW1iZXIoZW06IHJlZmxlY3QuRW51bU1lbWJlcik6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bU1lbWJlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogYCR7dGhpcy5lbnVtKGVtLmVudW1UeXBlKS5mcW59LiR7ZW0ubmFtZX1gLFxuICAgICAgbmFtZTogZW0ubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5KHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5KTogdHJhbnNwaWxlLlRyYW5zcGlsZWRQcm9wZXJ0eSB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwcm9wZXJ0eS50eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwcm9wZXJ0eS5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcHJvcGVydHkub3B0aW9uYWwsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNsYXNzKGtsYXNzOiByZWZsZWN0LkNsYXNzVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkQ2xhc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBrbGFzcy5uYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlKGtsYXNzKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHBhcmFtZXRlcihcbiAgICBwYXJhbWV0ZXI6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlciB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBhcmFtZXRlci5uYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHBhcmFtZXRlci5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcGFyYW1ldGVyLm9wdGlvbmFsLFxuICAgICAgdmFyaWFkaWM6IHBhcmFtZXRlci52YXJpYWRpYyxcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmZvcm1hdFByb3BlcnR5KHBhcmFtZXRlci5uYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0cnVjdChzdHJ1Y3Q6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkU3RydWN0IHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKHN0cnVjdCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBzdHJ1Y3QubmFtZSxcbiAgICAgIGltcG9ydDogZm9ybWF0SW1wb3J0KHR5cGUpLFxuICAgICAgaW5pdGlhbGl6YXRpb246IGZvcm1hdFN0cnVjdEluaXRpYWxpemF0aW9uKHR5cGUpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgY2FsbGFibGUoY2FsbGFibGU6IHJlZmxlY3QuQ2FsbGFibGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZENhbGxhYmxlIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy50eXBlKGNhbGxhYmxlLnBhcmVudFR5cGUpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBjYWxsYWJsZS5wYXJhbWV0ZXJzLnNvcnQodGhpcy5vcHRpb25hbGl0eUNvbXBhcmUpO1xuICAgIGNvbnN0IG5hbWUgPSBjYWxsYWJsZS5uYW1lO1xuICAgIGNvbnN0IGlucHV0cyA9IHBhcmFtZXRlcnMubWFwKChwKSA9PiB0aGlzLmZvcm1hdFBhcmFtZXRlcnModGhpcy5wYXJhbWV0ZXIocCkpKTtcblxuICAgIGNvbnN0IGludm9jYXRpb24gPSByZWZsZWN0LkluaXRpYWxpemVyLmlzSW5pdGlhbGl6ZXIoY2FsbGFibGUpXG4gICAgICA/IGZvcm1hdENsYXNzSW5pdGlhbGl6YXRpb24odHlwZSwgaW5wdXRzKVxuICAgICAgOiBmb3JtYXRJbnZvY2F0aW9uKHR5cGUsIGlucHV0cywgbmFtZSk7XG5cbiAgICBsZXQgcmV0dXJuVHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZWZsZWN0LkluaXRpYWxpemVyLmlzSW5pdGlhbGl6ZXIoY2FsbGFibGUpKSB7XG4gICAgICByZXR1cm5UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlKGNhbGxhYmxlLnBhcmVudFR5cGUucmVmZXJlbmNlKTtcbiAgICB9IGVsc2UgaWYgKHJlZmxlY3QuTWV0aG9kLmlzTWV0aG9kKGNhbGxhYmxlKSkge1xuICAgICAgcmV0dXJuVHlwZSA9IHRoaXMudHlwZVJlZmVyZW5jZShjYWxsYWJsZS5yZXR1cm5zLnR5cGUpO1xuICAgIH1cbiAgICBjb25zdCByZXR1cm5zID0gcmV0dXJuVHlwZT8udG9TdHJpbmcoe1xuICAgICAgdHlwZUZvcm1hdHRlcjogKHQpID0+IHQubmFtZSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lLFxuICAgICAgcGFyZW50VHlwZTogdHlwZSxcbiAgICAgIGltcG9ydDogZm9ybWF0SW1wb3J0KHR5cGUpLFxuICAgICAgcGFyYW1ldGVycyxcbiAgICAgIHNpZ25hdHVyZXM6IFtmb3JtYXRTaWduYXR1cmUobmFtZSwgaW5wdXRzLCByZXR1cm5zKV0sXG4gICAgICBpbnZvY2F0aW9uczogW2ludm9jYXRpb25dLFxuICAgICAgcmV0dXJuVHlwZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGludGVyZmFjZShcbiAgICBpZmFjZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZEludGVyZmFjZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGlmYWNlLm5hbWUsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUoaWZhY2UpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdHlwZSh0eXBlOiByZWZsZWN0LlR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGUge1xuICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuZmluZFN1Ym1vZHVsZSh0eXBlKTtcbiAgICBjb25zdCBtb2R1bGVMaWtlID0gdGhpcy5tb2R1bGVMaWtlKHN1Ym1vZHVsZSA/IHN1Ym1vZHVsZSA6IHR5cGUuYXNzZW1ibHkpO1xuXG4gICAgY29uc3QgZnFuID0gW21vZHVsZUxpa2UubmFtZV07XG5cbiAgICBpZiAodHlwZS5uYW1lc3BhY2UpIHtcbiAgICAgIGZxbi5wdXNoKHR5cGUubmFtZXNwYWNlKTtcbiAgICB9XG4gICAgZnFuLnB1c2godHlwZS5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlKHtcbiAgICAgIGZxbjogZnFuLmpvaW4oJy4nKSxcbiAgICAgIG5hbWU6IHR5cGUubmFtZSxcbiAgICAgIG5hbWVzcGFjZTogdHlwZS5uYW1lc3BhY2UsXG4gICAgICBtb2R1bGU6IG1vZHVsZUxpa2UubmFtZSxcbiAgICAgIHN1Ym1vZHVsZTogbW9kdWxlTGlrZS5zdWJtb2R1bGUsXG4gICAgICBzdWJtb2R1bGVQYXRoOiBzdWJtb2R1bGVQYXRoKHN1Ym1vZHVsZSksXG4gICAgICBzb3VyY2U6IHR5cGUsXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb2R1bGVMaWtlKFxuICAgIG1vZHVsZUxpa2U6IHJlZmxlY3QuTW9kdWxlTGlrZSxcbiAgKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRNb2R1bGVMaWtlIHtcbiAgICBpZiAobW9kdWxlTGlrZSBpbnN0YW5jZW9mIHJlZmxlY3QuU3VibW9kdWxlKSB7XG4gICAgICBjb25zdCBmcW5QYXJ0cyA9IG1vZHVsZUxpa2UuZnFuLnNwbGl0KCcuJyk7XG4gICAgICByZXR1cm4geyBuYW1lOiBmcW5QYXJ0c1swXSwgc3VibW9kdWxlOiBmcW5QYXJ0c1sxXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBuYW1lOiBtb2R1bGVMaWtlLmZxbiB9O1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQYXJhbWV0ZXJzKFxuICAgIHRyYW5zcGlsZWQ6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUGFyYW1ldGVyLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHRmID0gdHJhbnNwaWxlZC50eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG5cbiAgICBpZiAodHJhbnNwaWxlZC52YXJpYWRpYykge1xuICAgICAgcmV0dXJuIGAke3RyYW5zcGlsZWQubmFtZX06ICR7dGhpcy52YXJpYWRpY09mKHRmKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0cmFuc3BpbGVkLm5hbWV9JHt0cmFuc3BpbGVkLm9wdGlvbmFsID8gJz8nIDogJyd9OiAke3RmfWA7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlUmVmZXJlbmNlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdGYgPSB0eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIGBwdWJsaWMgcmVhZG9ubHkgJHtuYW1lfTogJHt0Zn07YDtcbiAgfVxufVxuIl19
;