UNPKG

projen

Version:

CDK for software projects

198 lines • 24.2 kB
"use strict"; 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.options = options; 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 ?? []), ]); // Get generated file patterns to ignore const getGeneratedIgnorePatterns = () => { if (options.ignoreGeneratedFiles === false) { return []; } const generatedFiles = this.project.files .filter((file) => file.readonly && file.marker) .map((file) => `!${file.path}`); return generatedFiles; }; 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: () => { const patterns = Array.from(this._filePatterns); const generatedPatterns = getGeneratedIgnorePatterns(); // Use Set to deduplicate patterns return [...new Set([...patterns, ...generatedPatterns])]; }, }, }, ], { 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); } /** * Add a file pattern to biome. * * Use ! or !! to ignore a file pattern. * @param pattern Biome glob pattern * @see https://biomejs.dev/guides/configure-biome/#control-files-via-configuration */ addFilePattern(pattern) { this._filePatterns.add(pattern); } /** * Add a biome override to set rules for a specific file pattern. * @param override Override object * @see https://biomejs.dev/reference/configuration/#overrides */ addOverride(override) { if (!this.biomeConfiguration.overrides) { this.biomeConfiguration.overrides = []; } this.biomeConfiguration.overrides.push((0, biome_config_1.toJson_OverridePattern)(override)); } /** * Expand the linting rules applied. * * Use `undefined` to remove the rule or group. * * @param rules Rules to apply. * @see https://biomejs.dev/reference/configuration/#linterrulesgroup * @example * biome.expandLintingRules({ * style: undefined, * suspicious: { * noExplicitAny: undefined, * noDuplicateCase: "info", * } * }) */ expandLinterRules(rules) { this.biomeConfiguration.linter.rules = (0, biome_config_1.toJson_Rules)((0, util_1.deepMerge)([this.biomeConfiguration.linter.rules, rules], { mergeArrays: this.options.mergeArraysInConfiguration ?? true, destructive: true, })); } 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.99.51" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvamF2YXNjcmlwdC9iaW9tZS9iaW9tZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtDQUFrQztBQUNsQyxxREFBNEM7QUFDNUMsaURBVXdCO0FBQ3hCLCtDQUE0QztBQUU1QyxxQ0FBc0M7QUFHdEMscUNBQStEO0FBQy9ELGtDQUEyQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQThDO0lBQ2hFLEdBQUcsRUFBRTtRQUNILFVBQVUsRUFBRSw0QkFBYSxDQUFDLEdBQUc7UUFDN0IsT0FBTyxFQUFFLElBQUk7UUFDYixhQUFhLEVBQUUsSUFBSTtLQUNwQjtJQUNELEtBQUssRUFBRTtRQUNMLGFBQWEsRUFBRSxLQUFLO0tBQ3JCO0NBQ0YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FDckI7SUFDRSxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSwwQkFBVyxDQUFDLEdBQUc7S0FDN0I7SUFDRCxVQUFVLEVBQUU7UUFDVixTQUFTLEVBQUU7WUFDVCxVQUFVLEVBQUUseUJBQVUsQ0FBQyxNQUFNO1NBQzlCO0tBQ0Y7Q0FDRixDQUFDO0FBRUo7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQXFERjs7R0FFRztBQUNILE1BQWEsS0FBTSxTQUFRLHFCQUFTO0lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMs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SUFDSSxjQUFjLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxRQUF5QjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFBLHFDQUFzQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNJLGlCQUFpQixDQUFDLEtBQVk7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBQSwyQkFBWSxFQUNqRCxJQUFBLGdCQUFTLEVBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2RCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsSUFBSSxJQUFJO1lBQzVELFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQyxXQUFXLEVBQUUsaUNBQWlDO1lBQzlDLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVk7b0JBQ3ZCLFdBQVcsRUFBRSxJQUFJO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0S0gsc0JBdUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tIFwiZmFzdC1qc29uLXBhdGNoXCI7XG5pbXBvcnQge1xuICBJbmRlbnRTdHlsZSxcbiAgUXVvdGVTdHlsZSxcbiAgdG9Kc29uX0Jpb21lQ29uZmlndXJhdGlvbixcbiAgdG9Kc29uX092ZXJyaWRlUGF0dGVybixcbiAgdG9Kc29uX1J1bGVzLFxuICBWY3NDbGllbnRLaW5kLFxuICB0eXBlIEJpb21lQ29uZmlndXJhdGlvbixcbiAgdHlwZSBPdmVycmlkZVBhdHRlcm4sXG4gIHR5cGUgUnVsZXMsXG59IGZyb20gXCIuL2Jpb21lLWNvbmZpZ1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlUHJvamVjdCB9IGZyb20gXCIuLi8uLi9qYXZhc2NyaXB0L25vZGUtcHJvamVjdFwiO1xuaW1wb3J0IHsgSnNvbkZpbGUgfSBmcm9tIFwiLi4vLi4vanNvblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uLy4uL3Byb2plY3RcIjtcbmltcG9ydCB0eXBlIHsgVGFzayB9IGZyb20gXCIuLi8uLi90YXNrXCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGggfSBmcm9tIFwiLi4vLi4vdXRpbFwiO1xuaW1wb3J0IHsgdHJ5UmVzb2x2ZU1vZHVsZSB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKlxuICogRW5hYmxpbmcgVkNTIGNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gYGJpb21lIGluaXRgLCBhcyBwcm9qZW4gY2FuIGJlIHByZXN1bWVkIHRvIHVzZSB2ZXJzaW9uIGNvbnRyb2xcbiAqL1xuY29uc3QgREVGQVVMVF9DT05GSUc6IFBpY2s8QmlvbWVDb25maWd1cmF0aW9uLCBcInZjc1wiIHwgXCJmaWxlc1wiPiA9IHtcbiAgdmNzOiB7XG4gICAgY2xpZW50S2luZDogVmNzQ2xpZW50S2luZC5HSVQsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICB1c2VJZ25vcmVGaWxlOiB0cnVlLFxuICB9LFxuICBmaWxlczoge1xuICAgIGlnbm9yZVVua25vd246IGZhbHNlLFxuICB9LFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGxpbnRpbmcgY29uZmlndXJhdGlvbiBpZiBsaW50ZXIgaXMgZW5hYmxlZC5cbiAqXG4gKiBJZ25vcmVzIGJ5IGRlZmF1bHQgZm9sbG93aW5nIHBhdHRlcm5zOiAnKi5qcycsICcqLmQudHMnLCAnbm9kZV9tb2R1bGVzLycsICcqLmdlbmVyYXRlZC50cycsICdjb3ZlcmFnZScuXG4gKi9cbmNvbnN0IERFRkFVTFRfTElOVEVSOiBQaWNrPEJpb21lQ29uZmlndXJhdGlvbiwgXCJsaW50ZXJcIj4gPSB7XG4gIGxpbnRlcjoge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgcnVsZXM6IHtcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybWF0dGluZyBjb25maWd1cmF0aW9uIGlmIGZvcm1hdHRlciBpcyBlbmFibGVkLlxuICovXG5jb25zdCBERUZBVUxUX0ZPUk1BVFRFUjogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwiZm9ybWF0dGVyXCIgfCBcImphdmFzY3JpcHRcIj4gPVxuICB7XG4gICAgZm9ybWF0dGVyOiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgaW5kZW50U3R5bGU6IEluZGVudFN0eWxlLlRBQixcbiAgICB9LFxuICAgIGphdmFzY3JpcHQ6IHtcbiAgICAgIGZvcm1hdHRlcjoge1xuICAgICAgICBxdW90ZVN0eWxlOiBRdW90ZVN0eWxlLkRPVUJMRSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuLyoqXG4gKiBEZWZhdWx0IGNvZGUgYXNzaXN0IGFjdGlvbnNcbiAqL1xuY29uc3QgREVGQVVMVF9BU1NJU1Q6IFBpY2s8QmlvbWVDb25maWd1cmF0aW9uLCBcImFzc2lzdFwiPiA9IHtcbiAgYXNzaXN0OiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICByZWNvbW1lbmRlZDogdHJ1ZSxcbiAgICB9LFxuICB9LFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBCaW9tZU9wdGlvbnMge1xuICAvKipcbiAgICogVmVyc2lvbiBvZiBCaW9tZSB0byB1c2VcbiAgICpcbiAgICogQGRlZmF1bHQgXCJeMlwiXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW5hYmxlIGxpbnRpbmcgd2l0aCByZWNvbW1lbmRlZCBydWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbGludGVyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVuYWJsZSBjb2RlIGZvcm1hdHRlciB3aXRoIHJlY29tbWVuZGVkIHNldHRpbmdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIGNvZGUgYXNzaXN0IHdpdGggcmVjb21tZW5kZWQgYWN0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXNzaXN0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNob3VsZCBhcnJheXMgYmUgbWVyZ2VkIG9yIG92ZXJ3cml0dGVuIHdoZW4gY3JlYXRpbmcgQmlvbWUgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBCeSBkZWZhdWx0IGFycmF5cyBhcmUgbWVyZ2VkIGFuZCBkdXBsaWNhdGUgdmFsdWVzIGFyZSByZW1vdmVkXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IG1lcmdlQXJyYXlzSW5Db25maWd1cmF0aW9uPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEF1dG9tYXRpY2FsbHkgaWdub3JlIGFsbCBnZW5lcmF0ZWQgZmlsZXMuXG4gICAqXG4gICAqIFRoaXMgcHJldmVudHMgQmlvbWUgZnJvbSB0cnlpbmcgdG8gZm9ybWF0IG9yIGxpbnQgZmlsZXMgdGhhdCBhcmUgbWFya2VkIGFzIGdlbmVyYXRlZCxcbiAgICogd2hpY2ggd291bGQgZmFpbCBzaW5jZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIHR5cGljYWxseSByZWFkLW9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGlnbm9yZUdlbmVyYXRlZEZpbGVzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEZ1bGwgQmlvbWUgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVGhpcyBjb25maWd1cmF0aW9uIGRpY3RhdGVzIHRoZSBmaW5hbCBvdXRjb21lIGlmIHZhbHVlIGlzIHNldC5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBsaW50ZXIgaXMgZGlzYWJsZWQgYXQgdGhlIHRvcC1sZXZlbCwgaXQgY2FuIGJlIGVuYWJsZWQgd2l0aCBgYmlvbWVDb25maWcubGludGVyLmVuYWJsZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYmlvbWVDb25maWc/OiBCaW9tZUNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQmlvbWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgY2xhc3MgQmlvbWUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwdWJsaWMgc3RhdGljIG9mKHByb2plY3Q6IFByb2plY3QpOiBCaW9tZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNCaW9tZSA9IChjOiBDb21wb25lbnQpOiBjIGlzIEJpb21lID0+IGMgaW5zdGFuY2VvZiBCaW9tZTtcbiAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbmQoaXNCaW9tZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGJpb21lQ29uZmlndXJhdGlvbjogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsZVBhdHRlcm5zOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBiaW9tZUNvbW1hbmQgPVxuICAgIFwiYmlvbWUgY2hlY2sgLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0td3JpdGVcIjtcblxuICAvKipcbiAgICogQmlvbWUgdGFzay5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YXNrOiBUYXNrO1xuICAvKipcbiAgICogQmlvbWUgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaWxlOiBKc29uRmlsZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm9qZWN0OiBOb2RlUHJvamVjdCxcbiAgICBwcml2YXRlIG9wdGlvbnM6IEJpb21lT3B0aW9ucyA9IHt9LFxuICApIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIGNvbnN0IGJpb21lanMgPSBgQGJpb21lanMvYmlvbWVgO1xuICAgIHByb2plY3QuYWRkRGV2RGVwcyhgJHtiaW9tZWpzfUAke29wdGlvbnMudmVyc2lvbiA/PyBcIl4yXCJ9YCk7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBCaW9tZUNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICAuLi5ERUZBVUxUX0NPTkZJRyxcbiAgICAgIC4uLigob3B0aW9ucy5saW50ZXIgPz8gdHJ1ZSkgPyBERUZBVUxUX0xJTlRFUiA6IHt9KSxcbiAgICAgIC4uLigob3B0aW9ucy5mb3JtYXR0ZXIgPz8gdHJ1ZSkgPyBERUZBVUxUX0ZPUk1BVFRFUiA6IHt9KSxcbiAgICAgIC4uLigob3B0aW9ucy5hc3Npc3QgPz8gdHJ1ZSkgPyBERUZBVUxUX0FTU0lTVCA6IHt9KSxcbiAgICB9O1xuXG4gICAgdGhpcy5fZmlsZVBhdHRlcm5zID0gbmV3IFNldChbXG4gICAgICAuLi5kZWVwQ2xvbmUob3B0aW9ucy5iaW9tZUNvbmZpZz8uZmlsZXM/LmluY2x1ZGVzID8/IFtdKSxcbiAgICAgIC4uLmRlZXBDbG9uZShkZWZhdWx0Q29uZmlnLmZpbGVzPy5pbmNsdWRlcyA/PyBbXSksXG4gICAgXSk7XG5cbiAgICAvLyBHZXQgZ2VuZXJhdGVkIGZpbGUgcGF0dGVybnMgdG8gaWdub3JlXG4gICAgY29uc3QgZ2V0R2VuZXJhdGVkSWdub3JlUGF0dGVybnMgPSAoKSA9PiB7XG4gICAgICBpZiAob3B0aW9ucy5pZ25vcmVHZW5lcmF0ZWRGaWxlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRGaWxlcyA9IHRoaXMucHJvamVjdC5maWxlc1xuICAgICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLnJlYWRvbmx5ICYmIGZpbGUubWFya2VyKVxuICAgICAgICAubWFwKChmaWxlKSA9PiBgISR7ZmlsZS5wYXRofWApO1xuXG4gICAgICByZXR1cm4gZ2VuZXJhdGVkRmlsZXM7XG4gICAgfTtcblxuICAgIHRoaXMuYmlvbWVDb25maWd1cmF0aW9uID0gZGVlcE1lcmdlKFxuICAgICAgW1xuICAgICAgICB0b0pzb25fQmlvbWVDb25maWd1cmF0aW9uKGRlZXBDbG9uZShkZWZhdWx0Q29uZmlnKSksXG4gICAgICAgIHRvSnNvbl9CaW9tZUNvbmZpZ3VyYXRpb24oZGVlcENsb25lKG9wdGlvbnMuYmlvbWVDb25maWcgPz8ge30pKSxcbiAgICAgICAge1xuICAgICAgICAgICRzY2hlbWE6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2NoZW1hID0gdHJ5UmVzb2x2ZU1vZHVsZShcbiAgICAgICAgICAgICAgYCR7YmlvbWVqc30vY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbmAsXG4gICAgICAgICAgICAgIHsgcGF0aHM6IFt0aGlzLnByb2plY3Qub3V0ZGlyXSB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgLy8gbm90IGZvdW5kXG4gICAgICAgICAgICAgICFyZXNvbHZlZFNjaGVtYSB8fFxuICAgICAgICAgICAgICAvLyBub3Qgd2l0aGluIHRoZSBwcm9qZWN0IGRpclxuICAgICAgICAgICAgICAhcGF0aFxuICAgICAgICAgICAgICAgIC5yZXNvbHZlKHJlc29sdmVkU2NoZW1hKVxuICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKHBhdGgucmVzb2x2ZSh0aGlzLnByb2plY3Qub3V0ZGlyKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2Jpb21lanMuZGV2L3NjaGVtYXMvbGF0ZXN0L3NjaGVtYS5qc29uXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVQZXJzaXN0ZWRQYXRoKFxuICAgICAgICAgICAgICBwYXRoLnJlbGF0aXZlKHRoaXMucHJvamVjdC5vdXRkaXIsIHJlc29sdmVkU2NoZW1hKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgaW5jbHVkZXM6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgcGF0dGVybnMgPSBBcnJheS5mcm9tKHRoaXMuX2ZpbGVQYXR0ZXJucyk7XG4gICAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFBhdHRlcm5zID0gZ2V0R2VuZXJhdGVkSWdub3JlUGF0dGVybnMoKTtcbiAgICAgICAgICAgICAgLy8gVXNlIFNldCB0byBkZWR1cGxpY2F0ZSBwYXR0ZXJuc1xuICAgICAgICAgICAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnBhdHRlcm5zLCAuLi5nZW5lcmF0ZWRQYXR0ZXJuc10pXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB7IG1lcmdlQXJyYXlzOiBvcHRpb25zLm1lcmdlQXJyYXlzSW5Db25maWd1cmF0aW9uID8/IHRydWUgfSxcbiAgICApO1xuXG4gICAgdGhpcy5maWxlID0gbmV3IChjbGFzcyBleHRlbmRzIEpzb25GaWxlIHtcbiAgICAgIHB1YmxpYyBnZXQgbWFya2VyKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBgYmlvbWUtaWdub3JlLWFsbCBmb3JtYXQ6ICR7c3VwZXIubWFya2VyID8/IFwiZ2VuZXJhdGVkIGZpbGVcIn1gO1xuICAgICAgfVxuICAgIH0pKHRoaXMsIFwiYmlvbWUuanNvbmNcIiwge1xuICAgICAgb2JqOiB0aGlzLmJpb21lQ29uZmlndXJhdGlvbixcbiAgICAgIGFsbG93Q29tbWVudHM6IHRydWUsXG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsIC8vIGJpb21lIHdpbGwgYWx3YXlzIHJlLXdyaXRlIHRoZSBjb25maWcgZmlsZVxuICAgIH0pO1xuXG4gICAgdGhpcy50YXNrID0gdGhpcy5jcmVhdGVMb2NhbEJpb21lVGFzaygpO1xuICAgIHByb2plY3QudGVzdFRhc2suc3Bhd24odGhpcy50YXNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBmaWxlIHBhdHRlcm4gdG8gYmlvbWUuXG4gICAqXG4gICAqIFVzZSAhIG9yICEhIHRvIGlnbm9yZSBhIGZpbGUgcGF0dGVybi5cbiAgICogQHBhcmFtIHBhdHRlcm4gQmlvbWUgZ2xvYiBwYXR0ZXJuXG4gICAqIEBzZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9ndWlkZXMvY29uZmlndXJlLWJpb21lLyNjb250cm9sLWZpbGVzLXZpYS1jb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgYWRkRmlsZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsZVBhdHRlcm5zLmFkZChwYXR0ZXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBiaW9tZSBvdmVycmlkZSB0byBzZXQgcnVsZXMgZm9yIGEgc3BlY2lmaWMgZmlsZSBwYXR0ZXJuLlxuICAgKiBAcGFyYW0gb3ZlcnJpZGUgT3ZlcnJpZGUgb2JqZWN0XG4gICAqIEBzZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9yZWZlcmVuY2UvY29uZmlndXJhdGlvbi8jb3ZlcnJpZGVzXG4gICAqL1xuICBwdWJsaWMgYWRkT3ZlcnJpZGUob3ZlcnJpZGU6IE92ZXJyaWRlUGF0dGVybikge1xuICAgIGlmICghdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24ub3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmJpb21lQ29uZmlndXJhdGlvbi5vdmVycmlkZXMgPSBbXTtcbiAgICB9XG5cbiAgICB0aGlzLmJpb21lQ29uZmlndXJhdGlvbi5vdmVycmlkZXMucHVzaCh0b0pzb25fT3ZlcnJpZGVQYXR0ZXJuKG92ZXJyaWRlKSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIHRoZSBsaW50aW5nIHJ1bGVzIGFwcGxpZWQuXG4gICAqXG4gICAqIFVzZSBgdW5kZWZpbmVkYCB0byByZW1vdmUgdGhlIHJ1bGUgb3IgZ3JvdXAuXG4gICAqXG4gICAqIEBwYXJhbSBydWxlcyBSdWxlcyB0byBhcHBseS5cbiAgICogQHNlZSBodHRwczovL2Jpb21lanMuZGV2L3JlZmVyZW5jZS9jb25maWd1cmF0aW9uLyNsaW50ZXJydWxlc2dyb3VwXG4gICAqIEBleGFtcGxlXG4gICAqIGJpb21lLmV4cGFuZExpbnRpbmdSdWxlcyh7XG4gICAqICAgc3R5bGU6IHVuZGVmaW5lZCxcbiAgICogICBzdXNwaWNpb3VzOiB7XG4gICAqICAgICBub0V4cGxpY2l0QW55OiB1bmRlZmluZWQsXG4gICAqICAgICBub0R1cGxpY2F0ZUNhc2U6IFwiaW5mb1wiLFxuICAgKiAgIH1cbiAgICogfSlcbiAgICovXG4gIHB1YmxpYyBleHBhbmRMaW50ZXJSdWxlcyhydWxlczogUnVsZXMpIHtcbiAgICB0aGlzLmJpb21lQ29uZmlndXJhdGlvbi5saW50ZXIucnVsZXMgPSB0b0pzb25fUnVsZXMoXG4gICAgICBkZWVwTWVyZ2UoW3RoaXMuYmlvbWVDb25maWd1cmF0aW9uLmxpbnRlci5ydWxlcywgcnVsZXNdLCB7XG4gICAgICAgIG1lcmdlQXJyYXlzOiB0aGlzLm9wdGlvbnMubWVyZ2VBcnJheXNJbkNvbmZpZ3VyYXRpb24gPz8gdHJ1ZSxcbiAgICAgICAgZGVzdHJ1Y3RpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2NhbEJpb21lVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJiaW9tZVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSdW5zIEJpb21lIGFnYWluc3QgdGhlIGNvZGViYXNlXCIsXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZXhlYzogdGhpcy5iaW9tZUNvbW1hbmQsXG4gICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=