projen
Version:
CDK for software projects
198 lines • 24.1 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.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.98.32" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvamF2YXNjcmlwdC9iaW9tZS9iaW9tZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtDQUFrQztBQUNsQyxxREFBNEM7QUFDNUMsaURBVXdCO0FBQ3hCLCtDQUE0QztBQUU1QyxxQ0FBc0M7QUFHdEMscUNBQStEO0FBQy9ELGtDQUEyQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxjQUFjLEdBQThDO0lBQ2hFLEdBQUcsRUFBRTtRQUNILFVBQVUsRUFBRSw0QkFBYSxDQUFDLEdBQUc7UUFDN0IsT0FBTyxFQUFFLElBQUk7UUFDYixhQUFhLEVBQUUsSUFBSTtLQUNwQjtJQUNELEtBQUssRUFBRTtRQUNMLGFBQWEsRUFBRSxLQUFLO0tBQ3JCO0NBQ0YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxpQkFBaUIsR0FDckI7SUFDRSxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSwwQkFBVyxDQUFDLEdBQUc7S0FDN0I7SUFDRCxVQUFVLEVBQUU7UUFDVixTQUFTLEVBQUU7WUFDVCxVQUFVLEVBQUUseUJBQVUsQ0FBQyxNQUFNO1NBQzlCO0tBQ0Y7Q0FDRixDQUFDO0FBRUo7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBdUM7SUFDekQsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLElBQUk7UUFDYixPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0NBQ0YsQ0FBQztBQXFERjs7R0FFRztBQUNILE1BQWEsS0FBTSxTQUFRLHFCQUFTO0lBQzNCLE1BQU0sQ0FBQyxFQUFFLENBQUMs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LENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxRQUF5QjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFBLHFDQUFzQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNJLGlCQUFpQixDQUFDLEtBQVk7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBQSwyQkFBWSxFQUNqRCxJQUFBLGdCQUFTLEVBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUN2RCxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsSUFBSSxJQUFJO1lBQzVELFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQyxXQUFXLEVBQUUsaUNBQWlDO1lBQzlDLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVk7b0JBQ3ZCLFdBQVcsRUFBRSxJQUFJO2lCQUNsQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFuS0gsc0JBb0tDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tIFwiZmFzdC1qc29uLXBhdGNoXCI7XG5pbXBvcnQge1xuICBJbmRlbnRTdHlsZSxcbiAgT3ZlcnJpZGVQYXR0ZXJuLFxuICBRdW90ZVN0eWxlLFxuICBSdWxlcyxcbiAgdG9Kc29uX0Jpb21lQ29uZmlndXJhdGlvbixcbiAgdG9Kc29uX092ZXJyaWRlUGF0dGVybixcbiAgdG9Kc29uX1J1bGVzLFxuICBWY3NDbGllbnRLaW5kLFxuICB0eXBlIEJpb21lQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcIi4vYmlvbWUtY29uZmlnXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcIi4uLy4uL2phdmFzY3JpcHQvbm9kZS1wcm9qZWN0XCI7XG5pbXBvcnQgeyBKc29uRmlsZSB9IGZyb20gXCIuLi8uLi9qc29uXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vLi4vcHJvamVjdFwiO1xuaW1wb3J0IHR5cGUgeyBUYXNrIH0gZnJvbSBcIi4uLy4uL3Rhc2tcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSwgbm9ybWFsaXplUGVyc2lzdGVkUGF0aCB9IGZyb20gXCIuLi8uLi91dGlsXCI7XG5pbXBvcnQgeyB0cnlSZXNvbHZlTW9kdWxlIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqXG4gKiBFbmFibGluZyBWQ1MgY29uZmlndXJhdGlvbiBieSBkZWZhdWx0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBgYmlvbWUgaW5pdGAsIGFzIHByb2plbiBjYW4gYmUgcHJlc3VtZWQgdG8gdXNlIHZlcnNpb24gY29udHJvbFxuICovXG5jb25zdCBERUZBVUxUX0NPTkZJRzogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwidmNzXCIgfCBcImZpbGVzXCI+ID0ge1xuICB2Y3M6IHtcbiAgICBjbGllbnRLaW5kOiBWY3NDbGllbnRLaW5kLkdJVCxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHVzZUlnbm9yZUZpbGU6IHRydWUsXG4gIH0sXG4gIGZpbGVzOiB7XG4gICAgaWdub3JlVW5rbm93bjogZmFsc2UsXG4gIH0sXG59O1xuXG4vKipcbiAqIERlZmF1bHQgbGludGluZyBjb25maWd1cmF0aW9uIGlmIGxpbnRlciBpcyBlbmFibGVkLlxuICpcbiAqIElnbm9yZXMgYnkgZGVmYXVsdCBmb2xsb3dpbmcgcGF0dGVybnM6ICcqLmpzJywgJyouZC50cycsICdub2RlX21vZHVsZXMvJywgJyouZ2VuZXJhdGVkLnRzJywgJ2NvdmVyYWdlJy5cbiAqL1xuY29uc3QgREVGQVVMVF9MSU5URVI6IFBpY2s8QmlvbWVDb25maWd1cmF0aW9uLCBcImxpbnRlclwiPiA9IHtcbiAgbGludGVyOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBydWxlczoge1xuICAgICAgcmVjb21tZW5kZWQ6IHRydWUsXG4gICAgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBmb3JtYXR0aW5nIGNvbmZpZ3VyYXRpb24gaWYgZm9ybWF0dGVyIGlzIGVuYWJsZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfRk9STUFUVEVSOiBQaWNrPEJpb21lQ29uZmlndXJhdGlvbiwgXCJmb3JtYXR0ZXJcIiB8IFwiamF2YXNjcmlwdFwiPiA9XG4gIHtcbiAgICBmb3JtYXR0ZXI6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBpbmRlbnRTdHlsZTogSW5kZW50U3R5bGUuVEFCLFxuICAgIH0sXG4gICAgamF2YXNjcmlwdDoge1xuICAgICAgZm9ybWF0dGVyOiB7XG4gICAgICAgIHF1b3RlU3R5bGU6IFF1b3RlU3R5bGUuRE9VQkxFLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4vKipcbiAqIERlZmF1bHQgY29kZSBhc3Npc3QgYWN0aW9uc1xuICovXG5jb25zdCBERUZBVUxUX0FTU0lTVDogUGljazxCaW9tZUNvbmZpZ3VyYXRpb24sIFwiYXNzaXN0XCI+ID0ge1xuICBhc3Npc3Q6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJpb21lT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIEJpb21lIHRvIHVzZVxuICAgKlxuICAgKiBAZGVmYXVsdCBcIl4yXCJcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFbmFibGUgbGludGluZyB3aXRoIHJlY29tbWVuZGVkIHJ1bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsaW50ZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogRW5hYmxlIGNvZGUgZm9ybWF0dGVyIHdpdGggcmVjb21tZW5kZWQgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdHRlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbmFibGUgY29kZSBhc3Npc3Qgd2l0aCByZWNvbW1lbmRlZCBhY3Rpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhc3Npc3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogU2hvdWxkIGFycmF5cyBiZSBtZXJnZWQgb3Igb3ZlcndyaXR0ZW4gd2hlbiBjcmVhdGluZyBCaW9tZSBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgYXJyYXlzIGFyZSBtZXJnZWQgYW5kIGR1cGxpY2F0ZSB2YWx1ZXMgYXJlIHJlbW92ZWRcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVyZ2VBcnJheXNJbkNvbmZpZ3VyYXRpb24/OiBib29sZWFuO1xuICAvKipcbiAgICogQXV0b21hdGljYWxseSBpZ25vcmUgYWxsIGdlbmVyYXRlZCBmaWxlcy5cbiAgICpcbiAgICogVGhpcyBwcmV2ZW50cyBCaW9tZSBmcm9tIHRyeWluZyB0byBmb3JtYXQgb3IgbGludCBmaWxlcyB0aGF0IGFyZSBtYXJrZWQgYXMgZ2VuZXJhdGVkLFxuICAgKiB3aGljaCB3b3VsZCBmYWlsIHNpbmNlIGdlbmVyYXRlZCBmaWxlcyBhcmUgdHlwaWNhbGx5IHJlYWQtb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgaWdub3JlR2VuZXJhdGVkRmlsZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVsbCBCaW9tZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGNvbmZpZ3VyYXRpb24gZGljdGF0ZXMgdGhlIGZpbmFsIG91dGNvbWUgaWYgdmFsdWUgaXMgc2V0LlxuICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxpbnRlciBpcyBkaXNhYmxlZCBhdCB0aGUgdG9wLWxldmVsLCBpdCBjYW4gYmUgZW5hYmxlZCB3aXRoIGBiaW9tZUNvbmZpZy5saW50ZXIuZW5hYmxlZGAuXG4gICAqL1xuICByZWFkb25seSBiaW9tZUNvbmZpZz86IEJpb21lQ29uZmlndXJhdGlvbjtcbn1cblxuLyoqXG4gKiBCaW9tZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCaW9tZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEJpb21lIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc0Jpb21lID0gKGM6IENvbXBvbmVudCk6IGMgaXMgQmlvbWUgPT4gYyBpbnN0YW5jZW9mIEJpb21lO1xuICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc0Jpb21lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYmlvbWVDb25maWd1cmF0aW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWxlUGF0dGVybnM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGJpb21lQ29tbWFuZCA9XG4gICAgXCJiaW9tZSBjaGVjayAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS13cml0ZVwiO1xuXG4gIC8qKlxuICAgKiBCaW9tZSB0YXNrLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhc2s6IFRhc2s7XG4gIC8qKlxuICAgKiBCaW9tZSBjb25maWd1cmF0aW9uIGZpbGUgY29udGVudFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZpbGU6IEpzb25GaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IE5vZGVQcm9qZWN0LCBwcml2YXRlIG9wdGlvbnM6IEJpb21lT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCBiaW9tZWpzID0gYEBiaW9tZWpzL2Jpb21lYDtcbiAgICBwcm9qZWN0LmFkZERldkRlcHMoYCR7YmlvbWVqc31AJHtvcHRpb25zLnZlcnNpb24gPz8gXCJeMlwifWApO1xuXG4gICAgY29uc3QgZGVmYXVsdENvbmZpZzogQmlvbWVDb25maWd1cmF0aW9uID0ge1xuICAgICAgLi4uREVGQVVMVF9DT05GSUcsXG4gICAgICAuLi4ob3B0aW9ucy5saW50ZXIgPz8gdHJ1ZSA/IERFRkFVTFRfTElOVEVSIDoge30pLFxuICAgICAgLi4uKG9wdGlvbnMuZm9ybWF0dGVyID8/IHRydWUgPyBERUZBVUxUX0ZPUk1BVFRFUiA6IHt9KSxcbiAgICAgIC4uLihvcHRpb25zLmFzc2lzdCA/PyB0cnVlID8gREVGQVVMVF9BU1NJU1QgOiB7fSksXG4gICAgfTtcblxuICAgIHRoaXMuX2ZpbGVQYXR0ZXJucyA9IG5ldyBTZXQoW1xuICAgICAgLi4uZGVlcENsb25lKG9wdGlvbnMuYmlvbWVDb25maWc/LmZpbGVzPy5pbmNsdWRlcyA/PyBbXSksXG4gICAgICAuLi5kZWVwQ2xvbmUoZGVmYXVsdENvbmZpZy5maWxlcz8uaW5jbHVkZXMgPz8gW10pLFxuICAgIF0pO1xuXG4gICAgLy8gR2V0IGdlbmVyYXRlZCBmaWxlIHBhdHRlcm5zIHRvIGlnbm9yZVxuICAgIGNvbnN0IGdldEdlbmVyYXRlZElnbm9yZVBhdHRlcm5zID0gKCkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMuaWdub3JlR2VuZXJhdGVkRmlsZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VuZXJhdGVkRmlsZXMgPSB0aGlzLnByb2plY3QuZmlsZXNcbiAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5yZWFkb25seSAmJiBmaWxlLm1hcmtlcilcbiAgICAgICAgLm1hcCgoZmlsZSkgPT4gYCEke2ZpbGUucGF0aH1gKTtcblxuICAgICAgcmV0dXJuIGdlbmVyYXRlZEZpbGVzO1xuICAgIH07XG5cbiAgICB0aGlzLmJpb21lQ29uZmlndXJhdGlvbiA9IGRlZXBNZXJnZShcbiAgICAgIFtcbiAgICAgICAgdG9Kc29uX0Jpb21lQ29uZmlndXJhdGlvbihkZWVwQ2xvbmUoZGVmYXVsdENvbmZpZykpLFxuICAgICAgICB0b0pzb25fQmlvbWVDb25maWd1cmF0aW9uKGRlZXBDbG9uZShvcHRpb25zLmJpb21lQ29uZmlnID8/IHt9KSksXG4gICAgICAgIHtcbiAgICAgICAgICAkc2NoZW1hOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFNjaGVtYSA9IHRyeVJlc29sdmVNb2R1bGUoXG4gICAgICAgICAgICAgIGAke2Jpb21lanN9L2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb25gLFxuICAgICAgICAgICAgICB7IHBhdGhzOiBbdGhpcy5wcm9qZWN0Lm91dGRpcl0gfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgLy8gbm90IGZvdW5kXG4gICAgICAgICAgICAgICFyZXNvbHZlZFNjaGVtYSB8fFxuICAgICAgICAgICAgICAvLyBub3Qgd2l0aGluIHRoZSBwcm9qZWN0IGRpclxuICAgICAgICAgICAgICAhcGF0aFxuICAgICAgICAgICAgICAgIC5yZXNvbHZlKHJlc29sdmVkU2NoZW1hKVxuICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKHBhdGgucmVzb2x2ZSh0aGlzLnByb2plY3Qub3V0ZGlyKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJodHRwczovL2Jpb21lanMuZGV2L3NjaGVtYXMvbGF0ZXN0L3NjaGVtYS5qc29uXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVQZXJzaXN0ZWRQYXRoKFxuICAgICAgICAgICAgICBwYXRoLnJlbGF0aXZlKHRoaXMucHJvamVjdC5vdXRkaXIsIHJlc29sdmVkU2NoZW1hKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpbGVzOiB7XG4gICAgICAgICAgICBpbmNsdWRlczogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IEFycmF5LmZyb20odGhpcy5fZmlsZVBhdHRlcm5zKTtcbiAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUGF0dGVybnMgPSBnZXRHZW5lcmF0ZWRJZ25vcmVQYXR0ZXJucygpO1xuICAgICAgICAgICAgICAvLyBVc2UgU2V0IHRvIGRlZHVwbGljYXRlIHBhdHRlcm5zXG4gICAgICAgICAgICAgIHJldHVybiBbLi4ubmV3IFNldChbLi4ucGF0dGVybnMsIC4uLmdlbmVyYXRlZFBhdHRlcm5zXSldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHsgbWVyZ2VBcnJheXM6IG9wdGlvbnMubWVyZ2VBcnJheXNJbkNvbmZpZ3VyYXRpb24gPz8gdHJ1ZSB9XG4gICAgKTtcblxuICAgIHRoaXMuZmlsZSA9IG5ldyAoY2xhc3MgZXh0ZW5kcyBKc29uRmlsZSB7XG4gICAgICBwdWJsaWMgZ2V0IG1hcmtlcigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gYGJpb21lLWlnbm9yZS1hbGwgZm9ybWF0OiAke3N1cGVyLm1hcmtlciA/PyBcImdlbmVyYXRlZCBmaWxlXCJ9YDtcbiAgICAgIH1cbiAgICB9KSh0aGlzLCBcImJpb21lLmpzb25jXCIsIHtcbiAgICAgIG9iajogdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24sXG4gICAgICBhbGxvd0NvbW1lbnRzOiB0cnVlLFxuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLCAvLyBiaW9tZSB3aWxsIGFsd2F5cyByZS13cml0ZSB0aGUgY29uZmlnIGZpbGVcbiAgICB9KTtcblxuICAgIHRoaXMudGFzayA9IHRoaXMuY3JlYXRlTG9jYWxCaW9tZVRhc2soKTtcbiAgICBwcm9qZWN0LnRlc3RUYXNrLnNwYXduKHRoaXMudGFzayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgZmlsZSBwYXR0ZXJuIHRvIGJpb21lLlxuICAgKlxuICAgKiBVc2UgISBvciAhISB0byBpZ25vcmUgYSBmaWxlIHBhdHRlcm4uXG4gICAqIEBwYXJhbSBwYXR0ZXJuIEJpb21lIGdsb2IgcGF0dGVyblxuICAgKiBAc2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvZ3VpZGVzL2NvbmZpZ3VyZS1iaW9tZS8jY29udHJvbC1maWxlcy12aWEtY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFkZEZpbGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZykge1xuICAgIHRoaXMuX2ZpbGVQYXR0ZXJucy5hZGQocGF0dGVybik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgYmlvbWUgb3ZlcnJpZGUgdG8gc2V0IHJ1bGVzIGZvciBhIHNwZWNpZmljIGZpbGUgcGF0dGVybi5cbiAgICogQHBhcmFtIG92ZXJyaWRlIE92ZXJyaWRlIG9iamVjdFxuICAgKiBAc2VlIGh0dHBzOi8vYmlvbWVqcy5kZXYvcmVmZXJlbmNlL2NvbmZpZ3VyYXRpb24vI292ZXJyaWRlc1xuICAgKi9cbiAgcHVibGljIGFkZE92ZXJyaWRlKG92ZXJyaWRlOiBPdmVycmlkZVBhdHRlcm4pIHtcbiAgICBpZiAoIXRoaXMuYmlvbWVDb25maWd1cmF0aW9uLm92ZXJyaWRlcykge1xuICAgICAgdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24ub3ZlcnJpZGVzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24ub3ZlcnJpZGVzLnB1c2godG9Kc29uX092ZXJyaWRlUGF0dGVybihvdmVycmlkZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgbGludGluZyBydWxlcyBhcHBsaWVkLlxuICAgKlxuICAgKiBVc2UgYHVuZGVmaW5lZGAgdG8gcmVtb3ZlIHRoZSBydWxlIG9yIGdyb3VwLlxuICAgKlxuICAgKiBAcGFyYW0gcnVsZXMgUnVsZXMgdG8gYXBwbHkuXG4gICAqIEBzZWUgaHR0cHM6Ly9iaW9tZWpzLmRldi9yZWZlcmVuY2UvY29uZmlndXJhdGlvbi8jbGludGVycnVsZXNncm91cFxuICAgKiBAZXhhbXBsZVxuICAgKiBiaW9tZS5leHBhbmRMaW50aW5nUnVsZXMoe1xuICAgKiAgIHN0eWxlOiB1bmRlZmluZWQsXG4gICAqICAgc3VzcGljaW91czoge1xuICAgKiAgICAgbm9FeHBsaWNpdEFueTogdW5kZWZpbmVkLFxuICAgKiAgICAgbm9EdXBsaWNhdGVDYXNlOiBcImluZm9cIixcbiAgICogICB9XG4gICAqIH0pXG4gICAqL1xuICBwdWJsaWMgZXhwYW5kTGludGVyUnVsZXMocnVsZXM6IFJ1bGVzKSB7XG4gICAgdGhpcy5iaW9tZUNvbmZpZ3VyYXRpb24ubGludGVyLnJ1bGVzID0gdG9Kc29uX1J1bGVzKFxuICAgICAgZGVlcE1lcmdlKFt0aGlzLmJpb21lQ29uZmlndXJhdGlvbi5saW50ZXIucnVsZXMsIHJ1bGVzXSwge1xuICAgICAgICBtZXJnZUFycmF5czogdGhpcy5vcHRpb25zLm1lcmdlQXJyYXlzSW5Db25maWd1cmF0aW9uID8/IHRydWUsXG4gICAgICAgIGRlc3RydWN0aXZlOiB0cnVlLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2NhbEJpb21lVGFzaygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0LmFkZFRhc2soXCJiaW9tZVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSdW5zIEJpb21lIGFnYWluc3QgdGhlIGNvZGViYXNlXCIsXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZXhlYzogdGhpcy5iaW9tZUNvbW1hbmQsXG4gICAgICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=