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.17" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvamF2YXNjcmlwdC9iaW9tZS9iaW9tZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtDQUFrQztBQUNsQyxxREFBNEM7QUFDNUMsaURBVXdCO0FBQ3hCLCtDQUE0QztBQUU1QyxxQ0FBc0M7QUFHdEMscUNBQStEO0FBQy9ELGtDQUEyQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQThDO0lBQ2hFLEdBQUcsRUFBRTtRQUNILFVBQVUsRUFBRSw0QkFBYSxDQUFDLEdBQUc7UUFDN0IsT0FBTyxFQUFFLElBQUk7UUFDYixhQUFhLEVBQUUsSUFBSTtLQUNwQjtJQUNELEtBQUssRUFBRTtRQUNMLGFBQWEsRUFBRSxLQUFLO0tBQ3JCO0NBQ0YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FDckI7SUFDRSxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSwwQkFBVyxDQUFDLEdBQUc7S0FDN0I7SUFDRCxVQUFVLEVBQUU7UUFDVixTQUFTLEVBQUU7WUFDVCxVQUFVLEVBQUUseUJBQVUsQ0FBQyxNQUFNO1NBQzlCO0tBQ0Y7Q0FDRixDQUFDO0FBRUo7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQXFERjs7R0FFRztBQUNILE1BQWEsS0FBTSxTQUFRLHFCQUFTO0lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMs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SUFDSSxjQUFjLENBQUMsT0FBZTtRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxRQUF5QjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFBLHFDQUFzQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNJLGlCQUFpQixDQUFDLEtBQVk7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBQSwyQkFBWSxFQUNqRCxJQUFBLGdCQUFTLEVBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2RCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsSUFBSSxJQUFJO1lBQzVELFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQyxXQUFXLEVBQUUsaUNBQWlDO1lBQzlDLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVk7b0JBQ3ZCLFdBQVcsRUFBRSxJQUFJO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0S0gsc0JBdUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tIFwiZmFzdC1qc29uLXBhdGNoXCI7XG5pbXBvcnQge1xuICBJbmRlbnRTdHlsZSxcbiAgT3ZlcnJpZGVQYXR0ZXJuLFxuICBRdW90ZVN0eWxlLFxuICBSdWxlcyxcbiAgdG9Kc29uX0Jpb21lQ29uZmlndXJhdGlvbixcbiAgdG9Kc29uX092ZXJyaWRlUGF0dGVybixcbiAgdG9Kc29uX1J1bGVzLFxuICBWY3NDbGllbnRLaW5kLFxuICB0eXBlIEJpb21lQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcIi4vYmlvbWUtY29uZmlnXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcIi4uLy4uL2phdmFzY3JpcHQvbm9kZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBKc29uRmlsZSB9IGZyb20gXCIuLi8uLi9qc29uXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vLi4vcHJvamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSBcIi4uLy4uL3Rhc2tcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSwgbm9ybWFsaXplUGVyc2lzdGVkUGF0aCB9IGZyb20gXCIuLi8uLi91dGlsXCI7XG5pbXBvcnQgeyB0cnlSZXNvbHZlTW9kdWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiBFbmFibGluZyBWQ1MgY29uZmlndXJhdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBgYmlvbWUgaW5pdGAsIGFzIHByb2plbiBjYW4gYmUgcHJlc3VtZWQgdG8gdXNlIHZlcnNpb24gY29udHJvbFxuICovXG5jb25zdCBERUZBVUxUX0NPTkZJRzogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwidmNzXCIgfCBcImZpbGVzXCI+ID0ge1xuICB2Y3M6IHtcbiAgICBjbGllbnRLaW5kOiBWY3NDbGllbnRLaW5kLkdJVCxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHVzZUlnbm9yZUZpbGU6IHRydWUsXG4gIH0sXG4gIGZpbGVzOiB7XG4gICAgaWdub3JlVW5rbm93bjogZmFsc2UsXG4gIH0sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgbGludGluZyBjb25maWd1cmF0aW9uIGlmIGxpbnRlciBpcyBlbmFibGVkLlxuICpcbiAqIElnbm9yZXMgYnkgZGVmYXVsdCBmb2xsb3dpbmcgcGF0dGVybnM6ICcqLmpzJywgJyouZC50cycsICdub2RlX21vZHVsZXMvJywgJyouZ2VuZXJhdGVkLnRzJywgJ2NvdmVyYWdlJy5cbiAqL1xuY29uc3QgREVGQVVMVF9MSU5URVI6IFBpY2s8QmlvbWVDb25maWd1cmF0aW9uLCBcImxpbnRlclwiPiA9IHtcbiAgbGludGVyOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBydWxlczoge1xuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBmb3JtYXR0aW5nIGNvbmZpZ3VyYXRpb24gaWYgZm9ybWF0dGVyIGlzIGVuYWJsZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfRk9STUFUVEVSOiBQaWNrPEJpb21lQ29uZmlndXJhdGlvbiwgXCJmb3JtYXR0ZXJcIiB8IFwiamF2YXNjcmlwdFwiPiA9XG4gIHtcbiAgICBmb3JtYXR0ZXI6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpbmRlbnRTdHlsZTogSW5kZW50U3R5bGUuVEFCLFxuICAgIH0sXG4gICAgamF2YXNjcmlwdDoge1xuICAgICAgZm9ybWF0dGVyOiB7XG4gICAgICAgIHF1b3RlU3R5bGU6IFF1b3RlU3R5bGUuRE9VQkxFLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4vKipcbiAqIERlZmF1bHQgY29kZSBhc3Npc3QgYWN0aW9uc1xuICovXG5jb25zdCBERUZBVUxUX0FTU0lTVDogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwiYXNzaXN0XCI+ID0ge1xuICBhc3Npc3Q6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJpb21lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIEJpb21lIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCBcIl4yXCJcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFbmFibGUgbGludGluZyB3aXRoIHJlY29tbWVuZGVkIHJ1bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIGNvZGUgZm9ybWF0dGVyIHdpdGggcmVjb21tZW5kZWQgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGUgY29kZSBhc3Npc3Qgd2l0aCByZWNvbW1lbmRlZCBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogU2hvdWxkIGFycmF5cyBiZSBtZXJnZWQgb3Igb3ZlcndyaXR0ZW4gd2hlbiBjcmVhdGluZyBCaW9tZSBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgYXJyYXlzIGFyZSBtZXJnZWQgYW5kIGR1cGxpY2F0ZSB2YWx1ZXMgYXJlIHJlbW92ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVyZ2VBcnJheXNJbkNvbmZpZ3VyYXRpb24/OiBib29sZWFuO1xuICAvKipcbiAgICogQXV0b21hdGljYWxseSBpZ25vcmUgYWxsIGdlbmVyYXRlZCBmaWxlcy5cbiAgICpcbiAgICogVGhpcyBwcmV2ZW50cyBCaW9tZSBmcm9tIHRyeWluZyB0byBmb3JtYXQgb3IgbGludCBmaWxlcyB0aGF0IGFyZSBtYXJrZWQgYXMgZ2VuZXJhdGVkLFxuICAgKiB3aGljaCB3b3VsZCBmYWlsIHNpbmNlIGdlbmVyYXRlZCBmaWxlcyBhcmUgdHlwaWNhbGx5IHJlYWQtb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlR2VuZXJhdGVkRmlsZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVsbCBCaW9tZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGNvbmZpZ3VyYXRpb24gZGljdGF0ZXMgdGhlIGZpbmFsIG91dGNvbWUgaWYgdmFsdWUgaXMgc2V0LlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxpbnRlciBpcyBkaXNhYmxlZCBhdCB0aGUgdG9wLWxldmVsLCBpdCBjYW4gYmUgZW5hYmxlZCB3aXRoIGBiaW9tZUNvbmZpZy5saW50ZXIuZW5hYmxlZGAuXG4gICAqL1xuICByZWFkb25seSBiaW9tZUNvbmZpZz86IEJpb21lQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBCaW9tZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW9tZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEJpb21lIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0Jpb21lID0gKGM6IENvbXBvbmVudCk6IGMgaXMgQmlvbWUgPT4gYyBpbnN0YW5jZW9mIEJpb21lO1xuICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc0Jpb21lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmlvbWVDb25maWd1cmF0aW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWxlUGF0dGVybnM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGJpb21lQ29tbWFuZCA9XG4gICAgXCJiaW9tZSBjaGVjayAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS13cml0ZVwiO1xuXG4gIC8qKlxuICAgKiBCaW9tZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhc2s6IFRhc2s7XG4gIC8qKlxuICAgKiBCaW9tZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZpbGU6IEpzb25GaWxlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb2plY3Q6IE5vZGVQcm9qZWN0LFxuICAgIHByaXZhdGUgb3B0aW9uczogQmlvbWVPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgY29uc3QgYmlvbWVqcyA9IGBAYmlvbWVqcy9iaW9tZWA7XG4gICAgcHJvamVjdC5hZGREZXZEZXBzKGAke2Jpb21lanN9QCR7b3B0aW9ucy52ZXJzaW9uID8/IFwiXjJcIn1gKTtcblxuICAgIGNvbnN0IGRlZmF1bHRDb25maWc6IEJpb21lQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIC4uLkRFRkFVTFRfQ09ORklHLFxuICAgICAgLi4uKChvcHRpb25zLmxpbnRlciA/PyB0cnVlKSA/IERFRkFVTFRfTElOVEVSIDoge30pLFxuICAgICAgLi4uKChvcHRpb25zLmZvcm1hdHRlciA/PyB0cnVlKSA/IERFRkFVTFRfRk9STUFUVEVSIDoge30pLFxuICAgICAgLi4uKChvcHRpb25zLmFzc2lzdCA/PyB0cnVlKSA/IERFRkFVTFRfQVNTSVNUIDoge30pLFxuICAgIH07XG5cbiAgICB0aGlzLl9maWxlUGF0dGVybnMgPSBuZXcgU2V0KFtcbiAgICAgIC4uLmRlZXBDbG9uZShvcHRpb25zLmJpb21lQ29uZmlnPy5maWxlcz8uaW5jbHVkZXMgPz8gW10pLFxuICAgICAgLi4uZGVlcENsb25lKGRlZmF1bHRDb25maWcuZmlsZXM/LmluY2x1ZGVzID8/IFtdKSxcbiAgICBdKTtcblxuICAgIC8vIEdldCBnZW5lcmF0ZWQgZmlsZSBwYXR0ZXJucyB0byBpZ25vcmVcbiAgICBjb25zdCBnZXRHZW5lcmF0ZWRJZ25vcmVQYXR0ZXJucyA9ICgpID0+IHtcbiAgICAgIGlmIChvcHRpb25zLmlnbm9yZUdlbmVyYXRlZEZpbGVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZEZpbGVzID0gdGhpcy5wcm9qZWN0LmZpbGVzXG4gICAgICAgIC5maWx0ZXIoKGZpbGUpID0+IGZpbGUucmVhZG9ubHkgJiYgZmlsZS5tYXJrZXIpXG4gICAgICAgIC5tYXAoKGZpbGUpID0+IGAhJHtmaWxlLnBhdGh9YCk7XG5cbiAgICAgIHJldHVybiBnZW5lcmF0ZWRGaWxlcztcbiAgICB9O1xuXG4gICAgdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24gPSBkZWVwTWVyZ2UoXG4gICAgICBbXG4gICAgICAgIHRvSnNvbl9CaW9tZUNvbmZpZ3VyYXRpb24oZGVlcENsb25lKGRlZmF1bHRDb25maWcpKSxcbiAgICAgICAgdG9Kc29uX0Jpb21lQ29uZmlndXJhdGlvbihkZWVwQ2xvbmUob3B0aW9ucy5iaW9tZUNvbmZpZyA/PyB7fSkpLFxuICAgICAgICB7XG4gICAgICAgICAgJHNjaGVtYTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRTY2hlbWEgPSB0cnlSZXNvbHZlTW9kdWxlKFxuICAgICAgICAgICAgICBgJHtiaW9tZWpzfS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uYCxcbiAgICAgICAgICAgICAgeyBwYXRoczogW3RoaXMucHJvamVjdC5vdXRkaXJdIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAvLyBub3QgZm91bmRcbiAgICAgICAgICAgICAgIXJlc29sdmVkU2NoZW1hIHx8XG4gICAgICAgICAgICAgIC8vIG5vdCB3aXRoaW4gdGhlIHByb2plY3QgZGlyXG4gICAgICAgICAgICAgICFwYXRoXG4gICAgICAgICAgICAgICAgLnJlc29sdmUocmVzb2x2ZWRTY2hlbWEpXG4gICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgocGF0aC5yZXNvbHZlKHRoaXMucHJvamVjdC5vdXRkaXIpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcImh0dHBzOi8vYmlvbWVqcy5kZXYvc2NoZW1hcy9sYXRlc3Qvc2NoZW1hLmpzb25cIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGgoXG4gICAgICAgICAgICAgIHBhdGgucmVsYXRpdmUodGhpcy5wcm9qZWN0Lm91dGRpciwgcmVzb2x2ZWRTY2hlbWEpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBpbmNsdWRlczogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IEFycmF5LmZyb20odGhpcy5fZmlsZVBhdHRlcm5zKTtcbiAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUGF0dGVybnMgPSBnZXRHZW5lcmF0ZWRJZ25vcmVQYXR0ZXJucygpO1xuICAgICAgICAgICAgICAvLyBVc2UgU2V0IHRvIGRlZHVwbGljYXRlIHBhdHRlcm5zXG4gICAgICAgICAgICAgIHJldHVybiBbLi4ubmV3IFNldChbLi4ucGF0dGVybnMsIC4uLmdlbmVyYXRlZFBhdHRlcm5zXSldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHsgbWVyZ2VBcnJheXM6IG9wdGlvbnMubWVyZ2VBcnJheXNJbkNvbmZpZ3VyYXRpb24gPz8gdHJ1ZSB9LFxuICAgICk7XG5cbiAgICB0aGlzLmZpbGUgPSBuZXcgKGNsYXNzIGV4dGVuZHMgSnNvbkZpbGUge1xuICAgICAgcHVibGljIGdldCBtYXJrZXIoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGBiaW9tZS1pZ25vcmUtYWxsIGZvcm1hdDogJHtzdXBlci5tYXJrZXIgPz8gXCJnZW5lcmF0ZWQgZmlsZVwifWA7XG4gICAgICB9XG4gICAgfSkodGhpcywgXCJiaW9tZS5qc29uY1wiLCB7XG4gICAgICBvYmo6IHRoaXMuYmlvbWVDb25maWd1cmF0aW9uLFxuICAgICAgYWxsb3dDb21tZW50czogdHJ1ZSxcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSwgLy8gYmlvbWUgd2lsbCBhbHdheXMgcmUtd3JpdGUgdGhlIGNvbmZpZyBmaWxlXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhc2sgPSB0aGlzLmNyZWF0ZUxvY2FsQmlvbWVUYXNrKCk7XG4gICAgcHJvamVjdC50ZXN0VGFzay5zcGF3bih0aGlzLnRhc2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGZpbGUgcGF0dGVybiB0byBiaW9tZS5cbiAgICpcbiAgICogVXNlICEgb3IgISEgdG8gaWdub3JlIGEgZmlsZSBwYXR0ZXJuLlxuICAgKiBAcGFyYW0gcGF0dGVybiBCaW9tZSBnbG9iIHBhdHRlcm5cbiAgICogQHNlZSBodHRwczovL2Jpb21lanMuZGV2L2d1aWRlcy9jb25maWd1cmUtYmlvbWUvI2NvbnRyb2wtZmlsZXMtdmlhLWNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9maWxlUGF0dGVybnMuYWRkKHBhdHRlcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGJpb21lIG92ZXJyaWRlIHRvIHNldCBydWxlcyBmb3IgYSBzcGVjaWZpYyBmaWxlIHBhdHRlcm4uXG4gICAqIEBwYXJhbSBvdmVycmlkZSBPdmVycmlkZSBvYmplY3RcbiAgICogQHNlZSBodHRwczovL2Jpb21lanMuZGV2L3JlZmVyZW5jZS9jb25maWd1cmF0aW9uLyNvdmVycmlkZXNcbiAgICovXG4gIHB1YmxpYyBhZGRPdmVycmlkZShvdmVycmlkZTogT3ZlcnJpZGVQYXR0ZXJuKSB7XG4gICAgaWYgKCF0aGlzLmJpb21lQ29uZmlndXJhdGlvbi5vdmVycmlkZXMpIHtcbiAgICAgIHRoaXMuYmlvbWVDb25maWd1cmF0aW9uLm92ZXJyaWRlcyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuYmlvbWVDb25maWd1cmF0aW9uLm92ZXJyaWRlcy5wdXNoKHRvSnNvbl9PdmVycmlkZVBhdHRlcm4ob3ZlcnJpZGUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIGxpbnRpbmcgcnVsZXMgYXBwbGllZC5cbiAgICpcbiAgICogVXNlIGB1bmRlZmluZWRgIHRvIHJlbW92ZSB0aGUgcnVsZSBvciBncm91cC5cbiAgICpcbiAgICogQHBhcmFtIHJ1bGVzIFJ1bGVzIHRvIGFwcGx5LlxuICAgKiBAc2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvcmVmZXJlbmNlL2NvbmZpZ3VyYXRpb24vI2xpbnRlcnJ1bGVzZ3JvdXBcbiAgICogQGV4YW1wbGVcbiAgICogYmlvbWUuZXhwYW5kTGludGluZ1J1bGVzKHtcbiAgICogICBzdHlsZTogdW5kZWZpbmVkLFxuICAgKiAgIHN1c3BpY2lvdXM6IHtcbiAgICogICAgIG5vRXhwbGljaXRBbnk6IHVuZGVmaW5lZCxcbiAgICogICAgIG5vRHVwbGljYXRlQ2FzZTogXCJpbmZvXCIsXG4gICAqICAgfVxuICAgKiB9KVxuICAgKi9cbiAgcHVibGljIGV4cGFuZExpbnRlclJ1bGVzKHJ1bGVzOiBSdWxlcykge1xuICAgIHRoaXMuYmlvbWVDb25maWd1cmF0aW9uLmxpbnRlci5ydWxlcyA9IHRvSnNvbl9SdWxlcyhcbiAgICAgIGRlZXBNZXJnZShbdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24ubGludGVyLnJ1bGVzLCBydWxlc10sIHtcbiAgICAgICAgbWVyZ2VBcnJheXM6IHRoaXMub3B0aW9ucy5tZXJnZUFycmF5c0luQ29uZmlndXJhdGlvbiA/PyB0cnVlLFxuICAgICAgICBkZXN0cnVjdGl2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvY2FsQmlvbWVUYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnByb2plY3QuYWRkVGFzayhcImJpb21lXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJ1bnMgQmlvbWUgYWdhaW5zdCB0aGUgY29kZWJhc2VcIixcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiB0aGlzLmJpb21lQ29tbWFuZCxcbiAgICAgICAgICByZWNlaXZlQXJnczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==