@codeperfect/eslint-config 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/.tsbuildinfo CHANGED
@@ -1 +1 @@
1
- {"root":["../src/config-composition.ts","../src/diagnostics.ts","../src/index-spec-helpers.ts","../src/index.ts","../src/module-taxonomy.ts","../src/plugin-loaders.ts","../src/types.ts","../src/utilities.ts","../src/architecture/boundaries.ts","../src/architecture/import-x.ts","../src/architecture/index.ts","../src/configs/index.ts","../src/core/eslint.ts","../src/core/index.ts","../src/core/resolver.ts","../src/core/typescript.ts","../src/docs/comments.ts","../src/docs/index.ts","../src/docs/jsdoc.ts","../src/domain/index.ts","../src/domain/rxjs-x.ts","../src/style/index.ts","../src/style/perfectionist.ts","../src/style/prettier.ts","../src/style/stylistic.ts","../src/style/unicorn.ts","../src/testing/index.ts","../src/testing/jasmine.ts","../src/testing/jest.ts","../src/testing/playwright.ts","../src/testing/vitest.ts","../conventional-changelog-conventionalcommits.d.ts","../eslint-plugin-jasmine.d.ts"],"version":"5.9.3"}
1
+ {"root":["../src/config-composition.ts","../src/diagnostics.ts","../src/index.ts","../src/module-taxonomy.ts","../src/plugin-loaders.ts","../src/types.ts","../src/utilities.ts","../src/architecture/boundaries.ts","../src/architecture/import-x.ts","../src/architecture/index.ts","../src/configs/index.ts","../src/core/eslint.ts","../src/core/index.ts","../src/core/resolver.ts","../src/core/typescript.ts","../src/docs/comments.ts","../src/docs/index.ts","../src/docs/jsdoc-examples.ts","../src/docs/jsdoc-processor.ts","../src/docs/jsdoc.ts","../src/domain/index.ts","../src/domain/rxjs-x.ts","../src/style/index.ts","../src/style/perfectionist.ts","../src/style/prettier.ts","../src/style/stylistic.ts","../src/style/unicorn.ts","../src/testing/index.ts","../src/testing/jasmine.ts","../src/testing/jest.ts","../src/testing/playwright.ts","../src/testing/vitest.ts","../conventional-changelog-conventionalcommits.d.ts","../eslint-plugin-jasmine.d.ts"],"version":"5.9.3"}
@@ -0,0 +1,56 @@
1
+ import type { Linter } from "eslint";
2
+ import type { getJsdocProcessorPlugin as getJsdocProcessorPluginType } from "eslint-plugin-jsdoc";
3
+ import type { parser as parserType, configs as typeScriptConfigsType, plugin as typeScriptPluginType } from "typescript-eslint";
4
+ /** Options for building TypeScript example configs. */
5
+ interface BuildTypeScriptExampleConfigOptions {
6
+ /** Rule overrides that disable typed-only checks for snippets. */
7
+ disableTypeCheckedRules: Linter.RulesRecord;
8
+ /** Upstream processor factory when the plugin exports it. */
9
+ getJsdocProcessorPlugin: JsdocProcessorPluginFactory | undefined;
10
+ /** Parser used for host files and snippet files. */
11
+ parser: Parser;
12
+ /** TypeScript ESLint plugin used by the virtual snippet configs. */
13
+ typeScriptPlugin: TypeScriptPlugin;
14
+ }
15
+ /** Function signature for the JSDoc processor factory. */
16
+ type JsdocProcessorPluginFactory = typeof getJsdocProcessorPluginType;
17
+ /** Parser accepted by the JSDoc example processor. */
18
+ type Parser = typeof parserType;
19
+ /** TypeScript ESLint config map. */
20
+ type TypeScriptConfigs = typeof typeScriptConfigsType;
21
+ /** TypeScript ESLint plugin instance used for snippet-only rule configs. */
22
+ type TypeScriptPlugin = typeof typeScriptPluginType;
23
+ /**
24
+ * Build TypeScript-aware processor configs for JSDoc examples and default expressions.
25
+ * @param options Config input for the TypeScript snippet support.
26
+ * @param options.disableTypeCheckedRules Rule overrides that disable typed-only checks.
27
+ * @param options.getJsdocProcessorPlugin Upstream processor factory when present.
28
+ * @param options.parser Parser used for host files and snippets.
29
+ * @param options.typeScriptPlugin TypeScript ESLint plugin instance.
30
+ * @returns The processor and virtual-file configs.
31
+ * @example
32
+ * console.log(buildTypeScriptExampleConfigs({ disableTypeCheckedRules: {}, getJsdocProcessorPlugin: void 0, parser: {} as Parser, typeScriptPlugin: {} as TypeScriptPlugin }).length);
33
+ */
34
+ declare function buildTypeScriptExampleConfigs({ disableTypeCheckedRules, getJsdocProcessorPlugin, parser, typeScriptPlugin, }: BuildTypeScriptExampleConfigOptions): Linter.Config[];
35
+ /**
36
+ * Resolve the TypeScript rule overrides that disable typed-only linting for snippets.
37
+ * @param typeScriptConfigs The exported TypeScript ESLint config map.
38
+ * @returns The disable-type-checked rule overrides.
39
+ * @example
40
+ * console.log(resolveDisableTypeCheckedRules({ disableTypeChecked: { rules: { example: "off" } } } as TypeScriptConfigs).example);
41
+ */
42
+ declare function resolveDisableTypeCheckedRules(typeScriptConfigs: TypeScriptConfigs): Linter.RulesRecord;
43
+ /**
44
+ * Resolve the optional processor factory from the JSDoc plugin module.
45
+ * @param jsdocModule The loaded JSDoc plugin module.
46
+ * @returns The processor factory when the module exports it.
47
+ * @example
48
+ * console.log(resolveJsdocProcessorPlugin({}) === void 0);
49
+ */
50
+ declare function resolveJsdocProcessorPlugin(jsdocModule: Readonly<{
51
+ /** Optional exported JSDoc processor factory. */
52
+ getJsdocProcessorPlugin?: JsdocProcessorPluginFactory;
53
+ }>): JsdocProcessorPluginFactory | undefined;
54
+ export { buildTypeScriptExampleConfigs, resolveDisableTypeCheckedRules, resolveJsdocProcessorPlugin, };
55
+ export type { Parser, TypeScriptConfigs, TypeScriptPlugin };
56
+ //# sourceMappingURL=jsdoc-examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsdoc-examples.d.ts","sourceRoot":"","sources":["../../src/docs/jsdoc-examples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,uBAAuB,IAAI,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,KAAK,EACV,MAAM,IAAI,UAAU,EACpB,OAAO,IAAI,qBAAqB,EAChC,MAAM,IAAI,oBAAoB,EAC/B,MAAM,mBAAmB,CAAC;AAI3B,uDAAuD;AACvD,UAAU,mCAAmC;IAC3C,kEAAkE;IAClE,uBAAuB,EAAE,MAAM,CAAC,WAAW,CAAC;IAE5C,6DAA6D;IAC7D,uBAAuB,EAAE,2BAA2B,GAAG,SAAS,CAAC;IAEjE,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;IAEf,oEAAoE;IACpE,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,0DAA0D;AAC1D,KAAK,2BAA2B,GAAG,OAAO,2BAA2B,CAAC;AAEtE,sDAAsD;AACtD,KAAK,MAAM,GAAG,OAAO,UAAU,CAAC;AAEhC,oCAAoC;AACpC,KAAK,iBAAiB,GAAG,OAAO,qBAAqB,CAAC;AAEtD,4EAA4E;AAC5E,KAAK,gBAAgB,GAAG,OAAO,oBAAoB,CAAC;AAkFpD;;;;;;;;;;GAUG;AACH,iBAAS,6BAA6B,CAAC,EACrC,uBAAuB,EACvB,uBAAuB,EACvB,MAAM,EACN,gBAAgB,GACjB,EAAE,mCAAmC,GAAG,MAAM,CAAC,MAAM,EAAE,CA4BvD;AAgFD;;;;;;GAMG;AACH,iBAAS,8BAA8B,CACrC,iBAAiB,EAAE,iBAAiB,GACnC,MAAM,CAAC,WAAW,CAGpB;AAED;;;;;;GAMG;AACH,iBAAS,2BAA2B,CAClC,WAAW,EAAE,QAAQ,CAAC;IACpB,iDAAiD;IACjD,uBAAuB,CAAC,EAAE,2BAA2B,CAAC;CACvD,CAAC,GACD,2BAA2B,GAAG,SAAS,CAIzC;AAED,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,2BAA2B,GAC5B,CAAC;AACF,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,186 @@
1
+ import { createWrappedJsdocProcessorPlugin } from "./jsdoc-processor.js";
2
+ /** TypeScript source files that should run through the JSDoc snippet processor. */
3
+ const typeScriptSourceFiles = ["**/*.cts", "**/*.mts", "**/*.ts", "**/*.tsx"];
4
+ /** Virtual example files emitted by the upstream JSDoc processor. */
5
+ const typeScriptExampleFiles = ["**/*.md/*.js"];
6
+ /** Virtual files emitted for JSDoc default-expression checks. */
7
+ const typeScriptDefaultExpressionFiles = [
8
+ "**/*.jsdoc-defaults",
9
+ "**/*.jsdoc-params",
10
+ "**/*.jsdoc-properties",
11
+ ];
12
+ /**
13
+ * Build relaxed rules for extracted default-expression snippets.
14
+ * @returns The snippet rule overrides.
15
+ * @example
16
+ * console.log(buildDefaultExpressionSnippetRules());
17
+ */
18
+ function buildDefaultExpressionSnippetRules() {
19
+ return {
20
+ ...buildExampleSnippetRules(),
21
+ "@stylistic/quotes": ["error", "double"],
22
+ "@stylistic/semi": ["error", "never"],
23
+ "@typescript-eslint/no-unused-expressions": "off",
24
+ "chai-friendly/no-unused-expressions": "off",
25
+ "no-empty-function": "off",
26
+ "no-new": "off",
27
+ "no-unused-expressions": "off",
28
+ strict: "off",
29
+ };
30
+ }
31
+ /**
32
+ * Build relaxed rules for extracted example snippets.
33
+ * @returns The snippet rule overrides.
34
+ * @example
35
+ * console.log(buildExampleSnippetRules());
36
+ */
37
+ function buildExampleSnippetRules() {
38
+ return {
39
+ "@stylistic/eol-last": "off",
40
+ "@stylistic/no-multiple-empty-lines": "off",
41
+ "@stylistic/padded-blocks": "off",
42
+ "@typescript-eslint/no-unused-expressions": "off",
43
+ "@typescript-eslint/no-unused-vars": "off",
44
+ "chai-friendly/no-unused-expressions": "off",
45
+ "import/no-unresolved": "off",
46
+ "import/unambiguous": "off",
47
+ "jsdoc/require-file-overview": "off",
48
+ "jsdoc/require-jsdoc": "off",
49
+ "n/no-missing-import": "off",
50
+ "n/no-missing-require": "off",
51
+ "no-console": "off",
52
+ "no-undef": "off",
53
+ "no-unused-expressions": "off",
54
+ "no-unused-vars": "off",
55
+ "node/no-missing-import": "off",
56
+ "node/no-missing-require": "off",
57
+ };
58
+ }
59
+ /**
60
+ * Build TypeScript-aware processor configs for JSDoc examples and default expressions.
61
+ * @param options Config input for the TypeScript snippet support.
62
+ * @param options.disableTypeCheckedRules Rule overrides that disable typed-only checks.
63
+ * @param options.getJsdocProcessorPlugin Upstream processor factory when present.
64
+ * @param options.parser Parser used for host files and snippets.
65
+ * @param options.typeScriptPlugin TypeScript ESLint plugin instance.
66
+ * @returns The processor and virtual-file configs.
67
+ * @example
68
+ * console.log(buildTypeScriptExampleConfigs({ disableTypeCheckedRules: {}, getJsdocProcessorPlugin: void 0, parser: {} as Parser, typeScriptPlugin: {} as TypeScriptPlugin }).length);
69
+ */
70
+ function buildTypeScriptExampleConfigs({ disableTypeCheckedRules, getJsdocProcessorPlugin, parser, typeScriptPlugin, }) {
71
+ if (getJsdocProcessorPlugin === void 0) {
72
+ return [];
73
+ }
74
+ return [
75
+ buildTypeScriptProcessorConfig(getJsdocProcessorPlugin, parser),
76
+ buildTypeScriptSnippetRuleConfig({
77
+ files: typeScriptExampleFiles,
78
+ name: "jsdoc/typescript-examples/rules",
79
+ parser,
80
+ rules: {
81
+ ...disableTypeCheckedRules,
82
+ ...buildExampleSnippetRules(),
83
+ },
84
+ typeScriptPlugin,
85
+ }),
86
+ buildTypeScriptSnippetRuleConfig({
87
+ files: typeScriptDefaultExpressionFiles,
88
+ name: "jsdoc/typescript-default-expressions/rules",
89
+ parser,
90
+ rules: {
91
+ ...disableTypeCheckedRules,
92
+ ...buildDefaultExpressionSnippetRules(),
93
+ },
94
+ typeScriptPlugin,
95
+ }),
96
+ ];
97
+ }
98
+ /**
99
+ * Build the processor config for TypeScript source files.
100
+ * @param getJsdocProcessorPlugin Upstream JSDoc processor factory.
101
+ * @param parser Parser used for host TypeScript files.
102
+ * @returns The processor-backed ESLint config entry.
103
+ * @example
104
+ * console.log(buildTypeScriptProcessorConfig(((_config) => ({ processors: { examples: {} } })) as JsdocProcessorPluginFactory, {} as Parser).processor);
105
+ */
106
+ function buildTypeScriptProcessorConfig(getJsdocProcessorPlugin, parser) {
107
+ return {
108
+ files: typeScriptSourceFiles,
109
+ name: "jsdoc/typescript-examples-and-default-expressions/processor",
110
+ plugins: {
111
+ examples: createWrappedJsdocProcessorPlugin({
112
+ checkDefaults: true,
113
+ checkParams: true,
114
+ checkProperties: true,
115
+ getJsdocProcessorPlugin,
116
+ parser,
117
+ sourceType: "module",
118
+ }),
119
+ },
120
+ processor: "examples/examples",
121
+ };
122
+ }
123
+ /**
124
+ * Build language options for extracted TypeScript snippets.
125
+ * @param parser Parser used for snippet files.
126
+ * @returns The language options for virtual snippet files.
127
+ * @example
128
+ * console.log(buildTypeScriptSnippetLanguageOptions({} as Parser).sourceType);
129
+ */
130
+ function buildTypeScriptSnippetLanguageOptions(parser) {
131
+ return {
132
+ parser,
133
+ parserOptions: {
134
+ projectService: false,
135
+ },
136
+ sourceType: "module",
137
+ };
138
+ }
139
+ /**
140
+ * Build a TypeScript snippet rule config for virtual files.
141
+ * @param options Config input for the snippet rule block.
142
+ * @param options.files Virtual file globs targeted by the config.
143
+ * @param options.name Config name shown in ESLint diagnostics.
144
+ * @param options.parser Parser used for extracted snippet content.
145
+ * @param options.rules Rule overrides applied to the virtual snippet files.
146
+ * @param options.typeScriptPlugin TypeScript ESLint plugin instance.
147
+ * @returns The ESLint config for the virtual snippet files.
148
+ * @example
149
+ * console.log(buildTypeScriptSnippetRuleConfig({ files: ["virtual-example-file"], name: "example", parser: {} as Parser, rules: {}, typeScriptPlugin: {} as TypeScriptPlugin }).name);
150
+ */
151
+ function buildTypeScriptSnippetRuleConfig({ files, name, parser, rules, typeScriptPlugin, }) {
152
+ return {
153
+ files,
154
+ languageOptions: buildTypeScriptSnippetLanguageOptions(parser),
155
+ name,
156
+ plugins: {
157
+ "@typescript-eslint": typeScriptPlugin,
158
+ },
159
+ rules,
160
+ };
161
+ }
162
+ /**
163
+ * Resolve the TypeScript rule overrides that disable typed-only linting for snippets.
164
+ * @param typeScriptConfigs The exported TypeScript ESLint config map.
165
+ * @returns The disable-type-checked rule overrides.
166
+ * @example
167
+ * console.log(resolveDisableTypeCheckedRules({ disableTypeChecked: { rules: { example: "off" } } } as TypeScriptConfigs).example);
168
+ */
169
+ function resolveDisableTypeCheckedRules(typeScriptConfigs) {
170
+ return (typeScriptConfigs.disableTypeChecked.rules ??
171
+ {});
172
+ }
173
+ /**
174
+ * Resolve the optional processor factory from the JSDoc plugin module.
175
+ * @param jsdocModule The loaded JSDoc plugin module.
176
+ * @returns The processor factory when the module exports it.
177
+ * @example
178
+ * console.log(resolveJsdocProcessorPlugin({}) === void 0);
179
+ */
180
+ function resolveJsdocProcessorPlugin(jsdocModule) {
181
+ return "getJsdocProcessorPlugin" in jsdocModule
182
+ ? jsdocModule.getJsdocProcessorPlugin
183
+ : void 0;
184
+ }
185
+ export { buildTypeScriptExampleConfigs, resolveDisableTypeCheckedRules, resolveJsdocProcessorPlugin, };
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNkb2MtZXhhbXBsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG9jcy9qc2RvYy1leGFtcGxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQStDekUsbUZBQW1GO0FBQ25GLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUU5RSxxRUFBcUU7QUFDckUsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRWhELGlFQUFpRTtBQUNqRSxNQUFNLGdDQUFnQyxHQUFHO0lBQ3ZDLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsdUJBQXVCO0NBQ3hCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILFNBQVMsa0NBQWtDO0lBQ3pDLE9BQU87UUFDTCxHQUFHLHdCQUF3QixFQUFFO1FBQzdCLG1CQUFtQixFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUN4QyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDckMsMENBQTBDLEVBQUUsS0FBSztRQUNqRCxxQ0FBcUMsRUFBRSxLQUFLO1FBQzVDLG1CQUFtQixFQUFFLEtBQUs7UUFDMUIsUUFBUSxFQUFFLEtBQUs7UUFDZix1QkFBdUIsRUFBRSxLQUFLO1FBQzlCLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsd0JBQXdCO0lBQy9CLE9BQU87UUFDTCxxQkFBcUIsRUFBRSxLQUFLO1FBQzVCLG9DQUFvQyxFQUFFLEtBQUs7UUFDM0MsMEJBQTBCLEVBQUUsS0FBSztRQUNqQywwQ0FBMEMsRUFBRSxLQUFLO1FBQ2pELG1DQUFtQyxFQUFFLEtBQUs7UUFDMUMscUNBQXFDLEVBQUUsS0FBSztRQUM1QyxzQkFBc0IsRUFBRSxLQUFLO1FBQzdCLG9CQUFvQixFQUFFLEtBQUs7UUFDM0IsNkJBQTZCLEVBQUUsS0FBSztRQUNwQyxxQkFBcUIsRUFBRSxLQUFLO1FBQzVCLHFCQUFxQixFQUFFLEtBQUs7UUFDNUIsc0JBQXNCLEVBQUUsS0FBSztRQUM3QixZQUFZLEVBQUUsS0FBSztRQUNuQixVQUFVLEVBQUUsS0FBSztRQUNqQix1QkFBdUIsRUFBRSxLQUFLO1FBQzlCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsd0JBQXdCLEVBQUUsS0FBSztRQUMvQix5QkFBeUIsRUFBRSxLQUFLO0tBQ2pDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsNkJBQTZCLENBQUMsRUFDckMsdUJBQXVCLEVBQ3ZCLHVCQUF1QixFQUN2QixNQUFNLEVBQ04sZ0JBQWdCLEdBQ29CO0lBQ3BDLElBQUksdUJBQXVCLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPO1FBQ0wsOEJBQThCLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDO1FBQy9ELGdDQUFnQyxDQUFDO1lBQy9CLEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsSUFBSSxFQUFFLGlDQUFpQztZQUN2QyxNQUFNO1lBQ04sS0FBSyxFQUFFO2dCQUNMLEdBQUcsdUJBQXVCO2dCQUMxQixHQUFHLHdCQUF3QixFQUFFO2FBQzlCO1lBQ0QsZ0JBQWdCO1NBQ2pCLENBQUM7UUFDRixnQ0FBZ0MsQ0FBQztZQUMvQixLQUFLLEVBQUUsZ0NBQWdDO1lBQ3ZDLElBQUksRUFBRSw0Q0FBNEM7WUFDbEQsTUFBTTtZQUNOLEtBQUssRUFBRTtnQkFDTCxHQUFHLHVCQUF1QjtnQkFDMUIsR0FBRyxrQ0FBa0MsRUFBRTthQUN4QztZQUNELGdCQUFnQjtTQUNqQixDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyw4QkFBOEIsQ0FDckMsdUJBQW9ELEVBQ3BELE1BQWM7SUFFZCxPQUFPO1FBQ0wsS0FBSyxFQUFFLHFCQUFxQjtRQUM1QixJQUFJLEVBQUUsNkRBQTZEO1FBQ25FLE9BQU8sRUFBRTtZQUNQLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQztnQkFDMUMsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixlQUFlLEVBQUUsSUFBSTtnQkFDckIsdUJBQXVCO2dCQUN2QixNQUFNO2dCQUNOLFVBQVUsRUFBRSxRQUFRO2FBQ3JCLENBQUM7U0FDSDtRQUNELFNBQVMsRUFBRSxtQkFBbUI7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFDQUFxQyxDQUM1QyxNQUFjO0lBRWQsT0FBTztRQUNMLE1BQU07UUFDTixhQUFhLEVBQUU7WUFDYixjQUFjLEVBQUUsS0FBSztTQUN0QjtRQUNELFVBQVUsRUFBRSxRQUFRO0tBQ3JCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLGdDQUFnQyxDQUFDLEVBQ3hDLEtBQUssRUFDTCxJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFDTCxnQkFBZ0IsR0FDbUI7SUFDbkMsT0FBTztRQUNMLEtBQUs7UUFDTCxlQUFlLEVBQUUscUNBQXFDLENBQUMsTUFBTSxDQUFDO1FBQzlELElBQUk7UUFDSixPQUFPLEVBQUU7WUFDUCxvQkFBb0IsRUFBRSxnQkFBZ0I7U0FDdkM7UUFDRCxLQUFLO0tBQ04sQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLDhCQUE4QixDQUNyQyxpQkFBb0M7SUFFcEMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLEtBQUs7UUFDaEQsRUFBRSxDQUF1QixDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLDJCQUEyQixDQUNsQyxXQUdFO0lBRUYsT0FBTyx5QkFBeUIsSUFBSSxXQUFXO1FBQzdDLENBQUMsQ0FBQyxXQUFXLENBQUMsdUJBQXVCO1FBQ3JDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNiLENBQUM7QUFFRCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDhCQUE4QixFQUM5QiwyQkFBMkIsR0FDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGludGVyIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IHR5cGUgeyBnZXRKc2RvY1Byb2Nlc3NvclBsdWdpbiBhcyBnZXRKc2RvY1Byb2Nlc3NvclBsdWdpblR5cGUgfSBmcm9tIFwiZXNsaW50LXBsdWdpbi1qc2RvY1wiO1xuaW1wb3J0IHR5cGUge1xuICBwYXJzZXIgYXMgcGFyc2VyVHlwZSxcbiAgY29uZmlncyBhcyB0eXBlU2NyaXB0Q29uZmlnc1R5cGUsXG4gIHBsdWdpbiBhcyB0eXBlU2NyaXB0UGx1Z2luVHlwZSxcbn0gZnJvbSBcInR5cGVzY3JpcHQtZXNsaW50XCI7XG5cbmltcG9ydCB7IGNyZWF0ZVdyYXBwZWRKc2RvY1Byb2Nlc3NvclBsdWdpbiB9IGZyb20gXCIuL2pzZG9jLXByb2Nlc3Nvci5qc1wiO1xuXG4vKiogT3B0aW9ucyBmb3IgYnVpbGRpbmcgVHlwZVNjcmlwdCBleGFtcGxlIGNvbmZpZ3MuICovXG5pbnRlcmZhY2UgQnVpbGRUeXBlU2NyaXB0RXhhbXBsZUNvbmZpZ09wdGlvbnMge1xuICAvKiogUnVsZSBvdmVycmlkZXMgdGhhdCBkaXNhYmxlIHR5cGVkLW9ubHkgY2hlY2tzIGZvciBzbmlwcGV0cy4gKi9cbiAgZGlzYWJsZVR5cGVDaGVja2VkUnVsZXM6IExpbnRlci5SdWxlc1JlY29yZDtcblxuICAvKiogVXBzdHJlYW0gcHJvY2Vzc29yIGZhY3Rvcnkgd2hlbiB0aGUgcGx1Z2luIGV4cG9ydHMgaXQuICovXG4gIGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luOiBKc2RvY1Byb2Nlc3NvclBsdWdpbkZhY3RvcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFBhcnNlciB1c2VkIGZvciBob3N0IGZpbGVzIGFuZCBzbmlwcGV0IGZpbGVzLiAqL1xuICBwYXJzZXI6IFBhcnNlcjtcblxuICAvKiogVHlwZVNjcmlwdCBFU0xpbnQgcGx1Z2luIHVzZWQgYnkgdGhlIHZpcnR1YWwgc25pcHBldCBjb25maWdzLiAqL1xuICB0eXBlU2NyaXB0UGx1Z2luOiBUeXBlU2NyaXB0UGx1Z2luO1xufVxuXG4vKiogRnVuY3Rpb24gc2lnbmF0dXJlIGZvciB0aGUgSlNEb2MgcHJvY2Vzc29yIGZhY3RvcnkuICovXG50eXBlIEpzZG9jUHJvY2Vzc29yUGx1Z2luRmFjdG9yeSA9IHR5cGVvZiBnZXRKc2RvY1Byb2Nlc3NvclBsdWdpblR5cGU7XG5cbi8qKiBQYXJzZXIgYWNjZXB0ZWQgYnkgdGhlIEpTRG9jIGV4YW1wbGUgcHJvY2Vzc29yLiAqL1xudHlwZSBQYXJzZXIgPSB0eXBlb2YgcGFyc2VyVHlwZTtcblxuLyoqIFR5cGVTY3JpcHQgRVNMaW50IGNvbmZpZyBtYXAuICovXG50eXBlIFR5cGVTY3JpcHRDb25maWdzID0gdHlwZW9mIHR5cGVTY3JpcHRDb25maWdzVHlwZTtcblxuLyoqIFR5cGVTY3JpcHQgRVNMaW50IHBsdWdpbiBpbnN0YW5jZSB1c2VkIGZvciBzbmlwcGV0LW9ubHkgcnVsZSBjb25maWdzLiAqL1xudHlwZSBUeXBlU2NyaXB0UGx1Z2luID0gdHlwZW9mIHR5cGVTY3JpcHRQbHVnaW5UeXBlO1xuXG4vKiogT3B0aW9ucyBmb3IgYSBUeXBlU2NyaXB0IHZpcnR1YWwgc25pcHBldCBydWxlIGNvbmZpZy4gKi9cbmludGVyZmFjZSBUeXBlU2NyaXB0U25pcHBldFJ1bGVDb25maWdPcHRpb25zIHtcbiAgLyoqIFZpcnR1YWwgZmlsZSBnbG9icyB0YXJnZXRlZCBieSB0aGUgY29uZmlnLiAqL1xuICBmaWxlczogc3RyaW5nW107XG5cbiAgLyoqIENvbmZpZyBuYW1lIHNob3duIGluIEVTTGludCBkaWFnbm9zdGljcy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBQYXJzZXIgdXNlZCBmb3IgdGhlIGV4dHJhY3RlZCBzbmlwcGV0IGNvbnRlbnQuICovXG4gIHBhcnNlcjogUGFyc2VyO1xuXG4gIC8qKiBSdWxlIG92ZXJyaWRlcyBhcHBsaWVkIHRvIHRoZSBleHRyYWN0ZWQgc25pcHBldCBmaWxlcy4gKi9cbiAgcnVsZXM6IExpbnRlci5SdWxlc1JlY29yZDtcblxuICAvKiogVHlwZVNjcmlwdCBFU0xpbnQgcGx1Z2luIGluc3RhbmNlLiAqL1xuICB0eXBlU2NyaXB0UGx1Z2luOiBUeXBlU2NyaXB0UGx1Z2luO1xufVxuXG4vKiogVHlwZVNjcmlwdCBzb3VyY2UgZmlsZXMgdGhhdCBzaG91bGQgcnVuIHRocm91Z2ggdGhlIEpTRG9jIHNuaXBwZXQgcHJvY2Vzc29yLiAqL1xuY29uc3QgdHlwZVNjcmlwdFNvdXJjZUZpbGVzID0gW1wiKiovKi5jdHNcIiwgXCIqKi8qLm10c1wiLCBcIioqLyoudHNcIiwgXCIqKi8qLnRzeFwiXTtcblxuLyoqIFZpcnR1YWwgZXhhbXBsZSBmaWxlcyBlbWl0dGVkIGJ5IHRoZSB1cHN0cmVhbSBKU0RvYyBwcm9jZXNzb3IuICovXG5jb25zdCB0eXBlU2NyaXB0RXhhbXBsZUZpbGVzID0gW1wiKiovKi5tZC8qLmpzXCJdO1xuXG4vKiogVmlydHVhbCBmaWxlcyBlbWl0dGVkIGZvciBKU0RvYyBkZWZhdWx0LWV4cHJlc3Npb24gY2hlY2tzLiAqL1xuY29uc3QgdHlwZVNjcmlwdERlZmF1bHRFeHByZXNzaW9uRmlsZXMgPSBbXG4gIFwiKiovKi5qc2RvYy1kZWZhdWx0c1wiLFxuICBcIioqLyouanNkb2MtcGFyYW1zXCIsXG4gIFwiKiovKi5qc2RvYy1wcm9wZXJ0aWVzXCIsXG5dO1xuXG4vKipcbiAqIEJ1aWxkIHJlbGF4ZWQgcnVsZXMgZm9yIGV4dHJhY3RlZCBkZWZhdWx0LWV4cHJlc3Npb24gc25pcHBldHMuXG4gKiBAcmV0dXJucyBUaGUgc25pcHBldCBydWxlIG92ZXJyaWRlcy5cbiAqIEBleGFtcGxlXG4gKiBjb25zb2xlLmxvZyhidWlsZERlZmF1bHRFeHByZXNzaW9uU25pcHBldFJ1bGVzKCkpO1xuICovXG5mdW5jdGlvbiBidWlsZERlZmF1bHRFeHByZXNzaW9uU25pcHBldFJ1bGVzKCk6IExpbnRlci5SdWxlc1JlY29yZCB7XG4gIHJldHVybiB7XG4gICAgLi4uYnVpbGRFeGFtcGxlU25pcHBldFJ1bGVzKCksXG4gICAgXCJAc3R5bGlzdGljL3F1b3Rlc1wiOiBbXCJlcnJvclwiLCBcImRvdWJsZVwiXSxcbiAgICBcIkBzdHlsaXN0aWMvc2VtaVwiOiBbXCJlcnJvclwiLCBcIm5ldmVyXCJdLFxuICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1wiOiBcIm9mZlwiLFxuICAgIFwiY2hhaS1mcmllbmRseS9uby11bnVzZWQtZXhwcmVzc2lvbnNcIjogXCJvZmZcIixcbiAgICBcIm5vLWVtcHR5LWZ1bmN0aW9uXCI6IFwib2ZmXCIsXG4gICAgXCJuby1uZXdcIjogXCJvZmZcIixcbiAgICBcIm5vLXVudXNlZC1leHByZXNzaW9uc1wiOiBcIm9mZlwiLFxuICAgIHN0cmljdDogXCJvZmZcIixcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCByZWxheGVkIHJ1bGVzIGZvciBleHRyYWN0ZWQgZXhhbXBsZSBzbmlwcGV0cy5cbiAqIEByZXR1cm5zIFRoZSBzbmlwcGV0IHJ1bGUgb3ZlcnJpZGVzLlxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKGJ1aWxkRXhhbXBsZVNuaXBwZXRSdWxlcygpKTtcbiAqL1xuZnVuY3Rpb24gYnVpbGRFeGFtcGxlU25pcHBldFJ1bGVzKCk6IExpbnRlci5SdWxlc1JlY29yZCB7XG4gIHJldHVybiB7XG4gICAgXCJAc3R5bGlzdGljL2VvbC1sYXN0XCI6IFwib2ZmXCIsXG4gICAgXCJAc3R5bGlzdGljL25vLW11bHRpcGxlLWVtcHR5LWxpbmVzXCI6IFwib2ZmXCIsXG4gICAgXCJAc3R5bGlzdGljL3BhZGRlZC1ibG9ja3NcIjogXCJvZmZcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtZXhwcmVzc2lvbnNcIjogXCJvZmZcIixcbiAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1wiOiBcIm9mZlwiLFxuICAgIFwiY2hhaS1mcmllbmRseS9uby11bnVzZWQtZXhwcmVzc2lvbnNcIjogXCJvZmZcIixcbiAgICBcImltcG9ydC9uby11bnJlc29sdmVkXCI6IFwib2ZmXCIsXG4gICAgXCJpbXBvcnQvdW5hbWJpZ3VvdXNcIjogXCJvZmZcIixcbiAgICBcImpzZG9jL3JlcXVpcmUtZmlsZS1vdmVydmlld1wiOiBcIm9mZlwiLFxuICAgIFwianNkb2MvcmVxdWlyZS1qc2RvY1wiOiBcIm9mZlwiLFxuICAgIFwibi9uby1taXNzaW5nLWltcG9ydFwiOiBcIm9mZlwiLFxuICAgIFwibi9uby1taXNzaW5nLXJlcXVpcmVcIjogXCJvZmZcIixcbiAgICBcIm5vLWNvbnNvbGVcIjogXCJvZmZcIixcbiAgICBcIm5vLXVuZGVmXCI6IFwib2ZmXCIsXG4gICAgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIjogXCJvZmZcIixcbiAgICBcIm5vLXVudXNlZC12YXJzXCI6IFwib2ZmXCIsXG4gICAgXCJub2RlL25vLW1pc3NpbmctaW1wb3J0XCI6IFwib2ZmXCIsXG4gICAgXCJub2RlL25vLW1pc3NpbmctcmVxdWlyZVwiOiBcIm9mZlwiLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIFR5cGVTY3JpcHQtYXdhcmUgcHJvY2Vzc29yIGNvbmZpZ3MgZm9yIEpTRG9jIGV4YW1wbGVzIGFuZCBkZWZhdWx0IGV4cHJlc3Npb25zLlxuICogQHBhcmFtIG9wdGlvbnMgQ29uZmlnIGlucHV0IGZvciB0aGUgVHlwZVNjcmlwdCBzbmlwcGV0IHN1cHBvcnQuXG4gKiBAcGFyYW0gb3B0aW9ucy5kaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyBSdWxlIG92ZXJyaWRlcyB0aGF0IGRpc2FibGUgdHlwZWQtb25seSBjaGVja3MuXG4gKiBAcGFyYW0gb3B0aW9ucy5nZXRKc2RvY1Byb2Nlc3NvclBsdWdpbiBVcHN0cmVhbSBwcm9jZXNzb3IgZmFjdG9yeSB3aGVuIHByZXNlbnQuXG4gKiBAcGFyYW0gb3B0aW9ucy5wYXJzZXIgUGFyc2VyIHVzZWQgZm9yIGhvc3QgZmlsZXMgYW5kIHNuaXBwZXRzLlxuICogQHBhcmFtIG9wdGlvbnMudHlwZVNjcmlwdFBsdWdpbiBUeXBlU2NyaXB0IEVTTGludCBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc29yIGFuZCB2aXJ0dWFsLWZpbGUgY29uZmlncy5cbiAqIEBleGFtcGxlXG4gKiBjb25zb2xlLmxvZyhidWlsZFR5cGVTY3JpcHRFeGFtcGxlQ29uZmlncyh7IGRpc2FibGVUeXBlQ2hlY2tlZFJ1bGVzOiB7fSwgZ2V0SnNkb2NQcm9jZXNzb3JQbHVnaW46IHZvaWQgMCwgcGFyc2VyOiB7fSBhcyBQYXJzZXIsIHR5cGVTY3JpcHRQbHVnaW46IHt9IGFzIFR5cGVTY3JpcHRQbHVnaW4gfSkubGVuZ3RoKTtcbiAqL1xuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0RXhhbXBsZUNvbmZpZ3Moe1xuICBkaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyxcbiAgZ2V0SnNkb2NQcm9jZXNzb3JQbHVnaW4sXG4gIHBhcnNlcixcbiAgdHlwZVNjcmlwdFBsdWdpbixcbn06IEJ1aWxkVHlwZVNjcmlwdEV4YW1wbGVDb25maWdPcHRpb25zKTogTGludGVyLkNvbmZpZ1tdIHtcbiAgaWYgKGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGJ1aWxkVHlwZVNjcmlwdFByb2Nlc3NvckNvbmZpZyhnZXRKc2RvY1Byb2Nlc3NvclBsdWdpbiwgcGFyc2VyKSxcbiAgICBidWlsZFR5cGVTY3JpcHRTbmlwcGV0UnVsZUNvbmZpZyh7XG4gICAgICBmaWxlczogdHlwZVNjcmlwdEV4YW1wbGVGaWxlcyxcbiAgICAgIG5hbWU6IFwianNkb2MvdHlwZXNjcmlwdC1leGFtcGxlcy9ydWxlc1wiLFxuICAgICAgcGFyc2VyLFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgLi4uZGlzYWJsZVR5cGVDaGVja2VkUnVsZXMsXG4gICAgICAgIC4uLmJ1aWxkRXhhbXBsZVNuaXBwZXRSdWxlcygpLFxuICAgICAgfSxcbiAgICAgIHR5cGVTY3JpcHRQbHVnaW4sXG4gICAgfSksXG4gICAgYnVpbGRUeXBlU2NyaXB0U25pcHBldFJ1bGVDb25maWcoe1xuICAgICAgZmlsZXM6IHR5cGVTY3JpcHREZWZhdWx0RXhwcmVzc2lvbkZpbGVzLFxuICAgICAgbmFtZTogXCJqc2RvYy90eXBlc2NyaXB0LWRlZmF1bHQtZXhwcmVzc2lvbnMvcnVsZXNcIixcbiAgICAgIHBhcnNlcixcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgIC4uLmRpc2FibGVUeXBlQ2hlY2tlZFJ1bGVzLFxuICAgICAgICAuLi5idWlsZERlZmF1bHRFeHByZXNzaW9uU25pcHBldFJ1bGVzKCksXG4gICAgICB9LFxuICAgICAgdHlwZVNjcmlwdFBsdWdpbixcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcHJvY2Vzc29yIGNvbmZpZyBmb3IgVHlwZVNjcmlwdCBzb3VyY2UgZmlsZXMuXG4gKiBAcGFyYW0gZ2V0SnNkb2NQcm9jZXNzb3JQbHVnaW4gVXBzdHJlYW0gSlNEb2MgcHJvY2Vzc29yIGZhY3RvcnkuXG4gKiBAcGFyYW0gcGFyc2VyIFBhcnNlciB1c2VkIGZvciBob3N0IFR5cGVTY3JpcHQgZmlsZXMuXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc29yLWJhY2tlZCBFU0xpbnQgY29uZmlnIGVudHJ5LlxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKGJ1aWxkVHlwZVNjcmlwdFByb2Nlc3NvckNvbmZpZygoKF9jb25maWcpID0+ICh7IHByb2Nlc3NvcnM6IHsgZXhhbXBsZXM6IHt9IH0gfSkpIGFzIEpzZG9jUHJvY2Vzc29yUGx1Z2luRmFjdG9yeSwge30gYXMgUGFyc2VyKS5wcm9jZXNzb3IpO1xuICovXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRQcm9jZXNzb3JDb25maWcoXG4gIGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luOiBKc2RvY1Byb2Nlc3NvclBsdWdpbkZhY3RvcnksXG4gIHBhcnNlcjogUGFyc2VyLFxuKTogTGludGVyLkNvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgZmlsZXM6IHR5cGVTY3JpcHRTb3VyY2VGaWxlcyxcbiAgICBuYW1lOiBcImpzZG9jL3R5cGVzY3JpcHQtZXhhbXBsZXMtYW5kLWRlZmF1bHQtZXhwcmVzc2lvbnMvcHJvY2Vzc29yXCIsXG4gICAgcGx1Z2luczoge1xuICAgICAgZXhhbXBsZXM6IGNyZWF0ZVdyYXBwZWRKc2RvY1Byb2Nlc3NvclBsdWdpbih7XG4gICAgICAgIGNoZWNrRGVmYXVsdHM6IHRydWUsXG4gICAgICAgIGNoZWNrUGFyYW1zOiB0cnVlLFxuICAgICAgICBjaGVja1Byb3BlcnRpZXM6IHRydWUsXG4gICAgICAgIGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIsXG4gICAgICB9KSxcbiAgICB9LFxuICAgIHByb2Nlc3NvcjogXCJleGFtcGxlcy9leGFtcGxlc1wiLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGxhbmd1YWdlIG9wdGlvbnMgZm9yIGV4dHJhY3RlZCBUeXBlU2NyaXB0IHNuaXBwZXRzLlxuICogQHBhcmFtIHBhcnNlciBQYXJzZXIgdXNlZCBmb3Igc25pcHBldCBmaWxlcy5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZSBvcHRpb25zIGZvciB2aXJ0dWFsIHNuaXBwZXQgZmlsZXMuXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coYnVpbGRUeXBlU2NyaXB0U25pcHBldExhbmd1YWdlT3B0aW9ucyh7fSBhcyBQYXJzZXIpLnNvdXJjZVR5cGUpO1xuICovXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRTbmlwcGV0TGFuZ3VhZ2VPcHRpb25zKFxuICBwYXJzZXI6IFBhcnNlcixcbik6IE5vbk51bGxhYmxlPExpbnRlci5Db25maWdbXCJsYW5ndWFnZU9wdGlvbnNcIl0+IHtcbiAgcmV0dXJuIHtcbiAgICBwYXJzZXIsXG4gICAgcGFyc2VyT3B0aW9uczoge1xuICAgICAgcHJvamVjdFNlcnZpY2U6IGZhbHNlLFxuICAgIH0sXG4gICAgc291cmNlVHlwZTogXCJtb2R1bGVcIixcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFR5cGVTY3JpcHQgc25pcHBldCBydWxlIGNvbmZpZyBmb3IgdmlydHVhbCBmaWxlcy5cbiAqIEBwYXJhbSBvcHRpb25zIENvbmZpZyBpbnB1dCBmb3IgdGhlIHNuaXBwZXQgcnVsZSBibG9jay5cbiAqIEBwYXJhbSBvcHRpb25zLmZpbGVzIFZpcnR1YWwgZmlsZSBnbG9icyB0YXJnZXRlZCBieSB0aGUgY29uZmlnLlxuICogQHBhcmFtIG9wdGlvbnMubmFtZSBDb25maWcgbmFtZSBzaG93biBpbiBFU0xpbnQgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0gb3B0aW9ucy5wYXJzZXIgUGFyc2VyIHVzZWQgZm9yIGV4dHJhY3RlZCBzbmlwcGV0IGNvbnRlbnQuXG4gKiBAcGFyYW0gb3B0aW9ucy5ydWxlcyBSdWxlIG92ZXJyaWRlcyBhcHBsaWVkIHRvIHRoZSB2aXJ0dWFsIHNuaXBwZXQgZmlsZXMuXG4gKiBAcGFyYW0gb3B0aW9ucy50eXBlU2NyaXB0UGx1Z2luIFR5cGVTY3JpcHQgRVNMaW50IHBsdWdpbiBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBFU0xpbnQgY29uZmlnIGZvciB0aGUgdmlydHVhbCBzbmlwcGV0IGZpbGVzLlxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKGJ1aWxkVHlwZVNjcmlwdFNuaXBwZXRSdWxlQ29uZmlnKHsgZmlsZXM6IFtcInZpcnR1YWwtZXhhbXBsZS1maWxlXCJdLCBuYW1lOiBcImV4YW1wbGVcIiwgcGFyc2VyOiB7fSBhcyBQYXJzZXIsIHJ1bGVzOiB7fSwgdHlwZVNjcmlwdFBsdWdpbjoge30gYXMgVHlwZVNjcmlwdFBsdWdpbiB9KS5uYW1lKTtcbiAqL1xuZnVuY3Rpb24gYnVpbGRUeXBlU2NyaXB0U25pcHBldFJ1bGVDb25maWcoe1xuICBmaWxlcyxcbiAgbmFtZSxcbiAgcGFyc2VyLFxuICBydWxlcyxcbiAgdHlwZVNjcmlwdFBsdWdpbixcbn06IFR5cGVTY3JpcHRTbmlwcGV0UnVsZUNvbmZpZ09wdGlvbnMpOiBMaW50ZXIuQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBmaWxlcyxcbiAgICBsYW5ndWFnZU9wdGlvbnM6IGJ1aWxkVHlwZVNjcmlwdFNuaXBwZXRMYW5ndWFnZU9wdGlvbnMocGFyc2VyKSxcbiAgICBuYW1lLFxuICAgIHBsdWdpbnM6IHtcbiAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50XCI6IHR5cGVTY3JpcHRQbHVnaW4sXG4gICAgfSxcbiAgICBydWxlcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBUeXBlU2NyaXB0IHJ1bGUgb3ZlcnJpZGVzIHRoYXQgZGlzYWJsZSB0eXBlZC1vbmx5IGxpbnRpbmcgZm9yIHNuaXBwZXRzLlxuICogQHBhcmFtIHR5cGVTY3JpcHRDb25maWdzIFRoZSBleHBvcnRlZCBUeXBlU2NyaXB0IEVTTGludCBjb25maWcgbWFwLlxuICogQHJldHVybnMgVGhlIGRpc2FibGUtdHlwZS1jaGVja2VkIHJ1bGUgb3ZlcnJpZGVzLlxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKHJlc29sdmVEaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyh7IGRpc2FibGVUeXBlQ2hlY2tlZDogeyBydWxlczogeyBleGFtcGxlOiBcIm9mZlwiIH0gfSB9IGFzIFR5cGVTY3JpcHRDb25maWdzKS5leGFtcGxlKTtcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZURpc2FibGVUeXBlQ2hlY2tlZFJ1bGVzKFxuICB0eXBlU2NyaXB0Q29uZmlnczogVHlwZVNjcmlwdENvbmZpZ3MsXG4pOiBMaW50ZXIuUnVsZXNSZWNvcmQge1xuICByZXR1cm4gKHR5cGVTY3JpcHRDb25maWdzLmRpc2FibGVUeXBlQ2hlY2tlZC5ydWxlcyA/P1xuICAgIHt9KSBhcyBMaW50ZXIuUnVsZXNSZWNvcmQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgb3B0aW9uYWwgcHJvY2Vzc29yIGZhY3RvcnkgZnJvbSB0aGUgSlNEb2MgcGx1Z2luIG1vZHVsZS5cbiAqIEBwYXJhbSBqc2RvY01vZHVsZSBUaGUgbG9hZGVkIEpTRG9jIHBsdWdpbiBtb2R1bGUuXG4gKiBAcmV0dXJucyBUaGUgcHJvY2Vzc29yIGZhY3Rvcnkgd2hlbiB0aGUgbW9kdWxlIGV4cG9ydHMgaXQuXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2cocmVzb2x2ZUpzZG9jUHJvY2Vzc29yUGx1Z2luKHt9KSA9PT0gdm9pZCAwKTtcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUpzZG9jUHJvY2Vzc29yUGx1Z2luKFxuICBqc2RvY01vZHVsZTogUmVhZG9ubHk8e1xuICAgIC8qKiBPcHRpb25hbCBleHBvcnRlZCBKU0RvYyBwcm9jZXNzb3IgZmFjdG9yeS4gKi9cbiAgICBnZXRKc2RvY1Byb2Nlc3NvclBsdWdpbj86IEpzZG9jUHJvY2Vzc29yUGx1Z2luRmFjdG9yeTtcbiAgfT4sXG4pOiBKc2RvY1Byb2Nlc3NvclBsdWdpbkZhY3RvcnkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gXCJnZXRKc2RvY1Byb2Nlc3NvclBsdWdpblwiIGluIGpzZG9jTW9kdWxlXG4gICAgPyBqc2RvY01vZHVsZS5nZXRKc2RvY1Byb2Nlc3NvclBsdWdpblxuICAgIDogdm9pZCAwO1xufVxuXG5leHBvcnQge1xuICBidWlsZFR5cGVTY3JpcHRFeGFtcGxlQ29uZmlncyxcbiAgcmVzb2x2ZURpc2FibGVUeXBlQ2hlY2tlZFJ1bGVzLFxuICByZXNvbHZlSnNkb2NQcm9jZXNzb3JQbHVnaW4sXG59O1xuZXhwb3J0IHR5cGUgeyBQYXJzZXIsIFR5cGVTY3JpcHRDb25maWdzLCBUeXBlU2NyaXB0UGx1Z2luIH07XG4iXX0=
@@ -0,0 +1,63 @@
1
+ import type { Linter } from "eslint";
2
+ import type { getJsdocProcessorPlugin as getJsdocProcessorPluginType } from "eslint-plugin-jsdoc";
3
+ import type { parser as parserType } from "typescript-eslint";
4
+ /** Options for creating the wrapped JSDoc processor plugin. */
5
+ interface CreateWrappedJsdocProcessorPluginOptions {
6
+ /** Whether to lint default value snippets. */
7
+ checkDefaults: boolean;
8
+ /** Whether to lint parameter default snippets. */
9
+ checkParams: boolean;
10
+ /** Whether to lint property default snippets. */
11
+ checkProperties: boolean;
12
+ /** Upstream JSDoc processor factory. */
13
+ getJsdocProcessorPlugin: JsdocProcessorPluginFactory;
14
+ /** Parser passed through to the upstream processor. */
15
+ parser: Parser;
16
+ /** Source type for extracted snippets. */
17
+ sourceType: "module" | "script";
18
+ }
19
+ /** Minimal upstream example processor contract used by the wrapper. */
20
+ interface IExampleProcessor {
21
+ /** Optional processor metadata. */
22
+ meta?: IProcessorMeta;
23
+ /** Remap virtual-file lint messages back onto the host file. */
24
+ postprocess: (messages: Linter.LintMessage[][], filename: string) => Linter.LintMessage[];
25
+ /** Extract virtual snippet files from a host file. */
26
+ preprocess: (text: string, filename: string) => ProcessorFile[];
27
+ /** Whether the upstream processor supports autofix. */
28
+ supportsAutofix?: boolean;
29
+ }
30
+ /** Minimal meta shape used by the wrapped processor. */
31
+ interface IProcessorMeta {
32
+ /** Processor name shown to ESLint. */
33
+ name?: string;
34
+ /** Processor version shown to ESLint. */
35
+ version?: string;
36
+ }
37
+ /** Minimal upstream plugin contract used by the wrapper. */
38
+ interface IProcessorPlugin {
39
+ /** Optional plugin metadata. */
40
+ meta?: IProcessorMeta;
41
+ /** Available processors exported by the plugin. */
42
+ processors?: {
43
+ /** JSDoc example/default-expression processor. */
44
+ examples?: Partial<IExampleProcessor>;
45
+ };
46
+ }
47
+ /** Function signature for the upstream JSDoc processor factory. */
48
+ type JsdocProcessorPluginFactory = typeof getJsdocProcessorPluginType;
49
+ /** Parser accepted by the upstream JSDoc processor. */
50
+ type Parser = typeof parserType;
51
+ /** Virtual files emitted by a processor preprocess step. */
52
+ type ProcessorFile = Linter.ProcessorFile | string;
53
+ /**
54
+ * Create a wrapped JSDoc processor plugin with per-file upstream isolation.
55
+ * @param options The wrapper options.
56
+ * @returns A plugin whose examples processor uses fresh upstream state per file.
57
+ * @example
58
+ * console.log(createWrappedJsdocProcessorPlugin({ checkDefaults: true, checkParams: true, checkProperties: true, getJsdocProcessorPlugin: (() => ({ processors: { examples: {} } })) as JsdocProcessorPluginFactory, parser: {} as Parser, sourceType: "module" }).processors?.examples !== void 0);
59
+ */
60
+ declare function createWrappedJsdocProcessorPlugin(options: CreateWrappedJsdocProcessorPluginOptions): IProcessorPlugin;
61
+ export { createWrappedJsdocProcessorPlugin };
62
+ export type { JsdocProcessorPluginFactory, Parser };
63
+ //# sourceMappingURL=jsdoc-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsdoc-processor.d.ts","sourceRoot":"","sources":["../../src/docs/jsdoc-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,uBAAuB,IAAI,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE9D,+DAA+D;AAC/D,UAAU,wCAAwC;IAChD,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IAEvB,kDAAkD;IAClD,WAAW,EAAE,OAAO,CAAC;IAErB,iDAAiD;IACjD,eAAe,EAAE,OAAO,CAAC;IAEzB,wCAAwC;IACxC,uBAAuB,EAAE,2BAA2B,CAAC;IAErD,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IAEf,0CAA0C;IAC1C,UAAU,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACjC;AAED,uEAAuE;AACvE,UAAU,iBAAiB;IACzB,mCAAmC;IACnC,IAAI,CAAC,EAAE,cAAc,CAAC;IAEtB,gEAAgE;IAChE,WAAW,EAAE,CACX,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,EAChC,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,WAAW,EAAE,CAAC;IAE1B,sDAAsD;IACtD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,aAAa,EAAE,CAAC;IAEhE,uDAAuD;IACvD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wDAAwD;AACxD,UAAU,cAAc;IACtB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,4DAA4D;AAC5D,UAAU,gBAAgB;IACxB,gCAAgC;IAChC,IAAI,CAAC,EAAE,cAAc,CAAC;IAEtB,mDAAmD;IACnD,UAAU,CAAC,EAAE;QACX,kDAAkD;QAClD,QAAQ,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;KACvC,CAAC;CACH;AAED,mEAAmE;AACnE,KAAK,2BAA2B,GAAG,OAAO,2BAA2B,CAAC;AAEtE,uDAAuD;AACvD,KAAK,MAAM,GAAG,OAAO,UAAU,CAAC;AAEhC,4DAA4D;AAC5D,KAAK,aAAa,GAAG,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;AAwBnD;;;;;;GAMG;AACH,iBAAS,iCAAiC,CACxC,OAAO,EAAE,wCAAwC,GAChD,gBAAgB,CA0ClB;AA2FD,OAAO,EAAE,iCAAiC,EAAE,CAAC;AAC7C,YAAY,EAAE,2BAA2B,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Build the options object forwarded to the upstream processor factory.
3
+ * @param options The wrapper options.
4
+ * @returns A shallow options object for the upstream processor.
5
+ * @example
6
+ * console.log(buildUpstreamProcessorOptions({ checkDefaults: true, checkParams: true, checkProperties: true, getJsdocProcessorPlugin: (() => ({ processors: { examples: {} } })) as JsdocProcessorPluginFactory, parser: {} as Parser, sourceType: "module" }).sourceType);
7
+ */
8
+ function buildUpstreamProcessorOptions(options) {
9
+ return {
10
+ checkDefaults: options.checkDefaults,
11
+ checkParams: options.checkParams,
12
+ checkProperties: options.checkProperties,
13
+ parser: options.parser,
14
+ sourceType: options.sourceType,
15
+ };
16
+ }
17
+ /**
18
+ * Create a wrapped JSDoc processor plugin with per-file upstream isolation.
19
+ * @param options The wrapper options.
20
+ * @returns A plugin whose examples processor uses fresh upstream state per file.
21
+ * @example
22
+ * console.log(createWrappedJsdocProcessorPlugin({ checkDefaults: true, checkParams: true, checkProperties: true, getJsdocProcessorPlugin: (() => ({ processors: { examples: {} } })) as JsdocProcessorPluginFactory, parser: {} as Parser, sourceType: "module" }).processors?.examples !== void 0);
23
+ */
24
+ function createWrappedJsdocProcessorPlugin(options) {
25
+ const upstreamOptions = buildUpstreamProcessorOptions(options);
26
+ const basePlugin = options.getJsdocProcessorPlugin(upstreamOptions);
27
+ const baseProcessor = resolveExamplesProcessor(basePlugin, false);
28
+ const processorsByFilename = new Map();
29
+ return {
30
+ ...(basePlugin.meta === void 0 ? {} : { meta: basePlugin.meta }),
31
+ processors: {
32
+ examples: {
33
+ ...(baseProcessor.meta === void 0 ? {} : { meta: baseProcessor.meta }),
34
+ postprocess(messages, filename) {
35
+ return dequeueProcessor(processorsByFilename, filename).postprocess(messages, filename);
36
+ },
37
+ preprocess(text, filename) {
38
+ const plugin = options.getJsdocProcessorPlugin(upstreamOptions);
39
+ const processor = resolveExamplesProcessor(plugin, true);
40
+ const processedFiles = processor.preprocess(text, filename);
41
+ queueProcessor(processorsByFilename, filename, processor);
42
+ return processedFiles;
43
+ },
44
+ ...(baseProcessor.supportsAutofix === void 0
45
+ ? {}
46
+ : { supportsAutofix: baseProcessor.supportsAutofix }),
47
+ },
48
+ },
49
+ };
50
+ }
51
+ /**
52
+ * Dequeue the next processor instance for a filename.
53
+ * @param processorsByFilename Queued processors keyed by source filename.
54
+ * @param filename The host filename for the processor instance.
55
+ * @returns The next upstream processor instance.
56
+ * @throws {Error} Thrown when postprocess is called without a queued processor.
57
+ * @example
58
+ * console.log("dequeueProcessor");
59
+ */
60
+ function dequeueProcessor(processorsByFilename, filename) {
61
+ const queuedProcessors = processorsByFilename.get(filename);
62
+ if (queuedProcessors === void 0) {
63
+ throw new Error(`Wrapped JSDoc processor lost lifecycle state for ${filename}`);
64
+ }
65
+ const [processor] = queuedProcessors;
66
+ if (queuedProcessors.length === 1) {
67
+ processorsByFilename.delete(filename);
68
+ }
69
+ else {
70
+ queuedProcessors.shift();
71
+ }
72
+ return processor;
73
+ }
74
+ /**
75
+ * Queue a processor instance for a later postprocess call.
76
+ * @param processorsByFilename Queued processors keyed by source filename.
77
+ * @param filename The host filename for the processor instance.
78
+ * @param processor The upstream processor instance.
79
+ * @example
80
+ * console.log("queueProcessor");
81
+ */
82
+ function queueProcessor(processorsByFilename, filename, processor) {
83
+ const queuedProcessors = processorsByFilename.get(filename);
84
+ if (queuedProcessors === void 0) {
85
+ processorsByFilename.set(filename, [processor]);
86
+ return;
87
+ }
88
+ queuedProcessors.push(processor);
89
+ }
90
+ /**
91
+ * Resolve the upstream examples processor from a plugin instance.
92
+ * @param plugin The upstream plugin instance.
93
+ * @param shouldRequireLifecycleMethods Whether preprocess/postprocess must be present.
94
+ * @returns The upstream examples processor.
95
+ * @throws {TypeError} Thrown when the upstream plugin omits the examples processor or its lifecycle methods.
96
+ * @example
97
+ * console.log(resolveExamplesProcessor({ processors: { examples: {} } }, false) !== void 0);
98
+ */
99
+ function resolveExamplesProcessor(plugin, shouldRequireLifecycleMethods) {
100
+ const processor = plugin.processors?.examples;
101
+ if (processor === void 0) {
102
+ throw new TypeError("eslint-plugin-jsdoc did not provide processors.examples");
103
+ }
104
+ if (shouldRequireLifecycleMethods &&
105
+ (typeof processor.preprocess !== "function" ||
106
+ typeof processor.postprocess !== "function")) {
107
+ throw new TypeError("eslint-plugin-jsdoc processors.examples must provide preprocess and postprocess");
108
+ }
109
+ return processor;
110
+ }
111
+ export { createWrappedJsdocProcessorPlugin };
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNkb2MtcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RvY3MvanNkb2MtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTRFQTs7Ozs7O0dBTUc7QUFDSCxTQUFTLDZCQUE2QixDQUNwQyxPQUFpRDtJQUVqRCxPQUFPO1FBQ0wsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1FBQ3BDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7UUFDeEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtLQUMvQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUNBQWlDLENBQ3hDLE9BQWlEO0lBRWpELE1BQU0sZUFBZSxHQUFHLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FDaEQsZUFBZSxDQUNJLENBQUM7SUFDdEIsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7SUFFL0QsT0FBTztRQUNMLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRSxVQUFVLEVBQUU7WUFDVixRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0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bnQiOlsiaW1wb3J0IHR5cGUgeyBMaW50ZXIgfSBmcm9tIFwiZXNsaW50XCI7XG5pbXBvcnQgdHlwZSB7IGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luIGFzIGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luVHlwZSB9IGZyb20gXCJlc2xpbnQtcGx1Z2luLWpzZG9jXCI7XG5pbXBvcnQgdHlwZSB7IHBhcnNlciBhcyBwYXJzZXJUeXBlIH0gZnJvbSBcInR5cGVzY3JpcHQtZXNsaW50XCI7XG5cbi8qKiBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgd3JhcHBlZCBKU0RvYyBwcm9jZXNzb3IgcGx1Z2luLiAqL1xuaW50ZXJmYWNlIENyZWF0ZVdyYXBwZWRKc2RvY1Byb2Nlc3NvclBsdWdpbk9wdGlvbnMge1xuICAvKiogV2hldGhlciB0byBsaW50IGRlZmF1bHQgdmFsdWUgc25pcHBldHMuICovXG4gIGNoZWNrRGVmYXVsdHM6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgdG8gbGludCBwYXJhbWV0ZXIgZGVmYXVsdCBzbmlwcGV0cy4gKi9cbiAgY2hlY2tQYXJhbXM6IGJvb2xlYW47XG5cbiAgLyoqIFdoZXRoZXIgdG8gbGludCBwcm9wZXJ0eSBkZWZhdWx0IHNuaXBwZXRzLiAqL1xuICBjaGVja1Byb3BlcnRpZXM6IGJvb2xlYW47XG5cbiAgLyoqIFVwc3RyZWFtIEpTRG9jIHByb2Nlc3NvciBmYWN0b3J5LiAqL1xuICBnZXRKc2RvY1Byb2Nlc3NvclBsdWdpbjogSnNkb2NQcm9jZXNzb3JQbHVnaW5GYWN0b3J5O1xuXG4gIC8qKiBQYXJzZXIgcGFzc2VkIHRocm91Z2ggdG8gdGhlIHVwc3RyZWFtIHByb2Nlc3Nvci4gKi9cbiAgcGFyc2VyOiBQYXJzZXI7XG5cbiAgLyoqIFNvdXJjZSB0eXBlIGZvciBleHRyYWN0ZWQgc25pcHBldHMuICovXG4gIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIgfCBcInNjcmlwdFwiO1xufVxuXG4vKiogTWluaW1hbCB1cHN0cmVhbSBleGFtcGxlIHByb2Nlc3NvciBjb250cmFjdCB1c2VkIGJ5IHRoZSB3cmFwcGVyLiAqL1xuaW50ZXJmYWNlIElFeGFtcGxlUHJvY2Vzc29yIHtcbiAgLyoqIE9wdGlvbmFsIHByb2Nlc3NvciBtZXRhZGF0YS4gKi9cbiAgbWV0YT86IElQcm9jZXNzb3JNZXRhO1xuXG4gIC8qKiBSZW1hcCB2aXJ0dWFsLWZpbGUgbGludCBtZXNzYWdlcyBiYWNrIG9udG8gdGhlIGhvc3QgZmlsZS4gKi9cbiAgcG9zdHByb2Nlc3M6IChcbiAgICBtZXNzYWdlczogTGludGVyLkxpbnRNZXNzYWdlW11bXSxcbiAgICBmaWxlbmFtZTogc3RyaW5nLFxuICApID0+IExpbnRlci5MaW50TWVzc2FnZVtdO1xuXG4gIC8qKiBFeHRyYWN0IHZpcnR1YWwgc25pcHBldCBmaWxlcyBmcm9tIGEgaG9zdCBmaWxlLiAqL1xuICBwcmVwcm9jZXNzOiAodGV4dDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiBQcm9jZXNzb3JGaWxlW107XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVwc3RyZWFtIHByb2Nlc3NvciBzdXBwb3J0cyBhdXRvZml4LiAqL1xuICBzdXBwb3J0c0F1dG9maXg/OiBib29sZWFuO1xufVxuXG4vKiogTWluaW1hbCBtZXRhIHNoYXBlIHVzZWQgYnkgdGhlIHdyYXBwZWQgcHJvY2Vzc29yLiAqL1xuaW50ZXJmYWNlIElQcm9jZXNzb3JNZXRhIHtcbiAgLyoqIFByb2Nlc3NvciBuYW1lIHNob3duIHRvIEVTTGludC4gKi9cbiAgbmFtZT86IHN0cmluZztcblxuICAvKiogUHJvY2Vzc29yIHZlcnNpb24gc2hvd24gdG8gRVNMaW50LiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKiogTWluaW1hbCB1cHN0cmVhbSBwbHVnaW4gY29udHJhY3QgdXNlZCBieSB0aGUgd3JhcHBlci4gKi9cbmludGVyZmFjZSBJUHJvY2Vzc29yUGx1Z2luIHtcbiAgLyoqIE9wdGlvbmFsIHBsdWdpbiBtZXRhZGF0YS4gKi9cbiAgbWV0YT86IElQcm9jZXNzb3JNZXRhO1xuXG4gIC8qKiBBdmFpbGFibGUgcHJvY2Vzc29ycyBleHBvcnRlZCBieSB0aGUgcGx1Z2luLiAqL1xuICBwcm9jZXNzb3JzPzoge1xuICAgIC8qKiBKU0RvYyBleGFtcGxlL2RlZmF1bHQtZXhwcmVzc2lvbiBwcm9jZXNzb3IuICovXG4gICAgZXhhbXBsZXM/OiBQYXJ0aWFsPElFeGFtcGxlUHJvY2Vzc29yPjtcbiAgfTtcbn1cblxuLyoqIEZ1bmN0aW9uIHNpZ25hdHVyZSBmb3IgdGhlIHVwc3RyZWFtIEpTRG9jIHByb2Nlc3NvciBmYWN0b3J5LiAqL1xudHlwZSBKc2RvY1Byb2Nlc3NvclBsdWdpbkZhY3RvcnkgPSB0eXBlb2YgZ2V0SnNkb2NQcm9jZXNzb3JQbHVnaW5UeXBlO1xuXG4vKiogUGFyc2VyIGFjY2VwdGVkIGJ5IHRoZSB1cHN0cmVhbSBKU0RvYyBwcm9jZXNzb3IuICovXG50eXBlIFBhcnNlciA9IHR5cGVvZiBwYXJzZXJUeXBlO1xuXG4vKiogVmlydHVhbCBmaWxlcyBlbWl0dGVkIGJ5IGEgcHJvY2Vzc29yIHByZXByb2Nlc3Mgc3RlcC4gKi9cbnR5cGUgUHJvY2Vzc29yRmlsZSA9IExpbnRlci5Qcm9jZXNzb3JGaWxlIHwgc3RyaW5nO1xuXG4vKiogTm9uLWVtcHR5IHF1ZXVlIG9mIHByb2Nlc3NvciBpbnN0YW5jZXMgZm9yIG9uZSBmaWxlbmFtZS4gKi9cbnR5cGUgUHJvY2Vzc29yUXVldWUgPSBbSUV4YW1wbGVQcm9jZXNzb3IsIC4uLklFeGFtcGxlUHJvY2Vzc29yW11dO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBvcHRpb25zIG9iamVjdCBmb3J3YXJkZWQgdG8gdGhlIHVwc3RyZWFtIHByb2Nlc3NvciBmYWN0b3J5LlxuICogQHBhcmFtIG9wdGlvbnMgVGhlIHdyYXBwZXIgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgc2hhbGxvdyBvcHRpb25zIG9iamVjdCBmb3IgdGhlIHVwc3RyZWFtIHByb2Nlc3Nvci5cbiAqIEBleGFtcGxlXG4gKiBjb25zb2xlLmxvZyhidWlsZFVwc3RyZWFtUHJvY2Vzc29yT3B0aW9ucyh7IGNoZWNrRGVmYXVsdHM6IHRydWUsIGNoZWNrUGFyYW1zOiB0cnVlLCBjaGVja1Byb3BlcnRpZXM6IHRydWUsIGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luOiAoKCkgPT4gKHsgcHJvY2Vzc29yczogeyBleGFtcGxlczoge30gfSB9KSkgYXMgSnNkb2NQcm9jZXNzb3JQbHVnaW5GYWN0b3J5LCBwYXJzZXI6IHt9IGFzIFBhcnNlciwgc291cmNlVHlwZTogXCJtb2R1bGVcIiB9KS5zb3VyY2VUeXBlKTtcbiAqL1xuZnVuY3Rpb24gYnVpbGRVcHN0cmVhbVByb2Nlc3Nvck9wdGlvbnMoXG4gIG9wdGlvbnM6IENyZWF0ZVdyYXBwZWRKc2RvY1Byb2Nlc3NvclBsdWdpbk9wdGlvbnMsXG4pOiBQYXJhbWV0ZXJzPEpzZG9jUHJvY2Vzc29yUGx1Z2luRmFjdG9yeT5bMF0ge1xuICByZXR1cm4ge1xuICAgIGNoZWNrRGVmYXVsdHM6IG9wdGlvbnMuY2hlY2tEZWZhdWx0cyxcbiAgICBjaGVja1BhcmFtczogb3B0aW9ucy5jaGVja1BhcmFtcyxcbiAgICBjaGVja1Byb3BlcnRpZXM6IG9wdGlvbnMuY2hlY2tQcm9wZXJ0aWVzLFxuICAgIHBhcnNlcjogb3B0aW9ucy5wYXJzZXIsXG4gICAgc291cmNlVHlwZTogb3B0aW9ucy5zb3VyY2VUeXBlLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHdyYXBwZWQgSlNEb2MgcHJvY2Vzc29yIHBsdWdpbiB3aXRoIHBlci1maWxlIHVwc3RyZWFtIGlzb2xhdGlvbi5cbiAqIEBwYXJhbSBvcHRpb25zIFRoZSB3cmFwcGVyIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHBsdWdpbiB3aG9zZSBleGFtcGxlcyBwcm9jZXNzb3IgdXNlcyBmcmVzaCB1cHN0cmVhbSBzdGF0ZSBwZXIgZmlsZS5cbiAqIEBleGFtcGxlXG4gKiBjb25zb2xlLmxvZyhjcmVhdGVXcmFwcGVkSnNkb2NQcm9jZXNzb3JQbHVnaW4oeyBjaGVja0RlZmF1bHRzOiB0cnVlLCBjaGVja1BhcmFtczogdHJ1ZSwgY2hlY2tQcm9wZXJ0aWVzOiB0cnVlLCBnZXRKc2RvY1Byb2Nlc3NvclBsdWdpbjogKCgpID0+ICh7IHByb2Nlc3NvcnM6IHsgZXhhbXBsZXM6IHt9IH0gfSkpIGFzIEpzZG9jUHJvY2Vzc29yUGx1Z2luRmFjdG9yeSwgcGFyc2VyOiB7fSBhcyBQYXJzZXIsIHNvdXJjZVR5cGU6IFwibW9kdWxlXCIgfSkucHJvY2Vzc29ycz8uZXhhbXBsZXMgIT09IHZvaWQgMCk7XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyYXBwZWRKc2RvY1Byb2Nlc3NvclBsdWdpbihcbiAgb3B0aW9uczogQ3JlYXRlV3JhcHBlZEpzZG9jUHJvY2Vzc29yUGx1Z2luT3B0aW9ucyxcbik6IElQcm9jZXNzb3JQbHVnaW4ge1xuICBjb25zdCB1cHN0cmVhbU9wdGlvbnMgPSBidWlsZFVwc3RyZWFtUHJvY2Vzc29yT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgYmFzZVBsdWdpbiA9IG9wdGlvbnMuZ2V0SnNkb2NQcm9jZXNzb3JQbHVnaW4oXG4gICAgdXBzdHJlYW1PcHRpb25zLFxuICApIGFzIElQcm9jZXNzb3JQbHVnaW47XG4gIGNvbnN0IGJhc2VQcm9jZXNzb3IgPSByZXNvbHZlRXhhbXBsZXNQcm9jZXNzb3IoYmFzZVBsdWdpbiwgZmFsc2UpO1xuICBjb25zdCBwcm9jZXNzb3JzQnlGaWxlbmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9jZXNzb3JRdWV1ZT4oKTtcblxuICByZXR1cm4ge1xuICAgIC4uLihiYXNlUGx1Z2luLm1ldGEgPT09IHZvaWQgMCA/IHt9IDogeyBtZXRhOiBiYXNlUGx1Z2luLm1ldGEgfSksXG4gICAgcHJvY2Vzc29yczoge1xuICAgICAgZXhhbXBsZXM6IHtcbiAgICAgICAgLi4uKGJhc2VQcm9jZXNzb3IubWV0YSA9PT0gdm9pZCAwID8ge30gOiB7IG1ldGE6IGJhc2VQcm9jZXNzb3IubWV0YSB9KSxcbiAgICAgICAgcG9zdHByb2Nlc3MoXG4gICAgICAgICAgbWVzc2FnZXM6IExpbnRlci5MaW50TWVzc2FnZVtdW10sXG4gICAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgKTogTGludGVyLkxpbnRNZXNzYWdlW10ge1xuICAgICAgICAgIHJldHVybiBkZXF1ZXVlUHJvY2Vzc29yKHByb2Nlc3NvcnNCeUZpbGVuYW1lLCBmaWxlbmFtZSkucG9zdHByb2Nlc3MoXG4gICAgICAgICAgICBtZXNzYWdlcyxcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHByZXByb2Nlc3ModGV4dDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvY2Vzc29yRmlsZVtdIHtcbiAgICAgICAgICBjb25zdCBwbHVnaW4gPSBvcHRpb25zLmdldEpzZG9jUHJvY2Vzc29yUGx1Z2luKFxuICAgICAgICAgICAgdXBzdHJlYW1PcHRpb25zLFxuICAgICAgICAgICkgYXMgSVByb2Nlc3NvclBsdWdpbjtcbiAgICAgICAgICBjb25zdCBwcm9jZXNzb3IgPSByZXNvbHZlRXhhbXBsZXNQcm9jZXNzb3IoXG4gICAgICAgICAgICBwbHVnaW4sXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICkgYXMgSUV4YW1wbGVQcm9jZXNzb3I7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRmlsZXMgPSBwcm9jZXNzb3IucHJlcHJvY2Vzcyh0ZXh0LCBmaWxlbmFtZSk7XG5cbiAgICAgICAgICBxdWV1ZVByb2Nlc3Nvcihwcm9jZXNzb3JzQnlGaWxlbmFtZSwgZmlsZW5hbWUsIHByb2Nlc3Nvcik7XG5cbiAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRmlsZXM7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLihiYXNlUHJvY2Vzc29yLnN1cHBvcnRzQXV0b2ZpeCA9PT0gdm9pZCAwXG4gICAgICAgICAgPyB7fVxuICAgICAgICAgIDogeyBzdXBwb3J0c0F1dG9maXg6IGJhc2VQcm9jZXNzb3Iuc3VwcG9ydHNBdXRvZml4IH0pLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIERlcXVldWUgdGhlIG5leHQgcHJvY2Vzc29yIGluc3RhbmNlIGZvciBhIGZpbGVuYW1lLlxuICogQHBhcmFtIHByb2Nlc3NvcnNCeUZpbGVuYW1lIFF1ZXVlZCBwcm9jZXNzb3JzIGtleWVkIGJ5IHNvdXJjZSBmaWxlbmFtZS5cbiAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgaG9zdCBmaWxlbmFtZSBmb3IgdGhlIHByb2Nlc3NvciBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBuZXh0IHVwc3RyZWFtIHByb2Nlc3NvciBpbnN0YW5jZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd24gd2hlbiBwb3N0cHJvY2VzcyBpcyBjYWxsZWQgd2l0aG91dCBhIHF1ZXVlZCBwcm9jZXNzb3IuXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coXCJkZXF1ZXVlUHJvY2Vzc29yXCIpO1xuICovXG5mdW5jdGlvbiBkZXF1ZXVlUHJvY2Vzc29yKFxuICBwcm9jZXNzb3JzQnlGaWxlbmFtZTogTWFwPHN0cmluZywgUHJvY2Vzc29yUXVldWU+LFxuICBmaWxlbmFtZTogc3RyaW5nLFxuKTogSUV4YW1wbGVQcm9jZXNzb3Ige1xuICBjb25zdCBxdWV1ZWRQcm9jZXNzb3JzID0gcHJvY2Vzc29yc0J5RmlsZW5hbWUuZ2V0KGZpbGVuYW1lKTtcblxuICBpZiAocXVldWVkUHJvY2Vzc29ycyA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFdyYXBwZWQgSlNEb2MgcHJvY2Vzc29yIGxvc3QgbGlmZWN5Y2xlIHN0YXRlIGZvciAke2ZpbGVuYW1lfWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFtwcm9jZXNzb3JdID0gcXVldWVkUHJvY2Vzc29ycztcblxuICBpZiAocXVldWVkUHJvY2Vzc29ycy5sZW5ndGggPT09IDEpIHtcbiAgICBwcm9jZXNzb3JzQnlGaWxlbmFtZS5kZWxldGUoZmlsZW5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlZFByb2Nlc3NvcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiBwcm9jZXNzb3I7XG59XG5cbi8qKlxuICogUXVldWUgYSBwcm9jZXNzb3IgaW5zdGFuY2UgZm9yIGEgbGF0ZXIgcG9zdHByb2Nlc3MgY2FsbC5cbiAqIEBwYXJhbSBwcm9jZXNzb3JzQnlGaWxlbmFtZSBRdWV1ZWQgcHJvY2Vzc29ycyBrZXllZCBieSBzb3VyY2UgZmlsZW5hbWUuXG4gKiBAcGFyYW0gZmlsZW5hbWUgVGhlIGhvc3QgZmlsZW5hbWUgZm9yIHRoZSBwcm9jZXNzb3IgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcHJvY2Vzc29yIFRoZSB1cHN0cmVhbSBwcm9jZXNzb3IgaW5zdGFuY2UuXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coXCJxdWV1ZVByb2Nlc3NvclwiKTtcbiAqL1xuZnVuY3Rpb24gcXVldWVQcm9jZXNzb3IoXG4gIHByb2Nlc3NvcnNCeUZpbGVuYW1lOiBNYXA8c3RyaW5nLCBQcm9jZXNzb3JRdWV1ZT4sXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIHByb2Nlc3NvcjogSUV4YW1wbGVQcm9jZXNzb3IsXG4pOiB2b2lkIHtcbiAgY29uc3QgcXVldWVkUHJvY2Vzc29ycyA9IHByb2Nlc3NvcnNCeUZpbGVuYW1lLmdldChmaWxlbmFtZSk7XG5cbiAgaWYgKHF1ZXVlZFByb2Nlc3NvcnMgPT09IHZvaWQgMCkge1xuICAgIHByb2Nlc3NvcnNCeUZpbGVuYW1lLnNldChmaWxlbmFtZSwgW3Byb2Nlc3Nvcl0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHF1ZXVlZFByb2Nlc3NvcnMucHVzaChwcm9jZXNzb3IpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHVwc3RyZWFtIGV4YW1wbGVzIHByb2Nlc3NvciBmcm9tIGEgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHBsdWdpbiBUaGUgdXBzdHJlYW0gcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHNob3VsZFJlcXVpcmVMaWZlY3ljbGVNZXRob2RzIFdoZXRoZXIgcHJlcHJvY2Vzcy9wb3N0cHJvY2VzcyBtdXN0IGJlIHByZXNlbnQuXG4gKiBAcmV0dXJucyBUaGUgdXBzdHJlYW0gZXhhbXBsZXMgcHJvY2Vzc29yLlxuICogQHRocm93cyB7VHlwZUVycm9yfSBUaHJvd24gd2hlbiB0aGUgdXBzdHJlYW0gcGx1Z2luIG9taXRzIHRoZSBleGFtcGxlcyBwcm9jZXNzb3Igb3IgaXRzIGxpZmVjeWNsZSBtZXRob2RzLlxuICogQGV4YW1wbGVcbiAqIGNvbnNvbGUubG9nKHJlc29sdmVFeGFtcGxlc1Byb2Nlc3Nvcih7IHByb2Nlc3NvcnM6IHsgZXhhbXBsZXM6IHt9IH0gfSwgZmFsc2UpICE9PSB2b2lkIDApO1xuICovXG5mdW5jdGlvbiByZXNvbHZlRXhhbXBsZXNQcm9jZXNzb3IoXG4gIHBsdWdpbjogSVByb2Nlc3NvclBsdWdpbixcbiAgc2hvdWxkUmVxdWlyZUxpZmVjeWNsZU1ldGhvZHM6IGJvb2xlYW4sXG4pOiBQYXJ0aWFsPElFeGFtcGxlUHJvY2Vzc29yPiB7XG4gIGNvbnN0IHByb2Nlc3NvciA9IHBsdWdpbi5wcm9jZXNzb3JzPy5leGFtcGxlcztcblxuICBpZiAocHJvY2Vzc29yID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJlc2xpbnQtcGx1Z2luLWpzZG9jIGRpZCBub3QgcHJvdmlkZSBwcm9jZXNzb3JzLmV4YW1wbGVzXCIsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChcbiAgICBzaG91bGRSZXF1aXJlTGlmZWN5Y2xlTWV0aG9kcyAmJlxuICAgICh0eXBlb2YgcHJvY2Vzc29yLnByZXByb2Nlc3MgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICAgdHlwZW9mIHByb2Nlc3Nvci5wb3N0cHJvY2VzcyAhPT0gXCJmdW5jdGlvblwiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJlc2xpbnQtcGx1Z2luLWpzZG9jIHByb2Nlc3NvcnMuZXhhbXBsZXMgbXVzdCBwcm92aWRlIHByZXByb2Nlc3MgYW5kIHBvc3Rwcm9jZXNzXCIsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBwcm9jZXNzb3I7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVdyYXBwZWRKc2RvY1Byb2Nlc3NvclBsdWdpbiB9O1xuZXhwb3J0IHR5cGUgeyBKc2RvY1Byb2Nlc3NvclBsdWdpbkZhY3RvcnksIFBhcnNlciB9O1xuIl19
@@ -3,10 +3,8 @@ import type { Linter } from "eslint";
3
3
  * Build the jsdoc plugin configuration and any overrides needed by this project.
4
4
  * @returns Return value output.
5
5
  * @example
6
- * ```typescript
7
- * await jsdoc();
8
- * ```
6
+ * console.log(await jsdoc());
9
7
  */
10
- declare const jsdoc: () => Promise<Linter.Config[]>;
8
+ declare function jsdoc(): Promise<Linter.Config[]>;
11
9
  export { jsdoc };
12
10
  //# sourceMappingURL=jsdoc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsdoc.d.ts","sourceRoot":"","sources":["../../src/docs/jsdoc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAiDrC;;;;;;;GAOG;AACH,QAAA,MAAM,KAAK,QAAa,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAsC9C,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"jsdoc.d.ts","sourceRoot":"","sources":["../../src/docs/jsdoc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAiIrC;;;;;GAKG;AACH,iBAAe,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CA2B/C;AAED,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -1,12 +1,19 @@
1
1
  import { defineConfig } from "eslint/config";
2
+ import { buildTypeScriptExampleConfigs, resolveDisableTypeCheckedRules, resolveJsdocProcessorPlugin, } from "./jsdoc-examples.js";
3
+ /** Upstream JSDoc flat preset names consumed by this config. */
4
+ const jsdocPresetNames = [
5
+ "flat/recommended-typescript-error",
6
+ "flat/contents-typescript-error",
7
+ "flat/logical-typescript-error",
8
+ "flat/requirements-typescript-error",
9
+ "flat/stylistic-typescript-error",
10
+ ];
2
11
  /**
3
12
  * Build the custom jsdoc error rules based on available plugin rules.
4
13
  * @param availableRules Set of available jsdoc rule names.
5
14
  * @returns The rules record for ESLint.
6
15
  * @example
7
- * ```typescript
8
- * const rules = buildCustomErrorRules(new Set(["require-throws"]));
9
- * ```
16
+ * console.log(buildCustomErrorRules(new Set(["require-throws"])));
10
17
  */
11
18
  const buildCustomErrorRules = (availableRules) => {
12
19
  const ruleNames = [
@@ -38,19 +45,33 @@ const requireJsdocContexts = [
38
45
  "TSIndexSignature",
39
46
  ];
40
47
  /**
41
- * Build the jsdoc plugin configuration and any overrides needed by this project.
42
- * @returns Return value output.
48
+ * Select only the upstream flat presets that are available in the current plugin version.
49
+ * @param configs Upstream JSDoc config map.
50
+ * @returns The available flat presets.
43
51
  * @example
44
- * ```typescript
45
- * await jsdoc();
46
- * ```
52
+ * console.log(buildPresetConfigs({ "flat/recommended-typescript-error": {} as Linter.Config }).length);
47
53
  */
48
- const jsdoc = async () => {
49
- const jsdocModule = await import("eslint-plugin-jsdoc");
50
- const { configs, rules } = jsdocModule.default;
51
- const availableRules = new Set(Object.keys(rules ?? {}));
52
- const customError = buildCustomErrorRules(availableRules);
53
- return defineConfig(configs["flat/recommended-typescript-error"], configs["flat/contents-typescript-error"], configs["flat/logical-typescript-error"], configs["flat/requirements-typescript-error"], configs["flat/stylistic-typescript-error"], {
54
+ function buildPresetConfigs(configs) {
55
+ return jsdocPresetNames.flatMap((configName) => {
56
+ const config = configs[configName];
57
+ if (config === void 0 ||
58
+ Array.isArray(config) ||
59
+ typeof config !== "object") {
60
+ return [];
61
+ }
62
+ return [config];
63
+ });
64
+ }
65
+ /**
66
+ * Build the final repo-owned JSDoc configs on top of the upstream presets.
67
+ * @param customError Repo-owned JSDoc rule overrides.
68
+ * @param typeScriptExampleConfigs Processor-backed TypeScript example configs.
69
+ * @returns The final ESLint config array.
70
+ * @example
71
+ * console.log(buildRepoJsdocConfigs({}, []).length);
72
+ */
73
+ function buildRepoJsdocConfigs(customError, typeScriptExampleConfigs) {
74
+ return defineConfig(...typeScriptExampleConfigs, {
54
75
  name: "jsdoc/custom",
55
76
  rules: {
56
77
  ...customError,
@@ -59,7 +80,10 @@ const jsdoc = async () => {
59
80
  }, {
60
81
  name: "jsdoc/require-jsdoc-alias",
61
82
  rules: {
62
- "jsdoc/require-description": ["error", { contexts: requireJsdocContexts }],
83
+ "jsdoc/require-description": [
84
+ "error",
85
+ { contexts: requireJsdocContexts },
86
+ ],
63
87
  "jsdoc/require-jsdoc": ["error", { contexts: requireJsdocContexts }],
64
88
  },
65
89
  }, {
@@ -72,6 +96,27 @@ const jsdoc = async () => {
72
96
  ],
73
97
  },
74
98
  });
75
- };
99
+ }
100
+ /**
101
+ * Build the jsdoc plugin configuration and any overrides needed by this project.
102
+ * @returns Return value output.
103
+ * @example
104
+ * console.log(await jsdoc());
105
+ */
106
+ async function jsdoc() {
107
+ const jsdocModule = await import("eslint-plugin-jsdoc");
108
+ const typeScriptModule = await import("typescript-eslint");
109
+ const { default: jsdocPlugin } = jsdocModule;
110
+ const { configs, rules } = jsdocPlugin;
111
+ const getJsdocProcessorPlugin = resolveJsdocProcessorPlugin(jsdocModule);
112
+ const { configs: typeScriptConfigs, parser, plugin: typeScriptPlugin, } = typeScriptModule;
113
+ const availableRules = new Set(Object.keys(rules ?? {})), customError = buildCustomErrorRules(availableRules), disableTypeCheckedRules = resolveDisableTypeCheckedRules(typeScriptConfigs), presetConfigs = buildPresetConfigs(configs), typeScriptExampleConfigs = buildTypeScriptExampleConfigs({
114
+ disableTypeCheckedRules,
115
+ getJsdocProcessorPlugin,
116
+ parser,
117
+ typeScriptPlugin,
118
+ });
119
+ return defineConfig(...presetConfigs, ...buildRepoJsdocConfigs(customError, typeScriptExampleConfigs));
120
+ }
76
121
  export { jsdoc };
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNkb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG9jcy9qc2RvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxDQUM1QixjQUEyQixFQUNQLEVBQUU7SUFDdEIsTUFBTSxTQUFTLEdBQUc7UUFDaEIsbUJBQW1CO1FBQ25CLDJCQUEyQjtRQUMzQixxQkFBcUI7UUFDckIsdUNBQXVDO1FBQ3ZDLGtCQUFrQjtRQUNsQixnQkFBZ0I7UUFDaEIsV0FBVztLQUNaLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFNBQVM7U0FDTixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFVLENBQUMsQ0FDdEQsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLDRDQUE0QztBQUM1QyxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLCtCQUErQjtJQUMvQiwwREFBMEQ7SUFDMUQsd0RBQXdEO0lBQ3hELCtCQUErQjtJQUMvQix3REFBd0Q7SUFDeEQsd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLDRCQUE0QjtJQUM1QixpQ0FBaUM7SUFDakMsa0JBQWtCO0NBQ25CLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxLQUFLLEdBQUcsS0FBSyxJQUE4QixFQUFFO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE1BQU0sTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO0lBRS9DLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFMUQsT0FBTyxZQUFZLENBQ2pCLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxFQUM1QyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsRUFDekMsT0FBTyxDQUFDLCtCQUErQixDQUFDLEVBQ3hDLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxFQUM3QyxPQUFPLENBQUMsaUNBQWlDLENBQUMsRUFDMUM7UUFDRSxJQUFJLEVBQUUsY0FBYztRQUNwQixLQUFLLEVBQUU7WUFDTCxHQUFHLFdBQVc7WUFDZCxxQkFBcUIsRUFBRSxLQUFLO1NBQzdCO0tBQ0YsRUFDRDtRQUNFLElBQUksRUFBRSwyQkFBMkI7UUFDakMsS0FBSyxFQUFFO1lBQ0wsMkJBQTJCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztZQUMxRSxxQkFBcUIsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxDQUFDO1NBQ3JFO0tBQ0YsRUFDRDtRQUNFLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQztRQUN2QixJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLEtBQUssRUFBRTtZQUNMLGlDQUFpQyxFQUFFO2dCQUNqQyxPQUFPO2dCQUNQLEVBQUUsZUFBZSxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFO2FBQ3hDO1NBQ0Y7S0FDRixDQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExpbnRlciB9IGZyb20gXCJlc2xpbnRcIjtcclxuXHJcbmltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJlc2xpbnQvY29uZmlnXCI7XHJcblxyXG4vKipcclxuICogQnVpbGQgdGhlIGN1c3RvbSBqc2RvYyBlcnJvciBydWxlcyBiYXNlZCBvbiBhdmFpbGFibGUgcGx1Z2luIHJ1bGVzLlxyXG4gKiBAcGFyYW0gYXZhaWxhYmxlUnVsZXMgU2V0IG9mIGF2YWlsYWJsZSBqc2RvYyBydWxlIG5hbWVzLlxyXG4gKiBAcmV0dXJucyBUaGUgcnVsZXMgcmVjb3JkIGZvciBFU0xpbnQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogY29uc3QgcnVsZXMgPSBidWlsZEN1c3RvbUVycm9yUnVsZXMobmV3IFNldChbXCJyZXF1aXJlLXRocm93c1wiXSkpO1xyXG4gKiBgYGBcclxuICovXHJcbmNvbnN0IGJ1aWxkQ3VzdG9tRXJyb3JSdWxlcyA9IChcclxuICBhdmFpbGFibGVSdWxlczogU2V0PHN0cmluZz4sXHJcbik6IExpbnRlci5SdWxlc1JlY29yZCA9PiB7XHJcbiAgY29uc3QgcnVsZU5hbWVzID0gW1xyXG4gICAgXCJjaGVjay1pbmRlbnRhdGlvblwiLFxyXG4gICAgXCJjb252ZXJ0LXRvLWpzZG9jLWNvbW1lbnRzXCIsXHJcbiAgICBcInJlcXVpcmUtZGVzY3JpcHRpb25cIixcclxuICAgIFwicmVxdWlyZS1kZXNjcmlwdGlvbi1jb21wbGV0ZS1zZW50ZW5jZVwiLFxyXG4gICAgXCJyZXF1aXJlLXRlbXBsYXRlXCIsXHJcbiAgICBcInJlcXVpcmUtdGhyb3dzXCIsXHJcbiAgICBcInNvcnQtdGFnc1wiLFxyXG4gIF07XHJcblxyXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXHJcbiAgICBydWxlTmFtZXNcclxuICAgICAgLmZpbHRlcigocnVsZSkgPT4gYXZhaWxhYmxlUnVsZXMuaGFzKHJ1bGUpKVxyXG4gICAgICAubWFwKChydWxlKSA9PiBbYGpzZG9jLyR7cnVsZX1gLCBcImVycm9yXCJdIGFzIGNvbnN0KSxcclxuICApO1xyXG59O1xyXG5cclxuLyoqIEFTVCBjb250ZXh0cyB0aGF0IG11c3QgaW5jbHVkZSBKU0RvYy4gKi9cclxuY29uc3QgcmVxdWlyZUpzZG9jQ29udGV4dHMgPSBbXHJcbiAgXCJQcm9ncmFtID4gRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxyXG4gIFwiUHJvZ3JhbSA+IEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiA+IEZ1bmN0aW9uRGVjbGFyYXRpb25cIixcclxuICBcIlByb2dyYW0gPiBFeHBvcnROYW1lZERlY2xhcmF0aW9uID4gRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxyXG4gIFwiUHJvZ3JhbSA+IFZhcmlhYmxlRGVjbGFyYXRpb25cIixcclxuICBcIlByb2dyYW0gPiBFeHBvcnROYW1lZERlY2xhcmF0aW9uID4gVmFyaWFibGVEZWNsYXJhdGlvblwiLFxyXG4gIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiLFxyXG4gIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiLFxyXG4gIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiLFxyXG4gIFwiVFNNZXRob2RTaWduYXR1cmVcIixcclxuICBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXHJcbiAgXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXHJcbiAgXCJUU0luZGV4U2lnbmF0dXJlXCIsXHJcbl07XHJcblxyXG4vKipcclxuICogQnVpbGQgdGhlIGpzZG9jIHBsdWdpbiBjb25maWd1cmF0aW9uIGFuZCBhbnkgb3ZlcnJpZGVzIG5lZWRlZCBieSB0aGlzIHByb2plY3QuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogYXdhaXQganNkb2MoKTtcclxuICogYGBgXHJcbiAqL1xyXG5jb25zdCBqc2RvYyA9IGFzeW5jICgpOiBQcm9taXNlPExpbnRlci5Db25maWdbXT4gPT4ge1xyXG4gIGNvbnN0IGpzZG9jTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiZXNsaW50LXBsdWdpbi1qc2RvY1wiKTtcclxuICBjb25zdCB7IGNvbmZpZ3MsIHJ1bGVzIH0gPSBqc2RvY01vZHVsZS5kZWZhdWx0O1xyXG5cclxuICBjb25zdCBhdmFpbGFibGVSdWxlcyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocnVsZXMgPz8ge30pKTtcclxuICBjb25zdCBjdXN0b21FcnJvciA9IGJ1aWxkQ3VzdG9tRXJyb3JSdWxlcyhhdmFpbGFibGVSdWxlcyk7XHJcblxyXG4gIHJldHVybiBkZWZpbmVDb25maWcoXHJcbiAgICBjb25maWdzW1wiZmxhdC9yZWNvbW1lbmRlZC10eXBlc2NyaXB0LWVycm9yXCJdLFxyXG4gICAgY29uZmlnc1tcImZsYXQvY29udGVudHMtdHlwZXNjcmlwdC1lcnJvclwiXSxcclxuICAgIGNvbmZpZ3NbXCJmbGF0L2xvZ2ljYWwtdHlwZXNjcmlwdC1lcnJvclwiXSxcclxuICAgIGNvbmZpZ3NbXCJmbGF0L3JlcXVpcmVtZW50cy10eXBlc2NyaXB0LWVycm9yXCJdLFxyXG4gICAgY29uZmlnc1tcImZsYXQvc3R5bGlzdGljLXR5cGVzY3JpcHQtZXJyb3JcIl0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IFwianNkb2MvY3VzdG9tXCIsXHJcbiAgICAgIHJ1bGVzOiB7XHJcbiAgICAgICAgLi4uY3VzdG9tRXJyb3IsXHJcbiAgICAgICAgXCJqc2RvYy90ZXh0LWVzY2FwaW5nXCI6IFwib2ZmXCIsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcImpzZG9jL3JlcXVpcmUtanNkb2MtYWxpYXNcIixcclxuICAgICAgcnVsZXM6IHtcclxuICAgICAgICBcImpzZG9jL3JlcXVpcmUtZGVzY3JpcHRpb25cIjogW1wiZXJyb3JcIiwgeyBjb250ZXh0czogcmVxdWlyZUpzZG9jQ29udGV4dHMgfV0sXHJcbiAgICAgICAgXCJqc2RvYy9yZXF1aXJlLWpzZG9jXCI6IFtcImVycm9yXCIsIHsgY29udGV4dHM6IHJlcXVpcmVKc2RvY0NvbnRleHRzIH1dLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgZmlsZXM6IFtcIioqLyouc3BlYy50c1wiXSxcclxuICAgICAgbmFtZTogXCJqc2RvYy9jdXN0b20tc3BlY1wiLFxyXG4gICAgICBydWxlczoge1xyXG4gICAgICAgIFwianNkb2MvY29udmVydC10by1qc2RvYy1jb21tZW50c1wiOiBbXHJcbiAgICAgICAgICBcImVycm9yXCIsXHJcbiAgICAgICAgICB7IGFsbG93ZWRQcmVmaXhlczogW1wiQXJyYW5nZVwiLCBcIkFjdFwiXSB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICk7XHJcbn07XHJcblxyXG5leHBvcnQgeyBqc2RvYyB9O1xyXG4iXX0=
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNkb2MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG9jcy9qc2RvYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sRUFDTCw2QkFBNkIsRUFDN0IsOEJBQThCLEVBQzlCLDJCQUEyQixHQUM1QixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLGdFQUFnRTtBQUNoRSxNQUFNLGdCQUFnQixHQUFHO0lBQ3ZCLG1DQUFtQztJQUNuQyxnQ0FBZ0M7SUFDaEMsK0JBQStCO0lBQy9CLG9DQUFvQztJQUNwQyxpQ0FBaUM7Q0FDekIsQ0FBQztBQUVYOzs7Ozs7R0FNRztBQUNILE1BQU0scUJBQXFCLEdBQUcsQ0FDNUIsY0FBMkIsRUFDUCxFQUFFO0lBQ3RCLE1BQU0sU0FBUyxHQUFHO1FBQ2hCLG1CQUFtQjtRQUNuQiwyQkFBMkI7UUFDM0IscUJBQXFCO1FBQ3JCLHVDQUF1QztRQUN2QyxrQkFBa0I7UUFDbEIsZ0JBQWdCO1FBQ2hCLFdBQVc7S0FDWixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixTQUFTO1NBQ04sTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBVSxDQUFDLENBQ3RELENBQUM7QUFDSixDQUFDLENBQUM7QUFFRiw0Q0FBNEM7QUFDNUMsTUFBTSxvQkFBb0IsR0FBRztJQUMzQiwrQkFBK0I7SUFDL0IsMERBQTBEO0lBQzFELHdEQUF3RDtJQUN4RCwrQkFBK0I7SUFDL0Isd0RBQXdEO0lBQ3hELHdCQUF3QjtJQUN4Qix3QkFBd0I7SUFDeEIscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIs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cG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gXCJlc2xpbnQvY29uZmlnXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gIGJ1aWxkVHlwZVNjcmlwdEV4YW1wbGVDb25maWdzLFxyXG4gIHJlc29sdmVEaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyxcclxuICByZXNvbHZlSnNkb2NQcm9jZXNzb3JQbHVnaW4sXHJcbn0gZnJvbSBcIi4vanNkb2MtZXhhbXBsZXMuanNcIjtcclxuXHJcbi8qKiBVcHN0cmVhbSBKU0RvYyBmbGF0IHByZXNldCBuYW1lcyBjb25zdW1lZCBieSB0aGlzIGNvbmZpZy4gKi9cclxuY29uc3QganNkb2NQcmVzZXROYW1lcyA9IFtcclxuICBcImZsYXQvcmVjb21tZW5kZWQtdHlwZXNjcmlwdC1lcnJvclwiLFxyXG4gIFwiZmxhdC9jb250ZW50cy10eXBlc2NyaXB0LWVycm9yXCIsXHJcbiAgXCJmbGF0L2xvZ2ljYWwtdHlwZXNjcmlwdC1lcnJvclwiLFxyXG4gIFwiZmxhdC9yZXF1aXJlbWVudHMtdHlwZXNjcmlwdC1lcnJvclwiLFxyXG4gIFwiZmxhdC9zdHlsaXN0aWMtdHlwZXNjcmlwdC1lcnJvclwiLFxyXG5dIGFzIGNvbnN0O1xyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIHRoZSBjdXN0b20ganNkb2MgZXJyb3IgcnVsZXMgYmFzZWQgb24gYXZhaWxhYmxlIHBsdWdpbiBydWxlcy5cclxuICogQHBhcmFtIGF2YWlsYWJsZVJ1bGVzIFNldCBvZiBhdmFpbGFibGUganNkb2MgcnVsZSBuYW1lcy5cclxuICogQHJldHVybnMgVGhlIHJ1bGVzIHJlY29yZCBmb3IgRVNMaW50LlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBjb25zb2xlLmxvZyhidWlsZEN1c3RvbUVycm9yUnVsZXMobmV3IFNldChbXCJyZXF1aXJlLXRocm93c1wiXSkpKTtcclxuICovXHJcbmNvbnN0IGJ1aWxkQ3VzdG9tRXJyb3JSdWxlcyA9IChcclxuICBhdmFpbGFibGVSdWxlczogU2V0PHN0cmluZz4sXHJcbik6IExpbnRlci5SdWxlc1JlY29yZCA9PiB7XHJcbiAgY29uc3QgcnVsZU5hbWVzID0gW1xyXG4gICAgXCJjaGVjay1pbmRlbnRhdGlvblwiLFxyXG4gICAgXCJjb252ZXJ0LXRvLWpzZG9jLWNvbW1lbnRzXCIsXHJcbiAgICBcInJlcXVpcmUtZGVzY3JpcHRpb25cIixcclxuICAgIFwicmVxdWlyZS1kZXNjcmlwdGlvbi1jb21wbGV0ZS1zZW50ZW5jZVwiLFxyXG4gICAgXCJyZXF1aXJlLXRlbXBsYXRlXCIsXHJcbiAgICBcInJlcXVpcmUtdGhyb3dzXCIsXHJcbiAgICBcInNvcnQtdGFnc1wiLFxyXG4gIF07XHJcblxyXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXHJcbiAgICBydWxlTmFtZXNcclxuICAgICAgLmZpbHRlcigocnVsZSkgPT4gYXZhaWxhYmxlUnVsZXMuaGFzKHJ1bGUpKVxyXG4gICAgICAubWFwKChydWxlKSA9PiBbYGpzZG9jLyR7cnVsZX1gLCBcImVycm9yXCJdIGFzIGNvbnN0KSxcclxuICApO1xyXG59O1xyXG5cclxuLyoqIEFTVCBjb250ZXh0cyB0aGF0IG11c3QgaW5jbHVkZSBKU0RvYy4gKi9cclxuY29uc3QgcmVxdWlyZUpzZG9jQ29udGV4dHMgPSBbXHJcbiAgXCJQcm9ncmFtID4gRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxyXG4gIFwiUHJvZ3JhbSA+IEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiA+IEZ1bmN0aW9uRGVjbGFyYXRpb25cIixcclxuICBcIlByb2dyYW0gPiBFeHBvcnROYW1lZERlY2xhcmF0aW9uID4gRnVuY3Rpb25EZWNsYXJhdGlvblwiLFxyXG4gIFwiUHJvZ3JhbSA+IFZhcmlhYmxlRGVjbGFyYXRpb25cIixcclxuICBcIlByb2dyYW0gPiBFeHBvcnROYW1lZERlY2xhcmF0aW9uID4gVmFyaWFibGVEZWNsYXJhdGlvblwiLFxyXG4gIFwiVFNJbnRlcmZhY2VEZWNsYXJhdGlvblwiLFxyXG4gIFwiVFNUeXBlQWxpYXNEZWNsYXJhdGlvblwiLFxyXG4gIFwiVFNQcm9wZXJ0eVNpZ25hdHVyZVwiLFxyXG4gIFwiVFNNZXRob2RTaWduYXR1cmVcIixcclxuICBcIlRTQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXHJcbiAgXCJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uXCIsXHJcbiAgXCJUU0luZGV4U2lnbmF0dXJlXCIsXHJcbl07XHJcblxyXG4vKipcclxuICogU2VsZWN0IG9ubHkgdGhlIHVwc3RyZWFtIGZsYXQgcHJlc2V0cyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgcGx1Z2luIHZlcnNpb24uXHJcbiAqIEBwYXJhbSBjb25maWdzIFVwc3RyZWFtIEpTRG9jIGNvbmZpZyBtYXAuXHJcbiAqIEByZXR1cm5zIFRoZSBhdmFpbGFibGUgZmxhdCBwcmVzZXRzLlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBjb25zb2xlLmxvZyhidWlsZFByZXNldENvbmZpZ3MoeyBcImZsYXQvcmVjb21tZW5kZWQtdHlwZXNjcmlwdC1lcnJvclwiOiB7fSBhcyBMaW50ZXIuQ29uZmlnIH0pLmxlbmd0aCk7XHJcbiAqL1xyXG5mdW5jdGlvbiBidWlsZFByZXNldENvbmZpZ3MoY29uZmlnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBMaW50ZXIuQ29uZmlnW10ge1xyXG4gIHJldHVybiBqc2RvY1ByZXNldE5hbWVzLmZsYXRNYXAoKGNvbmZpZ05hbWUpID0+IHtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ3NbY29uZmlnTmFtZV07XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBjb25maWcgPT09IHZvaWQgMCB8fFxyXG4gICAgICBBcnJheS5pc0FycmF5KGNvbmZpZykgfHxcclxuICAgICAgdHlwZW9mIGNvbmZpZyAhPT0gXCJvYmplY3RcIlxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW2NvbmZpZyBhcyBMaW50ZXIuQ29uZmlnXTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIHRoZSBmaW5hbCByZXBvLW93bmVkIEpTRG9jIGNvbmZpZ3Mgb24gdG9wIG9mIHRoZSB1cHN0cmVhbSBwcmVzZXRzLlxyXG4gKiBAcGFyYW0gY3VzdG9tRXJyb3IgUmVwby1vd25lZCBKU0RvYyBydWxlIG92ZXJyaWRlcy5cclxuICogQHBhcmFtIHR5cGVTY3JpcHRFeGFtcGxlQ29uZmlncyBQcm9jZXNzb3ItYmFja2VkIFR5cGVTY3JpcHQgZXhhbXBsZSBjb25maWdzLlxyXG4gKiBAcmV0dXJucyBUaGUgZmluYWwgRVNMaW50IGNvbmZpZyBhcnJheS5cclxuICogQGV4YW1wbGVcclxuICogY29uc29sZS5sb2coYnVpbGRSZXBvSnNkb2NDb25maWdzKHt9LCBbXSkubGVuZ3RoKTtcclxuICovXHJcbmZ1bmN0aW9uIGJ1aWxkUmVwb0pzZG9jQ29uZmlncyhcclxuICBjdXN0b21FcnJvcjogTGludGVyLlJ1bGVzUmVjb3JkLFxyXG4gIHR5cGVTY3JpcHRFeGFtcGxlQ29uZmlnczogTGludGVyLkNvbmZpZ1tdLFxyXG4pOiBMaW50ZXIuQ29uZmlnW10ge1xyXG4gIHJldHVybiBkZWZpbmVDb25maWcoXHJcbiAgICAuLi50eXBlU2NyaXB0RXhhbXBsZUNvbmZpZ3MsXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6IFwianNkb2MvY3VzdG9tXCIsXHJcbiAgICAgIHJ1bGVzOiB7XHJcbiAgICAgICAgLi4uY3VzdG9tRXJyb3IsXHJcbiAgICAgICAgXCJqc2RvYy90ZXh0LWVzY2FwaW5nXCI6IFwib2ZmXCIsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiBcImpzZG9jL3JlcXVpcmUtanNkb2MtYWxpYXNcIixcclxuICAgICAgcnVsZXM6IHtcclxuICAgICAgICBcImpzZG9jL3JlcXVpcmUtZGVzY3JpcHRpb25cIjogW1xyXG4gICAgICAgICAgXCJlcnJvclwiLFxyXG4gICAgICAgICAgeyBjb250ZXh0czogcmVxdWlyZUpzZG9jQ29udGV4dHMgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIFwianNkb2MvcmVxdWlyZS1qc2RvY1wiOiBbXCJlcnJvclwiLCB7IGNvbnRleHRzOiByZXF1aXJlSnNkb2NDb250ZXh0cyB9XSxcclxuICAgICAgfSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGZpbGVzOiBbXCIqKi8qLnNwZWMudHNcIl0sXHJcbiAgICAgIG5hbWU6IFwianNkb2MvY3VzdG9tLXNwZWNcIixcclxuICAgICAgcnVsZXM6IHtcclxuICAgICAgICBcImpzZG9jL2NvbnZlcnQtdG8tanNkb2MtY29tbWVudHNcIjogW1xyXG4gICAgICAgICAgXCJlcnJvclwiLFxyXG4gICAgICAgICAgeyBhbGxvd2VkUHJlZml4ZXM6IFtcIkFycmFuZ2VcIiwgXCJBY3RcIl0gfSxcclxuICAgICAgICBdLFxyXG4gICAgICB9LFxyXG4gICAgfSxcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgdGhlIGpzZG9jIHBsdWdpbiBjb25maWd1cmF0aW9uIGFuZCBhbnkgb3ZlcnJpZGVzIG5lZWRlZCBieSB0aGlzIHByb2plY3QuXHJcbiAqIEByZXR1cm5zIFJldHVybiB2YWx1ZSBvdXRwdXQuXHJcbiAqIEBleGFtcGxlXHJcbiAqIGNvbnNvbGUubG9nKGF3YWl0IGpzZG9jKCkpO1xyXG4gKi9cclxuYXN5bmMgZnVuY3Rpb24ganNkb2MoKTogUHJvbWlzZTxMaW50ZXIuQ29uZmlnW10+IHtcclxuICBjb25zdCBqc2RvY01vZHVsZSA9IGF3YWl0IGltcG9ydChcImVzbGludC1wbHVnaW4tanNkb2NcIik7XHJcbiAgY29uc3QgdHlwZVNjcmlwdE1vZHVsZSA9IGF3YWl0IGltcG9ydChcInR5cGVzY3JpcHQtZXNsaW50XCIpO1xyXG4gIGNvbnN0IHsgZGVmYXVsdDoganNkb2NQbHVnaW4gfSA9IGpzZG9jTW9kdWxlO1xyXG4gIGNvbnN0IHsgY29uZmlncywgcnVsZXMgfSA9IGpzZG9jUGx1Z2luO1xyXG4gIGNvbnN0IGdldEpzZG9jUHJvY2Vzc29yUGx1Z2luID0gcmVzb2x2ZUpzZG9jUHJvY2Vzc29yUGx1Z2luKGpzZG9jTW9kdWxlKTtcclxuICBjb25zdCB7XHJcbiAgICBjb25maWdzOiB0eXBlU2NyaXB0Q29uZmlncyxcclxuICAgIHBhcnNlcixcclxuICAgIHBsdWdpbjogdHlwZVNjcmlwdFBsdWdpbixcclxuICB9ID0gdHlwZVNjcmlwdE1vZHVsZTtcclxuXHJcbiAgY29uc3QgYXZhaWxhYmxlUnVsZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHJ1bGVzID8/IHt9KSksXHJcbiAgICBjdXN0b21FcnJvciA9IGJ1aWxkQ3VzdG9tRXJyb3JSdWxlcyhhdmFpbGFibGVSdWxlcyksXHJcbiAgICBkaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyA9IHJlc29sdmVEaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyh0eXBlU2NyaXB0Q29uZmlncyksXHJcbiAgICBwcmVzZXRDb25maWdzID0gYnVpbGRQcmVzZXRDb25maWdzKGNvbmZpZ3MpLFxyXG4gICAgdHlwZVNjcmlwdEV4YW1wbGVDb25maWdzID0gYnVpbGRUeXBlU2NyaXB0RXhhbXBsZUNvbmZpZ3Moe1xyXG4gICAgICBkaXNhYmxlVHlwZUNoZWNrZWRSdWxlcyxcclxuICAgICAgZ2V0SnNkb2NQcm9jZXNzb3JQbHVnaW4sXHJcbiAgICAgIHBhcnNlcixcclxuICAgICAgdHlwZVNjcmlwdFBsdWdpbixcclxuICAgIH0pO1xyXG5cclxuICByZXR1cm4gZGVmaW5lQ29uZmlnKFxyXG4gICAgLi4ucHJlc2V0Q29uZmlncyxcclxuICAgIC4uLmJ1aWxkUmVwb0pzZG9jQ29uZmlncyhjdXN0b21FcnJvciwgdHlwZVNjcmlwdEV4YW1wbGVDb25maWdzKSxcclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgeyBqc2RvYyB9O1xyXG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codeperfect/eslint-config",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "A shareable flat ESLint config for TypeScript repositories",
5
5
  "keywords": [
6
6
  "eslint",
@@ -1,44 +0,0 @@
1
- /** List of supported plugin names used in config tests. */
2
- declare const allPlugins: ["eslint", "resolver", "typescript", "boundaries", "import-x", "comments", "jsdoc", "jasmine", "jest", "playwright", "vitest", "rxjs-x", "perfectionist", "prettier", "stylistic", "unicorn"];
3
- /**
4
- * Mock all plugin loaders to return empty configurations.
5
- * @example
6
- * ```typescript
7
- * mockAllEmpty();
8
- * ```
9
- */
10
- declare function mockAllEmpty(): void;
11
- /**
12
- * Mock all plugin loaders to return small sample configurations.
13
- * @example
14
- * ```typescript
15
- * mockAllEnabled();
16
- * ```
17
- */
18
- declare function mockAllEnabled(): void;
19
- /**
20
- * Mock architecture loaders so `boundaries` only activates with repository input.
21
- * @example
22
- * ```typescript
23
- * mockBoundariesAware();
24
- * ```
25
- */
26
- declare function mockBoundariesAware(): void;
27
- /**
28
- * Mock non-core plugin loaders to return empty configs.
29
- * @example
30
- * ```typescript
31
- * mockNonCoreEmpty();
32
- * ```
33
- */
34
- declare function mockNonCoreEmpty(): void;
35
- /**
36
- * Mock a config composition where required loaders succeed and one optional loader fails.
37
- * @example
38
- * ```typescript
39
- * mockOptionalResolverFailure();
40
- * ```
41
- */
42
- declare function mockOptionalResolverFailure(): void;
43
- export { allPlugins, mockAllEmpty, mockAllEnabled, mockBoundariesAware, mockNonCoreEmpty, mockOptionalResolverFailure, };
44
- //# sourceMappingURL=index-spec-helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-spec-helpers.d.ts","sourceRoot":"","sources":["../src/index-spec-helpers.ts"],"names":[],"mappings":"AAOA,2DAA2D;AAC3D,QAAA,MAAM,UAAU,+LAiBiB,CAAC;AAElC;;;;;;GAMG;AACH,iBAAS,YAAY,IAAI,IAAI,CAuB5B;AAED;;;;;;GAMG;AACH,iBAAS,cAAc,IAAI,IAAI,CAuB9B;AAED;;;;;;GAMG;AACH,iBAAS,mBAAmB,IAAI,IAAI,CAwBnC;AAED;;;;;;GAMG;AACH,iBAAS,gBAAgB,IAAI,IAAI,CAyBhC;AAED;;;;;;GAMG;AACH,iBAAS,2BAA2B,IAAI,IAAI,CA2B3C;AAED,OAAO,EACL,UAAU,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,2BAA2B,GAC5B,CAAC"}
@@ -1,175 +0,0 @@
1
- import { vi } from "vitest";
2
- /** List of supported plugin names used in config tests. */
3
- const allPlugins = [
4
- "eslint",
5
- "resolver",
6
- "typescript",
7
- "boundaries",
8
- "import-x",
9
- "comments",
10
- "jsdoc",
11
- "jasmine",
12
- "jest",
13
- "playwright",
14
- "vitest",
15
- "rxjs-x",
16
- "perfectionist",
17
- "prettier",
18
- "stylistic",
19
- "unicorn",
20
- ];
21
- /**
22
- * Mock all plugin loaders to return empty configurations.
23
- * @example
24
- * ```typescript
25
- * mockAllEmpty();
26
- * ```
27
- */
28
- function mockAllEmpty() {
29
- vi.doMock("./configs", () => ({
30
- boundaries: () => [],
31
- comments: () => [],
32
- eslint: () => [],
33
- importX: () => [],
34
- jasmine: () => [],
35
- jest: () => [],
36
- jsdoc: () => [],
37
- perfectionist: () => [],
38
- playwright: () => [],
39
- prettier: () => [],
40
- resolver: () => [],
41
- rxjsX: () => [],
42
- stylistic: () => [],
43
- typescript: () => [],
44
- unicorn: async () => {
45
- const configs = await Promise.resolve([]);
46
- return configs;
47
- },
48
- vitest: () => [],
49
- }));
50
- }
51
- /**
52
- * Mock all plugin loaders to return small sample configurations.
53
- * @example
54
- * ```typescript
55
- * mockAllEnabled();
56
- * ```
57
- */
58
- function mockAllEnabled() {
59
- vi.doMock("./configs", () => ({
60
- boundaries: () => [{ name: "architecture-boundaries" }],
61
- comments: () => [{ name: "docs-comments" }],
62
- eslint: () => [{ name: "core-eslint" }],
63
- importX: () => [{ name: "architecture-import-x" }],
64
- jasmine: () => [{ name: "testing-jasmine" }],
65
- jest: () => [{ name: "testing-jest" }],
66
- jsdoc: () => [{ name: "docs-jsdoc" }],
67
- perfectionist: () => [{ name: "style-perfectionist" }],
68
- playwright: () => [{ name: "testing-playwright" }],
69
- prettier: () => [{ name: "style-prettier" }],
70
- resolver: () => [{ name: "core-resolver" }],
71
- rxjsX: () => [{ name: "domain-rxjs" }],
72
- stylistic: () => [{ name: "style-stylistic" }],
73
- typescript: () => [{ name: "core-typescript" }],
74
- unicorn: async () => {
75
- const configs = await Promise.resolve([{ name: "style-unicorn" }]);
76
- return configs;
77
- },
78
- vitest: () => [{ name: "testing-vitest" }],
79
- }));
80
- }
81
- /**
82
- * Mock architecture loaders so `boundaries` only activates with repository input.
83
- * @example
84
- * ```typescript
85
- * mockBoundariesAware();
86
- * ```
87
- */
88
- function mockBoundariesAware() {
89
- vi.doMock("./configs", () => ({
90
- boundaries: (boundaries) => boundaries === void 0 ? [] : [{ name: "architecture-boundaries" }],
91
- comments: () => [{ name: "docs-comments" }],
92
- eslint: () => [{ name: "core-eslint" }],
93
- importX: () => [{ name: "architecture-import-x" }],
94
- jasmine: () => [{ name: "testing-jasmine" }],
95
- jest: () => [{ name: "testing-jest" }],
96
- jsdoc: () => [{ name: "docs-jsdoc" }],
97
- perfectionist: () => [{ name: "style-perfectionist" }],
98
- playwright: () => [{ name: "testing-playwright" }],
99
- prettier: () => [{ name: "style-prettier" }],
100
- resolver: () => [{ name: "core-resolver" }],
101
- rxjsX: () => [{ name: "domain-rxjs" }],
102
- stylistic: () => [{ name: "style-stylistic" }],
103
- typescript: () => [{ name: "core-typescript" }],
104
- unicorn: async () => {
105
- const configs = await Promise.resolve([{ name: "style-unicorn" }]);
106
- return configs;
107
- },
108
- vitest: () => [{ name: "testing-vitest" }],
109
- }));
110
- }
111
- /**
112
- * Mock non-core plugin loaders to return empty configs.
113
- * @example
114
- * ```typescript
115
- * mockNonCoreEmpty();
116
- * ```
117
- */
118
- function mockNonCoreEmpty() {
119
- vi.doMock("./configs", async () => {
120
- const actual = await vi.importActual("./configs");
121
- return {
122
- ...actual,
123
- boundaries: () => [],
124
- comments: () => [],
125
- importX: () => [],
126
- jasmine: () => [],
127
- jest: () => [],
128
- jsdoc: () => [],
129
- perfectionist: () => [],
130
- playwright: () => [],
131
- prettier: () => [],
132
- rxjsX: () => [],
133
- stylistic: () => [],
134
- unicorn: async () => {
135
- const configs = await Promise.resolve([]);
136
- return configs;
137
- },
138
- vitest: () => [],
139
- };
140
- });
141
- }
142
- /**
143
- * Mock a config composition where required loaders succeed and one optional loader fails.
144
- * @example
145
- * ```typescript
146
- * mockOptionalResolverFailure();
147
- * ```
148
- */
149
- function mockOptionalResolverFailure() {
150
- vi.doMock("./configs", () => {
151
- return {
152
- boundaries: () => [],
153
- comments: () => [],
154
- eslint: () => [{ name: "core-eslint" }],
155
- importX: () => [],
156
- jasmine: () => [],
157
- jest: () => [],
158
- jsdoc: () => [],
159
- perfectionist: () => [],
160
- playwright: () => [],
161
- prettier: () => [],
162
- resolver: async () => {
163
- await Promise.resolve();
164
- throw new Error("Cannot find module 'eslint-import-resolver-typescript'");
165
- },
166
- rxjsX: () => [],
167
- stylistic: () => [],
168
- typescript: () => [{ name: "core-typescript" }],
169
- unicorn: () => [],
170
- vitest: () => [],
171
- };
172
- });
173
- }
174
- export { allPlugins, mockAllEmpty, mockAllEnabled, mockBoundariesAware, mockNonCoreEmpty, mockOptionalResolverFailure, };
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtc3BlYy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LXNwZWMtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBSzVCLDJEQUEyRDtBQUMzRCxNQUFNLFVBQVUsR0FBRztJQUNqQixRQUFRO0lBQ1IsVUFBVTtJQUNWLFlBQVk7SUFDWixZQUFZO0lBQ1osVUFBVTtJQUNWLFVBQVU7SUFDVixPQUFPO0lBQ1AsU0FBUztJQUNULE1BQU07SUFDTixZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUixlQUFlO0lBQ2YsVUFBVTtJQUNWLFdBQVc7SUFDWCxTQUFTO0NBQ3NCLENBQUM7QUFFbEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxZQUFZO0lBQ25CLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDNUIsVUFBVSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1FBQ3JDLFFBQVEsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtRQUNuQyxNQUFNLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7UUFDakMsT0FBTyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1FBQ2xDLE9BQU8sRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtRQUNsQyxJQUFJLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7UUFDL0IsS0FBSyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1FBQ2hDLGFBQWEsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtRQUN4QyxVQUFVLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7UUFDckMsUUFBUSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1FBQ25DLFFBQVEsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtRQUNuQyxLQUFLLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7UUFDaEMsU0FBUyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLFVBQVUsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtRQUNyQyxPQUFPLEVBQUUsS0FBSyxJQUE4QixFQUFFO1lBQzVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFxQixDQUFDLENBQUM7WUFFN0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtLQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGNBQWM7SUFDckIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixVQUFVLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsQ0FBQztRQUN4RSxRQUFRLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDNUQsTUFBTSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3hELE9BQU8sRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxDQUFDO1FBQ25FLE9BQU8sRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1FBQzdELElBQUksRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUN2RCxLQUFLLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7UUFDdEQsYUFBYSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLENBQUM7UUFDdkUsVUFBVSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFDbkUsUUFBUSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDN0QsUUFBUSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQzVELEtBQUssRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN2RCxTQUFTLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztRQUMvRCxVQUFVLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztRQUNoRSxPQUFPLEVBQUUsS0FBSyxJQUE4QixFQUFFO1lBQzVDLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUVuRSxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLENBQUM7S0FDNUQsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxtQkFBbUI7SUFDMUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM1QixVQUFVLEVBQUUsQ0FBQyxVQUFtQixFQUFtQixFQUFFLENBQ25ELFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLENBQUM7UUFDcEUsUUFBUSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQzVELE1BQU0sRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN4RCxPQUFPLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsQ0FBQztRQUNuRSxPQUFPLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztRQUM3RCxJQUFJLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDdkQsS0FBSyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ3RELGFBQWEsRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZFLFVBQVUsRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxDQUFDO1FBQ25FLFFBQVEsRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdELFFBQVEsRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUM1RCxLQUFLLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDdkQsU0FBUyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7UUFDL0QsVUFBVSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUM7UUFDaEUsT0FBTyxFQUFFLEtBQUssSUFBOEIsRUFBRTtZQUM1QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFbkUsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0tBQzVELENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsZ0JBQWdCO0lBQ3ZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBdUIsV0FBVyxDQUFDLENBQUM7UUFFeEUsT0FBTztZQUNMLEdBQUcsTUFBTTtZQUNULFVBQVUsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUNyQyxRQUFRLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDbkMsT0FBTyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUNsQyxJQUFJLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDL0IsS0FBSyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ2hDLGFBQWEsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUN4QyxVQUFVLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDckMsUUFBUSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLEtBQUssRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUNoQyxTQUFTLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxFQUFFLEtBQUssSUFBOEIsRUFBRTtnQkFDNUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQXFCLENBQUMsQ0FBQztnQkFFN0QsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtTQUNsQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywyQkFBMkI7SUFDbEMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQzFCLE9BQU87WUFDTCxVQUFVLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDckMsUUFBUSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sRUFBRSxHQUFvQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUN4RCxPQUFPLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDbEMsT0FBTyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ2xDLElBQUksRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUMvQixLQUFLLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDaEMsYUFBYSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ3hDLFVBQVUsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUNyQyxRQUFRLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDbkMsUUFBUSxFQUFFLEtBQUssSUFBOEIsRUFBRTtnQkFDN0MsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBRXhCLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0RBQXdELENBQ3pELENBQUM7WUFDSixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1lBQ2hDLFNBQVMsRUFBRSxHQUFvQixFQUFFLENBQUMsRUFBRTtZQUNwQyxVQUFVLEVBQUUsR0FBb0IsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztZQUNoRSxPQUFPLEVBQUUsR0FBb0IsRUFBRSxDQUFDLEVBQUU7WUFDbEMsTUFBTSxFQUFFLEdBQW9CLEVBQUUsQ0FBQyxFQUFFO1NBQ2xDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFlBQVksRUFDWixjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQiwyQkFBMkIsR0FDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGludGVyIH0gZnJvbSBcImVzbGludFwiO1xuXG5pbXBvcnQgeyB2aSB9IGZyb20gXCJ2aXRlc3RcIjtcblxuaW1wb3J0IHR5cGUgKiBhcyBDb25maWdzTW9kdWxlIGZyb20gXCIuL2NvbmZpZ3NcIjtcbmltcG9ydCB0eXBlIHsgUGx1Z2luTmFtZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKiBMaXN0IG9mIHN1cHBvcnRlZCBwbHVnaW4gbmFtZXMgdXNlZCBpbiBjb25maWcgdGVzdHMuICovXG5jb25zdCBhbGxQbHVnaW5zID0gW1xuICBcImVzbGludFwiLFxuICBcInJlc29sdmVyXCIsXG4gIFwidHlwZXNjcmlwdFwiLFxuICBcImJvdW5kYXJpZXNcIixcbiAgXCJpbXBvcnQteFwiLFxuICBcImNvbW1lbnRzXCIsXG4gIFwianNkb2NcIixcbiAgXCJqYXNtaW5lXCIsXG4gIFwiamVzdFwiLFxuICBcInBsYXl3cmlnaHRcIixcbiAgXCJ2aXRlc3RcIixcbiAgXCJyeGpzLXhcIixcbiAgXCJwZXJmZWN0aW9uaXN0XCIsXG4gIFwicHJldHRpZXJcIixcbiAgXCJzdHlsaXN0aWNcIixcbiAgXCJ1bmljb3JuXCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyBQbHVnaW5OYW1lW107XG5cbi8qKlxuICogTW9jayBhbGwgcGx1Z2luIGxvYWRlcnMgdG8gcmV0dXJuIGVtcHR5IGNvbmZpZ3VyYXRpb25zLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG1vY2tBbGxFbXB0eSgpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG1vY2tBbGxFbXB0eSgpOiB2b2lkIHtcbiAgdmkuZG9Nb2NrKFwiLi9jb25maWdzXCIsICgpID0+ICh7XG4gICAgYm91bmRhcmllczogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICBjb21tZW50czogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICBlc2xpbnQ6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgaW1wb3J0WDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICBqYXNtaW5lOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIGplc3Q6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAganNkb2M6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgcGVyZmVjdGlvbmlzdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICBwbGF5d3JpZ2h0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIHByZXR0aWVyOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIHJlc29sdmVyOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIHJ4anNYOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIHN0eWxpc3RpYzogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICB0eXBlc2NyaXB0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIHVuaWNvcm46IGFzeW5jICgpOiBQcm9taXNlPExpbnRlci5Db25maWdbXT4gPT4ge1xuICAgICAgY29uc3QgY29uZmlncyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShbXSBhcyBMaW50ZXIuQ29uZmlnW10pO1xuXG4gICAgICByZXR1cm4gY29uZmlncztcbiAgICB9LFxuICAgIHZpdGVzdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIE1vY2sgYWxsIHBsdWdpbiBsb2FkZXJzIHRvIHJldHVybiBzbWFsbCBzYW1wbGUgY29uZmlndXJhdGlvbnMuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbW9ja0FsbEVuYWJsZWQoKTtcbiAqIGBgYFxuICovXG5mdW5jdGlvbiBtb2NrQWxsRW5hYmxlZCgpOiB2b2lkIHtcbiAgdmkuZG9Nb2NrKFwiLi9jb25maWdzXCIsICgpID0+ICh7XG4gICAgYm91bmRhcmllczogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcImFyY2hpdGVjdHVyZS1ib3VuZGFyaWVzXCIgfV0sXG4gICAgY29tbWVudHM6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJkb2NzLWNvbW1lbnRzXCIgfV0sXG4gICAgZXNsaW50OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwiY29yZS1lc2xpbnRcIiB9XSxcbiAgICBpbXBvcnRYOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwiYXJjaGl0ZWN0dXJlLWltcG9ydC14XCIgfV0sXG4gICAgamFzbWluZTogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcInRlc3RpbmctamFzbWluZVwiIH1dLFxuICAgIGplc3Q6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJ0ZXN0aW5nLWplc3RcIiB9XSxcbiAgICBqc2RvYzogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcImRvY3MtanNkb2NcIiB9XSxcbiAgICBwZXJmZWN0aW9uaXN0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwic3R5bGUtcGVyZmVjdGlvbmlzdFwiIH1dLFxuICAgIHBsYXl3cmlnaHQ6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJ0ZXN0aW5nLXBsYXl3cmlnaHRcIiB9XSxcbiAgICBwcmV0dGllcjogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcInN0eWxlLXByZXR0aWVyXCIgfV0sXG4gICAgcmVzb2x2ZXI6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJjb3JlLXJlc29sdmVyXCIgfV0sXG4gICAgcnhqc1g6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJkb21haW4tcnhqc1wiIH1dLFxuICAgIHN0eWxpc3RpYzogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcInN0eWxlLXN0eWxpc3RpY1wiIH1dLFxuICAgIHR5cGVzY3JpcHQ6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJjb3JlLXR5cGVzY3JpcHRcIiB9XSxcbiAgICB1bmljb3JuOiBhc3luYyAoKTogUHJvbWlzZTxMaW50ZXIuQ29uZmlnW10+ID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoW3sgbmFtZTogXCJzdHlsZS11bmljb3JuXCIgfV0pO1xuXG4gICAgICByZXR1cm4gY29uZmlncztcbiAgICB9LFxuICAgIHZpdGVzdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcInRlc3Rpbmctdml0ZXN0XCIgfV0sXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBNb2NrIGFyY2hpdGVjdHVyZSBsb2FkZXJzIHNvIGBib3VuZGFyaWVzYCBvbmx5IGFjdGl2YXRlcyB3aXRoIHJlcG9zaXRvcnkgaW5wdXQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbW9ja0JvdW5kYXJpZXNBd2FyZSgpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG1vY2tCb3VuZGFyaWVzQXdhcmUoKTogdm9pZCB7XG4gIHZpLmRvTW9jayhcIi4vY29uZmlnc1wiLCAoKSA9PiAoe1xuICAgIGJvdW5kYXJpZXM6IChib3VuZGFyaWVzOiB1bmtub3duKTogTGludGVyLkNvbmZpZ1tdID0+XG4gICAgICBib3VuZGFyaWVzID09PSB2b2lkIDAgPyBbXSA6IFt7IG5hbWU6IFwiYXJjaGl0ZWN0dXJlLWJvdW5kYXJpZXNcIiB9XSxcbiAgICBjb21tZW50czogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcImRvY3MtY29tbWVudHNcIiB9XSxcbiAgICBlc2xpbnQ6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJjb3JlLWVzbGludFwiIH1dLFxuICAgIGltcG9ydFg6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJhcmNoaXRlY3R1cmUtaW1wb3J0LXhcIiB9XSxcbiAgICBqYXNtaW5lOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwidGVzdGluZy1qYXNtaW5lXCIgfV0sXG4gICAgamVzdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcInRlc3RpbmctamVzdFwiIH1dLFxuICAgIGpzZG9jOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwiZG9jcy1qc2RvY1wiIH1dLFxuICAgIHBlcmZlY3Rpb25pc3Q6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW3sgbmFtZTogXCJzdHlsZS1wZXJmZWN0aW9uaXN0XCIgfV0sXG4gICAgcGxheXdyaWdodDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcInRlc3RpbmctcGxheXdyaWdodFwiIH1dLFxuICAgIHByZXR0aWVyOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwic3R5bGUtcHJldHRpZXJcIiB9XSxcbiAgICByZXNvbHZlcjogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcImNvcmUtcmVzb2x2ZXJcIiB9XSxcbiAgICByeGpzWDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcImRvbWFpbi1yeGpzXCIgfV0sXG4gICAgc3R5bGlzdGljOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwic3R5bGUtc3R5bGlzdGljXCIgfV0sXG4gICAgdHlwZXNjcmlwdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbeyBuYW1lOiBcImNvcmUtdHlwZXNjcmlwdFwiIH1dLFxuICAgIHVuaWNvcm46IGFzeW5jICgpOiBQcm9taXNlPExpbnRlci5Db25maWdbXT4gPT4ge1xuICAgICAgY29uc3QgY29uZmlncyA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShbeyBuYW1lOiBcInN0eWxlLXVuaWNvcm5cIiB9XSk7XG5cbiAgICAgIHJldHVybiBjb25maWdzO1xuICAgIH0sXG4gICAgdml0ZXN0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwidGVzdGluZy12aXRlc3RcIiB9XSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIE1vY2sgbm9uLWNvcmUgcGx1Z2luIGxvYWRlcnMgdG8gcmV0dXJuIGVtcHR5IGNvbmZpZ3MuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbW9ja05vbkNvcmVFbXB0eSgpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG1vY2tOb25Db3JlRW1wdHkoKTogdm9pZCB7XG4gIHZpLmRvTW9jayhcIi4vY29uZmlnc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYWN0dWFsID0gYXdhaXQgdmkuaW1wb3J0QWN0dWFsPHR5cGVvZiBDb25maWdzTW9kdWxlPihcIi4vY29uZmlnc1wiKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5hY3R1YWwsXG4gICAgICBib3VuZGFyaWVzOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgY29tbWVudHM6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICBpbXBvcnRYOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgamFzbWluZTogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIGplc3Q6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICBqc2RvYzogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIHBlcmZlY3Rpb25pc3Q6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICBwbGF5d3JpZ2h0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgcHJldHRpZXI6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICByeGpzWDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIHN0eWxpc3RpYzogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIHVuaWNvcm46IGFzeW5jICgpOiBQcm9taXNlPExpbnRlci5Db25maWdbXT4gPT4ge1xuICAgICAgICBjb25zdCBjb25maWdzID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFtdIGFzIExpbnRlci5Db25maWdbXSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZ3M7XG4gICAgICB9LFxuICAgICAgdml0ZXN0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIE1vY2sgYSBjb25maWcgY29tcG9zaXRpb24gd2hlcmUgcmVxdWlyZWQgbG9hZGVycyBzdWNjZWVkIGFuZCBvbmUgb3B0aW9uYWwgbG9hZGVyIGZhaWxzLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG1vY2tPcHRpb25hbFJlc29sdmVyRmFpbHVyZSgpO1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIG1vY2tPcHRpb25hbFJlc29sdmVyRmFpbHVyZSgpOiB2b2lkIHtcbiAgdmkuZG9Nb2NrKFwiLi9jb25maWdzXCIsICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm91bmRhcmllczogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIGNvbW1lbnRzOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgZXNsaW50OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwiY29yZS1lc2xpbnRcIiB9XSxcbiAgICAgIGltcG9ydFg6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICBqYXNtaW5lOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgamVzdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIGpzZG9jOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgcGVyZmVjdGlvbmlzdDogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIHBsYXl3cmlnaHQ6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICBwcmV0dGllcjogKCk6IExpbnRlci5Db25maWdbXSA9PiBbXSxcbiAgICAgIHJlc29sdmVyOiBhc3luYyAoKTogUHJvbWlzZTxMaW50ZXIuQ29uZmlnW10+ID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGZpbmQgbW9kdWxlICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnXCIsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgcnhqc1g6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICBzdHlsaXN0aWM6ICgpOiBMaW50ZXIuQ29uZmlnW10gPT4gW10sXG4gICAgICB0eXBlc2NyaXB0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFt7IG5hbWU6IFwiY29yZS10eXBlc2NyaXB0XCIgfV0sXG4gICAgICB1bmljb3JuOiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgICAgdml0ZXN0OiAoKTogTGludGVyLkNvbmZpZ1tdID0+IFtdLFxuICAgIH07XG4gIH0pO1xufVxuXG5leHBvcnQge1xuICBhbGxQbHVnaW5zLFxuICBtb2NrQWxsRW1wdHksXG4gIG1vY2tBbGxFbmFibGVkLFxuICBtb2NrQm91bmRhcmllc0F3YXJlLFxuICBtb2NrTm9uQ29yZUVtcHR5LFxuICBtb2NrT3B0aW9uYWxSZXNvbHZlckZhaWx1cmUsXG59O1xuIl19