@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,84 +1,174 @@
1
1
  import ts from 'typescript';
2
- import { evaluateExpression, findDecorator, getDecoratorArgument, getJsDocComment, } from './ast-utils.js';
2
+ import { evaluateStatic, findDecorator, getDecoratorArgument, getJsDocComment } from './ast-utils.js';
3
+ import { getClassHierarchy } from './class-hierarchy.js';
3
4
  /**
4
- * Extract all @Input(), input() and model() signal metadata from a class declaration.
5
+ * Extract all @Input(), input() and model() signal metadata from a class
6
+ * declaration and the base classes Angular inherits inputs from. An input the
7
+ * subclass redeclares wins over the one in its base class.
5
8
  */
6
- export function extractInputs(classDecl, checker) {
9
+ export function extractInputs(classDecl, checker, hierarchy = getClassHierarchy(classDecl, checker)) {
7
10
  const inputs = [];
8
- for (const member of classDecl.members) {
9
- if (!ts.isPropertyDeclaration(member))
10
- continue;
11
- const name = member.name && ts.isIdentifier(member.name)
12
- ? member.name.text
13
- : undefined;
14
- if (!name)
15
- continue;
16
- const inputDecorator = findDecorator(member, 'Input');
17
- if (inputDecorator) {
18
- const required = isDecoratorInputRequired(inputDecorator);
19
- const defaultValue = member.initializer
20
- ? evaluateExpression(member.initializer)
21
- : undefined;
22
- const doc = getJsDocComment(member, checker);
23
- const { type, values, rawType } = resolveDecoratorInputType(member, checker);
24
- inputs.push({
25
- name,
26
- type,
27
- rawType,
28
- required,
29
- ...(values && { values }),
30
- ...(defaultValue !== undefined && { defaultValue }),
31
- ...(doc && { doc }),
32
- });
33
- continue;
34
- }
35
- const signalCall = getInputSignalCall(member);
36
- if (signalCall) {
37
- const required = isSignalInputRequired(signalCall);
38
- const defaultValue = !required && signalCall.arguments.length > 0
39
- ? evaluateExpression(signalCall.arguments[0])
40
- : undefined;
41
- const doc = getJsDocComment(member, checker);
42
- const { type, values, rawType } = resolveSignalInputType(signalCall, checker);
43
- inputs.push({
44
- name,
45
- type,
46
- rawType,
47
- required,
48
- ...(values && { values }),
49
- ...(defaultValue !== undefined && { defaultValue }),
50
- ...(doc && { doc }),
51
- });
11
+ const seen = new Set();
12
+ // Fields a more derived class initializes without declaring them an input.
13
+ // Angular keeps the inherited input, but the component starts out with that value.
14
+ const reinitialized = new Map();
15
+ for (const { classDecl: owner, definesMetadata } of hierarchy.classes) {
16
+ const subclass = owner === classDecl ? undefined : classDecl;
17
+ for (const member of owner.members) {
18
+ if (!ts.isPropertyDeclaration(member) || isStatic(member))
19
+ continue;
20
+ const name = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
21
+ if (!name || seen.has(name))
22
+ continue;
23
+ const input = definesMetadata ? readInput(member, name, checker, owner, subclass) : undefined;
24
+ if (!input) {
25
+ if (member.initializer && !reinitialized.has(name))
26
+ reinitialized.set(name, member);
27
+ continue;
28
+ }
29
+ const initializedBy = reinitialized.get(name);
30
+ if (initializedBy) {
31
+ const defaultValue = readInitialValue(initializedBy, checker);
32
+ if (defaultValue === undefined)
33
+ delete input.defaultValue;
34
+ else
35
+ input.defaultValue = defaultValue;
36
+ }
37
+ seen.add(name);
38
+ inputs.push(input);
52
39
  }
53
40
  }
54
41
  return inputs;
55
42
  }
43
+ function isStatic(member) {
44
+ return !!ts.getModifiers(member)?.some((m) => m.kind === ts.SyntaxKind.StaticKeyword);
45
+ }
46
+ /** What a field starts out with: its initializer, or for `input()` and `model()` the value passed to them. */
47
+ function readInitialValue(member, checker) {
48
+ const signalCall = getInputSignalCall(member);
49
+ if (!signalCall)
50
+ return member.initializer ? evaluateDefault(member.initializer, checker) : undefined;
51
+ return !isSignalInputRequired(signalCall) && signalCall.arguments.length > 0 ? evaluateDefault(signalCall.arguments[0], checker) : undefined;
52
+ }
56
53
  /**
57
- * Extract all @Output() and output() signal metadata from a class declaration.
54
+ * `owner` declares the member. `subclass` is the showcased class when that is
55
+ * a different one, which decides what the type parameters of `owner` stand for.
58
56
  */
59
- export function extractOutputs(classDecl, checker) {
57
+ function readInput(member, name, checker, owner, subclass) {
58
+ const inputDecorator = findDecorator(member, 'Input');
59
+ if (inputDecorator) {
60
+ const required = isDecoratorInputRequired(inputDecorator);
61
+ const defaultValue = readInitialValue(member, checker);
62
+ const doc = getJsDocComment(member, checker);
63
+ const instantiated = subclass && usesTypeParameters(member.type ?? member.initializer, owner, checker) ? getInstantiatedType(name, subclass, checker) : undefined;
64
+ const { type, values, rawType } = instantiated ? mapType(instantiated, checker) : resolveDecoratorInputType(member, checker);
65
+ return {
66
+ name,
67
+ type,
68
+ rawType,
69
+ required,
70
+ ...(values && { values }),
71
+ ...(defaultValue !== undefined && { defaultValue }),
72
+ ...(doc && { doc })
73
+ };
74
+ }
75
+ const signalCall = getInputSignalCall(member);
76
+ if (!signalCall)
77
+ return undefined;
78
+ const required = isSignalInputRequired(signalCall);
79
+ const defaultValue = readInitialValue(member, checker);
80
+ const doc = getJsDocComment(member, checker);
81
+ const declaredType = signalCall.typeArguments?.[0] ?? signalCall.arguments[0];
82
+ // A signal is a getter function, so its call signature returns the value type.
83
+ const instantiated = subclass && usesTypeParameters(declaredType, owner, checker) ? getInstantiatedType(name, subclass, checker)?.getCallSignatures()[0]?.getReturnType() : undefined;
84
+ const { type, values, rawType } = instantiated ? mapType(instantiated, checker) : resolveSignalInputType(signalCall, checker);
85
+ return {
86
+ name,
87
+ type,
88
+ rawType,
89
+ required,
90
+ ...(values && { values }),
91
+ ...(defaultValue !== undefined && { defaultValue }),
92
+ ...(doc && { doc })
93
+ };
94
+ }
95
+ /**
96
+ * Extract all @Output() and output() signal metadata from a class declaration
97
+ * and the base classes Angular inherits outputs from.
98
+ */
99
+ export function extractOutputs(classDecl, checker, hierarchy = getClassHierarchy(classDecl, checker)) {
60
100
  const outputs = [];
61
- for (const member of classDecl.members) {
62
- if (!ts.isPropertyDeclaration(member))
101
+ const seen = new Set();
102
+ for (const { classDecl: owner, definesMetadata } of hierarchy.classes) {
103
+ if (!definesMetadata)
63
104
  continue;
64
- const name = member.name && ts.isIdentifier(member.name)
65
- ? member.name.text
66
- : undefined;
67
- if (!name)
68
- continue;
69
- const outputDecorator = findDecorator(member, 'Output');
70
- if (outputDecorator) {
71
- const doc = getJsDocComment(member, checker);
72
- outputs.push({ name, ...(doc && { doc }) });
73
- continue;
74
- }
75
- if (isOutputSignal(member)) {
105
+ for (const member of owner.members) {
106
+ if (!ts.isPropertyDeclaration(member))
107
+ continue;
108
+ const name = member.name && ts.isIdentifier(member.name) ? member.name.text : undefined;
109
+ if (!name || seen.has(name))
110
+ continue;
111
+ if (!findDecorator(member, 'Output') && !isOutputSignal(member))
112
+ continue;
76
113
  const doc = getJsDocComment(member, checker);
114
+ seen.add(name);
77
115
  outputs.push({ name, ...(doc && { doc }) });
78
116
  }
79
117
  }
80
118
  return outputs;
81
119
  }
120
+ /**
121
+ * Whether a declared type, or the expression a type is inferred from,
122
+ * mentions a type parameter of the class that declares it. Only then does the
123
+ * subclass change the type; otherwise the source text stays, alias names included.
124
+ */
125
+ function usesTypeParameters(node, owner, checker) {
126
+ const parameters = owner.typeParameters;
127
+ if (!node || !parameters?.length)
128
+ return false;
129
+ const isOwnParameter = (declaration) => !!declaration && ts.isTypeParameterDeclaration(declaration) && parameters.includes(declaration);
130
+ const visit = (child) => {
131
+ if (ts.isTypeReferenceNode(child) && ts.isIdentifier(child.typeName) && isOwnParameter(checker.getSymbolAtLocation(child.typeName)?.declarations?.[0])) {
132
+ return true;
133
+ }
134
+ return ts.forEachChild(child, visit) ?? false;
135
+ };
136
+ // An inferred type can depend on `T` without the source naming it: `model(this.initial)`.
137
+ return visit(node) || (!ts.isTypeNode(node) && typeMentions(checker.getTypeAtLocation(node), isOwnParameter, checker));
138
+ }
139
+ function typeMentions(type, isOwnParameter, checker, visited = new Set()) {
140
+ if (visited.has(type))
141
+ return false;
142
+ visited.add(type);
143
+ if (type.flags & ts.TypeFlags.TypeParameter)
144
+ return isOwnParameter(type.symbol?.declarations?.[0]);
145
+ const isReference = type.flags & ts.TypeFlags.Object && type.objectFlags & ts.ObjectFlags.Reference;
146
+ const nested = [
147
+ ...(type.isUnionOrIntersection() ? type.types : []),
148
+ ...(type.aliasTypeArguments ?? []),
149
+ ...(isReference ? checker.getTypeArguments(type) : [])
150
+ ];
151
+ return nested.some((t) => typeMentions(t, isOwnParameter, checker, visited));
152
+ }
153
+ /**
154
+ * The type of a property declared in a generic base class, as the subclass
155
+ * sees it: `items = input.required<T[]>()` in `Field<T>` is an
156
+ * `InputSignal<Country[]>` on `Picker extends Field<Country>`.
157
+ */
158
+ function getInstantiatedType(name, subclass, checker) {
159
+ const property = checker.getPropertyOfType(checker.getTypeAtLocation(subclass), name);
160
+ return property && checker.getTypeOfSymbolAtLocation(property, subclass);
161
+ }
162
+ /**
163
+ * A default is all or nothing. The renderer applies it to the component, so
164
+ * the part of `{ ...shared, size: 'm' }` that can be read would overwrite the
165
+ * whole default the component actually declares.
166
+ */
167
+ function evaluateDefault(node, checker) {
168
+ let complete = true;
169
+ const value = evaluateStatic(node, { checker, report: () => (complete = false) });
170
+ return complete ? value : undefined;
171
+ }
82
172
  function getInputSignalCall(member) {
83
173
  const init = member.initializer;
84
174
  if (!init || !ts.isCallExpression(init))
@@ -97,9 +187,7 @@ function getInputSignalCall(member) {
97
187
  }
98
188
  function isSignalInputRequired(callExpr) {
99
189
  const expr = callExpr.expression;
100
- return (ts.isPropertyAccessExpression(expr) &&
101
- ts.isIdentifier(expr.name) &&
102
- expr.name.text === 'required');
190
+ return ts.isPropertyAccessExpression(expr) && ts.isIdentifier(expr.name) && expr.name.text === 'required';
103
191
  }
104
192
  function isOutputSignal(member) {
105
193
  const init = member.initializer;
@@ -125,9 +213,7 @@ function isDecoratorInputRequired(decorator) {
125
213
  if (!arg || !ts.isObjectLiteralExpression(arg))
126
214
  return false;
127
215
  for (const prop of arg.properties) {
128
- if (ts.isPropertyAssignment(prop) &&
129
- ts.isIdentifier(prop.name) &&
130
- prop.name.text === 'required') {
216
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name) && prop.name.text === 'required') {
131
217
  return prop.initializer.kind === ts.SyntaxKind.TrueKeyword;
132
218
  }
133
219
  }
@@ -135,19 +221,14 @@ function isDecoratorInputRequired(decorator) {
135
221
  }
136
222
  function resolveDecoratorInputType(member, checker) {
137
223
  const tsType = checker.getTypeAtLocation(member);
138
- const declaredText = member.type
139
- ? normalizeTypeText(member.type.getText())
140
- : undefined;
224
+ const declaredText = member.type ? normalizeTypeText(member.type.getText()) : undefined;
141
225
  return mapType(tsType, checker, declaredText);
142
226
  }
143
227
  function normalizeTypeText(text) {
144
228
  return text.replace(/\s+/g, ' ').trim();
145
229
  }
146
230
  function getRawTypeLabel(tsType, checker) {
147
- if (tsType.flags &
148
- (ts.TypeFlags.Boolean |
149
- ts.TypeFlags.BooleanLike |
150
- ts.TypeFlags.BooleanLiteral)) {
231
+ if (tsType.flags & (ts.TypeFlags.Boolean | ts.TypeFlags.BooleanLike | ts.TypeFlags.BooleanLiteral)) {
151
232
  return 'boolean';
152
233
  }
153
234
  if (tsType.isUnion()) {
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.generator.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/manifest.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,gBAAgB,EAAE,GAC7B,MAAM,CAyBR"}
1
+ {"version":3,"file":"manifest.generator.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/manifest.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAyBvE"}
@@ -3,11 +3,11 @@
3
3
  */
4
4
  export function generateManifest(components) {
5
5
  const lines = [
6
- '// AUTO-GENERATED by ng-prism — do not edit!',
6
+ '// AUTO-GENERATED by ng-prism. Do not edit!',
7
7
  "import type { PrismManifest } from 'ng-prism/plugin';",
8
8
  '',
9
9
  'export const PRISM_MANIFEST: PrismManifest = {',
10
- ' components: [',
10
+ ' components: ['
11
11
  ];
12
12
  for (const comp of components) {
13
13
  lines.push(' {');
@@ -30,6 +30,10 @@ function json(value) {
30
30
  function indent(depth) {
31
31
  return ' '.repeat(depth);
32
32
  }
33
+ /** `'aria-label'` and content slots like `'[card-header]'` are only valid keys in quotes. */
34
+ function formatKey(key) {
35
+ return /^[A-Za-z_$][\w$]*$/.test(key) ? key : JSON.stringify(key);
36
+ }
33
37
  function formatObject(obj, baseIndent) {
34
38
  const entries = Object.entries(obj).filter(([, v]) => v !== undefined);
35
39
  if (entries.length === 0)
@@ -41,7 +45,7 @@ function formatObject(obj, baseIndent) {
41
45
  : typeof value === 'object' && value !== null
42
46
  ? formatObject(value, inner)
43
47
  : json(value);
44
- return `${indent(inner)}${key}: ${formatted},`;
48
+ return `${indent(inner)}${formatKey(key)}: ${formatted},`;
45
49
  });
46
50
  return `{\n${lines.join('\n')}\n${indent(baseIndent)}}`;
47
51
  }
@@ -50,9 +54,7 @@ function formatArray(arr, baseIndent) {
50
54
  return '[]';
51
55
  const inner = baseIndent + 2;
52
56
  const items = arr.map((item) => {
53
- const formatted = typeof item === 'object' && item !== null && !Array.isArray(item)
54
- ? formatObject(item, inner)
55
- : json(item);
57
+ const formatted = typeof item === 'object' && item !== null && !Array.isArray(item) ? formatObject(item, inner) : json(item);
56
58
  return `${indent(inner)}${formatted},`;
57
59
  });
58
60
  return `[\n${items.join('\n')}\n${indent(baseIndent)}]`;
@@ -7,6 +7,8 @@ export interface CreateScannerOptions {
7
7
  }
8
8
  export interface ScanResult {
9
9
  components: ScannedComponent[];
10
+ /** One message per @Showcase value the scan had to drop, already printed as a warning. */
11
+ diagnostics: string[];
10
12
  }
11
13
  export interface Scanner {
12
14
  /** Scan all entry points. Reuses TypeScript program state from previous scans. */
@@ -16,7 +18,7 @@ export interface Scanner {
16
18
  * Create a stateful multi-entry scanner that retains the previous ts.Program between scans.
17
19
  * A single shared program is created with every entry-point file as a root name, so the
18
20
  * transitive type graph (Angular framework typings, etc.) is parsed once and shared via
19
- * the program's `TypeChecker` — instead of N programs that each load Material/CDK/RxJS.
21
+ * the program's `TypeChecker`, instead of N programs that each load Material/CDK/RxJS.
20
22
  *
21
23
  * TypeScript reuses parsed SourceFile objects from the old program on rebuild, making
22
24
  * incremental scans fast.
@@ -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;AACrE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,kFAAkF;IAClF,IAAI,IAAI,UAAU,CAAC;CACpB;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAoDpE"}
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,6 +1,6 @@
1
1
  import ts from 'typescript';
2
- import { resolveEntryPointExports, } from './entry-point.scanner.js';
3
2
  import { scanComponents } from './component.scanner.js';
3
+ import { resolveEntryPointExports } from './entry-point.scanner.js';
4
4
  const DEFAULT_COMPILER_OPTIONS = {
5
5
  target: ts.ScriptTarget.ES2022,
6
6
  module: ts.ModuleKind.ES2022,
@@ -13,14 +13,14 @@ const DEFAULT_COMPILER_OPTIONS = {
13
13
  types: [],
14
14
  // Perf: we never call program.emit(); skip emit-related setup work.
15
15
  noEmit: true,
16
- // Perf: complement to skipLibCheck — also skip type-checking lib.*.d.ts files.
17
- skipDefaultLibCheck: true,
16
+ // Perf: complements skipLibCheck by also skipping type-checking of lib.*.d.ts files.
17
+ skipDefaultLibCheck: true
18
18
  };
19
19
  /**
20
20
  * Create a stateful multi-entry scanner that retains the previous ts.Program between scans.
21
21
  * A single shared program is created with every entry-point file as a root name, so the
22
22
  * transitive type graph (Angular framework typings, etc.) is parsed once and shared via
23
- * the program's `TypeChecker` — instead of N programs that each load Material/CDK/RxJS.
23
+ * the program's `TypeChecker`, instead of N programs that each load Material/CDK/RxJS.
24
24
  *
25
25
  * TypeScript reuses parsed SourceFile objects from the old program on rebuild, making
26
26
  * incremental scans fast.
@@ -28,7 +28,7 @@ const DEFAULT_COMPILER_OPTIONS = {
28
28
  export function createScanner(options) {
29
29
  const compilerOptions = {
30
30
  ...DEFAULT_COMPILER_OPTIONS,
31
- ...options.compilerOptions,
31
+ ...options.compilerOptions
32
32
  };
33
33
  let previousProgram;
34
34
  return {
@@ -37,8 +37,10 @@ export function createScanner(options) {
37
37
  previousProgram = program;
38
38
  const checker = program.getTypeChecker();
39
39
  const allComponents = [];
40
+ const diagnostics = [];
41
+ const notices = new Set();
40
42
  for (const { exports, importPath } of entries) {
41
- const components = scanComponents(exports, checker);
43
+ const components = scanComponents(exports, checker, diagnostics, notices);
42
44
  for (const c of components)
43
45
  c.importPath = importPath;
44
46
  allComponents.push(...components);
@@ -59,7 +61,7 @@ export function createScanner(options) {
59
61
  seen.add(key);
60
62
  unique.push(c);
61
63
  }
62
- return { components: unique };
63
- },
64
+ return { components: unique, diagnostics };
65
+ }
64
66
  };
65
67
  }
@@ -0,0 +1,25 @@
1
+ import ts from 'typescript';
2
+ import { type UnevaluableIssue } from './ast-utils.js';
3
+ import type { UnreadableBase } from './class-hierarchy.js';
4
+ /**
5
+ * Describe one value the scanner had to drop from a `@Showcase` config:
6
+ * which component, where in the config, what the source said and where.
7
+ *
8
+ * `SguiFileInputComponent › variants[3] "Auto hint" › inputs.maxFileSize — "megabytes(5)" (src/file-input.component.ts:27:22) cannot be evaluated statically and was dropped.`
9
+ */
10
+ export declare function describeUnevaluable(className: string, config: ts.Expression, issue: UnevaluableIssue): string;
11
+ /**
12
+ * `providers` never reached the manifest: classes, factories and instances
13
+ * cannot be written into static data. One message for the field, not one per
14
+ * provider, because none of them could have been kept. It points at the
15
+ * literal property if there is one, else at `found`, a provider the scan came
16
+ * across through a spread or a constant, else at the whole config.
17
+ */
18
+ export declare function describeDeprecatedProviders(className: string, config: ts.Expression, found?: ts.Node): string;
19
+ /**
20
+ * A base class from a package only ships its declarations: no `input()`
21
+ * call, no required flag, no default. Its inputs are named so the reader
22
+ * knows which variant values will not reach the component.
23
+ */
24
+ export declare function describeUnreadableBase(className: string, base: UnreadableBase): string;
25
+ //# sourceMappingURL=showcase-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showcase-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/showcase-diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAA2C,KAAK,gBAAgB,EAA4B,MAAM,gBAAgB,CAAC;AAC1H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa3D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAY7G;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,CAO7G;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAOtF"}
@@ -0,0 +1,96 @@
1
+ import { relative } from 'node:path';
2
+ import ts from 'typescript';
3
+ import { evaluateExpression } from './ast-utils.js';
4
+ const MAX_EXCERPT_LENGTH = 60;
5
+ const CAUSES = {
6
+ let: 'is declared with let; only const declarations can be read',
7
+ var: 'is declared with var; only const declarations can be read',
8
+ 'no-value': 'is declared without a value, as in a .d.ts file or with declare',
9
+ cycle: 'refers back to itself',
10
+ 'runtime-value': 'is a function or class, which only exists at runtime'
11
+ };
12
+ const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
13
+ /**
14
+ * Describe one value the scanner had to drop from a `@Showcase` config:
15
+ * which component, where in the config, what the source said and where.
16
+ *
17
+ * `SguiFileInputComponent › variants[3] "Auto hint" › inputs.maxFileSize — "megabytes(5)" (src/file-input.component.ts:27:22) cannot be evaluated statically and was dropped.`
18
+ */
19
+ export function describeUnevaluable(className, config, issue) {
20
+ const isRoot = issue.node === config;
21
+ const where = issue.path.length === 0 ? '@Showcase' : formatShowcasePath(issue.path, config);
22
+ const consequence = isRoot
23
+ ? 'cannot be evaluated statically, so the component is skipped'
24
+ : issue.reason === 'runtime-value'
25
+ ? 'is a runtime value (function, class or instance) and cannot be part of the static manifest; it was dropped'
26
+ : 'cannot be evaluated statically and was dropped';
27
+ const cause = issue.cause ? `: ${excerpt(issue.cause.node)} ${CAUSES[issue.cause.kind]}` : '';
28
+ return `${className} › ${where} — "${excerpt(issue.node)}" (${location(issue.node)}) ${consequence}${cause}.`;
29
+ }
30
+ /**
31
+ * `providers` never reached the manifest: classes, factories and instances
32
+ * cannot be written into static data. One message for the field, not one per
33
+ * provider, because none of them could have been kept. It points at the
34
+ * literal property if there is one, else at `found`, a provider the scan came
35
+ * across through a spread or a constant, else at the whole config.
36
+ */
37
+ export function describeDeprecatedProviders(className, config, found) {
38
+ const literal = ts.isObjectLiteralExpression(config) ? findProperty(config, 'providers') : undefined;
39
+ return (`${className} declares @Showcase providers (${location(literal ?? found ?? config)}), which are deprecated and will be removed in 23.0.0; ` +
40
+ `the manifest is static and cannot hold them, so they never reach the styleguide. Use defineConfig({ appProviders }) instead.`);
41
+ }
42
+ /**
43
+ * A base class from a package only ships its declarations: no `input()`
44
+ * call, no required flag, no default. Its inputs are named so the reader
45
+ * knows which variant values will not reach the component.
46
+ */
47
+ export function describeUnreadableBase(className, base) {
48
+ const baseName = base.classDecl.name?.text ?? 'an anonymous class';
49
+ return (`${className} inherits ${base.inputs.join(', ')} from ${baseName}, which only exists as a declaration (${location(base.classDecl)}); ` +
50
+ `without its source these inputs cannot be read, so they are missing from the manifest and variants cannot set them.`);
51
+ }
52
+ /** A variant is named by its `name` as well as its index, since that is what the styleguide shows. */
53
+ function formatShowcasePath(path, config) {
54
+ const [head, index, ...rest] = path;
55
+ if (head !== 'variants' || typeof index !== 'number')
56
+ return formatPath(path);
57
+ const name = variantName(config, index);
58
+ const variant = name === undefined ? `variants[${index}]` : `variants[${index}] ${JSON.stringify(name)}`;
59
+ return rest.length === 0 ? variant : `${variant} › ${formatPath(rest)}`;
60
+ }
61
+ function formatPath(path) {
62
+ return path
63
+ .map((segment, i) => {
64
+ if (typeof segment === 'number')
65
+ return `[${segment}]`;
66
+ if (!IDENTIFIER.test(segment))
67
+ return `[${JSON.stringify(segment)}]`;
68
+ return i === 0 ? segment : `.${segment}`;
69
+ })
70
+ .join('');
71
+ }
72
+ /** Read from the source, because the evaluated array has already lost the elements before the index. */
73
+ function variantName(config, index) {
74
+ const variants = ts.isObjectLiteralExpression(config) ? findInitializer(config, 'variants') : undefined;
75
+ const variant = variants && ts.isArrayLiteralExpression(variants) ? variants.elements[index] : undefined;
76
+ const name = variant && ts.isObjectLiteralExpression(variant) ? findInitializer(variant, 'name') : undefined;
77
+ const value = name && evaluateExpression(name);
78
+ return typeof value === 'string' ? value : undefined;
79
+ }
80
+ function findProperty(object, key) {
81
+ return object.properties.find((prop) => prop.name !== undefined && (ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name)) && prop.name.text === key);
82
+ }
83
+ function findInitializer(object, key) {
84
+ const prop = findProperty(object, key);
85
+ return prop && ts.isPropertyAssignment(prop) ? prop.initializer : undefined;
86
+ }
87
+ function excerpt(node) {
88
+ const text = node.getText().replace(/\s+/g, ' ');
89
+ return text.length > MAX_EXCERPT_LENGTH ? `${text.slice(0, MAX_EXCERPT_LENGTH - 1)}…` : text;
90
+ }
91
+ /** Relative to the working directory and with line and column, so that terminals and editors can link it. */
92
+ function location(node) {
93
+ const sourceFile = node.getSourceFile();
94
+ const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart());
95
+ return `${relative(process.cwd(), sourceFile.fileName)}:${line + 1}:${character + 1}`;
96
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EAGb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA0FtD,QAAA,MAAM,OAAO,EAAE,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CACJ,CAAC;AACxD,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,OAAO,EAA0D,MAAM,2BAA2B,CAAC;AACjH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsEtD,QAAA,MAAM,OAAO,EAAE,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAyD,CAAC;AAErH,eAAe,OAAO,CAAC"}
@@ -1,19 +1,17 @@
1
- import { createBuilder, } from '@angular-devkit/architect';
2
- import { join } from 'path';
3
1
  import { existsSync } from 'fs';
4
- import { runPrismPipeline, createPipelineState, } from '../shared/prism-pipeline.js';
2
+ import { join } from 'path';
3
+ import { createBuilder } from '@angular-devkit/architect';
4
+ import { createPipelineState, runPrismPipeline } from '../shared/prism-pipeline.js';
5
5
  import { resolveCacheDir } from '../shared/resolve-cache-dir.js';
6
6
  import { startWatcher } from '../watcher/index.js';
7
7
  async function createServeBuilder(options, context) {
8
8
  const cacheDir = resolveCacheDir(options.cacheDir, context.workspaceRoot);
9
9
  const pipelineOptions = {
10
10
  entryPoint: options.entryPoint,
11
- libraryImportPath: options.libraryImportPath ??
12
- options.libraryProject ??
13
- options.prismProject,
11
+ libraryImportPath: options.libraryImportPath ?? options.libraryProject ?? options.prismProject,
14
12
  prismProject: options.prismProject,
15
13
  configFile: options.configFile ?? 'ng-prism.config.ts',
16
- cacheDir,
14
+ cacheDir
17
15
  };
18
16
  const state = createPipelineState();
19
17
  await runPrismPipeline(pipelineOptions, context, state);
@@ -30,8 +28,8 @@ async function createServeBuilder(options, context) {
30
28
  },
31
29
  logger: {
32
30
  info: (msg) => context.logger.info(msg),
33
- error: (msg) => context.logger.error(msg),
34
- },
31
+ error: (msg) => context.logger.error(msg)
32
+ }
35
33
  });
36
34
  const run = await context.scheduleTarget({ project: options.prismProject, target: 'serve', configuration: '' }, { port: options.port ?? 4400 });
37
35
  const shutdown = () => {
@@ -59,7 +57,7 @@ async function createServeBuilder(options, context) {
59
57
  cleanupSignals();
60
58
  watcher.close();
61
59
  resolve(lastOutput ?? { success: false });
62
- },
60
+ }
63
61
  });
64
62
  });
65
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/builder/serve/schema.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -1,3 +1,3 @@
1
- export { runPrismPipeline, createPipelineState } from './prism-pipeline.js';
1
+ export { createPipelineState, runPrismPipeline } from './prism-pipeline.js';
2
2
  export type { PrismPipelineOptions, PrismPipelineResult, PrismPipelineState } from './prism-pipeline.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- export { runPrismPipeline, createPipelineState } from './prism-pipeline.js';
1
+ export { createPipelineState, runPrismPipeline } from './prism-pipeline.js';
@@ -17,7 +17,7 @@ export interface PrismPipelineResult {
17
17
  }
18
18
  export interface PrismPipelineState {
19
19
  scanner: Scanner | undefined;
20
- /** Sorted, joined entry-file paths — used to detect when the entry set changed between rebuilds. */
20
+ /** Sorted, joined entry-file paths. Used to detect when the entry set changed between rebuilds. */
21
21
  lastEntrySetKey: string | undefined;
22
22
  }
23
23
  export declare function createPipelineState(): PrismPipelineState;
@@ -1 +1 @@
1
- {"version":3,"file":"prism-pipeline.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/prism-pipeline.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAapE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,oGAAoG;IACpG,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAExD;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAyF9B"}
1
+ {"version":3,"file":"prism-pipeline.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/prism-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,OAAO,EAAiB,KAAK,OAAO,EAAmB,MAAM,uBAAuB,CAAC;AAErF,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,mGAAmG;IACnG,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAExD;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAuFtJ"}