UNPKG

@git-validator/eslint-config

Version:
222 lines 25 kB
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