@siemens/element-ng 49.16.0 → 51.0.0-rc.10

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 (314) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/siemens-element-ng-about.mjs +41 -25
  3. package/fesm2022/siemens-element-ng-about.mjs.map +1 -1
  4. package/fesm2022/siemens-element-ng-accordion.mjs +59 -41
  5. package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
  6. package/fesm2022/siemens-element-ng-action-modal.mjs +83 -53
  7. package/fesm2022/siemens-element-ng-action-modal.mjs.map +1 -1
  8. package/fesm2022/siemens-element-ng-ag-grid.mjs +143 -148
  9. package/fesm2022/siemens-element-ng-ag-grid.mjs.map +1 -1
  10. package/fesm2022/siemens-element-ng-application-header.mjs +180 -188
  11. package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
  12. package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs +34 -28
  13. package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs.map +1 -1
  14. package/fesm2022/siemens-element-ng-autocomplete.mjs +27 -22
  15. package/fesm2022/siemens-element-ng-autocomplete.mjs.map +1 -1
  16. package/fesm2022/siemens-element-ng-avatar.mjs +34 -24
  17. package/fesm2022/siemens-element-ng-avatar.mjs.map +1 -1
  18. package/fesm2022/siemens-element-ng-badge.mjs +9 -8
  19. package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
  20. package/fesm2022/siemens-element-ng-breadcrumb-router.mjs +17 -14
  21. package/fesm2022/siemens-element-ng-breadcrumb-router.mjs.map +1 -1
  22. package/fesm2022/siemens-element-ng-breadcrumb.mjs +21 -17
  23. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
  24. package/fesm2022/siemens-element-ng-card.mjs +72 -47
  25. package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
  26. package/fesm2022/siemens-element-ng-carousel.mjs +58 -34
  27. package/fesm2022/siemens-element-ng-carousel.mjs.map +1 -1
  28. package/fesm2022/siemens-element-ng-chat-messages.mjs +323 -215
  29. package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
  30. package/fesm2022/siemens-element-ng-circle-status.mjs +39 -25
  31. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -1
  32. package/fesm2022/siemens-element-ng-color-picker.mjs +44 -34
  33. package/fesm2022/siemens-element-ng-color-picker.mjs.map +1 -1
  34. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +58 -37
  35. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -1
  36. package/fesm2022/siemens-element-ng-common.mjs +22 -22
  37. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  38. package/fesm2022/siemens-element-ng-connection-strength.mjs +14 -12
  39. package/fesm2022/siemens-element-ng-connection-strength.mjs.map +1 -1
  40. package/fesm2022/siemens-element-ng-content-action-bar.mjs +37 -28
  41. package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -1
  42. package/fesm2022/siemens-element-ng-copyright-notice.mjs +19 -14
  43. package/fesm2022/siemens-element-ng-copyright-notice.mjs.map +1 -1
  44. package/fesm2022/siemens-element-ng-dashboard.mjs +337 -223
  45. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  46. package/fesm2022/siemens-element-ng-datatable.mjs +12 -15
  47. package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
  48. package/fesm2022/siemens-element-ng-date-range-filter.mjs +126 -76
  49. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
  50. package/fesm2022/siemens-element-ng-datepicker.mjs +393 -251
  51. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
  52. package/fesm2022/siemens-element-ng-electron-titlebar.mjs +22 -17
  53. package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -1
  54. package/fesm2022/siemens-element-ng-empty-state.mjs +15 -12
  55. package/fesm2022/siemens-element-ng-empty-state.mjs.map +1 -1
  56. package/fesm2022/siemens-element-ng-file-uploader.mjs +105 -91
  57. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
  58. package/fesm2022/siemens-element-ng-filter-bar.mjs +33 -25
  59. package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -1
  60. package/fesm2022/siemens-element-ng-filtered-search.mjs +274 -165
  61. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  62. package/fesm2022/siemens-element-ng-footer.mjs +12 -10
  63. package/fesm2022/siemens-element-ng-footer.mjs.map +1 -1
  64. package/fesm2022/siemens-element-ng-form.mjs +361 -116
  65. package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
  66. package/fesm2022/siemens-element-ng-formly-legacy.mjs +99 -0
  67. package/fesm2022/siemens-element-ng-formly-legacy.mjs.map +1 -0
  68. package/fesm2022/siemens-element-ng-formly.mjs +224 -318
  69. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
  70. package/fesm2022/siemens-element-ng-header-dropdown.mjs +40 -30
  71. package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
  72. package/fesm2022/siemens-element-ng-help-button.mjs +6 -6
  73. package/fesm2022/siemens-element-ng-help-button.mjs.map +1 -1
  74. package/fesm2022/siemens-element-ng-icon.mjs +56 -57
  75. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  76. package/fesm2022/siemens-element-ng-info-page.mjs +17 -11
  77. package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -1
  78. package/fesm2022/siemens-element-ng-inline-notification.mjs +19 -14
  79. package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
  80. package/fesm2022/siemens-element-ng-ip-input.mjs +19 -15
  81. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
  82. package/fesm2022/siemens-element-ng-landing-page.mjs +121 -75
  83. package/fesm2022/siemens-element-ng-landing-page.mjs.map +1 -1
  84. package/fesm2022/siemens-element-ng-language-switcher.mjs +16 -12
  85. package/fesm2022/siemens-element-ng-language-switcher.mjs.map +1 -1
  86. package/fesm2022/siemens-element-ng-link.mjs +31 -21
  87. package/fesm2022/siemens-element-ng-link.mjs.map +1 -1
  88. package/fesm2022/siemens-element-ng-list-details.mjs +132 -66
  89. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
  90. package/fesm2022/siemens-element-ng-loading-spinner.mjs +51 -64
  91. package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
  92. package/fesm2022/siemens-element-ng-localization.mjs +14 -12
  93. package/fesm2022/siemens-element-ng-localization.mjs.map +1 -1
  94. package/fesm2022/siemens-element-ng-main-detail-container.mjs +116 -51
  95. package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
  96. package/fesm2022/siemens-element-ng-maplibre.mjs +401 -0
  97. package/fesm2022/siemens-element-ng-maplibre.mjs.map +1 -0
  98. package/fesm2022/siemens-element-ng-markdown-directives-tabs.mjs +70 -0
  99. package/fesm2022/siemens-element-ng-markdown-directives-tabs.mjs.map +1 -0
  100. package/fesm2022/siemens-element-ng-markdown-extensions-citations.mjs +215 -0
  101. package/fesm2022/siemens-element-ng-markdown-extensions-citations.mjs.map +1 -0
  102. package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs +76 -0
  103. package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs.map +1 -0
  104. package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs +86 -0
  105. package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs.map +1 -0
  106. package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs +130 -0
  107. package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs.map +1 -0
  108. package/fesm2022/siemens-element-ng-markdown.mjs +800 -0
  109. package/fesm2022/siemens-element-ng-markdown.mjs.map +1 -0
  110. package/fesm2022/siemens-element-ng-menu.mjs +71 -57
  111. package/fesm2022/siemens-element-ng-menu.mjs.map +1 -1
  112. package/fesm2022/siemens-element-ng-modal.mjs +14 -11
  113. package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
  114. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +251 -206
  115. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
  116. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +123 -86
  117. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  118. package/fesm2022/siemens-element-ng-navbar.mjs +72 -45
  119. package/fesm2022/siemens-element-ng-navbar.mjs.map +1 -1
  120. package/fesm2022/siemens-element-ng-notification-item.mjs +19 -11
  121. package/fesm2022/siemens-element-ng-notification-item.mjs.map +1 -1
  122. package/fesm2022/siemens-element-ng-number-input.mjs +41 -29
  123. package/fesm2022/siemens-element-ng-number-input.mjs.map +1 -1
  124. package/fesm2022/siemens-element-ng-pagination.mjs +31 -20
  125. package/fesm2022/siemens-element-ng-pagination.mjs.map +1 -1
  126. package/fesm2022/siemens-element-ng-password-strength.mjs +33 -24
  127. package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
  128. package/fesm2022/siemens-element-ng-password-toggle.mjs +19 -14
  129. package/fesm2022/siemens-element-ng-password-toggle.mjs.map +1 -1
  130. package/fesm2022/siemens-element-ng-phone-number.mjs +144 -139
  131. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
  132. package/fesm2022/siemens-element-ng-photo-upload.mjs +85 -52
  133. package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -1
  134. package/fesm2022/siemens-element-ng-pills-input.mjs +56 -41
  135. package/fesm2022/siemens-element-ng-pills-input.mjs.map +1 -1
  136. package/fesm2022/siemens-element-ng-popover-legacy.mjs +43 -28
  137. package/fesm2022/siemens-element-ng-popover-legacy.mjs.map +1 -1
  138. package/fesm2022/siemens-element-ng-popover.mjs +35 -27
  139. package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
  140. package/fesm2022/siemens-element-ng-progressbar.mjs +23 -16
  141. package/fesm2022/siemens-element-ng-progressbar.mjs.map +1 -1
  142. package/fesm2022/siemens-element-ng-resize-observer.mjs +32 -43
  143. package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
  144. package/fesm2022/siemens-element-ng-result-details-list.mjs +12 -10
  145. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -1
  146. package/fesm2022/siemens-element-ng-search-bar.mjs +38 -37
  147. package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -1
  148. package/fesm2022/siemens-element-ng-select.mjs +265 -170
  149. package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
  150. package/fesm2022/siemens-element-ng-shadow-root.mjs +4 -4
  151. package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -1
  152. package/fesm2022/siemens-element-ng-side-panel.mjs +181 -104
  153. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
  154. package/fesm2022/siemens-element-ng-skip-links.mjs +21 -24
  155. package/fesm2022/siemens-element-ng-skip-links.mjs.map +1 -1
  156. package/fesm2022/siemens-element-ng-slider.mjs +45 -30
  157. package/fesm2022/siemens-element-ng-slider.mjs.map +1 -1
  158. package/fesm2022/siemens-element-ng-source-chip.mjs +79 -0
  159. package/fesm2022/siemens-element-ng-source-chip.mjs.map +1 -0
  160. package/fesm2022/siemens-element-ng-split.mjs +290 -306
  161. package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
  162. package/fesm2022/siemens-element-ng-status-bar.mjs +66 -52
  163. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
  164. package/fesm2022/siemens-element-ng-status-counter.mjs +15 -11
  165. package/fesm2022/siemens-element-ng-status-counter.mjs.map +1 -1
  166. package/fesm2022/siemens-element-ng-status-toggle.mjs +26 -16
  167. package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -1
  168. package/fesm2022/siemens-element-ng-summary-chip.mjs +25 -16
  169. package/fesm2022/siemens-element-ng-summary-chip.mjs.map +1 -1
  170. package/fesm2022/siemens-element-ng-summary-widget.mjs +27 -17
  171. package/fesm2022/siemens-element-ng-summary-widget.mjs.map +1 -1
  172. package/fesm2022/siemens-element-ng-system-banner.mjs +13 -10
  173. package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -1
  174. package/fesm2022/siemens-element-ng-tabs-legacy.mjs +20 -17
  175. package/fesm2022/siemens-element-ng-tabs-legacy.mjs.map +1 -1
  176. package/fesm2022/siemens-element-ng-tabs.mjs +156 -131
  177. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
  178. package/fesm2022/siemens-element-ng-theme.mjs +29 -6
  179. package/fesm2022/siemens-element-ng-theme.mjs.map +1 -1
  180. package/fesm2022/siemens-element-ng-threshold.mjs +62 -42
  181. package/fesm2022/siemens-element-ng-threshold.mjs.map +1 -1
  182. package/fesm2022/siemens-element-ng-toast-notification.mjs +59 -40
  183. package/fesm2022/siemens-element-ng-toast-notification.mjs.map +1 -1
  184. package/fesm2022/siemens-element-ng-tooltip.mjs +108 -82
  185. package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
  186. package/fesm2022/siemens-element-ng-tour.mjs +36 -19
  187. package/fesm2022/siemens-element-ng-tour.mjs.map +1 -1
  188. package/fesm2022/siemens-element-ng-translate.mjs +0 -1
  189. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  190. package/fesm2022/siemens-element-ng-tree-view.mjs +113 -84
  191. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  192. package/fesm2022/siemens-element-ng-typeahead.mjs +69 -49
  193. package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
  194. package/fesm2022/siemens-element-ng-wizard.mjs +95 -54
  195. package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
  196. package/formly-legacy/package.json +4 -0
  197. package/maplibre/package.json +4 -0
  198. package/maplibre/styles/_index.scss +1 -0
  199. package/maplibre/styles/maplibre-gl.scss +724 -0
  200. package/markdown/directives/tabs/package.json +4 -0
  201. package/markdown/extensions/citations/package.json +4 -0
  202. package/markdown/extensions/katex/package.json +4 -0
  203. package/markdown/extensions/mermaid/package.json +4 -0
  204. package/markdown/hightlighter/highlightjs/package.json +4 -0
  205. package/markdown/package.json +4 -0
  206. package/package.json +96 -25
  207. package/schematics/collection.json +5 -0
  208. package/schematics/{migrations/icon-path-migration → migrate-tabs-legacy}/index.js +1 -1
  209. package/schematics/migrate-tabs-legacy/migrate-tabs-legacy-rule.js +675 -0
  210. package/schematics/migrate-tabs-legacy/schema.json +14 -0
  211. package/schematics/migration.json +4 -4
  212. package/schematics/migrations/data/class-member-replacement.js +1 -19
  213. package/schematics/migrations/data/component-property-names.js +1 -25
  214. package/schematics/migrations/data/component-property-to-child.js +11 -0
  215. package/schematics/migrations/data/css-custom-properties.js +224 -0
  216. package/schematics/migrations/data/element-class-changes.js +116 -18
  217. package/schematics/migrations/data/element-migration-data.js +6 -0
  218. package/schematics/migrations/data/element-selectors.js +1 -9
  219. package/schematics/migrations/data/index.js +0 -4
  220. package/schematics/migrations/data/migration-test-data.js +49 -6
  221. package/schematics/migrations/data/provider-function-removals.js +7 -0
  222. package/schematics/migrations/data/symbol-removals.js +17 -7
  223. package/schematics/migrations/data/symbol-renaming.js +3 -44
  224. package/schematics/migrations/element-migration/element-migration.js +6 -6
  225. package/schematics/migrations/utilities/component-property-to-child.migration.js +73 -0
  226. package/schematics/migrations/utilities/css-custom-property.migration.js +51 -0
  227. package/schematics/migrations/utilities/element-class-change.migration.js +10 -5
  228. package/schematics/migrations/utilities/import-removal.js +39 -0
  229. package/schematics/migrations/utilities/index.js +4 -0
  230. package/schematics/migrations/utilities/provider-function-removal.migration.js +116 -0
  231. package/schematics/ng-update/index.js +1 -1
  232. package/schematics/ng-update/migrate-content-formatter.js +288 -0
  233. package/schematics/ng-update/migrate-list-details-units.js +86 -0
  234. package/schematics/ng-update/migrate-main-detail-units.js +89 -0
  235. package/schematics/ng-update/migrate-markdown-renderer.js +106 -0
  236. package/schematics/ng-update/migrate-spacers.js +32 -0
  237. package/schematics/ng-update/migrate-split-collapse.js +276 -0
  238. package/schematics/ng-update/migrate-split-scale.js +524 -0
  239. package/schematics/ng-update/migrate-split-sizes.js +107 -0
  240. package/schematics/ng-update/migrate-to-v51.js +35 -0
  241. package/schematics/utils/index.js +1 -0
  242. package/schematics/utils/template-edit-utils.js +35 -0
  243. package/schematics/utils/template-utils.js +31 -45
  244. package/source-chip/package.json +4 -0
  245. package/template-i18n.json +78 -47
  246. package/types/siemens-element-ng-application-header.d.ts +7 -33
  247. package/types/siemens-element-ng-avatar.d.ts +1 -1
  248. package/types/siemens-element-ng-breadcrumb.d.ts +1 -1
  249. package/types/siemens-element-ng-chat-messages.d.ts +118 -70
  250. package/types/siemens-element-ng-circle-status.d.ts +1 -1
  251. package/types/siemens-element-ng-content-action-bar.d.ts +1 -1
  252. package/types/siemens-element-ng-dashboard.d.ts +2 -2
  253. package/types/siemens-element-ng-datatable.d.ts +5 -56
  254. package/types/siemens-element-ng-date-range-filter.d.ts +1 -1
  255. package/types/siemens-element-ng-datepicker.d.ts +8 -15
  256. package/types/siemens-element-ng-electron-titlebar.d.ts +1 -1
  257. package/types/siemens-element-ng-file-uploader.d.ts +13 -31
  258. package/types/siemens-element-ng-filter-bar.d.ts +1 -1
  259. package/types/siemens-element-ng-filtered-search.d.ts +4 -4
  260. package/types/siemens-element-ng-form.d.ts +183 -44
  261. package/types/siemens-element-ng-formly-legacy.d.ts +40 -0
  262. package/types/siemens-element-ng-formly.d.ts +34 -167
  263. package/types/siemens-element-ng-icon.d.ts +2 -19
  264. package/types/siemens-element-ng-landing-page.d.ts +2 -2
  265. package/types/siemens-element-ng-list-details.d.ts +25 -3
  266. package/types/siemens-element-ng-loading-spinner.d.ts +11 -17
  267. package/types/siemens-element-ng-main-detail-container.d.ts +23 -3
  268. package/types/siemens-element-ng-maplibre.d.ts +190 -0
  269. package/types/siemens-element-ng-markdown-directives-tabs.d.ts +10 -0
  270. package/types/siemens-element-ng-markdown-extensions-citations.d.ts +11 -0
  271. package/types/siemens-element-ng-markdown-extensions-katex.d.ts +19 -0
  272. package/types/siemens-element-ng-markdown-extensions-mermaid.d.ts +11 -0
  273. package/types/siemens-element-ng-markdown-hightlighter-highlightjs.d.ts +48 -0
  274. package/types/siemens-element-ng-markdown.d.ts +367 -0
  275. package/types/siemens-element-ng-menu.d.ts +2 -0
  276. package/types/siemens-element-ng-navbar-vertical-next.d.ts +87 -39
  277. package/types/siemens-element-ng-navbar-vertical.d.ts +1 -1
  278. package/types/siemens-element-ng-navbar.d.ts +3 -3
  279. package/types/siemens-element-ng-notification-item.d.ts +12 -0
  280. package/types/siemens-element-ng-phone-number.d.ts +28 -10
  281. package/types/siemens-element-ng-photo-upload.d.ts +4 -4
  282. package/types/siemens-element-ng-resize-observer.d.ts +0 -17
  283. package/types/siemens-element-ng-search-bar.d.ts +2 -9
  284. package/types/siemens-element-ng-select.d.ts +32 -5
  285. package/types/siemens-element-ng-side-panel.d.ts +25 -11
  286. package/types/siemens-element-ng-source-chip.d.ts +53 -0
  287. package/types/siemens-element-ng-split.d.ts +101 -78
  288. package/types/siemens-element-ng-status-bar.d.ts +5 -13
  289. package/types/siemens-element-ng-status-counter.d.ts +1 -1
  290. package/types/siemens-element-ng-system-banner.d.ts +2 -2
  291. package/types/siemens-element-ng-tabs.d.ts +1 -2
  292. package/types/siemens-element-ng-theme.d.ts +12 -2
  293. package/types/siemens-element-ng-threshold.d.ts +1 -1
  294. package/types/siemens-element-ng-toast-notification.d.ts +0 -1
  295. package/types/siemens-element-ng-tooltip.d.ts +7 -7
  296. package/types/siemens-element-ng-translate.d.ts +35 -5
  297. package/types/siemens-element-ng-tree-view.d.ts +3 -0
  298. package/types/siemens-element-ng-wizard.d.ts +18 -3
  299. package/fesm2022/siemens-element-ng-icon-status.mjs +0 -46
  300. package/fesm2022/siemens-element-ng-icon-status.mjs.map +0 -1
  301. package/fesm2022/siemens-element-ng-markdown-renderer.mjs +0 -263
  302. package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +0 -1
  303. package/fesm2022/siemens-element-ng-sort-bar.mjs +0 -99
  304. package/fesm2022/siemens-element-ng-sort-bar.mjs.map +0 -1
  305. package/icon-status/package.json +0 -4
  306. package/markdown-renderer/package.json +0 -4
  307. package/schematics/migrations/icon-path-migration/icon-path-migration.js +0 -95
  308. package/schematics/ng-update/migrate-to-v49.js +0 -21
  309. package/schematics/vitest-setup.js +0 -5
  310. package/sort-bar/package.json +0 -4
  311. package/types/siemens-element-ng-icon-status.d.ts +0 -25
  312. package/types/siemens-element-ng-markdown-renderer.d.ts +0 -36
  313. package/types/siemens-element-ng-sort-bar.d.ts +0 -59
  314. /package/{LICENSE.md → LICENSE} +0 -0
@@ -0,0 +1,524 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { Element } from '@angular/compiler';
6
+ import { dirname, join } from 'path/posix';
7
+ import ts from 'typescript';
8
+ import { removeImportSpecifiers } from '../migrations/utilities/import-removal.js';
9
+ import { discoverSourceFiles, findElement, formatBoundAttribute, getComponentTemplates, getImportSpecifiers, removeAttribute, replaceAttribute } from '../utils/index.js';
10
+ const splitImportPath = /^@(siemens|simpl)\/element-ng\/split(?:\/index)?$/;
11
+ const scaleAttributeNames = ['scale', '[scale]', 'bind-scale'];
12
+ const unitAttributeNames = ['unit', '[unit]', 'bind-unit'];
13
+ export const splitScaleMigrationRule = (options) => {
14
+ return async (tree, context) => {
15
+ const externalTemplates = new Map();
16
+ const manualSizeMigrationPaths = new Set();
17
+ const conflictingUnitPaths = new Set();
18
+ for await (const discoveredSourceFile of discoverSourceFiles(tree, context, options.path)) {
19
+ const { path: filePath, sourceFile } = discoveredSourceFile;
20
+ const scaleImports = getScaleImports(sourceFile);
21
+ const scaleTypeNames = getScaleTypeNames(sourceFile, scaleImports);
22
+ const recorder = tree.beginUpdate(filePath);
23
+ migrateScaleTypes(sourceFile, recorder, scaleImports, scaleTypeNames, discoveredSourceFile.typeChecker);
24
+ for (const template of getComponentTemplates(sourceFile)) {
25
+ const scaleMemberNames = collectScaleMemberNames(template.component, scaleTypeNames);
26
+ if (template.kind === 'inline') {
27
+ const result = migrateScaleTemplate(sourceFile.text.substring(template.node.getStart() + 1, template.node.getEnd() - 1), template.node.getStart() + 1, recorder, [scaleMemberNames]);
28
+ if (result.requiresManualSizeMigration) {
29
+ manualSizeMigrationPaths.add(filePath);
30
+ }
31
+ if (result.hasConflictingUnit) {
32
+ conflictingUnitPaths.add(filePath);
33
+ }
34
+ }
35
+ else {
36
+ const templatePath = join(dirname(filePath), template.url);
37
+ const owners = externalTemplates.get(templatePath) ?? [];
38
+ owners.push(scaleMemberNames);
39
+ externalTemplates.set(templatePath, owners);
40
+ }
41
+ }
42
+ tree.commitUpdate(recorder);
43
+ }
44
+ // A shared template must be migrated using all of its component contexts.
45
+ for (const [templatePath, owners] of externalTemplates) {
46
+ if (!tree.exists(templatePath)) {
47
+ continue;
48
+ }
49
+ const recorder = tree.beginUpdate(templatePath);
50
+ const result = migrateScaleTemplate(tree.readText(templatePath), 0, recorder, owners);
51
+ if (result.requiresManualSizeMigration) {
52
+ manualSizeMigrationPaths.add(templatePath);
53
+ }
54
+ if (result.hasConflictingUnit) {
55
+ conflictingUnitPaths.add(templatePath);
56
+ }
57
+ tree.commitUpdate(recorder);
58
+ }
59
+ if (manualSizeMigrationPaths.size) {
60
+ context.logger.warn(`The following files contain si-split-part elements with scale="none" whose relative size was supplied by [sizes]. Their relative size is preserved with unit="fr" because a pixel size cannot be inferred. Set size and unit="px" manually:\n${[
61
+ ...manualSizeMigrationPaths
62
+ ]
63
+ .sort()
64
+ .map(path => `- ${path}`)
65
+ .join('\n')}`);
66
+ }
67
+ if (conflictingUnitPaths.size) {
68
+ context.logger.warn(`The following files contain si-split-part elements with conflicting scale and unit values. The existing unit was preserved and scale removed. Review these parts manually:\n${[
69
+ ...conflictingUnitPaths
70
+ ]
71
+ .sort()
72
+ .map(path => `- ${path}`)
73
+ .join('\n')}`);
74
+ }
75
+ return tree;
76
+ };
77
+ };
78
+ const migrateScaleTemplate = (template, offset, recorder, owners) => {
79
+ const elements = findElement(template, element => element.name === 'si-split' || element.name === 'si-split-part');
80
+ const partsWithRelativeSizes = new Set();
81
+ for (const split of elements) {
82
+ if (split.name !== 'si-split' || !split.attrs.some(attribute => attribute.name === '[sizes]')) {
83
+ continue;
84
+ }
85
+ for (const child of split.children) {
86
+ if (child instanceof Element &&
87
+ child.name === 'si-split-part' &&
88
+ !child.attrs.some(attribute => attribute.name === 'size' || attribute.name === '[size]')) {
89
+ partsWithRelativeSizes.add(child);
90
+ }
91
+ }
92
+ }
93
+ let requiresManualSizeMigration = false;
94
+ let hasConflictingUnit = false;
95
+ elements.forEach(element => {
96
+ if (element.name !== 'si-split-part') {
97
+ return;
98
+ }
99
+ const scale = element.attrs.find(attribute => scaleAttributeNames.includes(attribute.name));
100
+ if (!scale) {
101
+ return;
102
+ }
103
+ const unit = element.attrs.find(attribute => unitAttributeNames.includes(attribute.name));
104
+ if (unit) {
105
+ hasConflictingUnit ||= hasConflictingStaticUnit(scale, unit);
106
+ removeAttribute(template, scale, offset, recorder);
107
+ return;
108
+ }
109
+ let replacement;
110
+ if (partsWithRelativeSizes.has(element) &&
111
+ scale.name === 'scale' &&
112
+ scale.value.trim() === 'none') {
113
+ replacement = 'unit="fr"';
114
+ requiresManualSizeMigration = true;
115
+ }
116
+ else {
117
+ const expression = scale.name === 'scale' ? getInterpolationExpression(scale.value) : scale.value;
118
+ const replacements = new Set(owners.map(names => getUnitAttribute(scale, names, expression)));
119
+ replacement = replacements.values().next().value;
120
+ if (replacements.size > 1 && expression !== undefined) {
121
+ replacement = formatBoundAttribute('unit', `['none', 'px'].includes(${expression}) ? 'px' : 'fr'`);
122
+ }
123
+ }
124
+ replaceAttribute(scale, replacement, offset, recorder);
125
+ });
126
+ return { requiresManualSizeMigration, hasConflictingUnit };
127
+ };
128
+ const hasConflictingStaticUnit = (scale, unit) => {
129
+ const scaleValue = scale.value.trim();
130
+ const unitValue = unit.value.trim();
131
+ return (scale.name === 'scale' &&
132
+ unit.name === 'unit' &&
133
+ (scaleValue === 'auto' || scaleValue === 'none') &&
134
+ (unitValue === 'fr' || unitValue === 'px') &&
135
+ getScaleUnit(scaleValue) !== unitValue);
136
+ };
137
+ const getInterpolationExpression = (value) => /^\s*{{([\s\S]*)}}\s*$/.exec(value)?.[1]?.trim();
138
+ const getUnitAttribute = (attribute, scaleMemberNames, expression) => {
139
+ if (attribute.name === 'scale') {
140
+ if (expression !== undefined) {
141
+ return formatUnitBinding(expression, scaleMemberNames, getExpression(expression));
142
+ }
143
+ return `unit="${getScaleUnit(attribute.value)}"`;
144
+ }
145
+ const parsedExpression = getExpression(attribute.value);
146
+ if (parsedExpression && ts.isStringLiteral(parsedExpression)) {
147
+ return `unit="${getScaleUnit(parsedExpression.text)}"`;
148
+ }
149
+ return formatUnitBinding(attribute.value, scaleMemberNames, parsedExpression);
150
+ };
151
+ const getScaleUnit = (value) => (value.trim() === 'none' ? 'px' : 'fr');
152
+ const getUnitExpression = (expression) => {
153
+ const value = expression.trim();
154
+ return `['none', 'px'].includes(${value}) ? 'px' : 'fr'`;
155
+ };
156
+ const formatUnitBinding = (expression, scaleMemberNames, parsedExpression) => {
157
+ const typedExpression = getTypedScaleExpression(parsedExpression, scaleMemberNames);
158
+ const mappedExpression = getMappedScaleExpression(expression, parsedExpression);
159
+ const value = typedExpression ?? mappedExpression ?? getUnitExpression(expression);
160
+ return formatBoundAttribute('unit', value);
161
+ };
162
+ const getScaleImports = (sourceFile) => {
163
+ const importedSpecifiers = new Set(getImportSpecifiers(sourceFile, splitImportPath, 'Scale'));
164
+ return sourceFile.statements.flatMap(statement => {
165
+ if (!ts.isImportDeclaration(statement)) {
166
+ return [];
167
+ }
168
+ const namedBindings = statement.importClause?.namedBindings;
169
+ if (!namedBindings || !ts.isNamedImports(namedBindings)) {
170
+ return [];
171
+ }
172
+ return namedBindings.elements
173
+ .filter(element => importedSpecifiers.has(element))
174
+ .map(element => ({ declaration: statement, element }));
175
+ });
176
+ };
177
+ const getScaleTypeNames = (sourceFile, scaleImports) => {
178
+ const names = new Set(scaleImports.map(({ element }) => element.name.text));
179
+ collectScaleTypeAliases(sourceFile, names);
180
+ return names;
181
+ };
182
+ const collectScaleMemberNames = (component, scaleTypeNames) => {
183
+ const names = new Set();
184
+ for (const node of component.members) {
185
+ if (ts.canHaveModifiers(node) &&
186
+ ts.getModifiers(node)?.some(modifier => modifier.kind === ts.SyntaxKind.StaticKeyword)) {
187
+ continue;
188
+ }
189
+ if (ts.isPropertyDeclaration(node) &&
190
+ ts.isIdentifier(node.name) &&
191
+ (isScaleType(node.type, scaleTypeNames) ||
192
+ isScaleInitializer(node.initializer, scaleTypeNames))) {
193
+ names.add(node.name.text);
194
+ }
195
+ if ((ts.isMethodDeclaration(node) || ts.isGetAccessorDeclaration(node)) &&
196
+ node.name &&
197
+ ts.isIdentifier(node.name) &&
198
+ isScaleType(node.type, scaleTypeNames)) {
199
+ names.add(node.name.text);
200
+ }
201
+ if (ts.isPropertyDeclaration(node) &&
202
+ ts.isIdentifier(node.name) &&
203
+ node.initializer &&
204
+ (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer)) &&
205
+ isScaleType(node.initializer.type, scaleTypeNames)) {
206
+ names.add(node.name.text);
207
+ }
208
+ }
209
+ return names;
210
+ };
211
+ const isScaleInitializer = (initializer, scaleTypeNames) => {
212
+ if (!initializer || !ts.isCallExpression(initializer)) {
213
+ return false;
214
+ }
215
+ return (initializer.typeArguments?.some(typeArgument => isScaleType(typeArgument, scaleTypeNames)) ===
216
+ true);
217
+ };
218
+ const migrateScaleTypes = (sourceFile, recorder, scaleImports, scaleTypeNames, typeChecker) => {
219
+ if (!scaleImports.length) {
220
+ return;
221
+ }
222
+ const replacements = new Map();
223
+ const importEdits = [];
224
+ const existingUnit = getImportSpecifiers(sourceFile, splitImportPath, 'SplitUnit')[0];
225
+ for (const importDeclaration of new Set(scaleImports.map(({ declaration }) => declaration))) {
226
+ const imports = scaleImports.filter(item => item.declaration === importDeclaration);
227
+ if (existingUnit) {
228
+ imports.forEach(({ element }) => replacements.set(element.name.text, existingUnit.name.text));
229
+ const edit = removeImportSpecifiers(sourceFile, importDeclaration, imports.map(({ element }) => element));
230
+ importEdits.push({
231
+ start: edit.start,
232
+ width: edit.width,
233
+ replacement: edit.newNode
234
+ ? ts.createPrinter().printNode(ts.EmitHint.Unspecified, edit.newNode, sourceFile)
235
+ : undefined
236
+ });
237
+ continue;
238
+ }
239
+ for (const { element } of imports) {
240
+ if (element.propertyName) {
241
+ importEdits.push({
242
+ start: element.propertyName.getStart(sourceFile),
243
+ width: element.propertyName.getWidth(sourceFile),
244
+ replacement: 'SplitUnit'
245
+ });
246
+ continue;
247
+ }
248
+ importEdits.push({
249
+ start: element.name.getStart(sourceFile),
250
+ width: element.name.getWidth(sourceFile),
251
+ replacement: 'SplitUnit'
252
+ });
253
+ replacements.set(element.name.text, 'SplitUnit');
254
+ }
255
+ }
256
+ for (const edit of importEdits) {
257
+ recorder.remove(edit.start, edit.width);
258
+ if (edit.replacement) {
259
+ recorder.insertLeft(edit.start, edit.replacement);
260
+ }
261
+ }
262
+ replaceScaleIdentifiers(sourceFile, replacements, recorder);
263
+ replaceScaleLiterals(sourceFile, scaleTypeNames, typeChecker, recorder);
264
+ };
265
+ const collectScaleTypeAliases = (sourceFile, names) => {
266
+ let changed = true;
267
+ while (changed) {
268
+ changed = false;
269
+ for (const statement of sourceFile.statements) {
270
+ if (ts.isTypeAliasDeclaration(statement) &&
271
+ isScaleType(statement.type, names) &&
272
+ !names.has(statement.name.text)) {
273
+ names.add(statement.name.text);
274
+ changed = true;
275
+ }
276
+ }
277
+ }
278
+ };
279
+ const isScaleType = (type, names) => {
280
+ if (!type) {
281
+ return false;
282
+ }
283
+ if (ts.isTypeReferenceNode(type)) {
284
+ return ts.isIdentifier(type.typeName) && names.has(type.typeName.text);
285
+ }
286
+ if (ts.isParenthesizedTypeNode(type)) {
287
+ return isScaleType(type.type, names);
288
+ }
289
+ if (ts.isUnionTypeNode(type) || ts.isIntersectionTypeNode(type)) {
290
+ return type.types.some(member => isScaleType(member, names));
291
+ }
292
+ return false;
293
+ };
294
+ const replaceScaleIdentifiers = (sourceFile, replacements, recorder) => {
295
+ if (!replacements.size) {
296
+ return;
297
+ }
298
+ const visit = (node) => {
299
+ if (ts.isImportDeclaration(node)) {
300
+ return;
301
+ }
302
+ if (ts.isIdentifier(node) && isScaleTypeReference(node)) {
303
+ const replacement = replacements.get(node.text);
304
+ if (replacement) {
305
+ recorder.remove(node.getStart(sourceFile), node.getWidth(sourceFile));
306
+ recorder.insertLeft(node.getStart(sourceFile), replacement);
307
+ return;
308
+ }
309
+ }
310
+ ts.forEachChild(node, visit);
311
+ };
312
+ sourceFile.statements.forEach(statement => visit(statement));
313
+ };
314
+ const isScaleTypeReference = (node) => {
315
+ const parent = node.parent;
316
+ if (ts.isTypeReferenceNode(parent)) {
317
+ return parent.typeName === node;
318
+ }
319
+ if (ts.isExpressionWithTypeArguments(parent)) {
320
+ return parent.expression === node;
321
+ }
322
+ if (ts.isTypeQueryNode(parent)) {
323
+ return parent.exprName === node;
324
+ }
325
+ if (ts.isExportSpecifier(parent)) {
326
+ return !parent.propertyName || parent.propertyName === node;
327
+ }
328
+ return false;
329
+ };
330
+ const replaceScaleLiterals = (sourceFile, scaleTypeNames, typeChecker, recorder) => {
331
+ const typedNames = new Set();
332
+ const literals = new Set();
333
+ const collectLiterals = (node) => {
334
+ if (!node) {
335
+ return;
336
+ }
337
+ if (ts.isStringLiteral(node) && isScaleLiteral(node)) {
338
+ literals.add(node);
339
+ return;
340
+ }
341
+ if (ts.isParenthesizedExpression(node)) {
342
+ collectLiterals(node.expression);
343
+ return;
344
+ }
345
+ if (ts.isAsExpression(node) ||
346
+ ts.isTypeAssertionExpression(node) ||
347
+ ts.isNonNullExpression(node)) {
348
+ collectLiterals(node.expression);
349
+ return;
350
+ }
351
+ if (ts.isConditionalExpression(node)) {
352
+ collectLiterals(node.whenTrue);
353
+ collectLiterals(node.whenFalse);
354
+ return;
355
+ }
356
+ if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
357
+ collectLiterals(node.body);
358
+ return;
359
+ }
360
+ if (ts.isObjectLiteralExpression(node)) {
361
+ node.properties.forEach(property => {
362
+ if (!ts.isPropertyAssignment(property)) {
363
+ return;
364
+ }
365
+ const contextualType = typeChecker.getContextualType(property.initializer);
366
+ if (isScaleCheckerType(contextualType, scaleTypeNames)) {
367
+ collectLiterals(property.initializer);
368
+ }
369
+ });
370
+ }
371
+ };
372
+ const collectContextualLiterals = (node) => {
373
+ if (ts.isStringLiteral(node) &&
374
+ isScaleLiteral(node) &&
375
+ isScaleCheckerType(typeChecker.getContextualType(node), scaleTypeNames)) {
376
+ literals.add(node);
377
+ }
378
+ ts.forEachChild(node, collectContextualLiterals);
379
+ };
380
+ const visit = (node) => {
381
+ if ((ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node)) &&
382
+ ts.isIdentifier(node.name)) {
383
+ const hasScaleType = isScaleType(node.type, scaleTypeNames);
384
+ const scaleInitializer = node.initializer && ts.isCallExpression(node.initializer) ? node.initializer : undefined;
385
+ const hasScaleInitializer = !!scaleInitializer && isScaleInitializer(scaleInitializer, scaleTypeNames);
386
+ if (hasScaleType || hasScaleInitializer) {
387
+ typedNames.add(node.name.text);
388
+ if (hasScaleInitializer) {
389
+ collectLiterals(scaleInitializer.arguments[0]);
390
+ }
391
+ else {
392
+ collectLiterals(node.initializer);
393
+ }
394
+ }
395
+ }
396
+ if (ts.isParameter(node) && ts.isIdentifier(node.name)) {
397
+ if (isScaleType(node.type, scaleTypeNames)) {
398
+ typedNames.add(node.name.text);
399
+ collectLiterals(node.initializer);
400
+ }
401
+ }
402
+ const isFunctionWithBody = ts.isFunctionDeclaration(node) ||
403
+ ts.isMethodDeclaration(node) ||
404
+ ts.isArrowFunction(node) ||
405
+ ts.isFunctionExpression(node) ||
406
+ ts.isGetAccessorDeclaration(node) ||
407
+ ts.isSetAccessorDeclaration(node);
408
+ if (isFunctionWithBody && isScaleType(node.type, scaleTypeNames)) {
409
+ if (node.body) {
410
+ const collectReturns = (child) => {
411
+ if (ts.isReturnStatement(child) && child.expression) {
412
+ collectLiterals(child.expression);
413
+ }
414
+ ts.forEachChild(child, collectReturns);
415
+ };
416
+ collectReturns(node.body);
417
+ }
418
+ }
419
+ if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
420
+ const root = getRootIdentifier(node.left);
421
+ if (root && typedNames.has(root)) {
422
+ collectLiterals(node.right);
423
+ }
424
+ }
425
+ if (ts.isCallExpression(node) &&
426
+ ts.isPropertyAccessExpression(node.expression) &&
427
+ (node.expression.name.text === 'set' || node.expression.name.text === 'update') &&
428
+ typedNames.has(getRootIdentifier(node.expression.expression) ?? '')) {
429
+ node.arguments.forEach(collectLiterals);
430
+ }
431
+ ts.forEachChild(node, visit);
432
+ };
433
+ sourceFile.statements.filter(statement => !ts.isImportDeclaration(statement)).forEach(visit);
434
+ sourceFile.statements
435
+ .filter(statement => !ts.isImportDeclaration(statement))
436
+ .forEach(collectContextualLiterals);
437
+ literals.forEach(literal => {
438
+ const replacement = literal.text === 'auto' ? 'fr' : 'px';
439
+ const start = literal.getStart(sourceFile) + 1;
440
+ recorder.remove(start, literal.getWidth(sourceFile) - 2);
441
+ recorder.insertLeft(start, replacement);
442
+ });
443
+ };
444
+ const isScaleLiteral = (node) => node.text === 'auto' || node.text === 'none';
445
+ const isScaleCheckerType = (type, names) => {
446
+ if (!type) {
447
+ return false;
448
+ }
449
+ if (type.isUnionOrIntersection()) {
450
+ return type.types.some(member => isScaleCheckerType(member, names));
451
+ }
452
+ return names.has(type.aliasSymbol?.name ?? '') || names.has(type.symbol?.name ?? '');
453
+ };
454
+ const getTypedScaleExpression = (expression, scaleMemberNames) => {
455
+ return expression && isTypedScaleExpression(expression, scaleMemberNames)
456
+ ? expression.getText()
457
+ : undefined;
458
+ };
459
+ const isTypedScaleExpression = (expression, scaleMemberNames) => {
460
+ if (ts.isIdentifier(expression)) {
461
+ return scaleMemberNames.has(expression.text);
462
+ }
463
+ if (ts.isPropertyAccessExpression(expression)) {
464
+ return (expression.expression.kind === ts.SyntaxKind.ThisKeyword &&
465
+ scaleMemberNames.has(expression.name.text));
466
+ }
467
+ if (ts.isCallExpression(expression)) {
468
+ return isTypedScaleExpression(expression.expression, scaleMemberNames);
469
+ }
470
+ if (ts.isParenthesizedExpression(expression)) {
471
+ return isTypedScaleExpression(expression.expression, scaleMemberNames);
472
+ }
473
+ return false;
474
+ };
475
+ const getMappedScaleExpression = (expression, initializer) => {
476
+ if (!initializer || !ts.isConditionalExpression(initializer)) {
477
+ return undefined;
478
+ }
479
+ const replacements = [];
480
+ const source = initializer.getSourceFile();
481
+ const collect = (node) => {
482
+ if (ts.isStringLiteral(node) && isScaleLiteral(node)) {
483
+ replacements.push({
484
+ start: node.getStart(source) + 1,
485
+ end: node.getEnd() - 1,
486
+ value: node.text === 'none' ? 'px' : 'fr'
487
+ });
488
+ return;
489
+ }
490
+ if (ts.isConditionalExpression(node)) {
491
+ collect(node.whenTrue);
492
+ collect(node.whenFalse);
493
+ }
494
+ };
495
+ collect(initializer);
496
+ if (!replacements.length) {
497
+ return undefined;
498
+ }
499
+ const leadingWhitespaceLength = expression.length - expression.trimStart().length;
500
+ const syntheticSourcePrefixLength = initializer.getStart(source) - leadingWhitespaceLength;
501
+ return replacements
502
+ .sort((first, second) => second.start - first.start)
503
+ .reduce((value, replacement) => {
504
+ return (value.slice(0, replacement.start - syntheticSourcePrefixLength) +
505
+ replacement.value +
506
+ value.slice(replacement.end - syntheticSourcePrefixLength));
507
+ }, expression);
508
+ };
509
+ const getRootIdentifier = (node) => {
510
+ if (ts.isIdentifier(node)) {
511
+ return node.text;
512
+ }
513
+ if (ts.isPropertyAccessExpression(node)) {
514
+ return node.name.text;
515
+ }
516
+ return undefined;
517
+ };
518
+ const getExpression = (value) => {
519
+ const statement = ts.createSourceFile('split-scale-expression.ts', `const value = ${value};`, ts.ScriptTarget.Latest, true).statements[0];
520
+ if (!statement || !ts.isVariableStatement(statement)) {
521
+ return undefined;
522
+ }
523
+ return statement.declarationList.declarations[0]?.initializer;
524
+ };
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { Element } from '@angular/compiler';
6
+ import { dirname, join } from 'path/posix';
7
+ import ts from 'typescript';
8
+ import { discoverSourceFiles, findElement, getInlineTemplates, getTemplateUrl } from '../utils/index.js';
9
+ export const splitSizesMigrationRule = (options) => {
10
+ return async (tree, context) => {
11
+ const processedTemplates = new Set();
12
+ for await (const discoveredSourceFile of discoverSourceFiles(tree, context, options.path)) {
13
+ const { path: filePath, sourceFile } = discoveredSourceFile;
14
+ const recorder = tree.beginUpdate(filePath);
15
+ for (const template of getInlineTemplates(sourceFile)) {
16
+ const templateText = sourceFile.text.substring(template.getStart() + 1, template.getEnd() - 1);
17
+ migrateSplitSizes(templateText, template.getStart() + 1, recorder);
18
+ migrateMissingSplitUnit(templateText, template.getStart() + 1, recorder);
19
+ }
20
+ tree.commitUpdate(recorder);
21
+ for (const templateUrl of getTemplateUrl(sourceFile)) {
22
+ const templatePath = join(dirname(filePath), templateUrl);
23
+ if (processedTemplates.has(templatePath) || !tree.exists(templatePath)) {
24
+ continue;
25
+ }
26
+ processedTemplates.add(templatePath);
27
+ const templateContent = tree.read(templatePath).toString('utf-8');
28
+ const templateRecorder = tree.beginUpdate(templatePath);
29
+ migrateSplitSizes(templateContent, 0, templateRecorder);
30
+ migrateMissingSplitUnit(templateContent, 0, templateRecorder);
31
+ tree.commitUpdate(templateRecorder);
32
+ }
33
+ }
34
+ return tree;
35
+ };
36
+ };
37
+ const migrateSplitSizes = (template, offset, recorder) => {
38
+ findElement(template, element => element.name === 'si-split').forEach(split => {
39
+ const sizes = split.attrs.find(attribute => attribute.name === '[sizes]');
40
+ if (!sizes) {
41
+ return;
42
+ }
43
+ const parts = split.children.filter((child) => child instanceof Element && child.name === 'si-split-part');
44
+ const literalSizes = getNumericArrayLiteral(sizes.value);
45
+ parts.forEach((part, index) => {
46
+ if (part.attrs.some(attribute => attribute.name === 'size' || attribute.name === '[size]')) {
47
+ return;
48
+ }
49
+ const hasUnit = parts[index].attrs.some(attribute => ['unit', '[unit]', 'bind-unit'].includes(attribute.name));
50
+ const unitAttribute = hasUnit ? '' : ' unit="fr"';
51
+ const sizeAttribute = literalSizes
52
+ ? ` size="${literalSizes[index]}"${unitAttribute}`
53
+ : ` [size]="${getIndexedSizeExpression(sizes.value, index)}"${unitAttribute}`;
54
+ const startTag = part.startSourceSpan.toString();
55
+ const insertOffset = part.startSourceSpan.end.offset - (startTag.endsWith('/>') ? 2 : 1);
56
+ recorder.insertLeft(insertOffset + offset, sizeAttribute);
57
+ });
58
+ const precedingCharacter = template[sizes.sourceSpan.start.offset - 1];
59
+ const removeOffset = sizes.sourceSpan.start.offset - (precedingCharacter === ' ' ? 1 : 0);
60
+ const removeLength = sizes.sourceSpan.end.offset - removeOffset;
61
+ recorder.remove(removeOffset + offset, removeLength);
62
+ });
63
+ };
64
+ const getNumericArrayLiteral = (value) => {
65
+ const sourceFile = ts.createSourceFile('sizes.ts', `const sizes = ${value};`, ts.ScriptTarget.Latest, true);
66
+ const declaration = sourceFile.statements[0];
67
+ if (!declaration || !ts.isVariableStatement(declaration)) {
68
+ return undefined;
69
+ }
70
+ const initializer = declaration.declarationList.declarations[0]?.initializer;
71
+ if (!initializer || !ts.isArrayLiteralExpression(initializer)) {
72
+ return undefined;
73
+ }
74
+ const sizes = initializer.elements.map(element => {
75
+ if (ts.isNumericLiteral(element)) {
76
+ return element.text;
77
+ }
78
+ if (ts.isPrefixUnaryExpression(element) &&
79
+ element.operator === ts.SyntaxKind.MinusToken &&
80
+ ts.isNumericLiteral(element.operand)) {
81
+ return `-${element.operand.text}`;
82
+ }
83
+ return undefined;
84
+ });
85
+ return sizes.every((size) => size !== undefined) ? sizes : undefined;
86
+ };
87
+ const getIndexedSizeExpression = (expression, index) => {
88
+ const isPropertyAccess = /^[A-Za-z_$][\w$]*(?:\??\.[A-Za-z_$][\w$]*)*$/.test(expression);
89
+ return `${isPropertyAccess ? expression : `(${expression})`}[${index}]`;
90
+ };
91
+ /**
92
+ * Adds `unit="px"` to every `si-split-part` that already carries an explicit
93
+ * `size` / `[size]` attribute but no `unit` / `[unit]` attribute. Parts that
94
+ * lack a size attribute are handled by {@link migrateSplitSizes} instead.
95
+ */
96
+ const migrateMissingSplitUnit = (template, offset, recorder) => {
97
+ findElement(template, element => element.name === 'si-split-part').forEach(part => {
98
+ const hasSize = part.attrs.some(a => a.name === 'size' || a.name === '[size]');
99
+ const hasUnit = part.attrs.some(a => ['unit', '[unit]', 'bind-unit'].includes(a.name));
100
+ if (!hasSize || hasUnit) {
101
+ return;
102
+ }
103
+ const startTag = part.startSourceSpan.toString();
104
+ const insertOffset = part.startSourceSpan.end.offset - (startTag.endsWith('/>') ? 2 : 1);
105
+ recorder.insertLeft(insertOffset + offset, ' unit="px"');
106
+ });
107
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { chain } from '@angular-devkit/schematics';
6
+ import { getElementMigrationData } from '../migrations/data/index.js';
7
+ import { elementMigrationRule } from '../migrations/element-migration/element-migration.js';
8
+ import { missingTranslateMigrationRule } from '../migrations/ngx-translate/index.js';
9
+ import { contentFormatterMigrationRule } from './migrate-content-formatter.js';
10
+ import { listDetailsUnitsMigrationRule } from './migrate-list-details-units.js';
11
+ import { mainDetailUnitsMigrationRule } from './migrate-main-detail-units.js';
12
+ import { markdownRendererMigrationRule } from './migrate-markdown-renderer.js';
13
+ import { spacerMigrationRule } from './migrate-spacers.js';
14
+ import { splitCollapseMigrationRule } from './migrate-split-collapse.js';
15
+ import { splitScaleMigrationRule } from './migrate-split-scale.js';
16
+ import { splitSizesMigrationRule } from './migrate-split-sizes.js';
17
+ export const migrateToV51 = () => {
18
+ return (tree, context) => {
19
+ context.logger.info('🚀 Starting update from version 49 to 51...');
20
+ const migrationData = getElementMigrationData();
21
+ const options = { path: '/' };
22
+ return chain([
23
+ elementMigrationRule(options, migrationData),
24
+ missingTranslateMigrationRule(options),
25
+ splitScaleMigrationRule(options),
26
+ splitSizesMigrationRule(options),
27
+ splitCollapseMigrationRule(options),
28
+ mainDetailUnitsMigrationRule(options),
29
+ listDetailsUnitsMigrationRule(options),
30
+ contentFormatterMigrationRule(options),
31
+ markdownRendererMigrationRule(options),
32
+ spacerMigrationRule(options)
33
+ ])(tree, context);
34
+ };
35
+ };
@@ -7,5 +7,6 @@ export * from './project-utils.js';
7
7
  export * from './ts-compiler-host.js';
8
8
  export * from './schematics-file-system.js';
9
9
  export * from './template-utils.js';
10
+ export * from './template-edit-utils.js';
10
11
  export * from './testing.js';
11
12
  export * from './ts-utils.js';