@mnaoumov/typescript-dev-toolkit 1.3.1 → 2.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/README.md +4 -0
- package/assets/docs-site/components/ConstructorBlock.astro +16 -0
- package/assets/docs-site/components/ImportStatement.astro +12 -0
- package/assets/docs-site/components/MemberDetail.astro +101 -0
- package/assets/docs-site/components/MethodTable.astro +45 -0
- package/assets/docs-site/components/PropertyTable.astro +45 -0
- package/assets/docs-site/components/SiteTitle.astro +43 -0
- package/assets/docs-site/components/TypeSignature.astro +20 -0
- package/assets/docs-site/fonts/inter-latin-400-normal.ttf +0 -0
- package/assets/docs-site/fonts/inter-latin-700-normal.ttf +0 -0
- package/assets/docs-site/styles/global.css +221 -0
- package/dist/lib/cjs/build.cjs +1 -1
- package/dist/lib/cjs/build.d.cts +1 -1
- package/dist/lib/cjs/commitlint-config.cjs +18 -3
- package/dist/lib/cjs/commitlint-config.d.cts +6 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +2 -2
- package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
- package/dist/lib/cjs/commitlint-spellcheck-header.cjs +2 -2
- package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
- package/dist/lib/cjs/docs-site/api-doc-constants.cjs +171 -0
- package/dist/lib/cjs/docs-site/api-doc-constants.d.cts +18 -0
- package/dist/lib/cjs/docs-site/api-doc-jsdoc.cjs +414 -0
- package/dist/lib/cjs/docs-site/api-doc-jsdoc.d.cts +149 -0
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +377 -0
- package/dist/lib/cjs/docs-site/api-doc-link-rendering.d.cts +185 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +118 -0
- package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +36 -0
- package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +561 -0
- package/dist/lib/cjs/docs-site/api-doc-page-generation.d.cts +159 -0
- package/dist/lib/cjs/docs-site/api-doc-route-segments.cjs +42 -0
- package/dist/lib/cjs/docs-site/api-doc-route-segments.d.cts +25 -0
- package/dist/lib/cjs/docs-site/api-doc-settings.cjs +47 -0
- package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +53 -0
- package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +288 -0
- package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +75 -0
- package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +281 -0
- package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +178 -0
- package/dist/lib/cjs/docs-site/api-doc-type-merging.cjs +157 -0
- package/dist/lib/cjs/docs-site/api-doc-type-merging.d.cts +51 -0
- package/dist/lib/cjs/docs-site/api-doc-types.cjs +22 -0
- package/dist/lib/cjs/docs-site/api-doc-types.d.cts +157 -0
- package/dist/lib/cjs/docs-site/api-docs.cjs +143 -0
- package/dist/lib/cjs/docs-site/api-docs.d.cts +34 -0
- package/dist/lib/cjs/docs-site/astro-config.cjs +169 -0
- package/dist/lib/cjs/docs-site/astro-config.d.cts +23 -0
- package/dist/lib/cjs/docs-site/docs-links.cjs +123 -0
- package/dist/lib/cjs/docs-site/docs-links.d.cts +32 -0
- package/dist/lib/cjs/docs-site/docs-site-assets.cjs +64 -0
- package/dist/lib/cjs/docs-site/docs-site-assets.d.cts +23 -0
- package/dist/lib/cjs/docs-site/docs-site-commands.cjs +72 -0
- package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +29 -0
- package/dist/lib/cjs/docs-site/docs-site-config.cjs +122 -0
- package/dist/lib/cjs/docs-site/docs-site-config.d.cts +162 -0
- package/dist/lib/cjs/docs-site/index.cjs +116 -0
- package/dist/lib/cjs/docs-site/index.d.cts +26 -0
- package/dist/lib/cjs/docs-site/link-check.cjs +197 -0
- package/dist/lib/cjs/docs-site/link-check.d.cts +163 -0
- package/dist/lib/cjs/docs-site/og-image-page.cjs +45 -0
- package/dist/lib/cjs/docs-site/og-image-page.d.cts +15 -0
- package/dist/lib/cjs/docs-site/og-image.cjs +326 -0
- package/dist/lib/cjs/docs-site/og-image.d.cts +70 -0
- package/dist/lib/cjs/docs-site/og-images.cjs +170 -0
- package/dist/lib/cjs/docs-site/og-images.d.cts +41 -0
- package/dist/lib/cjs/docs-site/route-data.cjs +47 -0
- package/dist/lib/cjs/docs-site/route-data.d.cts +14 -0
- package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +97 -0
- package/dist/lib/cjs/docs-site/satteri-github-alerts.d.cts +31 -0
- package/dist/lib/cjs/docs-site/satteri-relative-links.cjs +87 -0
- package/dist/lib/cjs/docs-site/satteri-relative-links.d.cts +29 -0
- package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +51 -0
- package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +38 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library-build.cjs +1 -1
- package/dist/lib/cjs/library-build.d.cts +2 -2
- package/dist/lib/cjs/linters/eslint-config.cjs +17 -17
- package/dist/lib/cjs/linters/eslint-config.d.cts +1 -7
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +2 -2
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +5 -8
- package/dist/lib/cjs/package-manager.cjs +2 -2
- package/dist/lib/esm/build.d.mts +1 -1
- package/dist/lib/esm/build.mjs +1 -1
- package/dist/lib/esm/commitlint-config.d.mts +6 -0
- package/dist/lib/esm/commitlint-config.mjs +7 -3
- package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
- package/dist/lib/esm/commitlint-forbidden-patterns.mjs +2 -2
- package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
- package/dist/lib/esm/commitlint-spellcheck-header.mjs +2 -2
- package/dist/lib/esm/docs-site/api-doc-constants.d.mts +18 -0
- package/dist/lib/esm/docs-site/api-doc-constants.mjs +143 -0
- package/dist/lib/esm/docs-site/api-doc-jsdoc.d.mts +149 -0
- package/dist/lib/esm/docs-site/api-doc-jsdoc.mjs +377 -0
- package/dist/lib/esm/docs-site/api-doc-link-rendering.d.mts +185 -0
- package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +356 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +36 -0
- package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +91 -0
- package/dist/lib/esm/docs-site/api-doc-page-generation.d.mts +159 -0
- package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +548 -0
- package/dist/lib/esm/docs-site/api-doc-route-segments.d.mts +25 -0
- package/dist/lib/esm/docs-site/api-doc-route-segments.mjs +17 -0
- package/dist/lib/esm/docs-site/api-doc-settings.d.mts +53 -0
- package/dist/lib/esm/docs-site/api-doc-settings.mjs +22 -0
- package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +75 -0
- package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +274 -0
- package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +178 -0
- package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +239 -0
- package/dist/lib/esm/docs-site/api-doc-type-merging.d.mts +51 -0
- package/dist/lib/esm/docs-site/api-doc-type-merging.mjs +129 -0
- package/dist/lib/esm/docs-site/api-doc-types.d.mts +157 -0
- package/dist/lib/esm/docs-site/api-doc-types.mjs +6 -0
- package/dist/lib/esm/docs-site/api-docs.d.mts +34 -0
- package/dist/lib/esm/docs-site/api-docs.mjs +139 -0
- package/dist/lib/esm/docs-site/astro-config.d.mts +23 -0
- package/dist/lib/esm/docs-site/astro-config.mjs +135 -0
- package/dist/lib/esm/docs-site/docs-links.d.mts +32 -0
- package/dist/lib/esm/docs-site/docs-links.mjs +113 -0
- package/dist/lib/esm/docs-site/docs-site-assets.d.mts +23 -0
- package/dist/lib/esm/docs-site/docs-site-assets.mjs +32 -0
- package/dist/lib/esm/docs-site/docs-site-commands.d.mts +29 -0
- package/dist/lib/esm/docs-site/docs-site-commands.mjs +46 -0
- package/dist/lib/esm/docs-site/docs-site-config.d.mts +162 -0
- package/dist/lib/esm/docs-site/docs-site-config.mjs +98 -0
- package/dist/lib/esm/docs-site/index.d.mts +26 -0
- package/dist/lib/esm/docs-site/index.mjs +58 -0
- package/dist/lib/esm/docs-site/link-check.d.mts +163 -0
- package/dist/lib/esm/docs-site/link-check.mjs +166 -0
- package/dist/lib/esm/docs-site/og-image-page.d.mts +15 -0
- package/dist/lib/esm/docs-site/og-image-page.mjs +21 -0
- package/dist/lib/esm/docs-site/og-image.d.mts +70 -0
- package/dist/lib/esm/docs-site/og-image.mjs +292 -0
- package/dist/lib/esm/docs-site/og-images.d.mts +41 -0
- package/dist/lib/esm/docs-site/og-images.mjs +156 -0
- package/dist/lib/esm/docs-site/route-data.d.mts +14 -0
- package/dist/lib/esm/docs-site/route-data.mjs +23 -0
- package/dist/lib/esm/docs-site/satteri-github-alerts.d.mts +31 -0
- package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +72 -0
- package/dist/lib/esm/docs-site/satteri-relative-links.d.mts +29 -0
- package/dist/lib/esm/docs-site/satteri-relative-links.mjs +63 -0
- package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +38 -0
- package/dist/lib/esm/docs-site/unrendered-alerts.mjs +26 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library-build.d.mts +2 -2
- package/dist/lib/esm/library-build.mjs +1 -1
- package/dist/lib/esm/linters/eslint-config.d.mts +1 -7
- package/dist/lib/esm/linters/eslint-config.mjs +17 -17
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +5 -8
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +2 -2
- package/dist/lib/esm/package-manager.mjs +2 -2
- package/docs-site/api-doc-constants/package.json +6 -0
- package/docs-site/api-doc-jsdoc/package.json +6 -0
- package/docs-site/api-doc-link-rendering/package.json +6 -0
- package/docs-site/api-doc-package-sites/package.json +6 -0
- package/docs-site/api-doc-page-generation/package.json +6 -0
- package/docs-site/api-doc-route-segments/package.json +6 -0
- package/docs-site/api-doc-settings/package.json +6 -0
- package/docs-site/api-doc-source-processing/package.json +6 -0
- package/docs-site/api-doc-text-utils/package.json +6 -0
- package/docs-site/api-doc-type-merging/package.json +6 -0
- package/docs-site/api-doc-types/package.json +6 -0
- package/docs-site/api-docs/package.json +6 -0
- package/docs-site/astro-config/package.json +6 -0
- package/docs-site/docs-links/package.json +6 -0
- package/docs-site/docs-site-assets/package.json +6 -0
- package/docs-site/docs-site-commands/package.json +6 -0
- package/docs-site/docs-site-config/package.json +6 -0
- package/docs-site/index/package.json +6 -0
- package/docs-site/link-check/package.json +6 -0
- package/docs-site/og-image/package.json +6 -0
- package/docs-site/og-image-page/package.json +6 -0
- package/docs-site/og-images/package.json +6 -0
- package/docs-site/package.json +6 -0
- package/docs-site/route-data/package.json +6 -0
- package/docs-site/satteri-github-alerts/package.json +6 -0
- package/docs-site/satteri-relative-links/package.json +6 -0
- package/docs-site/unrendered-alerts/package.json +6 -0
- package/package.json +75 -5
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* JSDoc/declaration extraction: turns ts-morph declarations into the generator's `TypeInfo`/`MemberInfo`.
|
|
6
|
+
*/
|
|
7
|
+
import type { ClassDeclaration, ConstructorDeclaration, EnumDeclaration, InterfaceDeclaration, JSDocableNode, MethodDeclaration, MethodSignature, PropertyDeclaration, PropertySignature, SourceFile, TypeAliasDeclaration } from 'ts-morph';
|
|
8
|
+
import type { MemberInfo, ReturnTypeProvider, TypeInfo } from './api-doc-types.mjs';
|
|
9
|
+
/**
|
|
10
|
+
* Extracts a class's model: its constructor, non-private properties and methods, and documentation.
|
|
11
|
+
*
|
|
12
|
+
* @param cls - The class declaration.
|
|
13
|
+
* @param namespace - The type's namespace.
|
|
14
|
+
* @returns The class's model.
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractClassInfo(cls: ClassDeclaration, namespace: string): TypeInfo;
|
|
17
|
+
/**
|
|
18
|
+
* Extracts a constructor's model.
|
|
19
|
+
*
|
|
20
|
+
* @param ctor - The constructor declaration.
|
|
21
|
+
* @returns The constructor's model.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractConstructorInfo(ctor: ConstructorDeclaration): MemberInfo;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts an enum's model.
|
|
26
|
+
*
|
|
27
|
+
* @param enumDeclaration - The enum declaration.
|
|
28
|
+
* @param namespace - The type's namespace.
|
|
29
|
+
* @returns The enum's model.
|
|
30
|
+
*/
|
|
31
|
+
export declare function extractEnumInfo(enumDeclaration: EnumDeclaration, namespace: string): TypeInfo;
|
|
32
|
+
/**
|
|
33
|
+
* Extract the module-level `@file` description text, if any.
|
|
34
|
+
*
|
|
35
|
+
* @param src - The source file.
|
|
36
|
+
* @returns The overview, or an empty string when the file has no `@file` block.
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractFileOverview(src: SourceFile): string;
|
|
39
|
+
/**
|
|
40
|
+
* Extracts an interface's model.
|
|
41
|
+
*
|
|
42
|
+
* @param iface - The interface declaration.
|
|
43
|
+
* @param namespace - The type's namespace.
|
|
44
|
+
* @returns The interface's model.
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractInterfaceInfo(iface: InterfaceDeclaration, namespace: string): TypeInfo;
|
|
47
|
+
/**
|
|
48
|
+
* Extracts a class method's model.
|
|
49
|
+
*
|
|
50
|
+
* @param method - The method.
|
|
51
|
+
* @returns The method's model.
|
|
52
|
+
*/
|
|
53
|
+
export declare function extractMethodInfo(method: MethodDeclaration): MemberInfo;
|
|
54
|
+
/**
|
|
55
|
+
* Extracts an interface method's model.
|
|
56
|
+
*
|
|
57
|
+
* @param method - The method.
|
|
58
|
+
* @returns The method's model.
|
|
59
|
+
*/
|
|
60
|
+
export declare function extractMethodSignatureInfo(method: MethodSignature): MemberInfo;
|
|
61
|
+
/**
|
|
62
|
+
* Extracts a class property's model.
|
|
63
|
+
*
|
|
64
|
+
* @param property - The property.
|
|
65
|
+
* @returns The property's model.
|
|
66
|
+
*/
|
|
67
|
+
export declare function extractPropertyInfo(property: PropertyDeclaration): MemberInfo;
|
|
68
|
+
/**
|
|
69
|
+
* Extracts an interface property's model.
|
|
70
|
+
*
|
|
71
|
+
* @param property - The property.
|
|
72
|
+
* @returns The property's model.
|
|
73
|
+
*/
|
|
74
|
+
export declare function extractPropertySignatureInfo(property: PropertySignature): MemberInfo;
|
|
75
|
+
/**
|
|
76
|
+
* Extracts a type alias's model.
|
|
77
|
+
*
|
|
78
|
+
* @param alias - The type alias declaration.
|
|
79
|
+
* @param namespace - The type's namespace.
|
|
80
|
+
* @returns The type alias's model.
|
|
81
|
+
*/
|
|
82
|
+
export declare function extractTypeAliasInfo(alias: TypeAliasDeclaration, namespace: string): TypeInfo;
|
|
83
|
+
/**
|
|
84
|
+
* Get the return type as declared in source (preserves union order), falling back to resolved type
|
|
85
|
+
*
|
|
86
|
+
* @param method - The method or function.
|
|
87
|
+
* @returns The return type.
|
|
88
|
+
*/
|
|
89
|
+
export declare function getDeclaredReturnType(method: ReturnTypeProvider): string;
|
|
90
|
+
/**
|
|
91
|
+
* Extracts the JSDoc description of a node.
|
|
92
|
+
*
|
|
93
|
+
* @param node - The node.
|
|
94
|
+
* @returns The description, or an empty string.
|
|
95
|
+
*/
|
|
96
|
+
export declare function getDescription(node: JSDocableNode): string;
|
|
97
|
+
/**
|
|
98
|
+
* Extract
|
|
99
|
+
*
|
|
100
|
+
* @param node - The node.
|
|
101
|
+
* @returns The examples' texts.
|
|
102
|
+
* @example blocks from JSDoc
|
|
103
|
+
*/
|
|
104
|
+
export declare function getExamples(node: JSDocableNode): string[];
|
|
105
|
+
/**
|
|
106
|
+
* Extract
|
|
107
|
+
*
|
|
108
|
+
* @param node - The node.
|
|
109
|
+
* @returns Each parameter's name mapped to its description.
|
|
110
|
+
*/
|
|
111
|
+
export declare function getParameterDescriptions(node: JSDocableNode): Map<string, string>;
|
|
112
|
+
/**
|
|
113
|
+
* Strip `| undefined` only when it was implicitly added by ts-morph for optional properties
|
|
114
|
+
*
|
|
115
|
+
* @param property - The property.
|
|
116
|
+
* @returns The type text.
|
|
117
|
+
*/
|
|
118
|
+
export declare function getPropertyType(property: PropertyDeclaration | PropertySignature): string;
|
|
119
|
+
/**
|
|
120
|
+
* Extract
|
|
121
|
+
*
|
|
122
|
+
* @param node - The node.
|
|
123
|
+
* @returns The remarks, or an empty string.
|
|
124
|
+
* @remarks text from JSDoc
|
|
125
|
+
*/
|
|
126
|
+
export declare function getRemarks(node: JSDocableNode): string;
|
|
127
|
+
/**
|
|
128
|
+
* Extract
|
|
129
|
+
*
|
|
130
|
+
* @param node - The node.
|
|
131
|
+
* @returns description from JSDoc
|
|
132
|
+
*/
|
|
133
|
+
export declare function getReturnDescription(node: JSDocableNode): string;
|
|
134
|
+
/**
|
|
135
|
+
* Extract the version a JSDoc `since` tag names.
|
|
136
|
+
*
|
|
137
|
+
* @param node - The node.
|
|
138
|
+
* @returns The version, or an empty string.
|
|
139
|
+
*/
|
|
140
|
+
export declare function getSince(node: JSDocableNode): string;
|
|
141
|
+
/**
|
|
142
|
+
* Resolve `typeof aliasName` patterns where aliasName is an import alias.
|
|
143
|
+
* E.g., `typeof momentInstance` → `typeof moment` when `import { moment as momentInstance }`.
|
|
144
|
+
*
|
|
145
|
+
* @param typeText - The type text.
|
|
146
|
+
* @param sourceFile - The source file holding the imports.
|
|
147
|
+
* @returns The type text with the original names.
|
|
148
|
+
*/
|
|
149
|
+
export declare function resolveTypeofAliases(typeText: string, sourceFile: SourceFile): string;
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return '/';
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: 'android'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const existingProcess = globalThis.process;
|
|
17
|
+
|
|
18
|
+
if (!existingProcess) {
|
|
19
|
+
globalThis.process = browserProcess;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (existingProcess.versions?.node) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingProcessRecord = existingProcess;
|
|
28
|
+
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
existingProcessRecord['browser'] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
import { getMandatoryNamedGroup } from "@mnaoumov/typescript-lib/reg-exp";
|
|
40
|
+
import { Scope } from "ts-morph";
|
|
41
|
+
import {
|
|
42
|
+
computeOverloadKey,
|
|
43
|
+
foldTsDocParagraphs,
|
|
44
|
+
replaceRegExpMatches,
|
|
45
|
+
simplifyType
|
|
46
|
+
} from "./api-doc-text-utils.mjs";
|
|
47
|
+
function extractClassInfo(cls, namespace) {
|
|
48
|
+
const name = cls.getNameOrThrow();
|
|
49
|
+
const constructor = cls.getConstructors().find((c) => c.getScope() !== Scope.Private);
|
|
50
|
+
const extendsClause = cls.getExtends();
|
|
51
|
+
return {
|
|
52
|
+
baseTypes: extendsClause ? [extendsClause.getText()] : [],
|
|
53
|
+
constructorInfo: constructor ? extractConstructorInfo(constructor) : void 0,
|
|
54
|
+
description: getDescription(cls),
|
|
55
|
+
enumMembers: [],
|
|
56
|
+
examples: getExamples(cls),
|
|
57
|
+
implementsTypes: cls.getImplements().map((index) => index.getText()),
|
|
58
|
+
kind: "class",
|
|
59
|
+
methods: cls.getMethods().filter((m) => m.getScope() !== Scope.Private).map((m) => extractMethodInfo(m)),
|
|
60
|
+
name,
|
|
61
|
+
namespace,
|
|
62
|
+
properties: cls.getProperties().filter((p) => p.getScope() !== Scope.Private).map((p) => extractPropertyInfo(p)),
|
|
63
|
+
remarks: getRemarks(cls),
|
|
64
|
+
typeParameters: cls.getTypeParameters().map((tp) => tp.getText())
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function extractConstructorInfo(ctor) {
|
|
68
|
+
const parameterDescriptions = getParameterDescriptions(ctor);
|
|
69
|
+
const params = ctor.getParameters().map((p) => {
|
|
70
|
+
const isOptional = p.isOptional();
|
|
71
|
+
const optionalSuffix = isOptional ? "?" : "";
|
|
72
|
+
return {
|
|
73
|
+
description: parameterDescriptions.get(p.getName()) ?? (isOptional ? "*(Optional)*" : ""),
|
|
74
|
+
name: `${p.getName()}${optionalSuffix}`,
|
|
75
|
+
type: simplifyType(p.getType().getText())
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
|
|
79
|
+
return {
|
|
80
|
+
description: getDescription(ctor),
|
|
81
|
+
examples: getExamples(ctor),
|
|
82
|
+
inheritedFrom: "",
|
|
83
|
+
isStatic: false,
|
|
84
|
+
name: "constructor",
|
|
85
|
+
overloadKey: "constructor",
|
|
86
|
+
parameters: params,
|
|
87
|
+
remarks: getRemarks(ctor),
|
|
88
|
+
returnDescription: "",
|
|
89
|
+
returnType: "",
|
|
90
|
+
signature: `(${parameterString})`,
|
|
91
|
+
since: getSince(ctor),
|
|
92
|
+
type: ""
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function extractEnumInfo(enumDeclaration, namespace) {
|
|
96
|
+
const members = enumDeclaration.getMembers().map((m) => {
|
|
97
|
+
const initializer = m.getInitializer()?.getText() ?? "";
|
|
98
|
+
return {
|
|
99
|
+
description: getDescription(m),
|
|
100
|
+
name: m.getName(),
|
|
101
|
+
value: initializer
|
|
102
|
+
};
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
baseTypes: [],
|
|
106
|
+
description: getDescription(enumDeclaration),
|
|
107
|
+
enumMembers: members,
|
|
108
|
+
examples: getExamples(enumDeclaration),
|
|
109
|
+
implementsTypes: [],
|
|
110
|
+
kind: "enum",
|
|
111
|
+
methods: [],
|
|
112
|
+
name: enumDeclaration.getName(),
|
|
113
|
+
namespace,
|
|
114
|
+
properties: [],
|
|
115
|
+
remarks: getRemarks(enumDeclaration),
|
|
116
|
+
typeParameters: []
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function extractFileOverview(src) {
|
|
120
|
+
const text = src.getFullText();
|
|
121
|
+
const blockMatch = /\/\*\*(?<body>[\s\S]*?)\*\//.exec(text);
|
|
122
|
+
if (!blockMatch) {
|
|
123
|
+
return "";
|
|
124
|
+
}
|
|
125
|
+
const body = getMandatoryNamedGroup(blockMatch, "body");
|
|
126
|
+
if (!/@file\b/.test(body)) {
|
|
127
|
+
return "";
|
|
128
|
+
}
|
|
129
|
+
const stripped = body.split("\n").map((line) => line.replace(/^\s*\*?\s?/, "")).join("\n");
|
|
130
|
+
const afterFileTag = stripped.replace(/[\s\S]*?@file[ \t]*\r?\n?/, "");
|
|
131
|
+
return foldTsDocParagraphs(afterFileTag.trim());
|
|
132
|
+
}
|
|
133
|
+
function extractInterfaceInfo(iface, namespace) {
|
|
134
|
+
return {
|
|
135
|
+
baseTypes: iface.getExtends().map((error) => error.getText()),
|
|
136
|
+
description: getDescription(iface),
|
|
137
|
+
enumMembers: [],
|
|
138
|
+
examples: getExamples(iface),
|
|
139
|
+
implementsTypes: [],
|
|
140
|
+
kind: "interface",
|
|
141
|
+
methods: iface.getMethods().map((m) => extractMethodSignatureInfo(m)),
|
|
142
|
+
name: iface.getName(),
|
|
143
|
+
namespace,
|
|
144
|
+
properties: iface.getProperties().map((p) => extractPropertySignatureInfo(p)),
|
|
145
|
+
remarks: getRemarks(iface),
|
|
146
|
+
typeParameters: iface.getTypeParameters().map((tp) => tp.getText())
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function extractMethodInfo(method) {
|
|
150
|
+
const name = method.getName();
|
|
151
|
+
const parameterDescriptions = getParameterDescriptions(method);
|
|
152
|
+
const params = method.getParameters().map((p) => {
|
|
153
|
+
const isOptional = p.isOptional();
|
|
154
|
+
const optionalSuffix = isOptional ? "?" : "";
|
|
155
|
+
return {
|
|
156
|
+
description: parameterDescriptions.get(p.getName()) ?? (isOptional ? "*(Optional)*" : ""),
|
|
157
|
+
name: `${p.getName()}${optionalSuffix}`,
|
|
158
|
+
type: simplifyType(p.getType().getText())
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
|
|
162
|
+
const info = {
|
|
163
|
+
description: getDescription(method),
|
|
164
|
+
examples: getExamples(method),
|
|
165
|
+
inheritedFrom: "",
|
|
166
|
+
isStatic: method.isStatic(),
|
|
167
|
+
name,
|
|
168
|
+
overloadKey: "",
|
|
169
|
+
parameters: params,
|
|
170
|
+
remarks: getRemarks(method),
|
|
171
|
+
returnDescription: getReturnDescription(method),
|
|
172
|
+
returnType: getDeclaredReturnType(method),
|
|
173
|
+
signature: `${name}(${parameterString})`,
|
|
174
|
+
since: getSince(method),
|
|
175
|
+
type: ""
|
|
176
|
+
};
|
|
177
|
+
info.overloadKey = computeOverloadKey(info);
|
|
178
|
+
return info;
|
|
179
|
+
}
|
|
180
|
+
function extractMethodSignatureInfo(method) {
|
|
181
|
+
const name = method.getName();
|
|
182
|
+
const parameterDescriptions = getParameterDescriptions(method);
|
|
183
|
+
const params = method.getParameters().map((p) => {
|
|
184
|
+
const isOptional = p.isOptional();
|
|
185
|
+
const optionalSuffix = isOptional ? "?" : "";
|
|
186
|
+
return {
|
|
187
|
+
description: parameterDescriptions.get(p.getName()) ?? (isOptional ? "*(Optional)*" : ""),
|
|
188
|
+
name: `${p.getName()}${optionalSuffix}`,
|
|
189
|
+
type: simplifyType(p.getType().getText())
|
|
190
|
+
};
|
|
191
|
+
});
|
|
192
|
+
const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
|
|
193
|
+
const info = {
|
|
194
|
+
description: getDescription(method),
|
|
195
|
+
examples: getExamples(method),
|
|
196
|
+
inheritedFrom: "",
|
|
197
|
+
isStatic: false,
|
|
198
|
+
name,
|
|
199
|
+
overloadKey: "",
|
|
200
|
+
parameters: params,
|
|
201
|
+
remarks: getRemarks(method),
|
|
202
|
+
returnDescription: getReturnDescription(method),
|
|
203
|
+
returnType: getDeclaredReturnType(method),
|
|
204
|
+
signature: `${name}(${parameterString})`,
|
|
205
|
+
since: getSince(method),
|
|
206
|
+
type: ""
|
|
207
|
+
};
|
|
208
|
+
info.overloadKey = computeOverloadKey(info);
|
|
209
|
+
return info;
|
|
210
|
+
}
|
|
211
|
+
function extractPropertyInfo(property) {
|
|
212
|
+
const name = property.getName();
|
|
213
|
+
const isOptional = property.hasQuestionToken();
|
|
214
|
+
const optionalSuffix = isOptional ? "?" : "";
|
|
215
|
+
return {
|
|
216
|
+
description: getDescription(property),
|
|
217
|
+
examples: getExamples(property),
|
|
218
|
+
inheritedFrom: "",
|
|
219
|
+
isStatic: property.isStatic(),
|
|
220
|
+
name: `${name}${optionalSuffix}`,
|
|
221
|
+
overloadKey: "",
|
|
222
|
+
parameters: [],
|
|
223
|
+
remarks: getRemarks(property),
|
|
224
|
+
returnDescription: "",
|
|
225
|
+
returnType: "",
|
|
226
|
+
signature: `${name}${optionalSuffix}`,
|
|
227
|
+
since: getSince(property),
|
|
228
|
+
type: getPropertyType(property)
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function extractPropertySignatureInfo(property) {
|
|
232
|
+
const name = property.getName();
|
|
233
|
+
const isOptional = property.hasQuestionToken();
|
|
234
|
+
const optionalSuffix = isOptional ? "?" : "";
|
|
235
|
+
return {
|
|
236
|
+
description: getDescription(property),
|
|
237
|
+
examples: getExamples(property),
|
|
238
|
+
inheritedFrom: "",
|
|
239
|
+
isStatic: false,
|
|
240
|
+
name: `${name}${optionalSuffix}`,
|
|
241
|
+
overloadKey: "",
|
|
242
|
+
parameters: [],
|
|
243
|
+
remarks: getRemarks(property),
|
|
244
|
+
returnDescription: "",
|
|
245
|
+
returnType: "",
|
|
246
|
+
signature: `${name}${optionalSuffix}`,
|
|
247
|
+
since: getSince(property),
|
|
248
|
+
type: getPropertyType(property)
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function extractTypeAliasInfo(alias, namespace) {
|
|
252
|
+
return {
|
|
253
|
+
baseTypes: [],
|
|
254
|
+
description: getDescription(alias),
|
|
255
|
+
enumMembers: [],
|
|
256
|
+
examples: getExamples(alias),
|
|
257
|
+
implementsTypes: [],
|
|
258
|
+
kind: "type",
|
|
259
|
+
methods: [],
|
|
260
|
+
name: alias.getName(),
|
|
261
|
+
namespace,
|
|
262
|
+
properties: [],
|
|
263
|
+
remarks: getRemarks(alias),
|
|
264
|
+
typeAliasText: simplifyType(alias.getTypeNodeOrThrow().getText()),
|
|
265
|
+
typeParameters: alias.getTypeParameters().map((tp) => tp.getText())
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function getDeclaredReturnType(method) {
|
|
269
|
+
const annotation = method.getReturnTypeNode?.()?.getText();
|
|
270
|
+
return simplifyType(annotation ?? method.getReturnType().getText());
|
|
271
|
+
}
|
|
272
|
+
function getDescription(node) {
|
|
273
|
+
const lastDoc = node.getJsDocs().at(-1);
|
|
274
|
+
return lastDoc ? foldTsDocParagraphs(lastDoc.getDescription().trim()) : "";
|
|
275
|
+
}
|
|
276
|
+
function getExamples(node) {
|
|
277
|
+
const examples = [];
|
|
278
|
+
for (const doc of node.getJsDocs()) {
|
|
279
|
+
for (const tag of doc.getTags()) {
|
|
280
|
+
if (tag.getTagName() !== "example") {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const text = tag.getCommentText()?.trim() ?? "";
|
|
284
|
+
if (text) {
|
|
285
|
+
examples.push(text);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return examples;
|
|
290
|
+
}
|
|
291
|
+
function getParameterDescriptions(node) {
|
|
292
|
+
const result = /* @__PURE__ */ new Map();
|
|
293
|
+
const docs = node.getJsDocs();
|
|
294
|
+
for (const doc of docs) {
|
|
295
|
+
for (const tag of doc.getTags()) {
|
|
296
|
+
if (tag.getTagName() !== "param") {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
const comment = foldTsDocParagraphs(tag.getCommentText()?.trim().replaceAll(/\s*\*\s*$/g, "").replace(/^-\s*/, "").trim() ?? "");
|
|
300
|
+
const tagText = tag.getText();
|
|
301
|
+
const nameMatch = /@param\s+(?:\{[^}]*\}\s+)?(?<paramName>\w+)/.exec(tagText);
|
|
302
|
+
if (nameMatch) {
|
|
303
|
+
result.set(getMandatoryNamedGroup(nameMatch, "paramName"), comment);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
function getPropertyType(property) {
|
|
310
|
+
const typeNode = property.getTypeNode();
|
|
311
|
+
return typeNode ? resolveTypeofAliases(simplifyType(typeNode.getText()), property.getSourceFile()) : simplifyType(property.getType().getText());
|
|
312
|
+
}
|
|
313
|
+
function getRemarks(node) {
|
|
314
|
+
for (const doc of node.getJsDocs()) {
|
|
315
|
+
for (const tag of doc.getTags()) {
|
|
316
|
+
if (tag.getTagName() === "remarks" || tag.getTagName() === "remark") {
|
|
317
|
+
return foldTsDocParagraphs(tag.getCommentText()?.trim().replaceAll(/\s*\*\s*$/g, "").trim() ?? "");
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return "";
|
|
322
|
+
}
|
|
323
|
+
function getReturnDescription(node) {
|
|
324
|
+
for (const doc of node.getJsDocs()) {
|
|
325
|
+
for (const tag of doc.getTags()) {
|
|
326
|
+
if (tag.getTagName() === "returns") {
|
|
327
|
+
return foldTsDocParagraphs(tag.getCommentText()?.trim().replace(/^-\s*/, "").replaceAll(/\s*\*\s*$/g, "").trim() ?? "");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return "";
|
|
332
|
+
}
|
|
333
|
+
function getSince(node) {
|
|
334
|
+
for (const doc of node.getJsDocs()) {
|
|
335
|
+
for (const tag of doc.getTags()) {
|
|
336
|
+
if (tag.getTagName() === "since") {
|
|
337
|
+
return tag.getCommentText()?.trim().replaceAll(/\s*\*\s*$/g, "").trim() ?? "";
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return "";
|
|
342
|
+
}
|
|
343
|
+
function resolveTypeofAliases(typeText, sourceFile) {
|
|
344
|
+
return replaceRegExpMatches(typeText, /\btypeof (?<alias>[a-zA-Z][a-zA-Z0-9]*)\b/g, (match) => {
|
|
345
|
+
const alias = getMandatoryNamedGroup(match, "alias");
|
|
346
|
+
for (const importDeclaration of sourceFile.getImportDeclarations()) {
|
|
347
|
+
for (const namedImport of importDeclaration.getNamedImports()) {
|
|
348
|
+
if (namedImport.getAliasNode()?.getText() === alias) {
|
|
349
|
+
return `typeof ${namedImport.getName()}`;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return match[0];
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
export {
|
|
357
|
+
extractClassInfo,
|
|
358
|
+
extractConstructorInfo,
|
|
359
|
+
extractEnumInfo,
|
|
360
|
+
extractFileOverview,
|
|
361
|
+
extractInterfaceInfo,
|
|
362
|
+
extractMethodInfo,
|
|
363
|
+
extractMethodSignatureInfo,
|
|
364
|
+
extractPropertyInfo,
|
|
365
|
+
extractPropertySignatureInfo,
|
|
366
|
+
extractTypeAliasInfo,
|
|
367
|
+
getDeclaredReturnType,
|
|
368
|
+
getDescription,
|
|
369
|
+
getExamples,
|
|
370
|
+
getParameterDescriptions,
|
|
371
|
+
getPropertyType,
|
|
372
|
+
getRemarks,
|
|
373
|
+
getReturnDescription,
|
|
374
|
+
getSince,
|
|
375
|
+
resolveTypeofAliases
|
|
376
|
+
};
|
|
377
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1qc2RvYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogSlNEb2MvZGVjbGFyYXRpb24gZXh0cmFjdGlvbjogdHVybnMgdHMtbW9ycGggZGVjbGFyYXRpb25zIGludG8gdGhlIGdlbmVyYXRvcidzIGBUeXBlSW5mb2AvYE1lbWJlckluZm9gLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2xhc3NEZWNsYXJhdGlvbixcbiAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbixcbiAgRW51bURlY2xhcmF0aW9uLFxuICBJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgSlNEb2NhYmxlTm9kZSxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE1ldGhvZFNpZ25hdHVyZSxcbiAgUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgUHJvcGVydHlTaWduYXR1cmUsXG4gIFNvdXJjZUZpbGUsXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uXG59IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IFNjb3BlIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVudW1NZW1iZXJJbmZvLFxuICBNZW1iZXJJbmZvLFxuICBSZXR1cm5UeXBlUHJvdmlkZXIsXG4gIFR5cGVJbmZvXG59IGZyb20gJy4vYXBpLWRvYy10eXBlcy50cyc7XG5cbmltcG9ydCB7XG4gIGNvbXB1dGVPdmVybG9hZEtleSxcbiAgZm9sZFRzRG9jUGFyYWdyYXBocyxcbiAgcmVwbGFjZVJlZ0V4cE1hdGNoZXMsXG4gIHNpbXBsaWZ5VHlwZVxufSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjbGFzcydzIG1vZGVsOiBpdHMgY29uc3RydWN0b3IsIG5vbi1wcml2YXRlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMsIGFuZCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBjbHMgLSBUaGUgY2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgY2xhc3MncyBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDbGFzc0luZm8oY2xzOiBDbGFzc0RlY2xhcmF0aW9uLCBuYW1lc3BhY2U6IHN0cmluZyk6IFR5cGVJbmZvIHtcbiAgY29uc3QgbmFtZSA9IGNscy5nZXROYW1lT3JUaHJvdygpO1xuICBjb25zdCBjb25zdHJ1Y3RvciA9IGNscy5nZXRDb25zdHJ1Y3RvcnMoKS5maW5kKChjKSA9PiBjLmdldFNjb3BlKCkgIT09IFNjb3BlLlByaXZhdGUpO1xuICBjb25zdCBleHRlbmRzQ2xhdXNlID0gY2xzLmdldEV4dGVuZHMoKTtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVHlwZXM6IGV4dGVuZHNDbGF1c2UgPyBbZXh0ZW5kc0NsYXVzZS5nZXRUZXh0KCldIDogW10sXG4gICAgY29uc3RydWN0b3JJbmZvOiBjb25zdHJ1Y3RvciA/IGV4dHJhY3RDb25zdHJ1Y3RvckluZm8oY29uc3RydWN0b3IpIDogdW5kZWZpbmVkLFxuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihjbHMpLFxuICAgIGVudW1NZW1iZXJzOiBbXSxcbiAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMoY2xzKSxcbiAgICBpbXBsZW1lbnRzVHlwZXM6IGNscy5nZXRJbXBsZW1lbnRzKCkubWFwKChpbmRleCkgPT4gaW5kZXguZ2V0VGV4dCgpKSxcbiAgICBraW5kOiAnY2xhc3MnLFxuICAgIG1ldGhvZHM6IGNscy5nZXRNZXRob2RzKCkuZmlsdGVyKChtKSA9PiBtLmdldFNjb3BlKCkgIT09IFNjb3BlLlByaXZhdGUpLm1hcCgobSkgPT4gZXh0cmFjdE1ldGhvZEluZm8obSkpLFxuICAgIG5hbWUsXG4gICAgbmFtZXNwYWNlLFxuICAgIHByb3BlcnRpZXM6IGNscy5nZXRQcm9wZXJ0aWVzKCkuZmlsdGVyKChwKSA9PiBwLmdldFNjb3BlKCkgIT09IFNjb3BlLlByaXZhdGUpLm1hcCgocCkgPT4gZXh0cmFjdFByb3BlcnR5SW5mbyhwKSksXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhjbHMpLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiBjbHMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjb25zdHJ1Y3RvcidzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBjdG9yIC0gVGhlIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9uLlxuICogQHJldHVybnMgVGhlIGNvbnN0cnVjdG9yJ3MgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29uc3RydWN0b3JJbmZvKGN0b3I6IENvbnN0cnVjdG9yRGVjbGFyYXRpb24pOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgcGFyYW1ldGVyRGVzY3JpcHRpb25zID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKGN0b3IpO1xuICBjb25zdCBwYXJhbXMgPSBjdG9yLmdldFBhcmFtZXRlcnMoKS5tYXAoKHApID0+IHtcbiAgICBjb25zdCBpc09wdGlvbmFsID0gcC5pc09wdGlvbmFsKCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTdWZmaXggPSBpc09wdGlvbmFsID8gJz8nIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuZ2V0KHAuZ2V0TmFtZSgpKSA/PyAoaXNPcHRpb25hbCA/ICcqKE9wdGlvbmFsKSonIDogJycpLFxuICAgICAgbmFtZTogYCR7cC5nZXROYW1lKCl9JHtvcHRpb25hbFN1ZmZpeH1gLFxuICAgICAgdHlwZTogc2ltcGxpZnlUeXBlKHAuZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICB9O1xuICB9KTtcbiAgY29uc3QgcGFyYW1ldGVyU3RyaW5nID0gcGFyYW1zLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHtwLnR5cGV9YCkuam9pbignLCAnKTtcbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24oY3RvciksXG4gICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKGN0b3IpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICBuYW1lOiAnY29uc3RydWN0b3InLFxuICAgIG92ZXJsb2FkS2V5OiAnY29uc3RydWN0b3InLFxuICAgIHBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICByZW1hcmtzOiBnZXRSZW1hcmtzKGN0b3IpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiAnJyxcbiAgICByZXR1cm5UeXBlOiAnJyxcbiAgICBzaWduYXR1cmU6IGAoJHtwYXJhbWV0ZXJTdHJpbmd9KWAsXG4gICAgc2luY2U6IGdldFNpbmNlKGN0b3IpLFxuICAgIHR5cGU6ICcnXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYW4gZW51bSdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBlbnVtRGVjbGFyYXRpb24gLSBUaGUgZW51bSBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqIEByZXR1cm5zIFRoZSBlbnVtJ3MgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uOiBFbnVtRGVjbGFyYXRpb24sIG5hbWVzcGFjZTogc3RyaW5nKTogVHlwZUluZm8ge1xuICBjb25zdCBtZW1iZXJzOiBFbnVtTWVtYmVySW5mb1tdID0gZW51bURlY2xhcmF0aW9uLmdldE1lbWJlcnMoKS5tYXAoKG0pID0+IHtcbiAgICBjb25zdCBpbml0aWFsaXplciA9IG0uZ2V0SW5pdGlhbGl6ZXIoKT8uZ2V0VGV4dCgpID8/ICcnO1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24obSksXG4gICAgICBuYW1lOiBtLmdldE5hbWUoKSxcbiAgICAgIHZhbHVlOiBpbml0aWFsaXplclxuICAgIH07XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIGJhc2VUeXBlczogW10sXG4gICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKGVudW1EZWNsYXJhdGlvbiksXG4gICAgZW51bU1lbWJlcnM6IG1lbWJlcnMsXG4gICAgZXhhbXBsZXM6IGdldEV4YW1wbGVzKGVudW1EZWNsYXJhdGlvbiksXG4gICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICBraW5kOiAnZW51bScsXG4gICAgbWV0aG9kczogW10sXG4gICAgbmFtZTogZW51bURlY2xhcmF0aW9uLmdldE5hbWUoKSxcbiAgICBuYW1lc3BhY2UsXG4gICAgcHJvcGVydGllczogW10sXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhlbnVtRGVjbGFyYXRpb24pLFxuICAgIHR5cGVQYXJhbWV0ZXJzOiBbXVxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIG1vZHVsZS1sZXZlbCBgQGZpbGVgIGRlc2NyaXB0aW9uIHRleHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHJldHVybnMgVGhlIG92ZXJ2aWV3LCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgZmlsZSBoYXMgbm8gYEBmaWxlYCBibG9jay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RGaWxlT3ZlcnZpZXcoc3JjOiBTb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgY29uc3QgdGV4dCA9IHNyYy5nZXRGdWxsVGV4dCgpO1xuICBjb25zdCBibG9ja01hdGNoID0gL1xcL1xcKlxcKig/PGJvZHk+W1xcc1xcU10qPylcXCpcXC8vLmV4ZWModGV4dCk7XG4gIGlmICghYmxvY2tNYXRjaCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBib2R5ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChibG9ja01hdGNoLCAnYm9keScpO1xuICBpZiAoIS9AZmlsZVxcYi8udGVzdChib2R5KSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBzdHJpcHBlZCA9IGJvZHlcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS5yZXBsYWNlKC9eXFxzKlxcKj9cXHM/LywgJycpKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3QgYWZ0ZXJGaWxlVGFnID0gc3RyaXBwZWQucmVwbGFjZSgvW1xcc1xcU10qP0BmaWxlWyBcXHRdKlxccj9cXG4/LywgJycpO1xuICByZXR1cm4gZm9sZFRzRG9jUGFyYWdyYXBocyhhZnRlckZpbGVUYWcudHJpbSgpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhbiBpbnRlcmZhY2UncyBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gaWZhY2UgLSBUaGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSB0eXBlJ3MgbmFtZXNwYWNlLlxuICogQHJldHVybnMgVGhlIGludGVyZmFjZSdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2U6IEludGVyZmFjZURlY2xhcmF0aW9uLCBuYW1lc3BhY2U6IHN0cmluZyk6IFR5cGVJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVHlwZXM6IGlmYWNlLmdldEV4dGVuZHMoKS5tYXAoKGVycm9yKSA9PiBlcnJvci5nZXRUZXh0KCkpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihpZmFjZSksXG4gICAgZW51bU1lbWJlcnM6IFtdLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhpZmFjZSksXG4gICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICBraW5kOiAnaW50ZXJmYWNlJyxcbiAgICBtZXRob2RzOiBpZmFjZS5nZXRNZXRob2RzKCkubWFwKChtKSA9PiBleHRyYWN0TWV0aG9kU2lnbmF0dXJlSW5mbyhtKSksXG4gICAgbmFtZTogaWZhY2UuZ2V0TmFtZSgpLFxuICAgIG5hbWVzcGFjZSxcbiAgICBwcm9wZXJ0aWVzOiBpZmFjZS5nZXRQcm9wZXJ0aWVzKCkubWFwKChwKSA9PiBleHRyYWN0UHJvcGVydHlTaWduYXR1cmVJbmZvKHApKSxcbiAgICByZW1hcmtzOiBnZXRSZW1hcmtzKGlmYWNlKSxcbiAgICB0eXBlUGFyYW1ldGVyczogaWZhY2UuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjbGFzcyBtZXRob2QncyBtb2RlbC5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIC0gVGhlIG1ldGhvZC5cbiAqIEByZXR1cm5zIFRoZSBtZXRob2QncyBtb2RlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNZXRob2RJbmZvKG1ldGhvZDogTWV0aG9kRGVjbGFyYXRpb24pOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7XG4gIGNvbnN0IHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyhtZXRob2QpO1xuICBjb25zdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwLmlzT3B0aW9uYWwoKTtcbiAgICBjb25zdCBvcHRpb25hbFN1ZmZpeCA9IGlzT3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQocC5nZXROYW1lKCkpID8/IChpc09wdGlvbmFsID8gJyooT3B0aW9uYWwpKicgOiAnJyksXG4gICAgICBuYW1lOiBgJHtwLmdldE5hbWUoKX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgICB0eXBlOiBzaW1wbGlmeVR5cGUocC5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke3AudHlwZX1gKS5qb2luKCcsICcpO1xuICBjb25zdCBpbmZvOiBNZW1iZXJJbmZvID0ge1xuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhtZXRob2QpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBtZXRob2QuaXNTdGF0aWMoKSxcbiAgICBuYW1lLFxuICAgIG92ZXJsb2FkS2V5OiAnJyxcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhtZXRob2QpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIHJldHVyblR5cGU6IGdldERlY2xhcmVkUmV0dXJuVHlwZShtZXRob2QpLFxuICAgIHNpZ25hdHVyZTogYCR7bmFtZX0oJHtwYXJhbWV0ZXJTdHJpbmd9KWAsXG4gICAgc2luY2U6IGdldFNpbmNlKG1ldGhvZCksXG4gICAgdHlwZTogJydcbiAgfTtcbiAgaW5mby5vdmVybG9hZEtleSA9IGNvbXB1dGVPdmVybG9hZEtleShpbmZvKTtcbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYW4gaW50ZXJmYWNlIG1ldGhvZCdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBtZXRob2QgLSBUaGUgbWV0aG9kLlxuICogQHJldHVybnMgVGhlIG1ldGhvZCdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1ldGhvZFNpZ25hdHVyZUluZm8obWV0aG9kOiBNZXRob2RTaWduYXR1cmUpOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7XG4gIGNvbnN0IHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyhtZXRob2QpO1xuICBjb25zdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4ge1xuICAgIGNvbnN0IGlzT3B0aW9uYWwgPSBwLmlzT3B0aW9uYWwoKTtcbiAgICBjb25zdCBvcHRpb25hbFN1ZmZpeCA9IGlzT3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRpb246IHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQocC5nZXROYW1lKCkpID8/IChpc09wdGlvbmFsID8gJyooT3B0aW9uYWwpKicgOiAnJyksXG4gICAgICBuYW1lOiBgJHtwLmdldE5hbWUoKX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgICB0eXBlOiBzaW1wbGlmeVR5cGUocC5nZXRUeXBlKCkuZ2V0VGV4dCgpKVxuICAgIH07XG4gIH0pO1xuICBjb25zdCBwYXJhbWV0ZXJTdHJpbmcgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke3AudHlwZX1gKS5qb2luKCcsICcpO1xuICBjb25zdCBpbmZvOiBNZW1iZXJJbmZvID0ge1xuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhtZXRob2QpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICBuYW1lLFxuICAgIG92ZXJsb2FkS2V5OiAnJyxcbiAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhtZXRob2QpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbihtZXRob2QpLFxuICAgIHJldHVyblR5cGU6IGdldERlY2xhcmVkUmV0dXJuVHlwZShtZXRob2QpLFxuICAgIHNpZ25hdHVyZTogYCR7bmFtZX0oJHtwYXJhbWV0ZXJTdHJpbmd9KWAsXG4gICAgc2luY2U6IGdldFNpbmNlKG1ldGhvZCksXG4gICAgdHlwZTogJydcbiAgfTtcbiAgaW5mby5vdmVybG9hZEtleSA9IGNvbXB1dGVPdmVybG9hZEtleShpbmZvKTtcbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBjbGFzcyBwcm9wZXJ0eSdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5SW5mbyhwcm9wZXJ0eTogUHJvcGVydHlEZWNsYXJhdGlvbik6IE1lbWJlckluZm8ge1xuICBjb25zdCBuYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpO1xuICBjb25zdCBpc09wdGlvbmFsID0gcHJvcGVydHkuaGFzUXVlc3Rpb25Ub2tlbigpO1xuICBjb25zdCBvcHRpb25hbFN1ZmZpeCA9IGlzT3B0aW9uYWwgPyAnPycgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24ocHJvcGVydHkpLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhwcm9wZXJ0eSksXG4gICAgaW5oZXJpdGVkRnJvbTogJycsXG4gICAgaXNTdGF0aWM6IHByb3BlcnR5LmlzU3RhdGljKCksXG4gICAgbmFtZTogYCR7bmFtZX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgb3ZlcmxvYWRLZXk6ICcnLFxuICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgIHJlbWFya3M6IGdldFJlbWFya3MocHJvcGVydHkpLFxuICAgIHJldHVybkRlc2NyaXB0aW9uOiAnJyxcbiAgICByZXR1cm5UeXBlOiAnJyxcbiAgICBzaWduYXR1cmU6IGAke25hbWV9JHtvcHRpb25hbFN1ZmZpeH1gLFxuICAgIHNpbmNlOiBnZXRTaW5jZShwcm9wZXJ0eSksXG4gICAgdHlwZTogZ2V0UHJvcGVydHlUeXBlKHByb3BlcnR5KVxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGFuIGludGVyZmFjZSBwcm9wZXJ0eSdzIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0eSdzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5U2lnbmF0dXJlSW5mbyhwcm9wZXJ0eTogUHJvcGVydHlTaWduYXR1cmUpOiBNZW1iZXJJbmZvIHtcbiAgY29uc3QgbmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTtcbiAgY29uc3QgaXNPcHRpb25hbCA9IHByb3BlcnR5Lmhhc1F1ZXN0aW9uVG9rZW4oKTtcbiAgY29uc3Qgb3B0aW9uYWxTdWZmaXggPSBpc09wdGlvbmFsID8gJz8nIDogJyc7XG4gIHJldHVybiB7XG4gICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKHByb3BlcnR5KSxcbiAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMocHJvcGVydHkpLFxuICAgIGluaGVyaXRlZEZyb206ICcnLFxuICAgIGlzU3RhdGljOiBmYWxzZSxcbiAgICBuYW1lOiBgJHtuYW1lfSR7b3B0aW9uYWxTdWZmaXh9YCxcbiAgICBvdmVybG9hZEtleTogJycsXG4gICAgcGFyYW1ldGVyczogW10sXG4gICAgcmVtYXJrczogZ2V0UmVtYXJrcyhwcm9wZXJ0eSksXG4gICAgcmV0dXJuRGVzY3JpcHRpb246ICcnLFxuICAgIHJldHVyblR5cGU6ICcnLFxuICAgIHNpZ25hdHVyZTogYCR7bmFtZX0ke29wdGlvbmFsU3VmZml4fWAsXG4gICAgc2luY2U6IGdldFNpbmNlKHByb3BlcnR5KSxcbiAgICB0eXBlOiBnZXRQcm9wZXJ0eVR5cGUocHJvcGVydHkpXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSB0eXBlIGFsaWFzJ3MgbW9kZWwuXG4gKlxuICogQHBhcmFtIGFsaWFzIC0gVGhlIHR5cGUgYWxpYXMgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhbGlhcydzIG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFR5cGVBbGlhc0luZm8oYWxpYXM6IFR5cGVBbGlhc0RlY2xhcmF0aW9uLCBuYW1lc3BhY2U6IHN0cmluZyk6IFR5cGVJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVHlwZXM6IFtdLFxuICAgIGRlc2NyaXB0aW9uOiBnZXREZXNjcmlwdGlvbihhbGlhcyksXG4gICAgZW51bU1lbWJlcnM6IFtdLFxuICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyhhbGlhcyksXG4gICAgaW1wbGVtZW50c1R5cGVzOiBbXSxcbiAgICBraW5kOiAndHlwZScsXG4gICAgbWV0aG9kczogW10sXG4gICAgbmFtZTogYWxpYXMuZ2V0TmFtZSgpLFxuICAgIG5hbWVzcGFjZSxcbiAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICByZW1hcmtzOiBnZXRSZW1hcmtzKGFsaWFzKSxcbiAgICB0eXBlQWxpYXNUZXh0OiBzaW1wbGlmeVR5cGUoYWxpYXMuZ2V0VHlwZU5vZGVPclRocm93KCkuZ2V0VGV4dCgpKSxcbiAgICB0eXBlUGFyYW1ldGVyczogYWxpYXMuZ2V0VHlwZVBhcmFtZXRlcnMoKS5tYXAoKHRwKSA9PiB0cC5nZXRUZXh0KCkpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSByZXR1cm4gdHlwZSBhcyBkZWNsYXJlZCBpbiBzb3VyY2UgKHByZXNlcnZlcyB1bmlvbiBvcmRlciksIGZhbGxpbmcgYmFjayB0byByZXNvbHZlZCB0eXBlXG4gKlxuICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2Qgb3IgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWNsYXJlZFJldHVyblR5cGUobWV0aG9kOiBSZXR1cm5UeXBlUHJvdmlkZXIpOiBzdHJpbmcge1xuICBjb25zdCBhbm5vdGF0aW9uID0gbWV0aG9kLmdldFJldHVyblR5cGVOb2RlPy4oKT8uZ2V0VGV4dCgpO1xuICByZXR1cm4gc2ltcGxpZnlUeXBlKGFubm90YXRpb24gPz8gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRUZXh0KCkpO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBKU0RvYyBkZXNjcmlwdGlvbiBvZiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEByZXR1cm5zIFRoZSBkZXNjcmlwdGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24obm9kZTogSlNEb2NhYmxlTm9kZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxhc3REb2MgPSBub2RlLmdldEpzRG9jcygpLmF0KC0xKTtcbiAgcmV0dXJuIGxhc3REb2MgPyBmb2xkVHNEb2NQYXJhZ3JhcGhzKGxhc3REb2MuZ2V0RGVzY3JpcHRpb24oKS50cmltKCkpIDogJyc7XG59XG5cbi8qKlxuICogRXh0cmFjdFxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgZXhhbXBsZXMnIHRleHRzLlxuICogQGV4YW1wbGUgYmxvY2tzIGZyb20gSlNEb2NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4YW1wbGVzKG5vZGU6IEpTRG9jYWJsZU5vZGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4YW1wbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRvYyBvZiBub2RlLmdldEpzRG9jcygpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgIT09ICdleGFtcGxlJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dCA9IHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkgPz8gJyc7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBleGFtcGxlcy5wdXNoKHRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZXhhbXBsZXM7XG59XG5cbi8qKlxuICogRXh0cmFjdFxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcmV0dXJucyBFYWNoIHBhcmFtZXRlcidzIG5hbWUgbWFwcGVkIHRvIGl0cyBkZXNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucyhub2RlOiBKU0RvY2FibGVOb2RlKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGRvY3MgPSBub2RlLmdldEpzRG9jcygpO1xuICBmb3IgKGNvbnN0IGRvYyBvZiBkb2NzKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgIT09ICdwYXJhbScpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbW1lbnQgPSBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkucmVwbGFjZUFsbCgvXFxzKlxcKlxccyokL2csICcnKS5yZXBsYWNlKC9eLVxccyovLCAnJykudHJpbSgpID8/ICcnKTtcbiAgICAgIGNvbnN0IHRhZ1RleHQgPSB0YWcuZ2V0VGV4dCgpO1xuICAgICAgY29uc3QgbmFtZU1hdGNoID0gL0BwYXJhbVxccysoPzpcXHtbXn1dKlxcfVxccyspPyg/PHBhcmFtTmFtZT5cXHcrKS8uZXhlYyh0YWdUZXh0KTtcbiAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgcmVzdWx0LnNldChnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG5hbWVNYXRjaCwgJ3BhcmFtTmFtZScpLCBjb21tZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpcCBgfCB1bmRlZmluZWRgIG9ubHkgd2hlbiBpdCB3YXMgaW1wbGljaXRseSBhZGRlZCBieSB0cy1tb3JwaCBmb3Igb3B0aW9uYWwgcHJvcGVydGllc1xuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eS5cbiAqIEByZXR1cm5zIFRoZSB0eXBlIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eVR5cGUocHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSk6IHN0cmluZyB7XG4gIGNvbnN0IHR5cGVOb2RlID0gcHJvcGVydHkuZ2V0VHlwZU5vZGUoKTtcbiAgcmV0dXJuIHR5cGVOb2RlID8gcmVzb2x2ZVR5cGVvZkFsaWFzZXMoc2ltcGxpZnlUeXBlKHR5cGVOb2RlLmdldFRleHQoKSksIHByb3BlcnR5LmdldFNvdXJjZUZpbGUoKSkgOiBzaW1wbGlmeVR5cGUocHJvcGVydHkuZ2V0VHlwZSgpLmdldFRleHQoKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdFxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUuXG4gKiBAcmV0dXJucyBUaGUgcmVtYXJrcywgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICogQHJlbWFya3MgdGV4dCBmcm9tIEpTRG9jXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZW1hcmtzKG5vZGU6IEpTRG9jYWJsZU5vZGUpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGRvYyBvZiBub2RlLmdldEpzRG9jcygpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgPT09ICdyZW1hcmtzJyB8fCB0YWcuZ2V0VGFnTmFtZSgpID09PSAncmVtYXJrJykge1xuICAgICAgICByZXR1cm4gZm9sZFRzRG9jUGFyYWdyYXBocyh0YWcuZ2V0Q29tbWVudFRleHQoKT8udHJpbSgpLnJlcGxhY2VBbGwoL1xccypcXCpcXHMqJC9nLCAnJykudHJpbSgpID8/ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEV4dHJhY3RcbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHJldHVybnMgZGVzY3JpcHRpb24gZnJvbSBKU0RvY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmV0dXJuRGVzY3JpcHRpb24obm9kZTogSlNEb2NhYmxlTm9kZSk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgZG9jIG9mIG5vZGUuZ2V0SnNEb2NzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MuZ2V0VGFncygpKSB7XG4gICAgICBpZiAodGFnLmdldFRhZ05hbWUoKSA9PT0gJ3JldHVybnMnKSB7XG4gICAgICAgIHJldHVybiBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkucmVwbGFjZSgvXi1cXHMqLywgJycpLnJlcGxhY2VBbGwoL1xccypcXCpcXHMqJC9nLCAnJykudHJpbSgpID8/ICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIHZlcnNpb24gYSBKU0RvYyBgc2luY2VgIHRhZyBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHJldHVybnMgVGhlIHZlcnNpb24sIG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNpbmNlKG5vZGU6IEpTRG9jYWJsZU5vZGUpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGRvYyBvZiBub2RlLmdldEpzRG9jcygpKSB7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLmdldFRhZ3MoKSkge1xuICAgICAgaWYgKHRhZy5nZXRUYWdOYW1lKCkgPT09ICdzaW5jZScpIHtcbiAgICAgICAgcmV0dXJuIHRhZy5nZXRDb21tZW50VGV4dCgpPy50cmltKCkucmVwbGFjZUFsbCgvXFxzKlxcKlxccyokL2csICcnKS50cmltKCkgPz8gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGB0eXBlb2YgYWxpYXNOYW1lYCBwYXR0ZXJucyB3aGVyZSBhbGlhc05hbWUgaXMgYW4gaW1wb3J0IGFsaWFzLlxuICogRS5nLiwgYHR5cGVvZiBtb21lbnRJbnN0YW5jZWAg4oaSIGB0eXBlb2YgbW9tZW50YCB3aGVuIGBpbXBvcnQgeyBtb21lbnQgYXMgbW9tZW50SW5zdGFuY2UgfWAuXG4gKlxuICogQHBhcmFtIHR5cGVUZXh0IC0gVGhlIHR5cGUgdGV4dC5cbiAqIEBwYXJhbSBzb3VyY2VGaWxlIC0gVGhlIHNvdXJjZSBmaWxlIGhvbGRpbmcgdGhlIGltcG9ydHMuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSB0ZXh0IHdpdGggdGhlIG9yaWdpbmFsIG5hbWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVR5cGVvZkFsaWFzZXModHlwZVRleHQ6IHN0cmluZywgc291cmNlRmlsZTogU291cmNlRmlsZSk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlUmVnRXhwTWF0Y2hlcyh0eXBlVGV4dCwgL1xcYnR5cGVvZiAoPzxhbGlhcz5bYS16QS1aXVthLXpBLVowLTldKilcXGIvZywgKG1hdGNoKSA9PiB7XG4gICAgY29uc3QgYWxpYXMgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYWxpYXMnKTtcbiAgICBmb3IgKGNvbnN0IGltcG9ydERlY2xhcmF0aW9uIG9mIHNvdXJjZUZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCkpIHtcbiAgICAgIGZvciAoY29uc3QgbmFtZWRJbXBvcnQgb2YgaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRJbXBvcnRzKCkpIHtcbiAgICAgICAgaWYgKG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpPy5nZXRUZXh0KCkgPT09IGFsaWFzKSB7XG4gICAgICAgICAgcmV0dXJuIGB0eXBlb2YgJHtuYW1lZEltcG9ydC5nZXROYW1lKCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hbMF07XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLGFBQWE7QUFTdEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVNBLFNBQVMsaUJBQWlCLEtBQXVCLFdBQTZCO0FBQ25GLFFBQU0sT0FBTyxJQUFJLGVBQWU7QUFDaEMsUUFBTSxjQUFjLElBQUksZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU0sTUFBTSxPQUFPO0FBQ3BGLFFBQU0sZ0JBQWdCLElBQUksV0FBVztBQUNyQyxTQUFPO0FBQUEsSUFDTCxXQUFXLGdCQUFnQixDQUFDLGNBQWMsUUFBUSxDQUFDLElBQUksQ0FBQztBQUFBLElBQ3hELGlCQUFpQixjQUFjLHVCQUF1QixXQUFXLElBQUk7QUFBQSxJQUNyRSxhQUFhLGVBQWUsR0FBRztBQUFBLElBQy9CLGFBQWEsQ0FBQztBQUFBLElBQ2QsVUFBVSxZQUFZLEdBQUc7QUFBQSxJQUN6QixpQkFBaUIsSUFBSSxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsTUFBTSxRQUFRLENBQUM7QUFBQSxJQUNuRSxNQUFNO0FBQUEsSUFDTixTQUFTLElBQUksV0FBVyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxNQUFNLE1BQU0sT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLENBQUM7QUFBQSxJQUN2RztBQUFBLElBQ0E7QUFBQSxJQUNBLFlBQVksSUFBSSxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLE1BQU0sTUFBTSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sb0JBQW9CLENBQUMsQ0FBQztBQUFB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
|