@codeperfect/eslint-config 1.1.0 → 1.2.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.
Files changed (47) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/architecture/import-x.d.ts.map +1 -1
  3. package/dist/architecture/import-x.js +2 -1
  4. package/dist/codeperfect-eslint-config-1.0.0.tgz +0 -0
  5. package/dist/config-composition.d.ts +2 -2
  6. package/dist/config-composition.d.ts.map +1 -1
  7. package/dist/config-composition.js +3 -1
  8. package/dist/config-factory.d.ts +14 -0
  9. package/dist/config-factory.d.ts.map +1 -0
  10. package/dist/config-factory.js +42 -0
  11. package/dist/configs/index.d.ts +1 -1
  12. package/dist/configs/index.d.ts.map +1 -1
  13. package/dist/configs/index.js +2 -2
  14. package/dist/core/codeperfect.d.ts +11 -0
  15. package/dist/core/codeperfect.d.ts.map +1 -0
  16. package/dist/core/codeperfect.js +14 -0
  17. package/dist/core/index.d.ts +1 -0
  18. package/dist/core/index.d.ts.map +1 -1
  19. package/dist/core/index.js +2 -1
  20. package/dist/docs/jsdoc.d.ts +3 -1
  21. package/dist/docs/jsdoc.d.ts.map +1 -1
  22. package/dist/docs/jsdoc.js +23 -19
  23. package/dist/index.d.ts +1 -13
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +2 -42
  26. package/dist/module-taxonomy.d.ts +3 -0
  27. package/dist/module-taxonomy.d.ts.map +1 -1
  28. package/dist/module-taxonomy.js +2 -1
  29. package/dist/plugin-loaders.d.ts +5 -0
  30. package/dist/plugin-loaders.d.ts.map +1 -1
  31. package/dist/plugin-loaders.js +7 -2
  32. package/dist/style/perfectionist.d.ts.map +1 -1
  33. package/dist/style/perfectionist.js +16 -2
  34. package/dist/style/stylistic.d.ts.map +1 -1
  35. package/dist/style/stylistic.js +4 -2
  36. package/dist/testing/vitest.d.ts.map +1 -1
  37. package/dist/testing/vitest.js +2 -1
  38. package/dist/types.d.ts +3 -3
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js +1 -1
  41. package/package.json +42 -41
  42. package/dist/docs/jsdoc-examples.d.ts +0 -56
  43. package/dist/docs/jsdoc-examples.d.ts.map +0 -1
  44. package/dist/docs/jsdoc-examples.js +0 -186
  45. package/dist/docs/jsdoc-processor.d.ts +0 -63
  46. package/dist/docs/jsdoc-processor.d.ts.map +0 -1
  47. package/dist/docs/jsdoc-processor.js +0 -112
@@ -1,63 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,112 +0,0 @@
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