@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
@@ -1,5 +1,5 @@
1
1
  import ts from 'typescript';
2
- import { evaluateStatic, findDecorator, getDecoratorArgument, getJsDocComment } from './ast-utils.js';
2
+ import { evaluateExpression, evaluateStatic, findDecorator, getDecoratorArgument, getJsDocComment, UNEVALUABLE } from './ast-utils.js';
3
3
  import { getClassHierarchy } from './class-hierarchy.js';
4
4
  /**
5
5
  * Extract all @Input(), input() and model() signal metadata from a class
@@ -28,11 +28,9 @@ export function extractInputs(classDecl, checker, hierarchy = getClassHierarchy(
28
28
  }
29
29
  const initializedBy = reinitialized.get(name);
30
30
  if (initializedBy) {
31
- const defaultValue = readInitialValue(initializedBy, checker);
32
- if (defaultValue === undefined)
33
- delete input.defaultValue;
34
- else
35
- input.defaultValue = defaultValue;
31
+ delete input.defaultValue;
32
+ delete input.defaultUnreadable;
33
+ Object.assign(input, defaultFields(readInitialValue(initializedBy, checker)));
36
34
  }
37
35
  seen.add(name);
38
36
  inputs.push(input);
@@ -40,16 +38,53 @@ export function extractInputs(classDecl, checker, hierarchy = getClassHierarchy(
40
38
  }
41
39
  return inputs;
42
40
  }
41
+ /**
42
+ * The declaration Angular takes an input from: the member of that name in the
43
+ * nearest class that defines metadata and declares it an input, the one
44
+ * {@link extractInputs} reads.
45
+ */
46
+ export function findInputDeclaration(hierarchy, name) {
47
+ return findDeclaration(hierarchy, name, (member) => !isStatic(member) && (!!findDecorator(member, 'Input') || !!getInputSignalCall(member)));
48
+ }
49
+ /** The declaration Angular takes an output from, as {@link findInputDeclaration} for an input. */
50
+ export function findOutputDeclaration(hierarchy, name) {
51
+ return findDeclaration(hierarchy, name, (member) => !!findDecorator(member, 'Output') || isOutputSignal(member));
52
+ }
53
+ /** Whether an input is a `model()` or `model.required()`, for which Angular adds a change output. */
54
+ export function isModelInput(member) {
55
+ const call = getInputSignalCall(member);
56
+ const callee = call && (ts.isPropertyAccessExpression(call.expression) ? call.expression.expression : call.expression);
57
+ return !!callee && ts.isIdentifier(callee) && callee.text === 'model';
58
+ }
59
+ function findDeclaration(hierarchy, name, declares) {
60
+ for (const { classDecl: owner, definesMetadata } of hierarchy.classes) {
61
+ if (!definesMetadata)
62
+ continue;
63
+ const member = owner.members.find((m) => ts.isPropertyDeclaration(m) && ts.isIdentifier(m.name) && m.name.text === name && declares(m));
64
+ if (member)
65
+ return { member, owner };
66
+ }
67
+ return undefined;
68
+ }
43
69
  function isStatic(member) {
44
70
  return !!ts.getModifiers(member)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);
45
71
  }
46
- /** What a field starts out with: its initializer, or for `input()` and `model()` the value passed to them. */
72
+ /**
73
+ * What a field starts out with: its initializer, or for `input()` and `model()` the value passed to them. `undefined`
74
+ * when there is none, {@link UNEVALUABLE} when there is one the scan cannot read.
75
+ */
47
76
  function readInitialValue(member, checker) {
48
77
  const signalCall = getInputSignalCall(member);
49
78
  if (!signalCall)
50
79
  return member.initializer ? evaluateDefault(member.initializer, checker) : undefined;
51
80
  return !isSignalInputRequired(signalCall) && signalCall.arguments.length > 0 ? evaluateDefault(signalCall.arguments[0], checker) : undefined;
52
81
  }
82
+ /** How {@link InputMeta} carries what {@link readInitialValue} found: a value, or that there is one that could not be read. */
83
+ function defaultFields(initial) {
84
+ if (initial === UNEVALUABLE)
85
+ return { defaultUnreadable: true };
86
+ return initial === undefined ? {} : { defaultValue: initial };
87
+ }
53
88
  /**
54
89
  * `owner` declares the member. `subclass` is the showcased class when that is
55
90
  * a different one, which decides what the type parameters of `owner` stand for.
@@ -58,17 +93,19 @@ function readInput(member, name, checker, owner, subclass) {
58
93
  const inputDecorator = findDecorator(member, 'Input');
59
94
  if (inputDecorator) {
60
95
  const required = isDecoratorInputRequired(inputDecorator);
61
- const defaultValue = readInitialValue(member, checker);
96
+ const alias = readAlias(getDecoratorArgument(inputDecorator), name, checker);
97
+ const initial = readInitialValue(member, checker);
62
98
  const doc = getJsDocComment(member, checker);
63
99
  const instantiated = subclass && usesTypeParameters(member.type ?? member.initializer, owner, checker) ? getInstantiatedType(name, subclass, checker) : undefined;
64
100
  const { type, values, rawType } = instantiated ? mapType(instantiated, checker) : resolveDecoratorInputType(member, checker);
65
101
  return {
66
102
  name,
103
+ ...(alias && { alias }),
67
104
  type,
68
105
  rawType,
69
106
  required,
70
107
  ...(values && { values }),
71
- ...(defaultValue !== undefined && { defaultValue }),
108
+ ...defaultFields(initial),
72
109
  ...(doc && { doc })
73
110
  };
74
111
  }
@@ -76,7 +113,9 @@ function readInput(member, name, checker, owner, subclass) {
76
113
  if (!signalCall)
77
114
  return undefined;
78
115
  const required = isSignalInputRequired(signalCall);
79
- const defaultValue = readInitialValue(member, checker);
116
+ // `input(initial, options)`, but `input.required(options)`.
117
+ const alias = readAlias(signalCall.arguments[required ? 0 : 1], name, checker);
118
+ const initial = readInitialValue(member, checker);
80
119
  const doc = getJsDocComment(member, checker);
81
120
  const declaredType = signalCall.typeArguments?.[0] ?? signalCall.arguments[0];
82
121
  // A signal is a getter function, so its call signature returns the value type.
@@ -84,14 +123,26 @@ function readInput(member, name, checker, owner, subclass) {
84
123
  const { type, values, rawType } = instantiated ? mapType(instantiated, checker) : resolveSignalInputType(signalCall, checker);
85
124
  return {
86
125
  name,
126
+ ...(alias && { alias }),
87
127
  type,
88
128
  rawType,
89
129
  required,
90
130
  ...(values && { values }),
91
- ...(defaultValue !== undefined && { defaultValue }),
131
+ ...defaultFields(initial),
92
132
  ...(doc && { doc })
93
133
  };
94
134
  }
135
+ /**
136
+ * The `alias` of an input or output, from a decorator argument (`'x'` or
137
+ * `{ alias: 'x' }`) or the options of `input()`, `model()` and `output()`.
138
+ * It counts when the builder can evaluate it statically to a string (a literal
139
+ * or a constant) that differs from the member name.
140
+ */
141
+ function readAlias(arg, name, checker) {
142
+ const value = arg ? evaluateExpression(arg, checker) : undefined;
143
+ const alias = typeof value === 'object' && value !== null ? value['alias'] : value;
144
+ return typeof alias === 'string' && alias !== name ? alias : undefined;
145
+ }
95
146
  /**
96
147
  * Extract all @Output() and output() signal metadata from a class declaration
97
148
  * and the base classes Angular inherits outputs from.
@@ -108,11 +159,14 @@ export function extractOutputs(classDecl, checker, hierarchy = getClassHierarchy
108
159
  const name = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
109
160
  if (!name || seen.has(name))
110
161
  continue;
111
- if (!findDecorator(member, 'Output') && !isOutputSignal(member))
162
+ const outputDecorator = findDecorator(member, 'Output');
163
+ if (!outputDecorator && !isOutputSignal(member))
112
164
  continue;
113
165
  const doc = getJsDocComment(member, checker);
166
+ const options = outputDecorator ? getDecoratorArgument(outputDecorator) : member.initializer.arguments[0];
167
+ const alias = readAlias(options, name, checker);
114
168
  seen.add(name);
115
- outputs.push({ name, ...(doc && { doc }) });
169
+ outputs.push({ name, ...(alias && { alias }), ...(doc && { doc }) });
116
170
  }
117
171
  }
118
172
  return outputs;
@@ -122,7 +176,7 @@ export function extractOutputs(classDecl, checker, hierarchy = getClassHierarchy
122
176
  * mentions a type parameter of the class that declares it. Only then does the
123
177
  * subclass change the type; otherwise the source text stays, alias names included.
124
178
  */
125
- function usesTypeParameters(node, owner, checker) {
179
+ export function usesTypeParameters(node, owner, checker) {
126
180
  const parameters = owner.typeParameters;
127
181
  if (!node || !parameters?.length)
128
182
  return false;
@@ -155,19 +209,21 @@ function typeMentions(type, isOwnParameter, checker, visited = new Set()) {
155
209
  * sees it: `items = input.required<T[]>()` in `Field<T>` is an
156
210
  * `InputSignal<Country[]>` on `Picker extends Field<Country>`.
157
211
  */
158
- function getInstantiatedType(name, subclass, checker) {
212
+ export function getInstantiatedType(name, subclass, checker) {
159
213
  const property = checker.getPropertyOfType(checker.getTypeAtLocation(subclass), name);
160
214
  return property && checker.getTypeOfSymbolAtLocation(property, subclass);
161
215
  }
162
216
  /**
163
217
  * A default is all or nothing. The renderer applies it to the component, so
164
218
  * the part of `{ ...shared, size: 'm' }` that can be read would overwrite the
165
- * whole default the component actually declares.
219
+ * whole default the component actually declares: it is {@link UNEVALUABLE}
220
+ * instead, so that a default the scan could not read stays apart from one that
221
+ * is `undefined`.
166
222
  */
167
223
  function evaluateDefault(node, checker) {
168
224
  let complete = true;
169
225
  const value = evaluateStatic(node, { checker, report: () => (complete = false) });
170
- return complete ? value : undefined;
226
+ return complete ? value : UNEVALUABLE;
171
227
  }
172
228
  function getInputSignalCall(member) {
173
229
  const init = member.initializer;
@@ -0,0 +1,29 @@
1
+ import ts from 'typescript';
2
+ import type { ScannedPipe } from '../../plugin/pipe.types.js';
3
+ import type { ExportIndex } from './api/export-index.js';
4
+ import { type ShowcasedClass } from './component.scanner.js';
5
+ export interface ScanPipesOptions {
6
+ /** Built from every entry point of the library, since a setup function or a type is often exported by another one than the pipe. */
7
+ exportIndex: ExportIndex;
8
+ /** Shared with {@link scanComponents} and {@link scanServices}, and across entry points, so that a pipe exported from several of them does not repeat its warnings. */
9
+ diagnostics: string[];
10
+ notices: Set<string>;
11
+ }
12
+ /**
13
+ * Read the pipes among the showcased classes of an entry point: classes with
14
+ * `@Pipe` from `@angular/core`, unless they declare fields only a component
15
+ * can use. Components are left to {@link scanComponents}, services to
16
+ * {@link scanServices}.
17
+ *
18
+ * A pipe the styleguide cannot call from a template is reported and dropped:
19
+ * one declared with `standalone: false`, and one whose `name` the source does
20
+ * not give as a constant. A `pure` that cannot be read is left out instead,
21
+ * since the pipe is still worth showing.
22
+ *
23
+ * Nothing is run and the class is never imported: the pipe is read from the
24
+ * source, its API from the declarations, its `setup` from the array literal
25
+ * the arrow function returns. A pipe whose API cannot be read is left out with
26
+ * a notice, so that it does not take the whole scan down.
27
+ */
28
+ export declare function scanPipes(showcased: ShowcasedClass[], checker: ts.TypeChecker, { exportIndex, diagnostics, notices }: ScanPipesOptions): ScannedPipe[];
29
+ //# sourceMappingURL=pipe.scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe.scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/pipe.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIrG,MAAM,WAAW,gBAAgB;IAC7B,oIAAoI;IACpI,WAAW,EAAE,WAAW,CAAC;IACzB,uKAAuK;IACvK,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,gBAAgB,GAAG,WAAW,EAAE,CAiDtJ"}
@@ -0,0 +1,65 @@
1
+ import { readPipeOptions } from './api/angular-decorators.js';
2
+ import { extractPipeApi } from './api/pipe-api.extractor.js';
3
+ import { readSetupRefs } from './api/setup.reader.js';
4
+ import { createReporters, extractShowcaseConfig } from './component.scanner.js';
5
+ import { pickServiceFields } from './service.scanner.js';
6
+ import { describePipeNameUnreadable, describePipeNotStandalone, describeUnreadableApi } from './showcase-diagnostics.js';
7
+ /**
8
+ * Read the pipes among the showcased classes of an entry point: classes with
9
+ * `@Pipe` from `@angular/core`, unless they declare fields only a component
10
+ * can use. Components are left to {@link scanComponents}, services to
11
+ * {@link scanServices}.
12
+ *
13
+ * A pipe the styleguide cannot call from a template is reported and dropped:
14
+ * one declared with `standalone: false`, and one whose `name` the source does
15
+ * not give as a constant. A `pure` that cannot be read is left out instead,
16
+ * since the pipe is still worth showing.
17
+ *
18
+ * Nothing is run and the class is never imported: the pipe is read from the
19
+ * source, its API from the declarations, its `setup` from the array literal
20
+ * the arrow function returns. A pipe whose API cannot be read is left out with
21
+ * a notice, so that it does not take the whole scan down.
22
+ */
23
+ export function scanPipes(showcased, checker, { exportIndex, diagnostics, notices }) {
24
+ const pipes = [];
25
+ const { report, notify } = createReporters(diagnostics, notices);
26
+ for (const { symbol, classDecl, decorator, argument, kind: classKind } of showcased) {
27
+ if (classKind.kind !== 'pipe')
28
+ continue;
29
+ const className = classDecl.name?.text ?? 'Anonymous';
30
+ const showcaseConfig = extractShowcaseConfig(decorator, className, report, checker);
31
+ if (!showcaseConfig || !argument)
32
+ continue;
33
+ const options = readPipeOptions(classKind.decorator, checker);
34
+ if (!options.standalone) {
35
+ report(describePipeNotStandalone(className, classKind.decorator));
36
+ continue;
37
+ }
38
+ if (options.name === undefined) {
39
+ report(describePipeNameUnreadable(className, classKind.decorator));
40
+ continue;
41
+ }
42
+ let api;
43
+ try {
44
+ api = extractPipeApi(classDecl, readSetupRefs(argument, className, checker, exportIndex, report), checker, exportIndex);
45
+ }
46
+ catch (error) {
47
+ notify(describeUnreadableApi(className, error, 'pipe'));
48
+ continue;
49
+ }
50
+ const pipe = {
51
+ className,
52
+ filePath: classDecl.getSourceFile().fileName,
53
+ showcaseConfig: pickServiceFields(showcaseConfig),
54
+ pipeName: options.name,
55
+ api
56
+ };
57
+ const importPath = exportIndex.get(symbol);
58
+ if (options.pure !== undefined)
59
+ pipe.pure = options.pure;
60
+ if (importPath !== undefined)
61
+ pipe.importPath = importPath;
62
+ pipes.push(pipe);
63
+ }
64
+ return pipes;
65
+ }
@@ -1,4 +1,5 @@
1
1
  import { type ForcedPseudoStates } from '../../shared/pseudo-state.type.js';
2
+ export declare function describeValue(value: unknown): string;
2
3
  /**
3
4
  * `Variant.pseudo` as the scanner evaluated it, with everything it cannot use
4
5
  * reported and dropped: a value that is no object, an unknown state, and a
@@ -1 +1 @@
1
- {"version":3,"file":"pseudo-states.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/pseudo-states.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAsD,MAAM,mCAAmC,CAAC;AAehI;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,kBAAkB,GAAG,SAAS,CAmBjI"}
1
+ {"version":3,"file":"pseudo-states.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/pseudo-states.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAsD,MAAM,mCAAmC,CAAC;AAUhI,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGpD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,kBAAkB,GAAG,SAAS,CAmBjI"}
@@ -5,7 +5,7 @@ function isPseudoState(value) {
5
5
  function isSelector(value) {
6
6
  return typeof value === 'string' && value.trim() !== '';
7
7
  }
8
- function describeValue(value) {
8
+ export function describeValue(value) {
9
9
  if (typeof value === 'string' || (typeof value === 'object' && value !== null))
10
10
  return JSON.stringify(value) ?? String(value);
11
11
  return String(value);
@@ -1,18 +1,42 @@
1
1
  import ts from 'typescript';
2
+ import type { ScannedPipe } from '../../plugin/pipe.types.js';
2
3
  import type { ScannedComponent } from '../../plugin/plugin.types.js';
4
+ import type { ScannedService } from '../../plugin/service.types.js';
3
5
  import { type EntryPointInput } from './entry-point.scanner.js';
4
6
  export interface CreateScannerOptions {
5
7
  entryPoints: ReadonlyArray<EntryPointInput>;
6
8
  compilerOptions?: ts.CompilerOptions;
7
9
  }
10
+ /**
11
+ * What the scan reads beyond the components, each `true` when not given. The
12
+ * build reads only what a plugin in the config uses: services and pipes are
13
+ * then only counted, and components come without `api`.
14
+ */
15
+ export interface ScanOptions {
16
+ /** {@link ScannedComponent.api}, read for a plugin with `componentApi`. */
17
+ componentApi?: boolean;
18
+ /** Services, read for a plugin with a view panel that applies to them. */
19
+ services?: boolean;
20
+ /** Pipes, read for a plugin with a view panel that applies to them. */
21
+ pipes?: boolean;
22
+ }
8
23
  export interface ScanResult {
9
24
  components: ScannedComponent[];
25
+ /** Empty when {@link ScanOptions.services} is `false`. */
26
+ services: ScannedService[];
27
+ /** Empty when {@link ScanOptions.pipes} is `false`. */
28
+ pipes: ScannedPipe[];
29
+ /** The showcased services and pipes the options left unread, counted once each however many entry points export them. */
30
+ unread: {
31
+ services: number;
32
+ pipes: number;
33
+ };
10
34
  /** One message per @Showcase value the scan had to drop, already printed as a warning. */
11
35
  diagnostics: string[];
12
36
  }
13
37
  export interface Scanner {
14
38
  /** Scan all entry points. Reuses TypeScript program state from previous scans. */
15
- scan(): ScanResult;
39
+ scan(options?: ScanOptions): ScanResult;
16
40
  }
17
41
  /**
18
42
  * Create a stateful multi-entry scanner that retains the previous ts.Program between scans.
@@ -20,8 +44,8 @@ export interface Scanner {
20
44
  * transitive type graph (Angular framework typings, etc.) is parsed once and shared via
21
45
  * the program's `TypeChecker`, instead of N programs that each load Material/CDK/RxJS.
22
46
  *
23
- * TypeScript reuses parsed SourceFile objects from the old program on rebuild, making
24
- * incremental scans fast.
47
+ * On rebuild, the source-file cache hands TypeScript the already parsed SourceFile of
48
+ * every unchanged file, so only the changed files are parsed again.
25
49
  */
26
50
  export declare function createScanner(options: CreateScannerOptions): Scanner;
27
51
  //# sourceMappingURL=scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,0BAA0B,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,0FAA0F;IAC1F,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACpB,kFAAkF;IAClF,IAAI,IAAI,UAAU,CAAC;CACtB;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAiDpE"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAKpE,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,0BAA0B,CAAC;AAK1F,MAAM,WAAW,oBAAoB;IACjC,WAAW,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,uDAAuD;IACvD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,yHAAyH;IACzH,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,0FAA0F;IAC1F,WAAW,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACpB,kFAAkF;IAClF,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;CAC3C;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CA4DpE"}
@@ -1,6 +1,12 @@
1
1
  import ts from 'typescript';
2
- import { scanComponents } from './component.scanner.js';
2
+ import { buildExportIndex } from './api/export-index.js';
3
+ import { createReporters, findShowcasedClasses, scanComponents } from './component.scanner.js';
4
+ import { buildDeclarableIndex } from './composition/declarables.js';
5
+ import { createCompositionContext } from './composition/read-composition.js';
3
6
  import { resolveEntryPointExports } from './entry-point.scanner.js';
7
+ import { scanPipes } from './pipe.scanner.js';
8
+ import { scanServices } from './service.scanner.js';
9
+ import { createSourceFileCache } from './source-file-cache.js';
4
10
  const DEFAULT_COMPILER_OPTIONS = {
5
11
  target: ts.ScriptTarget.ES2022,
6
12
  module: ts.ModuleKind.ES2022,
@@ -22,46 +28,84 @@ const DEFAULT_COMPILER_OPTIONS = {
22
28
  * transitive type graph (Angular framework typings, etc.) is parsed once and shared via
23
29
  * the program's `TypeChecker`, instead of N programs that each load Material/CDK/RxJS.
24
30
  *
25
- * TypeScript reuses parsed SourceFile objects from the old program on rebuild, making
26
- * incremental scans fast.
31
+ * On rebuild, the source-file cache hands TypeScript the already parsed SourceFile of
32
+ * every unchanged file, so only the changed files are parsed again.
27
33
  */
28
34
  export function createScanner(options) {
29
35
  const compilerOptions = {
30
36
  ...DEFAULT_COMPILER_OPTIONS,
31
37
  ...options.compilerOptions
32
38
  };
39
+ const sourceFiles = createSourceFileCache(compilerOptions);
33
40
  let previousProgram;
34
41
  return {
35
- scan() {
36
- const { program, entries } = resolveEntryPointExports(options.entryPoints, compilerOptions, previousProgram);
42
+ scan({ componentApi = true, services: readServices = true, pipes: readPipes = true } = {}) {
43
+ const { program, entries } = resolveEntryPointExports(options.entryPoints, compilerOptions, previousProgram, sourceFiles.host);
37
44
  previousProgram = program;
45
+ sourceFiles.prune(program);
38
46
  const checker = program.getTypeChecker();
39
47
  const allComponents = [];
48
+ const allServices = [];
49
+ const allPipes = [];
50
+ const unreadServices = new Set();
51
+ const unreadPipes = new Set();
40
52
  const diagnostics = [];
41
53
  const notices = new Set();
42
- for (const { exports, importPath } of entries) {
43
- const components = scanComponents(exports, checker, diagnostics, notices);
54
+ // A setup function or a type is often exported by another entry point than the component, service or pipe that names it.
55
+ const exportIndex = buildExportIndex(entries, checker);
56
+ const context = { exportIndex, diagnostics, notices };
57
+ // A showcase's templates use what any entry point exports, not only its own. Read for the first one that composes.
58
+ const composition = createCompositionContext(() => buildDeclarableIndex(entries, checker), compilerOptions, createReporters(diagnostics, notices));
59
+ const fromPrimary = new Set();
60
+ for (const { exports, importPath, primary } of entries) {
61
+ const showcased = findShowcasedClasses(exports, checker);
62
+ const components = scanComponents(showcased, checker, { ...context, api: componentApi, composition });
63
+ const services = readServices ? scanServices(showcased, checker, context) : [];
64
+ const pipes = readPipes ? scanPipes(showcased, checker, context) : [];
65
+ for (const { classDecl, kind } of showcased) {
66
+ if (!readServices && kind.kind === 'service')
67
+ unreadServices.add(classDecl);
68
+ if (!readPipes && kind.kind === 'pipe')
69
+ unreadPipes.add(classDecl);
70
+ }
44
71
  for (const c of components)
45
72
  c.importPath = importPath;
46
- allComponents.push(...components);
47
- }
48
- // Dedupe by (filePath, className): if a component class is re-exported from
49
- // multiple entry points (e.g. atoms/button + barrel index.ts), we keep the first
50
- // occurrence. The duplicate would otherwise produce duplicate imports in the
51
- // generated manifest and a runtime collision in the Prism shell.
52
- const seen = new Set();
53
- const unique = [];
54
- for (const c of allComponents) {
55
- const key = `${c.filePath}::${c.className}`;
56
- if (seen.has(key)) {
57
- console.warn(`⚠ ng-prism: ${c.className} is exported by multiple entry points; ` +
58
- `keeping the first occurrence (importPath: ${unique.find((u) => u.className === c.className && u.filePath === c.filePath)?.importPath}).`);
59
- continue;
73
+ if (primary) {
74
+ for (const item of [...components, ...services, ...pipes])
75
+ fromPrimary.add(item);
60
76
  }
61
- seen.add(key);
62
- unique.push(c);
77
+ allComponents.push(...components);
78
+ allServices.push(...services);
79
+ allPipes.push(...pipes);
63
80
  }
64
- return { components: unique, diagnostics };
81
+ return {
82
+ components: dedupe(allComponents, fromPrimary),
83
+ services: dedupe(allServices, fromPrimary),
84
+ pipes: dedupe(allPipes, fromPrimary),
85
+ unread: { services: unreadServices.size, pipes: unreadPipes.size },
86
+ diagnostics
87
+ };
65
88
  }
66
89
  };
67
90
  }
91
+ /**
92
+ * Dedupe by (filePath, className): if a class is re-exported from multiple
93
+ * entry points (e.g. atoms/button + barrel index.ts), we keep the first
94
+ * occurrence. The duplicate would otherwise produce duplicate imports in the
95
+ * generated manifest and a runtime collision in the Prism shell. The primary
96
+ * entry point comes last and re-exporting its secondaries is normal there.
97
+ */
98
+ function dedupe(items, fromPrimary) {
99
+ const first = new Map();
100
+ for (const item of items) {
101
+ const key = `${item.filePath}::${item.className}`;
102
+ const kept = first.get(key);
103
+ if (!kept) {
104
+ first.set(key, item);
105
+ }
106
+ else if (!fromPrimary.has(item)) {
107
+ console.warn(`⚠ ng-prism: ${item.className} is exported by multiple entry points; ` + `keeping the first occurrence (importPath: ${kept.importPath}).`);
108
+ }
109
+ }
110
+ return [...first.values()];
111
+ }
@@ -0,0 +1,80 @@
1
+ import ts from 'typescript';
2
+ import type { ServiceProvision } from '../../../plugin/service.types.js';
3
+ export type ShowcaseClassKind = {
4
+ kind: 'component';
5
+ }
6
+ /** `decorator` is the `@Injectable` or `@Service` that makes it one. */
7
+ | {
8
+ kind: 'service';
9
+ decorator: ts.Decorator;
10
+ }
11
+ /** `decorator` is the `@Pipe` that makes it one; whether the pipe is shown is for the pipe scan to decide. */
12
+ | {
13
+ kind: 'pipe';
14
+ decorator: ts.Decorator;
15
+ }
16
+ /**
17
+ * An `@Injectable`, `@Service` or `@Pipe` that still declares component-only `fields`, so it stays a component for now.
18
+ * `source` says which decorator would make it a service or a pipe; `standalone: false` only for a pipe declared in an NgModule.
19
+ */
20
+ | {
21
+ kind: 'legacy-component';
22
+ fields: string[];
23
+ source: 'injectable' | 'pipe';
24
+ standalone?: false;
25
+ };
26
+ /** What the `@Pipe` metadata says, as far as the source can be read. */
27
+ export interface PipeOptions {
28
+ /** Missing when the source does not give it as a string constant: the pipe cannot be shown without its name. */
29
+ name?: string;
30
+ /** `true` when the metadata does not say, missing when it says something the scan cannot read. */
31
+ pure?: boolean;
32
+ /** Only `false` when the metadata statically says `standalone: false`; Angular's default is `true`. */
33
+ standalone: boolean;
34
+ }
35
+ /**
36
+ * {@link findDecorator} for an Angular decorator: it only counts if the
37
+ * identifier is imported from `@angular/core`. A `@Service` from a
38
+ * dependency-injection package of another name has nothing to do with Angular's.
39
+ *
40
+ * The scanner never imports `Service` itself, since Angular 20 has none: the
41
+ * decorator is recognised in the source alone.
42
+ */
43
+ export declare function findAngularCoreDecorator(classDecl: ts.ClassDeclaration, name: 'Injectable' | 'Service' | 'Component' | 'Directive' | 'Pipe', checker: ts.TypeChecker): ts.Decorator | undefined;
44
+ /**
45
+ * Tell a service or a pipe from a component. They all carry `@Showcase`, and
46
+ * the only thing that tells them apart is the Angular decorator beside it.
47
+ *
48
+ * A class with `@Component` or `@Directive` is a component, whatever else it
49
+ * carries. Otherwise `@Pipe` makes it a pipe, and `@Service` or `@Injectable`
50
+ * a service, so that a pipe that is also injectable stays a pipe. Either is
51
+ * overruled by the `@Showcase` argument declaring a component-only field: such
52
+ * a class has been shown as a component so far, so it stays one
53
+ * (`legacy-component`) until 23.0.0, and the scan says why. That check comes
54
+ * first, before anything is said about the pipe itself.
55
+ *
56
+ * `showcaseArg` is read from the literal and from the evaluated value, since a
57
+ * constant or a spread can bring the field in and a field the evaluator cannot
58
+ * read is still in the literal.
59
+ */
60
+ export declare function classifyShowcaseClass(classDecl: ts.ClassDeclaration, showcaseArg: ts.Expression | undefined, checker: ts.TypeChecker): ShowcaseClassKind;
61
+ /**
62
+ * Whether Angular provides the service on its own (`auto`) or the user has to
63
+ * list it in a providers array (`manual`).
64
+ *
65
+ * `@Service()` is auto-provided unless it says `autoProvided: false`;
66
+ * `@Injectable` is when `providedIn` is `'root'`, `'platform'` or `'any'`.
67
+ * Anything else, such as no argument, no `providedIn`, a module class or a value
68
+ * the scan cannot read, is `manual`, without a warning: a service nobody
69
+ * provides is a normal thing to document.
70
+ */
71
+ export declare function readProvision(decorator: ts.Decorator, checker: ts.TypeChecker): ServiceProvision;
72
+ /**
73
+ * Read `name`, `pure` and `standalone` from the `@Pipe` metadata.
74
+ *
75
+ * Nothing that cannot be read is guessed: a `name` or `pure` the source does not
76
+ * give as a constant is left out, so that the caller can say so, while
77
+ * `standalone` only counts as `false` when the source says exactly that.
78
+ */
79
+ export declare function readPipeOptions(decorator: ts.Decorator, checker: ts.TypeChecker): PipeOptions;
80
+ //# sourceMappingURL=angular-decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-decorators.d.ts","sourceRoot":"","sources":["../../../../src/builder/scanner/service/angular-decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAezE,MAAM,MAAM,iBAAiB,GACvB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE;AACvB,wEAAwE;GACtE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAA;CAAE;AAC9C,8GAA8G;GAC5G;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAA;CAAE;AAC3C;;;GAGG;GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAExG,wEAAwE;AACxE,MAAM,WAAW,WAAW;IACxB,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,uGAAuG;IACvG,UAAU,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACpC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAC9B,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,EACnE,OAAO,EAAE,EAAE,CAAC,WAAW,GACxB,EAAE,CAAC,SAAS,GAAG,SAAS,CAI1B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,WAAW,EAAE,EAAE,CAAC,UAAU,GAAG,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,iBAAiB,CAuBxJ;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,gBAAgB,CAsBhG;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,WAAW,CAqB7F"}