@mnaoumov/typescript-dev-toolkit 1.3.1 → 2.0.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/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-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-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 +74 -4
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Text/markdown/escaping utilities and identifier helpers for the API documentation generator.
|
|
6
|
+
*/
|
|
7
|
+
import type { MarkdownSegment, MemberInfo, TypeInfo } from './api-doc-types.mjs';
|
|
8
|
+
/**
|
|
9
|
+
* Compute an overload key for methods with distinguishing first param (e.g. on('changed',...))
|
|
10
|
+
*
|
|
11
|
+
* @param method - The method.
|
|
12
|
+
* @returns The overload key.
|
|
13
|
+
*/
|
|
14
|
+
export declare function computeOverloadKey(method: MemberInfo): string;
|
|
15
|
+
/**
|
|
16
|
+
* Creates the folder a file is about to be written to.
|
|
17
|
+
*
|
|
18
|
+
* @param filePath - The path of the file about to be written.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ensureDirectory(filePath: string): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Escape text for use inside a JS string within a JSX expression: {...{key: "..."}}
|
|
23
|
+
*
|
|
24
|
+
* @param text - The text to escape.
|
|
25
|
+
* @returns The escaped text.
|
|
26
|
+
*/
|
|
27
|
+
export declare function escapeJsString(text: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Escape text for use inside a JSX attribute: attr="..." (MDX uses HTML-style parsing)
|
|
30
|
+
*
|
|
31
|
+
* @param text - The text to escape.
|
|
32
|
+
* @returns The escaped text.
|
|
33
|
+
*/
|
|
34
|
+
export declare function escapeJsxAttribute(text: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Escape text for a markdown table cell.
|
|
37
|
+
*
|
|
38
|
+
* @param text - The text to escape.
|
|
39
|
+
* @returns The escaped text.
|
|
40
|
+
*/
|
|
41
|
+
export declare function escapeMarkdown(text: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Escape angle brackets so MDX does not read them as JSX.
|
|
44
|
+
*
|
|
45
|
+
* @param text - The text to escape.
|
|
46
|
+
* @returns The escaped text.
|
|
47
|
+
*/
|
|
48
|
+
export declare function escapeMdxAngleBrackets(text: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Escape curly braces in MDX markdown content to prevent JSX expression parsing
|
|
51
|
+
*
|
|
52
|
+
* @param text - The text to escape.
|
|
53
|
+
* @returns The escaped text.
|
|
54
|
+
*/
|
|
55
|
+
export declare function escapeMdxBraces(text: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Escape text for a double-quoted YAML value.
|
|
58
|
+
*
|
|
59
|
+
* @param text - The text to escape.
|
|
60
|
+
* @returns The escaped text.
|
|
61
|
+
*/
|
|
62
|
+
export declare function escapeYaml(text: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* Escape MDX-unsafe characters (`<`, `{`, `}`) in prose text, while leaving inline code spans
|
|
65
|
+
* (`` `code` ``) and markdown links (`[text](url)`) untouched. MDX parses bare `<`/`{` in prose as
|
|
66
|
+
* JSX/expressions, so they must be backslash-escaped to render as literal text.
|
|
67
|
+
*
|
|
68
|
+
* @param text - The prose to escape.
|
|
69
|
+
* @returns The escaped prose.
|
|
70
|
+
*/
|
|
71
|
+
export declare function escapeMdxProse(text: string): string;
|
|
72
|
+
/**
|
|
73
|
+
* Collapse single newlines within paragraphs to spaces, preserve double newlines as paragraph breaks.
|
|
74
|
+
* Fenced code blocks (backtick or tilde fences) are preserved verbatim — their internal newlines are NOT folded,
|
|
75
|
+
* so embedded code survives to be re-emitted as a real code fence downstream.
|
|
76
|
+
*
|
|
77
|
+
* @param text - The text.
|
|
78
|
+
* @returns The folded text.
|
|
79
|
+
*/
|
|
80
|
+
export declare function foldTsDocParagraphs(text: string): string;
|
|
81
|
+
/**
|
|
82
|
+
* The type's name with its type parameters, without their constraints.
|
|
83
|
+
*
|
|
84
|
+
* @param name - The type's name.
|
|
85
|
+
* @param info - The documented type.
|
|
86
|
+
* @returns The name with its bare type parameters.
|
|
87
|
+
*/
|
|
88
|
+
export declare function getDisplayName(name: string, info: TypeInfo): string;
|
|
89
|
+
/**
|
|
90
|
+
* Emit the import statement for a documented export.
|
|
91
|
+
*
|
|
92
|
+
* The subpath equals the type's namespace (its source path relative to `src`), so `src/string.ts` of
|
|
93
|
+
* `@mnaoumov/typescript-lib` is `@mnaoumov/typescript-lib/string`.
|
|
94
|
+
*
|
|
95
|
+
* Interfaces / type aliases / enums are imported with `import type`; classes / functions /
|
|
96
|
+
* variables with a value `import`.
|
|
97
|
+
*
|
|
98
|
+
* @param info - The documented type.
|
|
99
|
+
* @returns The import statement.
|
|
100
|
+
*/
|
|
101
|
+
export declare function getImportStatement(info: TypeInfo): string;
|
|
102
|
+
/**
|
|
103
|
+
* The folder a namespace's pages are written to.
|
|
104
|
+
*
|
|
105
|
+
* @param namespace - The type's namespace.
|
|
106
|
+
* @returns The folder.
|
|
107
|
+
*/
|
|
108
|
+
export declare function getNamespaceDirectory(namespace: string): string;
|
|
109
|
+
/**
|
|
110
|
+
* Sanitize a member name for use in a case-PRESERVED URL/route segment (e.g. `showNotice`).
|
|
111
|
+
*
|
|
112
|
+
* @param name - The member's name.
|
|
113
|
+
* @returns The case-preserved segment.
|
|
114
|
+
*/
|
|
115
|
+
export declare function memberRouteSegment(name: string): string;
|
|
116
|
+
/**
|
|
117
|
+
* Sanitize a member name for use as an on-disk FILENAME (lowercased, collision-safe).
|
|
118
|
+
*
|
|
119
|
+
* @param name - The member's name.
|
|
120
|
+
* @returns The lowercased file name segment.
|
|
121
|
+
*/
|
|
122
|
+
export declare function memberSlug(name: string): string;
|
|
123
|
+
/**
|
|
124
|
+
* Slugify an overload key for a case-PRESERVED URL/route segment: on("changed") -> on-changed.
|
|
125
|
+
*
|
|
126
|
+
* @param overloadKey - The overload key, e.g. `on('changed')`.
|
|
127
|
+
* @returns The case-preserved segment.
|
|
128
|
+
*/
|
|
129
|
+
export declare function overloadRouteSegment(overloadKey: string): string;
|
|
130
|
+
/**
|
|
131
|
+
* Slugify an overload key for an on-disk FILENAME: on("changed") -> on-changed (lowercased).
|
|
132
|
+
*
|
|
133
|
+
* @param overloadKey - The overload key, e.g. `on('changed')`.
|
|
134
|
+
* @returns The lowercased file name segment.
|
|
135
|
+
*/
|
|
136
|
+
export declare function overloadSlug(overloadKey: string): string;
|
|
137
|
+
/**
|
|
138
|
+
* Replace every match of a global regular expression with what a replacer builds from the match. The typed
|
|
139
|
+
* counterpart of `String.prototype.replaceAll` with a callback, whose arguments are typed only positionally.
|
|
140
|
+
*
|
|
141
|
+
* @param text - The text.
|
|
142
|
+
* @param regExp - The regular expression; it must carry the `g` flag.
|
|
143
|
+
* @param replacer - Builds the replacement of one match.
|
|
144
|
+
* @returns The text with every match replaced.
|
|
145
|
+
*/
|
|
146
|
+
export declare function replaceRegExpMatches(text: string, regExp: RegExp, replacer: (match: RegExpMatchArray) => string): string;
|
|
147
|
+
/**
|
|
148
|
+
* Split markdown text into an ordered list of prose and fenced-code segments.
|
|
149
|
+
* A fenced-code segment is delimited by a line of 3+ backticks or tildes; its content is captured
|
|
150
|
+
* raw (never escaped) so it can be re-emitted as a literal MDX code fence.
|
|
151
|
+
*
|
|
152
|
+
* @param text - The text.
|
|
153
|
+
* @returns The segments, in order.
|
|
154
|
+
*/
|
|
155
|
+
export declare function segmentMarkdown(text: string): MarkdownSegment[];
|
|
156
|
+
/**
|
|
157
|
+
* Strip the `import("…")` qualifiers ts-morph prints before a type that is not in scope, recording each one's
|
|
158
|
+
* declaration file first, since it is the one place a printed type names where it was declared.
|
|
159
|
+
*
|
|
160
|
+
* @param typeText - The printed type.
|
|
161
|
+
* @returns The type without its import qualifiers.
|
|
162
|
+
*/
|
|
163
|
+
export declare function simplifyType(typeText: string): string;
|
|
164
|
+
/**
|
|
165
|
+
* Normalize a code signature for the `signature:` frontmatter / OG card: collapse whitespace to
|
|
166
|
+
* single spaces and truncate to a card-friendly length with an ellipsis.
|
|
167
|
+
*
|
|
168
|
+
* @param signature - The signature.
|
|
169
|
+
* @returns The normalized signature.
|
|
170
|
+
*/
|
|
171
|
+
export declare function truncateSignature(signature: string): string;
|
|
172
|
+
/**
|
|
173
|
+
* Strip markdown formatting to plain text for use in meta descriptions
|
|
174
|
+
*
|
|
175
|
+
* @param text - The text.
|
|
176
|
+
* @returns The plain text, at most 160 characters.
|
|
177
|
+
*/
|
|
178
|
+
export declare function stripMarkdown(text: string): string;
|
|
@@ -0,0 +1,239 @@
|
|
|
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 {
|
|
40
|
+
getMandatoryNamedGroup,
|
|
41
|
+
getOptionalNamedGroup
|
|
42
|
+
} from "@mnaoumov/typescript-lib/reg-exp";
|
|
43
|
+
import { mkdir } from "node:fs/promises";
|
|
44
|
+
import { dirname } from "node:path";
|
|
45
|
+
import { EVENT_METHODS } from "./api-doc-constants.mjs";
|
|
46
|
+
import { registerPackageDeclaration } from "./api-doc-package-sites.mjs";
|
|
47
|
+
import { toRouteSegment } from "./api-doc-route-segments.mjs";
|
|
48
|
+
import { getApiDocSettings } from "./api-doc-settings.mjs";
|
|
49
|
+
function computeOverloadKey(method) {
|
|
50
|
+
if (EVENT_METHODS.has(method.name) && method.parameters.length > 0) {
|
|
51
|
+
const firstParameter = method.parameters[0];
|
|
52
|
+
if (firstParameter?.type.startsWith('"') || firstParameter?.type.startsWith("'")) {
|
|
53
|
+
const normalizedType = firstParameter.type.replaceAll('"', "'");
|
|
54
|
+
return `${method.name}(${normalizedType})`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return method.name;
|
|
58
|
+
}
|
|
59
|
+
async function ensureDirectory(filePath) {
|
|
60
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
function escapeJsString(text) {
|
|
63
|
+
return text.replaceAll("\\", "\\\\").replaceAll('"', String.raw`\"`).replaceAll("\n", " ");
|
|
64
|
+
}
|
|
65
|
+
function escapeJsxAttribute(text) {
|
|
66
|
+
return text.replaceAll("&", "&").replaceAll('"', """).replaceAll("\n", " ");
|
|
67
|
+
}
|
|
68
|
+
function escapeMarkdown(text) {
|
|
69
|
+
return text.replaceAll("|", String.raw`\|`).replaceAll("\n", " ").replaceAll("{", String.raw`\{`).replaceAll("}", String.raw`\}`);
|
|
70
|
+
}
|
|
71
|
+
function escapeMdxAngleBrackets(text) {
|
|
72
|
+
return text.replaceAll("<", String.raw`\<`).replaceAll(">", String.raw`\>`);
|
|
73
|
+
}
|
|
74
|
+
function escapeMdxBraces(text) {
|
|
75
|
+
return text.replaceAll("{", String.raw`\{`).replaceAll("}", String.raw`\}`);
|
|
76
|
+
}
|
|
77
|
+
function escapeYaml(text) {
|
|
78
|
+
return text.replaceAll('"', String.raw`\"`);
|
|
79
|
+
}
|
|
80
|
+
const SIGNATURE_MAX_LENGTH = 160;
|
|
81
|
+
const IMPORT_QUALIFIER_REG_EXP = /import\((?<Quote>["'])[^"']+\k<Quote>\)\./g;
|
|
82
|
+
const IMPORT_TYPE_REG_EXP = /import\((?<Quote>["'])(?<Path>[^"']+)\k<Quote>\)\.(?<Name>[A-Za-z_$][\w$]*)/g;
|
|
83
|
+
function escapeMdxProse(text) {
|
|
84
|
+
const protectedPattern = /`[^`]*`|\[[^\]]*\]\([^)]*\)/g;
|
|
85
|
+
let result = "";
|
|
86
|
+
let lastIndex = 0;
|
|
87
|
+
for (const match of text.matchAll(protectedPattern)) {
|
|
88
|
+
const index = match.index;
|
|
89
|
+
result += escapeMdxProseChars(text.slice(lastIndex, index));
|
|
90
|
+
result += match[0];
|
|
91
|
+
lastIndex = index + match[0].length;
|
|
92
|
+
}
|
|
93
|
+
result += escapeMdxProseChars(text.slice(lastIndex));
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
function foldTsDocParagraphs(text) {
|
|
97
|
+
const segments = segmentMarkdown(text);
|
|
98
|
+
return segments.map((seg) => {
|
|
99
|
+
return seg.type === "code" ? `\`\`\`${seg.lang}
|
|
100
|
+
${seg.text}
|
|
101
|
+
\`\`\`` : seg.text.split(/\n{2,}/).map((paragraph) => paragraph.replaceAll("\n", " ")).join("\n\n");
|
|
102
|
+
}).map((segment) => segment.trim()).filter(Boolean).join("\n\n");
|
|
103
|
+
}
|
|
104
|
+
function getDisplayName(name, info) {
|
|
105
|
+
if (info.typeParameters.length === 0) {
|
|
106
|
+
return name;
|
|
107
|
+
}
|
|
108
|
+
const bareParams = info.typeParameters.map((tp) => tp.replace(/\s+extends\s+.*$/, ""));
|
|
109
|
+
return `${name}<${bareParams.join(", ")}>`;
|
|
110
|
+
}
|
|
111
|
+
function getImportStatement(info) {
|
|
112
|
+
const isTypeOnly = ["enum", "interface", "type"].includes(info.kind);
|
|
113
|
+
const importKeyword = isTypeOnly ? "import type" : "import";
|
|
114
|
+
return `${importKeyword} { ${info.name} } from '${getApiDocSettings().packageName}/${info.namespace}';`;
|
|
115
|
+
}
|
|
116
|
+
function getNamespaceDirectory(namespace) {
|
|
117
|
+
return namespace;
|
|
118
|
+
}
|
|
119
|
+
function memberRouteSegment(name) {
|
|
120
|
+
return slugifyMemberName(name);
|
|
121
|
+
}
|
|
122
|
+
function memberSlug(name) {
|
|
123
|
+
return toRouteSegment(slugifyMemberName(name));
|
|
124
|
+
}
|
|
125
|
+
function overloadRouteSegment(overloadKey) {
|
|
126
|
+
return slugifyOverloadKey(overloadKey);
|
|
127
|
+
}
|
|
128
|
+
function overloadSlug(overloadKey) {
|
|
129
|
+
return toRouteSegment(slugifyOverloadKey(overloadKey));
|
|
130
|
+
}
|
|
131
|
+
function replaceRegExpMatches(text, regExp, replacer) {
|
|
132
|
+
let result = "";
|
|
133
|
+
let lastIndex = 0;
|
|
134
|
+
for (const match of text.matchAll(regExp)) {
|
|
135
|
+
result += text.slice(lastIndex, match.index) + replacer(match);
|
|
136
|
+
lastIndex = match.index + match[0].length;
|
|
137
|
+
}
|
|
138
|
+
return result + text.slice(lastIndex);
|
|
139
|
+
}
|
|
140
|
+
function segmentMarkdown(text) {
|
|
141
|
+
const lines = text.split("\n");
|
|
142
|
+
const segments = [];
|
|
143
|
+
let proseBuffer = [];
|
|
144
|
+
let codeLines = [];
|
|
145
|
+
let openFence = null;
|
|
146
|
+
for (const line of lines) {
|
|
147
|
+
if (openFence) {
|
|
148
|
+
if (openFence.closeRe.test(line)) {
|
|
149
|
+
segments.push({ lang: openFence.lang, text: codeLines.join("\n"), type: "code" });
|
|
150
|
+
openFence = null;
|
|
151
|
+
} else {
|
|
152
|
+
codeLines.push(line);
|
|
153
|
+
}
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const openMatch = /^\s*(?<fence>(?<fenceChar>[`~])\k<fenceChar>{2,})(?<lang>.*)$/.exec(line);
|
|
157
|
+
if (openMatch) {
|
|
158
|
+
const fenceChars = getMandatoryNamedGroup(openMatch, "fence");
|
|
159
|
+
const fenceChar = getMandatoryNamedGroup(openMatch, "fenceChar");
|
|
160
|
+
flushProse();
|
|
161
|
+
codeLines = [];
|
|
162
|
+
openFence = {
|
|
163
|
+
closeRe: new RegExp(`^\\s*\\${fenceChar}{${String(fenceChars.length)},}\\s*$`),
|
|
164
|
+
lang: getMandatoryNamedGroup(openMatch, "lang").trim()
|
|
165
|
+
};
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
proseBuffer.push(line);
|
|
169
|
+
}
|
|
170
|
+
if (openFence) {
|
|
171
|
+
segments.push({ lang: openFence.lang, text: codeLines.join("\n"), type: "code" });
|
|
172
|
+
}
|
|
173
|
+
flushProse();
|
|
174
|
+
return segments;
|
|
175
|
+
function flushProse() {
|
|
176
|
+
if (proseBuffer.length === 0) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
segments.push({ text: proseBuffer.join("\n"), type: "prose" });
|
|
180
|
+
proseBuffer = [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function simplifyType(typeText) {
|
|
184
|
+
for (const match of typeText.matchAll(IMPORT_TYPE_REG_EXP)) {
|
|
185
|
+
registerPackageDeclaration(getMandatoryNamedGroup(match, "Name"), getMandatoryNamedGroup(match, "Path"));
|
|
186
|
+
}
|
|
187
|
+
return typeText.replaceAll(IMPORT_QUALIFIER_REG_EXP, "");
|
|
188
|
+
}
|
|
189
|
+
function truncateSignature(signature) {
|
|
190
|
+
const collapsed = signature.replaceAll(/\s+/g, " ").trim();
|
|
191
|
+
return collapsed.length <= SIGNATURE_MAX_LENGTH ? collapsed : `${collapsed.slice(0, SIGNATURE_MAX_LENGTH - 1).trimEnd()}\u2026`;
|
|
192
|
+
}
|
|
193
|
+
function slugifyMemberName(name) {
|
|
194
|
+
const cleaned = name.replaceAll(/^["']|["']$/g, "").replaceAll(/[^a-zA-Z0-9]/g, "-").replaceAll(/-+/g, "-").replaceAll(/^-|-$/g, "");
|
|
195
|
+
return cleaned === "index" ? "index-member" : cleaned || "unnamed";
|
|
196
|
+
}
|
|
197
|
+
function slugifyOverloadKey(overloadKey) {
|
|
198
|
+
const slug = overloadKey.replaceAll(/["'()]/g, " ").replaceAll(/[^a-zA-Z0-9\s]/g, "").trim().replaceAll(/\s+/g, "-");
|
|
199
|
+
return slug === "index" ? "index-member" : slug;
|
|
200
|
+
}
|
|
201
|
+
const OG_DESCRIPTION_MAX_LENGTH = 160;
|
|
202
|
+
function stripMarkdown(text) {
|
|
203
|
+
const plain = replaceRegExpMatches(text, /\{@link\s+(?:[^|}]+?)(?:\s*\|\s*(?<display>[^}]+?))?\}/g, (match) => getOptionalNamedGroup(match, "display") ?? "").replaceAll(/\[(?<text>[^\]]+)\]\([^)]+\)/g, "$<text>").replaceAll(/[`*_~]/g, "").replaceAll(/\s+/g, " ").trim();
|
|
204
|
+
if (plain.length <= OG_DESCRIPTION_MAX_LENGTH) {
|
|
205
|
+
return plain;
|
|
206
|
+
}
|
|
207
|
+
const clipped = plain.slice(0, OG_DESCRIPTION_MAX_LENGTH - 1);
|
|
208
|
+
const lastSpaceIndex = clipped.lastIndexOf(" ");
|
|
209
|
+
const truncated = lastSpaceIndex > 0 ? clipped.slice(0, lastSpaceIndex) : clipped;
|
|
210
|
+
return `${truncated.replace(/[,;:.\s]+$/, "")}\u2026`;
|
|
211
|
+
}
|
|
212
|
+
function escapeMdxProseChars(chunk) {
|
|
213
|
+
return chunk.replaceAll(/[<{}]/g, (char) => `\\${char}`);
|
|
214
|
+
}
|
|
215
|
+
export {
|
|
216
|
+
computeOverloadKey,
|
|
217
|
+
ensureDirectory,
|
|
218
|
+
escapeJsString,
|
|
219
|
+
escapeJsxAttribute,
|
|
220
|
+
escapeMarkdown,
|
|
221
|
+
escapeMdxAngleBrackets,
|
|
222
|
+
escapeMdxBraces,
|
|
223
|
+
escapeMdxProse,
|
|
224
|
+
escapeYaml,
|
|
225
|
+
foldTsDocParagraphs,
|
|
226
|
+
getDisplayName,
|
|
227
|
+
getImportStatement,
|
|
228
|
+
getNamespaceDirectory,
|
|
229
|
+
memberRouteSegment,
|
|
230
|
+
memberSlug,
|
|
231
|
+
overloadRouteSegment,
|
|
232
|
+
overloadSlug,
|
|
233
|
+
replaceRegExpMatches,
|
|
234
|
+
segmentMarkdown,
|
|
235
|
+
simplifyType,
|
|
236
|
+
stripMarkdown,
|
|
237
|
+
truncateSignature
|
|
238
|
+
};
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10ZXh0LXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUZXh0L21hcmtkb3duL2VzY2FwaW5nIHV0aWxpdGllcyBhbmQgaWRlbnRpZmllciBoZWxwZXJzIGZvciB0aGUgQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLlxuICovXG5cbmltcG9ydCB7XG4gIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAsXG4gIGdldE9wdGlvbmFsTmFtZWRHcm91cFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBta2RpciB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWFya2Rvd25TZWdtZW50LFxuICBNZW1iZXJJbmZvLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQgeyByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbiB9IGZyb20gJy4vYXBpLWRvYy1wYWNrYWdlLXNpdGVzLnRzJztcbmltcG9ydCB7IHRvUm91dGVTZWdtZW50IH0gZnJvbSAnLi9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzJztcbmltcG9ydCB7IGdldEFwaURvY1NldHRpbmdzIH0gZnJvbSAnLi9hcGktZG9jLXNldHRpbmdzLnRzJztcblxuaW50ZXJmYWNlIE9wZW5GZW5jZSB7XG4gIHJlYWRvbmx5IGNsb3NlUmU6IFJlZ0V4cDtcbiAgcmVhZG9ubHkgbGFuZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbXB1dGUgYW4gb3ZlcmxvYWQga2V5IGZvciBtZXRob2RzIHdpdGggZGlzdGluZ3Vpc2hpbmcgZmlyc3QgcGFyYW0gKGUuZy4gb24oJ2NoYW5nZWQnLC4uLikpXG4gKlxuICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2QuXG4gKiBAcmV0dXJucyBUaGUgb3ZlcmxvYWQga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU92ZXJsb2FkS2V5KG1ldGhvZDogTWVtYmVySW5mbyk6IHN0cmluZyB7XG4gIGlmIChFVkVOVF9NRVRIT0RTLmhhcyhtZXRob2QubmFtZSkgJiYgbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZpcnN0UGFyYW1ldGVyID0gbWV0aG9kLnBhcmFtZXRlcnNbMF07XG4gICAgaWYgKGZpcnN0UGFyYW1ldGVyPy50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgZmlyc3RQYXJhbWV0ZXI/LnR5cGUuc3RhcnRzV2l0aCgnXFwnJykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gZmlyc3RQYXJhbWV0ZXIudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKTtcbiAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX0oJHtub3JtYWxpemVkVHlwZX0pYDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1ldGhvZC5uYW1lO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvbGRlciBhIGZpbGUgaXMgYWJvdXQgdG8gYmUgd3JpdHRlbiB0by5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSBhYm91dCB0byBiZSB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbWtkaXIoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEVzY2FwZSB0ZXh0IGZvciB1c2UgaW5zaWRlIGEgSlMgc3RyaW5nIHdpdGhpbiBhIEpTWCBleHByZXNzaW9uOiB7Li4ue2tleTogXCIuLi5cIn19XG4gKlxuICogQHBhcmFtIHRleHQgLSBUaGUgdGV4dCB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCB0ZXh0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSnNTdHJpbmcodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXFxcXCcsICdcXFxcXFxcXCcpLnJlcGxhY2VBbGwoJ1wiJywgU3RyaW5nLnJhd2BcXFwiYCkucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEpTWCBhdHRyaWJ1dGU6IGF0dHI9XCIuLi5cIiAoTURYIHVzZXMgSFRNTC1zdHlsZSBwYXJzaW5nKVxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUpzeEF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JykucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JykucmVwbGFjZUFsbCgnXFxuJywgJyAnKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGV4dCBmb3IgYSBtYXJrZG93biB0YWJsZSBjZWxsLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoJ3wnLCBTdHJpbmcucmF3YFxcfGApLnJlcGxhY2VBbGwoJ1xcbicsICcgJykucmVwbGFjZUFsbCgneycsIFN0cmluZy5yYXdgXFx7YCkucmVwbGFjZUFsbCgnfScsIFN0cmluZy5yYXdgXFx9YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuZ2xlIGJyYWNrZXRzIHNvIE1EWCBkb2VzIG5vdCByZWFkIHRoZW0gYXMgSlNYLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1keEFuZ2xlQnJhY2tldHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnPCcsIFN0cmluZy5yYXdgXFw8YCkucmVwbGFjZUFsbCgnPicsIFN0cmluZy5yYXdgXFw+YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIGN1cmx5IGJyYWNlcyBpbiBNRFggbWFya2Rvd24gY29udGVudCB0byBwcmV2ZW50IEpTWCBleHByZXNzaW9uIHBhcnNpbmdcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVNZHhCcmFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgneycsIFN0cmluZy5yYXdgXFx7YCkucmVwbGFjZUFsbCgnfScsIFN0cmluZy5yYXdgXFx9YCk7XG59XG5cbi8qKlxuICogRXNjYXBlIHRleHQgZm9yIGEgZG91YmxlLXF1b3RlZCBZQU1MIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVlhbWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgnXCInLCBTdHJpbmcucmF3YFxcXCJgKTtcbn1cblxuY29uc3QgU0lHTkFUVVJFX01BWF9MRU5HVEggPSAxNjA7XG5jb25zdCBJTVBPUlRfUVVBTElGSUVSX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+W1wiJ10pW15cIiddK1xcazxRdW90ZT5cXClcXC4vZztcbmNvbnN0IElNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+W1wiJ10pKD88UGF0aD5bXlwiJ10rKVxcazxRdW90ZT5cXClcXC4oPzxOYW1lPltBLVphLXpfJF1bXFx3JF0qKS9nO1xuXG4vKipcbiAqIEVzY2FwZSBNRFgtdW5zYWZlIGNoYXJhY3RlcnMgKGA8YCwgYHtgLCBgfWApIGluIHByb3NlIHRleHQsIHdoaWxlIGxlYXZpbmcgaW5saW5lIGNvZGUgc3BhbnNcbiAqIChgYCBgY29kZWAgYGApIGFuZCBtYXJrZG93biBsaW5rcyAoYFt0ZXh0XSh1cmwpYCkgdW50b3VjaGVkLiBNRFggcGFyc2VzIGJhcmUgYDxgL2B7YCBpbiBwcm9zZSBhc1xuICogSlNYL2V4cHJlc3Npb25zLCBzbyB0aGV5IG11c3QgYmUgYmFja3NsYXNoLWVzY2FwZWQgdG8gcmVuZGVyIGFzIGxpdGVyYWwgdGV4dC5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSBwcm9zZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBwcm9zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZU1keFByb3NlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3RlY3RlZFBhdHRlcm4gPSAvYFteYF0qYHxcXFtbXlxcXV0qXFxdXFwoW14pXSpcXCkvZztcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHByb3RlY3RlZFBhdHRlcm4pKSB7XG4gICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleDtcbiAgICByZXN1bHQgKz0gZXNjYXBlTWR4UHJvc2VDaGFycyh0ZXh0LnNsaWNlKGxhc3RJbmRleCwgaW5kZXgpKTtcbiAgICByZXN1bHQgKz0gbWF0Y2hbMF07XG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgcmVzdWx0ICs9IGVzY2FwZU1keFByb3NlQ2hhcnModGV4dC5zbGljZShsYXN0SW5kZXgpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZSBzaW5nbGUgbmV3bGluZXMgd2l0aGluIHBhcmFncmFwaHMgdG8gc3BhY2VzLCBwcmVzZXJ2ZSBkb3VibGUgbmV3bGluZXMgYXMgcGFyYWdyYXBoIGJyZWFrcy5cbiAqIEZlbmNlZCBjb2RlIGJsb2NrcyAoYmFja3RpY2sgb3IgdGlsZGUgZmVuY2VzKSBhcmUgcHJlc2VydmVkIHZlcmJhdGltIOKAlCB0aGVpciBpbnRlcm5hbCBuZXdsaW5lcyBhcmUgTk9UIGZvbGRlZCxcbiAqIHNvIGVtYmVkZGVkIGNvZGUgc3Vydml2ZXMgdG8gYmUgcmUtZW1pdHRlZCBhcyBhIHJlYWwgY29kZSBmZW5jZSBkb3duc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkVHNEb2NQYXJhZ3JhcGhzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZ21lbnRzID0gc2VnbWVudE1hcmtkb3duKHRleHQpO1xuICByZXR1cm4gc2VnbWVudHNcbiAgICAubWFwKChzZWcpID0+IHtcbiAgICAgIHJldHVybiBzZWcudHlwZSA9PT0gJ2NvZGUnXG4gICAgICAgID8gYFxcYFxcYFxcYCR7c2VnLmxhbmd9XFxuJHtzZWcudGV4dH1cXG5cXGBcXGBcXGBgXG4gICAgICAgIDogc2VnLnRleHRcbiAgICAgICAgICAuc3BsaXQoL1xcbnsyLH0vKVxuICAgICAgICAgIC5tYXAoKHBhcmFncmFwaCkgPT4gcGFyYWdyYXBoLnJlcGxhY2VBbGwoJ1xcbicsICcgJykpXG4gICAgICAgICAgLmpvaW4oJ1xcblxcbicpO1xuICAgIH0pXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSdzIG5hbWUgd2l0aCBpdHMgdHlwZSBwYXJhbWV0ZXJzLCB3aXRob3V0IHRoZWlyIGNvbnN0cmFpbnRzLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIG5hbWUgd2l0aCBpdHMgYmFyZSB0eXBlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHtcbiAgaWYgKGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgY29uc3QgYmFyZVBhcmFtcyA9IGluZm8udHlwZVBhcmFtZXRlcnMubWFwKCh0cCkgPT4gdHAucmVwbGFjZSgvXFxzK2V4dGVuZHNcXHMrLiokLywgJycpKTtcbiAgcmV0dXJuIGAke25hbWV9PCR7YmFyZVBhcmFtcy5qb2luKCcsICcpfT5gO1xufVxuXG4vKipcbiAqIEVtaXQgdGhlIGltcG9ydCBzdGF0ZW1lbnQgZm9yIGEgZG9jdW1lbnRlZCBleHBvcnQuXG4gKlxuICogVGhlIHN1YnBhdGggZXF1YWxzIHRoZSB0eXBlJ3MgbmFtZXNwYWNlIChpdHMgc291cmNlIHBhdGggcmVsYXRpdmUgdG8gYHNyY2ApLCBzbyBgc3JjL3N0cmluZy50c2Agb2ZcbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWJgIGlzIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RyaW5nYC5cbiAqXG4gKiBJbnRlcmZhY2VzIC8gdHlwZSBhbGlhc2VzIC8gZW51bXMgYXJlIGltcG9ydGVkIHdpdGggYGltcG9ydCB0eXBlYDsgY2xhc3NlcyAvIGZ1bmN0aW9ucyAvXG4gKiB2YXJpYWJsZXMgd2l0aCBhIHZhbHVlIGBpbXBvcnRgLlxuICpcbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBpbXBvcnQgc3RhdGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wb3J0U3RhdGVtZW50KGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHtcbiAgY29uc3QgaXNUeXBlT25seSA9IFsnZW51bScsICdpbnRlcmZhY2UnLCAndHlwZSddLmluY2x1ZGVzKGluZm8ua2luZCk7XG4gIGNvbnN0IGltcG9ydEtleXdvcmQgPSBpc1R5cGVPbmx5ID8gJ2ltcG9ydCB0eXBlJyA6ICdpbXBvcnQnO1xuICByZXR1cm4gYCR7aW1wb3J0S2V5d29yZH0geyAke2luZm8ubmFtZX0gfSBmcm9tICcke2dldEFwaURvY1NldHRpbmdzKCkucGFja2FnZU5hbWV9LyR7aW5mby5uYW1lc3BhY2V9JztgO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkZXIgYSBuYW1lc3BhY2UncyBwYWdlcyBhcmUgd3JpdHRlbiB0by5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIHR5cGUncyBuYW1lc3BhY2UuXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBTYW5pdGl6ZSBhIG1lbWJlciBuYW1lIGZvciB1c2UgaW4gYSBjYXNlLVBSRVNFUlZFRCBVUkwvcm91dGUgc2VnbWVudCAoZS5nLiBgc2hvd05vdGljZWApLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG1lbWJlcidzIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgY2FzZS1wcmVzZXJ2ZWQgc2VnbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWJlclJvdXRlU2VnbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc2x1Z2lmeU1lbWJlck5hbWUobmFtZSk7XG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBtZW1iZXIgbmFtZSBmb3IgdXNlIGFzIGFuIG9uLWRpc2sgRklMRU5BTUUgKGxvd2VyY2FzZWQsIGNvbGxpc2lvbi1zYWZlKS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBtZW1iZXIncyBuYW1lLlxuICogQHJldHVybnMgVGhlIGxvd2VyY2FzZWQgZmlsZSBuYW1lIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJTbHVnKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1JvdXRlU2VnbWVudChzbHVnaWZ5TWVtYmVyTmFtZShuYW1lKSk7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBhbiBvdmVybG9hZCBrZXkgZm9yIGEgY2FzZS1QUkVTRVJWRUQgVVJML3JvdXRlIHNlZ21lbnQ6IG9uKFwiY2hhbmdlZFwiKSAtPiBvbi1jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBvdmVybG9hZEtleSAtIFRoZSBvdmVybG9hZCBrZXksIGUuZy4gYG9uKCdjaGFuZ2VkJylgLlxuICogQHJldHVybnMgVGhlIGNhc2UtcHJlc2VydmVkIHNlZ21lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvdmVybG9hZFJvdXRlU2VnbWVudChvdmVybG9hZEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNsdWdpZnlPdmVybG9hZEtleShvdmVybG9hZEtleSk7XG59XG5cbi8qKlxuICogU2x1Z2lmeSBhbiBvdmVybG9hZCBrZXkgZm9yIGFuIG9uLWRpc2sgRklMRU5BTUU6IG9uKFwiY2hhbmdlZFwiKSAtPiBvbi1jaGFuZ2VkIChsb3dlcmNhc2VkKS5cbiAqXG4gKiBAcGFyYW0gb3ZlcmxvYWRLZXkgLSBUaGUgb3ZlcmxvYWQga2V5LCBlLmcuIGBvbignY2hhbmdlZCcpYC5cbiAqIEByZXR1cm5zIFRoZSBsb3dlcmNhc2VkIGZpbGUgbmFtZSBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3ZlcmxvYWRTbHVnKG92ZXJsb2FkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9Sb3V0ZVNlZ21lbnQoc2x1Z2lmeU92ZXJsb2FkS2V5KG92ZXJsb2FkS2V5KSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBldmVyeSBtYXRjaCBvZiBhIGdsb2JhbCByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCB3aGF0IGEgcmVwbGFjZXIgYnVpbGRzIGZyb20gdGhlIG1hdGNoLiBUaGUgdHlwZWRcbiAqIGNvdW50ZXJwYXJ0IG9mIGBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGxgIHdpdGggYSBjYWxsYmFjaywgd2hvc2UgYXJndW1lbnRzIGFyZSB0eXBlZCBvbmx5IHBvc2l0aW9uYWxseS5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHBhcmFtIHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb247IGl0IG11c3QgY2FycnkgdGhlIGBnYCBmbGFnLlxuICogQHBhcmFtIHJlcGxhY2VyIC0gQnVpbGRzIHRoZSByZXBsYWNlbWVudCBvZiBvbmUgbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IG1hdGNoIHJlcGxhY2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgcmVwbGFjZXI6IChtYXRjaDogUmVnRXhwTWF0Y2hBcnJheSkgPT4gc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHJlZ0V4cCkpIHtcbiAgICByZXN1bHQgKz0gdGV4dC5zbGljZShsYXN0SW5kZXgsIG1hdGNoLmluZGV4KSArIHJlcGxhY2VyKG1hdGNoKTtcbiAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gcmVzdWx0ICsgdGV4dC5zbGljZShsYXN0SW5kZXgpO1xufVxuXG4vKipcbiAqIFNwbGl0IG1hcmtkb3duIHRleHQgaW50byBhbiBvcmRlcmVkIGxpc3Qgb2YgcHJvc2UgYW5kIGZlbmNlZC1jb2RlIHNlZ21lbnRzLlxuICogQSBmZW5jZWQtY29kZSBzZWdtZW50IGlzIGRlbGltaXRlZCBieSBhIGxpbmUgb2YgMysgYmFja3RpY2tzIG9yIHRpbGRlczsgaXRzIGNvbnRlbnQgaXMgY2FwdHVyZWRcbiAqIHJhdyAobmV2ZXIgZXNjYXBlZCkgc28gaXQgY2FuIGJlIHJlLWVtaXR0ZWQgYXMgYSBsaXRlcmFsIE1EWCBjb2RlIGZlbmNlLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgc2VnbWVudHMsIGluIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VnbWVudE1hcmtkb3duKHRleHQ6IHN0cmluZyk6IE1hcmtkb3duU2VnbWVudFtdIHtcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgc2VnbWVudHM6IE1hcmtkb3duU2VnbWVudFtdID0gW107XG4gIGxldCBwcm9zZUJ1ZmZlcjogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGNvZGVMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW5GZW5jZTogbnVsbCB8IE9wZW5GZW5jZSA9IG51bGw7XG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGlmIChvcGVuRmVuY2UpIHtcbiAgICAgIGlmIChvcGVuRmVuY2UuY2xvc2VSZS50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goeyBsYW5nOiBvcGVuRmVuY2UubGFuZywgdGV4dDogY29kZUxpbmVzLmpvaW4oJ1xcbicpLCB0eXBlOiAnY29kZScgfSk7XG4gICAgICAgIG9wZW5GZW5jZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlTGluZXMucHVzaChsaW5lKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW5NYXRjaCA9IC9eXFxzKig/PGZlbmNlPig/PGZlbmNlQ2hhcj5bYH5dKVxcazxmZW5jZUNoYXI+ezIsfSkoPzxsYW5nPi4qKSQvLmV4ZWMobGluZSk7XG4gICAgaWYgKG9wZW5NYXRjaCkge1xuICAgICAgY29uc3QgZmVuY2VDaGFycyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAob3Blbk1hdGNoLCAnZmVuY2UnKTtcbiAgICAgIGNvbnN0IGZlbmNlQ2hhciA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAob3Blbk1hdGNoLCAnZmVuY2VDaGFyJyk7XG4gICAgICBmbHVzaFByb3NlKCk7XG4gICAgICBjb2RlTGluZXMgPSBbXTtcbiAgICAgIG9wZW5GZW5jZSA9IHtcbiAgICAgICAgY2xvc2VSZTogbmV3IFJlZ0V4cChgXlxcXFxzKlxcXFwke2ZlbmNlQ2hhcn17JHtTdHJpbmcoZmVuY2VDaGFycy5sZW5ndGgpfSx9XFxcXHMqJGApLFxuICAgICAgICBsYW5nOiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG9wZW5NYXRjaCwgJ2xhbmcnKS50cmltKClcbiAgICAgIH07XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcHJvc2VCdWZmZXIucHVzaChsaW5lKTtcbiAgfVxuICAvLyBBbiB1bmNsb3NlZCBmZW5jZSBydW5zIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQuXG4gIGlmIChvcGVuRmVuY2UpIHtcbiAgICBzZWdtZW50cy5wdXNoKHsgbGFuZzogb3BlbkZlbmNlLmxhbmcsIHRleHQ6IGNvZGVMaW5lcy5qb2luKCdcXG4nKSwgdHlwZTogJ2NvZGUnIH0pO1xuICB9XG4gIGZsdXNoUHJvc2UoKTtcbiAgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGZ1bmN0aW9uIGZsdXNoUHJvc2UoKTogdm9pZCB7XG4gICAgaWYgKHByb3NlQnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlZ21lbnRzLnB1c2goeyB0ZXh0OiBwcm9zZUJ1ZmZlci5qb2luKCdcXG4nKSwgdHlwZTogJ3Byb3NlJyB9KTtcbiAgICBwcm9zZUJ1ZmZlciA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogU3RyaXAgdGhlIGBpbXBvcnQoXCLigKZcIilgIHF1YWxpZmllcnMgdHMtbW9ycGggcHJpbnRzIGJlZm9yZSBhIHR5cGUgdGhhdCBpcyBub3QgaW4gc2NvcGUsIHJlY29yZGluZyBlYWNoIG9uZSdzXG4gKiBkZWNsYXJhdGlvbiBmaWxlIGZpcnN0LCBzaW5jZSBpdCBpcyB0aGUgb25lIHBsYWNlIGEgcHJpbnRlZCB0eXBlIG5hbWVzIHdoZXJlIGl0IHdhcyBkZWNsYXJlZC5cbiAqXG4gKiBAcGFyYW0gdHlwZVRleHQgLSBUaGUgcHJpbnRlZCB0eXBlLlxuICogQHJldHVybnMgVGhlIHR5cGUgd2l0aG91dCBpdHMgaW1wb3J0IHF1YWxpZmllcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVR5cGUodHlwZVRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2YgdHlwZVRleHQubWF0Y2hBbGwoSU1QT1JUX1RZUEVfUkVHX0VYUCkpIHtcbiAgICByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnTmFtZScpLCBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnUGF0aCcpKTtcbiAgfVxuXG4gIHJldHVybiB0eXBlVGV4dC5yZXBsYWNlQWxsKElNUE9SVF9RVUFMSUZJRVJfUkVHX0VYUCwgJycpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIGNvZGUgc2lnbmF0dXJlIGZvciB0aGUgYHNpZ25hdHVyZTpgIGZyb250bWF0dGVyIC8gT0cgY2FyZDogY29sbGFwc2Ugd2hpdGVzcGFjZSB0b1xuICogc2luZ2xlIHNwYWNlcyBhbmQgdHJ1bmNhdGUgdG8gYSBjYXJkLWZyaWVuZGx5IGxlbmd0aCB3aXRoIGFuIGVsbGlwc2lzLlxuICpcbiAqIEBwYXJhbSBzaWduYXR1cmUgLSBUaGUgc2lnbmF0dXJlLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgc2lnbmF0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGVTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb2xsYXBzZWQgPSBzaWduYXR1cmUucmVwbGFjZUFsbCgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgcmV0dXJuIGNvbGxhcHNlZC5sZW5ndGggPD0gU0lHTkFUVVJFX01BWF9MRU5HVEggPyBjb2xsYXBzZWQgOiBgJHtjb2xsYXBzZWQuc2xpY2UoMCwgU0lHTkFUVVJFX01BWF9MRU5HVEggLSAxKS50cmltRW5kKCl94oCmYDtcbn1cblxuZnVuY3Rpb24gc2x1Z2lmeU1lbWJlck5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2xlYW5lZCA9IG5hbWVcbiAgICAucmVwbGFjZUFsbCgvXltcIiddfFtcIiddJC9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvW15hLXpBLVowLTldL2csICctJylcbiAgICAucmVwbGFjZUFsbCgvLSsvZywgJy0nKVxuICAgIC5yZXBsYWNlQWxsKC9eLXwtJC9nLCAnJyk7XG4gIC8vIEEgbWVtYmVyIGxpdGVyYWxseSBuYW1lZCBgaW5kZXhgIHdvdWxkIHdyaXRlIGBpbmRleC5tZHhgLCBjb2xsaWRpbmcgd2l0aCB0aGUgdHlwZS1vdmVydmlld1xuICAvLyBgaW5kZXgubWR4YCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgKG9uZSBzaWxlbnRseSBvdmVyd3JpdGVzIHRoZSBvdGhlciwgNDA0LWluZyB0aGUgbG9zZXIpLlxuICByZXR1cm4gY2xlYW5lZCA9PT0gJ2luZGV4JyA/ICdpbmRleC1tZW1iZXInIDogKGNsZWFuZWQgfHwgJ3VubmFtZWQnKTtcbn1cblxuZnVuY3Rpb24gc2x1Z2lmeU92ZXJsb2FkS2V5KG92ZXJsb2FkS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzbHVnID0gb3ZlcmxvYWRLZXlcbiAgICAucmVwbGFjZUFsbCgvW1wiJygpXS9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoL1teYS16QS1aMC05XFxzXS9nLCAnJylcbiAgICAudHJpbSgpXG4gICAgLnJlcGxhY2VBbGwoL1xccysvZywgJy0nKTtcbiAgLy8gQSBtZXRob2QgbmFtZWQgYGluZGV4YCB3b3VsZCB3cml0ZSBgaW5kZXgubWR4YCBvdmVyIHRoZSB0eXBlLW92ZXJ2aWV3IHBhZ2UsIGV4YWN0bHkgYXMgYSBwcm9wZXJ0eSB3b3VsZC5cbiAgcmV0dXJuIHNsdWcgPT09ICdpbmRleCcgPyAnaW5kZXgtbWVtYmVyJyA6IHNsdWc7XG59XG5cbmNvbnN0IE9HX0RFU0NSSVBUSU9OX01BWF9MRU5HVEggPSAxNjA7XG5cbi8qKlxuICogU3RyaXAgbWFya2Rvd24gZm9ybWF0dGluZyB0byBwbGFpbiB0ZXh0IGZvciB1c2UgaW4gbWV0YSBkZXNjcmlwdGlvbnNcbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0LlxuICogQHJldHVybnMgVGhlIHBsYWluIHRleHQsIGF0IG1vc3QgMTYwIGNoYXJhY3RlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcE1hcmtkb3duKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBsYWluID0gcmVwbGFjZVJlZ0V4cE1hdGNoZXModGV4dCwgL1xce0BsaW5rXFxzKyg/OltefH1dKz8pKD86XFxzKlxcfFxccyooPzxkaXNwbGF5PltefV0rPykpP1xcfS9nLCAobWF0Y2gpID0+IGdldE9wdGlvbmFsTmFtZWRHcm91cChtYXRjaCwgJ2Rpc3BsYXknKSA/PyAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxbKD88dGV4dD5bXlxcXV0rKVxcXVxcKFteKV0rXFwpL2csICckPHRleHQ+JylcbiAgICAucmVwbGFjZUFsbCgvW2AqX35dL2csICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJylcbiAgICAudHJpbSgpO1xuXG4gIGlmIChwbGFpbi5sZW5ndGggPD0gT0dfREVTQ1JJUFRJT05fTUFYX0xFTkdUSCkge1xuICAgIHJldHVybiBwbGFpbjtcbiAgfVxuXG4gIC8vIEN1dCBiYWNrIHRvIGEgd29yZCBib3VuZGFyeTogYSByYXcgc2xpY2UgZW5kcyBkZXNjcmlwdGlvbnMgbWlkLXdvcmQgKGDigKYgdGhlIHN0cmluZyBtb2R1bGUgaXMgb2JgKS5cbiAgLy8gVGhhdCBmcmFnbWVudCBpcyB3aGF0IHJlYWRlcnMgc2VlIG9uIHRoZSBPRyBjYXJkIGFuZCBpbiBzZWFyY2ggcmVzdWx0cy5cbiAgY29uc3QgY2xpcHBlZCA9IHBsYWluLnNsaWNlKDAsIE9HX0RFU0NSSVBUSU9OX01BWF9MRU5HVEggLSAxKTtcbiAgY29uc3QgbGFzdFNwYWNlSW5kZXggPSBjbGlwcGVkLmxhc3RJbmRleE9mKCcgJyk7XG4gIGNvbnN0IHRydW5jYXRlZCA9IGxhc3RTcGFjZUluZGV4ID4gMCA/IGNsaXBwZWQuc2xpY2UoMCwgbGFzdFNwYWNlSW5kZXgpIDogY2xpcHBlZDtcbiAgcmV0dXJuIGAke3RydW5jYXRlZC5yZXBsYWNlKC9bLDs6Llxcc10rJC8sICcnKX3igKZgO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVNZHhQcm9zZUNoYXJzKGNodW5rOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY2h1bmsucmVwbGFjZUFsbCgvWzx7fV0vZywgKGNoYXIpID0+IGBcXFxcJHtjaGFyfWApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsZUFBZTtBQVF4QixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLGtDQUFrQztBQUMzQyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHlCQUF5QjtBQWEzQixTQUFTLG1CQUFtQixRQUE0QjtBQUM3RCxNQUFJLGNBQWMsSUFBSSxP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
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Inheritance resolution: copies inherited members onto subtypes, substituting generic type args.
|
|
6
|
+
*
|
|
7
|
+
* (A documented package is a normal library, not an augmentation of another package's declarations, so there is no
|
|
8
|
+
* official-vs-unofficial merge machinery here — only the generic inheritance helpers.)
|
|
9
|
+
*/
|
|
10
|
+
import type { MemberInfo, TypeInfo } from './api-doc-types.mjs';
|
|
11
|
+
/**
|
|
12
|
+
* Build a mapping from parent type parameter names to concrete type arguments.
|
|
13
|
+
* E.g., parent has `typeParameters: ['Instance extends BaseInstance']` and
|
|
14
|
+
* child extends `Parent<CanvasPluginInstance>` → `{Instance: 'CanvasPluginInstance'}`
|
|
15
|
+
*
|
|
16
|
+
* @param baseInfo - The base type.
|
|
17
|
+
* @param typeArguments - The type arguments the base type is given.
|
|
18
|
+
* @returns The parameter names mapped to their arguments.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildTypeParameterMap(baseInfo: TypeInfo, typeArguments: string[]): Map<string, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Parse generic type arguments from a base type expression.
|
|
23
|
+
* E.g., `InternalPlugin<CanvasPluginInstance>` → `['CanvasPluginInstance']`
|
|
24
|
+
* Handles nested angle brackets: `Foo<Bar<Baz>, Qux>` → `['Bar<Baz>', 'Qux']`
|
|
25
|
+
*
|
|
26
|
+
* @param baseTypeName - The base type expression, e.g. `Foo<Bar, Baz>`.
|
|
27
|
+
* @returns The type arguments.
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseTypeArguments(baseTypeName: string): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Copies every inherited member onto its subtypes, substituting the type arguments the subtype passes.
|
|
32
|
+
*
|
|
33
|
+
* @param types - The documented types, keyed by qualified id.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveInheritedMembers(types: Map<string, TypeInfo>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Apply type parameter substitution to all type-bearing fields of a member
|
|
38
|
+
*
|
|
39
|
+
* @param member - The member.
|
|
40
|
+
* @param mapping - Type parameter names mapped to their arguments.
|
|
41
|
+
* @returns The member with its types substituted.
|
|
42
|
+
*/
|
|
43
|
+
export declare function substituteMemberTypes(member: MemberInfo, mapping: Map<string, string>): MemberInfo;
|
|
44
|
+
/**
|
|
45
|
+
* Substitute generic type parameters in a type string using a mapping
|
|
46
|
+
*
|
|
47
|
+
* @param typeText - The type text.
|
|
48
|
+
* @param mapping - Type parameter names mapped to their arguments.
|
|
49
|
+
* @returns The substituted type text.
|
|
50
|
+
*/
|
|
51
|
+
export declare function substituteTypeParams(typeText: string, mapping: Map<string, string>): string;
|
|
@@ -0,0 +1,129 @@
|
|
|
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 { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
|
|
40
|
+
import { findType } from "./api-doc-link-rendering.mjs";
|
|
41
|
+
function buildTypeParameterMap(baseInfo, typeArguments) {
|
|
42
|
+
const mapping = /* @__PURE__ */ new Map();
|
|
43
|
+
const count = Math.min(baseInfo.typeParameters.length, typeArguments.length);
|
|
44
|
+
for (let index = 0; index < count; index++) {
|
|
45
|
+
const parameter = ensureNonNullable(baseInfo.typeParameters[index]);
|
|
46
|
+
const argument = ensureNonNullable(typeArguments[index]);
|
|
47
|
+
const bareParameter = parameter.replace(/\s+extends\s+.*$/, "");
|
|
48
|
+
mapping.set(bareParameter, argument);
|
|
49
|
+
}
|
|
50
|
+
return mapping;
|
|
51
|
+
}
|
|
52
|
+
function parseTypeArguments(baseTypeName) {
|
|
53
|
+
const openIndex = baseTypeName.indexOf("<");
|
|
54
|
+
if (openIndex === -1) {
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
const inner = baseTypeName.slice(openIndex + 1, -1);
|
|
58
|
+
const $arguments = [];
|
|
59
|
+
let depth = 0;
|
|
60
|
+
let current = "";
|
|
61
|
+
for (const ch of inner) {
|
|
62
|
+
if (ch === "<") {
|
|
63
|
+
depth++;
|
|
64
|
+
current += ch;
|
|
65
|
+
} else if (ch === ">") {
|
|
66
|
+
depth--;
|
|
67
|
+
current += ch;
|
|
68
|
+
} else if (ch === "," && depth === 0) {
|
|
69
|
+
$arguments.push(current.trim());
|
|
70
|
+
current = "";
|
|
71
|
+
} else {
|
|
72
|
+
current += ch;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (current.trim()) {
|
|
76
|
+
$arguments.push(current.trim());
|
|
77
|
+
}
|
|
78
|
+
return $arguments;
|
|
79
|
+
}
|
|
80
|
+
function resolveInheritedMembers(types) {
|
|
81
|
+
for (const [, info] of types) {
|
|
82
|
+
for (const baseTypeName of [...info.baseTypes, ...info.implementsTypes]) {
|
|
83
|
+
const cleanBase = baseTypeName.replace(/<.*>$/, "").trim();
|
|
84
|
+
const baseInfo = findType(types, cleanBase, info.namespace);
|
|
85
|
+
if (!baseInfo) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const typeArguments = parseTypeArguments(baseTypeName);
|
|
89
|
+
const typeParameterMap = buildTypeParameterMap(baseInfo, typeArguments);
|
|
90
|
+
for (const property of baseInfo.properties) {
|
|
91
|
+
if (info.properties.every((p) => p.name !== property.name)) {
|
|
92
|
+
info.properties.push(substituteMemberTypes({ ...property, inheritedFrom: baseInfo.name }, typeParameterMap));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const method of baseInfo.methods) {
|
|
96
|
+
const hasOwnMethod = info.methods.some((m) => m.name === method.name && m.signature === method.signature);
|
|
97
|
+
const hasInheritedMethod = info.methods.some((m) => m.inheritedFrom === baseInfo.name && m.overloadKey === method.overloadKey);
|
|
98
|
+
if (!hasOwnMethod && !hasInheritedMethod) {
|
|
99
|
+
info.methods.push(substituteMemberTypes({ ...method, inheritedFrom: baseInfo.name }, typeParameterMap));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function substituteMemberTypes(member, mapping) {
|
|
106
|
+
return mapping.size === 0 ? member : {
|
|
107
|
+
...member,
|
|
108
|
+
parameters: member.parameters.map((p) => ({
|
|
109
|
+
...p,
|
|
110
|
+
type: substituteTypeParams(p.type, mapping)
|
|
111
|
+
})),
|
|
112
|
+
returnType: substituteTypeParams(member.returnType, mapping),
|
|
113
|
+
signature: substituteTypeParams(member.signature, mapping),
|
|
114
|
+
type: substituteTypeParams(member.type, mapping)
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function substituteTypeParams(typeText, mapping) {
|
|
118
|
+
return mapping.size === 0 ? typeText : typeText.replaceAll(/\b(?<typeName>[a-zA-Z][a-zA-Z0-9]*)\b/g, (match) => {
|
|
119
|
+
return mapping.get(match) ?? match;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export {
|
|
123
|
+
buildTypeParameterMap,
|
|
124
|
+
parseTypeArguments,
|
|
125
|
+
resolveInheritedMembers,
|
|
126
|
+
substituteMemberTypes,
|
|
127
|
+
substituteTypeParams
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy10eXBlLW1lcmdpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaGVyaXRhbmNlIHJlc29sdXRpb246IGNvcGllcyBpbmhlcml0ZWQgbWVtYmVycyBvbnRvIHN1YnR5cGVzLCBzdWJzdGl0dXRpbmcgZ2VuZXJpYyB0eXBlIGFyZ3MuXG4gKlxuICogKEEgZG9jdW1lbnRlZCBwYWNrYWdlIGlzIGEgbm9ybWFsIGxpYnJhcnksIG5vdCBhbiBhdWdtZW50YXRpb24gb2YgYW5vdGhlciBwYWNrYWdlJ3MgZGVjbGFyYXRpb25zLCBzbyB0aGVyZSBpcyBub1xuICogb2ZmaWNpYWwtdnMtdW5vZmZpY2lhbCBtZXJnZSBtYWNoaW5lcnkgaGVyZSDigJQgb25seSB0aGUgZ2VuZXJpYyBpbmhlcml0YW5jZSBoZWxwZXJzLilcbiAqL1xuXG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgVHlwZUluZm9cbn0gZnJvbSAnLi9hcGktZG9jLXR5cGVzLnRzJztcblxuaW1wb3J0IHsgZmluZFR5cGUgfSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuXG4vKipcbiAqIEJ1aWxkIGEgbWFwcGluZyBmcm9tIHBhcmVudCB0eXBlIHBhcmFtZXRlciBuYW1lcyB0byBjb25jcmV0ZSB0eXBlIGFyZ3VtZW50cy5cbiAqIEUuZy4sIHBhcmVudCBoYXMgYHR5cGVQYXJhbWV0ZXJzOiBbJ0luc3RhbmNlIGV4dGVuZHMgQmFzZUluc3RhbmNlJ11gIGFuZFxuICogY2hpbGQgZXh0ZW5kcyBgUGFyZW50PENhbnZhc1BsdWdpbkluc3RhbmNlPmAg4oaSIGB7SW5zdGFuY2U6ICdDYW52YXNQbHVnaW5JbnN0YW5jZSd9YFxuICpcbiAqIEBwYXJhbSBiYXNlSW5mbyAtIFRoZSBiYXNlIHR5cGUuXG4gKiBAcGFyYW0gdHlwZUFyZ3VtZW50cyAtIFRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgYmFzZSB0eXBlIGlzIGdpdmVuLlxuICogQHJldHVybnMgVGhlIHBhcmFtZXRlciBuYW1lcyBtYXBwZWQgdG8gdGhlaXIgYXJndW1lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvOiBUeXBlSW5mbywgdHlwZUFyZ3VtZW50czogc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwcGluZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGNvdW50ID0gTWF0aC5taW4oYmFzZUluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoLCB0eXBlQXJndW1lbnRzLmxlbmd0aCk7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgIC8vIEJvdGggbGlzdHMgYXJlIGxvbmdlciB0aGFuIGBpbmRleGAuXG4gICAgY29uc3QgcGFyYW1ldGVyID0gZW5zdXJlTm9uTnVsbGFibGUoYmFzZUluZm8udHlwZVBhcmFtZXRlcnNbaW5kZXhdKTtcbiAgICBjb25zdCBhcmd1bWVudCA9IGVuc3VyZU5vbk51bGxhYmxlKHR5cGVBcmd1bWVudHNbaW5kZXhdKTtcbiAgICBjb25zdCBiYXJlUGFyYW1ldGVyID0gcGFyYW1ldGVyLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICBtYXBwaW5nLnNldChiYXJlUGFyYW1ldGVyLCBhcmd1bWVudCk7XG4gIH1cbiAgcmV0dXJuIG1hcHBpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBmcm9tIGEgYmFzZSB0eXBlIGV4cHJlc3Npb24uXG4gKiBFLmcuLCBgSW50ZXJuYWxQbHVnaW48Q2FudmFzUGx1Z2luSW5zdGFuY2U+YCDihpIgYFsnQ2FudmFzUGx1Z2luSW5zdGFuY2UnXWBcbiAqIEhhbmRsZXMgbmVzdGVkIGFuZ2xlIGJyYWNrZXRzOiBgRm9vPEJhcjxCYXo+LCBRdXg+YCDihpIgYFsnQmFyPEJhej4nLCAnUXV4J11gXG4gKlxuICogQHBhcmFtIGJhc2VUeXBlTmFtZSAtIFRoZSBiYXNlIHR5cGUgZXhwcmVzc2lvbiwgZS5nLiBgRm9vPEJhciwgQmF6PmAuXG4gKiBAcmV0dXJucyBUaGUgdHlwZSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoYmFzZVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG9wZW5JbmRleCA9IGJhc2VUeXBlTmFtZS5pbmRleE9mKCc8Jyk7XG4gIGlmIChvcGVuSW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGlubmVyID0gYmFzZVR5cGVOYW1lLnNsaWNlKG9wZW5JbmRleCArIDEsIC0xKTtcbiAgY29uc3QgJGFyZ3VtZW50czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgZm9yIChjb25zdCBjaCBvZiBpbm5lcikge1xuICAgIGlmIChjaCA9PT0gJzwnKSB7XG4gICAgICBkZXB0aCsrO1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnPicpIHtcbiAgICAgIGRlcHRoLS07XG4gICAgICBjdXJyZW50ICs9IGNoO1xuICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJyAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgICAgIGN1cnJlbnQgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCArPSBjaDtcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQudHJpbSgpKSB7XG4gICAgJGFyZ3VtZW50cy5wdXNoKGN1cnJlbnQudHJpbSgpKTtcbiAgfVxuICByZXR1cm4gJGFyZ3VtZW50cztcbn1cblxuLyoqXG4gKiBDb3BpZXMgZXZlcnkgaW5oZXJpdGVkIG1lbWJlciBvbnRvIGl0cyBzdWJ0eXBlcywgc3Vic3RpdHV0aW5nIHRoZSB0eXBlIGFyZ3VtZW50cyB0aGUgc3VidHlwZSBwYXNzZXMuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmhlcml0ZWRNZW1iZXJzKHR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGZvciAoY29uc3QgYmFzZVR5cGVOYW1lIG9mIFsuLi5pbmZvLmJhc2VUeXBlcywgLi4uaW5mby5pbXBsZW1lbnRzVHlwZXNdKSB7XG4gICAgICBjb25zdCBjbGVhbkJhc2UgPSBiYXNlVHlwZU5hbWUucmVwbGFjZSgvPC4qPiQvLCAnJykudHJpbSgpO1xuICAgICAgY29uc3QgYmFzZUluZm8gPSBmaW5kVHlwZSh0eXBlcywgY2xlYW5CYXNlLCBpbmZvLm5hbWVzcGFjZSk7XG4gICAgICBpZiAoIWJhc2VJbmZvKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKGJhc2VUeXBlTmFtZSk7XG4gICAgICBjb25zdCB0eXBlUGFyYW1ldGVyTWFwID0gYnVpbGRUeXBlUGFyYW1ldGVyTWFwKGJhc2VJbmZvLCB0eXBlQXJndW1lbnRzKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBiYXNlSW5mby5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChpbmZvLnByb3BlcnRpZXMuZXZlcnkoKHApID0+IHAubmFtZSAhPT0gcHJvcGVydHkubmFtZSkpIHtcbiAgICAgICAgICBpbmZvLnByb3BlcnRpZXMucHVzaChzdWJzdGl0dXRlTWVtYmVyVHlwZXMoeyAuLi5wcm9wZXJ0eSwgaW5oZXJpdGVkRnJvbTogYmFzZUluZm8ubmFtZSB9LCB0eXBlUGFyYW1ldGVyTWFwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgYmFzZUluZm8ubWV0aG9kcykge1xuICAgICAgICBjb25zdCBoYXNPd25NZXRob2QgPSBpbmZvLm1ldGhvZHMuc29tZSgobSkgPT4gbS5uYW1lID09PSBtZXRob2QubmFtZSAmJiBtLnNpZ25hdHVyZSA9PT0gbWV0aG9kLnNpZ25hdHVyZSk7XG4gICAgICAgIGNvbnN0IGhhc0luaGVyaXRlZE1ldGhvZCA9IGluZm8ubWV0aG9kcy5zb21lKChtKSA9PiBtLmluaGVyaXRlZEZyb20gPT09IGJhc2VJbmZvLm5hbWUgJiYgbS5vdmVybG9hZEtleSA9PT0gbWV0aG9kLm92ZXJsb2FkS2V5KTtcbiAgICAgICAgaWYgKCFoYXNPd25NZXRob2QgJiYgIWhhc0luaGVyaXRlZE1ldGhvZCkge1xuICAgICAgICAgIGluZm8ubWV0aG9kcy5wdXNoKHN1YnN0aXR1dGVNZW1iZXJUeXBlcyh7IC4uLm1ldGhvZCwgaW5oZXJpdGVkRnJvbTogYmFzZUluZm8ubmFtZSB9LCB0eXBlUGFyYW1ldGVyTWFwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSB0eXBlIHBhcmFtZXRlciBzdWJzdGl0dXRpb24gdG8gYWxsIHR5cGUtYmVhcmluZyBmaWVsZHMgb2YgYSBtZW1iZXJcbiAqXG4gKiBAcGFyYW0gbWVtYmVyIC0gVGhlIG1lbWJlci5cbiAqIEBwYXJhbSBtYXBwaW5nIC0gVHlwZSBwYXJhbWV0ZXIgbmFtZXMgbWFwcGVkIHRvIHRoZWlyIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIgd2l0aCBpdHMgdHlwZXMgc3Vic3RpdHV0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdGl0dXRlTWVtYmVyVHlwZXMobWVtYmVyOiBNZW1iZXJJbmZvLCBtYXBwaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogTWVtYmVySW5mbyB7XG4gIHJldHVybiBtYXBwaW5nLnNpemUgPT09IDBcbiAgICA/IG1lbWJlclxuICAgIDoge1xuICAgICAgLi4ubWVtYmVyLFxuICAgICAgcGFyYW1ldGVyczogbWVtYmVyLnBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgICAgICAuLi5wLFxuICAgICAgICB0eXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhwLnR5cGUsIG1hcHBpbmcpXG4gICAgICB9KSksXG4gICAgICByZXR1cm5UeXBlOiBzdWJzdGl0dXRlVHlwZVBhcmFtcyhtZW1iZXIucmV0dXJuVHlwZSwgbWFwcGluZyksXG4gICAgICBzaWduYXR1cmU6IHN1YnN0aXR1dGVUeXBlUGFyYW1zKG1lbWJlci5zaWduYXR1cmUsIG1hcHBpbmcpLFxuICAgICAgdHlwZTogc3Vic3RpdHV0ZVR5cGVQYXJhbXMobWVtYmVyLnR5cGUsIG1hcHBpbmcpXG4gICAgfTtcbn1cblxuLyoqXG4gKiBTdWJzdGl0dXRlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIGluIGEgdHlwZSBzdHJpbmcgdXNpbmcgYSBtYXBwaW5nXG4gKlxuICogQHBhcmFtIHR5cGVUZXh0IC0gVGhlIHR5cGUgdGV4dC5cbiAqIEBwYXJhbSBtYXBwaW5nIC0gVHlwZSBwYXJhbWV0ZXIgbmFtZXMgbWFwcGVkIHRvIHRoZWlyIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBzdWJzdGl0dXRlZCB0eXBlIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzdGl0dXRlVHlwZVBhcmFtcyh0eXBlVGV4dDogc3RyaW5nLCBtYXBwaW5nOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIG1hcHBpbmcuc2l6ZSA9PT0gMFxuICAgID8gdHlwZVRleHRcbiAgICA6IHR5cGVUZXh0LnJlcGxhY2VBbGwoL1xcYig/PHR5cGVOYW1lPlthLXpBLVpdW2EtekEtWjAtOV0qKVxcYi9nLCAobWF0Y2gpID0+IHtcbiAgICAgIHJldHVybiBtYXBwaW5nLmdldChtYXRjaCkgPz8gbWF0Y2g7XG4gICAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU0EsU0FBUyx5QkFBeUI7QUFPbEMsU0FBUyxnQkFBZ0I7QUFXbEIsU0FBUyxzQkFBc0IsVUFBb0IsZUFBOEM7QUFDdEcsUUFBTSxVQUFVLG9CQUFJLElBQW9CO0FBQ3hDLFFBQU0sUUFBUSxLQUFLLElBQUksU0FBUyxlQUFlLFFBQVEsY0FBYyxNQUFNO0FBQzNFLFdBQVMsUUFBUSxHQUFHLFFBQVEsT0FBTyxTQUFTO0FBRTFDLFVBQU0sWUFBWSxrQkFBa0IsU0FBUyxlQUFlLEtBQUssQ0FBQztBQUNsRSxVQUFNLFdBQVcsa0JBQWtCLGNBQWMsS0FBSyxDQUFDO0FBQ3ZELFVBQU0sZ0JBQWdCLFVBQVUsUUFBUSxvQkFBb0IsRUFBRTtBQUM5RCxZQUFRLElBQUksZUFBZSxRQUFRO0FBQUEsRUFDckM7QUFDQSxTQUFPO0FBQ1Q7QUFVTyxTQUFTLG1CQUFtQixjQUFnQztBQUNqRSxRQUFNLFlBQVksYUFBYSxRQUFRLEdBQUc7QUFDMUMsTUFBSSxjQUFjLElBQUk7QUFDcEIsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUNBLFFBQU0sUUFBUSxhQUFhLE1BQU0sWUFBWSxHQUFHLEVBQUU7QUFDbEQsUUFBTSxhQUF1QixDQUFDO0FBQzlCLE1BQUksUUFBUTtBQUNaLE1BQUksVUFBVTtBQUNkLGFBQVcsTUFBTSxPQUFPO0FBQ3RCLFFBQUksT0FBTyxLQUFLO0FBQ2Q7QUFDQSxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLEtBQUs7QUFDckI7QUFDQSxpQkFBVztBQUFBLElBQ2IsV0FBVyxPQUFPLE9BQU8sVUFBVSxHQUFHO0FBQ3BDLGlCQUFXLEtBQUssUUFBUSxLQUFLLENBQUM7QUFDOUIsZ0JBQVU7QUFBQSxJQUNaLE9BQU87QUFDTCxpQkFBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQ0EsTUFBSSxRQUFRLEtBQUssR0FBRztBQUNsQixlQUFXLEtBQUssUUFBUSxLQUFLLENBQUM7QUFBQSxFQUNoQztBQUNBLFNBQU87QUFDVDtBQU9PLFNBQVMsd0JBQXdCLE9BQW9DO0FBQzFFLGFBQVcsQ0FBQyxFQUFFLElBQUksS0FBSyxPQUFPO0FBQzVCLGVBQVcsZ0JBQWdCLENBQUMsR0FBRyxLQUFLLFdBQVcsR0FBRyxLQUFLLGVBQWUsR0FBRztBQUN2RSxZQUFNLFlBQVksYUFBYSxRQUFRLFNBQVMsRUFBRSxFQUFFLEtBQUs7QUFDekQsWUFBTSxXQUFXLFNBQVMsT0FBTyxXQUFXLEtBQUssU0FBUztBQUMxRCxVQUFJLENBQUMsVUFBVTtBQUNiO0FBQUEsTUFDRjtBQUVBLFlBQU0sZ0JBQWdCLG1CQUFtQixZQUFZO0FBQ3JELFlBQU0sbUJBQW1CLHNCQUFzQixVQUFVLGFBQWE7QUFFdEUsaUJBQVcsWUFBWSxTQUFTLFlBQVk7QUFDMUMsWUFBSSxLQUFLLFdBQVcsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLFNBQVMsSUFBSSxHQUFHO0FBQzFELGVBQUssV0FBVyxLQUFLLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxlQUFlLFNBQVMsS0FBSyxHQUFHLGdCQUFnQixDQUFDO0FBQUEsUUFDN0c7QUFBQSxNQUNGO0FBRUEsaUJBQVcsVUFBVSxTQUFTLFNBQVM7QUFDckMsY0FBTSxlQUFlLEtBQUssUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsT0FBTyxRQUFRLEVBQUUsY0FBYyxPQUFPLFNBQVM7QUFDeEcsY0FBTSxxQkFBcUIsS0FBSyxRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLFNBQVMsUUFBUSxFQUFFLGdCQUFnQixPQUFPLFdBQVc7QUFDN0gsWUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQjtBQUN4QyxlQUFLLFFBQVEsS0FBSyxzQkFBc0IsRUFBRSxHQUFHLFFBQVEsZUFBZSxTQUFTLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztBQUFBLFFBQ3hHO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFTTyxTQUFTLHNCQUFzQixRQUFvQixTQUEwQztBQUNsRyxTQUFPLFFBQVEsU0FBUyxJQUNwQixTQUNBO0FBQUEsSUFDQSxHQUFHO0FBQUEsSUFDSCxZQUFZLE9BQU8sV0FBVyxJQUFJLENBQUMsT0FBTztBQUFBLE1BQ3hDLEdBQUc7QUFBQSxNQUNILE1BQU0scUJBQXFCLEVBQUUsTUFBTSxPQUFPO0FBQUEsSUFDNUMsRUFBRTtBQUFBLElBQ0YsWUFBWSxxQkFBcUIsT0FBTyxZQUFZLE9BQU87QUFBQSxJQUMzRCxXQUFXLHFCQUFxQixPQUFPLFdBQVcsT0FBTztBQUFBLElBQ3pELE1BQU0scUJBQXFCLE9BQU8sTUFBTSxPQUFPO0FBQUEsRUFDakQ7QUFDSjtBQVNPLFNBQVMscUJBQXFCLFVBQWtCLFNBQXNDO0FBQzNGLFNBQU8sUUFBUSxTQUFTLElBQ3BCLFdBQ0EsU0FBUyxXQUFXLDBDQUEwQyxDQUFDLFVBQVU7QUFDekUsV0FBTyxRQUFRLElBQUksS0FBSyxLQUFLO0FBQUEsRUFDL0IsQ0FBQztBQUNMOyIsIm5hbWVzIjpbXX0=
|