@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,288 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { dirname, join } from 'path/posix';
6
+ import ts from 'typescript';
7
+ import { removeImportSpecifiers } from '../migrations/utilities/import-removal.js';
8
+ import { applyImport, discoverSourceFiles, findElement, getImportSpecifiers } from '../utils/index.js';
9
+ const MESSAGE_SELECTORS = new Set(['si-ai-message', 'si-user-message']);
10
+ export const contentFormatterMigrationRule = (options) => {
11
+ return async (tree, context) => {
12
+ const processedTemplates = new Set();
13
+ for await (const discoveredSourceFile of discoverSourceFiles(tree, context, options.path)) {
14
+ const { path: filePath, sourceFile } = discoveredSourceFile;
15
+ const recorder = tree.beginUpdate(filePath);
16
+ let sourceChanged = false;
17
+ for (const component of findComponents(sourceFile)) {
18
+ const rendererNames = getMarkdownRendererNames(component.declaration);
19
+ if (!rendererNames.size) {
20
+ continue;
21
+ }
22
+ const migrationResult = createMigrationResult();
23
+ const template = getInlineTemplate(component.metadata);
24
+ if (template) {
25
+ const templateText = sourceFile.text.substring(template.getStart() + 1, template.getEnd() - 1);
26
+ mergeMigrationResult(migrationResult, migrateContentFormatter(templateText, template.getStart() + 1, recorder, rendererNames));
27
+ }
28
+ for (const templateUrl of getTemplateUrls(component.metadata)) {
29
+ const templatePath = join(dirname(filePath), templateUrl);
30
+ if (processedTemplates.has(templatePath) || !tree.exists(templatePath)) {
31
+ continue;
32
+ }
33
+ processedTemplates.add(templatePath);
34
+ const templateContent = tree.read(templatePath).toString('utf-8');
35
+ const templateRecorder = tree.beginUpdate(templatePath);
36
+ const templateResult = migrateContentFormatter(templateContent, 0, templateRecorder, rendererNames);
37
+ tree.commitUpdate(templateRecorder);
38
+ mergeMigrationResult(migrationResult, templateResult);
39
+ }
40
+ if (migrationResult.migratedRendererNames.size > 0) {
41
+ const removedRendererProperties = removeUnusedRendererProperties(component.declaration, migrationResult, recorder);
42
+ removeUnusedMarkdownRendererImports(sourceFile, removedRendererProperties, recorder);
43
+ removeUnusedDomSanitizerImports(sourceFile, removedRendererProperties, recorder);
44
+ addMarkdownToComponentImports(component.metadata, recorder);
45
+ sourceChanged = true;
46
+ }
47
+ }
48
+ if (sourceChanged) {
49
+ const importChange = applyImport(sourceFile, 'SiMarkdownComponent', '@siemens/element-ng/markdown');
50
+ if (importChange) {
51
+ recorder.insertLeft(importChange.start, importChange.replacement);
52
+ }
53
+ }
54
+ tree.commitUpdate(recorder);
55
+ }
56
+ return tree;
57
+ };
58
+ };
59
+ const findComponents = (sourceFile) => {
60
+ const components = [];
61
+ sourceFile.forEachChild(node => {
62
+ if (!ts.isClassDeclaration(node)) {
63
+ return;
64
+ }
65
+ const decorator = ts.getDecorators(node)?.find(candidate => {
66
+ const expression = candidate.expression;
67
+ return (ts.isCallExpression(expression) &&
68
+ ts.isIdentifier(expression.expression) &&
69
+ expression.expression.text === 'Component');
70
+ });
71
+ const expression = decorator?.expression;
72
+ const metadata = expression &&
73
+ ts.isCallExpression(expression) &&
74
+ ts.isObjectLiteralExpression(expression.arguments[0])
75
+ ? expression.arguments[0]
76
+ : undefined;
77
+ if (metadata) {
78
+ components.push({ declaration: node, metadata });
79
+ }
80
+ });
81
+ return components;
82
+ };
83
+ const getMarkdownRendererNames = (component) => {
84
+ const names = new Set();
85
+ for (const member of component.members) {
86
+ if (ts.isPropertyDeclaration(member) &&
87
+ ts.isIdentifier(member.name) &&
88
+ member.initializer &&
89
+ ts.isCallExpression(member.initializer) &&
90
+ ts.isIdentifier(member.initializer.expression) &&
91
+ member.initializer.expression.text === 'getMarkdownRenderer') {
92
+ names.add(member.name.text);
93
+ }
94
+ }
95
+ return names;
96
+ };
97
+ const getInlineTemplate = (metadata) => {
98
+ const template = metadata.properties.find(property => {
99
+ return (ts.isPropertyAssignment(property) &&
100
+ ts.isIdentifier(property.name) &&
101
+ property.name.text === 'template');
102
+ });
103
+ if (template &&
104
+ ts.isPropertyAssignment(template) &&
105
+ (ts.isNoSubstitutionTemplateLiteral(template.initializer) ||
106
+ ts.isStringLiteral(template.initializer))) {
107
+ return template.initializer;
108
+ }
109
+ return undefined;
110
+ };
111
+ const getTemplateUrls = (metadata) => {
112
+ return metadata.properties.flatMap(property => {
113
+ if (ts.isPropertyAssignment(property) &&
114
+ ts.isIdentifier(property.name) &&
115
+ property.name.text === 'templateUrl' &&
116
+ ts.isStringLiteral(property.initializer)) {
117
+ return property.initializer.text;
118
+ }
119
+ return [];
120
+ });
121
+ };
122
+ const migrateContentFormatter = (template, offset, recorder, rendererNames) => {
123
+ const result = createMigrationResult();
124
+ findElement(template, () => true).forEach(element => {
125
+ const formatter = element.attrs.find(attribute => attribute.name === '[contentFormatter]');
126
+ const formatterName = formatter?.value.trim();
127
+ if (!formatterName || !rendererNames.has(formatterName)) {
128
+ return;
129
+ }
130
+ const content = element.attrs.find(attribute => {
131
+ return attribute.name === 'content' || attribute.name === '[content]';
132
+ });
133
+ if (!MESSAGE_SELECTORS.has(element.name) ||
134
+ !content ||
135
+ !formatter ||
136
+ !hasOnlyWhitespaceContent(element, template)) {
137
+ result.retainedRendererNames.add(formatterName);
138
+ return;
139
+ }
140
+ const markdownAttribute = content.name === '[content]' ? '[markdown]' : 'markdown';
141
+ const openingTag = removeAttributes(element, [content, formatter]);
142
+ const replacement = `${openingTag}<si-markdown ${markdownAttribute}="${content.value}" /></${element.name}>`;
143
+ const start = element.sourceSpan.start.offset + offset;
144
+ const length = element.sourceSpan.end.offset - element.sourceSpan.start.offset;
145
+ recorder.remove(start, length);
146
+ recorder.insertLeft(start, replacement);
147
+ result.migratedRendererNames.add(formatterName);
148
+ });
149
+ return result;
150
+ };
151
+ const createMigrationResult = () => ({
152
+ migratedRendererNames: new Set(),
153
+ retainedRendererNames: new Set()
154
+ });
155
+ const mergeMigrationResult = (target, source) => {
156
+ source.migratedRendererNames.forEach(name => target.migratedRendererNames.add(name));
157
+ source.retainedRendererNames.forEach(name => target.retainedRendererNames.add(name));
158
+ };
159
+ const removeUnusedRendererProperties = (component, migrationResult, recorder) => {
160
+ const removedProperties = [];
161
+ for (const property of component.members) {
162
+ if (!ts.isPropertyDeclaration(property) ||
163
+ !ts.isIdentifier(property.name) ||
164
+ !migrationResult.migratedRendererNames.has(property.name.text) ||
165
+ migrationResult.retainedRendererNames.has(property.name.text) ||
166
+ hasReferenceOutsideProperty(component, property.name.text, property)) {
167
+ continue;
168
+ }
169
+ recorder.remove(property.getFullStart(), property.getEnd() - property.getFullStart());
170
+ removedProperties.push(property);
171
+ }
172
+ return removedProperties;
173
+ };
174
+ const hasReferenceOutsideProperty = (component, name, excludedProperty) => {
175
+ let referenced = false;
176
+ const visit = (node) => {
177
+ if (node === excludedProperty || referenced) {
178
+ return;
179
+ }
180
+ if (ts.isIdentifier(node) && node.text === name) {
181
+ referenced = true;
182
+ return;
183
+ }
184
+ ts.forEachChild(node, visit);
185
+ };
186
+ component.forEachChild(visit);
187
+ return referenced;
188
+ };
189
+ const removeUnusedMarkdownRendererImports = (sourceFile, removedProperties, recorder) => {
190
+ const getMarkdownRendererImports = getImportSpecifiers(sourceFile, '@siemens/element-ng/markdown-renderer', 'getMarkdownRenderer');
191
+ if (getMarkdownRendererImports.length &&
192
+ !hasIdentifierReferenceOutsideNodes(sourceFile, getMarkdownRendererImports.map(specifier => specifier.name.text), removedProperties)) {
193
+ removeImports(sourceFile, getMarkdownRendererImports, recorder);
194
+ }
195
+ };
196
+ const removeUnusedDomSanitizerImports = (sourceFile, removedProperties, recorder) => {
197
+ const domSanitizerImports = getImportSpecifiers(sourceFile, '@angular/platform-browser', 'DomSanitizer');
198
+ if (domSanitizerImports.length &&
199
+ !hasIdentifierReferenceOutsideNodes(sourceFile, domSanitizerImports.map(specifier => specifier.name.text), removedProperties)) {
200
+ removeImports(sourceFile, domSanitizerImports, recorder);
201
+ }
202
+ };
203
+ const hasIdentifierReferenceOutsideNodes = (sourceFile, names, excludedNodes) => {
204
+ let referenced = false;
205
+ const namesToFind = new Set(names);
206
+ const visit = (node) => {
207
+ if (excludedNodes.some(excludedNode => node === excludedNode) || referenced) {
208
+ return;
209
+ }
210
+ if (ts.isIdentifier(node) && namesToFind.has(node.text) && !ts.isImportSpecifier(node.parent)) {
211
+ referenced = true;
212
+ return;
213
+ }
214
+ ts.forEachChild(node, visit);
215
+ };
216
+ sourceFile.forEachChild(visit);
217
+ return referenced;
218
+ };
219
+ const removeImports = (sourceFile, specifiers, recorder) => {
220
+ const specifiersByImport = new Map();
221
+ for (const specifier of specifiers) {
222
+ const importDeclaration = specifier.parent.parent.parent;
223
+ if (!ts.isImportDeclaration(importDeclaration)) {
224
+ continue;
225
+ }
226
+ const matchingSpecifiers = specifiersByImport.get(importDeclaration) ?? [];
227
+ matchingSpecifiers.push(specifier);
228
+ specifiersByImport.set(importDeclaration, matchingSpecifiers);
229
+ }
230
+ const printer = ts.createPrinter();
231
+ for (const [importDeclaration, importedSpecifiers] of specifiersByImport) {
232
+ const edit = removeImportSpecifiers(sourceFile, importDeclaration, importedSpecifiers);
233
+ recorder.remove(edit.start, edit.width);
234
+ if (edit.newNode) {
235
+ recorder.insertLeft(edit.start, printer.printNode(ts.EmitHint.Unspecified, edit.newNode, sourceFile));
236
+ }
237
+ }
238
+ };
239
+ const hasOnlyWhitespaceContent = (element, template) => {
240
+ const openingTag = element.startSourceSpan.toString();
241
+ if (openingTag.trimEnd().endsWith('/>')) {
242
+ return true;
243
+ }
244
+ if (!element.endSourceSpan) {
245
+ return false;
246
+ }
247
+ return (template
248
+ .substring(element.startSourceSpan.end.offset, element.endSourceSpan.start.offset)
249
+ .trim().length === 0);
250
+ };
251
+ const removeAttributes = (element, attributes) => {
252
+ const elementStart = element.startSourceSpan.start.offset;
253
+ let openingTag = element.startSourceSpan.toString();
254
+ const ranges = attributes
255
+ .map(attribute => ({
256
+ start: attribute.sourceSpan.start.offset - elementStart,
257
+ end: attribute.sourceSpan.end.offset - elementStart
258
+ }))
259
+ .sort((first, second) => second.start - first.start);
260
+ for (const range of ranges) {
261
+ let start = range.start;
262
+ while (start > 0 && /\s/.test(openingTag[start - 1])) {
263
+ start--;
264
+ }
265
+ openingTag = openingTag.slice(0, start) + openingTag.slice(range.end);
266
+ }
267
+ return openingTag.replace(/\s*\/>\s*$/, '>');
268
+ };
269
+ const addMarkdownToComponentImports = (metadata, recorder) => {
270
+ const imports = metadata.properties.find(property => {
271
+ return (ts.isPropertyAssignment(property) &&
272
+ ts.isIdentifier(property.name) &&
273
+ property.name.text === 'imports' &&
274
+ ts.isArrayLiteralExpression(property.initializer));
275
+ });
276
+ if (imports &&
277
+ ts.isPropertyAssignment(imports) &&
278
+ ts.isArrayLiteralExpression(imports.initializer)) {
279
+ const importNames = imports.initializer.elements;
280
+ if (importNames.some(element => ts.isIdentifier(element) && element.text === 'SiMarkdownComponent')) {
281
+ return;
282
+ }
283
+ recorder.insertLeft(imports.initializer.end - 1, `${importNames.length ? ', ' : ''}SiMarkdownComponent`);
284
+ return;
285
+ }
286
+ const lastProperty = metadata.properties.at(-1);
287
+ recorder.insertLeft(lastProperty ? lastProperty.end : metadata.getStart() + 1, `${lastProperty ? ',' : ''}\n imports: [SiMarkdownComponent]`);
288
+ };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { dirname, join } from 'path/posix';
6
+ import ts from 'typescript';
7
+ import { discoverSourceFiles, findElement, getInlineTemplates, getTemplateUrl, insertAttribute } from '../utils/index.js';
8
+ const disableResizingAttributeNames = [
9
+ 'disableResizing',
10
+ '[disableResizing]',
11
+ 'bind-disableResizing'
12
+ ];
13
+ const listWidthUnitAttributeNames = ['listWidthUnit', '[listWidthUnit]', 'bind-listWidthUnit'];
14
+ export const listDetailsUnitsMigrationRule = (options) => {
15
+ return async (tree, context) => {
16
+ const processedTemplates = new Set();
17
+ for await (const discoveredSourceFile of discoverSourceFiles(tree, context, options.path)) {
18
+ const { path: filePath, sourceFile } = discoveredSourceFile;
19
+ const recorder = tree.beginUpdate(filePath);
20
+ for (const template of getInlineTemplates(sourceFile)) {
21
+ migrateListDetailsUnitsTemplate(sourceFile.text.substring(template.getStart() + 1, template.getEnd() - 1), template.getStart() + 1, recorder);
22
+ }
23
+ tree.commitUpdate(recorder);
24
+ for (const templateUrl of getTemplateUrl(sourceFile)) {
25
+ const templatePath = join(dirname(filePath), templateUrl);
26
+ if (processedTemplates.has(templatePath) || !tree.exists(templatePath)) {
27
+ continue;
28
+ }
29
+ processedTemplates.add(templatePath);
30
+ const templateRecorder = tree.beginUpdate(templatePath);
31
+ migrateListDetailsUnitsTemplate(tree.read(templatePath).toString('utf-8'), 0, templateRecorder);
32
+ tree.commitUpdate(templateRecorder);
33
+ }
34
+ }
35
+ return tree;
36
+ };
37
+ };
38
+ const migrateListDetailsUnitsTemplate = (template, offset, recorder) => {
39
+ findElement(template, element => element.name === 'si-list-details').forEach(element => {
40
+ migrateListDetailsElement(template, element, offset, recorder);
41
+ });
42
+ };
43
+ const migrateListDetailsElement = (template, element, offset, recorder) => {
44
+ const disableResizingAttribute = element.attrs.find(attr => disableResizingAttributeNames.includes(attr.name));
45
+ const isExplicitlyDisabled = disableResizingAttribute && getStaticBooleanValue(disableResizingAttribute) === true;
46
+ if (isExplicitlyDisabled) {
47
+ return;
48
+ }
49
+ const hasListWidthUnit = element.attrs.some(attr => listWidthUnitAttributeNames.includes(attr.name));
50
+ if (hasListWidthUnit) {
51
+ return;
52
+ }
53
+ insertAttribute(template, element, 'listWidthUnit="fr"', offset, recorder);
54
+ };
55
+ const getStaticBooleanValue = (attribute) => {
56
+ if (!attribute.name.startsWith('[')) {
57
+ if (/^\s*{{[\s\S]*}}\s*$/.test(attribute.value)) {
58
+ return undefined;
59
+ }
60
+ return attribute.value !== 'false';
61
+ }
62
+ const initializer = getExpression(attribute.value);
63
+ if (!initializer) {
64
+ return undefined;
65
+ }
66
+ if (initializer.kind === ts.SyntaxKind.TrueKeyword) {
67
+ return true;
68
+ }
69
+ if (initializer.kind === ts.SyntaxKind.FalseKeyword ||
70
+ initializer.kind === ts.SyntaxKind.NullKeyword ||
71
+ (ts.isIdentifier(initializer) && initializer.text === 'undefined') ||
72
+ (ts.isStringLiteral(initializer) && initializer.text === 'false')) {
73
+ return false;
74
+ }
75
+ if (ts.isStringLiteral(initializer) || ts.isNumericLiteral(initializer)) {
76
+ return true;
77
+ }
78
+ return undefined;
79
+ };
80
+ const getExpression = (value) => {
81
+ const statement = ts.createSourceFile('template-expression.ts', `const value = ${value};`, ts.ScriptTarget.Latest, true).statements[0];
82
+ if (!statement || !ts.isVariableStatement(statement)) {
83
+ return undefined;
84
+ }
85
+ return statement.declarationList.declarations[0]?.initializer;
86
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { dirname, join } from 'path/posix';
6
+ import ts from 'typescript';
7
+ import { discoverSourceFiles, findElement, getInlineTemplates, getTemplateUrl, insertAttribute } from '../utils/index.js';
8
+ const resizableAttributeNames = ['resizableParts', '[resizableParts]', 'bind-resizableParts'];
9
+ const mainUnitAttributeNames = [
10
+ 'mainContainerWidthUnit',
11
+ '[mainContainerWidthUnit]',
12
+ 'bind-mainContainerWidthUnit'
13
+ ];
14
+ export const mainDetailUnitsMigrationRule = (options) => {
15
+ return async (tree, context) => {
16
+ const processedTemplates = new Set();
17
+ for await (const discoveredSourceFile of discoverSourceFiles(tree, context, options.path)) {
18
+ const { path: filePath, sourceFile } = discoveredSourceFile;
19
+ const recorder = tree.beginUpdate(filePath);
20
+ for (const template of getInlineTemplates(sourceFile)) {
21
+ migrateMainDetailUnitsTemplate(sourceFile.text.substring(template.getStart() + 1, template.getEnd() - 1), template.getStart() + 1, recorder);
22
+ }
23
+ tree.commitUpdate(recorder);
24
+ for (const templateUrl of getTemplateUrl(sourceFile)) {
25
+ const templatePath = join(dirname(filePath), templateUrl);
26
+ if (processedTemplates.has(templatePath) || !tree.exists(templatePath)) {
27
+ continue;
28
+ }
29
+ processedTemplates.add(templatePath);
30
+ const templateRecorder = tree.beginUpdate(templatePath);
31
+ migrateMainDetailUnitsTemplate(tree.read(templatePath).toString('utf-8'), 0, templateRecorder);
32
+ tree.commitUpdate(templateRecorder);
33
+ }
34
+ }
35
+ return tree;
36
+ };
37
+ };
38
+ const migrateMainDetailUnitsTemplate = (template, offset, recorder) => {
39
+ findElement(template, element => element.name === 'si-main-detail-container').forEach(element => {
40
+ migrateMainDetailContainerElement(template, element, offset, recorder);
41
+ });
42
+ };
43
+ const migrateMainDetailContainerElement = (template, element, offset, recorder) => {
44
+ const resizableAttribute = element.attrs.find(attr => resizableAttributeNames.includes(attr.name));
45
+ if (!resizableAttribute) {
46
+ return;
47
+ }
48
+ const isExplicitlyDisabled = getStaticBooleanValue(resizableAttribute) === false;
49
+ if (isExplicitlyDisabled) {
50
+ return;
51
+ }
52
+ const hasMainUnit = element.attrs.some(attr => mainUnitAttributeNames.includes(attr.name));
53
+ if (hasMainUnit) {
54
+ return;
55
+ }
56
+ insertAttribute(template, element, 'mainContainerWidthUnit="fr"', offset, recorder);
57
+ };
58
+ const getStaticBooleanValue = (attribute) => {
59
+ if (!attribute.name.startsWith('[')) {
60
+ if (/^\s*{{[\s\S]*}}\s*$/.test(attribute.value)) {
61
+ return undefined;
62
+ }
63
+ return attribute.value !== 'false';
64
+ }
65
+ const initializer = getExpression(attribute.value);
66
+ if (!initializer) {
67
+ return undefined;
68
+ }
69
+ if (initializer.kind === ts.SyntaxKind.TrueKeyword) {
70
+ return true;
71
+ }
72
+ if (initializer.kind === ts.SyntaxKind.FalseKeyword ||
73
+ initializer.kind === ts.SyntaxKind.NullKeyword ||
74
+ (ts.isIdentifier(initializer) && initializer.text === 'undefined') ||
75
+ (ts.isStringLiteral(initializer) && initializer.text === 'false')) {
76
+ return false;
77
+ }
78
+ if (ts.isStringLiteral(initializer) || ts.isNumericLiteral(initializer)) {
79
+ return true;
80
+ }
81
+ return undefined;
82
+ };
83
+ const getExpression = (value) => {
84
+ const statement = ts.createSourceFile('template-expression.ts', `const value = ${value};`, ts.ScriptTarget.Latest, true).statements[0];
85
+ if (!statement || !ts.isVariableStatement(statement)) {
86
+ return undefined;
87
+ }
88
+ return statement.declarationList.declarations[0]?.initializer;
89
+ };
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ import { dirname, join } from 'path/posix';
6
+ import ts from 'typescript';
7
+ import { removeImportSpecifiers } from '../migrations/utilities/import-removal.js';
8
+ import { applyImport, discoverSourceFiles, findElement, getImportSpecifiers, getInlineTemplates, getTemplateUrl } from '../utils/index.js';
9
+ const LEGACY_COMPONENT = 'SiMarkdownRendererComponent';
10
+ const MARKDOWN_COMPONENT = 'SiMarkdownComponent';
11
+ const LEGACY_IMPORT = '@siemens/element-ng/markdown-renderer';
12
+ const MARKDOWN_IMPORT = '@siemens/element-ng/markdown';
13
+ export const markdownRendererMigrationRule = (options) => {
14
+ return async (tree, context) => {
15
+ const processedTemplates = new Set();
16
+ for await (const discoveredSourceFile of discoverSourceFiles(tree, context, options.path)) {
17
+ const { path: filePath, sourceFile } = discoveredSourceFile;
18
+ const legacyImports = getImportSpecifiers(sourceFile, LEGACY_IMPORT, LEGACY_COMPONENT);
19
+ if (!legacyImports.length) {
20
+ continue;
21
+ }
22
+ const recorder = tree.beginUpdate(filePath);
23
+ migrateInlineTemplates(sourceFile, recorder);
24
+ migrateExternalTemplates(tree, sourceFile, filePath, processedTemplates);
25
+ migrateComponentReferences(sourceFile, legacyImports, recorder);
26
+ removeLegacyImports(sourceFile, legacyImports, recorder);
27
+ const importChange = applyImport(sourceFile, MARKDOWN_COMPONENT, MARKDOWN_IMPORT);
28
+ if (importChange) {
29
+ recorder.insertLeft(importChange.start, importChange.replacement);
30
+ }
31
+ tree.commitUpdate(recorder);
32
+ }
33
+ return tree;
34
+ };
35
+ };
36
+ const migrateInlineTemplates = (sourceFile, recorder) => {
37
+ for (const template of getInlineTemplates(sourceFile)) {
38
+ migrateTemplate(sourceFile.text.substring(template.getStart() + 1, template.getEnd() - 1), template.getStart() + 1, recorder);
39
+ }
40
+ };
41
+ const migrateExternalTemplates = (tree, sourceFile, filePath, processedTemplates) => {
42
+ for (const templateUrl of getTemplateUrl(sourceFile)) {
43
+ const templatePath = join(dirname(filePath), templateUrl);
44
+ if (processedTemplates.has(templatePath)) {
45
+ continue;
46
+ }
47
+ const templateBuffer = tree.read(templatePath);
48
+ if (!templateBuffer) {
49
+ continue;
50
+ }
51
+ processedTemplates.add(templatePath);
52
+ const recorder = tree.beginUpdate(templatePath);
53
+ migrateTemplate(templateBuffer.toString('utf-8'), 0, recorder);
54
+ tree.commitUpdate(recorder);
55
+ }
56
+ };
57
+ const migrateTemplate = (template, offset, recorder) => {
58
+ findElement(template, element => element.name === 'si-markdown-renderer').forEach(element => {
59
+ recorder.remove(element.startSourceSpan.start.offset + offset + 1, 'si-markdown-renderer'.length);
60
+ recorder.insertLeft(element.startSourceSpan.start.offset + offset + 1, 'si-markdown');
61
+ if (element.endSourceSpan && element.startSourceSpan.start !== element.endSourceSpan.start) {
62
+ recorder.remove(element.endSourceSpan.start.offset + offset + 2, 'si-markdown-renderer'.length);
63
+ recorder.insertLeft(element.endSourceSpan.start.offset + offset + 2, 'si-markdown');
64
+ }
65
+ element.attrs
66
+ .filter(attribute => attribute.name === 'text' || attribute.name === '[text]')
67
+ .forEach(attribute => {
68
+ const replacement = attribute.name === 'text' ? 'markdown' : '[markdown]';
69
+ recorder.remove(attribute.sourceSpan.start.offset + offset, attribute.name.length);
70
+ recorder.insertLeft(attribute.sourceSpan.start.offset + offset, replacement);
71
+ });
72
+ });
73
+ };
74
+ const migrateComponentReferences = (sourceFile, legacyImports, recorder) => {
75
+ const legacyNames = new Set(legacyImports.map(importSpecifier => importSpecifier.name.text));
76
+ const visit = (node) => {
77
+ if (ts.isIdentifier(node) && legacyNames.has(node.text)) {
78
+ recorder.remove(node.getStart(sourceFile), node.getWidth(sourceFile));
79
+ recorder.insertLeft(node.getStart(sourceFile), MARKDOWN_COMPONENT);
80
+ return;
81
+ }
82
+ ts.forEachChild(node, visit);
83
+ };
84
+ sourceFile.statements
85
+ .filter(statement => !ts.isImportDeclaration(statement))
86
+ .forEach(statement => visit(statement));
87
+ };
88
+ const removeLegacyImports = (sourceFile, legacyImports, recorder) => {
89
+ const importsByDeclaration = new Map();
90
+ legacyImports.forEach(importSpecifier => {
91
+ const importDeclaration = importSpecifier.parent.parent.parent;
92
+ if (!ts.isImportDeclaration(importDeclaration)) {
93
+ return;
94
+ }
95
+ const specifiers = importsByDeclaration.get(importDeclaration) ?? [];
96
+ specifiers.push(importSpecifier);
97
+ importsByDeclaration.set(importDeclaration, specifiers);
98
+ });
99
+ importsByDeclaration.forEach((specifiers, importDeclaration) => {
100
+ const edit = removeImportSpecifiers(sourceFile, importDeclaration, specifiers);
101
+ recorder.remove(edit.start, edit.width);
102
+ if (edit.newNode) {
103
+ recorder.insertLeft(edit.start, ts.createPrinter().printNode(ts.EmitHint.Unspecified, edit.newNode, sourceFile));
104
+ }
105
+ });
106
+ };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) Siemens 2016 - 2026
3
+ * SPDX-License-Identifier: MIT
4
+ */
5
+ const SOURCE_EXTENSIONS = ['.css', '.html', '.less', '.sass', '.scss', '.ts'];
6
+ const SPACER_REPLACEMENTS = {
7
+ '10': '13',
8
+ '11': '14'
9
+ };
10
+ export const spacerMigrationRule = (options) => {
11
+ return (tree) => {
12
+ const normalizedProjectPath = `/${options.path.replace(/^\/+|\/+$/g, '')}`;
13
+ tree.visit(filePath => {
14
+ if (!isWithinProject(filePath, normalizedProjectPath) ||
15
+ filePath.includes('/node_modules/') ||
16
+ !SOURCE_EXTENSIONS.some(extension => filePath.endsWith(extension))) {
17
+ return;
18
+ }
19
+ const content = tree.readText(filePath);
20
+ const updatedContent = replaceSpacers(content);
21
+ if (updatedContent !== content) {
22
+ tree.overwrite(filePath, updatedContent);
23
+ }
24
+ });
25
+ return tree;
26
+ };
27
+ };
28
+ const isWithinProject = (filePath, projectPath) => projectPath === '/' || filePath === projectPath || filePath.startsWith(`${projectPath}/`);
29
+ const replaceSpacers = (content) => {
30
+ const withUpdatedHelpers = content.replace(/(?<![\w-])([mp](?:[tbsexy])?-(?:(?:sm|md|lg|xl|xxl)-)?n?)(10|11)\b/g, (_match, prefix, spacer) => `${prefix}${SPACER_REPLACEMENTS[spacer]}`);
31
+ return withUpdatedHelpers.replace(/((?:map\.(?:get|has-key)|map-get)\(\s*[^,)]*\$spacers(?:-(?:inline|block))?\s*,\s*)(10|11)(?=\s*\))/g, (_match, prefix, spacer) => `${prefix}${SPACER_REPLACEMENTS[spacer]}`);
32
+ };