@selfage/generator_cli
Version:
Code generation for message, service, and database.
128 lines • 20 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TsContentBuilder = exports.SimpleContentBuilder = void 0;
const path = require("path");
const io_helper_1 = require("./io_helper");
const util_1 = require("./util");
// Holds arbitrary generated content.
class SimpleContentBuilder {
static get(contentMap, suffix, outputModulePath) {
outputModulePath = (0, util_1.normalizeRelativePathForNode)(outputModulePath);
let outputContentBuilder = contentMap.get(outputModulePath);
if (!outputContentBuilder) {
outputContentBuilder = new SimpleContentBuilder(outputModulePath, suffix);
contentMap.set(outputModulePath, outputContentBuilder);
}
return outputContentBuilder;
}
constructor(outputModulePath, suffix) {
this.outputModulePath = outputModulePath;
this.suffix = suffix;
this.contentList = new Array();
}
push(...newContent) {
this.contentList.push(...newContent);
}
build() {
return this.contentList.join("");
}
writeSync(dryRun) {
(0, io_helper_1.writeFileSync)(this.outputModulePath + this.suffix, this.build(), dryRun);
}
}
exports.SimpleContentBuilder = SimpleContentBuilder;
// Holds generated TypeScript code content.
class TsContentBuilder {
static get(contentMap, definitionModulePath, outputModulePath) {
outputModulePath = (0, util_1.normalizeRelativePathForNode)(outputModulePath ?? definitionModulePath);
let outputContentBuilder = contentMap.get(outputModulePath);
if (!outputContentBuilder) {
outputContentBuilder = new TsContentBuilder(definitionModulePath, outputModulePath);
contentMap.set(outputModulePath, outputContentBuilder);
}
return outputContentBuilder;
}
constructor(baseDefinitionModulePath, outputModulePath) {
this.baseDefinitionModulePath = baseDefinitionModulePath;
this.outputModulePath = outputModulePath;
this.pathToNamedImports = new Map();
this.namedImportToPaths = new Map();
this.contentList = new Array();
this.outputModuleDirPath = path.posix.resolve(path.posix.dirname(outputModulePath));
this.sameModuleImportPath = (0, util_1.normalizeRelativePathForNode)(path.posix.basename(outputModulePath));
}
push(...newContent) {
this.contentList.push(...newContent);
}
importFromDatastoreModelDescriptor(...namedImports) {
this.importFrom("@selfage/datastore_client/model_descriptor", ...namedImports);
}
importFromMessageDescriptor(...namedImports) {
this.importFrom("@selfage/message/descriptor", ...namedImports);
}
importFromMessageSerializer(...namedImports) {
this.importFrom("@selfage/message/serializer", ...namedImports);
}
importFromObservableDescriptor(...namedImports) {
this.importFrom("@selfage/observable/descriptor", ...namedImports);
}
importFromServiceDescriptor(...namedImports) {
this.importFrom("@selfage/service_descriptor", ...namedImports);
}
importFromServiceClientRequestInterface(...namedImports) {
this.importFrom("@selfage/service_descriptor/client_request_interface", ...namedImports);
}
importFromServiceRemoteCallHandlerInterface(...namedImports) {
this.importFrom("@selfage/service_descriptor/remote_call_handler_interface", ...namedImports);
}
importFromObservableArray(...namedImports) {
this.importFrom("@selfage/observable_array", ...namedImports);
}
importFromSpanner(...namedImports) {
this.importFrom("@google-cloud/spanner", ...namedImports);
}
importFromSpannerTransaction(...namedImports) {
this.importFrom("@google-cloud/spanner/build/src/transaction", ...namedImports);
}
importFromStream(...namedImports) {
this.importFrom("stream", ...namedImports);
}
importFromDefinition(definitionModulePath, ...namedImports) {
if (!definitionModulePath) {
definitionModulePath = this.baseDefinitionModulePath;
}
if ((0, util_1.isRelativePath)(definitionModulePath)) {
definitionModulePath = (0, util_1.normalizeRelativePathForNode)(path.posix.relative(this.outputModuleDirPath, definitionModulePath));
}
if (definitionModulePath === this.sameModuleImportPath) {
return;
}
this.importFrom(definitionModulePath, ...namedImports);
}
importFrom(path, ...namedImports) {
let namedImportsInMap = this.pathToNamedImports.get(path);
if (!namedImportsInMap) {
namedImportsInMap = new Set();
this.pathToNamedImports.set(path, namedImportsInMap);
}
for (let namedImport of namedImports) {
namedImportsInMap.add(namedImport);
this.namedImportToPaths.set(namedImport, path);
}
}
build() {
let resultContent = new Array();
for (let entry of this.pathToNamedImports.entries()) {
let importPath = entry[0];
let namedImports = Array.from(entry[1]).join(", ");
resultContent.push(`import { ${namedImports} } from '${importPath}';\n`);
}
resultContent.push(...this.contentList);
return resultContent.join("");
}
writeSync(dryRun) {
(0, io_helper_1.writeFileSync)(this.outputModulePath + ".ts", this.build(), dryRun);
}
}
exports.TsContentBuilder = TsContentBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0X2NvbnRlbnRfYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm91dHB1dF9jb250ZW50X2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQThCO0FBQzlCLDJDQUE0QztBQUM1QyxpQ0FBc0U7QUFPdEUscUNBQXFDO0FBQ3JDLE1BQWEsb0JBQW9CO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQ2YsVUFBNkMsRUFDN0MsTUFBYyxFQUNkLGdCQUF3QjtRQUV4QixnQkFBZ0IsR0FBRyxJQUFBLG1DQUE0QixFQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEUsSUFBSSxvQkFBb0IsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUN2QyxnQkFBZ0IsQ0FDTyxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDMUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFJRCxZQUNVLGdCQUF3QixFQUN4QixNQUFjO1FBRGQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFKaEIsZ0JBQVcsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBS3ZDLENBQUM7SUFFRyxJQUFJLENBQUMsR0FBRyxVQUF5QjtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxLQUFLO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWU7UUFDOUIsSUFBQSx5QkFBYSxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0Y7QUFuQ0Qsb0RBbUNDO0FBRUQsMkNBQTJDO0FBQzNDLE1BQWEsZ0JBQWdCO0lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQ2YsVUFBNkMsRUFDN0Msb0JBQTRCLEVBQzVCLGdCQUF5QjtRQUV6QixnQkFBZ0IsR0FBRyxJQUFBLG1DQUE0QixFQUM3QyxnQkFBZ0IsSUFBSSxvQkFBb0IsQ0FDekMsQ0FBQztRQUNGLElBQUksb0JBQW9CLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FDdkMsZ0JBQWdCLENBQ0csQ0FBQztRQUN0QixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMxQixvQkFBb0IsR0FBRyxJQUFJLGdCQUFnQixDQUN6QyxvQkFBb0IsRUFDcEIsZ0JBQWdCLENBQ2pCLENBQUM7WUFDRixVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDekQsQ0FBQztRQUNELE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQztJQVFELFlBQ1Usd0JBQWdDLEVBQ2hDLGdCQUF3QjtRQUR4Qiw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQVE7UUFDaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBUjFCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBQ3BELHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQy9DLGdCQUFXLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQVF4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQ3JDLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBQSxtQ0FBNEIsRUFDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFTSxJQUFJLENBQUMsR0FBRyxVQUF5QjtRQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxrQ0FBa0MsQ0FDdkMsR0FBRyxZQUEyQjtRQUU5QixJQUFJLENBQUMsVUFBVSxDQUNiLDRDQUE0QyxFQUM1QyxHQUFHLFlBQVksQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFTSwyQkFBMkIsQ0FBQyxHQUFHLFlBQTJCO1FBQy9ELElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sMkJBQTJCLENBQUMsR0FBRyxZQUEyQjtRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLDhCQUE4QixDQUFDLEdBQUcsWUFBMkI7UUFDbEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTSwyQkFBMkIsQ0FBQyxHQUFHLFlBQTJCO1FBQy9ELElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sdUNBQXVDLENBQzVDLEdBQUcsWUFBMkI7UUFFOUIsSUFBSSxDQUFDLFVBQVUsQ0FDYixzREFBc0QsRUFDdEQsR0FBRyxZQUFZLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRU0sMkNBQTJDLENBQ2hELEdBQUcsWUFBMkI7UUFFOUIsSUFBSSxDQUFDLFVBQVUsQ0FDYiwyREFBMkQsRUFDM0QsR0FBRyxZQUFZLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBRU0seUJBQXlCLENBQUMsR0FBRyxZQUEyQjtRQUM3RCxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEdBQUcsWUFBMkI7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSw0QkFBNEIsQ0FBQyxHQUFHLFlBQTJCO1FBQ2hFLElBQUksQ0FBQyxVQUFVLENBQ2IsNkNBQTZDLEVBQzdDLEdBQUcsWUFBWSxDQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVNLGdCQUFnQixDQUFDLEdBQUcsWUFBMkI7UUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sb0JBQW9CLENBQ3pCLG9CQUF3QyxFQUN4QyxHQUFHLFlBQTJCO1FBRTlCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzFCLG9CQUFvQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsSUFBSSxJQUFBLHFCQUFjLEVBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQ3pDLG9CQUFvQixHQUFHLElBQUEsbUNBQTRCLEVBQ2pELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxvQkFBb0IsQ0FBQyxDQUNwRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksb0JBQW9CLEtBQUssSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDdkQsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLFVBQVUsQ0FDaEIsSUFBd0IsRUFDeEIsR0FBRyxZQUEyQjtRQUU5QixJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDdkIsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxLQUFLLElBQUksV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3JDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLGFBQWEsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDcEQsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25ELGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxZQUFZLFlBQVksVUFBVSxNQUFNLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUFlO1FBQzlCLElBQUEseUJBQWEsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0Y7QUF6SkQsNENBeUpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmltcG9ydCB7IHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiLi9pb19oZWxwZXJcIjtcbmltcG9ydCB7IGlzUmVsYXRpdmVQYXRoLCBub3JtYWxpemVSZWxhdGl2ZVBhdGhGb3JOb2RlIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE91dHB1dENvbnRlbnRCdWlsZGVyIHtcbiAgYnVpbGQ6ICgpID0+IHN0cmluZztcbiAgd3JpdGVTeW5jOiAoZHJ5UnVuOiBib29sZWFuKSA9PiB2b2lkO1xufVxuXG4vLyBIb2xkcyBhcmJpdHJhcnkgZ2VuZXJhdGVkIGNvbnRlbnQuXG5leHBvcnQgY2xhc3MgU2ltcGxlQ29udGVudEJ1aWxkZXIgaW1wbGVtZW50cyBPdXRwdXRDb250ZW50QnVpbGRlciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0KFxuICAgIGNvbnRlbnRNYXA6IE1hcDxzdHJpbmcsIE91dHB1dENvbnRlbnRCdWlsZGVyPixcbiAgICBzdWZmaXg6IHN0cmluZyxcbiAgICBvdXRwdXRNb2R1bGVQYXRoOiBzdHJpbmcsXG4gICk6IFNpbXBsZUNvbnRlbnRCdWlsZGVyIHtcbiAgICBvdXRwdXRNb2R1bGVQYXRoID0gbm9ybWFsaXplUmVsYXRpdmVQYXRoRm9yTm9kZShvdXRwdXRNb2R1bGVQYXRoKTtcbiAgICBsZXQgb3V0cHV0Q29udGVudEJ1aWxkZXIgPSBjb250ZW50TWFwLmdldChcbiAgICAgIG91dHB1dE1vZHVsZVBhdGgsXG4gICAgKSBhcyBTaW1wbGVDb250ZW50QnVpbGRlcjtcbiAgICBpZiAoIW91dHB1dENvbnRlbnRCdWlsZGVyKSB7XG4gICAgICBvdXRwdXRDb250ZW50QnVpbGRlciA9IG5ldyBTaW1wbGVDb250ZW50QnVpbGRlcihvdXRwdXRNb2R1bGVQYXRoLCBzdWZmaXgpO1xuICAgICAgY29udGVudE1hcC5zZXQob3V0cHV0TW9kdWxlUGF0aCwgb3V0cHV0Q29udGVudEJ1aWxkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0Q29udGVudEJ1aWxkZXI7XG4gIH1cblxuICBwcml2YXRlIGNvbnRlbnRMaXN0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvdXRwdXRNb2R1bGVQYXRoOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBzdWZmaXg6IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBwdXNoKC4uLm5ld0NvbnRlbnQ6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRMaXN0LnB1c2goLi4ubmV3Q29udGVudCk7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50TGlzdC5qb2luKFwiXCIpO1xuICB9XG5cbiAgcHVibGljIHdyaXRlU3luYyhkcnlSdW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB3cml0ZUZpbGVTeW5jKHRoaXMub3V0cHV0TW9kdWxlUGF0aCArIHRoaXMuc3VmZml4LCB0aGlzLmJ1aWxkKCksIGRyeVJ1bik7XG4gIH1cbn1cblxuLy8gSG9sZHMgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgY29kZSBjb250ZW50LlxuZXhwb3J0IGNsYXNzIFRzQ29udGVudEJ1aWxkZXIgaW1wbGVtZW50cyBPdXRwdXRDb250ZW50QnVpbGRlciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0KFxuICAgIGNvbnRlbnRNYXA6IE1hcDxzdHJpbmcsIE91dHB1dENvbnRlbnRCdWlsZGVyPixcbiAgICBkZWZpbml0aW9uTW9kdWxlUGF0aDogc3RyaW5nLFxuICAgIG91dHB1dE1vZHVsZVBhdGg/OiBzdHJpbmcsXG4gICk6IFRzQ29udGVudEJ1aWxkZXIge1xuICAgIG91dHB1dE1vZHVsZVBhdGggPSBub3JtYWxpemVSZWxhdGl2ZVBhdGhGb3JOb2RlKFxuICAgICAgb3V0cHV0TW9kdWxlUGF0aCA/PyBkZWZpbml0aW9uTW9kdWxlUGF0aCxcbiAgICApO1xuICAgIGxldCBvdXRwdXRDb250ZW50QnVpbGRlciA9IGNvbnRlbnRNYXAuZ2V0KFxuICAgICAgb3V0cHV0TW9kdWxlUGF0aCxcbiAgICApIGFzIFRzQ29udGVudEJ1aWxkZXI7XG4gICAgaWYgKCFvdXRwdXRDb250ZW50QnVpbGRlcikge1xuICAgICAgb3V0cHV0Q29udGVudEJ1aWxkZXIgPSBuZXcgVHNDb250ZW50QnVpbGRlcihcbiAgICAgICAgZGVmaW5pdGlvbk1vZHVsZVBhdGgsXG4gICAgICAgIG91dHB1dE1vZHVsZVBhdGgsXG4gICAgICApO1xuICAgICAgY29udGVudE1hcC5zZXQob3V0cHV0TW9kdWxlUGF0aCwgb3V0cHV0Q29udGVudEJ1aWxkZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0Q29udGVudEJ1aWxkZXI7XG4gIH1cblxuICBwcml2YXRlIHBhdGhUb05hbWVkSW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBuYW1lZEltcG9ydFRvUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIGNvbnRlbnRMaXN0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBvdXRwdXRNb2R1bGVEaXJQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgc2FtZU1vZHVsZUltcG9ydFBhdGg6IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlRGVmaW5pdGlvbk1vZHVsZVBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIG91dHB1dE1vZHVsZVBhdGg6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5vdXRwdXRNb2R1bGVEaXJQYXRoID0gcGF0aC5wb3NpeC5yZXNvbHZlKFxuICAgICAgcGF0aC5wb3NpeC5kaXJuYW1lKG91dHB1dE1vZHVsZVBhdGgpLFxuICAgICk7XG4gICAgdGhpcy5zYW1lTW9kdWxlSW1wb3J0UGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aEZvck5vZGUoXG4gICAgICBwYXRoLnBvc2l4LmJhc2VuYW1lKG91dHB1dE1vZHVsZVBhdGgpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcHVzaCguLi5uZXdDb250ZW50OiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5jb250ZW50TGlzdC5wdXNoKC4uLm5ld0NvbnRlbnQpO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21EYXRhc3RvcmVNb2RlbERlc2NyaXB0b3IoXG4gICAgLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcbiAgICAgIFwiQHNlbGZhZ2UvZGF0YXN0b3JlX2NsaWVudC9tb2RlbF9kZXNjcmlwdG9yXCIsXG4gICAgICAuLi5uYW1lZEltcG9ydHMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tTWVzc2FnZURlc2NyaXB0b3IoLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRGcm9tKFwiQHNlbGZhZ2UvbWVzc2FnZS9kZXNjcmlwdG9yXCIsIC4uLm5hbWVkSW1wb3J0cyk7XG4gIH1cblxuICBwdWJsaWMgaW1wb3J0RnJvbU1lc3NhZ2VTZXJpYWxpemVyKC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcIkBzZWxmYWdlL21lc3NhZ2Uvc2VyaWFsaXplclwiLCAuLi5uYW1lZEltcG9ydHMpO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21PYnNlcnZhYmxlRGVzY3JpcHRvciguLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXCJAc2VsZmFnZS9vYnNlcnZhYmxlL2Rlc2NyaXB0b3JcIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tU2VydmljZURlc2NyaXB0b3IoLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRGcm9tKFwiQHNlbGZhZ2Uvc2VydmljZV9kZXNjcmlwdG9yXCIsIC4uLm5hbWVkSW1wb3J0cyk7XG4gIH1cblxuICBwdWJsaWMgaW1wb3J0RnJvbVNlcnZpY2VDbGllbnRSZXF1ZXN0SW50ZXJmYWNlKFxuICAgIC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXG4gICAgICBcIkBzZWxmYWdlL3NlcnZpY2VfZGVzY3JpcHRvci9jbGllbnRfcmVxdWVzdF9pbnRlcmZhY2VcIixcbiAgICAgIC4uLm5hbWVkSW1wb3J0cyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb21TZXJ2aWNlUmVtb3RlQ2FsbEhhbmRsZXJJbnRlcmZhY2UoXG4gICAgLi4ubmFtZWRJbXBvcnRzOiBBcnJheTxzdHJpbmc+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcbiAgICAgIFwiQHNlbGZhZ2Uvc2VydmljZV9kZXNjcmlwdG9yL3JlbW90ZV9jYWxsX2hhbmRsZXJfaW50ZXJmYWNlXCIsXG4gICAgICAuLi5uYW1lZEltcG9ydHMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tT2JzZXJ2YWJsZUFycmF5KC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcIkBzZWxmYWdlL29ic2VydmFibGVfYXJyYXlcIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tU3Bhbm5lciguLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXCJAZ29vZ2xlLWNsb3VkL3NwYW5uZXJcIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tU3Bhbm5lclRyYW5zYWN0aW9uKC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMuaW1wb3J0RnJvbShcbiAgICAgIFwiQGdvb2dsZS1jbG91ZC9zcGFubmVyL2J1aWxkL3NyYy90cmFuc2FjdGlvblwiLFxuICAgICAgLi4ubmFtZWRJbXBvcnRzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW1wb3J0RnJvbVN0cmVhbSguLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydEZyb20oXCJzdHJlYW1cIiwgLi4ubmFtZWRJbXBvcnRzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbXBvcnRGcm9tRGVmaW5pdGlvbihcbiAgICBkZWZpbml0aW9uTW9kdWxlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIC4uLm5hbWVkSW1wb3J0czogQXJyYXk8c3RyaW5nPlxuICApOiB2b2lkIHtcbiAgICBpZiAoIWRlZmluaXRpb25Nb2R1bGVQYXRoKSB7XG4gICAgICBkZWZpbml0aW9uTW9kdWxlUGF0aCA9IHRoaXMuYmFzZURlZmluaXRpb25Nb2R1bGVQYXRoO1xuICAgIH1cbiAgICBpZiAoaXNSZWxhdGl2ZVBhdGgoZGVmaW5pdGlvbk1vZHVsZVBhdGgpKSB7XG4gICAgICBkZWZpbml0aW9uTW9kdWxlUGF0aCA9IG5vcm1hbGl6ZVJlbGF0aXZlUGF0aEZvck5vZGUoXG4gICAgICAgIHBhdGgucG9zaXgucmVsYXRpdmUodGhpcy5vdXRwdXRNb2R1bGVEaXJQYXRoLCBkZWZpbml0aW9uTW9kdWxlUGF0aCksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbk1vZHVsZVBhdGggPT09IHRoaXMuc2FtZU1vZHVsZUltcG9ydFBhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbXBvcnRGcm9tKGRlZmluaXRpb25Nb2R1bGVQYXRoLCAuLi5uYW1lZEltcG9ydHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRGcm9tKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAuLi5uYW1lZEltcG9ydHM6IEFycmF5PHN0cmluZz5cbiAgKTogdm9pZCB7XG4gICAgbGV0IG5hbWVkSW1wb3J0c0luTWFwID0gdGhpcy5wYXRoVG9OYW1lZEltcG9ydHMuZ2V0KHBhdGgpO1xuICAgIGlmICghbmFtZWRJbXBvcnRzSW5NYXApIHtcbiAgICAgIG5hbWVkSW1wb3J0c0luTWFwID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICB0aGlzLnBhdGhUb05hbWVkSW1wb3J0cy5zZXQocGF0aCwgbmFtZWRJbXBvcnRzSW5NYXApO1xuICAgIH1cbiAgICBmb3IgKGxldCBuYW1lZEltcG9ydCBvZiBuYW1lZEltcG9ydHMpIHtcbiAgICAgIG5hbWVkSW1wb3J0c0luTWFwLmFkZChuYW1lZEltcG9ydCk7XG4gICAgICB0aGlzLm5hbWVkSW1wb3J0VG9QYXRocy5zZXQobmFtZWRJbXBvcnQsIHBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidWlsZCgpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHRDb250ZW50ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiB0aGlzLnBhdGhUb05hbWVkSW1wb3J0cy5lbnRyaWVzKCkpIHtcbiAgICAgIGxldCBpbXBvcnRQYXRoID0gZW50cnlbMF07XG4gICAgICBsZXQgbmFtZWRJbXBvcnRzID0gQXJyYXkuZnJvbShlbnRyeVsxXSkuam9pbihcIiwgXCIpO1xuICAgICAgcmVzdWx0Q29udGVudC5wdXNoKGBpbXBvcnQgeyAke25hbWVkSW1wb3J0c30gfSBmcm9tICcke2ltcG9ydFBhdGh9JztcXG5gKTtcbiAgICB9XG4gICAgcmVzdWx0Q29udGVudC5wdXNoKC4uLnRoaXMuY29udGVudExpc3QpO1xuICAgIHJldHVybiByZXN1bHRDb250ZW50LmpvaW4oXCJcIik7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVTeW5jKGRyeVJ1bjogYm9vbGVhbik6IHZvaWQge1xuICAgIHdyaXRlRmlsZVN5bmModGhpcy5vdXRwdXRNb2R1bGVQYXRoICsgXCIudHNcIiwgdGhpcy5idWlsZCgpLCBkcnlSdW4pO1xuICB9XG59XG4iXX0=