@qodalis/angular-cli
Version:
A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.
129 lines • 23.5 kB
JavaScript
import { Injectable } from '@angular/core';
import { CliForegroundColor, CliIcon, } from '@qodalis/cli-core';
import { DefaultLibraryAuthor } from '@qodalis/cli-core';
import { CliProcessorsRegistry_TOKEN } from '../../tokens';
import { groupBy } from '../../../utils/arrays';
import * as i0 from "@angular/core";
export class CliHelpCommandProcessor {
constructor(injector) {
this.injector = injector;
this.command = 'help';
this.description = 'Displays help for a command';
this.allowUnlistedCommands = true;
this.author = DefaultLibraryAuthor;
this.metadata = {
sealed: true,
icon: CliIcon.Help,
module: 'system',
};
this.registry = this.injector.get(CliProcessorsRegistry_TOKEN);
}
async processCommand(command, context) {
const { writer } = context;
const [_, ...commandsToHelp] = command.command.split(' ');
if (commandsToHelp.length === 0) {
await context.executor.executeCommand('version', context);
this.writeSeparator(context);
writer.writeln(writer.wrapInColor('Available commands:', CliForegroundColor.Yellow));
const groupedCommands = groupBy(this.registry.processors, (x) => x.metadata?.module || 'uncategorized');
groupedCommands.forEach((processors, module) => {
writer.writeln(writer.wrapInColor(module, CliForegroundColor.Yellow));
processors.forEach((processor) => {
writer.writeln(`- ${processor?.metadata?.icon ? processor.metadata.icon : CliIcon.Extension} ${writer.wrapInColor(processor.command, CliForegroundColor.Cyan)} - ${processor?.description || 'Missing description'}`);
});
this.writeSeparator(context);
});
context.writer.writeln();
await context.executor.executeCommand('hotkeys', context);
this.writeSeparator(context);
writer.writeln('\nType `help <command>` to get more information about a specific command');
}
else {
const processor = this.registry.findProcessor(commandsToHelp[0], commandsToHelp.slice(1));
if (processor) {
this.writeProcessorDescription(processor, context);
}
else {
writer.writeln(`\x1b[33mUnknown command: ${commandsToHelp[0]}`);
}
}
}
writeDescription({ writer }) {
writer.writeln('Displays help for a command');
writer.writeln('If no command is specified, it will display a list of available commands');
writer.writeln('If a command is specified, it will display information about that command');
writer.writeln('If a command is specified with a subcommand, it will display information about that subcommand');
}
writeProcessorDescription(processor, context) {
const { writer } = context;
writer.write('\x1b[33mCommand: \x1b[0m');
if (processor.metadata?.icon) {
writer.write(`${processor.metadata.icon} `);
}
writer.writeln(`${writer.wrapInColor(processor.command, CliForegroundColor.Cyan)} @${processor.version || '1.0.0'} - ${processor.description}`);
this.writeSeparator(context);
if (processor.author) {
writer.writeln(`\x1b[33mAuthor:\x1b[0m ${processor.author.name}<${processor.author.email}>`);
this.writeSeparator(context);
}
writer.write(writer.wrapInColor('Description: ', CliForegroundColor.Yellow));
if (processor.writeDescription) {
processor.writeDescription(context);
}
else if (processor.description) {
writer.writeln(`${writer.wrapInColor('Description:', CliForegroundColor.Yellow)} ${processor.description}`);
}
else {
writer.writeln(writer.wrapInColor('No description available', CliForegroundColor.Yellow));
}
this.writeSeparator(context);
if (processor.processors?.length) {
writer.writeln(writer.wrapInColor('Subcommands:', CliForegroundColor.Yellow));
processor.processors.forEach((subprocessor) => {
writer.writeln(`- ${writer.wrapInColor(subprocessor.command, CliForegroundColor.Cyan)} - ${subprocessor.description}`);
});
this.writeSeparator(context);
}
const parameters = [
...(processor.parameters || []),
...defaultParameters,
];
writer.writeln(writer.wrapInColor('Parameters:', CliForegroundColor.Yellow));
parameters.forEach((parameter) => {
writer.writeln(`--${writer.wrapInColor(parameter.name, CliForegroundColor.Cyan)} (${parameter.type}) ${parameter.aliases ? `(${parameter.aliases.join(', ')})` : ''} - ${parameter.description}${parameter.required ? ' (required)' : ''}`);
});
this.writeSeparator(context);
if (processor.metadata?.requireServer) {
writer.writeln(writer.wrapInColor('Requires server to be running', CliForegroundColor.Red));
}
}
writeSeparator({ writer }) {
writer.writeDivider({
char: '=',
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliHelpCommandProcessor, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliHelpCommandProcessor, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CliHelpCommandProcessor, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
const defaultParameters = [
{
name: 'version',
aliases: ['v'],
type: 'boolean',
description: 'Displays the version of the command',
required: false,
},
{
name: 'main',
type: 'boolean',
description: 'Set the command as the main command',
required: false,
},
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWhlbHAtY29tbWFuZC1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGkvc3JjL2xpYi9jbGkvcHJvY2Vzc29ycy9zeXN0ZW0vY2xpLWhlbHAtY29tbWFuZC1wcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBS0gsa0JBQWtCLEVBRWxCLE9BQU8sR0FFVixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBS2hELE1BQU0sT0FBTyx1QkFBdUI7SUFpQmhDLFlBQTZCLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFoQi9DLFlBQU8sR0FBRyxNQUFNLENBQUM7UUFFakIsZ0JBQVcsR0FBRyw2QkFBNkIsQ0FBQztRQUU1QywwQkFBcUIsR0FBeUIsSUFBSSxDQUFDO1FBRW5ELFdBQU0sR0FBRyxvQkFBb0IsQ0FBQztRQUU5QixhQUFRLEdBQXNDO1lBQzFDLE1BQU0sRUFBRSxJQUFJO1lBQ1osSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFLRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUM3QiwyQkFBMkIsQ0FDOUIsQ0FBQztJQUNOLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUNoQixPQUEwQixFQUMxQixPQUE2QjtRQUU3QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTNCLE1BQU0sQ0FBQyxDQUFDLEVB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QVcsR0FDdkIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUN6QyxFQUFFLENBQ0wsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QixJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFO1lBQ25DLE1BQU0sQ0FBQyxPQUFPLENBQ1YsTUFBTSxDQUFDLFdBQVcsQ0FDZCwrQkFBK0IsRUFDL0Isa0JBQWtCLENBQUMsR0FBRyxDQUN6QixDQUNKLENBQUM7U0FDTDtJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsRUFBRSxNQUFNLEVBQXdCO1FBQ25ELE1BQU0sQ0FBQyxZQUFZLENBQUM7WUFDaEIsSUFBSSxFQUFFLEdBQUc7U0FDWixDQUFDLENBQUM7SUFDUCxDQUFDOytHQWhOUSx1QkFBdUI7bUhBQXZCLHVCQUF1QixjQUZwQixNQUFNOzs0RkFFVCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOztBQW9ORCxNQUFNLGlCQUFpQixHQUFxQztJQUN4RDtRQUNJLElBQUksRUFBRSxTQUFTO1FBQ2YsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ2QsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUscUNBQXFDO1FBQ2xELFFBQVEsRUFBRSxLQUFLO0tBQ2xCO0lBQ0Q7UUFDSSxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxTQUFTO1FBQ2YsV0FBVyxFQUFFLHFDQUFxQztRQUNsRCxRQUFRLEVBQUUsS0FBSztLQUNsQjtDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBJQ2xpRXhlY3V0aW9uQ29udGV4dCxcbiAgICBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICBJQ2xpQ29tbWFuZFByb2Nlc3NvcixcbiAgICBJQ2xpQ29tbWFuZFBhcmFtZXRlckRlc2NyaXB0b3IsXG4gICAgQ2xpRm9yZWdyb3VuZENvbG9yLFxuICAgIENsaVByb2Nlc3Nvck1ldGFkYXRhLFxuICAgIENsaUljb24sXG4gICAgSUNsaUNvbW1hbmRQcm9jZXNzb3JSZWdpc3RyeSxcbn0gZnJvbSAnQHFvZGFsaXMvY2xpLWNvcmUnO1xuaW1wb3J0IHsgRGVmYXVsdExpYnJhcnlBdXRob3IgfSBmcm9tICdAcW9kYWxpcy9jbGktY29yZSc7XG5pbXBvcnQgeyBDbGlQcm9jZXNzb3JzUmVnaXN0cnlfVE9LRU4gfSBmcm9tICcuLi8uLi90b2tlbnMnO1xuaW1wb3J0IHsgZ3JvdXBCeSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FycmF5cyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENsaUhlbHBDb21tYW5kUHJvY2Vzc29yIGltcGxlbWVudHMgSUNsaUNvbW1hbmRQcm9jZXNzb3Ige1xuICAgIGNvbW1hbmQgPSAnaGVscCc7XG5cbiAgICBkZXNjcmlwdGlvbiA9ICdEaXNwbGF5cyBoZWxwIGZvciBhIGNvbW1hbmQnO1xuXG4gICAgYWxsb3dVbmxpc3RlZENvbW1hbmRzPzogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG5cbiAgICBhdXRob3IgPSBEZWZhdWx0TGlicmFyeUF1dGhvcjtcblxuICAgIG1ldGFkYXRhPzogQ2xpUHJvY2Vzc29yTWV0YWRhdGEgfCB1bmRlZmluZWQgPSB7XG4gICAgICAgIHNlYWxlZDogdHJ1ZSxcbiAgICAgICAgaWNvbjogQ2xpSWNvbi5IZWxwLFxuICAgICAgICBtb2R1bGU6ICdzeXN0ZW0nLFxuICAgIH07XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBJQ2xpQ29tbWFuZFByb2Nlc3NvclJlZ2lzdHJ5O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHRoaXMuaW5qZWN0b3IuZ2V0PElDbGlDb21tYW5kUHJvY2Vzc29yUmVnaXN0cnk+KFxuICAgICAgICAgICAgQ2xpUHJvY2Vzc29yc1JlZ2lzdHJ5X1RPS0VOLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGFzeW5jIHByb2Nlc3NDb21tYW5kKFxuICAgICAgICBjb21tYW5kOiBDbGlQcm9jZXNzQ29tbWFuZCxcbiAgICAgICAgY29udGV4dDogSUNsaUV4ZWN1dGlvbkNvbnRleHQsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgd3JpdGVyIH0gPSBjb250ZXh0O1xuXG4gICAgICAgIGNvbnN0IFtfLCAuLi5jb21tYW5kc1RvSGVscF0gPSBjb21tYW5kLmNvbW1hbmQuc3BsaXQoJyAnKTtcblxuICAgICAgICBpZiAoY29tbWFuZHNUb0hlbHAubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBhd2FpdCBjb250ZXh0LmV4ZWN1dG9yLmV4ZWN1dGVDb21tYW5kKCd2ZXJzaW9uJywgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHRoaXMud3JpdGVTZXBhcmF0b3IoY29udGV4dCk7XG5cbiAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgIHdyaXRlci53cmFwSW5Db2xvcihcbiAgICAgICAgICAgICAgICAgICAgJ0F2YWlsYWJsZSBjb21tYW5kczonLFxuICAgICAgICAgICAgICAgICAgICBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBncm91cGVkQ29tbWFuZHMgPSBncm91cEJ5PElDbGlDb21tYW5kUHJvY2Vzc29yLCBzdHJpbmc+KFxuICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnkucHJvY2Vzc29ycyxcbiAgICAgICAgICAgICAgICAoeCkgPT4geC5tZXRhZGF0YT8ubW9kdWxlIHx8ICd1bmNhdGVnb3JpemVkJyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGdyb3VwZWRDb21tYW5kcy5mb3JFYWNoKChwcm9jZXNzb3JzLCBtb2R1bGUpID0+IHtcbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyYXBJbkNvbG9yKG1vZHVsZSwgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIHByb2Nlc3NvcnMuZm9yRWFjaCgocHJvY2Vzc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgICAgICAgICAgYC0gJHtwcm9jZXNzb3I/Lm1ldGFkYXRhPy5pY29uID8gcHJvY2Vzc29yLm1ldGFkYXRhLmljb24gOiBDbGlJY29uLkV4dGVuc2lvbn0gICR7d3JpdGVyLndyYXBJbkNvbG9yKHByb2Nlc3Nvci5jb21tYW5kLCBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbil9IC0gJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3I/LmRlc2NyaXB0aW9uIHx8ICdNaXNzaW5nIGRlc2NyaXB0aW9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLndyaXRlU2VwYXJhdG9yKGNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnRleHQud3JpdGVyLndyaXRlbG4oKTtcblxuICAgICAgICAgICAgYXdhaXQgY29udGV4dC5leGVjdXRvci5leGVjdXRlQ29tbWFuZCgnaG90a2V5cycsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICB0aGlzLndyaXRlU2VwYXJhdG9yKGNvbnRleHQpO1xuXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAnXFxuVHlwZSBgaGVscCA8Y29tbWFuZD5gIHRvIGdldCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgY29tbWFuZCcsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc29yID0gdGhpcy5yZWdpc3RyeS5maW5kUHJvY2Vzc29yKFxuICAgICAgICAgICAgICAgIGNvbW1hbmRzVG9IZWxwWzBdLFxuICAgICAgICAgICAgICAgIGNvbW1hbmRzVG9IZWxwLnNsaWNlKDEpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVQcm9jZXNzb3JEZXNjcmlwdGlvbihwcm9jZXNzb3IsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihgXFx4MWJbMzNtVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmRzVG9IZWxwWzBdfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVEZXNjcmlwdGlvbih7IHdyaXRlciB9OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCk6IHZvaWQge1xuICAgICAgICB3cml0ZXIud3JpdGVsbignRGlzcGxheXMgaGVscCBmb3IgYSBjb21tYW5kJyk7XG5cbiAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAnSWYgbm8gY29tbWFuZCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgZGlzcGxheSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzJyxcbiAgICAgICAgKTtcblxuICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICdJZiBhIGNvbW1hbmQgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBjb21tYW5kJyxcbiAgICAgICAgKTtcblxuICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICdJZiBhIGNvbW1hbmQgaXMgc3BlY2lmaWVkIHdpdGggYSBzdWJjb21tYW5kLCBpdCB3aWxsIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBzdWJjb21tYW5kJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdyaXRlUHJvY2Vzc29yRGVzY3JpcHRpb24oXG4gICAgICAgIHByb2Nlc3NvcjogSUNsaUNvbW1hbmRQcm9jZXNzb3IsXG4gICAgICAgIGNvbnRleHQ6IElDbGlFeGVjdXRpb25Db250ZXh0LFxuICAgICkge1xuICAgICAgICBjb25zdCB7IHdyaXRlciB9ID0gY29udGV4dDtcblxuICAgICAgICB3cml0ZXIud3JpdGUoJ1xceDFiWzMzbUNvbW1hbmQ6IFxceDFiWzBtJyk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3Nvci5tZXRhZGF0YT8uaWNvbikge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKGAke3Byb2Nlc3Nvci5tZXRhZGF0YS5pY29ufSAgYCk7XG4gICAgICAgIH1cblxuICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIGAke3dyaXRlci53cmFwSW5Db2xvcihcbiAgICAgICAgICAgICAgICBwcm9jZXNzb3IuY29tbWFuZCxcbiAgICAgICAgICAgICAgICBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbixcbiAgICAgICAgICAgICl9IEAke3Byb2Nlc3Nvci52ZXJzaW9uIHx8ICcxLjAuMCd9IC0gJHtwcm9jZXNzb3IuZGVzY3JpcHRpb259YCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLndyaXRlU2VwYXJhdG9yKGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChwcm9jZXNzb3IuYXV0aG9yKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICBgXFx4MWJbMzNtQXV0aG9yOlxceDFiWzBtICR7cHJvY2Vzc29yLmF1dGhvci5uYW1lfTwke3Byb2Nlc3Nvci5hdXRob3IuZW1haWx9PmAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLndyaXRlU2VwYXJhdG9yKGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgd3JpdGVyLndyaXRlKFxuICAgICAgICAgICAgd3JpdGVyLndyYXBJbkNvbG9yKCdEZXNjcmlwdGlvbjogJywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3Nvci53cml0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBwcm9jZXNzb3Iud3JpdGVEZXNjcmlwdGlvbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzb3IuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgIGAke3dyaXRlci53cmFwSW5Db2xvcignRGVzY3JpcHRpb246JywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyl9ICR7cHJvY2Vzc29yLmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgd3JpdGVyLndyYXBJbkNvbG9yKFxuICAgICAgICAgICAgICAgICAgICAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVTZXBhcmF0b3IoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3Nvci5wcm9jZXNzb3JzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZWxuKFxuICAgICAgICAgICAgICAgIHdyaXRlci53cmFwSW5Db2xvcignU3ViY29tbWFuZHM6JywgQ2xpRm9yZWdyb3VuZENvbG9yLlllbGxvdyksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc29ycy5mb3JFYWNoKChzdWJwcm9jZXNzb3IpID0+IHtcbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgICAgICAgICAgYC0gJHt3cml0ZXIud3JhcEluQ29sb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzb3IuY29tbWFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIENsaUZvcmVncm91bmRDb2xvci5DeWFuLFxuICAgICAgICAgICAgICAgICAgICApfSAtICR7c3VicHJvY2Vzc29yLmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLndyaXRlU2VwYXJhdG9yKGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IFtcbiAgICAgICAgICAgIC4uLihwcm9jZXNzb3IucGFyYW1ldGVycyB8fCBbXSksXG4gICAgICAgICAgICAuLi5kZWZhdWx0UGFyYW1ldGVycyxcbiAgICAgICAgXTtcblxuICAgICAgICB3cml0ZXIud3JpdGVsbihcbiAgICAgICAgICAgIHdyaXRlci53cmFwSW5Db2xvcignUGFyYW1ldGVyczonLCBDbGlGb3JlZ3JvdW5kQ29sb3IuWWVsbG93KSxcbiAgICAgICAgKTtcblxuICAgICAgICBwYXJhbWV0ZXJzLmZvckVhY2goKHBhcmFtZXRlcikgPT4ge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgYC0tJHt3cml0ZXIud3JhcEluQ29sb3IoXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBDbGlGb3JlZ3JvdW5kQ29sb3IuQ3lhbixcbiAgICAgICAgICAgICAgICApfSAoJHtwYXJhbWV0ZXIudHlwZX0pICR7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5hbGlhc2VzID8gYCgke3BhcmFtZXRlci5hbGlhc2VzLmpvaW4oJywgJyl9KWAgOiAnJ1xuICAgICAgICAgICAgICAgIH0gLSAke3BhcmFtZXRlci5kZXNjcmlwdGlvbn0ke1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIucmVxdWlyZWQgPyAnIChyZXF1aXJlZCknIDogJydcbiAgICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMud3JpdGVTZXBhcmF0b3IoY29udGV4dCk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3Nvci5tZXRhZGF0YT8ucmVxdWlyZVNlcnZlcikge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlbG4oXG4gICAgICAgICAgICAgICAgd3JpdGVyLndyYXBJbkNvbG9yKFxuICAgICAgICAgICAgICAgICAgICAnUmVxdWlyZXMgc2VydmVyIHRvIGJlIHJ1bm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICBDbGlGb3JlZ3JvdW5kQ29sb3IuUmVkLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cml0ZVNlcGFyYXRvcih7IHdyaXRlciB9OiBJQ2xpRXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgICB3cml0ZXIud3JpdGVEaXZpZGVyKHtcbiAgICAgICAgICAgIGNoYXI6ICc9JyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5jb25zdCBkZWZhdWx0UGFyYW1ldGVyczogSUNsaUNvbW1hbmRQYXJhbWV0ZXJEZXNjcmlwdG9yW10gPSBbXG4gICAge1xuICAgICAgICBuYW1lOiAndmVyc2lvbicsXG4gICAgICAgIGFsaWFzZXM6IFsndiddLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheXMgdGhlIHZlcnNpb24gb2YgdGhlIGNvbW1hbmQnLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6ICdtYWluJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NldCB0aGUgY29tbWFuZCBhcyB0aGUgbWFpbiBjb21tYW5kJyxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0sXG5dO1xuIl19