@ng-prism/core 22.5.0 → 22.7.0-beta.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 (437) hide show
  1. package/README.md +13 -9
  2. package/dist/app/canvas/canvas-bg.styles.d.ts +1 -1
  3. package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -1
  4. package/dist/app/canvas/canvas-bg.styles.js +1 -1
  5. package/dist/app/canvas/canvas-overlay-tokens.d.ts +12 -0
  6. package/dist/app/canvas/canvas-overlay-tokens.d.ts.map +1 -0
  7. package/dist/app/canvas/canvas-overlay-tokens.js +52 -0
  8. package/dist/app/canvas/prism-canvas-bg-pill.component.js +2 -2
  9. package/dist/app/canvas/prism-canvas-pin-row.component.js +2 -2
  10. package/dist/app/canvas/prism-canvas-rulers.component.d.ts +2 -0
  11. package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -1
  12. package/dist/app/canvas/prism-canvas-rulers.component.js +17 -12
  13. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +25 -3
  14. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  15. package/dist/app/canvas/prism-canvas-toolbar.component.js +154 -89
  16. package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
  17. package/dist/app/canvas/prism-template-popover.component.js +16 -7
  18. package/dist/app/canvas/state-chips.d.ts +50 -0
  19. package/dist/app/canvas/state-chips.d.ts.map +1 -0
  20. package/dist/app/canvas/state-chips.js +40 -0
  21. package/dist/app/component-head/head-metrics.d.ts +35 -19
  22. package/dist/app/component-head/head-metrics.d.ts.map +1 -1
  23. package/dist/app/component-head/head-metrics.js +57 -27
  24. package/dist/app/component-head/pipe-facts.d.ts +9 -0
  25. package/dist/app/component-head/pipe-facts.d.ts.map +1 -0
  26. package/dist/app/component-head/pipe-facts.js +15 -0
  27. package/dist/app/component-head/prism-component-head.component.d.ts +20 -22
  28. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  29. package/dist/app/component-head/prism-component-head.component.js +85 -96
  30. package/dist/app/component-head/prism-head-gauge.component.d.ts +8 -12
  31. package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
  32. package/dist/app/component-head/prism-head-gauge.component.js +51 -67
  33. package/dist/app/component-head/prism-head-info.component.d.ts +14 -2
  34. package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
  35. package/dist/app/component-head/prism-head-info.component.js +84 -20
  36. package/dist/app/component-head/prism-stat.component.d.ts +4 -5
  37. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  38. package/dist/app/component-head/prism-stat.component.js +16 -12
  39. package/dist/app/component-head/service-facts.d.ts +8 -0
  40. package/dist/app/component-head/service-facts.d.ts.map +1 -0
  41. package/dist/app/component-head/service-facts.js +11 -0
  42. package/dist/app/controls/boolean-control.component.js +2 -2
  43. package/dist/app/controls/json-control.component.js +2 -2
  44. package/dist/app/controls/union-control.component.js +4 -3
  45. package/dist/app/directives/resize-value.d.ts +1 -1
  46. package/dist/app/directives/resize-value.js +1 -1
  47. package/dist/app/discovery-manifest.d.ts +2 -2
  48. package/dist/app/discovery-manifest.d.ts.map +1 -1
  49. package/dist/app/discovery-manifest.js +15 -3
  50. package/dist/app/header/header-brand.d.ts +25 -0
  51. package/dist/app/header/header-brand.d.ts.map +1 -0
  52. package/dist/app/header/header-brand.js +10 -0
  53. package/dist/app/header/prism-header.component.d.ts +2 -2
  54. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  55. package/dist/app/header/prism-header.component.js +73 -57
  56. package/dist/app/icons/icon-registry.d.ts.map +1 -1
  57. package/dist/app/icons/icon-registry.js +4 -1
  58. package/dist/app/index.d.ts +12 -0
  59. package/dist/app/index.d.ts.map +1 -1
  60. package/dist/app/index.js +12 -1
  61. package/dist/app/layout-menu/prism-layout-menu.component.d.ts +3 -0
  62. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  63. package/dist/app/layout-menu/prism-layout-menu.component.js +72 -58
  64. package/dist/app/overview/open-in-playground.d.ts +19 -0
  65. package/dist/app/overview/open-in-playground.d.ts.map +1 -0
  66. package/dist/app/overview/open-in-playground.js +25 -0
  67. package/dist/app/overview/overview-matrix.d.ts +85 -0
  68. package/dist/app/overview/overview-matrix.d.ts.map +1 -0
  69. package/dist/app/overview/overview-matrix.js +98 -0
  70. package/dist/app/overview/overview-visibility.d.ts +10 -2
  71. package/dist/app/overview/overview-visibility.d.ts.map +1 -1
  72. package/dist/app/overview/overview-visibility.js +14 -3
  73. package/dist/app/overview/prism-overview-cell.component.d.ts +27 -2
  74. package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
  75. package/dist/app/overview/prism-overview-cell.component.js +145 -28
  76. package/dist/app/overview/prism-overview-matrix.component.d.ts +29 -0
  77. package/dist/app/overview/prism-overview-matrix.component.d.ts.map +1 -0
  78. package/dist/app/overview/prism-overview-matrix.component.js +155 -0
  79. package/dist/app/overview/prism-overview.component.d.ts +4 -0
  80. package/dist/app/overview/prism-overview.component.d.ts.map +1 -1
  81. package/dist/app/overview/prism-overview.component.js +37 -14
  82. package/dist/app/page-renderer/prism-page-renderer.component.js +2 -2
  83. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
  84. package/dist/app/panels/a11y/a11y-core.plugin.js +0 -1
  85. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts +1 -4
  86. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
  87. package/dist/app/panels/a11y/a11y-header-badge.component.js +8 -19
  88. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +2 -2
  89. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +1 -0
  90. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  91. package/dist/app/panels/a11y/a11y-overlay-host.component.js +4 -3
  92. package/dist/app/panels/a11y/a11y-panel.component.d.ts +4 -1
  93. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  94. package/dist/app/panels/a11y/a11y-panel.component.js +32 -54
  95. package/dist/app/panels/a11y/a11y-score.component.d.ts +8 -3
  96. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  97. package/dist/app/panels/a11y/a11y-score.component.js +19 -35
  98. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +2 -2
  99. package/dist/app/panels/a11y/a11y-sr.component.js +2 -2
  100. package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
  101. package/dist/app/panels/a11y/a11y-summary.js +8 -1
  102. package/dist/app/panels/a11y/a11y-tree.component.js +2 -2
  103. package/dist/app/panels/a11y/a11y-violations.component.d.ts +23 -2
  104. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  105. package/dist/app/panels/a11y/a11y-violations.component.js +104 -89
  106. package/dist/app/panels/a11y/severity.d.ts +9 -0
  107. package/dist/app/panels/a11y/severity.d.ts.map +1 -0
  108. package/dist/app/panels/a11y/severity.js +12 -0
  109. package/dist/app/panels/controls/controls-plugin.d.ts.map +1 -1
  110. package/dist/app/panels/controls/controls-plugin.js +1 -2
  111. package/dist/app/panels/controls/non-editable-input-types.d.ts +9 -1
  112. package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
  113. package/dist/app/panels/controls/non-editable-input-types.js +18 -0
  114. package/dist/app/panels/controls/prism-controls-panel.component.d.ts +2 -1
  115. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  116. package/dist/app/panels/controls/prism-controls-panel.component.js +77 -59
  117. package/dist/app/panels/events/events-plugin.d.ts.map +1 -1
  118. package/dist/app/panels/events/events-plugin.js +1 -2
  119. package/dist/app/panels/events/prism-events-panel.component.d.ts +2 -0
  120. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  121. package/dist/app/panels/events/prism-events-panel.component.js +20 -7
  122. package/dist/app/panels/events/prism-json-node.utils.d.ts +6 -0
  123. package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
  124. package/dist/app/panels/events/prism-json-node.utils.js +8 -0
  125. package/dist/app/panels/panel-host/addon-panels.d.ts +11 -0
  126. package/dist/app/panels/panel-host/addon-panels.d.ts.map +1 -0
  127. package/dist/app/panels/panel-host/addon-panels.js +12 -0
  128. package/dist/app/panels/panel-host/panel-badge.d.ts +22 -0
  129. package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
  130. package/dist/app/panels/panel-host/panel-badge.js +56 -11
  131. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +4 -1
  132. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  133. package/dist/app/panels/panel-host/prism-panel-host.component.js +36 -70
  134. package/dist/app/pseudo/pseudo-state-marker.d.ts +32 -10
  135. package/dist/app/pseudo/pseudo-state-marker.d.ts.map +1 -1
  136. package/dist/app/pseudo/pseudo-state-marker.js +83 -67
  137. package/dist/app/pseudo/pseudo-targets.d.ts +11 -0
  138. package/dist/app/pseudo/pseudo-targets.d.ts.map +1 -0
  139. package/dist/app/pseudo/pseudo-targets.js +46 -0
  140. package/dist/app/pseudo/state-fit.d.ts +28 -0
  141. package/dist/app/pseudo/state-fit.d.ts.map +1 -0
  142. package/dist/app/pseudo/state-fit.js +97 -0
  143. package/dist/app/renderer/composition.d.ts +20 -0
  144. package/dist/app/renderer/composition.d.ts.map +1 -0
  145. package/dist/app/renderer/composition.js +26 -0
  146. package/dist/app/renderer/input-bindings.d.ts +28 -0
  147. package/dist/app/renderer/input-bindings.d.ts.map +1 -0
  148. package/dist/app/renderer/input-bindings.js +42 -0
  149. package/dist/app/renderer/known-inputs.d.ts +8 -1
  150. package/dist/app/renderer/known-inputs.d.ts.map +1 -1
  151. package/dist/app/renderer/known-inputs.js +13 -5
  152. package/dist/app/renderer/prism-renderer.component.d.ts +18 -4
  153. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  154. package/dist/app/renderer/prism-renderer.component.js +78 -44
  155. package/dist/app/renderer/projectable-content.d.ts +8 -1
  156. package/dist/app/renderer/projectable-content.d.ts.map +1 -1
  157. package/dist/app/renderer/projectable-content.js +40 -29
  158. package/dist/app/renderer/rendered-key.d.ts +20 -6
  159. package/dist/app/renderer/rendered-key.d.ts.map +1 -1
  160. package/dist/app/renderer/rendered-key.js +25 -8
  161. package/dist/app/renderer/snippet-generator.d.ts +14 -2
  162. package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
  163. package/dist/app/renderer/snippet-generator.js +138 -81
  164. package/dist/app/services/navigation-item.d.ts +10 -0
  165. package/dist/app/services/navigation-item.d.ts.map +1 -0
  166. package/dist/app/services/navigation-item.js +20 -0
  167. package/dist/app/services/navigation-item.types.d.ts +8 -0
  168. package/dist/app/services/navigation-item.types.d.ts.map +1 -1
  169. package/dist/app/services/prism-layout.service.d.ts +12 -0
  170. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  171. package/dist/app/services/prism-layout.service.js +17 -7
  172. package/dist/app/services/prism-manifest.service.d.ts +4 -0
  173. package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
  174. package/dist/app/services/prism-manifest.service.js +4 -0
  175. package/dist/app/services/prism-navigation.service.d.ts +12 -0
  176. package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
  177. package/dist/app/services/prism-navigation.service.js +85 -19
  178. package/dist/app/services/prism-panel.service.d.ts +7 -3
  179. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  180. package/dist/app/services/prism-panel.service.js +13 -4
  181. package/dist/app/services/prism-pseudo-state.service.d.ts +59 -14
  182. package/dist/app/services/prism-pseudo-state.service.d.ts.map +1 -1
  183. package/dist/app/services/prism-pseudo-state.service.js +86 -29
  184. package/dist/app/services/prism-renderer.service.d.ts +23 -0
  185. package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
  186. package/dist/app/services/prism-renderer.service.js +77 -8
  187. package/dist/app/services/prism-search.service.d.ts +4 -0
  188. package/dist/app/services/prism-search.service.d.ts.map +1 -1
  189. package/dist/app/services/prism-search.service.js +29 -6
  190. package/dist/app/services/prism-theme.service.d.ts +11 -3
  191. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  192. package/dist/app/services/prism-theme.service.js +27 -19
  193. package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
  194. package/dist/app/services/prism-url-state.service.js +81 -12
  195. package/dist/app/shared/badge.types.d.ts +7 -0
  196. package/dist/app/shared/badge.types.d.ts.map +1 -0
  197. package/dist/app/shared/badge.types.js +9 -0
  198. package/dist/app/shared/brand-mark.d.ts +35 -0
  199. package/dist/app/shared/brand-mark.d.ts.map +1 -0
  200. package/dist/app/shared/brand-mark.js +52 -0
  201. package/dist/app/shared/metric-bar.d.ts +6 -0
  202. package/dist/app/shared/metric-bar.d.ts.map +1 -0
  203. package/dist/app/shared/metric-bar.js +7 -0
  204. package/dist/app/shared/prism-badge.component.d.ts +21 -0
  205. package/dist/app/shared/prism-badge.component.d.ts.map +1 -0
  206. package/dist/app/shared/prism-badge.component.js +68 -0
  207. package/dist/app/shared/prism-button.component.d.ts +12 -0
  208. package/dist/app/shared/prism-button.component.d.ts.map +1 -0
  209. package/dist/app/shared/prism-button.component.js +28 -0
  210. package/dist/app/shared/prism-icon-button.component.d.ts +17 -0
  211. package/dist/app/shared/prism-icon-button.component.d.ts.map +1 -0
  212. package/dist/app/shared/prism-icon-button.component.js +37 -0
  213. package/dist/app/shared/prism-list-row.component.d.ts +17 -0
  214. package/dist/app/shared/prism-list-row.component.d.ts.map +1 -0
  215. package/dist/app/shared/prism-list-row.component.js +57 -0
  216. package/dist/app/shared/prism-logo.component.d.ts +24 -0
  217. package/dist/app/shared/prism-logo.component.d.ts.map +1 -0
  218. package/dist/app/shared/prism-logo.component.js +77 -0
  219. package/dist/app/shared/prism-metric-badge.component.d.ts +9 -4
  220. package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
  221. package/dist/app/shared/prism-metric-badge.component.js +33 -12
  222. package/dist/app/shared/prism-metric-card.component.d.ts +30 -0
  223. package/dist/app/shared/prism-metric-card.component.d.ts.map +1 -0
  224. package/dist/app/shared/prism-metric-card.component.js +111 -0
  225. package/dist/app/shared/prism-panel-toolbar.component.d.ts +13 -0
  226. package/dist/app/shared/prism-panel-toolbar.component.d.ts.map +1 -0
  227. package/dist/app/shared/prism-panel-toolbar.component.js +28 -0
  228. package/dist/app/shared/prism-segmented.component.d.ts +25 -0
  229. package/dist/app/shared/prism-segmented.component.d.ts.map +1 -0
  230. package/dist/app/shared/prism-segmented.component.js +77 -0
  231. package/dist/app/shared/prism-tabs.component.d.ts +44 -0
  232. package/dist/app/shared/prism-tabs.component.d.ts.map +1 -0
  233. package/dist/app/shared/prism-tabs.component.js +134 -0
  234. package/dist/app/shared/roving-focus.d.ts +13 -0
  235. package/dist/app/shared/roving-focus.d.ts.map +1 -0
  236. package/dist/app/shared/roving-focus.js +34 -0
  237. package/dist/app/shell/prism-shell.component.d.ts +13 -0
  238. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  239. package/dist/app/shell/prism-shell.component.js +57 -28
  240. package/dist/app/shell/should-select-first.d.ts +17 -0
  241. package/dist/app/shell/should-select-first.d.ts.map +1 -0
  242. package/dist/app/shell/should-select-first.js +13 -0
  243. package/dist/app/sidebar/navigation-decorations.d.ts +23 -1
  244. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
  245. package/dist/app/sidebar/navigation-decorations.js +33 -2
  246. package/dist/app/sidebar/prism-sidebar.component.d.ts +5 -15
  247. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  248. package/dist/app/sidebar/prism-sidebar.component.js +89 -77
  249. package/dist/app/theme/deprecated-tokens.d.ts +15 -0
  250. package/dist/app/theme/deprecated-tokens.d.ts.map +1 -0
  251. package/dist/app/theme/deprecated-tokens.js +22 -0
  252. package/dist/app/theme/favicon.d.ts +3 -0
  253. package/dist/app/theme/favicon.d.ts.map +1 -0
  254. package/dist/app/theme/favicon.js +3 -0
  255. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  256. package/dist/app/theme/prism-default-theme.js +122 -66
  257. package/dist/app/theme/resolve-theme-tokens.d.ts +29 -0
  258. package/dist/app/theme/resolve-theme-tokens.d.ts.map +1 -0
  259. package/dist/app/theme/resolve-theme-tokens.js +43 -0
  260. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +4 -7
  261. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  262. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +31 -69
  263. package/dist/app/view-tab-bar/next-view-id.d.ts +7 -1
  264. package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -1
  265. package/dist/app/view-tab-bar/next-view-id.js +9 -1
  266. package/dist/app/view-tab-bar/panel-inputs.d.ts +28 -0
  267. package/dist/app/view-tab-bar/panel-inputs.d.ts.map +1 -0
  268. package/dist/app/view-tab-bar/panel-inputs.js +41 -0
  269. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts +2 -3
  270. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
  271. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +9 -9
  272. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts +6 -0
  273. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  274. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +22 -29
  275. package/dist/builder/config-loader/deprecated-options.d.ts +9 -0
  276. package/dist/builder/config-loader/deprecated-options.d.ts.map +1 -0
  277. package/dist/builder/config-loader/deprecated-options.js +34 -0
  278. package/dist/builder/manifest/composition-wrapper.generator.d.ts +14 -0
  279. package/dist/builder/manifest/composition-wrapper.generator.d.ts.map +1 -0
  280. package/dist/builder/manifest/composition-wrapper.generator.js +66 -0
  281. package/dist/builder/manifest/host-parser.d.ts +2 -0
  282. package/dist/builder/manifest/host-parser.d.ts.map +1 -1
  283. package/dist/builder/manifest/host-parser.js +9 -4
  284. package/dist/builder/manifest/manifest-imports.d.ts +34 -0
  285. package/dist/builder/manifest/manifest-imports.d.ts.map +1 -0
  286. package/dist/builder/manifest/manifest-imports.js +91 -0
  287. package/dist/builder/manifest/runtime-manifest.generator.d.ts +13 -0
  288. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
  289. package/dist/builder/manifest/runtime-manifest.generator.js +137 -65
  290. package/dist/builder/manifest/selector-element.d.ts +16 -0
  291. package/dist/builder/manifest/selector-element.d.ts.map +1 -0
  292. package/dist/builder/manifest/selector-element.js +46 -0
  293. package/dist/builder/manifest/template-literal.d.ts +3 -0
  294. package/dist/builder/manifest/template-literal.d.ts.map +1 -0
  295. package/dist/builder/manifest/template-literal.js +4 -0
  296. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
  297. package/dist/builder/plugin-runner/plugin-runner.js +29 -26
  298. package/dist/builder/scanner/api/angular-decorators.d.ts +84 -0
  299. package/dist/builder/scanner/api/angular-decorators.d.ts.map +1 -0
  300. package/dist/builder/scanner/api/angular-decorators.js +157 -0
  301. package/dist/builder/scanner/api/component-api.extractor.d.ts +13 -0
  302. package/dist/builder/scanner/api/component-api.extractor.d.ts.map +1 -0
  303. package/dist/builder/scanner/api/component-api.extractor.js +104 -0
  304. package/dist/builder/scanner/api/doc-tags.d.ts +13 -0
  305. package/dist/builder/scanner/api/doc-tags.d.ts.map +1 -0
  306. package/dist/builder/scanner/api/doc-tags.js +101 -0
  307. package/dist/builder/scanner/api/export-index.d.ts +18 -0
  308. package/dist/builder/scanner/api/export-index.d.ts.map +1 -0
  309. package/dist/builder/scanner/api/export-index.js +22 -0
  310. package/dist/builder/scanner/api/member.extractor.d.ts +90 -0
  311. package/dist/builder/scanner/api/member.extractor.d.ts.map +1 -0
  312. package/dist/builder/scanner/api/member.extractor.js +270 -0
  313. package/dist/builder/scanner/api/pipe-api.extractor.d.ts +12 -0
  314. package/dist/builder/scanner/api/pipe-api.extractor.d.ts.map +1 -0
  315. package/dist/builder/scanner/api/pipe-api.extractor.js +52 -0
  316. package/dist/builder/scanner/api/service-api.extractor.d.ts +14 -0
  317. package/dist/builder/scanner/api/service-api.extractor.d.ts.map +1 -0
  318. package/dist/builder/scanner/api/service-api.extractor.js +119 -0
  319. package/dist/builder/scanner/api/setup.reader.d.ts +26 -0
  320. package/dist/builder/scanner/api/setup.reader.d.ts.map +1 -0
  321. package/dist/builder/scanner/api/setup.reader.js +89 -0
  322. package/dist/builder/scanner/api/type-collector.d.ts +24 -0
  323. package/dist/builder/scanner/api/type-collector.d.ts.map +1 -0
  324. package/dist/builder/scanner/api/type-collector.js +211 -0
  325. package/dist/builder/scanner/ast-utils.d.ts +8 -0
  326. package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
  327. package/dist/builder/scanner/ast-utils.js +37 -1
  328. package/dist/builder/scanner/class-hierarchy.d.ts +5 -3
  329. package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -1
  330. package/dist/builder/scanner/class-hierarchy.js +12 -6
  331. package/dist/builder/scanner/component.scanner.d.ts +60 -6
  332. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  333. package/dist/builder/scanner/component.scanner.js +229 -58
  334. package/dist/builder/scanner/composition/compose-template.d.ts +36 -0
  335. package/dist/builder/scanner/composition/compose-template.d.ts.map +1 -0
  336. package/dist/builder/scanner/composition/compose-template.js +187 -0
  337. package/dist/builder/scanner/composition/declarables.d.ts +54 -0
  338. package/dist/builder/scanner/composition/declarables.d.ts.map +1 -0
  339. package/dist/builder/scanner/composition/declarables.js +182 -0
  340. package/dist/builder/scanner/composition/match-declarables.d.ts +43 -0
  341. package/dist/builder/scanner/composition/match-declarables.d.ts.map +1 -0
  342. package/dist/builder/scanner/composition/match-declarables.js +131 -0
  343. package/dist/builder/scanner/composition/read-composition.d.ts +77 -0
  344. package/dist/builder/scanner/composition/read-composition.d.ts.map +1 -0
  345. package/dist/builder/scanner/composition/read-composition.js +302 -0
  346. package/dist/builder/scanner/composition/template-elements.d.ts +12 -0
  347. package/dist/builder/scanner/composition/template-elements.d.ts.map +1 -0
  348. package/dist/builder/scanner/composition/template-elements.js +41 -0
  349. package/dist/builder/scanner/entry-point-discovery.d.ts +5 -0
  350. package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -1
  351. package/dist/builder/scanner/entry-point-discovery.js +14 -0
  352. package/dist/builder/scanner/entry-point.scanner.d.ts +3 -1
  353. package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -1
  354. package/dist/builder/scanner/entry-point.scanner.js +7 -6
  355. package/dist/builder/scanner/index.d.ts +4 -0
  356. package/dist/builder/scanner/index.d.ts.map +1 -1
  357. package/dist/builder/scanner/index.js +2 -0
  358. package/dist/builder/scanner/input.extractor.d.ts +31 -2
  359. package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
  360. package/dist/builder/scanner/input.extractor.js +73 -17
  361. package/dist/builder/scanner/pipe.scanner.d.ts +29 -0
  362. package/dist/builder/scanner/pipe.scanner.d.ts.map +1 -0
  363. package/dist/builder/scanner/pipe.scanner.js +65 -0
  364. package/dist/builder/scanner/pseudo-states.d.ts +1 -0
  365. package/dist/builder/scanner/pseudo-states.d.ts.map +1 -1
  366. package/dist/builder/scanner/pseudo-states.js +1 -1
  367. package/dist/builder/scanner/scanner.d.ts +27 -3
  368. package/dist/builder/scanner/scanner.d.ts.map +1 -1
  369. package/dist/builder/scanner/scanner.js +68 -24
  370. package/dist/builder/scanner/service/angular-decorators.d.ts +80 -0
  371. package/dist/builder/scanner/service/angular-decorators.d.ts.map +1 -0
  372. package/dist/builder/scanner/service/angular-decorators.js +154 -0
  373. package/dist/builder/scanner/service/doc-tags.d.ts +13 -0
  374. package/dist/builder/scanner/service/doc-tags.d.ts.map +1 -0
  375. package/dist/builder/scanner/service/doc-tags.js +97 -0
  376. package/dist/builder/scanner/service/export-index.d.ts +18 -0
  377. package/dist/builder/scanner/service/export-index.d.ts.map +1 -0
  378. package/dist/builder/scanner/service/export-index.js +22 -0
  379. package/dist/builder/scanner/service/member.extractor.d.ts +65 -0
  380. package/dist/builder/scanner/service/member.extractor.d.ts.map +1 -0
  381. package/dist/builder/scanner/service/member.extractor.js +216 -0
  382. package/dist/builder/scanner/service/pipe-api.extractor.d.ts +12 -0
  383. package/dist/builder/scanner/service/pipe-api.extractor.d.ts.map +1 -0
  384. package/dist/builder/scanner/service/pipe-api.extractor.js +72 -0
  385. package/dist/builder/scanner/service/service-api.extractor.d.ts +14 -0
  386. package/dist/builder/scanner/service/service-api.extractor.d.ts.map +1 -0
  387. package/dist/builder/scanner/service/service-api.extractor.js +119 -0
  388. package/dist/builder/scanner/service/setup.reader.d.ts +26 -0
  389. package/dist/builder/scanner/service/setup.reader.d.ts.map +1 -0
  390. package/dist/builder/scanner/service/setup.reader.js +89 -0
  391. package/dist/builder/scanner/service/type-collector.d.ts +23 -0
  392. package/dist/builder/scanner/service/type-collector.d.ts.map +1 -0
  393. package/dist/builder/scanner/service/type-collector.js +210 -0
  394. package/dist/builder/scanner/service.scanner.d.ts +26 -0
  395. package/dist/builder/scanner/service.scanner.d.ts.map +1 -0
  396. package/dist/builder/scanner/service.scanner.js +61 -0
  397. package/dist/builder/scanner/showcase-diagnostics.d.ts +60 -1
  398. package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -1
  399. package/dist/builder/scanner/showcase-diagnostics.js +123 -10
  400. package/dist/builder/scanner/showcase-states.d.ts +17 -0
  401. package/dist/builder/scanner/showcase-states.d.ts.map +1 -0
  402. package/dist/builder/scanner/showcase-states.js +58 -0
  403. package/dist/builder/scanner/source-file-cache.d.ts +26 -0
  404. package/dist/builder/scanner/source-file-cache.d.ts.map +1 -0
  405. package/dist/builder/scanner/source-file-cache.js +60 -0
  406. package/dist/builder/shared/prism-pipeline.d.ts +6 -0
  407. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  408. package/dist/builder/shared/prism-pipeline.js +71 -18
  409. package/dist/decorator/index.d.ts +1 -1
  410. package/dist/decorator/index.d.ts.map +1 -1
  411. package/dist/decorator/showcase.types.d.ts +102 -9
  412. package/dist/decorator/showcase.types.d.ts.map +1 -1
  413. package/dist/plugin/index.d.ts +6 -1
  414. package/dist/plugin/index.d.ts.map +1 -1
  415. package/dist/plugin/index.js +4 -0
  416. package/dist/plugin/pipe.types.d.ts +36 -0
  417. package/dist/plugin/pipe.types.d.ts.map +1 -0
  418. package/dist/plugin/pipe.types.js +1 -0
  419. package/dist/plugin/plugin.types.d.ts +184 -8
  420. package/dist/plugin/plugin.types.d.ts.map +1 -1
  421. package/dist/plugin/service.types.d.ts +124 -0
  422. package/dist/plugin/service.types.d.ts.map +1 -0
  423. package/dist/plugin/service.types.js +1 -0
  424. package/dist/plugin/status.d.ts +27 -0
  425. package/dist/plugin/status.d.ts.map +1 -0
  426. package/dist/plugin/status.js +26 -0
  427. package/dist/shared/composition.d.ts +30 -0
  428. package/dist/shared/composition.d.ts.map +1 -0
  429. package/dist/shared/composition.js +29 -0
  430. package/dist/shared/pseudo-state.type.d.ts +2 -1
  431. package/dist/shared/pseudo-state.type.d.ts.map +1 -1
  432. package/dist/shared/void-elements.d.ts +3 -0
  433. package/dist/shared/void-elements.d.ts.map +1 -0
  434. package/dist/shared/void-elements.js +2 -0
  435. package/package.json +1 -1
  436. package/src/builder/build/schema.json +6 -6
  437. package/src/builder/serve/schema.json +6 -6
@@ -0,0 +1,72 @@
1
+ import ts from 'typescript';
2
+ import { getClassChain } from '../class-hierarchy.js';
3
+ import { isDocumented, readDescription, readDocTags } from './doc-tags.js';
4
+ import { extractMethod } from './member.extractor.js';
5
+ import { describeSetupEntries } from './service-api.extractor.js';
6
+ import { createTypeCollector } from './type-collector.js';
7
+ /**
8
+ * What the API page of a pipe shows: the description and tags of the class,
9
+ * the signatures of `transform()`, its setup functions and tokens with their
10
+ * config tables, and every documented type all of them reach. A template only
11
+ * calls `transform()`: no other member is read, and none adds a type.
12
+ */
13
+ export function extractPipeApi(classDecl, setupRefs, checker, exportIndex) {
14
+ const collector = createTypeCollector(checker, exportIndex);
15
+ const transform = extractTransform(classDecl, checker, collector);
16
+ const setup = describeSetupEntries(setupRefs, checker, collector);
17
+ const api = { tags: readDocTags(classDecl), transform, setup, types: collector.drain() };
18
+ // The class's own block only: unlike a member, a pipe does not take the description of its base class.
19
+ const description = readDescription(classDecl);
20
+ if (description)
21
+ api.description = description;
22
+ return api;
23
+ }
24
+ /**
25
+ * The signatures of `transform()` in the nearest class that declares it,
26
+ * which may be a base class that only exists as a declaration, such as
27
+ * `DatePipe` in the .d.ts of `@angular/common`: its overload signatures, or
28
+ * the one declaration when there are none. The implementation of overloads is
29
+ * not one a template can call. In a .d.ts every declaration is a signature.
30
+ *
31
+ * A signature without a doc block of its own takes the one of the
32
+ * implementation, then of the first documented signature of the same class,
33
+ * then of the first documented `transform()` of the nearest base class that has one.
34
+ * The implementation and a base class document the method as a whole, so all
35
+ * of their block is taken. Another signature's block is about that signature:
36
+ * its description and `@param` texts are taken, its tags are not, since an
37
+ * overload marked `@deprecated` does not deprecate the one that replaces it.
38
+ */
39
+ function extractTransform(classDecl, checker, types) {
40
+ const levels = getClassChain(classDecl, checker).map(getTransformDeclarations);
41
+ const level = levels.findIndex((declarations) => declarations.length > 0);
42
+ if (level < 0)
43
+ return [];
44
+ const declarations = levels[level];
45
+ const signatures = declarations.filter((declaration) => !declaration.body);
46
+ const implementation = declarations.find((declaration) => declaration.body && isDocumented(declaration));
47
+ const sibling = signatures.find(isDocumented);
48
+ const fallback = implementation ?? sibling ?? findInheritedDocs(levels.slice(level + 1));
49
+ return (signatures.length > 0 ? signatures : declarations).map((signature) => {
50
+ const docs = isDocumented(signature) ? signature : (fallback ?? signature);
51
+ const method = extractMethod('transform', signature, docs, checker, types);
52
+ if (docs !== signature && docs === sibling)
53
+ method.tags = {};
54
+ return method;
55
+ });
56
+ }
57
+ /** The instance declarations of `transform()` in a class, in source order: the overload signatures and the implementation. */
58
+ function getTransformDeclarations(classDecl) {
59
+ return classDecl.members.filter((member) => ts.isMethodDeclaration(member) &&
60
+ (ts.isIdentifier(member.name) || ts.isStringLiteral(member.name)) &&
61
+ member.name.text === 'transform' &&
62
+ !ts.getModifiers(member)?.some((modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword));
63
+ }
64
+ /** The first documented `transform()` declaration in the nearest of the given base classes that has one. */
65
+ function findInheritedDocs(levels) {
66
+ for (const declarations of levels) {
67
+ const documented = declarations.find(isDocumented);
68
+ if (documented)
69
+ return documented;
70
+ }
71
+ return undefined;
72
+ }
@@ -0,0 +1,14 @@
1
+ import ts from 'typescript';
2
+ import type { ApiSetupEntry, ServiceApi } from '../../../plugin/service.types.js';
3
+ import type { ExportIndex } from './export-index.js';
4
+ import { type SetupRef } from './setup.reader.js';
5
+ import { type TypeCollector } from './type-collector.js';
6
+ /**
7
+ * What the API page of a service shows: the description and tags of the
8
+ * class, its public members, its setup functions and tokens with their config
9
+ * tables, and every documented type all of them reach.
10
+ */
11
+ export declare function extractServiceApi(classDecl: ts.ClassDeclaration, setupRefs: SetupRef[], checker: ts.TypeChecker, exportIndex: ExportIndex): ServiceApi;
12
+ /** The setup functions and tokens of a service or a pipe, with their config tables; the types they reach go to `collector`. */
13
+ export declare function describeSetupEntries(setupRefs: SetupRef[], checker: ts.TypeChecker, collector: TypeCollector): ApiSetupEntry[];
14
+ //# sourceMappingURL=service-api.extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-api.extractor.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/service/service-api.extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAe,aAAa,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,KAAK,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAK9E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,UAAU,CAUtJ;AAED,+HAA+H;AAC/H,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,GAAG,aAAa,EAAE,CAE9H"}
@@ -0,0 +1,119 @@
1
+ import ts from 'typescript';
2
+ import { readDescription, readDocTags } from './doc-tags.js';
3
+ import { extractMembers, extractMethod, extractObjectTypeMembers, firstParameter } from './member.extractor.js';
4
+ import { skipParentheses } from './setup.reader.js';
5
+ import { createTypeCollector } from './type-collector.js';
6
+ /** The wrappers a config table looks through. */
7
+ const CONFIG_WRAPPERS = new Set(['Partial', 'Required', 'Readonly']);
8
+ /**
9
+ * What the API page of a service shows: the description and tags of the
10
+ * class, its public members, its setup functions and tokens with their config
11
+ * tables, and every documented type all of them reach.
12
+ */
13
+ export function extractServiceApi(classDecl, setupRefs, checker, exportIndex) {
14
+ const collector = createTypeCollector(checker, exportIndex);
15
+ const { properties, methods } = extractMembers(classDecl, checker, collector);
16
+ const setup = describeSetupEntries(setupRefs, checker, collector);
17
+ const api = { tags: readDocTags(classDecl), properties, methods, setup, types: collector.drain() };
18
+ const description = readDescription(classDecl);
19
+ if (description)
20
+ api.description = description;
21
+ return api;
22
+ }
23
+ /** The setup functions and tokens of a service or a pipe, with their config tables; the types they reach go to `collector`. */
24
+ export function describeSetupEntries(setupRefs, checker, collector) {
25
+ return setupRefs.map((ref) => (ref.kind === 'function' ? describeSetupFunction(ref, checker, collector) : describeSetupToken(ref, checker, collector)));
26
+ }
27
+ /** A setup function: its signature and docs, and the options of its first parameter when that is an object. */
28
+ function describeSetupFunction({ name, declaration, importPath }, checker, collector) {
29
+ const fn = ts.isFunctionDeclaration(declaration) ? declaration : skipParentheses(declaration.initializer);
30
+ const { params, returnType, description, tags } = extractMethod(name, fn, docNodeOf(declaration), checker, collector);
31
+ const entry = { name, kind: 'function', importPath, tags, params, returnType };
32
+ const param = firstParameter(fn);
33
+ const config = param && readConfig(param.type, checker.getTypeAtLocation(param), checker, collector.within(params[0].name));
34
+ if (description)
35
+ entry.description = description;
36
+ if (config)
37
+ entry.config = config;
38
+ return entry;
39
+ }
40
+ /** A token: `InjectionToken<T>` as written, and the options of `T` when that is an object. */
41
+ function describeSetupToken({ name, declaration, importPath }, checker, collector) {
42
+ // A token is always a `const`: the setup reader takes no other declaration for one.
43
+ const variable = declaration;
44
+ const typeNode = variable.type;
45
+ const type = checker.getTypeAtLocation(variable.name);
46
+ const docs = docNodeOf(variable);
47
+ const entry = {
48
+ name,
49
+ kind: 'token',
50
+ importPath,
51
+ tags: readDocTags(docs),
52
+ tokenType: collector.ref(typeNode, type, `type of ${name}`, { kind: 'property', name })
53
+ };
54
+ const argumentNode = typeNode && ts.isTypeReferenceNode(typeNode) ? typeNode.typeArguments?.[0] : undefined;
55
+ const argument = argumentNode ? checker.getTypeFromTypeNode(argumentNode) : isTypeReference(type) ? checker.getTypeArguments(type)[0] : undefined;
56
+ const config = argument && readConfig(argumentNode, argument, checker, collector.within(name));
57
+ const description = readDescription(docs);
58
+ if (description)
59
+ entry.description = description;
60
+ if (config)
61
+ entry.config = config;
62
+ return entry;
63
+ }
64
+ /** The doc block of a `const` sits on its statement, not on the declaration. */
65
+ function docNodeOf(declaration) {
66
+ return ts.isVariableDeclaration(declaration) && ts.isVariableStatement(declaration.parent.parent) ? declaration.parent.parent : declaration;
67
+ }
68
+ /**
69
+ * The options of a config object: the properties of an interface, an object
70
+ * literal type or an object type alias, looked for through `Partial`,
71
+ * `Required` and `Readonly`, which change what the options say. `undefined`
72
+ * for anything else, a class or an array or a primitive.
73
+ */
74
+ function readConfig(typeNode, type, checker, types) {
75
+ const wrappers = [];
76
+ let node = typeNode;
77
+ // The type as annotated: the parameter's own type has `undefined` in it when the parameter is optional.
78
+ let current = node ? checker.getTypeFromTypeNode(node) : checker.getNonNullableType(type);
79
+ // Through the annotation where there is one, through the alias the checker keeps otherwise.
80
+ for (;;) {
81
+ if (node && ts.isTypeReferenceNode(node) && ts.isIdentifier(node.typeName) && CONFIG_WRAPPERS.has(node.typeName.text) && node.typeArguments?.length === 1) {
82
+ wrappers.push(node.typeName.text);
83
+ node = node.typeArguments[0];
84
+ current = checker.getTypeFromTypeNode(node);
85
+ }
86
+ else if (!node && current.aliasSymbol && CONFIG_WRAPPERS.has(current.aliasSymbol.name) && current.aliasTypeArguments?.length === 1) {
87
+ wrappers.push(current.aliasSymbol.name);
88
+ current = current.aliasTypeArguments[0];
89
+ }
90
+ else {
91
+ break;
92
+ }
93
+ }
94
+ if (!isConfigObject(current, checker))
95
+ return undefined;
96
+ const { properties } = extractObjectTypeMembers(current, checker, types);
97
+ // The innermost wrapper first: `Partial<Required<T>>` leaves every option optional.
98
+ for (const wrapper of wrappers.reverse())
99
+ properties.forEach((option) => applyWrapper(wrapper, option));
100
+ return properties.length > 0 ? properties : undefined;
101
+ }
102
+ function applyWrapper(wrapper, option) {
103
+ if (wrapper === 'Partial')
104
+ option.optional = true;
105
+ else if (wrapper === 'Required')
106
+ delete option.optional;
107
+ else
108
+ option.readonly = true;
109
+ }
110
+ function isConfigObject(type, checker) {
111
+ if (type.isIntersection())
112
+ return type.types.every((part) => isConfigObject(part, checker));
113
+ if (!(type.flags & ts.TypeFlags.Object) || type.objectFlags & ts.ObjectFlags.Class)
114
+ return false;
115
+ return !checker.isArrayType(type) && !checker.isTupleType(type) && type.getCallSignatures().length === 0;
116
+ }
117
+ function isTypeReference(type) {
118
+ return !!(type.flags & ts.TypeFlags.Object) && !!(type.objectFlags & ts.ObjectFlags.Reference);
119
+ }
@@ -0,0 +1,26 @@
1
+ import ts from 'typescript';
2
+ import type { ExportIndex } from './export-index.js';
3
+ /** One entry of a service's `setup`: what the styleguide shows to configure the service, and where to import it from. */
4
+ export interface SetupRef {
5
+ name: string;
6
+ kind: 'function' | 'token';
7
+ declaration: ts.FunctionDeclaration | ts.VariableDeclaration;
8
+ importPath: string;
9
+ }
10
+ /** Only the literal: a `setup` that arrives through a spread or a constant is not found, and dropped without a word. */
11
+ export declare function findSetupProperty(showcaseArg: ts.Expression): ts.ObjectLiteralElementLike | undefined;
12
+ /**
13
+ * Read the functions and tokens a service names in `setup: () => [provideToast, TOAST_LABELS]`.
14
+ *
15
+ * `setup` is an arrow function, not an array, so that the imports it refers to
16
+ * are only touched when it runs: a showcase file that imports from a module
17
+ * which imports the service back would otherwise hit the temporal dead zone.
18
+ * The scanner never runs it. It reads the array literal in the source and
19
+ * traces each element to its declaration, and to the entry point that exports it.
20
+ *
21
+ * What cannot be read is reported and dropped: a `setup` of another shape as a
22
+ * whole, any other entry on its own.
23
+ */
24
+ export declare function readSetupRefs(showcaseArg: ts.Expression, className: string, checker: ts.TypeChecker, exportIndex: ExportIndex, report: (message: string) => void): SetupRef[];
25
+ export declare function skipParentheses(expression: ts.Expression): ts.Expression;
26
+ //# sourceMappingURL=setup.reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.reader.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/service/setup.reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,yHAAyH;AACzH,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3B,WAAW,EAAE,EAAE,CAAC,mBAAmB,GAAG,EAAE,CAAC,mBAAmB,CAAC;IAC7D,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,wHAAwH;AACxH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,wBAAwB,GAAG,SAAS,CAIrG;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CACzB,WAAW,EAAE,EAAE,CAAC,UAAU,EAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAClC,QAAQ,EAAE,CAkCZ;AAaD,wBAAgB,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAKxE"}
@@ -0,0 +1,89 @@
1
+ import ts from 'typescript';
2
+ import { describeInvalidSetup, describeSetupEntryNotExported, describeSetupEntryNotSupported } from '../showcase-diagnostics.js';
3
+ /** Only the literal: a `setup` that arrives through a spread or a constant is not found, and dropped without a word. */
4
+ export function findSetupProperty(showcaseArg) {
5
+ if (!ts.isObjectLiteralExpression(showcaseArg))
6
+ return undefined;
7
+ return showcaseArg.properties.find((p) => p.name !== undefined && (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) && p.name.text === 'setup');
8
+ }
9
+ /**
10
+ * Read the functions and tokens a service names in `setup: () => [provideToast, TOAST_LABELS]`.
11
+ *
12
+ * `setup` is an arrow function, not an array, so that the imports it refers to
13
+ * are only touched when it runs: a showcase file that imports from a module
14
+ * which imports the service back would otherwise hit the temporal dead zone.
15
+ * The scanner never runs it. It reads the array literal in the source and
16
+ * traces each element to its declaration, and to the entry point that exports it.
17
+ *
18
+ * What cannot be read is reported and dropped: a `setup` of another shape as a
19
+ * whole, any other entry on its own.
20
+ */
21
+ export function readSetupRefs(showcaseArg, className, checker, exportIndex, report) {
22
+ const property = findSetupProperty(showcaseArg);
23
+ if (!property)
24
+ return [];
25
+ const array = ts.isPropertyAssignment(property) ? readSetupArray(property.initializer) : undefined;
26
+ if (!array) {
27
+ report(describeInvalidSetup(className, ts.isPropertyAssignment(property) ? property.initializer : property));
28
+ return [];
29
+ }
30
+ const refs = [];
31
+ array.elements.forEach((element, index) => {
32
+ const symbol = resolveEntry(element, checker);
33
+ const target = symbol && classifyEntry(symbol, checker);
34
+ if (!symbol || !target) {
35
+ report(describeSetupEntryNotSupported(className, index, element));
36
+ return;
37
+ }
38
+ const importPath = exportIndex.get(symbol);
39
+ if (importPath === undefined) {
40
+ report(describeSetupEntryNotExported(className, index, element));
41
+ return;
42
+ }
43
+ refs.push({ name: symbol.name, ...target, importPath });
44
+ });
45
+ return refs;
46
+ }
47
+ /** The array literal an arrow function returns, as an expression body or as the only statement of a block. */
48
+ function readSetupArray(initializer) {
49
+ if (!ts.isArrowFunction(initializer))
50
+ return undefined;
51
+ const { body } = initializer;
52
+ const returned = ts.isBlock(body) ? (body.statements.length === 1 && ts.isReturnStatement(body.statements[0]) ? body.statements[0].expression : undefined) : body;
53
+ const value = returned && skipParentheses(returned);
54
+ return value && ts.isArrayLiteralExpression(value) ? value : undefined;
55
+ }
56
+ export function skipParentheses(expression) {
57
+ let current = expression;
58
+ while (ts.isParenthesizedExpression(current))
59
+ current = current.expression;
60
+ return current;
61
+ }
62
+ /**
63
+ * The declaration symbol an entry refers to, with an import followed to its
64
+ * source: the symbol the export index holds. Only a name or a property access
65
+ * (`toasts.provideToast`) can refer to one; a call or a spread cannot.
66
+ */
67
+ function resolveEntry(element, checker) {
68
+ if (!ts.isIdentifier(element) && !ts.isPropertyAccessExpression(element))
69
+ return undefined;
70
+ const symbol = checker.getSymbolAtLocation(element);
71
+ if (!symbol)
72
+ return undefined;
73
+ // A declaration that is exported from its own file is a local symbol there, and the export symbol is the one that is indexed.
74
+ return checker.getExportSymbolOfSymbol(symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol);
75
+ }
76
+ function classifyEntry(symbol, checker) {
77
+ for (const declaration of symbol.declarations ?? []) {
78
+ if (ts.isFunctionDeclaration(declaration))
79
+ return { kind: 'function', declaration };
80
+ if (!ts.isVariableDeclaration(declaration) || !(ts.getCombinedNodeFlags(declaration) & ts.NodeFlags.Const))
81
+ continue;
82
+ const initializer = declaration.initializer && skipParentheses(declaration.initializer);
83
+ if (initializer && (ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)))
84
+ return { kind: 'function', declaration };
85
+ if (checker.getTypeAtLocation(declaration.name).getSymbol()?.name === 'InjectionToken')
86
+ return { kind: 'token', declaration };
87
+ }
88
+ return undefined;
89
+ }
@@ -0,0 +1,23 @@
1
+ import ts from 'typescript';
2
+ import type { ApiTypeDoc } from '../../../plugin/service.types.js';
3
+ import type { ExportIndex } from './export-index.js';
4
+ import { type TypeRefResolver } from './member.extractor.js';
5
+ /** A {@link TypeRefResolver} that links the documented types it meets and collects them for `ServiceApi.types`. */
6
+ export interface TypeCollector extends TypeRefResolver {
7
+ /** A resolver for the members of the value at `path`, e.g. the options of a setup function's `config`. */
8
+ within(path: string): TypeRefResolver;
9
+ /** Documents what was reached so far, and what their members reach in turn, in the order of first reach. */
10
+ drain(): ApiTypeDoc[];
11
+ }
12
+ /**
13
+ * Collects the types a service's API reaches. A type is documented when it is
14
+ * an interface, class, type alias or enum, a scanned entry point exports it,
15
+ * and it is not tagged `@internal`. Anything else, `Signal` or `Provider` or a
16
+ * type the library keeps to itself, stays text without a link.
17
+ *
18
+ * Each type is documented once, under the id it got when it was first
19
+ * reached: its name, or `${name}@${importPath}` when a type of that name was
20
+ * reached before. That also ends a type that refers to itself.
21
+ */
22
+ export declare function createTypeCollector(checker: ts.TypeChecker, exportIndex: ExportIndex): TypeCollector;
23
+ //# sourceMappingURL=type-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-collector.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/service/type-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAA0B,UAAU,EAAc,MAAM,kCAAkC,CAAC;AAEvG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAA8E,KAAK,eAAe,EAAiB,MAAM,uBAAuB,CAAC;AAexJ,mHAAmH;AACnH,MAAM,WAAW,aAAc,SAAQ,eAAe;IAClD,0GAA0G;IAC1G,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,4GAA4G;IAC5G,KAAK,IAAI,UAAU,EAAE,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,GAAG,aAAa,CAqGpG"}
@@ -0,0 +1,210 @@
1
+ import ts from 'typescript';
2
+ import { isInternal, readDescription, readDocTags } from './doc-tags.js';
3
+ import { collapseWhitespace, extractMembers, extractObjectTypeMembers, readTypeText } from './member.extractor.js';
4
+ /**
5
+ * Collects the types a service's API reaches. A type is documented when it is
6
+ * an interface, class, type alias or enum, a scanned entry point exports it,
7
+ * and it is not tagged `@internal`. Anything else, `Signal` or `Provider` or a
8
+ * type the library keeps to itself, stays text without a link.
9
+ *
10
+ * Each type is documented once, under the id it got when it was first
11
+ * reached: its name, or `${name}@${importPath}` when a type of that name was
12
+ * reached before. That also ends a type that refers to itself.
13
+ */
14
+ export function createTypeCollector(checker, exportIndex) {
15
+ /** Every symbol met so far: what it was reached as, or `null` when it is not documented. */
16
+ const reached = new Map();
17
+ const ids = new Set();
18
+ const queue = [];
19
+ const docs = [];
20
+ function collect(typeNode, type, reachedFrom, path) {
21
+ const links = [];
22
+ const visit = (symbol) => {
23
+ const target = reach(symbol, reachedFrom, path);
24
+ if (target && !links.includes(target.id))
25
+ links.push(target.id);
26
+ };
27
+ if (typeNode)
28
+ forEachReferenceInNode(typeNode, checker, visit);
29
+ else
30
+ forEachReferenceInType(type, checker, visit, new Set());
31
+ const text = readTypeText(checker, typeNode, type);
32
+ return links.length > 0 ? { text, links } : { text };
33
+ }
34
+ function reach(symbol, reachedFrom, path) {
35
+ const target = resolveSymbol(symbol, checker);
36
+ const known = reached.get(target);
37
+ if (known !== undefined)
38
+ return known ?? undefined;
39
+ const declaration = target.declarations?.find(isDocumentedKind);
40
+ const importPath = exportIndex.get(target);
41
+ if (!declaration || importPath === undefined || isInternal(declaration)) {
42
+ reached.set(target, null);
43
+ return undefined;
44
+ }
45
+ const id = ids.has(target.name) ? `${target.name}@${importPath}` : target.name;
46
+ const entry = { id, symbol: target, declaration, importPath, reachedFrom, path: path ?? target.name };
47
+ ids.add(id);
48
+ reached.set(target, entry);
49
+ queue.push(entry);
50
+ return entry;
51
+ }
52
+ function within(owner) {
53
+ return {
54
+ ref(typeNode, type, reachedFrom, site) {
55
+ switch (site?.kind) {
56
+ case 'property':
57
+ return collect(typeNode, type, `via ${owner}.${site.name}`, `${owner}.${site.name}`);
58
+ case 'parameter':
59
+ return collect(typeNode, type, `parameter of ${owner}.${site.method}()`, site.name);
60
+ case 'return':
61
+ return collect(typeNode, type, `returned by ${owner}.${site.method}()`, `${owner}.${site.method}()`);
62
+ default:
63
+ return collect(typeNode, type, `via ${owner}`, owner);
64
+ }
65
+ }
66
+ };
67
+ }
68
+ function describe({ id, symbol, declaration, importPath, reachedFrom, path }) {
69
+ const doc = { id, name: symbol.name, kind: kindOf(declaration), importPath, tags: readDocTags(declaration) };
70
+ const description = readDescription(declaration);
71
+ const members = within(path);
72
+ if (description)
73
+ doc.description = description;
74
+ if (ts.isClassDeclaration(declaration)) {
75
+ assignMembers(doc, extractMembers(declaration, checker, members));
76
+ }
77
+ else if (ts.isInterfaceDeclaration(declaration)) {
78
+ assignMembers(doc, extractObjectTypeMembers(checker.getDeclaredTypeOfSymbol(symbol), checker, members));
79
+ }
80
+ else if (ts.isEnumDeclaration(declaration)) {
81
+ doc.members = declaration.members.filter((member) => !isInternal(member)).map((member) => describeEnumMember(member, checker));
82
+ }
83
+ else if (isLiteralUnion(declaration.type)) {
84
+ doc.union = declaration.type.types.map((member) => member.getText());
85
+ }
86
+ else if (ts.isTypeLiteralNode(declaration.type)) {
87
+ assignMembers(doc, extractObjectTypeMembers(checker.getDeclaredTypeOfSymbol(symbol), checker, members));
88
+ }
89
+ else {
90
+ // The text has no links of its own, but the types it names are reached all the same.
91
+ doc.text = collect(declaration.type, checker.getDeclaredTypeOfSymbol(symbol), `via ${path}`, path).text;
92
+ }
93
+ doc.reachedFrom = reachedFrom;
94
+ return doc;
95
+ }
96
+ return {
97
+ ref: (typeNode, type, reachedFrom, site) => collect(typeNode, type, reachedFrom, site && pathOf(site)),
98
+ within,
99
+ drain() {
100
+ // Describing a type reaches the types of its members, which join the queue behind it.
101
+ while (docs.length < queue.length)
102
+ docs.push(describe(queue[docs.length]));
103
+ return [...docs];
104
+ }
105
+ };
106
+ }
107
+ /** The value a type at the top level is the type of: a property, a parameter by its name, or `show()` for a return value. */
108
+ function pathOf(site) {
109
+ return site.kind === 'return' ? `${site.method}()` : site.name;
110
+ }
111
+ /**
112
+ * The declaration a reference ends at: an import followed to its source, the
113
+ * export symbol of a declaration exported from its own file, an enum for one
114
+ * of its members. That is the symbol the export index holds.
115
+ */
116
+ function resolveSymbol(symbol, checker) {
117
+ let target = symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;
118
+ if (target.flags & ts.SymbolFlags.EnumMember && target.valueDeclaration && ts.isEnumDeclaration(target.valueDeclaration.parent)) {
119
+ target = checker.getSymbolAtLocation(target.valueDeclaration.parent.name) ?? target;
120
+ }
121
+ return checker.getExportSymbolOfSymbol(target);
122
+ }
123
+ function isDocumentedKind(declaration) {
124
+ return ts.isInterfaceDeclaration(declaration) || ts.isClassDeclaration(declaration) || ts.isTypeAliasDeclaration(declaration) || ts.isEnumDeclaration(declaration);
125
+ }
126
+ function kindOf(declaration) {
127
+ if (ts.isInterfaceDeclaration(declaration))
128
+ return 'interface';
129
+ if (ts.isClassDeclaration(declaration))
130
+ return 'class';
131
+ if (ts.isEnumDeclaration(declaration))
132
+ return 'enum';
133
+ return 'type';
134
+ }
135
+ /** `'top-left' | 'top-right'`, `1 | 2` or `true | null`: a union of literals only. */
136
+ function isLiteralUnion(node) {
137
+ return ts.isUnionTypeNode(node) && node.types.every(ts.isLiteralTypeNode);
138
+ }
139
+ function assignMembers(doc, { properties, methods }) {
140
+ if (properties.length > 0)
141
+ doc.properties = properties;
142
+ if (methods.length > 0)
143
+ doc.methods = methods;
144
+ }
145
+ /** The initializer as written, or the value TypeScript counts up to without one. */
146
+ function describeEnumMember(member, checker) {
147
+ const result = {
148
+ name: ts.isIdentifier(member.name) || ts.isStringLiteral(member.name) ? member.name.text : member.name.getText()
149
+ };
150
+ const value = member.initializer ? collapseWhitespace(member.initializer.getText()) : checker.getConstantValue(member)?.toString();
151
+ const description = readDescription(member);
152
+ if (value !== undefined)
153
+ result.value = value;
154
+ if (description)
155
+ result.description = description;
156
+ return result;
157
+ }
158
+ /** Every type reference in an annotation: in type arguments, arrays, unions and object literal types too. */
159
+ function forEachReferenceInNode(node, checker, visit) {
160
+ if (ts.isTypeReferenceNode(node)) {
161
+ const symbol = checker.getSymbolAtLocation(ts.isQualifiedName(node.typeName) ? node.typeName.right : node.typeName);
162
+ if (symbol)
163
+ visit(symbol);
164
+ }
165
+ ts.forEachChild(node, (child) => forEachReferenceInNode(child, checker, visit));
166
+ }
167
+ /**
168
+ * Every named type in a type without annotation, as `typeToString` prints it:
169
+ * an alias or a class or interface with their type arguments, the parts of a
170
+ * union or intersection, and the members of an object literal or function type.
171
+ */
172
+ function forEachReferenceInType(type, checker, visit, seen) {
173
+ if (seen.has(type))
174
+ return;
175
+ seen.add(type);
176
+ const walk = (inner) => forEachReferenceInType(inner, checker, visit, seen);
177
+ if (type.aliasSymbol) {
178
+ visit(type.aliasSymbol);
179
+ type.aliasTypeArguments?.forEach(walk);
180
+ return;
181
+ }
182
+ // An enum, or one of its members.
183
+ if (type.flags & ts.TypeFlags.EnumLiteral && type.symbol) {
184
+ visit(type.symbol);
185
+ return;
186
+ }
187
+ if (type.isUnionOrIntersection()) {
188
+ type.types.forEach(walk);
189
+ return;
190
+ }
191
+ if (!(type.flags & ts.TypeFlags.Object))
192
+ return;
193
+ const { objectFlags } = type;
194
+ if (objectFlags & (ts.ObjectFlags.Class | ts.ObjectFlags.Interface | ts.ObjectFlags.Reference)) {
195
+ if (type.symbol)
196
+ visit(type.symbol);
197
+ if (objectFlags & ts.ObjectFlags.Reference)
198
+ checker.getTypeArguments(type).forEach(walk);
199
+ return;
200
+ }
201
+ if (objectFlags & ts.ObjectFlags.Anonymous) {
202
+ for (const property of type.getProperties())
203
+ walk(checker.getTypeOfSymbol(property));
204
+ for (const signature of type.getCallSignatures()) {
205
+ for (const parameter of signature.getParameters())
206
+ walk(checker.getTypeOfSymbol(parameter));
207
+ walk(signature.getReturnType());
208
+ }
209
+ }
210
+ }
@@ -0,0 +1,26 @@
1
+ import ts from 'typescript';
2
+ import type { ShowcaseConfig } from '../../decorator/showcase.types.js';
3
+ import type { ScannedService } from '../../plugin/service.types.js';
4
+ import type { ExportIndex } from './api/export-index.js';
5
+ import { type ShowcasedClass } from './component.scanner.js';
6
+ export interface ScanServicesOptions {
7
+ /** Built from every entry point of the library, since a setup function or a type is often exported by another one than the service. */
8
+ exportIndex: ExportIndex;
9
+ /** Shared with {@link scanComponents}, and across entry points, so that a service exported from several of them does not repeat its warnings. */
10
+ diagnostics: string[];
11
+ notices: Set<string>;
12
+ }
13
+ /**
14
+ * Read the services among the showcased classes of an entry point: classes
15
+ * with `@Injectable` or `@Service`, unless they declare fields only a component
16
+ * can use. Components are left to {@link scanComponents}.
17
+ *
18
+ * Nothing is run and the class is never imported: the service is read from the
19
+ * source, its API from the declarations, its `setup` from the array literal
20
+ * the arrow function returns. A service whose API cannot be read is left out
21
+ * with a notice, so that it does not take the whole scan down.
22
+ */
23
+ export declare function scanServices(showcased: ShowcasedClass[], checker: ts.TypeChecker, { exportIndex, diagnostics, notices }: ScanServicesOptions): ScannedService[];
24
+ /** `title` and whichever of the service fields the config sets: a component's `variants`, `bg` and the like mean nothing here. */
25
+ export declare function pickServiceFields(config: ShowcaseConfig): ShowcaseConfig;
26
+ //# sourceMappingURL=service.scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/service.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AASrG,MAAM,WAAW,mBAAmB;IAChC,uIAAuI;IACvI,WAAW,EAAE,WAAW,CAAC;IACzB,iJAAiJ;IACjJ,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAoC/J;AAED,kIAAkI;AAClI,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAQxE"}