@mnaoumov/typescript-dev-toolkit 1.3.0 → 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.
Files changed (174) hide show
  1. package/assets/docs-site/components/ConstructorBlock.astro +16 -0
  2. package/assets/docs-site/components/ImportStatement.astro +12 -0
  3. package/assets/docs-site/components/MemberDetail.astro +101 -0
  4. package/assets/docs-site/components/MethodTable.astro +45 -0
  5. package/assets/docs-site/components/PropertyTable.astro +45 -0
  6. package/assets/docs-site/components/SiteTitle.astro +43 -0
  7. package/assets/docs-site/components/TypeSignature.astro +20 -0
  8. package/assets/docs-site/fonts/inter-latin-400-normal.ttf +0 -0
  9. package/assets/docs-site/fonts/inter-latin-700-normal.ttf +0 -0
  10. package/assets/docs-site/styles/global.css +221 -0
  11. package/dist/lib/cjs/build.cjs +1 -1
  12. package/dist/lib/cjs/build.d.cts +1 -1
  13. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +2 -2
  14. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +1 -1
  15. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +2 -2
  16. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +1 -1
  17. package/dist/lib/cjs/docs-site/api-doc-constants.cjs +171 -0
  18. package/dist/lib/cjs/docs-site/api-doc-constants.d.cts +18 -0
  19. package/dist/lib/cjs/docs-site/api-doc-jsdoc.cjs +414 -0
  20. package/dist/lib/cjs/docs-site/api-doc-jsdoc.d.cts +149 -0
  21. package/dist/lib/cjs/docs-site/api-doc-link-rendering.cjs +377 -0
  22. package/dist/lib/cjs/docs-site/api-doc-link-rendering.d.cts +185 -0
  23. package/dist/lib/cjs/docs-site/api-doc-package-sites.cjs +118 -0
  24. package/dist/lib/cjs/docs-site/api-doc-package-sites.d.cts +36 -0
  25. package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +561 -0
  26. package/dist/lib/cjs/docs-site/api-doc-page-generation.d.cts +159 -0
  27. package/dist/lib/cjs/docs-site/api-doc-route-segments.cjs +42 -0
  28. package/dist/lib/cjs/docs-site/api-doc-route-segments.d.cts +25 -0
  29. package/dist/lib/cjs/docs-site/api-doc-settings.cjs +47 -0
  30. package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +53 -0
  31. package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +288 -0
  32. package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +75 -0
  33. package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +281 -0
  34. package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +178 -0
  35. package/dist/lib/cjs/docs-site/api-doc-type-merging.cjs +157 -0
  36. package/dist/lib/cjs/docs-site/api-doc-type-merging.d.cts +51 -0
  37. package/dist/lib/cjs/docs-site/api-doc-types.cjs +22 -0
  38. package/dist/lib/cjs/docs-site/api-doc-types.d.cts +157 -0
  39. package/dist/lib/cjs/docs-site/api-docs.cjs +143 -0
  40. package/dist/lib/cjs/docs-site/api-docs.d.cts +34 -0
  41. package/dist/lib/cjs/docs-site/astro-config.cjs +169 -0
  42. package/dist/lib/cjs/docs-site/astro-config.d.cts +23 -0
  43. package/dist/lib/cjs/docs-site/docs-links.cjs +123 -0
  44. package/dist/lib/cjs/docs-site/docs-links.d.cts +32 -0
  45. package/dist/lib/cjs/docs-site/docs-site-assets.cjs +64 -0
  46. package/dist/lib/cjs/docs-site/docs-site-assets.d.cts +23 -0
  47. package/dist/lib/cjs/docs-site/docs-site-commands.cjs +72 -0
  48. package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +29 -0
  49. package/dist/lib/cjs/docs-site/docs-site-config.cjs +122 -0
  50. package/dist/lib/cjs/docs-site/docs-site-config.d.cts +162 -0
  51. package/dist/lib/cjs/docs-site/index.cjs +116 -0
  52. package/dist/lib/cjs/docs-site/index.d.cts +26 -0
  53. package/dist/lib/cjs/docs-site/link-check.cjs +197 -0
  54. package/dist/lib/cjs/docs-site/link-check.d.cts +163 -0
  55. package/dist/lib/cjs/docs-site/og-image-page.cjs +45 -0
  56. package/dist/lib/cjs/docs-site/og-image-page.d.cts +15 -0
  57. package/dist/lib/cjs/docs-site/og-image.cjs +326 -0
  58. package/dist/lib/cjs/docs-site/og-image.d.cts +70 -0
  59. package/dist/lib/cjs/docs-site/og-images.cjs +170 -0
  60. package/dist/lib/cjs/docs-site/og-images.d.cts +41 -0
  61. package/dist/lib/cjs/docs-site/route-data.cjs +47 -0
  62. package/dist/lib/cjs/docs-site/route-data.d.cts +14 -0
  63. package/dist/lib/cjs/docs-site/satteri-github-alerts.cjs +97 -0
  64. package/dist/lib/cjs/docs-site/satteri-github-alerts.d.cts +31 -0
  65. package/dist/lib/cjs/docs-site/satteri-relative-links.cjs +87 -0
  66. package/dist/lib/cjs/docs-site/satteri-relative-links.d.cts +29 -0
  67. package/dist/lib/cjs/docs-site/unrendered-alerts.cjs +51 -0
  68. package/dist/lib/cjs/docs-site/unrendered-alerts.d.cts +38 -0
  69. package/dist/lib/cjs/index.cjs +4 -1
  70. package/dist/lib/cjs/index.d.cts +1 -0
  71. package/dist/lib/cjs/library-build.cjs +1 -1
  72. package/dist/lib/cjs/library-build.d.cts +2 -2
  73. package/dist/lib/cjs/linters/eslint-config.cjs +17 -17
  74. package/dist/lib/cjs/linters/eslint-config.d.cts +1 -7
  75. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +2 -2
  76. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +5 -8
  77. package/dist/lib/cjs/linters/markdownlint.cjs +4 -1
  78. package/dist/lib/cjs/package-manager.cjs +2 -2
  79. package/dist/lib/esm/build.d.mts +1 -1
  80. package/dist/lib/esm/build.mjs +1 -1
  81. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +1 -1
  82. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +2 -2
  83. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +1 -1
  84. package/dist/lib/esm/commitlint-spellcheck-header.mjs +2 -2
  85. package/dist/lib/esm/docs-site/api-doc-constants.d.mts +18 -0
  86. package/dist/lib/esm/docs-site/api-doc-constants.mjs +143 -0
  87. package/dist/lib/esm/docs-site/api-doc-jsdoc.d.mts +149 -0
  88. package/dist/lib/esm/docs-site/api-doc-jsdoc.mjs +377 -0
  89. package/dist/lib/esm/docs-site/api-doc-link-rendering.d.mts +185 -0
  90. package/dist/lib/esm/docs-site/api-doc-link-rendering.mjs +356 -0
  91. package/dist/lib/esm/docs-site/api-doc-package-sites.d.mts +36 -0
  92. package/dist/lib/esm/docs-site/api-doc-package-sites.mjs +91 -0
  93. package/dist/lib/esm/docs-site/api-doc-page-generation.d.mts +159 -0
  94. package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +548 -0
  95. package/dist/lib/esm/docs-site/api-doc-route-segments.d.mts +25 -0
  96. package/dist/lib/esm/docs-site/api-doc-route-segments.mjs +17 -0
  97. package/dist/lib/esm/docs-site/api-doc-settings.d.mts +53 -0
  98. package/dist/lib/esm/docs-site/api-doc-settings.mjs +22 -0
  99. package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +75 -0
  100. package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +274 -0
  101. package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +178 -0
  102. package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +239 -0
  103. package/dist/lib/esm/docs-site/api-doc-type-merging.d.mts +51 -0
  104. package/dist/lib/esm/docs-site/api-doc-type-merging.mjs +129 -0
  105. package/dist/lib/esm/docs-site/api-doc-types.d.mts +157 -0
  106. package/dist/lib/esm/docs-site/api-doc-types.mjs +6 -0
  107. package/dist/lib/esm/docs-site/api-docs.d.mts +34 -0
  108. package/dist/lib/esm/docs-site/api-docs.mjs +139 -0
  109. package/dist/lib/esm/docs-site/astro-config.d.mts +23 -0
  110. package/dist/lib/esm/docs-site/astro-config.mjs +135 -0
  111. package/dist/lib/esm/docs-site/docs-links.d.mts +32 -0
  112. package/dist/lib/esm/docs-site/docs-links.mjs +113 -0
  113. package/dist/lib/esm/docs-site/docs-site-assets.d.mts +23 -0
  114. package/dist/lib/esm/docs-site/docs-site-assets.mjs +32 -0
  115. package/dist/lib/esm/docs-site/docs-site-commands.d.mts +29 -0
  116. package/dist/lib/esm/docs-site/docs-site-commands.mjs +46 -0
  117. package/dist/lib/esm/docs-site/docs-site-config.d.mts +162 -0
  118. package/dist/lib/esm/docs-site/docs-site-config.mjs +98 -0
  119. package/dist/lib/esm/docs-site/index.d.mts +26 -0
  120. package/dist/lib/esm/docs-site/index.mjs +58 -0
  121. package/dist/lib/esm/docs-site/link-check.d.mts +163 -0
  122. package/dist/lib/esm/docs-site/link-check.mjs +166 -0
  123. package/dist/lib/esm/docs-site/og-image-page.d.mts +15 -0
  124. package/dist/lib/esm/docs-site/og-image-page.mjs +21 -0
  125. package/dist/lib/esm/docs-site/og-image.d.mts +70 -0
  126. package/dist/lib/esm/docs-site/og-image.mjs +292 -0
  127. package/dist/lib/esm/docs-site/og-images.d.mts +41 -0
  128. package/dist/lib/esm/docs-site/og-images.mjs +156 -0
  129. package/dist/lib/esm/docs-site/route-data.d.mts +14 -0
  130. package/dist/lib/esm/docs-site/route-data.mjs +23 -0
  131. package/dist/lib/esm/docs-site/satteri-github-alerts.d.mts +31 -0
  132. package/dist/lib/esm/docs-site/satteri-github-alerts.mjs +72 -0
  133. package/dist/lib/esm/docs-site/satteri-relative-links.d.mts +29 -0
  134. package/dist/lib/esm/docs-site/satteri-relative-links.mjs +63 -0
  135. package/dist/lib/esm/docs-site/unrendered-alerts.d.mts +38 -0
  136. package/dist/lib/esm/docs-site/unrendered-alerts.mjs +26 -0
  137. package/dist/lib/esm/index.d.mts +1 -0
  138. package/dist/lib/esm/index.mjs +3 -1
  139. package/dist/lib/esm/library-build.d.mts +2 -2
  140. package/dist/lib/esm/library-build.mjs +1 -1
  141. package/dist/lib/esm/linters/eslint-config.d.mts +1 -7
  142. package/dist/lib/esm/linters/eslint-config.mjs +17 -17
  143. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +5 -8
  144. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +2 -2
  145. package/dist/lib/esm/linters/markdownlint.mjs +4 -1
  146. package/dist/lib/esm/package-manager.mjs +2 -2
  147. package/docs-site/api-doc-constants/package.json +6 -0
  148. package/docs-site/api-doc-jsdoc/package.json +6 -0
  149. package/docs-site/api-doc-link-rendering/package.json +6 -0
  150. package/docs-site/api-doc-package-sites/package.json +6 -0
  151. package/docs-site/api-doc-page-generation/package.json +6 -0
  152. package/docs-site/api-doc-route-segments/package.json +6 -0
  153. package/docs-site/api-doc-settings/package.json +6 -0
  154. package/docs-site/api-doc-source-processing/package.json +6 -0
  155. package/docs-site/api-doc-text-utils/package.json +6 -0
  156. package/docs-site/api-doc-type-merging/package.json +6 -0
  157. package/docs-site/api-doc-types/package.json +6 -0
  158. package/docs-site/api-docs/package.json +6 -0
  159. package/docs-site/astro-config/package.json +6 -0
  160. package/docs-site/docs-links/package.json +6 -0
  161. package/docs-site/docs-site-assets/package.json +6 -0
  162. package/docs-site/docs-site-commands/package.json +6 -0
  163. package/docs-site/docs-site-config/package.json +6 -0
  164. package/docs-site/index/package.json +6 -0
  165. package/docs-site/link-check/package.json +6 -0
  166. package/docs-site/og-image/package.json +6 -0
  167. package/docs-site/og-image-page/package.json +6 -0
  168. package/docs-site/og-images/package.json +6 -0
  169. package/docs-site/package.json +6 -0
  170. package/docs-site/route-data/package.json +6 -0
  171. package/docs-site/satteri-github-alerts/package.json +6 -0
  172. package/docs-site/satteri-relative-links/package.json +6 -0
  173. package/docs-site/unrendered-alerts/package.json +6 -0
  174. package/package.json +74 -4
@@ -0,0 +1,25 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The slug rules for a type's page: the lowercased segment its file is written under, and the case-preserved one its
6
+ * URL uses. Every site is generated with these rules, so a link into another package's site is built with them too.
7
+ */
8
+ /**
9
+ * Lowercase a path segment for use in an ON-DISK file/dir name. The routes themselves are case-preserved via an
10
+ * explicit `slug:` frontmatter (see {@link toRouteSegmentPreserveCase}), but the files stay lowercase (and numerically
11
+ * disambiguated) so two type names differing only by case cannot collide on Windows' case-insensitive filesystem.
12
+ *
13
+ * @param segment - The segment.
14
+ * @returns The lowercased segment.
15
+ */
16
+ export declare function toRouteSegment(segment: string): string;
17
+ /**
18
+ * Slugify a path segment (type name) for a URL/route while PRESERVING case: collapse runs of non-alphanumeric
19
+ * characters to `-` and trim. Used for the case-preserved `slug:` frontmatter and the internal links that point at it,
20
+ * so URLs read as pretty PascalCase (e.g. `/api/.../TypeName/`).
21
+ *
22
+ * @param segment - The segment.
23
+ * @returns The slug, or `unnamed` when nothing alphanumeric is left.
24
+ */
25
+ export declare function toRouteSegmentPreserveCase(segment: string): string;
@@ -0,0 +1,17 @@
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
+
6
+ function toRouteSegment(segment) {
7
+ return segment.toLowerCase();
8
+ }
9
+ function toRouteSegmentPreserveCase(segment) {
10
+ const cleaned = segment.replaceAll(/[^a-zA-Z0-9]+/g, "-").replaceAll(/^-|-$/g, "");
11
+ return cleaned || "unnamed";
12
+ }
13
+ export {
14
+ toRouteSegment,
15
+ toRouteSegmentPreserveCase
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXJvdXRlLXNlZ21lbnRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHNsdWcgcnVsZXMgZm9yIGEgdHlwZSdzIHBhZ2U6IHRoZSBsb3dlcmNhc2VkIHNlZ21lbnQgaXRzIGZpbGUgaXMgd3JpdHRlbiB1bmRlciwgYW5kIHRoZSBjYXNlLXByZXNlcnZlZCBvbmUgaXRzXG4gKiBVUkwgdXNlcy4gRXZlcnkgc2l0ZSBpcyBnZW5lcmF0ZWQgd2l0aCB0aGVzZSBydWxlcywgc28gYSBsaW5rIGludG8gYW5vdGhlciBwYWNrYWdlJ3Mgc2l0ZSBpcyBidWlsdCB3aXRoIHRoZW0gdG9vLlxuICovXG5cbi8qKlxuICogTG93ZXJjYXNlIGEgcGF0aCBzZWdtZW50IGZvciB1c2UgaW4gYW4gT04tRElTSyBmaWxlL2RpciBuYW1lLiBUaGUgcm91dGVzIHRoZW1zZWx2ZXMgYXJlIGNhc2UtcHJlc2VydmVkIHZpYSBhblxuICogZXhwbGljaXQgYHNsdWc6YCBmcm9udG1hdHRlciAoc2VlIHtAbGluayB0b1JvdXRlU2VnbWVudFByZXNlcnZlQ2FzZX0pLCBidXQgdGhlIGZpbGVzIHN0YXkgbG93ZXJjYXNlIChhbmQgbnVtZXJpY2FsbHlcbiAqIGRpc2FtYmlndWF0ZWQpIHNvIHR3byB0eXBlIG5hbWVzIGRpZmZlcmluZyBvbmx5IGJ5IGNhc2UgY2Fubm90IGNvbGxpZGUgb24gV2luZG93cycgY2FzZS1pbnNlbnNpdGl2ZSBmaWxlc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBzZWdtZW50IC0gVGhlIHNlZ21lbnQuXG4gKiBAcmV0dXJucyBUaGUgbG93ZXJjYXNlZCBzZWdtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Sb3V0ZVNlZ21lbnQoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlZ21lbnQudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBTbHVnaWZ5IGEgcGF0aCBzZWdtZW50ICh0eXBlIG5hbWUpIGZvciBhIFVSTC9yb3V0ZSB3aGlsZSBQUkVTRVJWSU5HIGNhc2U6IGNvbGxhcHNlIHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpY1xuICogY2hhcmFjdGVycyB0byBgLWAgYW5kIHRyaW0uIFVzZWQgZm9yIHRoZSBjYXNlLXByZXNlcnZlZCBgc2x1ZzpgIGZyb250bWF0dGVyIGFuZCB0aGUgaW50ZXJuYWwgbGlua3MgdGhhdCBwb2ludCBhdCBpdCxcbiAqIHNvIFVSTHMgcmVhZCBhcyBwcmV0dHkgUGFzY2FsQ2FzZSAoZS5nLiBgL2FwaS8uLi4vVHlwZU5hbWUvYCkuXG4gKlxuICogQHBhcmFtIHNlZ21lbnQgLSBUaGUgc2VnbWVudC5cbiAqIEByZXR1cm5zIFRoZSBzbHVnLCBvciBgdW5uYW1lZGAgd2hlbiBub3RoaW5nIGFscGhhbnVtZXJpYyBpcyBsZWZ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Sb3V0ZVNlZ21lbnRQcmVzZXJ2ZUNhc2Uoc2VnbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2xlYW5lZCA9IHNlZ21lbnQucmVwbGFjZUFsbCgvW15hLXpBLVowLTldKy9nLCAnLScpLnJlcGxhY2VBbGwoL14tfC0kL2csICcnKTtcbiAgcmV0dXJuIGNsZWFuZWQgfHwgJ3VubmFtZWQnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFlTyxTQUFTLGVBQWUsU0FBeUI7QUFDdEQsU0FBTyxRQUFRLFlBQVk7QUFDN0I7QUFVTyxTQUFTLDJCQUEyQixTQUF5QjtBQUNsRSxRQUFNLFVBQVUsUUFBUSxXQUFXLGtCQUFrQixHQUFHLEVBQUUsV0FBVyxVQUFVLEVBQUU7QUFDakYsU0FBTyxXQUFXO0FBQ3BCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,53 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The per-site settings of the API documentation generator: where it writes, which package it documents, the base
6
+ * path its links carry, and the external links a site adds to the generic ones.
7
+ */
8
+ /**
9
+ * The settings the API documentation generator reads while it renders pages and links.
10
+ */
11
+ export interface ApiDocSettings {
12
+ /**
13
+ * The site's base path, with a leading slash and no trailing one, e.g. `/typescript-lib`. Every in-content link
14
+ * the generator emits starts with it.
15
+ */
16
+ readonly basePath: string;
17
+ /**
18
+ * Type names mapped to the URL their references link to, for types neither this package nor a {@link packageSites}
19
+ * package declares, e.g. an ecosystem's own API reference. Consulted before the generic TypeScript, JavaScript and
20
+ * Web API links, so an entry here wins over them.
21
+ */
22
+ readonly externalTypeLinks: ReadonlyMap<string, string>;
23
+ /**
24
+ * The folder the generated API pages are written to, normally `<docs>/src/content/docs/api`.
25
+ */
26
+ readonly outputDirectory: string;
27
+ /**
28
+ * The documented package's name, e.g. `@mnaoumov/typescript-lib`. Import statements are built from it.
29
+ */
30
+ readonly packageName: string;
31
+ /**
32
+ * Package names mapped to the root URL of their documentation site, with a trailing slash. A type whose
33
+ * declaration resolves into one of these packages links to its page on that site.
34
+ */
35
+ readonly packageSites: ReadonlyMap<string, string>;
36
+ /**
37
+ * The JSON file the generated Starlight sidebar is written to.
38
+ */
39
+ readonly sidebarFile: string;
40
+ }
41
+ /**
42
+ * Sets the settings every later page and link reads.
43
+ *
44
+ * @param settings - The settings.
45
+ */
46
+ export declare function configureApiDocs(settings: ApiDocSettings): void;
47
+ /**
48
+ * Gets the settings set by {@link configureApiDocs}.
49
+ *
50
+ * @returns The settings.
51
+ * @throws If {@link configureApiDocs} has not been called.
52
+ */
53
+ export declare function getApiDocSettings(): ApiDocSettings;
@@ -0,0 +1,22 @@
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
+
6
+ const moduleState = {
7
+ settings: void 0
8
+ };
9
+ function configureApiDocs(settings) {
10
+ moduleState.settings = settings;
11
+ }
12
+ function getApiDocSettings() {
13
+ if (moduleState.settings === void 0) {
14
+ throw new Error("The API documentation generator is not configured: call configureApiDocs() first.");
15
+ }
16
+ return moduleState.settings;
17
+ }
18
+ export {
19
+ configureApiDocs,
20
+ getApiDocSettings
21
+ };
22
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1zaXRlIHNldHRpbmdzIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3I6IHdoZXJlIGl0IHdyaXRlcywgd2hpY2ggcGFja2FnZSBpdCBkb2N1bWVudHMsIHRoZSBiYXNlXG4gKiBwYXRoIGl0cyBsaW5rcyBjYXJyeSwgYW5kIHRoZSBleHRlcm5hbCBsaW5rcyBhIHNpdGUgYWRkcyB0byB0aGUgZ2VuZXJpYyBvbmVzLlxuICovXG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgcmVhZHMgd2hpbGUgaXQgcmVuZGVycyBwYWdlcyBhbmQgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRG9jU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHNpdGUncyBiYXNlIHBhdGgsIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBvbmUsIGUuZy4gYC90eXBlc2NyaXB0LWxpYmAuIEV2ZXJ5IGluLWNvbnRlbnQgbGlua1xuICAgKiB0aGUgZ2VuZXJhdG9yIGVtaXRzIHN0YXJ0cyB3aXRoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVHlwZSBuYW1lcyBtYXBwZWQgdG8gdGhlIFVSTCB0aGVpciByZWZlcmVuY2VzIGxpbmsgdG8sIGZvciB0eXBlcyBuZWl0aGVyIHRoaXMgcGFja2FnZSBub3IgYSB7QGxpbmsgcGFja2FnZVNpdGVzfVxuICAgKiBwYWNrYWdlIGRlY2xhcmVzLCBlLmcuIGFuIGVjb3N5c3RlbSdzIG93biBBUEkgcmVmZXJlbmNlLiBDb25zdWx0ZWQgYmVmb3JlIHRoZSBnZW5lcmljIFR5cGVTY3JpcHQsIEphdmFTY3JpcHQgYW5kXG4gICAqIFdlYiBBUEkgbGlua3MsIHNvIGFuIGVudHJ5IGhlcmUgd2lucyBvdmVyIHRoZW0uXG4gICAqL1xuICByZWFkb25seSBleHRlcm5hbFR5cGVMaW5rczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBnZW5lcmF0ZWQgQVBJIHBhZ2VzIGFyZSB3cml0dGVuIHRvLCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3MvYXBpYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnRlZCBwYWNrYWdlJ3MgbmFtZSwgZS5nLiBgQG1uYW91bW92L3R5cGVzY3JpcHQtbGliYC4gSW1wb3J0IHN0YXRlbWVudHMgYXJlIGJ1aWx0IGZyb20gaXQuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYWNrYWdlIG5hbWVzIG1hcHBlZCB0byB0aGUgcm9vdCBVUkwgb2YgdGhlaXIgZG9jdW1lbnRhdGlvbiBzaXRlLCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guIEEgdHlwZSB3aG9zZVxuICAgKiBkZWNsYXJhdGlvbiByZXNvbHZlcyBpbnRvIG9uZSBvZiB0aGVzZSBwYWNrYWdlcyBsaW5rcyB0byBpdHMgcGFnZSBvbiB0aGF0IHNpdGUuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlU2l0ZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogVGhlIEpTT04gZmlsZSB0aGUgZ2VuZXJhdGVkIFN0YXJsaWdodCBzaWRlYmFyIGlzIHdyaXR0ZW4gdG8uXG4gICAqL1xuICByZWFkb25seSBzaWRlYmFyRmlsZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGUge1xuICBzZXR0aW5nczogQXBpRG9jU2V0dGluZ3MgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IG1vZHVsZVN0YXRlOiBNb2R1bGVTdGF0ZSA9IHtcbiAgc2V0dGluZ3M6IHVuZGVmaW5lZFxufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzZXR0aW5ncyBldmVyeSBsYXRlciBwYWdlIGFuZCBsaW5rIHJlYWRzLlxuICpcbiAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUFwaURvY3Moc2V0dGluZ3M6IEFwaURvY1NldHRpbmdzKTogdm9pZCB7XG4gIG1vZHVsZVN0YXRlLnNldHRpbmdzID0gc2V0dGluZ3M7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2V0dGluZ3Mgc2V0IGJ5IHtAbGluayBjb25maWd1cmVBcGlEb2NzfS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2V0dGluZ3MuXG4gKiBAdGhyb3dzIElmIHtAbGluayBjb25maWd1cmVBcGlEb2NzfSBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRG9jU2V0dGluZ3MoKTogQXBpRG9jU2V0dGluZ3Mge1xuICBpZiAobW9kdWxlU3RhdGUuc2V0dGluZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFQSSBkb2N1bWVudGF0aW9uIGdlbmVyYXRvciBpcyBub3QgY29uZmlndXJlZDogY2FsbCBjb25maWd1cmVBcGlEb2NzKCkgZmlyc3QuJyk7XG4gIH1cblxuICByZXR1cm4gbW9kdWxlU3RhdGUuc2V0dGluZ3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQWtEQSxNQUFNLGNBQTJCO0FBQUEsRUFDL0IsVUFBVTtBQUNaO0FBT08sU0FBUyxpQkFBaUIsVUFBZ0M7QUFDL0QsY0FBWSxXQUFXO0FBQ3pCO0FBUU8sU0FBUyxvQkFBb0M7QUFDbEQsTUFBSSxZQUFZLGFBQWEsUUFBVztBQUN0QyxVQUFNLElBQUksTUFBTSxtRkFBbUY7QUFBQSxFQUNyRztBQUVBLFNBQU8sWUFBWTtBQUNyQjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,75 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Source discovery + extraction: walks `src`, filters to documentable entry files, and turns each
6
+ * file's exported declarations into `TypeInfo` entries keyed by a qualified `${namespace}#${name}`.
7
+ */
8
+ import type { SourceFile } from 'ts-morph';
9
+ import type { TypeInfo } from './api-doc-types.mjs';
10
+ /**
11
+ * Collect top-level exported functions.
12
+ *
13
+ * @param src - The source file.
14
+ * @param types - The documented types, keyed by qualified id.
15
+ * @param namespace - The type's namespace.
16
+ */
17
+ export declare function collectFunctions(src: SourceFile, types: Map<string, TypeInfo>, namespace: string): void;
18
+ /**
19
+ * Records where every symbol a source file imports is declared, so a type another documented package declares
20
+ * links to that package's site.
21
+ *
22
+ * @param src - The source file.
23
+ */
24
+ export declare function collectPackageDeclarations(src: SourceFile): void;
25
+ /**
26
+ * Collect top-level exported variable declarations (e.g. `export const EMPTY = ''`).
27
+ *
28
+ * @param src - The source file.
29
+ * @param types - The documented types, keyed by qualified id.
30
+ * @param namespace - The type's namespace.
31
+ */
32
+ export declare function collectVariables(src: SourceFile, types: Map<string, TypeInfo>, namespace: string): void;
33
+ /**
34
+ * Compute a hash of every input that decides the generated pages: the generator's own modules, the settings and
35
+ * the entry source files. An unchanged hash lets a run skip the generation.
36
+ *
37
+ * @param entryFiles - The entry source files.
38
+ * @param generatorDirectory - The folder holding the generator's modules.
39
+ * @returns The hash, as hex.
40
+ */
41
+ export declare function computeCacheHash(entryFiles: string[], generatorDirectory: string): string;
42
+ /**
43
+ * Compute the namespace (POSIX path relative to `src`, no extension) for a source file.
44
+ *
45
+ * @param srcDirectory - The source folder the namespace is relative to.
46
+ * @param filePath - The file's path.
47
+ * @returns The namespace.
48
+ */
49
+ export declare function computeNamespace(srcDirectory: string, filePath: string): string;
50
+ /**
51
+ * Recursively find all documentable `*.ts` entry files under `src`.
52
+ *
53
+ * Excludes: `*.test.ts` (incl. `*.browser.test.ts` / `*.integration.test.ts`), `*.d.ts`,
54
+ * `index.ts`, `__merged.ts`, `setup.ts`, `*-setup.ts`, and any subtree under a `@types`,
55
+ * `styles`, or `test-helpers` directory.
56
+ *
57
+ * @param directory - The folder to search.
58
+ * @returns The entry files' paths.
59
+ */
60
+ export declare function findEntryFiles(directory: string): string[];
61
+ /**
62
+ * Collects a source file's exported type aliases, enums, interfaces and classes.
63
+ *
64
+ * @param src - The source file.
65
+ * @param types - The documented types, keyed by qualified id.
66
+ * @param namespace - The type's namespace.
67
+ */
68
+ export declare function processSourceFile(src: SourceFile, types: Map<string, TypeInfo>, namespace: string): void;
69
+ /**
70
+ * Register all type parameter names so renderTypeWithLinks won't hyperlink them.
71
+ * Skip names that are also known types — those should still be linkable.
72
+ *
73
+ * @param types - The documented types, keyed by qualified id.
74
+ */
75
+ export declare function registerGenericTypeParams(types: Map<string, TypeInfo>): void;
@@ -0,0 +1,274 @@
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 { createHash } from "node:crypto";
40
+ import {
41
+ readdirSync,
42
+ readFileSync
43
+ } from "node:fs";
44
+ import {
45
+ join,
46
+ relative
47
+ } from "node:path";
48
+ import { Node } from "ts-morph";
49
+ import { GENERIC_TYPE_PARAMS } from "./api-doc-constants.mjs";
50
+ import {
51
+ extractClassInfo,
52
+ extractEnumInfo,
53
+ extractInterfaceInfo,
54
+ extractTypeAliasInfo,
55
+ getDescription,
56
+ getExamples,
57
+ getParameterDescriptions,
58
+ getRemarks,
59
+ getReturnDescription,
60
+ getSince
61
+ } from "./api-doc-jsdoc.mjs";
62
+ import { registerPackageDeclaration } from "./api-doc-package-sites.mjs";
63
+ import { getApiDocSettings } from "./api-doc-settings.mjs";
64
+ import { simplifyType } from "./api-doc-text-utils.mjs";
65
+ const EXCLUDED_DIR_SEGMENTS = /* @__PURE__ */ new Set(["@types", "styles", "test-helpers"]);
66
+ function collectFunctions(src, types, namespace) {
67
+ for (const $function of src.getFunctions()) {
68
+ if (!$function.isExported()) {
69
+ continue;
70
+ }
71
+ const name = $function.getName();
72
+ if (!name) {
73
+ continue;
74
+ }
75
+ const key = qualifiedKey(namespace, name);
76
+ if (types.has(key)) {
77
+ continue;
78
+ }
79
+ const parameterDescriptions = getParameterDescriptions($function);
80
+ const params = $function.getParameters().map((p) => ({
81
+ description: parameterDescriptions.get(p.getName()) ?? "",
82
+ name: p.getName(),
83
+ type: simplifyType(p.getType().getText())
84
+ }));
85
+ const parameterString = params.map((p) => `${p.name}: ${p.type}`).join(", ");
86
+ const returnType = simplifyType($function.getReturnType().getText());
87
+ const signature = `${name}(${parameterString})`;
88
+ types.set(key, {
89
+ baseTypes: [],
90
+ description: getDescription($function),
91
+ enumMembers: [],
92
+ examples: getExamples($function),
93
+ implementsTypes: [],
94
+ kind: "function",
95
+ methods: [{
96
+ description: getDescription($function),
97
+ examples: getExamples($function),
98
+ inheritedFrom: "",
99
+ isStatic: false,
100
+ name,
101
+ overloadKey: name,
102
+ parameters: params,
103
+ remarks: getRemarks($function),
104
+ returnDescription: getReturnDescription($function),
105
+ returnType,
106
+ signature,
107
+ since: getSince($function),
108
+ type: ""
109
+ }],
110
+ name,
111
+ namespace,
112
+ properties: [],
113
+ remarks: getRemarks($function),
114
+ typeParameters: $function.getTypeParameters().map((tp) => tp.getText())
115
+ });
116
+ }
117
+ }
118
+ function collectPackageDeclarations(src) {
119
+ for (const importDeclaration of src.getImportDeclarations()) {
120
+ for (const namedImport of importDeclaration.getNamedImports()) {
121
+ const localNameNode = namedImport.getAliasNode() ?? namedImport.getNameNode();
122
+ const declarations = localNameNode.getSymbolOrThrow().getAliasedSymbolOrThrow().getDeclarations();
123
+ for (const declaration of declarations) {
124
+ if (isTypeDeclaration(declaration)) {
125
+ registerPackageDeclaration(namedImport.getName(), declaration.getSourceFile().getFilePath());
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ function collectVariables(src, types, namespace) {
132
+ for (const variableStatement of src.getVariableStatements()) {
133
+ if (!variableStatement.isExported()) {
134
+ continue;
135
+ }
136
+ const declarationKind = variableStatement.getDeclarationKind();
137
+ for (const declaration of variableStatement.getDeclarations()) {
138
+ const name = declaration.getName();
139
+ const key = qualifiedKey(namespace, name);
140
+ if (types.has(key)) {
141
+ continue;
142
+ }
143
+ types.set(key, {
144
+ baseTypes: [],
145
+ description: getDescription(variableStatement),
146
+ enumMembers: [],
147
+ examples: getExamples(variableStatement),
148
+ implementsTypes: [],
149
+ kind: "variable",
150
+ methods: [],
151
+ name,
152
+ namespace,
153
+ properties: [],
154
+ remarks: getRemarks(variableStatement),
155
+ typeParameters: [],
156
+ variableKeyword: declarationKind,
157
+ variableType: simplifyType(declaration.getType().getText())
158
+ });
159
+ }
160
+ }
161
+ }
162
+ function computeCacheHash(entryFiles, generatorDirectory) {
163
+ const hash = createHash("sha256");
164
+ const generatorFiles = readdirSync(generatorDirectory).filter((name) => !name.endsWith(".test.ts")).sort();
165
+ for (const generatorFile of generatorFiles) {
166
+ hash.update(generatorFile);
167
+ hash.update(readFileSync(join(generatorDirectory, generatorFile), "utf-8"));
168
+ }
169
+ const settings = getApiDocSettings();
170
+ hash.update(JSON.stringify({
171
+ ...settings,
172
+ externalTypeLinks: [...settings.externalTypeLinks],
173
+ packageSites: [...settings.packageSites]
174
+ }));
175
+ for (const filePath of [...entryFiles].sort()) {
176
+ hash.update(filePath);
177
+ hash.update(readFileSync(filePath, "utf-8"));
178
+ }
179
+ return hash.digest("hex");
180
+ }
181
+ function computeNamespace(srcDirectory, filePath) {
182
+ return relative(srcDirectory, filePath).replaceAll("\\", "/").replace(/\.ts$/, "");
183
+ }
184
+ function findEntryFiles(directory) {
185
+ const results = [];
186
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
187
+ const fullPath = join(directory, entry.name);
188
+ if (entry.isDirectory()) {
189
+ if (EXCLUDED_DIR_SEGMENTS.has(entry.name)) {
190
+ continue;
191
+ }
192
+ results.push(...findEntryFiles(fullPath));
193
+ } else if (isEntryFile(entry.name)) {
194
+ results.push(fullPath);
195
+ }
196
+ }
197
+ return results;
198
+ }
199
+ function processSourceFile(src, types, namespace) {
200
+ for (const alias of src.getTypeAliases()) {
201
+ if (!alias.isExported()) {
202
+ continue;
203
+ }
204
+ const key = qualifiedKey(namespace, alias.getName());
205
+ if (!types.has(key)) {
206
+ types.set(key, extractTypeAliasInfo(alias, namespace));
207
+ }
208
+ }
209
+ for (const enumDeclaration of src.getEnums()) {
210
+ if (!enumDeclaration.isExported()) {
211
+ continue;
212
+ }
213
+ const key = qualifiedKey(namespace, enumDeclaration.getName());
214
+ if (!types.has(key)) {
215
+ types.set(key, extractEnumInfo(enumDeclaration, namespace));
216
+ }
217
+ }
218
+ for (const iface of src.getInterfaces()) {
219
+ if (!iface.isExported()) {
220
+ continue;
221
+ }
222
+ const key = qualifiedKey(namespace, iface.getName());
223
+ if (!types.has(key)) {
224
+ types.set(key, extractInterfaceInfo(iface, namespace));
225
+ }
226
+ }
227
+ for (const cls of src.getClasses()) {
228
+ if (!cls.isExported()) {
229
+ continue;
230
+ }
231
+ const name = cls.getName();
232
+ if (!name) {
233
+ continue;
234
+ }
235
+ const key = qualifiedKey(namespace, name);
236
+ if (!types.has(key)) {
237
+ types.set(key, extractClassInfo(cls, namespace));
238
+ }
239
+ }
240
+ }
241
+ function registerGenericTypeParams(types) {
242
+ const knownNames = /* @__PURE__ */ new Set();
243
+ for (const [, info] of types) {
244
+ knownNames.add(info.name);
245
+ }
246
+ for (const [, info] of types) {
247
+ for (const tp of info.typeParameters) {
248
+ const bareParameter = tp.replace(/\s+extends\s+.*$/, "");
249
+ if (!knownNames.has(bareParameter)) {
250
+ GENERIC_TYPE_PARAMS.add(bareParameter);
251
+ }
252
+ }
253
+ }
254
+ }
255
+ function isEntryFile(name) {
256
+ return !(!name.endsWith(".ts") || name.endsWith(".d.ts") || ["__merged.ts", "index.ts", "setup.ts"].includes(name) || name.endsWith("-setup.ts") || name.endsWith(".test.ts"));
257
+ }
258
+ function isTypeDeclaration(declaration) {
259
+ return Node.isClassDeclaration(declaration) || Node.isInterfaceDeclaration(declaration) || Node.isTypeAliasDeclaration(declaration) || Node.isEnumDeclaration(declaration);
260
+ }
261
+ function qualifiedKey(namespace, name) {
262
+ return `${namespace}#${name}`;
263
+ }
264
+ export {
265
+ collectFunctions,
266
+ collectPackageDeclarations,
267
+ collectVariables,
268
+ computeCacheHash,
269
+ computeNamespace,
270
+ findEntryFiles,
271
+ processSourceFile,
272
+ registerGenericTypeParams
273
+ };
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1zb3VyY2UtcHJvY2Vzc2luZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU291cmNlIGRpc2NvdmVyeSArIGV4dHJhY3Rpb246IHdhbGtzIGBzcmNgLCBmaWx0ZXJzIHRvIGRvY3VtZW50YWJsZSBlbnRyeSBmaWxlcywgYW5kIHR1cm5zIGVhY2hcbiAqIGZpbGUncyBleHBvcnRlZCBkZWNsYXJhdGlvbnMgaW50byBgVHlwZUluZm9gIGVudHJpZXMga2V5ZWQgYnkgYSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNvdXJjZUZpbGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge1xuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB0eXBlIHsgVHlwZUluZm8gfSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBHRU5FUklDX1RZUEVfUEFSQU1TIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBleHRyYWN0Q2xhc3NJbmZvLFxuICBleHRyYWN0RW51bUluZm8sXG4gIGV4dHJhY3RJbnRlcmZhY2VJbmZvLFxuICBleHRyYWN0VHlwZUFsaWFzSW5mbyxcbiAgZ2V0RGVzY3JpcHRpb24sXG4gIGdldEV4YW1wbGVzLFxuICBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMsXG4gIGdldFJlbWFya3MsXG4gIGdldFJldHVybkRlc2NyaXB0aW9uLFxuICBnZXRTaW5jZVxufSBmcm9tICcuL2FwaS1kb2MtanNkb2MudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJQYWNrYWdlRGVjbGFyYXRpb24gfSBmcm9tICcuL2FwaS1kb2MtcGFja2FnZS1zaXRlcy50cyc7XG5pbXBvcnQgeyBnZXRBcGlEb2NTZXR0aW5ncyB9IGZyb20gJy4vYXBpLWRvYy1zZXR0aW5ncy50cyc7XG5pbXBvcnQgeyBzaW1wbGlmeVR5cGUgfSBmcm9tICcuL2FwaS1kb2MtdGV4dC11dGlscy50cyc7XG5cbi8qKlxuRGlyZWN0b3J5IG5hbWVzIHdob3NlIGVudGlyZSBzdWJ0cmVlIGlzIGV4Y2x1ZGVkIGZyb20gZG9jdW1lbnRhdGlvbi5cbiAqL1xuY29uc3QgRVhDTFVERURfRElSX1NFR01FTlRTID0gbmV3IFNldChbJ0B0eXBlcycsICdzdHlsZXMnLCAndGVzdC1oZWxwZXJzJ10pO1xuXG4vKipcbiAqIENvbGxlY3QgdG9wLWxldmVsIGV4cG9ydGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RGdW5jdGlvbnMoc3JjOiBTb3VyY2VGaWxlLCB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lc3BhY2U6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0ICRmdW5jdGlvbiBvZiBzcmMuZ2V0RnVuY3Rpb25zKCkpIHtcbiAgICBpZiAoISRmdW5jdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gJGZ1bmN0aW9uLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAodHlwZXMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoJGZ1bmN0aW9uKTtcbiAgICBjb25zdCBwYXJhbXMgPSAkZnVuY3Rpb24uZ2V0UGFyYW1ldGVycygpLm1hcCgocCkgPT4gKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuZ2V0KHAuZ2V0TmFtZSgpKSA/PyAnJyxcbiAgICAgIG5hbWU6IHAuZ2V0TmFtZSgpLFxuICAgICAgdHlwZTogc2ltcGxpZnlUeXBlKHAuZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICB9KSk7XG4gICAgY29uc3QgcGFyYW1ldGVyU3RyaW5nID0gcGFyYW1zLm1hcCgocCkgPT4gYCR7cC5uYW1lfTogJHtwLnR5cGV9YCkuam9pbignLCAnKTtcbiAgICBjb25zdCByZXR1cm5UeXBlID0gc2ltcGxpZnlUeXBlKCRmdW5jdGlvbi5nZXRSZXR1cm5UeXBlKCkuZ2V0VGV4dCgpKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBgJHtuYW1lfSgke3BhcmFtZXRlclN0cmluZ30pYDtcbiAgICB0eXBlcy5zZXQoa2V5LCB7XG4gICAgICBiYXNlVHlwZXM6IFtdLFxuICAgICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICBlbnVtTWVtYmVyczogW10sXG4gICAgICBleGFtcGxlczogZ2V0RXhhbXBsZXMoJGZ1bmN0aW9uKSxcbiAgICAgIGltcGxlbWVudHNUeXBlczogW10sXG4gICAgICBraW5kOiAnZnVuY3Rpb24nLFxuICAgICAgbWV0aG9kczogW3tcbiAgICAgICAgZGVzY3JpcHRpb246IGdldERlc2NyaXB0aW9uKCRmdW5jdGlvbiksXG4gICAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcygkZnVuY3Rpb24pLFxuICAgICAgICBpbmhlcml0ZWRGcm9tOiAnJyxcbiAgICAgICAgaXNTdGF0aWM6IGZhbHNlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBvdmVybG9hZEtleTogbmFtZSxcbiAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKCRmdW5jdGlvbiksXG4gICAgICAgIHJldHVybkRlc2NyaXB0aW9uOiBnZXRSZXR1cm5EZXNjcmlwdGlvbigkZnVuY3Rpb24pLFxuICAgICAgICByZXR1cm5UeXBlLFxuICAgICAgICBzaWduYXR1cmUsXG4gICAgICAgIHNpbmNlOiBnZXRTaW5jZSgkZnVuY3Rpb24pLFxuICAgICAgICB0eXBlOiAnJ1xuICAgICAgfV0sXG4gICAgICBuYW1lLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKCRmdW5jdGlvbiksXG4gICAgICB0eXBlUGFyYW1ldGVyczogJGZ1bmN0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKCkubWFwKCh0cCkgPT4gdHAuZ2V0VGV4dCgpKVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVjb3JkcyB3aGVyZSBldmVyeSBzeW1ib2wgYSBzb3VyY2UgZmlsZSBpbXBvcnRzIGlzIGRlY2xhcmVkLCBzbyBhIHR5cGUgYW5vdGhlciBkb2N1bWVudGVkIHBhY2thZ2UgZGVjbGFyZXNcbiAqIGxpbmtzIHRvIHRoYXQgcGFja2FnZSdzIHNpdGUuXG4gKlxuICogQHBhcmFtIHNyYyAtIFRoZSBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RQYWNrYWdlRGVjbGFyYXRpb25zKHNyYzogU291cmNlRmlsZSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGltcG9ydERlY2xhcmF0aW9uIG9mIHNyYy5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKSkge1xuICAgIGZvciAoY29uc3QgbmFtZWRJbXBvcnQgb2YgaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRJbXBvcnRzKCkpIHtcbiAgICAgIC8vIEFuIHVucmVzb2x2ZWQgaW1wb3J0IGFsaWFzZXMgdGhlIGNoZWNrZXIncyB1bmtub3duIHN5bWJvbCwgd2hpY2ggaGFzIG5vIGRlY2xhcmF0aW9ucy5cbiAgICAgIC8vIEEgcmVuYW1lZCBpbXBvcnQgY2FycmllcyBpdHMgc3ltYm9sIG9uIHRoZSBsb2NhbCBuYW1lLlxuICAgICAgY29uc3QgbG9jYWxOYW1lTm9kZSA9IG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpID8/IG5hbWVkSW1wb3J0LmdldE5hbWVOb2RlKCk7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBsb2NhbE5hbWVOb2RlLmdldFN5bWJvbE9yVGhyb3coKS5nZXRBbGlhc2VkU3ltYm9sT3JUaHJvdygpLmdldERlY2xhcmF0aW9ucygpO1xuICAgICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgLy8gT25seSBhIHR5cGUgaXMgbGlua2VkIGZyb20gdHlwZSB0ZXh0OyBhIGZ1bmN0aW9uJ3MgbmFtZSBhbHNvIG1hdGNoZXMgd29yZHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZXMgdG8gaXQuXG4gICAgICAgIGlmIChpc1R5cGVEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICByZWdpc3RlclBhY2thZ2VEZWNsYXJhdGlvbihuYW1lZEltcG9ydC5nZXROYW1lKCksIGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKS5nZXRGaWxlUGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgdG9wLWxldmVsIGV4cG9ydGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAoZS5nLiBgZXhwb3J0IGNvbnN0IEVNUFRZID0gJydgKS5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RWYXJpYWJsZXMoc3JjOiBTb3VyY2VGaWxlLCB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LCBuYW1lc3BhY2U6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHZhcmlhYmxlU3RhdGVtZW50IG9mIHNyYy5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKSkge1xuICAgIGlmICghdmFyaWFibGVTdGF0ZW1lbnQuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb25LaW5kID0gdmFyaWFibGVTdGF0ZW1lbnQuZ2V0RGVjbGFyYXRpb25LaW5kKCk7XG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZVN0YXRlbWVudC5nZXREZWNsYXJhdGlvbnMoKSkge1xuICAgICAgY29uc3QgbmFtZSA9IGRlY2xhcmF0aW9uLmdldE5hbWUoKTtcbiAgICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIG5hbWUpO1xuICAgICAgaWYgKHR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdHlwZXMuc2V0KGtleSwge1xuICAgICAgICBiYXNlVHlwZXM6IFtdLFxuICAgICAgICBkZXNjcmlwdGlvbjogZ2V0RGVzY3JpcHRpb24odmFyaWFibGVTdGF0ZW1lbnQpLFxuICAgICAgICBlbnVtTWVtYmVyczogW10sXG4gICAgICAgIGV4YW1wbGVzOiBnZXRFeGFtcGxlcyh2YXJpYWJsZVN0YXRlbWVudCksXG4gICAgICAgIGltcGxlbWVudHNUeXBlczogW10sXG4gICAgICAgIGtpbmQ6ICd2YXJpYWJsZScsXG4gICAgICAgIG1ldGhvZHM6IFtdLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICByZW1hcmtzOiBnZXRSZW1hcmtzKHZhcmlhYmxlU3RhdGVtZW50KSxcbiAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICB2YXJpYWJsZUtleXdvcmQ6IGRlY2xhcmF0aW9uS2luZCxcbiAgICAgICAgdmFyaWFibGVUeXBlOiBzaW1wbGlmeVR5cGUoZGVjbGFyYXRpb24uZ2V0VHlwZSgpLmdldFRleHQoKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgYSBoYXNoIG9mIGV2ZXJ5IGlucHV0IHRoYXQgZGVjaWRlcyB0aGUgZ2VuZXJhdGVkIHBhZ2VzOiB0aGUgZ2VuZXJhdG9yJ3Mgb3duIG1vZHVsZXMsIHRoZSBzZXR0aW5ncyBhbmRcbiAqIHRoZSBlbnRyeSBzb3VyY2UgZmlsZXMuIEFuIHVuY2hhbmdlZCBoYXNoIGxldHMgYSBydW4gc2tpcCB0aGUgZ2VuZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZW50cnlGaWxlcyAtIFRoZSBlbnRyeSBzb3VyY2UgZmlsZXMuXG4gKiBAcGFyYW0gZ2VuZXJhdG9yRGlyZWN0b3J5IC0gVGhlIGZvbGRlciBob2xkaW5nIHRoZSBnZW5lcmF0b3IncyBtb2R1bGVzLlxuICogQHJldHVybnMgVGhlIGhhc2gsIGFzIGhleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWNoZUhhc2goZW50cnlGaWxlczogc3RyaW5nW10sIGdlbmVyYXRvckRpcmVjdG9yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIC8vIFRoZSBnZW5lcmF0b3IgaXRzZWxmXG4gIGNvbnN0IGdlbmVyYXRvckZpbGVzID0gcmVhZGRpclN5bmMoZ2VuZXJhdG9yRGlyZWN0b3J5KS5maWx0ZXIoKG5hbWUpID0+ICFuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgZ2VuZXJhdG9yRmlsZSBvZiBnZW5lcmF0b3JGaWxlcykge1xuICAgIGhhc2gudXBkYXRlKGdlbmVyYXRvckZpbGUpO1xuICAgIGhhc2gudXBkYXRlKHJlYWRGaWxlU3luYyhqb2luKGdlbmVyYXRvckRpcmVjdG9yeSwgZ2VuZXJhdG9yRmlsZSksICd1dGYtOCcpKTtcbiAgfVxuXG4gIC8vIFRoZSBzZXR0aW5ncywgd2hpY2ggZXZlcnkgbGluayBhbmQgcGF0aCBkZXBlbmRzIG9uXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgaGFzaC51cGRhdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgIC4uLnNldHRpbmdzLFxuICAgIGV4dGVybmFsVHlwZUxpbmtzOiBbLi4uc2V0dGluZ3MuZXh0ZXJuYWxUeXBlTGlua3NdLFxuICAgIHBhY2thZ2VTaXRlczogWy4uLnNldHRpbmdzLnBhY2thZ2VTaXRlc11cbiAgfSkpO1xuXG4gIC8vIEhhc2ggYWxsIGVudHJ5IHNvdXJjZSBmaWxlc1xuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIFsuLi5lbnRyeUZpbGVzXS5zb3J0KCkpIHtcbiAgICBoYXNoLnVwZGF0ZShmaWxlUGF0aCk7XG4gICAgaGFzaC51cGRhdGUocmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKSk7XG4gIH1cblxuICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIG5hbWVzcGFjZSAoUE9TSVggcGF0aCByZWxhdGl2ZSB0byBgc3JjYCwgbm8gZXh0ZW5zaW9uKSBmb3IgYSBzb3VyY2UgZmlsZS5cbiAqXG4gKiBAcGFyYW0gc3JjRGlyZWN0b3J5IC0gVGhlIHNvdXJjZSBmb2xkZXIgdGhlIG5hbWVzcGFjZSBpcyByZWxhdGl2ZSB0by5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIFRoZSBmaWxlJ3MgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlTmFtZXNwYWNlKHNyY0RpcmVjdG9yeTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlbGF0aXZlKHNyY0RpcmVjdG9yeSwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpLnJlcGxhY2UoL1xcLnRzJC8sICcnKTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSBmaW5kIGFsbCBkb2N1bWVudGFibGUgYCoudHNgIGVudHJ5IGZpbGVzIHVuZGVyIGBzcmNgLlxuICpcbiAqIEV4Y2x1ZGVzOiBgKi50ZXN0LnRzYCAoaW5jbC4gYCouYnJvd3Nlci50ZXN0LnRzYCAvIGAqLmludGVncmF0aW9uLnRlc3QudHNgKSwgYCouZC50c2AsXG4gKiBgaW5kZXgudHNgLCBgX19tZXJnZWQudHNgLCBgc2V0dXAudHNgLCBgKi1zZXR1cC50c2AsIGFuZCBhbnkgc3VidHJlZSB1bmRlciBhIGBAdHlwZXNgLFxuICogYHN0eWxlc2AsIG9yIGB0ZXN0LWhlbHBlcnNgIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGZvbGRlciB0byBzZWFyY2guXG4gKiBAcmV0dXJucyBUaGUgZW50cnkgZmlsZXMnIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEVudHJ5RmlsZXMoZGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmVhZGRpclN5bmMoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKEVYQ0xVREVEX0RJUl9TRUdNRU5UUy5oYXMoZW50cnkubmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHRzLnB1c2goLi4uZmluZEVudHJ5RmlsZXMoZnVsbFBhdGgpKTtcbiAgICB9IGVsc2UgaWYgKGlzRW50cnlGaWxlKGVudHJ5Lm5hbWUpKSB7XG4gICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhIHNvdXJjZSBmaWxlJ3MgZXhwb3J0ZWQgdHlwZSBhbGlhc2VzLCBlbnVtcywgaW50ZXJmYWNlcyBhbmQgY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSBmaWxlLlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgdHlwZSdzIG5hbWVzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTb3VyY2VGaWxlKHNyYzogU291cmNlRmlsZSwgdHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPiwgbmFtZXNwYWNlOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBhbGlhcyBvZiBzcmMuZ2V0VHlwZUFsaWFzZXMoKSkge1xuICAgIGlmICghYWxpYXMuaXNFeHBvcnRlZCgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gcXVhbGlmaWVkS2V5KG5hbWVzcGFjZSwgYWxpYXMuZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0VHlwZUFsaWFzSW5mbyhhbGlhcywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbnVtRGVjbGFyYXRpb24gb2Ygc3JjLmdldEVudW1zKCkpIHtcbiAgICBpZiAoIWVudW1EZWNsYXJhdGlvbi5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBlbnVtRGVjbGFyYXRpb24uZ2V0TmFtZSgpKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0RW51bUluZm8oZW51bURlY2xhcmF0aW9uLCBuYW1lc3BhY2UpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGlmYWNlIG9mIHNyYy5nZXRJbnRlcmZhY2VzKCkpIHtcbiAgICBpZiAoIWlmYWNlLmlzRXhwb3J0ZWQoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHF1YWxpZmllZEtleShuYW1lc3BhY2UsIGlmYWNlLmdldE5hbWUoKSk7XG4gICAgaWYgKCF0eXBlcy5oYXMoa2V5KSkge1xuICAgICAgdHlwZXMuc2V0KGtleSwgZXh0cmFjdEludGVyZmFjZUluZm8oaWZhY2UsIG5hbWVzcGFjZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY2xzIG9mIHNyYy5nZXRDbGFzc2VzKCkpIHtcbiAgICBpZiAoIWNscy5pc0V4cG9ydGVkKCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gY2xzLmdldE5hbWUoKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBxdWFsaWZpZWRLZXkobmFtZXNwYWNlLCBuYW1lKTtcbiAgICBpZiAoIXR5cGVzLmhhcyhrZXkpKSB7XG4gICAgICB0eXBlcy5zZXQoa2V5LCBleHRyYWN0Q2xhc3NJbmZvKGNscywgbmFtZXNwYWNlKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIHR5cGUgcGFyYW1ldGVyIG5hbWVzIHNvIHJlbmRlclR5cGVXaXRoTGlua3Mgd29uJ3QgaHlwZXJsaW5rIHRoZW0uXG4gKiBTa2lwIG5hbWVzIHRoYXQgYXJlIGFsc28ga25vd24gdHlwZXMg4oCUIHRob3NlIHNob3VsZCBzdGlsbCBiZSBsaW5rYWJsZS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJHZW5lcmljVHlwZVBhcmFtcyh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtub3duTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGtub3duTmFtZXMuYWRkKGluZm8ubmFtZSk7XG4gIH1cbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGZvciAoY29uc3QgdHAgb2YgaW5mby50eXBlUGFyYW1ldGVycykge1xuICAgICAgY29uc3QgYmFyZVBhcmFtZXRlciA9IHRwLnJlcGxhY2UoL1xccytleHRlbmRzXFxzKy4qJC8sICcnKTtcbiAgICAgIGlmICgha25vd25OYW1lcy5oYXMoYmFyZVBhcmFtZXRlcikpIHtcbiAgICAgICAgR0VORVJJQ19UWVBFX1BBUkFNUy5hZGQoYmFyZVBhcmFtZXRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRW50cnlGaWxlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBUaGUgYC50ZXN0LnRzYCBjbGF1c2UgY292ZXJzICoudGVzdC50cywgKi5icm93c2VyLnRlc3QudHMsICouaW50ZWdyYXRpb24udGVzdC50c1xuICByZXR1cm4gISghbmFtZS5lbmRzV2l0aCgnLnRzJykgfHwgbmFtZS5lbmRzV2l0aCgnLmQudHMnKSB8fCBbJ19fbWVyZ2VkLnRzJywgJ2luZGV4LnRzJywgJ3NldHVwLnRzJ10uaW5jbHVkZXMobmFtZSkgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJykgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSk7XG59XG5cbmZ1bmN0aW9uIGlzVHlwZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiBOb2RlKTogYm9vbGVhbiB7XG4gIHJldHVybiBOb2RlLmlzQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikgfHwgTm9kZS5pc0ludGVyZmFjZURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB8fCBOb2RlLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pIHx8IE5vZGUuaXNFbnVtRGVjbGFyYXRpb24oZGVjbGFyYXRpb24pO1xufVxuXG5mdW5jdGlvbiBxdWFsaWZpZWRLZXkobmFtZXNwYWNlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFJckIsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsb0JBQW9CO0FBSzdCLE1BQU0sd0JBQXdCLG9CQUFJLElBQUksQ0FBQyxVQUFVLFVBQVUsY0FBYyxDQUFDO0FBU25FLFNBQVMsaUJBQWlCLEtBQWlCLE9BQThCLFdBQXlCO0FBQ3ZHLGFBQVcsYUFBYSxJQUFJLGFBQWEsR0FBRztBQUMxQyxRQUFJLENBQUMsVUFBVSxXQUFXLEdBQUc7QUFDM0I7QUFBQSxJQUNGO0FBQ0EsVUFBTSxPQUFPLFVBQVUsUUFBUTtBQUMvQixRQUFJLENBQUMsTUFBTTtBQUNUO0FBQUEsSUFDRjtBQUNBLFVBQU0sTUFBTSxhQUFhLFdBQVcsSUFBSTtBQUN4QyxRQUFJLE1B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