jsii-docgen
Version:
generates api docs for jsii modules
166 lines • 20.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MarkdownDocument = void 0;
const node_stream_1 = require("node:stream");
/**
* Markdown element.
*/
class MarkdownDocument {
/**
* Sanitize markdown reserved characters from external input.
*/
static sanitize(line) {
let sanitized = line.trim();
if (line.startsWith('-')) {
sanitized = sanitized.substring(1, line.length).trim();
}
return sanitized;
}
/**
* Remove newlines from markdown.
*/
static removeNewlines(line) {
return line.replace(/\n/g, ' ');
}
static bold(text) {
return `**${text}**`;
}
static pre(text) {
// using <code> instead of backticks since this allows links
return `<code>${text}</code>`;
}
static italic(text) {
return `*${text}*`;
}
constructor(options = {}) {
var _a, _b;
this.options = options;
this._lines = new Array();
this._sections = new Array();
this.id = (_a = options.id) !== null && _a !== void 0 ? _a : (_b = options.header) === null || _b === void 0 ? void 0 : _b.title;
this.header = this.formatHeader();
}
/**
* Render a docs element into the markdown.
*/
docs(docs, language) {
if (docs.summary) {
this.lines(MarkdownDocument.sanitize(docs.summary));
this.lines('');
}
if (docs.remarks) {
this.lines(MarkdownDocument.sanitize(docs.remarks));
this.lines('');
}
if (docs.links) {
for (const link of docs.links) {
this.quote(`[${link}](${link})`);
}
}
if (docs.example) {
if (!language) {
throw new Error('language must be provided if docs.example has been specified');
}
const example = new MarkdownDocument({
id: `${this.options.id}.example`,
});
example.lines(MarkdownDocument.italic('Example'), '');
example.code(language.toString(), docs.example);
example.lines('');
this.section(example);
}
}
table(data) {
const numColumns = data[0].length;
const header = data[0];
const rows = data.slice(1);
this.lines('| ' + header.map(this.escapePipes).join(' | ') + ' |');
this.lines('|' + ' --- |'.repeat(numColumns));
for (const row of rows) {
this.lines('| ' + row.map(this.escapePipes).join(' | ') + ' |');
}
this.lines('');
}
quote(line) {
this.lines(`> ${line}`);
this.lines('');
}
bullet(line) {
this.lines(`- ${line}`);
}
code(language, ...snippet) {
this.lines(`\`\`\`${language}`, ...snippet, '```');
this.lines('');
}
lines(...lines) {
this._lines.push(...lines);
}
split() {
this.lines('---');
this.lines('');
}
section(section) {
this._sections.push(section);
}
render(headerSize = 0) {
return this._render(headerSize);
}
stream() {
return node_stream_1.Readable.from([this.render()]);
}
_render(headerSize = 0) {
var _a, _b;
const content = [];
if (this.header) {
if (headerSize > 6) {
// headers are mapped to `h1-h6` html elements.
// passed that, markdown just renders `#` signs.
// lets see if and when we'll hit this limit.
throw new Error('Unable to render markdown. Header limit (6) reached.');
}
const heading = `${'#'.repeat(headerSize)} ${this.header}`;
// temporary hack to avoid breaking Construct Hub
const headerSpan = !!process.env.HEADER_SPAN;
if (headerSpan) {
content.push(`${heading} <span data-heading-title="${(_a = this.options.header) === null || _a === void 0 ? void 0 : _a.title}" data-heading-id="${this.id}"></span>`);
}
else {
content.push(`${heading} <a name="${(_b = this.options.header) === null || _b === void 0 ? void 0 : _b.title}" id="${this.id}"></a>`);
}
content.push('');
}
for (const line of this._lines) {
content.push(`${line}`);
}
for (const section of this._sections) {
content.push(section._render(headerSize + 1));
}
return content.join('\n');
}
formatHeader() {
var _a, _b, _c, _d, _e, _f, _g;
if (!((_a = this.options.header) === null || _a === void 0 ? void 0 : _a.title)) {
return undefined;
}
let caption = this.options.header.title;
if ((_c = (_b = this.options.header) === null || _b === void 0 ? void 0 : _b.pre) !== null && _c !== void 0 ? _c : false) {
caption = `\`${caption}\``;
}
if ((_e = (_d = this.options.header) === null || _d === void 0 ? void 0 : _d.strike) !== null && _e !== void 0 ? _e : false) {
caption = `~~${caption}~~`;
}
if ((_f = this.options.header) === null || _f === void 0 ? void 0 : _f.sup) {
caption = `${caption}<sup>${(_g = this.options.header) === null || _g === void 0 ? void 0 : _g.sup}</sup>`;
}
return caption;
}
escapePipes(line) {
return line.replace(/\|/g, '\\|');
}
}
exports.MarkdownDocument = MarkdownDocument;
/**
* An empty markdown element.
*/
MarkdownDocument.EMPTY = new MarkdownDocument();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24tZG9jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi9yZW5kZXIvbWFya2Rvd24tZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1QztBQXNEdkM7O0dBRUc7QUFDSCxNQUFhLGdCQUFnQjtJQU0zQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBWTtRQUNqQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFZO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBWTtRQUM3QixPQUFPLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBWTtRQUM1Qiw0REFBNEQ7UUFDNUQsT0FBTyxTQUFTLElBQUksU0FBUyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDL0IsT0FBTyxJQUFJLElBQUksR0FBRyxDQUFDO0lBQ3JCLENBQUM7SUFRRCxZQUE2QixVQUEyQixFQUFFOztRQUE3QixZQUFPLEdBQVAsT0FBTyxDQUFzQjtRQU56QyxXQUFNLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUM3QixjQUFTLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7UUFNekQsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFBLE9BQU8sQ0FBQyxFQUFFLG1DQUFJLE1BQUEsT0FBTyxDQUFDLE1BQU0sMENBQUUsS0FBSyxDQUFDO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNJLElBQUksQ0FBQyxJQUFnQixFQUFFLFFBQW1CO1FBQy9DLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDbEYsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUM7Z0JBQ25DLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVO2FBQ2pDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBWTtRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU0sSUFBSSxDQUFDLFFBQWdCLEVBQUUsR0FBRyxPQUFpQjtRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsUUFBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRU0sS0FBSyxDQUFDLEdBQUcsS0FBZTtRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLO1FBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxPQUFPLENBQUMsT0FBeUI7UUFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxhQUFxQixDQUFDO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU8sc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxPQUFPLENBQUMsYUFBcUIsQ0FBQzs7UUFDcEMsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQiwrQ0FBK0M7Z0JBQy9DLGdEQUFnRDtnQkFDaEQsNkNBQTZDO2dCQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFM0QsaURBQWlEO1lBQ2pELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUM3QyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxPQUFPLDhCQUE4QixNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSwwQ0FBRSxLQUFLLHNCQUFzQixJQUFJLENBQUMsRUFBRSxXQUFXLENBQzNHLENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sYUFBYSxNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSwwQ0FBRSxLQUFLLFNBQVMsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUYsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sWUFBWTs7UUFDbEIsSUFBSSxDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sMENBQUUsS0FBSyxDQUFBLEVBQUUsQ0FBQztZQUNoQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRXhDLElBQUksTUFBQSxNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSwwQ0FBRSxHQUFHLG1DQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3RDLE9BQU8sR0FBRyxLQUFLLE9BQU8sSUFBSSxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sMENBQUUsTUFBTSxtQ0FBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QyxPQUFPLEdBQUcsS0FBSyxPQUFPLElBQUksQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSwwQ0FBRSxHQUFHLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsR0FBRyxPQUFPLFFBQVEsTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sMENBQUUsR0FBRyxRQUFRLENBQUM7UUFDL0QsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBWTtRQUM5QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O0FBNUxILDRDQTZMQztBQTVMQzs7R0FFRztBQUNvQixzQkFBSyxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQUFBekIsQ0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ25vZGU6c3RyZWFtJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi4vLi4nO1xuaW1wb3J0IHsgRG9jc1NjaGVtYSB9IGZyb20gJy4uL3NjaGVtYSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBtYXJrZG93biBoZWFkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya2Rvd25IZWFkZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpdGxlIHRvIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdXBlcnNjcmlwdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBzdXBlcnNjcmlwdFxuICAgKi9cbiAgcmVhZG9ubHkgc3VwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcmVmb3JtYXQgdGhlIGhlYWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFN0cmlrZS10aHJvdWdoIHRoZSB0aXRsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0cmlrZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZGVmaW5pbmcgYSBtYXJrZG93biBlbGVtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXJrZG93biBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gaGVhZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyPzogTWFya2Rvd25IZWFkZXJPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBJZCBvZiB0aGUgZWxlbWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgdGl0bGUgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTWFya2Rvd24gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcmtkb3duRG9jdW1lbnQge1xuICAvKipcbiAgICogQW4gZW1wdHkgbWFya2Rvd24gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRU1QVFkgPSBuZXcgTWFya2Rvd25Eb2N1bWVudCgpO1xuXG4gIC8qKlxuICAgKiBTYW5pdGl6ZSBtYXJrZG93biByZXNlcnZlZCBjaGFyYWN0ZXJzIGZyb20gZXh0ZXJuYWwgaW5wdXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNhbml0aXplKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHNhbml0aXplZCA9IGxpbmUudHJpbSgpO1xuXG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDEsIGxpbmUubGVuZ3RoKS50cmltKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbmV3bGluZXMgZnJvbSBtYXJrZG93bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVtb3ZlTmV3bGluZXMobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGluZS5yZXBsYWNlKC9cXG4vZywgJyAnKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYm9sZCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgKioke3RleHR9KipgO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBwcmUodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyB1c2luZyA8Y29kZT4gaW5zdGVhZCBvZiBiYWNrdGlja3Mgc2luY2UgdGhpcyBhbGxvd3MgbGlua3NcbiAgICByZXR1cm4gYDxjb2RlPiR7dGV4dH08L2NvZGU+YDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXRhbGljKHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiBgKiR7dGV4dH0qYDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xpbmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VjdGlvbnMgPSBuZXcgQXJyYXk8TWFya2Rvd25Eb2N1bWVudD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGhlYWRlcj86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE1hcmtkb3duT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gb3B0aW9ucy5oZWFkZXI/LnRpdGxlO1xuICAgIHRoaXMuaGVhZGVyID0gdGhpcy5mb3JtYXRIZWFkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBkb2NzIGVsZW1lbnQgaW50byB0aGUgbWFya2Rvd24uXG4gICAqL1xuICBwdWJsaWMgZG9jcyhkb2NzOiBEb2NzU2NoZW1hLCBsYW5ndWFnZT86IExhbmd1YWdlKSB7XG4gICAgaWYgKGRvY3Muc3VtbWFyeSkge1xuICAgICAgdGhpcy5saW5lcyhNYXJrZG93bkRvY3VtZW50LnNhbml0aXplKGRvY3Muc3VtbWFyeSkpO1xuICAgICAgdGhpcy5saW5lcygnJyk7XG4gICAgfVxuICAgIGlmIChkb2NzLnJlbWFya3MpIHtcbiAgICAgIHRoaXMubGluZXMoTWFya2Rvd25Eb2N1bWVudC5zYW5pdGl6ZShkb2NzLnJlbWFya3MpKTtcbiAgICAgIHRoaXMubGluZXMoJycpO1xuICAgIH1cblxuICAgIGlmIChkb2NzLmxpbmtzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgZG9jcy5saW5rcykge1xuICAgICAgICB0aGlzLnF1b3RlKGBbJHtsaW5rfV0oJHtsaW5rfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZG9jcy5leGFtcGxlKSB7XG4gICAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbGFuZ3VhZ2UgbXVzdCBiZSBwcm92aWRlZCBpZiBkb2NzLmV4YW1wbGUgaGFzIGJlZW4gc3BlY2lmaWVkJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBleGFtcGxlID0gbmV3IE1hcmtkb3duRG9jdW1lbnQoe1xuICAgICAgICBpZDogYCR7dGhpcy5vcHRpb25zLmlkfS5leGFtcGxlYCxcbiAgICAgIH0pO1xuICAgICAgZXhhbXBsZS5saW5lcyhNYXJrZG93bkRvY3VtZW50Lml0YWxpYygnRXhhbXBsZScpLCAnJyk7XG4gICAgICBleGFtcGxlLmNvZGUobGFuZ3VhZ2UudG9TdHJpbmcoKSwgZG9jcy5leGFtcGxlKTtcbiAgICAgIGV4YW1wbGUubGluZXMoJycpO1xuICAgICAgdGhpcy5zZWN0aW9uKGV4YW1wbGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0YWJsZShkYXRhOiBzdHJpbmdbXVtdKSB7XG4gICAgY29uc3QgbnVtQ29sdW1ucyA9IGRhdGFbMF0ubGVuZ3RoO1xuICAgIGNvbnN0IGhlYWRlciA9IGRhdGFbMF07XG4gICAgY29uc3Qgcm93cyA9IGRhdGEuc2xpY2UoMSk7XG4gICAgdGhpcy5saW5lcygnfCAnICsgaGVhZGVyLm1hcCh0aGlzLmVzY2FwZVBpcGVzKS5qb2luKCcgfCAnKSArICcgfCcpO1xuICAgIHRoaXMubGluZXMoJ3wnICsgJyAtLS0gfCcucmVwZWF0KG51bUNvbHVtbnMpKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICB0aGlzLmxpbmVzKCd8ICcgKyByb3cubWFwKHRoaXMuZXNjYXBlUGlwZXMpLmpvaW4oJyB8ICcpICsgJyB8Jyk7XG4gICAgfVxuICAgIHRoaXMubGluZXMoJycpO1xuICB9XG5cbiAgcHVibGljIHF1b3RlKGxpbmU6IHN0cmluZykge1xuICAgIHRoaXMubGluZXMoYD4gJHtsaW5lfWApO1xuICAgIHRoaXMubGluZXMoJycpO1xuICB9XG5cbiAgcHVibGljIGJ1bGxldChsaW5lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxpbmVzKGAtICR7bGluZX1gKTtcbiAgfVxuXG4gIHB1YmxpYyBjb2RlKGxhbmd1YWdlOiBzdHJpbmcsIC4uLnNuaXBwZXQ6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5saW5lcyhgXFxgXFxgXFxgJHtsYW5ndWFnZX1gLCAuLi5zbmlwcGV0LCAnYGBgJyk7XG4gICAgdGhpcy5saW5lcygnJyk7XG4gIH1cblxuICBwdWJsaWMgbGluZXMoLi4ubGluZXM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbGluZXMucHVzaCguLi5saW5lcyk7XG4gIH1cblxuICBwdWJsaWMgc3BsaXQoKSB7XG4gICAgdGhpcy5saW5lcygnLS0tJyk7XG4gICAgdGhpcy5saW5lcygnJyk7XG4gIH1cblxuICBwdWJsaWMgc2VjdGlvbihzZWN0aW9uOiBNYXJrZG93bkRvY3VtZW50KSB7XG4gICAgdGhpcy5fc2VjdGlvbnMucHVzaChzZWN0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoaGVhZGVyU2l6ZTogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlcihoZWFkZXJTaXplKTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJlYW0oKTogUmVhZGFibGUge1xuICAgIHJldHVybiBSZWFkYWJsZS5mcm9tKFt0aGlzLnJlbmRlcigpXSk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXIoaGVhZGVyU2l6ZTogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGVudDogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLmhlYWRlcikge1xuICAgICAgaWYgKGhlYWRlclNpemUgPiA2KSB7XG4gICAgICAgIC8vIGhlYWRlcnMgYXJlIG1hcHBlZCB0byBgaDEtaDZgIGh0bWwgZWxlbWVudHMuXG4gICAgICAgIC8vIHBhc3NlZCB0aGF0LCBtYXJrZG93biBqdXN0IHJlbmRlcnMgYCNgIHNpZ25zLlxuICAgICAgICAvLyBsZXRzIHNlZSBpZiBhbmQgd2hlbiB3ZSdsbCBoaXQgdGhpcyBsaW1pdC5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVuZGVyIG1hcmtkb3duLiBIZWFkZXIgbGltaXQgKDYpIHJlYWNoZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlYWRpbmcgPSBgJHsnIycucmVwZWF0KGhlYWRlclNpemUpfSAke3RoaXMuaGVhZGVyfWA7XG5cbiAgICAgIC8vIHRlbXBvcmFyeSBoYWNrIHRvIGF2b2lkIGJyZWFraW5nIENvbnN0cnVjdCBIdWJcbiAgICAgIGNvbnN0IGhlYWRlclNwYW4gPSAhIXByb2Nlc3MuZW52LkhFQURFUl9TUEFOO1xuICAgICAgaWYgKGhlYWRlclNwYW4pIHtcbiAgICAgICAgY29udGVudC5wdXNoKFxuICAgICAgICAgIGAke2hlYWRpbmd9IDxzcGFuIGRhdGEtaGVhZGluZy10aXRsZT1cIiR7dGhpcy5vcHRpb25zLmhlYWRlcj8udGl0bGV9XCIgZGF0YS1oZWFkaW5nLWlkPVwiJHt0aGlzLmlkfVwiPjwvc3Bhbj5gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudC5wdXNoKGAke2hlYWRpbmd9IDxhIG5hbWU9XCIke3RoaXMub3B0aW9ucy5oZWFkZXI/LnRpdGxlfVwiIGlkPVwiJHt0aGlzLmlkfVwiPjwvYT5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQucHVzaCgnJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuX2xpbmVzKSB7XG4gICAgICBjb250ZW50LnB1c2goYCR7bGluZX1gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fc2VjdGlvbnMpIHtcbiAgICAgIGNvbnRlbnQucHVzaChzZWN0aW9uLl9yZW5kZXIoaGVhZGVyU2l6ZSArIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQuam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEhlYWRlcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmhlYWRlcj8udGl0bGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGxldCBjYXB0aW9uID0gdGhpcy5vcHRpb25zLmhlYWRlci50aXRsZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuaGVhZGVyPy5wcmUgPz8gZmFsc2UpIHtcbiAgICAgIGNhcHRpb24gPSBgXFxgJHtjYXB0aW9ufVxcYGA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWFkZXI/LnN0cmlrZSA/PyBmYWxzZSkge1xuICAgICAgY2FwdGlvbiA9IGB+fiR7Y2FwdGlvbn1+fmA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5oZWFkZXI/LnN1cCkge1xuICAgICAgY2FwdGlvbiA9IGAke2NhcHRpb259PHN1cD4ke3RoaXMub3B0aW9ucy5oZWFkZXI/LnN1cH08L3N1cD5gO1xuICAgIH1cblxuICAgIHJldHVybiBjYXB0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVQaXBlcyhsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBsaW5lLnJlcGxhY2UoL1xcfC9nLCAnXFxcXHwnKTtcbiAgfVxufVxuIl19