@fuzdev/fuz_ui 0.169.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 (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/Alert.svelte +108 -0
  4. package/dist/Alert.svelte.d.ts +16 -0
  5. package/dist/Alert.svelte.d.ts.map +1 -0
  6. package/dist/ApiDeclarationList.svelte +35 -0
  7. package/dist/ApiDeclarationList.svelte.d.ts +9 -0
  8. package/dist/ApiDeclarationList.svelte.d.ts.map +1 -0
  9. package/dist/ApiIndex.svelte +65 -0
  10. package/dist/ApiIndex.svelte.d.ts +23 -0
  11. package/dist/ApiIndex.svelte.d.ts.map +1 -0
  12. package/dist/ApiModule.svelte +124 -0
  13. package/dist/ApiModule.svelte.d.ts +22 -0
  14. package/dist/ApiModule.svelte.d.ts.map +1 -0
  15. package/dist/Breadcrumb.svelte +83 -0
  16. package/dist/Breadcrumb.svelte.d.ts +23 -0
  17. package/dist/Breadcrumb.svelte.d.ts.map +1 -0
  18. package/dist/Card.svelte +157 -0
  19. package/dist/Card.svelte.d.ts +13 -0
  20. package/dist/Card.svelte.d.ts.map +1 -0
  21. package/dist/ColorSchemeInput.svelte +65 -0
  22. package/dist/ColorSchemeInput.svelte.d.ts +11 -0
  23. package/dist/ColorSchemeInput.svelte.d.ts.map +1 -0
  24. package/dist/Contextmenu.svelte +30 -0
  25. package/dist/Contextmenu.svelte.d.ts +32 -0
  26. package/dist/Contextmenu.svelte.d.ts.map +1 -0
  27. package/dist/ContextmenuEntry.svelte +74 -0
  28. package/dist/ContextmenuEntry.svelte.d.ts +12 -0
  29. package/dist/ContextmenuEntry.svelte.d.ts.map +1 -0
  30. package/dist/ContextmenuLinkEntry.svelte +112 -0
  31. package/dist/ContextmenuLinkEntry.svelte.d.ts +12 -0
  32. package/dist/ContextmenuLinkEntry.svelte.d.ts.map +1 -0
  33. package/dist/ContextmenuRoot.svelte +372 -0
  34. package/dist/ContextmenuRoot.svelte.d.ts +71 -0
  35. package/dist/ContextmenuRoot.svelte.d.ts.map +1 -0
  36. package/dist/ContextmenuRootForSafariCompatibility.svelte +541 -0
  37. package/dist/ContextmenuRootForSafariCompatibility.svelte.d.ts +79 -0
  38. package/dist/ContextmenuRootForSafariCompatibility.svelte.d.ts.map +1 -0
  39. package/dist/ContextmenuSeparator.svelte +16 -0
  40. package/dist/ContextmenuSeparator.svelte.d.ts +4 -0
  41. package/dist/ContextmenuSeparator.svelte.d.ts.map +1 -0
  42. package/dist/ContextmenuSubmenu.svelte +116 -0
  43. package/dist/ContextmenuSubmenu.svelte.d.ts +10 -0
  44. package/dist/ContextmenuSubmenu.svelte.d.ts.map +1 -0
  45. package/dist/ContextmenuTextEntry.svelte +21 -0
  46. package/dist/ContextmenuTextEntry.svelte.d.ts +10 -0
  47. package/dist/ContextmenuTextEntry.svelte.d.ts.map +1 -0
  48. package/dist/CopyToClipboard.svelte +81 -0
  49. package/dist/CopyToClipboard.svelte.d.ts +18 -0
  50. package/dist/CopyToClipboard.svelte.d.ts.map +1 -0
  51. package/dist/DeclarationDetail.svelte +340 -0
  52. package/dist/DeclarationDetail.svelte.d.ts +8 -0
  53. package/dist/DeclarationDetail.svelte.d.ts.map +1 -0
  54. package/dist/DeclarationLink.svelte +50 -0
  55. package/dist/DeclarationLink.svelte.d.ts +8 -0
  56. package/dist/DeclarationLink.svelte.d.ts.map +1 -0
  57. package/dist/Details.svelte +51 -0
  58. package/dist/Details.svelte.d.ts +20 -0
  59. package/dist/Details.svelte.d.ts.map +1 -0
  60. package/dist/Dialog.svelte +217 -0
  61. package/dist/Dialog.svelte.d.ts +30 -0
  62. package/dist/Dialog.svelte.d.ts.map +1 -0
  63. package/dist/Dialogs.svelte +28 -0
  64. package/dist/Dialogs.svelte.d.ts +11 -0
  65. package/dist/Dialogs.svelte.d.ts.map +1 -0
  66. package/dist/Docs.svelte +179 -0
  67. package/dist/Docs.svelte.d.ts +13 -0
  68. package/dist/Docs.svelte.d.ts.map +1 -0
  69. package/dist/DocsContent.svelte +40 -0
  70. package/dist/DocsContent.svelte.d.ts +14 -0
  71. package/dist/DocsContent.svelte.d.ts.map +1 -0
  72. package/dist/DocsFooter.svelte +64 -0
  73. package/dist/DocsFooter.svelte.d.ts +15 -0
  74. package/dist/DocsFooter.svelte.d.ts.map +1 -0
  75. package/dist/DocsLink.svelte +41 -0
  76. package/dist/DocsLink.svelte.d.ts +12 -0
  77. package/dist/DocsLink.svelte.d.ts.map +1 -0
  78. package/dist/DocsList.svelte +44 -0
  79. package/dist/DocsList.svelte.d.ts +11 -0
  80. package/dist/DocsList.svelte.d.ts.map +1 -0
  81. package/dist/DocsMenu.svelte +55 -0
  82. package/dist/DocsMenu.svelte.d.ts +11 -0
  83. package/dist/DocsMenu.svelte.d.ts.map +1 -0
  84. package/dist/DocsMenuHeader.svelte +15 -0
  85. package/dist/DocsMenuHeader.svelte.d.ts +9 -0
  86. package/dist/DocsMenuHeader.svelte.d.ts.map +1 -0
  87. package/dist/DocsModulesList.svelte +32 -0
  88. package/dist/DocsModulesList.svelte.d.ts +7 -0
  89. package/dist/DocsModulesList.svelte.d.ts.map +1 -0
  90. package/dist/DocsPageLinks.svelte +61 -0
  91. package/dist/DocsPageLinks.svelte.d.ts +8 -0
  92. package/dist/DocsPageLinks.svelte.d.ts.map +1 -0
  93. package/dist/DocsPrimaryNav.svelte +93 -0
  94. package/dist/DocsPrimaryNav.svelte.d.ts +11 -0
  95. package/dist/DocsPrimaryNav.svelte.d.ts.map +1 -0
  96. package/dist/DocsSearch.svelte +48 -0
  97. package/dist/DocsSearch.svelte.d.ts +11 -0
  98. package/dist/DocsSearch.svelte.d.ts.map +1 -0
  99. package/dist/DocsSecondaryNav.svelte +63 -0
  100. package/dist/DocsSecondaryNav.svelte.d.ts +9 -0
  101. package/dist/DocsSecondaryNav.svelte.d.ts.map +1 -0
  102. package/dist/DocsTertiaryNav.svelte +118 -0
  103. package/dist/DocsTertiaryNav.svelte.d.ts +10 -0
  104. package/dist/DocsTertiaryNav.svelte.d.ts.map +1 -0
  105. package/dist/EcosystemLinks.svelte +53 -0
  106. package/dist/EcosystemLinks.svelte.d.ts +7 -0
  107. package/dist/EcosystemLinks.svelte.d.ts.map +1 -0
  108. package/dist/EcosystemLinksPanel.svelte +22 -0
  109. package/dist/EcosystemLinksPanel.svelte.d.ts +8 -0
  110. package/dist/EcosystemLinksPanel.svelte.d.ts.map +1 -0
  111. package/dist/GithubLink.svelte +75 -0
  112. package/dist/GithubLink.svelte.d.ts +14 -0
  113. package/dist/GithubLink.svelte.d.ts.map +1 -0
  114. package/dist/Glyph.svelte +28 -0
  115. package/dist/Glyph.svelte.d.ts +9 -0
  116. package/dist/Glyph.svelte.d.ts.map +1 -0
  117. package/dist/Hashlink.svelte +41 -0
  118. package/dist/Hashlink.svelte.d.ts +8 -0
  119. package/dist/Hashlink.svelte.d.ts.map +1 -0
  120. package/dist/HiddenPersonalLinks.svelte +6 -0
  121. package/dist/HiddenPersonalLinks.svelte.d.ts +27 -0
  122. package/dist/HiddenPersonalLinks.svelte.d.ts.map +1 -0
  123. package/dist/HueInput.svelte +127 -0
  124. package/dist/HueInput.svelte.d.ts +11 -0
  125. package/dist/HueInput.svelte.d.ts.map +1 -0
  126. package/dist/ImgOrSvg.svelte +58 -0
  127. package/dist/ImgOrSvg.svelte.d.ts +25 -0
  128. package/dist/ImgOrSvg.svelte.d.ts.map +1 -0
  129. package/dist/LibraryDetail.svelte +297 -0
  130. package/dist/LibraryDetail.svelte.d.ts +15 -0
  131. package/dist/LibraryDetail.svelte.d.ts.map +1 -0
  132. package/dist/LibrarySummary.svelte +151 -0
  133. package/dist/LibrarySummary.svelte.d.ts +16 -0
  134. package/dist/LibrarySummary.svelte.d.ts.map +1 -0
  135. package/dist/MdnLink.svelte +40 -0
  136. package/dist/MdnLink.svelte.d.ts +8 -0
  137. package/dist/MdnLink.svelte.d.ts.map +1 -0
  138. package/dist/Mdz.svelte +30 -0
  139. package/dist/Mdz.svelte.d.ts +10 -0
  140. package/dist/Mdz.svelte.d.ts.map +1 -0
  141. package/dist/MdzNodeView.svelte +93 -0
  142. package/dist/MdzNodeView.svelte.d.ts +9 -0
  143. package/dist/MdzNodeView.svelte.d.ts.map +1 -0
  144. package/dist/ModuleLink.svelte +48 -0
  145. package/dist/ModuleLink.svelte.d.ts +8 -0
  146. package/dist/ModuleLink.svelte.d.ts.map +1 -0
  147. package/dist/PasteFromClipboard.svelte +35 -0
  148. package/dist/PasteFromClipboard.svelte.d.ts +9 -0
  149. package/dist/PasteFromClipboard.svelte.d.ts.map +1 -0
  150. package/dist/PendingAnimation.svelte +62 -0
  151. package/dist/PendingAnimation.svelte.d.ts +13 -0
  152. package/dist/PendingAnimation.svelte.d.ts.map +1 -0
  153. package/dist/PendingButton.svelte +75 -0
  154. package/dist/PendingButton.svelte.d.ts +17 -0
  155. package/dist/PendingButton.svelte.d.ts.map +1 -0
  156. package/dist/ProjectLinks.svelte +54 -0
  157. package/dist/ProjectLinks.svelte.d.ts +19 -0
  158. package/dist/ProjectLinks.svelte.d.ts.map +1 -0
  159. package/dist/Redirect.svelte +44 -0
  160. package/dist/Redirect.svelte.d.ts +23 -0
  161. package/dist/Redirect.svelte.d.ts.map +1 -0
  162. package/dist/Spiders.svelte +57 -0
  163. package/dist/Spiders.svelte.d.ts +9 -0
  164. package/dist/Spiders.svelte.d.ts.map +1 -0
  165. package/dist/Svg.svelte +99 -0
  166. package/dist/Svg.svelte.d.ts +54 -0
  167. package/dist/Svg.svelte.d.ts.map +1 -0
  168. package/dist/Teleport.svelte +48 -0
  169. package/dist/Teleport.svelte.d.ts +15 -0
  170. package/dist/Teleport.svelte.d.ts.map +1 -0
  171. package/dist/ThemeInput.svelte +75 -0
  172. package/dist/ThemeInput.svelte.d.ts +15 -0
  173. package/dist/ThemeInput.svelte.d.ts.map +1 -0
  174. package/dist/Themed.svelte +101 -0
  175. package/dist/Themed.svelte.d.ts +24 -0
  176. package/dist/Themed.svelte.d.ts.map +1 -0
  177. package/dist/TomeContent.svelte +67 -0
  178. package/dist/TomeContent.svelte.d.ts +12 -0
  179. package/dist/TomeContent.svelte.d.ts.map +1 -0
  180. package/dist/TomeHeader.svelte +56 -0
  181. package/dist/TomeHeader.svelte.d.ts +4 -0
  182. package/dist/TomeHeader.svelte.d.ts.map +1 -0
  183. package/dist/TomeLink.svelte +29 -0
  184. package/dist/TomeLink.svelte.d.ts +10 -0
  185. package/dist/TomeLink.svelte.d.ts.map +1 -0
  186. package/dist/TomeSection.svelte +65 -0
  187. package/dist/TomeSection.svelte.d.ts +24 -0
  188. package/dist/TomeSection.svelte.d.ts.map +1 -0
  189. package/dist/TomeSectionHeader.svelte +90 -0
  190. package/dist/TomeSectionHeader.svelte.d.ts +13 -0
  191. package/dist/TomeSectionHeader.svelte.d.ts.map +1 -0
  192. package/dist/TypeLink.svelte +19 -0
  193. package/dist/TypeLink.svelte.d.ts +7 -0
  194. package/dist/TypeLink.svelte.d.ts.map +1 -0
  195. package/dist/alert.d.ts +7 -0
  196. package/dist/alert.d.ts.map +1 -0
  197. package/dist/alert.js +6 -0
  198. package/dist/api_search.svelte.d.ts +16 -0
  199. package/dist/api_search.svelte.d.ts.map +1 -0
  200. package/dist/api_search.svelte.js +61 -0
  201. package/dist/constants.d.ts +2 -0
  202. package/dist/constants.d.ts.map +1 -0
  203. package/dist/constants.js +3 -0
  204. package/dist/context_helpers.d.ts +17 -0
  205. package/dist/context_helpers.d.ts.map +1 -0
  206. package/dist/context_helpers.js +19 -0
  207. package/dist/contextmenu_helpers.d.ts +16 -0
  208. package/dist/contextmenu_helpers.d.ts.map +1 -0
  209. package/dist/contextmenu_helpers.js +39 -0
  210. package/dist/contextmenu_state.svelte.d.ts +152 -0
  211. package/dist/contextmenu_state.svelte.d.ts.map +1 -0
  212. package/dist/contextmenu_state.svelte.js +424 -0
  213. package/dist/csp.d.ts +160 -0
  214. package/dist/csp.d.ts.map +1 -0
  215. package/dist/csp.js +354 -0
  216. package/dist/csp_of_ryanatkn.d.ts +6 -0
  217. package/dist/csp_of_ryanatkn.d.ts.map +1 -0
  218. package/dist/csp_of_ryanatkn.js +14 -0
  219. package/dist/declaration.svelte.d.ts +84 -0
  220. package/dist/declaration.svelte.d.ts.map +1 -0
  221. package/dist/declaration.svelte.js +66 -0
  222. package/dist/declaration_contextmenu.d.ts +4 -0
  223. package/dist/declaration_contextmenu.d.ts.map +1 -0
  224. package/dist/declaration_contextmenu.js +14 -0
  225. package/dist/dialog.d.ts +24 -0
  226. package/dist/dialog.d.ts.map +1 -0
  227. package/dist/dialog.js +12 -0
  228. package/dist/dimensions.svelte.d.ts +5 -0
  229. package/dist/dimensions.svelte.d.ts.map +1 -0
  230. package/dist/dimensions.svelte.js +4 -0
  231. package/dist/docs_helpers.svelte.d.ts +48 -0
  232. package/dist/docs_helpers.svelte.d.ts.map +1 -0
  233. package/dist/docs_helpers.svelte.js +99 -0
  234. package/dist/helpers.d.ts +2 -0
  235. package/dist/helpers.d.ts.map +1 -0
  236. package/dist/helpers.js +16 -0
  237. package/dist/intersect.svelte.d.ts +47 -0
  238. package/dist/intersect.svelte.d.ts.map +1 -0
  239. package/dist/intersect.svelte.js +92 -0
  240. package/dist/library.svelte.d.ts +197 -0
  241. package/dist/library.svelte.d.ts.map +1 -0
  242. package/dist/library.svelte.js +130 -0
  243. package/dist/library_gen.d.ts +34 -0
  244. package/dist/library_gen.d.ts.map +1 -0
  245. package/dist/library_gen.js +123 -0
  246. package/dist/library_gen_helpers.d.ts +85 -0
  247. package/dist/library_gen_helpers.d.ts.map +1 -0
  248. package/dist/library_gen_helpers.js +188 -0
  249. package/dist/library_helpers.d.ts +54 -0
  250. package/dist/library_helpers.d.ts.map +1 -0
  251. package/dist/library_helpers.js +102 -0
  252. package/dist/logos.d.ts +134 -0
  253. package/dist/logos.d.ts.map +1 -0
  254. package/dist/logos.js +281 -0
  255. package/dist/mdz.d.ts +106 -0
  256. package/dist/mdz.d.ts.map +1 -0
  257. package/dist/mdz.js +1481 -0
  258. package/dist/mdz_components.d.ts +37 -0
  259. package/dist/mdz_components.d.ts.map +1 -0
  260. package/dist/mdz_components.js +12 -0
  261. package/dist/module.svelte.d.ts +47 -0
  262. package/dist/module.svelte.d.ts.map +1 -0
  263. package/dist/module.svelte.js +56 -0
  264. package/dist/module_contextmenu.d.ts +4 -0
  265. package/dist/module_contextmenu.d.ts.map +1 -0
  266. package/dist/module_contextmenu.js +14 -0
  267. package/dist/module_helpers.d.ts +69 -0
  268. package/dist/module_helpers.d.ts.map +1 -0
  269. package/dist/module_helpers.js +87 -0
  270. package/dist/rune_helpers.svelte.d.ts +6 -0
  271. package/dist/rune_helpers.svelte.d.ts.map +1 -0
  272. package/dist/rune_helpers.svelte.js +10 -0
  273. package/dist/storage.d.ts +13 -0
  274. package/dist/storage.d.ts.map +1 -0
  275. package/dist/storage.js +43 -0
  276. package/dist/svelte_helpers.d.ts +37 -0
  277. package/dist/svelte_helpers.d.ts.map +1 -0
  278. package/dist/svelte_helpers.js +245 -0
  279. package/dist/themer.svelte.d.ts +24 -0
  280. package/dist/themer.svelte.d.ts.map +1 -0
  281. package/dist/themer.svelte.js +43 -0
  282. package/dist/tome.d.ts +80 -0
  283. package/dist/tome.d.ts.map +1 -0
  284. package/dist/tome.js +27 -0
  285. package/dist/ts_helpers.d.ts +110 -0
  286. package/dist/ts_helpers.d.ts.map +1 -0
  287. package/dist/ts_helpers.js +533 -0
  288. package/dist/tsdoc_helpers.d.ts +98 -0
  289. package/dist/tsdoc_helpers.d.ts.map +1 -0
  290. package/dist/tsdoc_helpers.js +221 -0
  291. package/package.json +128 -0
  292. package/src/lib/alert.ts +14 -0
  293. package/src/lib/api_search.svelte.ts +85 -0
  294. package/src/lib/constants.ts +3 -0
  295. package/src/lib/context_helpers.ts +47 -0
  296. package/src/lib/contextmenu_helpers.ts +63 -0
  297. package/src/lib/contextmenu_state.svelte.ts +515 -0
  298. package/src/lib/csp.ts +576 -0
  299. package/src/lib/csp_of_ryanatkn.ts +16 -0
  300. package/src/lib/declaration.svelte.ts +102 -0
  301. package/src/lib/declaration_contextmenu.ts +22 -0
  302. package/src/lib/dialog.ts +35 -0
  303. package/src/lib/dimensions.svelte.ts +4 -0
  304. package/src/lib/docs_helpers.svelte.ts +149 -0
  305. package/src/lib/helpers.ts +10 -0
  306. package/src/lib/intersect.svelte.ts +152 -0
  307. package/src/lib/library.svelte.ts +162 -0
  308. package/src/lib/library_gen.ts +160 -0
  309. package/src/lib/library_gen_helpers.ts +262 -0
  310. package/src/lib/library_helpers.ts +123 -0
  311. package/src/lib/logos.ts +302 -0
  312. package/src/lib/mdz.ts +1819 -0
  313. package/src/lib/mdz_components.ts +34 -0
  314. package/src/lib/module.svelte.ts +78 -0
  315. package/src/lib/module_contextmenu.ts +20 -0
  316. package/src/lib/module_helpers.ts +113 -0
  317. package/src/lib/rune_helpers.svelte.ts +10 -0
  318. package/src/lib/storage.ts +48 -0
  319. package/src/lib/svelte_helpers.ts +303 -0
  320. package/src/lib/themer.svelte.ts +68 -0
  321. package/src/lib/tome.ts +38 -0
  322. package/src/lib/ts_helpers.ts +662 -0
  323. package/src/lib/tsdoc_helpers.ts +259 -0
@@ -0,0 +1,533 @@
1
+ /**
2
+ * TypeScript compiler API helpers for extracting metadata from source code.
3
+ *
4
+ * All functions are prefixed with `ts_` for clarity.
5
+ */
6
+ import ts from 'typescript';
7
+ import { tsdoc_parse, tsdoc_apply_to_declaration } from './tsdoc_helpers.js';
8
+ import { module_extract_path, module_matches_source } from './module_helpers.js';
9
+ const ts_parse_generic_param = (param) => {
10
+ const result = {
11
+ name: param.name.text,
12
+ };
13
+ if (param.constraint) {
14
+ result.constraint = param.constraint.getText();
15
+ }
16
+ if (param.default) {
17
+ result.default_type = param.default.getText();
18
+ }
19
+ return result;
20
+ };
21
+ /**
22
+ * Extract modifier keywords from a node's modifiers.
23
+ *
24
+ * Returns an array of modifier strings like ['public', 'readonly', 'static']
25
+ */
26
+ const ts_extract_modifiers = (modifiers) => {
27
+ const modifier_flags = [];
28
+ if (!modifiers)
29
+ return modifier_flags;
30
+ for (const mod of modifiers) {
31
+ if (mod.kind === ts.SyntaxKind.PublicKeyword)
32
+ modifier_flags.push('public');
33
+ else if (mod.kind === ts.SyntaxKind.PrivateKeyword)
34
+ modifier_flags.push('private');
35
+ else if (mod.kind === ts.SyntaxKind.ProtectedKeyword)
36
+ modifier_flags.push('protected');
37
+ else if (mod.kind === ts.SyntaxKind.ReadonlyKeyword)
38
+ modifier_flags.push('readonly');
39
+ else if (mod.kind === ts.SyntaxKind.StaticKeyword)
40
+ modifier_flags.push('static');
41
+ else if (mod.kind === ts.SyntaxKind.AbstractKeyword)
42
+ modifier_flags.push('abstract');
43
+ }
44
+ return modifier_flags;
45
+ };
46
+ /**
47
+ * Infer declaration kind from symbol and node.
48
+ */
49
+ export const ts_infer_declaration_kind = (symbol, node) => {
50
+ // Check symbol flags
51
+ if (symbol.flags & ts.SymbolFlags.Class)
52
+ return 'class';
53
+ if (symbol.flags & ts.SymbolFlags.Function)
54
+ return 'function';
55
+ if (symbol.flags & ts.SymbolFlags.Interface)
56
+ return 'type';
57
+ if (symbol.flags & ts.SymbolFlags.TypeAlias)
58
+ return 'type';
59
+ // Check node kind
60
+ if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node))
61
+ return 'function';
62
+ if (ts.isClassDeclaration(node))
63
+ return 'class';
64
+ if (ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node))
65
+ return 'type';
66
+ if (ts.isVariableDeclaration(node)) {
67
+ // Check if it's a function-valued variable
68
+ const init = node.initializer;
69
+ if (init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init))) {
70
+ return 'function';
71
+ }
72
+ return 'variable';
73
+ }
74
+ return 'variable';
75
+ };
76
+ /**
77
+ * Extract function/method information including parameters
78
+ * with descriptions and default values.
79
+ *
80
+ * @mutates declaration - adds type_signature, return_type, return_description, throws, since, parameters, generic_params
81
+ */
82
+ export const ts_extract_function_info = (node, symbol, checker, declaration, tsdoc) => {
83
+ try {
84
+ const type = checker.getTypeOfSymbolAtLocation(symbol, node);
85
+ const signatures = type.getCallSignatures();
86
+ if (signatures.length > 0) {
87
+ const sig = signatures[0];
88
+ declaration.type_signature = checker.signatureToString(sig);
89
+ const return_type = checker.getReturnTypeOfSignature(sig);
90
+ declaration.return_type = checker.typeToString(return_type);
91
+ // Extract return description from TSDoc
92
+ if (tsdoc?.returns) {
93
+ declaration.return_description = tsdoc.returns;
94
+ }
95
+ // Extract throws and since from TSDoc
96
+ if (tsdoc?.throws?.length) {
97
+ declaration.throws = tsdoc.throws;
98
+ }
99
+ if (tsdoc?.since) {
100
+ declaration.since = tsdoc.since;
101
+ }
102
+ // Extract parameters with descriptions and default values
103
+ declaration.parameters = sig.parameters.map((param) => {
104
+ const param_decl = param.valueDeclaration;
105
+ const param_type = checker.getTypeOfSymbolAtLocation(param, param_decl);
106
+ // Get TSDoc description for this parameter
107
+ const description = tsdoc?.params.get(param.name);
108
+ // Extract default value from AST
109
+ let default_value;
110
+ if (param_decl && ts.isParameter(param_decl) && param_decl.initializer) {
111
+ default_value = param_decl.initializer.getText();
112
+ }
113
+ const optional = !!(param_decl && ts.isParameter(param_decl) && param_decl.questionToken);
114
+ return {
115
+ name: param.name,
116
+ type: checker.typeToString(param_type),
117
+ ...(optional && { optional }),
118
+ description,
119
+ default_value,
120
+ };
121
+ });
122
+ }
123
+ }
124
+ catch (_err) {
125
+ // Ignore: Type checker errors are expected when analyzing incomplete or complex signatures
126
+ }
127
+ // Extract generic type parameters
128
+ if (ts.isFunctionDeclaration(node) || ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
129
+ if (node.typeParameters?.length) {
130
+ declaration.generic_params = node.typeParameters.map(ts_parse_generic_param);
131
+ }
132
+ }
133
+ };
134
+ /**
135
+ * Extract type/interface information with rich property metadata.
136
+ *
137
+ * @mutates declaration - adds type_signature, generic_params, extends, properties
138
+ */
139
+ export const ts_extract_type_info = (node, _symbol, checker, declaration) => {
140
+ try {
141
+ const type = checker.getTypeAtLocation(node);
142
+ declaration.type_signature = checker.typeToString(type);
143
+ }
144
+ catch (_err) {
145
+ // Ignore: Type checker may fail on complex or recursive types
146
+ }
147
+ if (ts.isTypeAliasDeclaration(node) || ts.isInterfaceDeclaration(node)) {
148
+ if (node.typeParameters?.length) {
149
+ declaration.generic_params = node.typeParameters.map(ts_parse_generic_param);
150
+ }
151
+ }
152
+ if (ts.isInterfaceDeclaration(node)) {
153
+ if (node.heritageClauses) {
154
+ declaration.extends = node.heritageClauses
155
+ .filter((hc) => hc.token === ts.SyntaxKind.ExtendsKeyword)
156
+ .flatMap((hc) => hc.types.map((t) => t.getText()));
157
+ }
158
+ // Extract properties with full metadata
159
+ declaration.properties = [];
160
+ for (const member of node.members) {
161
+ if (ts.isPropertySignature(member) && ts.isIdentifier(member.name)) {
162
+ const prop_name = member.name.text;
163
+ const prop_declaration = {
164
+ name: prop_name,
165
+ kind: 'variable',
166
+ };
167
+ // Extract modifiers
168
+ const modifier_flags = ts_extract_modifiers(ts.getModifiers(member));
169
+ if (modifier_flags.length > 0) {
170
+ prop_declaration.modifiers = modifier_flags;
171
+ }
172
+ // Extract type
173
+ if (member.type) {
174
+ prop_declaration.type_signature = member.type.getText();
175
+ }
176
+ // Extract TSDoc
177
+ const prop_tsdoc = tsdoc_parse(member, node.getSourceFile());
178
+ if (prop_tsdoc) {
179
+ prop_declaration.doc_comment = prop_tsdoc.text;
180
+ }
181
+ declaration.properties.push(prop_declaration);
182
+ }
183
+ }
184
+ }
185
+ };
186
+ /**
187
+ * Extract class information with rich member metadata.
188
+ *
189
+ * @mutates declaration - adds extends, implements, generic_params, members
190
+ */
191
+ export const ts_extract_class_info = (node, _symbol, checker, declaration) => {
192
+ if (!ts.isClassDeclaration(node))
193
+ return;
194
+ if (node.heritageClauses) {
195
+ declaration.extends = node.heritageClauses
196
+ .filter((hc) => hc.token === ts.SyntaxKind.ExtendsKeyword)
197
+ .flatMap((hc) => hc.types.map((t) => t.getText()));
198
+ declaration.implements = node.heritageClauses
199
+ .filter((hc) => hc.token === ts.SyntaxKind.ImplementsKeyword)
200
+ .flatMap((hc) => hc.types.map((t) => t.getText()));
201
+ }
202
+ if (node.typeParameters?.length) {
203
+ declaration.generic_params = node.typeParameters.map(ts_parse_generic_param);
204
+ }
205
+ // Extract members with full metadata
206
+ declaration.members = [];
207
+ for (const member of node.members) {
208
+ if (ts.isPropertyDeclaration(member) ||
209
+ ts.isMethodDeclaration(member) ||
210
+ ts.isConstructorDeclaration(member)) {
211
+ const is_constructor = ts.isConstructorDeclaration(member);
212
+ const member_name = is_constructor
213
+ ? 'constructor'
214
+ : ts.isIdentifier(member.name)
215
+ ? member.name.text
216
+ : member.name.getText();
217
+ if (!member_name)
218
+ continue;
219
+ // Skip private fields (those starting with #)
220
+ if (member_name.startsWith('#'))
221
+ continue;
222
+ const member_declaration = {
223
+ name: member_name,
224
+ kind: is_constructor
225
+ ? 'constructor'
226
+ : ts.isMethodDeclaration(member)
227
+ ? 'function'
228
+ : 'variable',
229
+ };
230
+ // Extract visibility and modifiers
231
+ const modifier_flags = ts_extract_modifiers(ts.getModifiers(member));
232
+ if (modifier_flags.length > 0) {
233
+ member_declaration.modifiers = modifier_flags;
234
+ }
235
+ // Extract TSDoc
236
+ const member_tsdoc = tsdoc_parse(member, node.getSourceFile());
237
+ if (member_tsdoc) {
238
+ member_declaration.doc_comment = member_tsdoc.text;
239
+ }
240
+ // Extract type information and parameters for methods and constructors
241
+ try {
242
+ if (ts.isPropertyDeclaration(member) && member.type) {
243
+ member_declaration.type_signature = member.type.getText();
244
+ }
245
+ else if (ts.isMethodDeclaration(member) || ts.isConstructorDeclaration(member)) {
246
+ let signatures = [];
247
+ if (is_constructor) {
248
+ // For constructors, get construct signatures from the class symbol
249
+ const class_symbol = checker.getSymbolAtLocation(node.name);
250
+ if (class_symbol) {
251
+ const class_type = checker.getTypeOfSymbolAtLocation(class_symbol, node);
252
+ signatures = class_type.getConstructSignatures();
253
+ }
254
+ }
255
+ else {
256
+ // For methods, get call signatures from the method symbol
257
+ const member_symbol = checker.getSymbolAtLocation(member.name);
258
+ if (member_symbol) {
259
+ const member_type = checker.getTypeOfSymbolAtLocation(member_symbol, member);
260
+ signatures = member_type.getCallSignatures();
261
+ }
262
+ }
263
+ if (signatures.length > 0) {
264
+ const sig = signatures[0];
265
+ // Extract type signature for both constructors and methods
266
+ member_declaration.type_signature = checker.signatureToString(sig);
267
+ // For methods (but not constructors), also extract return info separately
268
+ if (!is_constructor) {
269
+ // Extract return type for methods
270
+ const return_type = checker.getReturnTypeOfSignature(sig);
271
+ member_declaration.return_type = checker.typeToString(return_type);
272
+ // Extract return description from TSDoc
273
+ if (member_tsdoc?.returns) {
274
+ member_declaration.return_description = member_tsdoc.returns;
275
+ }
276
+ }
277
+ // Extract parameters with descriptions and default values
278
+ member_declaration.parameters = sig.parameters.map((param) => {
279
+ const param_decl = param.valueDeclaration;
280
+ const param_type = checker.getTypeOfSymbolAtLocation(param, param_decl);
281
+ // Get TSDoc description for this parameter
282
+ const description = member_tsdoc?.params.get(param.name);
283
+ // Extract default value from AST
284
+ let default_value;
285
+ if (param_decl && ts.isParameter(param_decl) && param_decl.initializer) {
286
+ default_value = param_decl.initializer.getText();
287
+ }
288
+ const optional = !!(param_decl &&
289
+ ts.isParameter(param_decl) &&
290
+ param_decl.questionToken);
291
+ return {
292
+ name: param.name,
293
+ type: checker.typeToString(param_type),
294
+ ...(optional && { optional }),
295
+ description,
296
+ default_value,
297
+ };
298
+ });
299
+ // Extract throws and since from TSDoc (for both methods and constructors)
300
+ if (member_tsdoc?.throws?.length) {
301
+ member_declaration.throws = member_tsdoc.throws;
302
+ }
303
+ if (member_tsdoc?.since) {
304
+ member_declaration.since = member_tsdoc.since;
305
+ }
306
+ }
307
+ }
308
+ }
309
+ catch (_err) {
310
+ // Ignore: Type checker may fail on complex member signatures
311
+ }
312
+ declaration.members.push(member_declaration);
313
+ }
314
+ }
315
+ };
316
+ /**
317
+ * Extract variable information.
318
+ *
319
+ * @mutates declaration - adds type_signature
320
+ */
321
+ export const ts_extract_variable_info = (node, symbol, checker, declaration) => {
322
+ try {
323
+ const type = checker.getTypeOfSymbolAtLocation(symbol, node);
324
+ declaration.type_signature = checker.typeToString(type);
325
+ }
326
+ catch (_err) {
327
+ // Ignore: Type checker may fail on complex variable types
328
+ }
329
+ };
330
+ /**
331
+ * Analyze a TypeScript symbol and extract rich metadata.
332
+ *
333
+ * This is a high-level function that combines TSDoc parsing with TypeScript
334
+ * type analysis to produce complete declaration metadata. Suitable for use
335
+ * in documentation generators, IDE integrations, and other tooling.
336
+ *
337
+ * @param symbol The TypeScript symbol to analyze
338
+ * @param source_file The source file containing the symbol
339
+ * @param checker The TypeScript type checker
340
+ * @returns Complete declaration metadata including docs, types, and parameters, plus nodocs flag
341
+ */
342
+ export const ts_analyze_declaration = (symbol, source_file, checker) => {
343
+ const name = symbol.name;
344
+ const decl_node = symbol.valueDeclaration || symbol.declarations?.[0];
345
+ // Determine kind (fallback to 'variable' if no declaration node)
346
+ const kind = decl_node ? ts_infer_declaration_kind(symbol, decl_node) : 'variable';
347
+ const result = {
348
+ name,
349
+ kind,
350
+ };
351
+ if (!decl_node) {
352
+ return { declaration: result, nodocs: false };
353
+ }
354
+ // Extract TSDoc
355
+ const tsdoc = tsdoc_parse(decl_node, source_file);
356
+ const nodocs = tsdoc?.nodocs ?? false;
357
+ tsdoc_apply_to_declaration(result, tsdoc);
358
+ // Extract source line
359
+ const start = decl_node.getStart(source_file);
360
+ const start_pos = source_file.getLineAndCharacterOfPosition(start);
361
+ result.source_line = start_pos.line + 1;
362
+ // Extract type-specific info
363
+ if (result.kind === 'function') {
364
+ ts_extract_function_info(decl_node, symbol, checker, result, tsdoc);
365
+ }
366
+ else if (result.kind === 'type') {
367
+ ts_extract_type_info(decl_node, symbol, checker, result);
368
+ }
369
+ else if (result.kind === 'class') {
370
+ ts_extract_class_info(decl_node, symbol, checker, result);
371
+ }
372
+ else if (result.kind === 'variable') {
373
+ ts_extract_variable_info(decl_node, symbol, checker, result);
374
+ }
375
+ return { declaration: result, nodocs };
376
+ };
377
+ /**
378
+ * Analyze all exports from a TypeScript source file.
379
+ *
380
+ * Extracts the module-level comment and all exported declarations with
381
+ * complete metadata. Handles re-exports by:
382
+ * - Same-name re-exports: tracked in `re_exports` for `also_exported_from` building
383
+ * - Renamed re-exports: included as new declarations with `alias_of` metadata
384
+ *
385
+ * This is a high-level function suitable for building documentation, API explorers, or analysis tools.
386
+ *
387
+ * @param source_file The TypeScript source file to analyze
388
+ * @param checker The TypeScript type checker
389
+ * @returns Module comment, array of analyzed declarations, and re-export information
390
+ */
391
+ export const ts_analyze_module_exports = (source_file, checker) => {
392
+ const declarations = [];
393
+ const re_exports = [];
394
+ // Extract module-level comment
395
+ const module_comment = ts_extract_module_comment(source_file);
396
+ // Get all exported symbols
397
+ const symbol = checker.getSymbolAtLocation(source_file);
398
+ if (symbol) {
399
+ const exports = checker.getExportsOfModule(symbol);
400
+ for (const export_symbol of exports) {
401
+ // Check if this is an alias (potential re-export) using the Alias flag
402
+ const is_alias = (export_symbol.flags & ts.SymbolFlags.Alias) !== 0;
403
+ if (is_alias) {
404
+ // This might be a re-export - use getAliasedSymbol to find the original
405
+ const aliased_symbol = checker.getAliasedSymbol(export_symbol);
406
+ const aliased_decl = aliased_symbol.valueDeclaration || aliased_symbol.declarations?.[0];
407
+ if (aliased_decl) {
408
+ const original_source = aliased_decl.getSourceFile();
409
+ // Check if this is a CROSS-FILE re-export (original in different file)
410
+ if (original_source.fileName !== source_file.fileName) {
411
+ // Only track if the original is from a source module (not node_modules)
412
+ if (module_matches_source(original_source.fileName)) {
413
+ const original_module = module_extract_path(original_source.fileName);
414
+ const original_name = aliased_symbol.name;
415
+ const is_renamed = export_symbol.name !== original_name;
416
+ if (is_renamed) {
417
+ // Renamed re-export (export {foo as bar}) - create new declaration with alias_of
418
+ const kind = ts_infer_declaration_kind(aliased_symbol, aliased_decl);
419
+ const decl = {
420
+ name: export_symbol.name,
421
+ kind,
422
+ alias_of: { module: original_module, name: original_name },
423
+ };
424
+ declarations.push(decl);
425
+ }
426
+ else {
427
+ // Same-name re-export - track for also_exported_from, skip from declarations
428
+ re_exports.push({
429
+ name: export_symbol.name,
430
+ original_module,
431
+ });
432
+ }
433
+ continue;
434
+ }
435
+ // Re-export from external module (node_modules) - skip entirely
436
+ continue;
437
+ }
438
+ // Within-file alias (export { x as y }) - fall through to normal analysis
439
+ }
440
+ }
441
+ // Normal export or within-file alias - declared in this file
442
+ const { declaration, nodocs } = ts_analyze_declaration(export_symbol, source_file, checker);
443
+ // Skip @nodocs declarations - they're excluded from documentation
444
+ if (nodocs)
445
+ continue;
446
+ declarations.push(declaration);
447
+ }
448
+ }
449
+ return {
450
+ module_comment,
451
+ declarations,
452
+ re_exports,
453
+ };
454
+ };
455
+ /**
456
+ * Extract module-level comment.
457
+ *
458
+ * Only accepts JSDoc/TSDoc comments (`/** ... *\/`) followed by a blank line to distinguish
459
+ * them from identifier-level comments. This prevents accidentally treating function/class
460
+ * comments as module comments. Module comments can appear after imports.
461
+ */
462
+ export const ts_extract_module_comment = (source_file) => {
463
+ const full_text = source_file.getFullText();
464
+ // Check for comments at the start of the file (before any statements)
465
+ const leading_comments = ts.getLeadingCommentRanges(full_text, 0);
466
+ if (leading_comments?.length) {
467
+ for (const comment of leading_comments) {
468
+ const comment_text = full_text.substring(comment.pos, comment.end);
469
+ if (!comment_text.trimStart().startsWith('/**'))
470
+ continue;
471
+ // Check if there's a blank line after this comment
472
+ const first_statement = source_file.statements[0];
473
+ if (first_statement) {
474
+ const between = full_text.substring(comment.end, first_statement.getStart());
475
+ if (between.includes('\n\n')) {
476
+ return extract_and_clean_jsdoc(full_text, comment);
477
+ }
478
+ }
479
+ else {
480
+ // No statements, just return the comment
481
+ return extract_and_clean_jsdoc(full_text, comment);
482
+ }
483
+ }
484
+ }
485
+ // Check for comments before each statement (e.g., after imports)
486
+ for (const statement of source_file.statements) {
487
+ const statement_start = statement.getFullStart();
488
+ const statement_pos = statement.getStart();
489
+ // Get comments in the trivia before this statement
490
+ const comments = ts.getLeadingCommentRanges(full_text, statement_start);
491
+ if (!comments?.length)
492
+ continue;
493
+ for (const comment of comments) {
494
+ const comment_text = full_text.substring(comment.pos, comment.end);
495
+ if (!comment_text.trimStart().startsWith('/**'))
496
+ continue;
497
+ // Check if there's a blank line between comment and statement
498
+ const between = full_text.substring(comment.end, statement_pos);
499
+ if (between.includes('\n\n')) {
500
+ return extract_and_clean_jsdoc(full_text, comment);
501
+ }
502
+ }
503
+ }
504
+ return undefined;
505
+ };
506
+ /**
507
+ * Extract and clean JSDoc comment text.
508
+ */
509
+ const extract_and_clean_jsdoc = (full_text, comment) => {
510
+ let text = full_text.substring(comment.pos, comment.end);
511
+ // Clean comment markers
512
+ text = text
513
+ .replace(/^\/\*\*/, '')
514
+ .replace(/\*\/$/, '')
515
+ .split('\n')
516
+ .map((line) => line.replace(/^\s*\*\s?/, ''))
517
+ .join('\n')
518
+ .trim();
519
+ return text || undefined;
520
+ };
521
+ /**
522
+ * Create TypeScript program for analysis.
523
+ */
524
+ export const ts_create_program = (log) => {
525
+ const config_path = ts.findConfigFile('./', ts.sys.fileExists, 'tsconfig.json');
526
+ if (!config_path) {
527
+ log.warn('No tsconfig.json found');
528
+ return null;
529
+ }
530
+ const config_file = ts.readConfigFile(config_path, ts.sys.readFile);
531
+ const parsed_config = ts.parseJsonConfigFileContent(config_file.config, ts.sys, './');
532
+ return ts.createProgram(parsed_config.fileNames, parsed_config.options);
533
+ };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * TSDoc/JSDoc parsing helpers using the TypeScript Compiler API.
3
+ *
4
+ * Provides `tsdoc_parse()` for extracting JSDoc/TSDoc from TypeScript nodes.
5
+ * Primarily designed for build-time code generation but can be used at runtime.
6
+ *
7
+ * ## Design
8
+ *
9
+ * Pure extraction approach: extracts documentation as-is with minimal transformation,
10
+ * preserving source intent. Works around TypeScript Compiler API quirks where needed.
11
+ *
12
+ * Supports both regular TypeScript and Svelte components (via svelte2tsx output).
13
+ *
14
+ * ## Tag support
15
+ *
16
+ * Supports a subset of standard TSDoc tags:
17
+ * `@param`, `@returns`, `@throws`, `@example`, `@deprecated`, `@see`, `@since`, `@nodocs`.
18
+ *
19
+ * The `@nodocs` tag excludes exports from documentation and flat namespace validation.
20
+ * The declaration is still exported and usable, just not documented.
21
+ *
22
+ * Also supports `@mutates` (non-standard) for documenting mutations to parameters or external state.
23
+ * Use format: `@mutates paramName - description of mutation`.
24
+ *
25
+ * Only `@returns` is supported (not `@return`).
26
+ *
27
+ * The `@see` tag supports multiple formats: plain URLs (`https://...`), `{@link}` syntax, and module names.
28
+ * Relative/absolute path support in `@see` is TBD.
29
+ *
30
+ * ## Behavioral notes
31
+ *
32
+ * Due to TS Compiler API limitations:
33
+ * - Preserves dash separator in `@param` descriptions: `@param x desc` → `"- desc"`
34
+ * - `@throws` tags have `{Type}` stripped by TS API; fallback regex extracts first word as error type
35
+ * - TS API strips URL protocols from `@see` tag text; we use `getText()` to preserve original format including `{@link}` syntax
36
+ *
37
+ * All functions are prefixed with `tsdoc_` for clarity.
38
+ */
39
+ import ts from 'typescript';
40
+ import type { DeclarationJson } from '@fuzdev/fuz_util/source_json.js';
41
+ /**
42
+ * Parsed JSDoc/TSDoc comment with structured metadata.
43
+ */
44
+ export interface TsdocParsedComment {
45
+ /** Comment text (excluding comment markers) */
46
+ text: string;
47
+ /** Parameter descriptions mapped by parameter name */
48
+ params: Map<string, string>;
49
+ /** Return value description from `@returns` */
50
+ returns?: string;
51
+ /** Thrown errors from `@throws` */
52
+ throws?: Array<{
53
+ type?: string;
54
+ description: string;
55
+ }>;
56
+ /** Code examples from `@example` */
57
+ examples?: Array<string>;
58
+ /** Deprecation message from `@deprecated` */
59
+ deprecated_message?: string;
60
+ /** Related references from `@see` */
61
+ see_also?: Array<string>;
62
+ /** Version information from `@since` */
63
+ since?: string;
64
+ /** Mutation documentation from `@mutates` (non-standard) */
65
+ mutates?: Array<string>;
66
+ /** Whether to exclude from documentation. From `@nodocs` tag. */
67
+ nodocs?: boolean;
68
+ }
69
+ /**
70
+ * Parse JSDoc comment from a TypeScript node.
71
+ *
72
+ * Extracts and parses all JSDoc tags including:
73
+ *
74
+ * - `@param` - parameter descriptions
75
+ * - `@returns` - return value description
76
+ * - `@throws` - error documentation
77
+ * - `@example` - code examples
78
+ * - `@deprecated` - deprecation warnings
79
+ * - `@see` - related references
80
+ * - `@since` - version information
81
+ * - `@mutates` - mutation documentation (non-standard)
82
+ *
83
+ * @param node The TypeScript node to extract JSDoc from
84
+ * @param source_file Source file (used for extracting full` @see` tag text)
85
+ */
86
+ export declare const tsdoc_parse: (node: ts.Node, source_file: ts.SourceFile) => TsdocParsedComment | undefined;
87
+ /**
88
+ * Apply parsed TSDoc metadata to a declaration.
89
+ *
90
+ * Consolidates the common pattern of assigning TSDoc fields to declarations,
91
+ * with conditional assignment for array fields (only if non-empty).
92
+ *
93
+ * @param declaration declaration object to update
94
+ * @param tsdoc parsed TSDoc comment (if available)
95
+ * @mutates declaration - adds doc_comment, deprecated_message, examples, see_also, throws, since fields
96
+ */
97
+ export declare const tsdoc_apply_to_declaration: (declaration: DeclarationJson, tsdoc: TsdocParsedComment | undefined) => void;
98
+ //# sourceMappingURL=tsdoc_helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsdoc_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/tsdoc_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,iCAAiC,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,MAAM,CAAC,EAAE,KAAK,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IACrD,oCAAoC;IACpC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,6CAA6C;IAC7C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,GACvB,MAAM,EAAE,CAAC,IAAI,EACb,aAAa,EAAE,CAAC,UAAU,KACxB,kBAAkB,GAAG,SAyFvB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,GACtC,aAAa,eAAe,EAC5B,OAAO,kBAAkB,GAAG,SAAS,KACnC,IAmBF,CAAC"}