@git-validator/eslint-config
Version:
A strict eslint config for better code quality.
222 lines • 25 kB
JavaScript
import fs from "node:fs/promises";
import path from "node:path";
import process from "node:process";
import tsPlugin from "@typescript-eslint/eslint-plugin";
import tsParser from "@typescript-eslint/parser";
import deprecationPlugin from "eslint-plugin-deprecation";
import jsConfig from "./js-config.js";
const tsconfig = await getProjectTsconfig();
async function getProjectTsconfig() {
const tsconfigs = [
"tsconfig.eslint.json",
"tsconfig.json",
"tsconfig.build.json",
];
const index = (await Promise.all(tsconfigs.map(async (config) => await fs
.access(path.join(process.cwd(), config))
.then(() => true)
.catch(() => false)))).findIndex(Boolean);
return tsconfigs[index];
}
function getTsExtensionRules() {
// https://typescript-eslint.io/rules/?=extension
const extensionRuleKeys = [
"block-spacing",
"brace-style",
"class-methods-use-this",
"comma-dangle",
"comma-spacing",
"consistent-return",
"default-param-last",
"dot-notation",
"func-call-spacing",
"indent",
"init-declarations",
"key-spacing",
"keyword-spacing",
"lines-around-comment",
"lines-between-class-members",
"max-params",
"no-array-constructor",
"no-dupe-class-members",
"no-empty-function",
"no-extra-parens",
"no-extra-semi",
"no-implied-eval",
"no-invalid-this",
"no-loop-func",
"no-loss-of-precision",
"no-magic-numbers",
"no-redeclare",
"no-restricted-imports",
"no-shadow",
"no-throw-literal",
"no-unused-expressions",
"no-unused-vars",
"no-use-before-define",
"no-useless-constructor",
"object-curly-spacing",
"only-throw-error", // this rule based on 'eslint/no-throw-literal'
"padding-line-between-statements",
"prefer-destructuring",
"prefer-promise-reject-errors",
"quotes",
"require-await",
"return-await", // this rule based on 'eslint/no-return-await' instead of 'eslint/return-await'
"semi",
"space-before-blocks",
"space-before-function-paren",
"space-infix-ops",
];
const isExtensionKey = (key) => !!extensionRuleKeys.find((k) => k === key) &&
Object.keys(jsConfig.rules).includes(key);
const result = {};
for (const [jsRuleKey, jsRuleValue] of Object.entries(jsConfig.rules)) {
if (isExtensionKey(jsRuleKey)) {
result[jsRuleKey] = "off";
result[`@typescript-eslint/${jsRuleKey}`] = jsRuleValue;
}
}
// To fix the typescript indent, see https://github.com/mightyiam/eslint-config-standard-with-typescript/pull/1200
return result;
}
function getStrictRules() {
const config = {
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/consistent-type-assertions": [
"error",
{ assertionStyle: "never" },
],
"@typescript-eslint/no-non-null-assertion": "error",
};
const emptyResult = {};
const fullResult = config;
if (process.env["STRICT"] || process.env["ESLINT_STRICT"]) {
return fullResult;
}
else {
return emptyResult;
}
}
const mainConfig = {
...jsConfig,
files: ["**/*.{ts,cts,mts,tsx}"],
languageOptions: {
...jsConfig.languageOptions,
parser: tsParser, // TODO: Unfortunately parser cannot be a string. Eslint should support it. https://eslint.org/docs/latest/use/configure/configuration-files-new#configuring-a-custom-parser-and-its-options
parserOptions: {
...jsConfig.languageOptions.parserOptions,
tsconfigRootDir: process.cwd(),
project: tsconfig,
},
},
plugins: {
...jsConfig.plugins,
deprecation: deprecationPlugin,
"@typescript-eslint": tsPlugin,
},
rules: {
...jsConfig.rules,
...getTsExtensionRules(),
// ban some syntaxes to reduce mistakes
// deprecation
"deprecation/deprecation": "error",
// git-validator
"@git-validator/exact-map-set-type": "error",
"@git-validator/no-const-enum": "error",
"@git-validator/no-declares-in-ts-file": "error",
"@git-validator/no-export-assignment": "error",
"@git-validator/no-property-decorator": "error",
// typescript
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-ts-comment": [
"error",
{
"ts-expect-error": true,
"ts-ignore": true,
"ts-nocheck": true,
},
],
"@typescript-eslint/ban-types": "error",
"@typescript-eslint/consistent-generic-constructors": "error",
"@typescript-eslint/consistent-indexed-object-style": "error",
"@typescript-eslint/consistent-type-assertions": [
"error",
{
assertionStyle: "as",
objectLiteralTypeAssertions: "allow-as-parameter",
},
],
"@typescript-eslint/consistent-type-exports": "error",
// "@typescript-eslint/consistent-type-imports": "error,
"@typescript-eslint/method-signature-style": "error",
"@typescript-eslint/naming-convention": [
"error",
{
selector: "function",
format: ["camelCase", "PascalCase"],
},
{
selector: "variable",
types: ["function"],
format: ["camelCase", "PascalCase"],
},
{
selector: "class",
format: ["PascalCase"],
},
],
"@typescript-eslint/no-array-delete": "error",
"@typescript-eslint/no-confusing-non-null-assertion": "error",
"@typescript-eslint/no-duplicate-enum-values": "error",
"@typescript-eslint/no-duplicate-type-constituents": "error",
"@typescript-eslint/no-floating-promises": [
"error",
{
ignoreVoid: false,
},
],
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-import-type-side-effects": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-misused-promises": [
"error",
{
checksVoidReturn: {
returns: false,
arguments: false,
variables: false,
},
},
],
"@typescript-eslint/no-mixed-enums": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-non-null-assertion": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/no-unnecessary-condition": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/only-throw-error": "error",
"@typescript-eslint/prefer-ts-expect-error": "error",
"@typescript-eslint/restrict-plus-operands": "error",
"@typescript-eslint/return-await": ["error", "always"],
"@typescript-eslint/unbound-method": "error",
...getStrictRules(),
},
};
const testConfig = {
...mainConfig,
// https://github.com/motemen/minimatch-cheat-sheet
files: [
"**/__tests__/**/*.{ts,cts,mts,tsx}",
"**/*.{test,spec}.{ts,cts,mts,tsx}",
],
rules: {
...mainConfig.rules,
"@typescript-eslint/unbound-method": "off",
},
};
const config = [mainConfig, testConfig];
const empty = [];
export default tsconfig ? config : empty;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHMtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RzLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sUUFBUSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hELE9BQU8sUUFBUSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pELE9BQU8saUJBQWlCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO0FBRTVDLEtBQUssVUFBVSxrQkFBa0I7SUFDL0IsTUFBTSxTQUFTLEdBQUc7UUFDaEIsc0JBQXNCO1FBQ3RCLGVBQWU7UUFDZixxQkFBcUI7S0FDdEIsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLENBQ1osTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLFNBQVMsQ0FBQyxHQUFHLENBQ1gsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQ2YsTUFBTSxFQUFFO1NBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDaEIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUNGLENBQ0YsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsbUJBQW1CO0lBQzFCLGlEQUFpRDtJQUNqRCxNQUFNLGlCQUFpQixHQUFHO1FBQ3hCLGVBQWU7UUFDZixh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QUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNsRSxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO0FBRTNDLGVBQWUsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcIm5vZGU6cHJvY2Vzc1wiO1xuaW1wb3J0IHRzUGx1Z2luIGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpblwiO1xuaW1wb3J0IHRzUGFyc2VyIGZyb20gXCJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyXCI7XG5pbXBvcnQgZGVwcmVjYXRpb25QbHVnaW4gZnJvbSBcImVzbGludC1wbHVnaW4tZGVwcmVjYXRpb25cIjtcbmltcG9ydCBqc0NvbmZpZyBmcm9tIFwiLi9qcy1jb25maWcuanNcIjtcblxuY29uc3QgdHNjb25maWcgPSBhd2FpdCBnZXRQcm9qZWN0VHNjb25maWcoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdFRzY29uZmlnKCkge1xuICBjb25zdCB0c2NvbmZpZ3MgPSBbXG4gICAgXCJ0c2NvbmZpZy5lc2xpbnQuanNvblwiLFxuICAgIFwidHNjb25maWcuanNvblwiLFxuICAgIFwidHNjb25maWcuYnVpbGQuanNvblwiLFxuICBdO1xuICBjb25zdCBpbmRleCA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRzY29uZmlncy5tYXAoXG4gICAgICAgIGFzeW5jIChjb25maWcpID0+XG4gICAgICAgICAgYXdhaXQgZnNcbiAgICAgICAgICAgIC5hY2Nlc3MocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGNvbmZpZykpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKSxcbiAgICAgICksXG4gICAgKVxuICApLmZpbmRJbmRleChCb29sZWFuKTtcbiAgcmV0dXJuIHRzY29uZmlnc1tpbmRleF07XG59XG5cbmZ1bmN0aW9uIGdldFRzRXh0ZW5zaW9uUnVsZXMoKSB7XG4gIC8vIGh0dHBzOi8vdHlwZXNjcmlwdC1lc2xpbnQuaW8vcnVsZXMvPz1leHRlbnNpb25cbiAgY29uc3QgZXh0ZW5zaW9uUnVsZUtleXMgPSBbXG4gICAgXCJibG9jay1zcGFjaW5nXCIsXG4gICAgXCJicmFjZS1zdHlsZVwiLFxuICAgIFwiY2xhc3MtbWV0aG9kcy11c2UtdGhpc1wiLFxuICAgIFwiY29tbWEtZGFuZ2xlXCIsXG4gICAgXCJjb21tYS1zcGFjaW5nXCIsXG4gICAgXCJjb25zaXN0ZW50LXJldHVyblwiLFxuICAgIFwiZGVmYXVsdC1wYXJhbS1sYXN0XCIsXG4gICAgXCJkb3Qtbm90YXRpb25cIixcbiAgICBcImZ1bmMtY2FsbC1zcGFjaW5nXCIsXG4gICAgXCJpbmRlbnRcIixcbiAgICBcImluaXQtZGVjbGFyYXRpb25zXCIsXG4gICAgXCJrZXktc3BhY2luZ1wiLFxuICAgIFwia2V5d29yZC1zcGFjaW5nXCIsXG4gICAgXCJsaW5lcy1hcm91bmQtY29tbWVudFwiLFxuICAgIFwibGluZXMtYmV0d2Vlbi1jbGFzcy1tZW1iZXJzXCIsXG4gICAgXCJtYXgtcGFyYW1zXCIsXG4gICAgXCJuby1hcnJheS1jb25zdHJ1Y3RvclwiLFxuICAgIFwibm8tZHVwZS1jbGFzcy1tZW1iZXJzXCIsXG4gICAgXCJuby1lbXB0eS1mdW5jdGlvblwiLFxuICAgIFwibm8tZXh0cmEtcGFyZW5zXCIsXG4gICAgXCJuby1leHRyYS1zZW1pXCIsXG4gICAgXCJuby1pbXBsaWVkLWV2YWxcIixcbiAgICBcIm5vLWludmFsaWQtdGhpc1wiLFxuICAgIFwibm8tbG9vcC1mdW5jXCIsXG4gICAgXCJuby1sb3NzLW9mLXByZWNpc2lvblwiLFxuICAgIFwibm8tbWFnaWMtbnVtYmVyc1wiLFxuICAgIFwibm8tcmVkZWNsYXJlXCIsXG4gICAgXCJuby1yZXN0cmljdGVkLWltcG9ydHNcIixcbiAgICBcIm5vLXNoYWRvd1wiLFxuICAgIFwibm8tdGhyb3ctbGl0ZXJhbFwiLFxuICAgIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIsXG4gICAgXCJuby11bnVzZWQtdmFyc1wiLFxuICAgIFwibm8tdXNlLWJlZm9yZS1kZWZpbmVcIixcbiAgICBcIm5vLXVzZWxlc3MtY29uc3RydWN0b3JcIixcbiAgICBcIm9iamVjdC1jdXJseS1zcGFjaW5nXCIsXG4gICAgXCJvbmx5LXRocm93LWVycm9yXCIsIC8vIHRoaXMgcnVsZSBiYXNlZCBvbiAnZXNsaW50L25vLXRocm93LWxpdGVyYWwnXG4gICAgXCJwYWRkaW5nLWxpbmUtYmV0d2Vlbi1zdGF0ZW1lbnRzXCIsXG4gICAgXCJwcmVmZXItZGVzdHJ1Y3R1cmluZ1wiLFxuICAgIFwicHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1wiLFxuICAgIFwicXVvdGVzXCIsXG4gICAgXCJyZXF1aXJlLWF3YWl0XCIsXG4gICAgXCJyZXR1cm4tYXdhaXRcIiwgLy8gdGhpcyBydWxlIGJhc2VkIG9uICdlc2xpbnQvbm8tcmV0dXJuLWF3YWl0JyBpbnN0ZWFkIG9mICdlc2xpbnQvcmV0dXJuLWF3YWl0J1xuICAgIFwic2VtaVwiLFxuICAgIFwic3BhY2UtYmVmb3JlLWJsb2Nrc1wiLFxuICAgIFwic3BhY2UtYmVmb3JlLWZ1bmN0aW9uLXBhcmVuXCIsXG4gICAgXCJzcGFjZS1pbmZpeC1vcHNcIixcbiAgXSBhcyBjb25zdDtcbiAgdHlwZSBFeHRlbnNpb25SdWxlS2V5ID0gKHR5cGVvZiBleHRlbnNpb25SdWxlS2V5cylbbnVtYmVyXTtcbiAgdHlwZSBKc0NvbmZpZ1J1bGVLZXkgPSBrZXlvZiB0eXBlb2YganNDb25maWcucnVsZXM7XG5cbiAgdHlwZSBKc0V4dGVuc2lvbktleSA9IEV4dHJhY3Q8RXh0ZW5zaW9uUnVsZUtleSwgSnNDb25maWdSdWxlS2V5PjsgLy8gRXh0cmFjdFxuICB0eXBlIFRzRXh0ZW5zaW9uS2V5ID0gYEB0eXBlc2NyaXB0LWVzbGludC8ke0pzRXh0ZW5zaW9uS2V5fWA7XG4gIGNvbnN0IGlzRXh0ZW5zaW9uS2V5ID0gKGtleTogc3RyaW5nKToga2V5IGlzIEpzRXh0ZW5zaW9uS2V5ID0+XG4gICAgISFleHRlbnNpb25SdWxlS2V5cy5maW5kKChrKSA9PiBrID09PSBrZXkpICYmXG4gICAgT2JqZWN0LmtleXMoanNDb25maWcucnVsZXMpLmluY2x1ZGVzKGtleSk7XG5cbiAgY29uc3QgcmVzdWx0OiBQYXJ0aWFsPFJlY29yZDxKc0V4dGVuc2lvbktleSB8IFRzRXh0ZW5zaW9uS2V5LCB1bmtub3duPj4gPSB7fTtcbiAgZm9yIChjb25zdCBbanNSdWxlS2V5LCBqc1J1bGVWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNDb25maWcucnVsZXMpKSB7XG4gICAgaWYgKGlzRXh0ZW5zaW9uS2V5KGpzUnVsZUtleSkpIHtcbiAgICAgIHJlc3VsdFtqc1J1bGVLZXldID0gXCJvZmZcIjtcbiAgICAgIHJlc3VsdFtgQHR5cGVzY3JpcHQtZXNsaW50LyR7anNSdWxlS2V5fWBdID0ganNSdWxlVmFsdWU7XG4gICAgfVxuICB9XG4gIC8vIFRvIGZpeCB0aGUgdHlwZXNjcmlwdCBpbmRlbnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWlnaHR5aWFtL2VzbGludC1jb25maWctc3RhbmRhcmQtd2l0aC10eXBlc2NyaXB0L3B1bGwvMTIwMFxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0cmljdFJ1bGVzKCkge1xuICBjb25zdCBjb25maWcgPSB7XG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1wiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7IGFzc2VydGlvblN0eWxlOiBcIm5ldmVyXCIgfSxcbiAgICBdLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblwiOiBcImVycm9yXCIsXG4gIH0gYXMgY29uc3Q7XG4gIHR5cGUgUmVzdWx0ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgdHlwZW9mIGNvbmZpZywgdW5rbm93bj4+O1xuXG4gIGNvbnN0IGVtcHR5UmVzdWx0OiBSZXN1bHQgPSB7fTtcbiAgY29uc3QgZnVsbFJlc3VsdDogUmVzdWx0ID0gY29uZmlnO1xuICBpZiAocHJvY2Vzcy5lbnZbXCJTVFJJQ1RcIl0gfHwgcHJvY2Vzcy5lbnZbXCJFU0xJTlRfU1RSSUNUXCJdKSB7XG4gICAgcmV0dXJuIGZ1bGxSZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVtcHR5UmVzdWx0O1xuICB9XG59XG5cbmNvbnN0IG1haW5Db25maWcgPSB7XG4gIC4uLmpzQ29uZmlnLFxuICBmaWxlczogW1wiKiovKi57dHMsY3RzLG10cyx0c3h9XCJdLFxuICBsYW5ndWFnZU9wdGlvbnM6IHtcbiAgICAuLi5qc0NvbmZpZy5sYW5ndWFnZU9wdGlvbnMsXG4gICAgcGFyc2VyOiB0c1BhcnNlciwgLy8gVE9ETzogVW5mb3J0dW5hdGVseSBwYXJzZXIgY2Fubm90IGJlIGEgc3RyaW5nLiBFc2xpbnQgc2hvdWxkIHN1cHBvcnQgaXQuIGh0dHBzOi8vZXNsaW50Lm9yZy9kb2NzL2xhdGVzdC91c2UvY29uZmlndXJlL2NvbmZpZ3VyYXRpb24tZmlsZXMtbmV3I2NvbmZpZ3VyaW5nLWEtY3VzdG9tLXBhcnNlci1hbmQtaXRzLW9wdGlvbnNcbiAgICBwYXJzZXJPcHRpb25zOiB7XG4gICAgICAuLi5qc0NvbmZpZy5sYW5ndWFnZU9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIHRzY29uZmlnUm9vdERpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIHByb2plY3Q6IHRzY29uZmlnLFxuICAgIH0sXG4gIH0sXG4gIHBsdWdpbnM6IHtcbiAgICAuLi5qc0NvbmZpZy5wbHVnaW5zLFxuICAgIGRlcHJlY2F0aW9uOiBkZXByZWNhdGlvblBsdWdpbixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludFwiOiB0c1BsdWdpbixcbiAgfSxcbiAgcnVsZXM6IHtcbiAgICAuLi5qc0NvbmZpZy5ydWxlcyxcbiAgICAuLi5nZXRUc0V4dGVuc2lvblJ1bGVzKCksXG5cbiAgICAvLyBiYW4gc29tZSBzeW50YXhlcyB0byByZWR1Y2UgbWlzdGFrZXNcbiAgICAvLyBkZXByZWNhdGlvblxuICAgIFwiZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cIjogXCJlcnJvclwiLFxuICAgIC8vIGdpdC12YWxpZGF0b3JcbiAgICBcIkBnaXQtdmFsaWRhdG9yL2V4YWN0LW1hcC1zZXQtdHlwZVwiOiBcImVycm9yXCIsXG4gICAgXCJAZ2l0LXZhbGlkYXRvci9uby1jb25zdC1lbnVtXCI6IFwiZXJyb3JcIixcbiAgICBcIkBnaXQtdmFsaWRhdG9yL25vLWRlY2xhcmVzLWluLXRzLWZpbGVcIjogXCJlcnJvclwiLFxuICAgIFwiQGdpdC12YWxpZGF0b3Ivbm8tZXhwb3J0LWFzc2lnbm1lbnRcIjogXCJlcnJvclwiLFxuICAgIFwiQGdpdC12YWxpZGF0b3Ivbm8tcHJvcGVydHktZGVjb3JhdG9yXCI6IFwiZXJyb3JcIixcbiAgICAvLyB0eXBlc2NyaXB0XG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvYXdhaXQtdGhlbmFibGVcIjogXCJlcnJvclwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XCI6IFtcbiAgICAgIFwiZXJyb3JcIixcbiAgICAgIHtcbiAgICAgICAgXCJ0cy1leHBlY3QtZXJyb3JcIjogdHJ1ZSxcbiAgICAgICAgXCJ0cy1pZ25vcmVcIjogdHJ1ZSxcbiAgICAgICAgXCJ0cy1ub2NoZWNrXCI6IHRydWUsXG4gICAgICB9LFxuICAgIF0sXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LWdlbmVyaWMtY29uc3RydWN0b3JzXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LWluZGV4ZWQtb2JqZWN0LXN0eWxlXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtYXNzZXJ0aW9uc1wiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7XG4gICAgICAgIGFzc2VydGlvblN0eWxlOiBcImFzXCIsXG4gICAgICAgIG9iamVjdExpdGVyYWxUeXBlQXNzZXJ0aW9uczogXCJhbGxvdy1hcy1wYXJhbWV0ZXJcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtZXhwb3J0c1wiOiBcImVycm9yXCIsXG4gICAgLy8gXCJAdHlwZXNjcmlwdC1lc2xpbnQvY29uc2lzdGVudC10eXBlLWltcG9ydHNcIjogXCJlcnJvcixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblwiOiBbXG4gICAgICBcImVycm9yXCIsXG4gICAgICB7XG4gICAgICAgIHNlbGVjdG9yOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgIGZvcm1hdDogW1wiY2FtZWxDYXNlXCIsIFwiUGFzY2FsQ2FzZVwiXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNlbGVjdG9yOiBcInZhcmlhYmxlXCIsXG4gICAgICAgIHR5cGVzOiBbXCJmdW5jdGlvblwiXSxcbiAgICAgICAgZm9ybWF0OiBbXCJjYW1lbENhc2VcIiwgXCJQYXNjYWxDYXNlXCJdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2VsZWN0b3I6IFwiY2xhc3NcIixcbiAgICAgICAgZm9ybWF0OiBbXCJQYXNjYWxDYXNlXCJdLFxuICAgICAgfSxcbiAgICBdLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWFycmF5LWRlbGV0ZVwiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLW5vbi1udWxsLWFzc2VydGlvblwiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHVwbGljYXRlLWVudW0tdmFsdWVzXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1kdXBsaWNhdGUtdHlwZS1jb25zdGl0dWVudHNcIjogXCJlcnJvclwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXCI6IFtcbiAgICAgIFwiZXJyb3JcIixcbiAgICAgIHtcbiAgICAgICAgaWdub3JlVm9pZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0sXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZm9yLWluLWFycmF5XCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBvcnQtdHlwZS1zaWRlLWVmZmVjdHNcIjogXCJlcnJvclwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcIjogXCJlcnJvclwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtbmV3XCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1taXN1c2VkLXByb21pc2VzXCI6IFtcbiAgICAgIFwiZXJyb3JcIixcbiAgICAgIHtcbiAgICAgICAgY2hlY2tzVm9pZFJldHVybjoge1xuICAgICAgICAgIHJldHVybnM6IGZhbHNlLFxuICAgICAgICAgIGFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgdmFyaWFibGVzOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1taXhlZC1lbnVtc1wiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cIjogXCJlcnJvclwiLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1wiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXCI6IFwiZXJyb3JcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblwiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvb25seS10aHJvdy1lcnJvclwiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvclwiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtcGx1cy1vcGVyYW5kc1wiOiBcImVycm9yXCIsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvcmV0dXJuLWF3YWl0XCI6IFtcImVycm9yXCIsIFwiYWx3YXlzXCJdLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXCI6IFwiZXJyb3JcIixcblxuICAgIC4uLmdldFN0cmljdFJ1bGVzKCksXG4gIH0sXG59O1xuXG5jb25zdCB0ZXN0Q29uZmlnID0ge1xuICAuLi5tYWluQ29uZmlnLFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW90ZW1lbi9taW5pbWF0Y2gtY2hlYXQtc2hlZXRcbiAgZmlsZXM6IFtcbiAgICBcIioqL19fdGVzdHNfXy8qKi8qLnt0cyxjdHMsbXRzLHRzeH1cIixcbiAgICBcIioqLyoue3Rlc3Qsc3BlY30ue3RzLGN0cyxtdHMsdHN4fVwiLFxuICBdLFxuICBydWxlczoge1xuICAgIC4uLm1haW5Db25maWcucnVsZXMsXG4gICAgXCJAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcIjogXCJvZmZcIixcbiAgfSxcbn07XG5cbmNvbnN0IGNvbmZpZzogQXJyYXk8dHlwZW9mIG1haW5Db25maWc+ID0gW21haW5Db25maWcsIHRlc3RDb25maWddO1xuY29uc3QgZW1wdHk6IEFycmF5PHR5cGVvZiBtYWluQ29uZmlnPiA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCB0c2NvbmZpZyA/IGNvbmZpZyA6IGVtcHR5O1xuIl19