@ng-prism/core 22.2.1 → 22.4.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 (359) hide show
  1. package/README.md +34 -36
  2. package/builders.json +11 -11
  3. package/dist/app/canvas/canvas-bg.styles.d.ts +7 -12
  4. package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -1
  5. package/dist/app/canvas/canvas-bg.styles.js +37 -22
  6. package/dist/app/canvas/measure-geometry.d.ts +140 -0
  7. package/dist/app/canvas/measure-geometry.d.ts.map +1 -0
  8. package/dist/app/canvas/measure-geometry.js +217 -0
  9. package/dist/app/canvas/measure-keyboard.d.ts +20 -0
  10. package/dist/app/canvas/measure-keyboard.d.ts.map +1 -0
  11. package/dist/app/canvas/measure-keyboard.js +34 -0
  12. package/dist/app/canvas/measure-quad.d.ts +114 -0
  13. package/dist/app/canvas/measure-quad.d.ts.map +1 -0
  14. package/dist/app/canvas/measure-quad.js +173 -0
  15. package/dist/app/canvas/measure-snap.d.ts +35 -0
  16. package/dist/app/canvas/measure-snap.d.ts.map +1 -0
  17. package/dist/app/canvas/measure-snap.js +63 -0
  18. package/dist/app/canvas/prism-canvas-bg-pill.component.d.ts.map +1 -1
  19. package/dist/app/canvas/prism-canvas-bg-pill.component.js +3 -18
  20. package/dist/app/canvas/prism-canvas-measure.component.d.ts +142 -0
  21. package/dist/app/canvas/prism-canvas-measure.component.d.ts.map +1 -0
  22. package/dist/app/canvas/prism-canvas-measure.component.js +554 -0
  23. package/dist/app/canvas/prism-canvas-pin-row.component.d.ts +23 -0
  24. package/dist/app/canvas/prism-canvas-pin-row.component.d.ts.map +1 -0
  25. package/dist/app/canvas/prism-canvas-pin-row.component.js +64 -0
  26. package/dist/app/canvas/prism-canvas-rulers.component.d.ts +1 -0
  27. package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -1
  28. package/dist/app/canvas/prism-canvas-rulers.component.js +9 -14
  29. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +28 -28
  30. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  31. package/dist/app/canvas/prism-canvas-toolbar.component.js +124 -162
  32. package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
  33. package/dist/app/canvas/prism-template-popover.component.js +8 -49
  34. package/dist/app/canvas/viewport-snap.d.ts +12 -0
  35. package/dist/app/canvas/viewport-snap.d.ts.map +1 -0
  36. package/dist/app/canvas/viewport-snap.js +23 -0
  37. package/dist/app/component-head/head-metrics.d.ts +2 -2
  38. package/dist/app/component-head/head-metrics.d.ts.map +1 -1
  39. package/dist/app/component-head/head-metrics.js +3 -3
  40. package/dist/app/component-head/prism-component-head.component.d.ts +3 -3
  41. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  42. package/dist/app/component-head/prism-component-head.component.js +24 -64
  43. package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -1
  44. package/dist/app/component-head/prism-head-gauge.component.js +4 -36
  45. package/dist/app/component-head/prism-head-info.component.d.ts +1 -1
  46. package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -1
  47. package/dist/app/component-head/prism-head-info.component.js +4 -37
  48. package/dist/app/component-head/prism-stat.component.d.ts +1 -1
  49. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  50. package/dist/app/component-head/prism-stat.component.js +4 -15
  51. package/dist/app/controls/boolean-control.component.d.ts.map +1 -1
  52. package/dist/app/controls/boolean-control.component.js +4 -12
  53. package/dist/app/controls/json-control.component.d.ts.map +1 -1
  54. package/dist/app/controls/json-control.component.js +4 -24
  55. package/dist/app/controls/number-control.component.d.ts.map +1 -1
  56. package/dist/app/controls/number-control.component.js +4 -11
  57. package/dist/app/controls/string-control.component.d.ts.map +1 -1
  58. package/dist/app/controls/string-control.component.js +4 -11
  59. package/dist/app/controls/union-control.component.d.ts.map +1 -1
  60. package/dist/app/controls/union-control.component.js +4 -16
  61. package/dist/app/directives/prism-resizer.directive.d.ts +24 -1
  62. package/dist/app/directives/prism-resizer.directive.d.ts.map +1 -1
  63. package/dist/app/directives/prism-resizer.directive.js +44 -7
  64. package/dist/app/directives/resize-value.d.ts +22 -0
  65. package/dist/app/directives/resize-value.d.ts.map +1 -0
  66. package/dist/app/directives/resize-value.js +23 -0
  67. package/dist/app/discovery-manifest.d.ts +2 -2
  68. package/dist/app/discovery-manifest.d.ts.map +1 -1
  69. package/dist/app/discovery-manifest.js +16 -22
  70. package/dist/app/header/prism-header-widget-host.component.d.ts.map +1 -1
  71. package/dist/app/header/prism-header-widget-host.component.js +4 -8
  72. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  73. package/dist/app/header/prism-header.component.js +9 -78
  74. package/dist/app/hmr.d.ts.map +1 -1
  75. package/dist/app/icons/icon-registry.d.ts +2 -2
  76. package/dist/app/icons/icon-registry.d.ts.map +1 -1
  77. package/dist/app/icons/icon-registry.js +5 -3
  78. package/dist/app/icons/prism-icon.component.d.ts +2 -2
  79. package/dist/app/icons/prism-icon.component.d.ts.map +1 -1
  80. package/dist/app/icons/prism-icon.component.js +9 -9
  81. package/dist/app/index.d.ts +3 -3
  82. package/dist/app/index.d.ts.map +1 -1
  83. package/dist/app/index.js +17 -24
  84. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  85. package/dist/app/layout-menu/prism-layout-menu.component.js +3 -77
  86. package/dist/app/overview/overview-panel.js +1 -1
  87. package/dist/app/overview/overview-visibility.d.ts +1 -1
  88. package/dist/app/overview/overview-visibility.d.ts.map +1 -1
  89. package/dist/app/overview/overview-visibility.js +1 -1
  90. package/dist/app/overview/prism-overview-cell.component.d.ts +2 -2
  91. package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -1
  92. package/dist/app/overview/prism-overview-cell.component.js +17 -25
  93. package/dist/app/overview/prism-overview.component.d.ts +2 -2
  94. package/dist/app/overview/prism-overview.component.d.ts.map +1 -1
  95. package/dist/app/overview/prism-overview.component.js +6 -14
  96. package/dist/app/page-renderer/prism-page-renderer.component.d.ts.map +1 -1
  97. package/dist/app/page-renderer/prism-page-renderer.component.js +4 -17
  98. package/dist/app/panels/a11y/a11y-audit.service.d.ts.map +1 -1
  99. package/dist/app/panels/a11y/a11y-audit.service.js +14 -2
  100. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
  101. package/dist/app/panels/a11y/a11y-core.plugin.js +1 -1
  102. package/dist/app/panels/a11y/a11y-dom-utils.d.ts.map +1 -1
  103. package/dist/app/panels/a11y/a11y-dom-utils.js +9 -6
  104. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
  105. package/dist/app/panels/a11y/a11y-header-badge.component.js +6 -22
  106. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.d.ts.map +1 -1
  107. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +6 -25
  108. package/dist/app/panels/a11y/a11y-keyboard.component.d.ts.map +1 -1
  109. package/dist/app/panels/a11y/a11y-keyboard.component.js +5 -36
  110. package/dist/app/panels/a11y/a11y-keyboard.service.d.ts.map +1 -1
  111. package/dist/app/panels/a11y/a11y-keyboard.service.js +2 -2
  112. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  113. package/dist/app/panels/a11y/a11y-overlay-host.component.js +5 -32
  114. package/dist/app/panels/a11y/a11y-panel-state.service.d.ts.map +1 -1
  115. package/dist/app/panels/a11y/a11y-panel.component.d.ts +1 -1
  116. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  117. package/dist/app/panels/a11y/a11y-panel.component.js +7 -69
  118. package/dist/app/panels/a11y/a11y-perspective.service.d.ts.map +1 -1
  119. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  120. package/dist/app/panels/a11y/a11y-score.component.js +4 -31
  121. package/dist/app/panels/a11y/a11y-sr-overlay.component.d.ts.map +1 -1
  122. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +8 -28
  123. package/dist/app/panels/a11y/a11y-sr.component.d.ts.map +1 -1
  124. package/dist/app/panels/a11y/a11y-sr.component.js +5 -28
  125. package/dist/app/panels/a11y/a11y-sr.service.d.ts.map +1 -1
  126. package/dist/app/panels/a11y/a11y-sr.service.js +4 -7
  127. package/dist/app/panels/a11y/a11y-summary.d.ts +3 -4
  128. package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -1
  129. package/dist/app/panels/a11y/a11y-summary.js +5 -9
  130. package/dist/app/panels/a11y/a11y-thresholds.d.ts +1 -1
  131. package/dist/app/panels/a11y/a11y-thresholds.d.ts.map +1 -1
  132. package/dist/app/panels/a11y/a11y-thresholds.js +2 -2
  133. package/dist/app/panels/a11y/a11y-tree.component.d.ts.map +1 -1
  134. package/dist/app/panels/a11y/a11y-tree.component.js +9 -46
  135. package/dist/app/panels/a11y/a11y-tree.service.d.ts.map +1 -1
  136. package/dist/app/panels/a11y/a11y-tree.service.js +3 -5
  137. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  138. package/dist/app/panels/a11y/a11y-violations.component.js +7 -58
  139. package/dist/app/panels/a11y/a11y.types.d.ts +1 -1
  140. package/dist/app/panels/a11y/a11y.types.d.ts.map +1 -1
  141. package/dist/app/panels/builtin-header-widgets.js +2 -2
  142. package/dist/app/panels/builtin-navigation-decorations.d.ts +1 -1
  143. package/dist/app/panels/builtin-navigation-decorations.d.ts.map +1 -1
  144. package/dist/app/panels/builtin-navigation-decorations.js +3 -3
  145. package/dist/app/panels/builtin-panels.d.ts.map +1 -1
  146. package/dist/app/panels/builtin-panels.js +2 -7
  147. package/dist/app/panels/controls/controls-plugin.js +3 -3
  148. package/dist/app/panels/controls/non-editable-input-types.d.ts.map +1 -1
  149. package/dist/app/panels/controls/non-editable-input-types.js +2 -6
  150. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  151. package/dist/app/panels/controls/prism-controls-panel.component.js +5 -95
  152. package/dist/app/panels/events/events-plugin.js +3 -3
  153. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  154. package/dist/app/panels/events/prism-events-panel.component.js +5 -23
  155. package/dist/app/panels/events/prism-json-node.component.d.ts.map +1 -1
  156. package/dist/app/panels/events/prism-json-node.component.js +4 -86
  157. package/dist/app/panels/events/prism-json-node.utils.d.ts.map +1 -1
  158. package/dist/app/panels/panel-host/panel-badge.d.ts +1 -1
  159. package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -1
  160. package/dist/app/panels/panel-host/panel-badge.js +2 -4
  161. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +1 -1
  162. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  163. package/dist/app/panels/panel-host/prism-panel-host.component.js +12 -67
  164. package/dist/app/provide-prism.d.ts +1 -1
  165. package/dist/app/provide-prism.d.ts.map +1 -1
  166. package/dist/app/provide-prism.js +8 -12
  167. package/dist/app/renderer/known-inputs.d.ts +1 -1
  168. package/dist/app/renderer/known-inputs.d.ts.map +1 -1
  169. package/dist/app/renderer/known-inputs.js +1 -1
  170. package/dist/app/renderer/overlay-resolver.d.ts +17 -3
  171. package/dist/app/renderer/overlay-resolver.d.ts.map +1 -1
  172. package/dist/app/renderer/overlay-resolver.js +10 -5
  173. package/dist/app/renderer/prism-renderer.component.d.ts +28 -3
  174. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  175. package/dist/app/renderer/prism-renderer.component.js +107 -80
  176. package/dist/app/renderer/projectable-content.d.ts.map +1 -1
  177. package/dist/app/renderer/projectable-content.js +4 -6
  178. package/dist/app/renderer/snippet-generator.d.ts +1 -1
  179. package/dist/app/renderer/snippet-generator.d.ts.map +1 -1
  180. package/dist/app/renderer/snippet-generator.js +7 -22
  181. package/dist/app/services/navigation-item.types.d.ts +1 -1
  182. package/dist/app/services/navigation-item.types.d.ts.map +1 -1
  183. package/dist/app/services/prism-canvas.service.d.ts +33 -0
  184. package/dist/app/services/prism-canvas.service.d.ts.map +1 -1
  185. package/dist/app/services/prism-canvas.service.js +71 -6
  186. package/dist/app/services/prism-capture.service.d.ts +24 -50
  187. package/dist/app/services/prism-capture.service.d.ts.map +1 -1
  188. package/dist/app/services/prism-capture.service.js +62 -146
  189. package/dist/app/services/prism-event-log.service.d.ts.map +1 -1
  190. package/dist/app/services/prism-event-log.service.js +1 -4
  191. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  192. package/dist/app/services/prism-layout.service.js +5 -4
  193. package/dist/app/services/prism-manifest.service.d.ts +1 -1
  194. package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
  195. package/dist/app/services/prism-manifest.service.js +1 -1
  196. package/dist/app/services/prism-measure.service.d.ts +44 -0
  197. package/dist/app/services/prism-measure.service.d.ts.map +1 -0
  198. package/dist/app/services/prism-measure.service.js +91 -0
  199. package/dist/app/services/prism-navigation.service.d.ts +1 -1
  200. package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
  201. package/dist/app/services/prism-navigation.service.js +5 -13
  202. package/dist/app/services/prism-panel.service.d.ts +2 -2
  203. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  204. package/dist/app/services/prism-panel.service.js +4 -7
  205. package/dist/app/services/prism-persistence.service.d.ts.map +1 -1
  206. package/dist/app/services/prism-persistence.service.js +9 -11
  207. package/dist/app/services/prism-plugin.service.d.ts.map +1 -1
  208. package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
  209. package/dist/app/services/prism-renderer.service.js +5 -9
  210. package/dist/app/services/prism-search.service.d.ts.map +1 -1
  211. package/dist/app/services/prism-search.service.js +1 -2
  212. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  213. package/dist/app/services/prism-theme.service.js +6 -4
  214. package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
  215. package/dist/app/services/prism-url-state.service.js +4 -10
  216. package/dist/app/services/prism-variant-bg.service.d.ts +10 -24
  217. package/dist/app/services/prism-variant-bg.service.d.ts.map +1 -1
  218. package/dist/app/services/prism-variant-bg.service.js +13 -29
  219. package/dist/app/shared/prism-metric-badge.component.d.ts +9 -15
  220. package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -1
  221. package/dist/app/shared/prism-metric-badge.component.js +13 -32
  222. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  223. package/dist/app/shell/prism-shell.component.js +26 -125
  224. package/dist/app/sidebar/navigation-decorations.d.ts +4 -4
  225. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
  226. package/dist/app/sidebar/navigation-decorations.js +3 -3
  227. package/dist/app/sidebar/prism-sidebar.component.d.ts +3 -3
  228. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  229. package/dist/app/sidebar/prism-sidebar.component.js +21 -156
  230. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  231. package/dist/app/theme/prism-default-theme.js +6 -6
  232. package/dist/app/tokens/prism-tokens.d.ts.map +1 -1
  233. package/dist/app/tokens/prism-tokens.js +1 -1
  234. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  235. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +4 -49
  236. package/dist/app/variant-ribbon/spectrum.d.ts +1 -1
  237. package/dist/app/variant-ribbon/spectrum.d.ts.map +1 -1
  238. package/dist/app/variant-ribbon/spectrum.js +1 -1
  239. package/dist/app/view-tab-bar/next-view-id.d.ts +1 -1
  240. package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -1
  241. package/dist/app/view-tab-bar/next-view-id.js +2 -4
  242. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
  243. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +5 -17
  244. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  245. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +4 -27
  246. package/dist/builder/a11y/a11y-report-reader.d.ts +2 -2
  247. package/dist/builder/a11y/a11y-report-reader.d.ts.map +1 -1
  248. package/dist/builder/a11y/a11y-report-reader.js +8 -8
  249. package/dist/builder/build/index.d.ts.map +1 -1
  250. package/dist/builder/build/index.js +5 -9
  251. package/dist/builder/build/schema.d.ts.map +1 -1
  252. package/dist/builder/config-loader/config-loader.d.ts.map +1 -1
  253. package/dist/builder/config-loader/config-loader.js +4 -5
  254. package/dist/builder/manifest/host-parser.d.ts.map +1 -1
  255. package/dist/builder/manifest/host-parser.js +1 -1
  256. package/dist/builder/manifest/runtime-manifest.generator.d.ts +1 -1
  257. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
  258. package/dist/builder/manifest/runtime-manifest.generator.js +14 -35
  259. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
  260. package/dist/builder/plugin-runner/plugin-runner.js +2 -4
  261. package/dist/builder/scanner/ast-utils.d.ts +46 -2
  262. package/dist/builder/scanner/ast-utils.d.ts.map +1 -1
  263. package/dist/builder/scanner/ast-utils.js +338 -38
  264. package/dist/builder/scanner/class-hierarchy.d.ts +33 -0
  265. package/dist/builder/scanner/class-hierarchy.d.ts.map +1 -0
  266. package/dist/builder/scanner/class-hierarchy.js +87 -0
  267. package/dist/builder/scanner/component.scanner.d.ts +7 -1
  268. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  269. package/dist/builder/scanner/component.scanner.js +113 -72
  270. package/dist/builder/scanner/entry-point-discovery.d.ts.map +1 -1
  271. package/dist/builder/scanner/entry-point-discovery.js +3 -5
  272. package/dist/builder/scanner/entry-point.scanner.d.ts.map +1 -1
  273. package/dist/builder/scanner/entry-point.scanner.js +1 -3
  274. package/dist/builder/scanner/index.d.ts +1 -1
  275. package/dist/builder/scanner/index.d.ts.map +1 -1
  276. package/dist/builder/scanner/input.extractor.d.ts +7 -4
  277. package/dist/builder/scanner/input.extractor.d.ts.map +1 -1
  278. package/dist/builder/scanner/input.extractor.js +157 -76
  279. package/dist/builder/scanner/manifest.generator.d.ts.map +1 -1
  280. package/dist/builder/scanner/manifest.generator.js +8 -6
  281. package/dist/builder/scanner/scanner.d.ts +3 -1
  282. package/dist/builder/scanner/scanner.d.ts.map +1 -1
  283. package/dist/builder/scanner/scanner.js +10 -8
  284. package/dist/builder/scanner/showcase-diagnostics.d.ts +25 -0
  285. package/dist/builder/scanner/showcase-diagnostics.d.ts.map +1 -0
  286. package/dist/builder/scanner/showcase-diagnostics.js +96 -0
  287. package/dist/builder/serve/index.d.ts.map +1 -1
  288. package/dist/builder/serve/index.js +8 -10
  289. package/dist/builder/serve/schema.d.ts.map +1 -1
  290. package/dist/builder/shared/index.d.ts +1 -1
  291. package/dist/builder/shared/index.d.ts.map +1 -1
  292. package/dist/builder/shared/index.js +1 -1
  293. package/dist/builder/shared/prism-pipeline.d.ts +1 -1
  294. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  295. package/dist/builder/shared/prism-pipeline.js +29 -38
  296. package/dist/builder/shared/resolve-cache-dir.d.ts.map +1 -1
  297. package/dist/builder/shared/resolve-cache-dir.js +1 -1
  298. package/dist/builder/watcher/index.d.ts +1 -1
  299. package/dist/builder/watcher/index.d.ts.map +1 -1
  300. package/dist/builder/watcher/prism-watcher.d.ts.map +1 -1
  301. package/dist/builder/watcher/prism-watcher.js +14 -12
  302. package/dist/config/index.d.ts +2 -2
  303. package/dist/config/index.d.ts.map +1 -1
  304. package/dist/config/index.js +1 -1
  305. package/dist/decorator/index.d.ts +1 -1
  306. package/dist/decorator/index.d.ts.map +1 -1
  307. package/dist/decorator/showcase.decorator.d.ts.map +1 -1
  308. package/dist/decorator/showcase.types.d.ts +11 -9
  309. package/dist/decorator/showcase.types.d.ts.map +1 -1
  310. package/dist/index.js +3 -3
  311. package/dist/plugin/define-config.js +1 -1
  312. package/dist/plugin/index.d.ts +4 -4
  313. package/dist/plugin/index.d.ts.map +1 -1
  314. package/dist/plugin/index.js +7 -11
  315. package/dist/plugin/page-helpers.d.ts +1 -1
  316. package/dist/plugin/page-helpers.d.ts.map +1 -1
  317. package/dist/plugin/page-helpers.js +2 -2
  318. package/dist/plugin/page.types.d.ts.map +1 -1
  319. package/dist/plugin/plugin.types.d.ts +31 -14
  320. package/dist/plugin/plugin.types.d.ts.map +1 -1
  321. package/dist/schematics/migrations/v21-13-manifest-cache/index.d.ts.map +1 -1
  322. package/dist/schematics/migrations/v21-13-manifest-cache/index.js +4 -10
  323. package/dist/schematics/migrations/v22-0-cache-dir-rename/index.d.ts.map +1 -1
  324. package/dist/schematics/migrations/v22-0-cache-dir-rename/index.js +6 -10
  325. package/dist/schematics/ng-add/index.d.ts.map +1 -1
  326. package/dist/schematics/ng-add/index.js +122 -56
  327. package/dist/schematics/ng-add/schema.d.ts.map +1 -1
  328. package/dist/schematics/utils/config-ast.d.ts.map +1 -1
  329. package/dist/schematics/utils/config-ast.js +8 -15
  330. package/dist/schematics/utils/tsconfig-paths.d.ts.map +1 -1
  331. package/dist/schematics/utils/tsconfig-paths.js +1 -1
  332. package/dist/shared/canvas-bg.type.d.ts +5 -6
  333. package/dist/shared/canvas-bg.type.d.ts.map +1 -1
  334. package/dist/shared/canvas-bg.type.js +5 -13
  335. package/dist/shared/canvas-layout.type.d.ts.map +1 -1
  336. package/dist/shared/canvas-layout.type.js +1 -4
  337. package/dist/shared/measure.type.d.ts +52 -0
  338. package/dist/shared/measure.type.d.ts.map +1 -0
  339. package/dist/shared/measure.type.js +21 -0
  340. package/dist/shared/variant-bg.d.ts +20 -31
  341. package/dist/shared/variant-bg.d.ts.map +1 -1
  342. package/dist/shared/variant-bg.js +20 -31
  343. package/dist/shared/viewport.type.d.ts +43 -0
  344. package/dist/shared/viewport.type.d.ts.map +1 -0
  345. package/dist/shared/viewport.type.js +44 -0
  346. package/dist/transformer/cli.js +0 -0
  347. package/dist/transformer/index.d.ts +2 -2
  348. package/dist/transformer/index.d.ts.map +1 -1
  349. package/dist/transformer/index.js +2 -2
  350. package/dist/transformer/showcase-strip.transformer.d.ts.map +1 -1
  351. package/dist/transformer/showcase-strip.transformer.js +7 -16
  352. package/dist/transformer/strip-directory.d.ts.map +1 -1
  353. package/dist/transformer/strip-directory.js +2 -4
  354. package/package.json +5 -2
  355. package/schematics/collection.json +7 -7
  356. package/schematics/migrations.json +12 -12
  357. package/schematics/ng-add/schema.json +22 -22
  358. package/src/builder/build/schema.json +36 -36
  359. package/src/builder/serve/schema.json +37 -37
@@ -1,14 +1,69 @@
1
1
  import ts from 'typescript';
2
+ /**
3
+ * What {@link evaluateStatic} returns for a root it cannot evaluate. A symbol,
4
+ * so that it stays distinct from an `undefined` written on purpose.
5
+ */
6
+ export const UNEVALUABLE = Symbol('ng-prism.unevaluable');
7
+ const ignore = () => undefined;
8
+ const ARITHMETIC = {
9
+ [ts.SyntaxKind.PlusToken]: (left, right) => left + right,
10
+ [ts.SyntaxKind.MinusToken]: (left, right) => left - right,
11
+ [ts.SyntaxKind.AsteriskToken]: (left, right) => left * right,
12
+ [ts.SyntaxKind.SlashToken]: (left, right) => left / right,
13
+ [ts.SyntaxKind.PercentToken]: (left, right) => left % right,
14
+ [ts.SyntaxKind.AsteriskAsteriskToken]: (left, right) => left ** right
15
+ };
16
+ /** Symbols that name a declaration of their own, as opposed to a property inside a constant's value. */
17
+ const DECLARATION_SYMBOLS = ts.SymbolFlags.Variable | ts.SymbolFlags.EnumMember | ts.SymbolFlags.Function | ts.SymbolFlags.Class | ts.SymbolFlags.Method;
2
18
  /**
3
19
  * Statically evaluate an AST expression node.
4
- * Returns `undefined` for non-evaluable expressions (variables, function calls, spread).
20
+ *
21
+ * Inside an object or array literal, whatever cannot be evaluated costs only
22
+ * that property or element: it is reported and left out, never the container
23
+ * around it. Only the root itself can come back as {@link UNEVALUABLE}.
24
+ */
25
+ export function evaluateStatic(node, options = {}) {
26
+ return evaluateMember(node, [], { report: options.report ?? ignore, checker: options.checker, resolving: new Set(), resolved: new Map(), trace: {} });
27
+ }
28
+ /**
29
+ * {@link evaluateStatic} for callers that read a few known fields and have no
30
+ * use for diagnostics, such as `@Component` metadata: what cannot be evaluated
31
+ * is left out silently, and an unevaluable root becomes `undefined`.
32
+ */
33
+ export function evaluateExpression(node, checker) {
34
+ const value = evaluateStatic(node, { checker });
35
+ return value === UNEVALUABLE ? undefined : value;
36
+ }
37
+ function evaluateMember(node, path, context) {
38
+ return guard(node, path, context, () => evaluateNode(node, path, context));
39
+ }
40
+ /** Runs `evaluate` for the member `node` and, if it fails, reports it with the cause the trace picked up on the way. */
41
+ function guard(node, path, context, evaluate) {
42
+ const { trace } = context;
43
+ const outer = trace.cause;
44
+ trace.cause = undefined;
45
+ const value = evaluate();
46
+ if (value === UNEVALUABLE) {
47
+ context.report({ path, node, reason: isRuntimeValue(node) ? 'runtime-value' : 'unsupported', cause: trace.cause });
48
+ }
49
+ trace.cause = outer;
50
+ return value;
51
+ }
52
+ /** For operands and keys: what fails inside them is the failure of the member around them, not a drop of its own. */
53
+ function silent(context) {
54
+ return { ...context, report: ignore };
55
+ }
56
+ /**
57
+ * Reports only what an array or object literal drops. An operand that fails
58
+ * makes the whole expression around it {@link UNEVALUABLE}, so the member
59
+ * holding it reports `limit * 2`, not just `limit`.
5
60
  */
6
- export function evaluateExpression(node) {
61
+ function evaluateNode(node, path, context) {
7
62
  if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
8
63
  return node.text;
9
64
  }
10
65
  if (ts.isNumericLiteral(node)) {
11
- return Number(node.text);
66
+ return finite(Number(node.text));
12
67
  }
13
68
  if (node.kind === ts.SyntaxKind.TrueKeyword)
14
69
  return true;
@@ -16,45 +71,292 @@ export function evaluateExpression(node) {
16
71
  return false;
17
72
  if (node.kind === ts.SyntaxKind.NullKeyword)
18
73
  return null;
19
- if (node.kind === ts.SyntaxKind.UndefinedKeyword)
20
- return undefined;
21
- if (ts.isParenthesizedExpression(node)) {
22
- return evaluateExpression(node.expression);
74
+ if (ts.isIdentifier(node)) {
75
+ // In expression position `undefined` parses as an identifier, not a keyword.
76
+ if (node.text === 'undefined')
77
+ return undefined;
78
+ return evaluateReference(context.checker?.getSymbolAtLocation(node), node, path, context);
23
79
  }
24
- if (ts.isPrefixUnaryExpression(node) && node.operator === ts.SyntaxKind.MinusToken) {
25
- const operand = evaluateExpression(node.operand);
26
- if (typeof operand === 'number')
27
- return -operand;
28
- return undefined;
80
+ // Types only: the value is the expression inside.
81
+ if (ts.isParenthesizedExpression(node) ||
82
+ ts.isAsExpression(node) ||
83
+ ts.isSatisfiesExpression(node) ||
84
+ ts.isNonNullExpression(node) ||
85
+ ts.isTypeAssertionExpression(node)) {
86
+ return evaluateNode(node.expression, path, context);
87
+ }
88
+ if (ts.isPrefixUnaryExpression(node)) {
89
+ return evaluatePrefixUnary(node, context);
90
+ }
91
+ if (ts.isBinaryExpression(node)) {
92
+ return evaluateBinary(node, context);
93
+ }
94
+ if (ts.isTemplateExpression(node)) {
95
+ return evaluateTemplate(node, context);
96
+ }
97
+ if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) {
98
+ return evaluateAccess(node, path, context);
29
99
  }
30
100
  if (ts.isArrayLiteralExpression(node)) {
31
- const result = [];
32
- for (const element of node.elements) {
33
- if (ts.isSpreadElement(element))
34
- return undefined;
35
- result.push(evaluateExpression(element));
36
- }
37
- return result;
101
+ return evaluateArray(node, path, context);
38
102
  }
39
103
  if (ts.isObjectLiteralExpression(node)) {
40
- const result = {};
41
- for (const prop of node.properties) {
42
- if (ts.isSpreadAssignment(prop))
43
- return undefined;
44
- if (!ts.isPropertyAssignment(prop))
45
- return undefined;
46
- const key = ts.isIdentifier(prop.name)
47
- ? prop.name.text
48
- : ts.isStringLiteral(prop.name)
49
- ? prop.name.text
50
- : undefined;
51
- if (key === undefined)
52
- return undefined;
53
- result[key] = evaluateExpression(prop.initializer);
104
+ return evaluateObject(node, path, context);
105
+ }
106
+ return UNEVALUABLE;
107
+ }
108
+ /**
109
+ * The value of the declaration a reference points to: the initializer of a
110
+ * `const`, or the value of an enum member. Imports are followed to their
111
+ * source, and what the initializer drops is reported where it is written.
112
+ */
113
+ function evaluateReference(symbol, reference, path, context) {
114
+ const { checker } = context;
115
+ if (!symbol || !checker)
116
+ return UNEVALUABLE;
117
+ const target = resolveAlias(symbol, checker);
118
+ const declaration = target.valueDeclaration;
119
+ if (target.flags & (ts.SymbolFlags.Function | ts.SymbolFlags.Class | ts.SymbolFlags.Method)) {
120
+ return fail(reference, 'runtime-value', context);
121
+ }
122
+ if (declaration && ts.isEnumMember(declaration)) {
123
+ // Asked of the member, not of `Size.Medium`: for an access the checker only answers for const enums.
124
+ return checker.getConstantValue(declaration) ?? UNEVALUABLE;
125
+ }
126
+ if (!declaration || !ts.isVariableDeclaration(declaration) || !ts.isIdentifier(declaration.name))
127
+ return UNEVALUABLE;
128
+ // Before let and var: an ambient `declare var Math` is a declaration without a value, not a variable the user chose.
129
+ if (!declaration.initializer)
130
+ return fail(reference, 'no-value', context);
131
+ const scope = ts.getCombinedNodeFlags(declaration) & ts.NodeFlags.BlockScoped;
132
+ if (scope === ts.NodeFlags.Let)
133
+ return fail(reference, 'let', context);
134
+ if (scope === 0)
135
+ return fail(reference, 'var', context);
136
+ if (scope !== ts.NodeFlags.Const)
137
+ return UNEVALUABLE;
138
+ const resolved = context.resolved.get(declaration) ?? resolveConstant(declaration, declaration.initializer, context);
139
+ if (!resolved)
140
+ return fail(reference, 'cycle', context);
141
+ for (const issue of resolved.issues)
142
+ context.report({ ...issue, path: [...path, ...issue.path] });
143
+ if (resolved.value === UNEVALUABLE) {
144
+ context.trace.cause ??= resolved.cause;
145
+ return UNEVALUABLE;
146
+ }
147
+ // A copy per reference, so that two of them never share an object a plugin could change through either.
148
+ return structuredClone(resolved.value);
149
+ }
150
+ /**
151
+ * Folds a constant once per evaluation, recording its issues relative to the
152
+ * constant itself. `undefined` while the same constant is still being folded
153
+ * further up, which is a cycle.
154
+ */
155
+ function resolveConstant(declaration, initializer, context) {
156
+ if (context.resolving.has(declaration))
157
+ return undefined;
158
+ const issues = [];
159
+ const trace = {};
160
+ context.resolving.add(declaration);
161
+ try {
162
+ const value = evaluateNode(initializer, [], { ...context, report: (issue) => issues.push(issue), trace });
163
+ const resolved = { value, issues, cause: trace.cause };
164
+ context.resolved.set(declaration, resolved);
165
+ return resolved;
166
+ }
167
+ finally {
168
+ context.resolving.delete(declaration);
169
+ }
170
+ }
171
+ function resolveAlias(symbol, checker) {
172
+ return symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;
173
+ }
174
+ function fail(reference, kind, context) {
175
+ context.trace.cause ??= { node: reference, kind };
176
+ return UNEVALUABLE;
177
+ }
178
+ /**
179
+ * `tokens.MAX_FILES` and `Size.Medium` name a declaration of their own.
180
+ * `TOKENS.size.m` and `SIZES[1]` read a property from a constant's value.
181
+ */
182
+ function evaluateAccess(node, path, context) {
183
+ const { checker } = context;
184
+ const symbol = checker?.getSymbolAtLocation(node);
185
+ if (symbol && checker && resolveAlias(symbol, checker).flags & DECLARATION_SYMBOLS) {
186
+ return evaluateReference(symbol, node, path, context);
187
+ }
188
+ const dropped = [];
189
+ const object = evaluateNode(node.expression, [], { ...context, report: (issue) => dropped.push(issue) });
190
+ const key = ts.isPropertyAccessExpression(node) ? node.name.text : evaluateNode(node.argumentExpression, [], silent(context));
191
+ if (typeof object !== 'object' || object === null || (typeof key !== 'string' && typeof key !== 'number'))
192
+ return UNEVALUABLE;
193
+ const lost = dropped.find((issue) => touches(issue.path, key, Array.isArray(object)));
194
+ if (lost) {
195
+ context.trace.cause ??= lost.cause;
196
+ return UNEVALUABLE;
197
+ }
198
+ return Object.hasOwn(object, key) ? object[key] : UNEVALUABLE;
199
+ }
200
+ /**
201
+ * Whether a part dropped from an object or array could change what `[key]`
202
+ * reads from it: the part itself, something a spread might have supplied, or,
203
+ * in an array, an element whose removal moved the later ones up.
204
+ */
205
+ function touches(dropped, key, array) {
206
+ if (dropped.length === 0)
207
+ return true;
208
+ const [head] = dropped;
209
+ if (!array)
210
+ return String(head) === String(key);
211
+ const index = Number(key);
212
+ const moved = dropped.length === 1 && (key === 'length' || (typeof head === 'number' && head < index));
213
+ return head === index || moved;
214
+ }
215
+ function evaluatePrefixUnary(node, context) {
216
+ const operand = evaluateNode(node.operand, [], silent(context));
217
+ switch (node.operator) {
218
+ case ts.SyntaxKind.MinusToken:
219
+ return typeof operand === 'number' ? -operand : UNEVALUABLE;
220
+ case ts.SyntaxKind.PlusToken:
221
+ return typeof operand === 'number' ? operand : UNEVALUABLE;
222
+ case ts.SyntaxKind.ExclamationToken:
223
+ return operand === UNEVALUABLE ? UNEVALUABLE : !operand;
224
+ default:
225
+ return UNEVALUABLE;
226
+ }
227
+ }
228
+ /**
229
+ * Arithmetic on numbers, and `+` as concatenation once either side is a
230
+ * string. Anything JavaScript would coerce beyond that, such as an object to
231
+ * `[object Object]`, is not what anybody meant to put into a showcase.
232
+ */
233
+ function evaluateBinary(node, context) {
234
+ const operator = node.operatorToken.kind;
235
+ const left = evaluateNode(node.left, [], silent(context));
236
+ const right = evaluateNode(node.right, [], silent(context));
237
+ if (operator === ts.SyntaxKind.PlusToken && (typeof left === 'string' || typeof right === 'string')) {
238
+ return isPrimitive(left) && isPrimitive(right) ? String(left) + String(right) : UNEVALUABLE;
239
+ }
240
+ const apply = ARITHMETIC[operator];
241
+ return apply && typeof left === 'number' && typeof right === 'number' ? finite(apply(left, right)) : UNEVALUABLE;
242
+ }
243
+ function evaluateTemplate(node, context) {
244
+ let text = node.head.text;
245
+ for (const span of node.templateSpans) {
246
+ const value = evaluateNode(span.expression, [], silent(context));
247
+ if (!isPrimitive(value))
248
+ return UNEVALUABLE;
249
+ text += String(value) + span.literal.text;
250
+ }
251
+ return text;
252
+ }
253
+ function isPrimitive(value) {
254
+ return value === null || value === undefined || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
255
+ }
256
+ function isRecord(value) {
257
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
258
+ }
259
+ /** `Infinity` and `NaN` would reach the manifest as `null`. */
260
+ function finite(value) {
261
+ return Number.isFinite(value) ? value : UNEVALUABLE;
262
+ }
263
+ function evaluateArray(node, path, context) {
264
+ const result = [];
265
+ node.elements.forEach((element, index) => {
266
+ const elementPath = [...path, index];
267
+ if (ts.isOmittedExpression(element)) {
268
+ // A hole is a position, not a value that went missing.
269
+ result.push(undefined);
270
+ return;
271
+ }
272
+ if (ts.isSpreadElement(element)) {
273
+ const spread = guard(element, elementPath, context, () => {
274
+ const value = evaluateNode(element.expression, elementPath, context);
275
+ return Array.isArray(value) ? value : UNEVALUABLE;
276
+ });
277
+ if (Array.isArray(spread))
278
+ result.push(...spread);
279
+ return;
280
+ }
281
+ const value = evaluateMember(element, elementPath, context);
282
+ if (value !== UNEVALUABLE)
283
+ result.push(value);
284
+ });
285
+ return result;
286
+ }
287
+ function evaluateObject(node, path, context) {
288
+ const result = {};
289
+ for (const prop of node.properties) {
290
+ if (ts.isSpreadAssignment(prop)) {
291
+ const spread = guard(prop, path, context, () => {
292
+ const value = evaluateNode(prop.expression, path, context);
293
+ return isRecord(value) ? value : UNEVALUABLE;
294
+ });
295
+ if (isRecord(spread)) {
296
+ for (const [key, value] of Object.entries(spread))
297
+ setOwn(result, key, value);
298
+ }
299
+ continue;
54
300
  }
55
- return result;
301
+ if (ts.isShorthandPropertyAssignment(prop)) {
302
+ const keyPath = [...path, prop.name.text];
303
+ const value = guard(prop, keyPath, context, () => evaluateReference(context.checker?.getShorthandAssignmentValueSymbol(prop), prop.name, keyPath, context));
304
+ assign(result, prop.name.text, value);
305
+ continue;
306
+ }
307
+ const key = propertyKey(prop, path, context);
308
+ if (key === undefined)
309
+ continue;
310
+ if (key === '__proto__' && !ts.isComputedPropertyName(prop.name)) {
311
+ // In a literal, `__proto__: x` sets the prototype instead of creating a property.
312
+ context.report({ path: [...path, key], node: prop, reason: 'unsupported' });
313
+ continue;
314
+ }
315
+ if (!ts.isPropertyAssignment(prop)) {
316
+ // Methods and accessors: functions, whatever their syntax.
317
+ context.report({ path: [...path, key], node: prop, reason: 'runtime-value' });
318
+ assign(result, key, UNEVALUABLE);
319
+ continue;
320
+ }
321
+ assign(result, key, evaluateMember(prop.initializer, [...path, key], context));
56
322
  }
57
- return undefined;
323
+ return result;
324
+ }
325
+ /** The key of `prop`, or `undefined` once it is reported as unreadable, with the reason if a reference is to blame. */
326
+ function propertyKey(prop, path, context) {
327
+ const key = guard(prop, path, context, () => {
328
+ const { name } = prop;
329
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name))
330
+ return name.text;
331
+ if (ts.isNumericLiteral(name))
332
+ return String(Number(name.text));
333
+ if (!ts.isComputedPropertyName(name))
334
+ return UNEVALUABLE;
335
+ const value = evaluateNode(name.expression, [], silent(context));
336
+ return typeof value === 'string' || typeof value === 'number' ? String(value) : UNEVALUABLE;
337
+ });
338
+ return typeof key === 'string' ? key : undefined;
339
+ }
340
+ /**
341
+ * Sets `key`, or removes it when its value could not be evaluated: the source
342
+ * overrides whatever an earlier spread put there, so keeping that would show
343
+ * a value the source replaces.
344
+ */
345
+ function assign(target, key, value) {
346
+ if (value === UNEVALUABLE) {
347
+ Reflect.deleteProperty(target, key);
348
+ return;
349
+ }
350
+ setOwn(target, key, value);
351
+ }
352
+ /** An own property even for `__proto__`, which plain assignment would turn into the prototype. */
353
+ function setOwn(target, key, value) {
354
+ Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
355
+ }
356
+ function isRuntimeValue(node) {
357
+ if (ts.isParenthesizedExpression(node))
358
+ return isRuntimeValue(node.expression);
359
+ return ts.isArrowFunction(node) || ts.isFunctionExpression(node) || ts.isClassExpression(node) || ts.isNewExpression(node);
58
360
  }
59
361
  /**
60
362
  * Find a decorator by name on a class or property declaration.
@@ -90,9 +392,7 @@ export function getDecoratorArgument(decorator) {
90
392
  * Get the JSDoc comment for a node.
91
393
  */
92
394
  export function getJsDocComment(node, checker) {
93
- const symbol = checker.getSymbolAtLocation(ts.isClassDeclaration(node) || ts.isPropertyDeclaration(node)
94
- ? (node.name ?? node)
95
- : node);
395
+ const symbol = checker.getSymbolAtLocation(ts.isClassDeclaration(node) || ts.isPropertyDeclaration(node) ? (node.name ?? node) : node);
96
396
  if (!symbol)
97
397
  return undefined;
98
398
  const doc = ts.displayPartsToString(symbol.getDocumentationComment(checker)).trim();
@@ -0,0 +1,33 @@
1
+ import ts from 'typescript';
2
+ export interface HierarchyClass {
3
+ classDecl: ts.ClassDeclaration;
4
+ /**
5
+ * Whether Angular takes inputs and outputs from it: the class itself, or a
6
+ * base class with @Directive() or @Component(). Angular passes over an
7
+ * undecorated base class, although its fields are still initialized.
8
+ */
9
+ definesMetadata: boolean;
10
+ }
11
+ export interface UnreadableBase {
12
+ classDecl: ts.ClassDeclaration;
13
+ /** Public names of the inputs it declares. */
14
+ inputs: string[];
15
+ }
16
+ export interface ClassHierarchy {
17
+ /** The class itself, then each base class with source, nearest first. */
18
+ classes: HierarchyClass[];
19
+ /**
20
+ * Base classes that only exist as a declaration and declare inputs:
21
+ * typically a .d.ts shipped by an npm package, or a `declare class`.
22
+ * Without the initializer there is no `input()` call, required flag or
23
+ * default left to read.
24
+ */
25
+ unreadable: UnreadableBase[];
26
+ }
27
+ /**
28
+ * Follow `extends` from a class up to the root of its hierarchy. A mixin
29
+ * (`extends withX(Base)`) ends the walk: what the call returns has no class
30
+ * declaration to read members from.
31
+ */
32
+ export declare function getClassHierarchy(classDecl: ts.ClassDeclaration, checker: ts.TypeChecker): ClassHierarchy;
33
+ //# sourceMappingURL=class-hierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-hierarchy.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/class-hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAS5B,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC;IAC/B;;;;OAIG;IACH,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC;IAC/B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC3B,yEAAyE;IACzE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B;;;;;OAKG;IACH,UAAU,EAAE,cAAc,EAAE,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,GAAG,cAAc,CAmBzG"}
@@ -0,0 +1,87 @@
1
+ import ts from 'typescript';
2
+ import { findDecorator } from './ast-utils.js';
3
+ /** The types Angular gives a signal input, which is all a `declare class` written by hand shows of one. */
4
+ const INPUT_SIGNAL_TYPES = new Set(['InputSignal', 'InputSignalWithTransform', 'ModelSignal']);
5
+ /** The static fields the Angular compiler writes a class's directive definition into. */
6
+ const DEFINITION_FIELDS = new Set(['ɵdir', 'ɵcmp']);
7
+ /**
8
+ * Follow `extends` from a class up to the root of its hierarchy. A mixin
9
+ * (`extends withX(Base)`) ends the walk: what the call returns has no class
10
+ * declaration to read members from.
11
+ */
12
+ export function getClassHierarchy(classDecl, checker) {
13
+ const classes = [];
14
+ const unreadable = [];
15
+ const visited = new Set();
16
+ for (let current = classDecl; current && !visited.has(current); current = getBaseClass(current, checker)) {
17
+ visited.add(current);
18
+ if (!isDeclarationOnly(current)) {
19
+ classes.push({ classDecl: current, definesMetadata: current === classDecl || isAngularClass(current) });
20
+ continue;
21
+ }
22
+ const inputs = getDeclaredInputs(current, checker);
23
+ if (inputs.length > 0)
24
+ unreadable.push({ classDecl: current, inputs });
25
+ }
26
+ return { classes, unreadable };
27
+ }
28
+ function isAngularClass(classDecl) {
29
+ return !!(findDecorator(classDecl, 'Directive') ?? findDecorator(classDecl, 'Component'));
30
+ }
31
+ function getBaseClass(classDecl, checker) {
32
+ const clause = classDecl.heritageClauses?.find((c) => c.token === ts.SyntaxKind.ExtendsKeyword);
33
+ let expression = clause?.types[0]?.expression;
34
+ while (expression && ts.isParenthesizedExpression(expression))
35
+ expression = expression.expression;
36
+ if (!expression || !(ts.isIdentifier(expression) || ts.isPropertyAccessExpression(expression)))
37
+ return undefined;
38
+ let symbol = checker.getSymbolAtLocation(expression);
39
+ if (symbol && symbol.flags & ts.SymbolFlags.Alias)
40
+ symbol = checker.getAliasedSymbol(symbol);
41
+ return symbol?.declarations?.find(ts.isClassDeclaration);
42
+ }
43
+ /** A class in a .d.ts, a `declare class`, or one inside `declare module` or `declare namespace`. */
44
+ function isDeclarationOnly(classDecl) {
45
+ if (classDecl.getSourceFile().isDeclarationFile)
46
+ return true;
47
+ for (let node = classDecl; !ts.isSourceFile(node); node = node.parent) {
48
+ if ((ts.isClassDeclaration(node) || ts.isModuleDeclaration(node)) && ts.getModifiers(node)?.some((m) => m.kind === ts.SyntaxKind.DeclareKeyword)) {
49
+ return true;
50
+ }
51
+ }
52
+ return false;
53
+ }
54
+ /**
55
+ * The input map the Angular compiler writes into `ɵdir`/`ɵcmp` is complete,
56
+ * decorator inputs and aliases included. It writes one for every decorated
57
+ * class, so a compiled class without it is one Angular does not inherit from.
58
+ * A `declare class` written by hand has no map at all; there the properties
59
+ * typed as signal inputs are all there is to go by.
60
+ */
61
+ function getDeclaredInputs(classDecl, checker) {
62
+ const definition = classDecl.members.find((member) => ts.isPropertyDeclaration(member) && DEFINITION_FIELDS.has(getPropertyNameText(member.name) ?? ''));
63
+ if (definition) {
64
+ const inputMap = definition.type && ts.isTypeReferenceNode(definition.type) ? definition.type.typeArguments?.[3] : undefined;
65
+ return inputMap && ts.isTypeLiteralNode(inputMap) ? inputMap.members.flatMap((entry) => getPublicInputName(entry) ?? []) : [];
66
+ }
67
+ if (classDecl.getSourceFile().isDeclarationFile)
68
+ return [];
69
+ return classDecl.members.flatMap((member) => {
70
+ const name = ts.isPropertyDeclaration(member) ? getPropertyNameText(member.name) : undefined;
71
+ // Through the checker, so an import type or an alias of InputSignal counts too.
72
+ return name && INPUT_SIGNAL_TYPES.has(checker.getTypeAtLocation(member).symbol?.name ?? '') ? [name] : [];
73
+ });
74
+ }
75
+ /** `{ alias: 'x'; required: … }` since Angular 16, a plain `'x'` before; a `null` alias means the property name. */
76
+ function getPublicInputName(entry) {
77
+ if (!ts.isPropertySignature(entry))
78
+ return undefined;
79
+ const alias = entry.type && ts.isTypeLiteralNode(entry.type) ? entry.type.members.find((m) => getPropertyNameText(m.name) === 'alias') : undefined;
80
+ const aliasType = alias && ts.isPropertySignature(alias) ? alias.type : entry.type;
81
+ if (aliasType && ts.isLiteralTypeNode(aliasType) && ts.isStringLiteral(aliasType.literal))
82
+ return aliasType.literal.text;
83
+ return getPropertyNameText(entry.name);
84
+ }
85
+ function getPropertyNameText(name) {
86
+ return name && (ts.isIdentifier(name) || ts.isStringLiteral(name)) ? name.text : undefined;
87
+ }
@@ -2,6 +2,12 @@ import ts from 'typescript';
2
2
  import type { ScannedComponent } from '../../plugin/plugin.types.js';
3
3
  /**
4
4
  * Scan exported symbols for Angular components annotated with @Showcase.
5
+ *
6
+ * Every @Showcase value the scan has to drop is printed and collected in
7
+ * `diagnostics`, once: sharing the array across entry points keeps a
8
+ * component exported from several of them from repeating its warnings.
9
+ * `notices` does the same for warnings about what a component inherits,
10
+ * which are not diagnostics.
5
11
  */
6
- export declare function scanComponents(exports: ts.Symbol[], checker: ts.TypeChecker): ScannedComponent[];
12
+ export declare function scanComponents(exports: ts.Symbol[], checker: ts.TypeChecker, diagnostics?: string[], notices?: Set<string>): ScannedComponent[];
7
13
  //# sourceMappingURL=component.scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/component.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAmErE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,EACpB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,gBAAgB,EAAE,CA8CpB"}
1
+ {"version":3,"file":"component.scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/component.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAgDrE;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,WAAW,GAAE,MAAM,EAAO,EAAE,OAAO,cAAoB,GAAG,gBAAgB,EAAE,CAsEzJ"}