projen
Version:
CDK for software projects
142 lines • 17.3 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Biome = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("node:path");
const fast_json_patch_1 = require("fast-json-patch");
const biome_config_1 = require("./biome-config");
const component_1 = require("../../component");
const json_1 = require("../../json");
const util_1 = require("../../util");
const util_2 = require("../util");
/**
* Enabling VCS configuration by default.
*
* Note that this differs from `biome init`, as projen can be presumed to use version control
*/
const DEFAULT_CONFIG = {
vcs: {
clientKind: biome_config_1.VcsClientKind.GIT,
enabled: true,
useIgnoreFile: true,
},
files: {
ignoreUnknown: false,
},
};
/**
* Default linting configuration if linter is enabled.
*
* Ignores by default following patterns: '*.js', '*.d.ts', 'node_modules/', '*.generated.ts', 'coverage'.
*/
const DEFAULT_LINTER = {
linter: {
enabled: true,
rules: {
recommended: true,
},
},
};
/**
* Default formatting configuration if formatter is enabled.
*/
const DEFAULT_FORMATTER = {
formatter: {
enabled: true,
indentStyle: biome_config_1.IndentStyle.TAB,
},
javascript: {
formatter: {
quoteStyle: biome_config_1.QuoteStyle.DOUBLE,
},
},
};
/**
* Default code assist actions
*/
const DEFAULT_ASSIST = {
assist: {
enabled: true,
actions: {
recommended: true,
},
},
};
/**
* Biome component.
*/
class Biome extends component_1.Component {
static of(project) {
const isBiome = (c) => c instanceof Biome;
return project.components.find(isBiome);
}
constructor(project, options = {}) {
super(project);
this.biomeCommand = "biome check --no-errors-on-unmatched --write";
const biomejs = `@biomejs/biome`;
project.addDevDeps(`${biomejs}@${options.version ?? "^2"}`);
const defaultConfig = {
...DEFAULT_CONFIG,
...(options.linter ?? true ? DEFAULT_LINTER : {}),
...(options.formatter ?? true ? DEFAULT_FORMATTER : {}),
...(options.assist ?? true ? DEFAULT_ASSIST : {}),
};
this._filePatterns = new Set([
...(0, fast_json_patch_1.deepClone)(options.biomeConfig?.files?.includes ?? []),
...(0, fast_json_patch_1.deepClone)(defaultConfig.files?.includes ?? []),
]);
this.biomeConfiguration = (0, util_1.deepMerge)([
(0, biome_config_1.toJson_BiomeConfiguration)((0, fast_json_patch_1.deepClone)(defaultConfig)),
(0, biome_config_1.toJson_BiomeConfiguration)((0, fast_json_patch_1.deepClone)(options.biomeConfig ?? {})),
{
$schema: () => {
const resolvedSchema = (0, util_2.tryResolveModule)(`${biomejs}/configuration_schema.json`, { paths: [this.project.outdir] });
if (
// not found
!resolvedSchema ||
// not within the project dir
!path
.resolve(resolvedSchema)
.startsWith(path.resolve(this.project.outdir))) {
return "https://biomejs.dev/schemas/latest/schema.json";
}
return (0, util_1.normalizePersistedPath)(path.relative(this.project.outdir, resolvedSchema));
},
files: {
includes: () => Array.from(this._filePatterns),
},
},
], { mergeArrays: options.mergeArraysInConfiguration ?? true });
this.file = new (class extends json_1.JsonFile {
get marker() {
return `biome-ignore-all format: ${super.marker ?? "generated file"}`;
}
})(this, "biome.jsonc", {
obj: this.biomeConfiguration,
allowComments: true,
marker: true,
readonly: false, // biome will always re-write the config file
});
this.task = this.createLocalBiomeTask();
project.testTask.spawn(this.task);
}
addFilePattern(pattern) {
this._filePatterns.add(pattern);
}
createLocalBiomeTask() {
return this.project.addTask("biome", {
description: "Runs Biome against the codebase",
steps: [
{
exec: this.biomeCommand,
receiveArgs: true,
},
],
});
}
}
exports.Biome = Biome;
_a = JSII_RTTI_SYMBOL_1;
Biome[_a] = { fqn: "projen.javascript.Biome", version: "0.95.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvamF2YXNjcmlwdC9iaW9tZS9iaW9tZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtDQUFrQztBQUNsQyxxREFBNEM7QUFDNUMsaURBTXdCO0FBQ3hCLCtDQUE0QztBQUU1QyxxQ0FBc0M7QUFHdEMscUNBQStEO0FBQy9ELGtDQUEyQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQThDO0lBQ2hFLEdBQUcsRUFBRTtRQUNILFVBQVUsRUFBRSw0QkFBYSxDQUFDLEdBQUc7UUFDN0IsT0FBTyxFQUFFLElBQUk7UUFDYixhQUFhLEVBQUUsSUFBSTtLQUNwQjtJQUNELEtBQUssRUFBRTtRQUNMLGFBQWEsRUFBRSxLQUFLO0tBQ3JCO0NBQ0YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FDckI7SUFDRSxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSwwQkFBVyxDQUFDLEdBQUc7S0FDN0I7SUFDRCxVQUFVLEVBQUU7UUFDVixTQUFTLEVBQUU7WUFDVCxVQUFVLEVBQUUseUJBQVUsQ0FBQyxNQUFNO1NBQzlCO0tBQ0Y7Q0FDRixDQUFDO0FBRUo7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQTRDRjs7R0FFRztBQUNILE1BQWEsS0FBTSxTQUFRLHFCQUFTO0lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMs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QUM7U0FDRixDQUFDLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUN0QixHQUFHLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUM1QixhQUFhLEVBQUUsSUFBSTtZQUNuQixNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxLQUFLLEVBQUUsNkNBQTZDO1NBQy9ELENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDeEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTSxjQUFjLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ25DLFdBQVcsRUFBRSxpQ0FBaUM7WUFDOUMsS0FBSyxFQUFFO2dCQUNMO29CQUNFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDdkIsV0FBVyxFQUFFLElBQUk7aUJBQ2xCO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQXBHSCxzQkFxR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gXCJmYXN0LWpzb24tcGF0Y2hcIjtcbmltcG9ydCB7XG4gIEluZGVudFN0eWxlLFxuICBRdW90ZVN0eWxlLFxuICB0b0pzb25fQmlvbWVDb25maWd1cmF0aW9uLFxuICBWY3NDbGllbnRLaW5kLFxuICB0eXBlIEJpb21lQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcIi4vYmlvbWUtY29uZmlnXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcIi4uLy4uL2phdmFzY3JpcHQvbm9kZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBKc29uRmlsZSB9IGZyb20gXCIuLi8uLi9qc29uXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vLi4vcHJvamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSBcIi4uLy4uL3Rhc2tcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSwgbm9ybWFsaXplUGVyc2lzdGVkUGF0aCB9IGZyb20gXCIuLi8uLi91dGlsXCI7XG5pbXBvcnQgeyB0cnlSZXNvbHZlTW9kdWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiBFbmFibGluZyBWQ1MgY29uZmlndXJhdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBgYmlvbWUgaW5pdGAsIGFzIHByb2plbiBjYW4gYmUgcHJlc3VtZWQgdG8gdXNlIHZlcnNpb24gY29udHJvbFxuICovXG5jb25zdCBERUZBVUxUX0NPTkZJRzogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwidmNzXCIgfCBcImZpbGVzXCI+ID0ge1xuICB2Y3M6IHtcbiAgICBjbGllbnRLaW5kOiBWY3NDbGllbnRLaW5kLkdJVCxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHVzZUlnbm9yZUZpbGU6IHRydWUsXG4gIH0sXG4gIGZpbGVzOiB7XG4gICAgaWdub3JlVW5rbm93bjogZmFsc2UsXG4gIH0sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgbGludGluZyBjb25maWd1cmF0aW9uIGlmIGxpbnRlciBpcyBlbmFibGVkLlxuICpcbiAqIElnbm9yZXMgYnkgZGVmYXVsdCBmb2xsb3dpbmcgcGF0dGVybnM6ICcqLmpzJywgJyouZC50cycsICdub2RlX21vZHVsZXMvJywgJyouZ2VuZXJhdGVkLnRzJywgJ2NvdmVyYWdlJy5cbiAqL1xuY29uc3QgREVGQVVMVF9MSU5URVI6IFBpY2s8QmlvbWVDb25maWd1cmF0aW9uLCBcImxpbnRlclwiPiA9IHtcbiAgbGludGVyOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBydWxlczoge1xuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBmb3JtYXR0aW5nIGNvbmZpZ3VyYXRpb24gaWYgZm9ybWF0dGVyIGlzIGVuYWJsZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfRk9STUFUVEVSOiBQaWNrPEJpb21lQ29uZmlndXJhdGlvbiwgXCJmb3JtYXR0ZXJcIiB8IFwiamF2YXNjcmlwdFwiPiA9XG4gIHtcbiAgICBmb3JtYXR0ZXI6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpbmRlbnRTdHlsZTogSW5kZW50U3R5bGUuVEFCLFxuICAgIH0sXG4gICAgamF2YXNjcmlwdDoge1xuICAgICAgZm9ybWF0dGVyOiB7XG4gICAgICAgIHF1b3RlU3R5bGU6IFF1b3RlU3R5bGUuRE9VQkxFLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4vKipcbiAqIERlZmF1bHQgY29kZSBhc3Npc3QgYWN0aW9uc1xuICovXG5jb25zdCBERUZBVUxUX0FTU0lTVDogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwiYXNzaXN0XCI+ID0ge1xuICBhc3Npc3Q6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJpb21lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIEJpb21lIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCBcIl4yXCJcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFbmFibGUgbGludGluZyB3aXRoIHJlY29tbWVuZGVkIHJ1bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIGNvZGUgZm9ybWF0dGVyIHdpdGggcmVjb21tZW5kZWQgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGUgY29kZSBhc3Npc3Qgd2l0aCByZWNvbW1lbmRlZCBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogU2hvdWxkIGFycmF5cyBiZSBtZXJnZWQgb3Igb3ZlcndyaXR0ZW4gd2hlbiBjcmVhdGluZyBCaW9tZSBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgYXJyYXlzIGFyZSBtZXJnZWQgYW5kIGR1cGxpY2F0ZSB2YWx1ZXMgYXJlIHJlbW92ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVyZ2VBcnJheXNJbkNvbmZpZ3VyYXRpb24/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVsbCBCaW9tZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGNvbmZpZ3VyYXRpb24gZGljdGF0ZXMgdGhlIGZpbmFsIG91dGNvbWUgaWYgdmFsdWUgaXMgc2V0LlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxpbnRlciBpcyBkaXNhYmxlZCBhdCB0aGUgdG9wLWxldmVsLCBpdCBjYW4gYmUgZW5hYmxlZCB3aXRoIGBiaW9tZUNvbmZpZy5saW50ZXIuZW5hYmxlZGAuXG4gICAqL1xuICByZWFkb25seSBiaW9tZUNvbmZpZz86IEJpb21lQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBCaW9tZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW9tZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEJpb21lIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0Jpb21lID0gKGM6IENvbXBvbmVudCk6IGMgaXMgQmlvbWUgPT4gYyBpbnN0YW5jZW9mIEJpb21lO1xuICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc0Jpb21lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmlvbWVDb25maWd1cmF0aW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWxlUGF0dGVybnM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGJpb21lQ29tbWFuZCA9XG4gICAgXCJiaW9tZSBjaGVjayAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS13cml0ZVwiO1xuXG4gIC8qKlxuICAgKiBCaW9tZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhc2s6IFRhc2s7XG4gIC8qKlxuICAgKiBCaW9tZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZpbGU6IEpzb25GaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IE5vZGVQcm9qZWN0LCBvcHRpb25zOiBCaW9tZU9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgY29uc3QgYmlvbWVqcyA9IGBAYmlvbWVqcy9iaW9tZWA7XG4gICAgcHJvamVjdC5hZGREZXZEZXBzKGAke2Jpb21lanN9QCR7b3B0aW9ucy52ZXJzaW9uID8/IFwiXjJcIn1gKTtcblxuICAgIGNvbnN0IGRlZmF1bHRDb25maWc6IEJpb21lQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgLi4uKG9wdGlvbnMubGludGVyID8/IHRydWUgPyBERUZBVUxUX0xJTlRFUiA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLmZvcm1hdHRlciA/PyB0cnVlID8gREVGQVVMVF9GT1JNQVRURVIgOiB7fSksXG4gICAgICAuLi4ob3B0aW9ucy5hc3Npc3QgPz8gdHJ1ZSA/IERFRkFVTFRfQVNTSVNUIDoge30pLFxuICAgIH07XG5cbiAgICB0aGlzLl9maWxlUGF0dGVybnMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLmRlZXBDbG9uZShvcHRpb25zLmJpb21lQ29uZmlnPy5maWxlcz8uaW5jbHVkZXMgPz8gW10pLFxuICAgICAgLi4uZGVlcENsb25lKGRlZmF1bHRDb25maWcuZmlsZXM/LmluY2x1ZGVzID8/IFtdKSxcbiAgICBdKTtcblxuICAgIHRoaXMuYmlvbWVDb25maWd1cmF0aW9uID0gZGVlcE1lcmdlKFxuICAgICAgW1xuICAgICAgICB0b0pzb25fQmlvbWVDb25maWd1cmF0aW9uKGRlZXBDbG9uZShkZWZhdWx0Q29uZmlnKSksXG4gICAgICAgIHRvSnNvbl9CaW9tZUNvbmZpZ3VyYXRpb24oZGVlcENsb25lKG9wdGlvbnMuYmlvbWVDb25maWcgPz8ge30pKSxcbiAgICAgICAge1xuICAgICAgICAgICRzY2hlbWE6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2NoZW1hID0gdHJ5UmVzb2x2ZU1vZHVsZShcbiAgICAgICAgICAgICAgYCR7YmlvbWVqc30vY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbmAsXG4gICAgICAgICAgICAgIHsgcGF0aHM6IFt0aGlzLnByb2plY3Qub3V0ZGlyXSB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAvLyBub3QgZm91bmRcbiAgICAgICAgICAgICAgIXJlc29sdmVkU2NoZW1hIHx8XG4gICAgICAgICAgICAgIC8vIG5vdCB3aXRoaW4gdGhlIHByb2plY3QgZGlyXG4gICAgICAgICAgICAgICFwYXRoXG4gICAgICAgICAgICAgICAgLnJlc29sdmUocmVzb2x2ZWRTY2hlbWEpXG4gICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgocGF0aC5yZXNvbHZlKHRoaXMucHJvamVjdC5vdXRkaXIpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYmlvbWVqcy5kZXYvc2NoZW1hcy9sYXRlc3Qvc2NoZW1hLmpzb25cIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGgoXG4gICAgICAgICAgICAgIHBhdGgucmVsYXRpdmUodGhpcy5wcm9qZWN0Lm91dGRpciwgcmVzb2x2ZWRTY2hlbWEpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICAgIGluY2x1ZGVzOiAoKSA9PiBBcnJheS5mcm9tKHRoaXMuX2ZpbGVQYXR0ZXJucyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB7IG1lcmdlQXJyYXlzOiBvcHRpb25zLm1lcmdlQXJyYXlzSW5Db25maWd1cmF0aW9uID8/IHRydWUgfVxuICAgICk7XG5cbiAgICB0aGlzLmZpbGUgPSBuZXcgKGNsYXNzIGV4dGVuZHMgSnNvbkZpbGUge1xuICAgICAgcHVibGljIGdldCBtYXJrZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGBiaW9tZS1pZ25vcmUtYWxsIGZvcm1hdDogJHtzdXBlci5tYXJrZXIgPz8gXCJnZW5lcmF0ZWQgZmlsZVwifWA7XG4gICAgICB9XG4gICAgfSkodGhpcywgXCJiaW9tZS5qc29uY1wiLCB7XG4gICAgICBvYmo6IHRoaXMuYmlvbWVDb25maWd1cmF0aW9uLFxuICAgICAgYWxsb3dDb21tZW50czogdHJ1ZSxcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSwgLy8gYmlvbWUgd2lsbCBhbHdheXMgcmUtd3JpdGUgdGhlIGNvbmZpZyBmaWxlXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhc2sgPSB0aGlzLmNyZWF0ZUxvY2FsQmlvbWVUYXNrKCk7XG4gICAgcHJvamVjdC50ZXN0VGFzay5zcGF3bih0aGlzLnRhc2spO1xuICB9XG5cbiAgcHVibGljIGFkZEZpbGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZykge1xuICAgIHRoaXMuX2ZpbGVQYXR0ZXJucy5hZGQocGF0dGVybik7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvY2FsQmlvbWVUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb2plY3QuYWRkVGFzayhcImJpb21lXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1bnMgQmlvbWUgYWdhaW5zdCB0aGUgY29kZWJhc2VcIixcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiB0aGlzLmJpb21lQ29tbWFuZCxcbiAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==