@sdcorejs/angular 19.1.5 → 19.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/README.md +12 -4
  2. package/assets/scss/core/menu.scss +18 -0
  3. package/assets/scss/core/utilities/_misc.scss +15 -0
  4. package/assets/scss/sd-core.scss +1 -0
  5. package/components/anchor/src/components/anchor/anchor.component.d.ts +3 -1
  6. package/components/badge/src/badge.component.d.ts +1 -0
  7. package/components/ckeditor-styles/src/ckeditor-styles.component.d.ts +1 -1
  8. package/components/form-generic/src/components/form-builder/components/expression-builder/expression-builder.component.d.ts +2 -1
  9. package/components/form-generic/src/components/form-builder/form-builder.component.d.ts +3 -1
  10. package/components/form-generic/src/components/form-render/components/item/components/checkbox/checkbox.component.d.ts +34 -0
  11. package/components/form-generic/src/components/form-render/components/item/components/index.d.ts +1 -0
  12. package/components/form-generic/src/components/form-render/components/item/components/table/table.component.d.ts +6 -1
  13. package/components/form-generic/src/components/sd-feel-expression/sd-feel-expression.component.d.ts +1 -1
  14. package/components/form-generic/src/configurations/form.configuration.d.ts +1 -1
  15. package/components/form-generic/src/models/form-generic-component.model.d.ts +8 -8
  16. package/components/form-generic/src/models/form-generic-definition-selection.model.d.ts +5 -5
  17. package/components/form-generic/src/models/form-generic-expression.model.d.ts +12 -12
  18. package/components/form-generic/src/models/index.d.ts +1 -0
  19. package/components/form-generic/src/services/form-generic.service.d.ts +2 -2
  20. package/components/import-excel/src/import-excel.component.d.ts +1 -0
  21. package/components/index.d.ts +6 -1
  22. package/components/mini-editor/src/mini-editor.model.d.ts +1 -1
  23. package/components/modal/src/modal.component.d.ts +3 -2
  24. package/components/modal-resizable/src/modal-resizable.component.d.ts +92 -0
  25. package/components/modal-resizable/src/modal-resizable.registry.d.ts +22 -0
  26. package/components/org-chart/src/org-chart.component.d.ts +6 -0
  27. package/components/preview/src/preview-image/preview-image.component.d.ts +1 -0
  28. package/components/preview/src/preview-pdf/pdf-worker-inline.generated.d.ts +7 -0
  29. package/components/query-bar/src/components/actions-bar/actions-bar.component.d.ts +6 -2
  30. package/components/query-bar/src/components/build-chip/build-chip.component.d.ts +4 -1
  31. package/components/query-bar/src/components/chip-popover/chip-popover.component.d.ts +8 -0
  32. package/components/query-bar/src/components/field-picker/field-picker.component.d.ts +2 -0
  33. package/components/query-bar/src/components/inline-chip/inline-chip.component.d.ts +2 -0
  34. package/components/query-bar/src/components/inline-value-chip/inline-value-chip.component.d.ts +3 -3
  35. package/components/query-bar/src/components/saved-filters-menu/saved-filters-menu.component.d.ts +9 -4
  36. package/components/query-bar/src/query-bar.component.d.ts +32 -5
  37. package/components/query-bar/src/query-bar.model.d.ts +15 -12
  38. package/components/query-builder/src/query-builder.component.d.ts +76 -39
  39. package/components/query-builder/src/query-builder.model.d.ts +59 -52
  40. package/components/query-builder/src/query-builder.serializer.d.ts +15 -6
  41. package/components/section/src/section.component.d.ts +3 -0
  42. package/components/side-drawer/src/body-scroll-lock.service.d.ts +10 -0
  43. package/components/splitter/src/splitter-handle/splitter-handle.component.d.ts +1 -0
  44. package/components/tab-router/index.d.ts +2 -1
  45. package/components/tab-router/src/actions/tab-router.action.d.ts +2 -2
  46. package/components/tab-router/src/components/tab-router-item/tab-router-item.component.d.ts +2 -2
  47. package/components/tab-router/src/components/tab-router-nav/tab-router-nav.component.d.ts +3 -3
  48. package/components/tab-router/src/components/tab-router-outlet/tab-router-outlet.component.d.ts +3 -3
  49. package/components/tab-router/src/decorators/tab.decorator.d.ts +13 -1
  50. package/components/tab-router/src/events/tab-router.event.d.ts +3 -3
  51. package/components/tab-router/src/models/tab-router.model.d.ts +2 -2
  52. package/components/tab-router/src/pipes/tab-info.pipe.d.ts +2 -2
  53. package/components/tab-router/src/services/tab-router.service.d.ts +9 -9
  54. package/components/table/index.d.ts +1 -0
  55. package/components/table/src/components/config/config.component.d.ts +6 -1
  56. package/components/table/src/components/desktop-cell/view/view.component.d.ts +1 -0
  57. package/components/table/src/components/filter/external-filter/external-filter.component.d.ts +1 -1
  58. package/components/table/src/components/filter/mobile-filter/mobile-filter.component.d.ts +1 -1
  59. package/components/table/src/components/selector-action/action-filter.pipe.d.ts +8 -1
  60. package/components/table/src/components/selector-action/selector-action.component.d.ts +2 -0
  61. package/components/table/src/directives/index.d.ts +1 -0
  62. package/components/table/src/directives/sd-table-command-header-def.directive.d.ts +24 -0
  63. package/components/table/src/models/table-column.model.d.ts +30 -13
  64. package/components/table/src/models/table-item.model.d.ts +30 -1
  65. package/components/table/src/models/table-option-selector.model.d.ts +5 -4
  66. package/components/table/src/models/table-option.model.d.ts +12 -0
  67. package/components/table/src/pipes/sd-group.pipe.d.ts +6 -2
  68. package/components/table/src/services/table-export/table-export.service.d.ts +3 -1
  69. package/components/table/src/services/table-filter/table-filter.model.d.ts +15 -15
  70. package/components/table/src/services/table-filter/table-filter.service.d.ts +2 -2
  71. package/components/table/src/services/table-format/table-format.service.d.ts +1 -1
  72. package/components/table/src/services/table-selection/selection-action.util.d.ts +24 -0
  73. package/components/table/src/services/table-selection/table-selection.util.d.ts +31 -0
  74. package/components/table/src/services/tree/tree.util.d.ts +3 -2
  75. package/components/table/src/table.component.d.ts +52 -6
  76. package/components/tree/src/tree-item-def.directive.d.ts +1 -1
  77. package/components/tree/src/tree.component.d.ts +16 -4
  78. package/components/tree/src/tree.model.d.ts +31 -25
  79. package/components/upload-file/src/configurations/upload-file.configuration.d.ts +2 -2
  80. package/components/upload-file/src/upload-file.component.d.ts +4 -1
  81. package/configurations/src/sd-core.configuration.d.ts +1 -2
  82. package/fesm2022/sdcorejs-angular-components-anchor.mjs +36 -12
  83. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +2 -2
  85. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-components-badge.mjs +15 -2
  87. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  89. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs +1 -1
  91. package/fesm2022/sdcorejs-angular-components-ckeditor-styles.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-components-code-editor.mjs +3 -3
  93. package/fesm2022/sdcorejs-angular-components-code-editor.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-components-data-state.mjs +3 -3
  95. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-components-editor.mjs +2 -2
  97. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +324 -192
  99. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  100. package/fesm2022/sdcorejs-angular-components-history.mjs +4 -4
  101. package/fesm2022/sdcorejs-angular-components-history.mjs.map +1 -1
  102. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +13 -5
  103. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  104. package/fesm2022/sdcorejs-angular-components-inform.mjs +3 -3
  105. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +164 -8
  107. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-components-modal.mjs +30 -18
  109. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +60 -13
  111. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  112. package/fesm2022/sdcorejs-angular-components-preview.mjs +58 -19
  113. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  114. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +192 -30
  115. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  116. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +187 -127
  117. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  118. package/fesm2022/sdcorejs-angular-components-section.mjs +16 -2
  119. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  120. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +83 -24
  121. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  122. package/fesm2022/sdcorejs-angular-components-splitter.mjs +57 -21
  123. package/fesm2022/sdcorejs-angular-components-splitter.mjs.map +1 -1
  124. package/fesm2022/sdcorejs-angular-components-stepper.mjs +2 -2
  125. package/fesm2022/sdcorejs-angular-components-stepper.mjs.map +1 -1
  126. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +68 -20
  127. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  128. package/fesm2022/sdcorejs-angular-components-tab.mjs +3 -2
  129. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  130. package/fesm2022/sdcorejs-angular-components-table.mjs +556 -254
  131. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  132. package/fesm2022/sdcorejs-angular-components-tree.mjs +80 -17
  133. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  134. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +48 -13
  135. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  136. package/fesm2022/sdcorejs-angular-components.mjs +6 -1
  137. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  138. package/fesm2022/sdcorejs-angular-configurations.mjs.map +1 -1
  139. package/fesm2022/sdcorejs-angular-directives.mjs +45 -8
  140. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  141. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +40 -29
  142. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  143. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +5 -5
  144. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  145. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +67 -50
  146. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  147. package/fesm2022/sdcorejs-angular-forms-chip.mjs +57 -43
  148. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  149. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +233 -63
  150. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  151. package/fesm2022/sdcorejs-angular-forms-date.mjs +208 -41
  152. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  153. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +130 -26
  154. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  155. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +39 -15
  156. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -1
  157. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +16 -5
  158. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  159. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +24 -9
  160. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  161. package/fesm2022/sdcorejs-angular-forms-input.mjs +58 -10
  162. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  163. package/fesm2022/sdcorejs-angular-forms-models.mjs +279 -6
  164. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  165. package/fesm2022/sdcorejs-angular-forms-radio.mjs +4 -4
  166. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  167. package/fesm2022/sdcorejs-angular-forms-select.mjs +135 -37
  168. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  169. package/fesm2022/sdcorejs-angular-forms-switch.mjs +18 -3
  170. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  171. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +51 -62
  172. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  173. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +57 -12
  174. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -1
  175. package/fesm2022/sdcorejs-angular-forms-time.mjs +16 -5
  176. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -1
  177. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +100 -9
  178. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -1
  179. package/fesm2022/sdcorejs-angular-forms.mjs +91 -46
  180. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  181. package/fesm2022/sdcorejs-angular-handlers.mjs +18 -3
  182. package/fesm2022/sdcorejs-angular-handlers.mjs.map +1 -1
  183. package/fesm2022/sdcorejs-angular-i18n.mjs +510 -68
  184. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  185. package/fesm2022/sdcorejs-angular-interceptors.mjs +87 -29
  186. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  187. package/fesm2022/sdcorejs-angular-modules-auth.mjs +25 -15
  188. package/fesm2022/sdcorejs-angular-modules-auth.mjs.map +1 -1
  189. package/fesm2022/sdcorejs-angular-modules-icon.mjs +2 -2
  190. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  191. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs +32 -3
  192. package/fesm2022/sdcorejs-angular-modules-keycloak.mjs.map +1 -1
  193. package/fesm2022/sdcorejs-angular-modules-layout.mjs +441 -135
  194. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  195. package/fesm2022/sdcorejs-angular-modules-permission.mjs +177 -40
  196. package/fesm2022/sdcorejs-angular-modules-permission.mjs.map +1 -1
  197. package/fesm2022/sdcorejs-angular-pipes.mjs +62 -28
  198. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  199. package/fesm2022/sdcorejs-angular-services-api.mjs +123 -13
  200. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  201. package/fesm2022/sdcorejs-angular-services-cache.mjs +53 -3
  202. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  203. package/fesm2022/sdcorejs-angular-services-confirm.mjs +25 -73
  204. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  205. package/fesm2022/sdcorejs-angular-services-excel.mjs +12 -10
  206. package/fesm2022/sdcorejs-angular-services-excel.mjs.map +1 -1
  207. package/fesm2022/sdcorejs-angular-services-loading.mjs +75 -84
  208. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  209. package/fesm2022/sdcorejs-angular-services-notify.mjs +46 -5
  210. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  211. package/fesm2022/sdcorejs-angular-services-storage.mjs +4 -0
  212. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  213. package/fesm2022/sdcorejs-angular-services.mjs +0 -1
  214. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  215. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs +225 -80
  216. package/fesm2022/sdcorejs-angular-utilities-extensions.mjs.map +1 -1
  217. package/fesm2022/sdcorejs-angular-utilities-models.mjs +1 -63
  218. package/fesm2022/sdcorejs-angular-utilities-models.mjs.map +1 -1
  219. package/fesm2022/sdcorejs-angular.mjs +17 -10
  220. package/fesm2022/sdcorejs-angular.mjs.map +1 -1
  221. package/forms/autocomplete/src/autocomplete.component.d.ts +5 -2
  222. package/forms/chip-calendar/src/chip-calendar.component.d.ts +10 -0
  223. package/forms/date/src/date-input.util.d.ts +18 -0
  224. package/forms/date/src/date.component.d.ts +21 -3
  225. package/forms/date-range/src/date-range.component.d.ts +13 -2
  226. package/forms/datetime/src/datetime.component.d.ts +13 -2
  227. package/forms/entity-picker/src/entity-picker.component.d.ts +9 -3
  228. package/forms/input/src/input.component.d.ts +3 -0
  229. package/forms/input-color/src/input-color.component.d.ts +4 -0
  230. package/forms/input-number/src/input-number.component.d.ts +3 -0
  231. package/forms/models/index.d.ts +4 -0
  232. package/forms/models/src/sd-form-control-connector.d.ts +12 -0
  233. package/forms/models/src/sd-model-facing-control.d.ts +43 -0
  234. package/forms/models/src/sd-search.model.d.ts +1 -1
  235. package/forms/models/src/sd-selection-data.model.d.ts +1 -1
  236. package/forms/models/src/sd-strict-date-adapter.d.ts +26 -0
  237. package/forms/models/src/sd-temporal-transform.d.ts +31 -0
  238. package/forms/models/src/sd-timer-scope.d.ts +29 -0
  239. package/forms/select/src/select.component.d.ts +27 -4
  240. package/forms/src/forms.module.d.ts +22 -13
  241. package/forms/switch/src/switch.component.d.ts +5 -0
  242. package/forms/textarea/src/textarea.component.d.ts +5 -3
  243. package/forms/time-range/src/time-range.component.d.ts +22 -1
  244. package/forms/tree-select/src/tree-select.component.d.ts +36 -5
  245. package/i18n/src/en.d.ts +94 -10
  246. package/i18n/src/i18n.messages.d.ts +1 -1
  247. package/i18n/src/i18n.pipe.d.ts +3 -3
  248. package/i18n/src/i18n.service.d.ts +2 -1
  249. package/i18n/src/i18n.types.d.ts +0 -3
  250. package/interceptors/no-internet/no-internet.interceptor.d.ts +11 -1
  251. package/modules/auth/services/auth.model.d.ts +1 -1
  252. package/modules/keycloak/keycloak.service.d.ts +1 -0
  253. package/modules/layout/components/shared/menu-tree/menu-tree.component.d.ts +2 -0
  254. package/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.d.ts +3 -3
  255. package/modules/layout/components/sidebar-mobile-v1/main.component.d.ts +3 -3
  256. package/modules/layout/components/sidebar-mobile-v2/main.component.d.ts +3 -3
  257. package/modules/layout/components/sidebar-mobile-v3/main.component.d.ts +3 -3
  258. package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +8 -3
  259. package/modules/layout/components/sidebar-v1/main.component.d.ts +3 -3
  260. package/modules/layout/components/sidebar-v2/main.component.d.ts +3 -3
  261. package/modules/layout/components/sidebar-v3/main.component.d.ts +3 -3
  262. package/modules/layout/index.d.ts +1 -0
  263. package/modules/layout/modules/forbidden/pages/root/root.component.d.ts +5 -0
  264. package/modules/layout/modules/not-found/pages/root/root.component.d.ts +5 -0
  265. package/modules/layout/services/layout.service.d.ts +21 -0
  266. package/modules/layout/services/storage/storage.service.d.ts +52 -7
  267. package/modules/layout/utils/index.d.ts +1 -0
  268. package/modules/layout/utils/tab-name.util.d.ts +8 -0
  269. package/modules/permission/src/configurations/permission.configuration.d.ts +11 -0
  270. package/modules/permission/src/directives/permission.directive.d.ts +2 -1
  271. package/modules/permission/src/services/permission.service.d.ts +52 -1
  272. package/package.json +48 -33
  273. package/pipes/src/safe-html.pipe.d.ts +26 -4
  274. package/pipes/src/time-different.pipe.d.ts +1 -0
  275. package/public-api.d.ts +11 -10
  276. package/services/api/src/api-host.d.ts +15 -0
  277. package/services/api/src/api.model.d.ts +14 -0
  278. package/services/api/src/api.module.d.ts +6 -0
  279. package/services/cache/src/cache.model.d.ts +10 -0
  280. package/services/index.d.ts +0 -1
  281. package/services/notify/index.d.ts +1 -1
  282. package/utilities/extensions/index.d.ts +1 -5
  283. package/utilities/extensions/src/url-safety.d.ts +72 -0
  284. package/utilities/extensions/src/utility.extension.d.ts +9 -5
  285. package/utilities/models/index.d.ts +0 -10
  286. package/components/base/index.d.ts +0 -1
  287. package/components/base/src/base-secure.component.d.ts +0 -8
  288. package/components/document-builder/index.d.ts +0 -4
  289. package/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.d.ts +0 -15
  290. package/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.d.ts +0 -4
  291. package/components/document-builder/src/components/index.d.ts +0 -1
  292. package/components/document-builder/src/document-builder.component.d.ts +0 -53
  293. package/components/document-builder/src/document-builder.config.d.ts +0 -21
  294. package/components/document-builder/src/document-builder.model.d.ts +0 -41
  295. package/components/document-builder/src/document-builder.utils.d.ts +0 -10
  296. package/components/document-builder/src/plugins/block-space/block-space.plugin.d.ts +0 -9
  297. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.d.ts +0 -44
  298. package/components/document-builder/src/plugins/ck-comment/ck-comment.plugin.model.d.ts +0 -57
  299. package/components/document-builder/src/plugins/heading/heading.plugin.d.ts +0 -5
  300. package/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.d.ts +0 -4
  301. package/components/document-builder/src/plugins/image-custom/image-custom.plugin.d.ts +0 -31
  302. package/components/document-builder/src/plugins/image-upload/image-upload.plugin.d.ts +0 -5
  303. package/components/document-builder/src/plugins/index.d.ts +0 -11
  304. package/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.d.ts +0 -24
  305. package/components/document-builder/src/plugins/paste-handler/filters/bookmark.d.ts +0 -14
  306. package/components/document-builder/src/plugins/paste-handler/filters/br.d.ts +0 -15
  307. package/components/document-builder/src/plugins/paste-handler/filters/image.d.ts +0 -25
  308. package/components/document-builder/src/plugins/paste-handler/filters/list.d.ts +0 -29
  309. package/components/document-builder/src/plugins/paste-handler/filters/parse.d.ts +0 -35
  310. package/components/document-builder/src/plugins/paste-handler/filters/removeboldwrapper.d.ts +0 -15
  311. package/components/document-builder/src/plugins/paste-handler/filters/removegooglesheetstag.d.ts +0 -15
  312. package/components/document-builder/src/plugins/paste-handler/filters/removeinvalidtablewidth.d.ts +0 -15
  313. package/components/document-builder/src/plugins/paste-handler/filters/removemsattributes.d.ts +0 -15
  314. package/components/document-builder/src/plugins/paste-handler/filters/removestyleblock.d.ts +0 -15
  315. package/components/document-builder/src/plugins/paste-handler/filters/removexmlns.d.ts +0 -15
  316. package/components/document-builder/src/plugins/paste-handler/filters/replacemsfootnotes.d.ts +0 -54
  317. package/components/document-builder/src/plugins/paste-handler/filters/space.d.ts +0 -27
  318. package/components/document-builder/src/plugins/paste-handler/filters/table.d.ts +0 -16
  319. package/components/document-builder/src/plugins/paste-handler/filters/utils.d.ts +0 -25
  320. package/components/document-builder/src/plugins/paste-handler/index.d.ts +0 -35
  321. package/components/document-builder/src/plugins/paste-handler/normalizers/googledocsnormalizer.d.ts +0 -31
  322. package/components/document-builder/src/plugins/paste-handler/normalizers/googlesheetsnormalizer.d.ts +0 -31
  323. package/components/document-builder/src/plugins/paste-handler/normalizers/mswordnormalizer.d.ts +0 -29
  324. package/components/document-builder/src/plugins/paste-handler/types.d.ts +0 -30
  325. package/components/document-builder/src/plugins/table-custom/index.d.ts +0 -34
  326. package/components/document-builder/src/plugins/variable/variable.plugin.d.ts +0 -51
  327. package/components/table/src/pipes/selection-visible-select-all.pipe.d.ts +0 -9
  328. package/fesm2022/sdcorejs-angular-components-base.mjs +0 -23
  329. package/fesm2022/sdcorejs-angular-components-base.mjs.map +0 -1
  330. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +0 -5038
  331. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +0 -1
  332. package/fesm2022/sdcorejs-angular-models.mjs +0 -6
  333. package/fesm2022/sdcorejs-angular-models.mjs.map +0 -1
  334. package/fesm2022/sdcorejs-angular-services-docx.mjs +0 -291
  335. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +0 -1
  336. package/fesm2022/sdcorejs-angular-services-license.mjs +0 -97
  337. package/fesm2022/sdcorejs-angular-services-license.mjs.map +0 -1
  338. package/models/index.d.ts +0 -1
  339. package/models/src/language.model.d.ts +0 -2
  340. package/services/docx/index.d.ts +0 -1
  341. package/services/docx/src/lib/docx.model.d.ts +0 -9
  342. package/services/docx/src/lib/docx.service.d.ts +0 -14
  343. package/services/docx/src/lib/pandoc-core.d.ts +0 -11
  344. package/services/docx/src/public-api.d.ts +0 -2
  345. package/services/license/index.d.ts +0 -1
  346. package/services/license/src/license.service.d.ts +0 -9
  347. package/utilities/extensions/src/array.extension.d.ts +0 -1
  348. package/utilities/extensions/src/color.extension.d.ts +0 -5
  349. package/utilities/extensions/src/date.extension.d.ts +0 -1
  350. package/utilities/extensions/src/number.extension.d.ts +0 -1
  351. package/utilities/extensions/src/string.extension.d.ts +0 -50
  352. package/utilities/models/src/color.model.d.ts +0 -4
  353. package/utilities/models/src/empty.model.d.ts +0 -4
  354. package/utilities/models/src/filter.model.d.ts +0 -12
  355. package/utilities/models/src/maybe-async.model.d.ts +0 -10
  356. package/utilities/models/src/nested-key-of.model.d.ts +0 -4
  357. package/utilities/models/src/operator.model.d.ts +0 -13
  358. package/utilities/models/src/order.model.d.ts +0 -4
  359. package/utilities/models/src/paging.model.d.ts +0 -8
  360. package/utilities/models/src/pattern.model.d.ts +0 -21
  361. package/utilities/models/src/size.model.d.ts +0 -4
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-pipes.mjs","sources":["../../../projects/sdcorejs-angular/pipes/src/format-date.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/format-datetime.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/format-number.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/safe-html.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/time-different.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/empty.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/view.pipe.ts","../../../projects/sdcorejs-angular/pipes/sdcorejs-angular-pipes.ts"],"sourcesContent":["import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\n\n@Pipe({\n name: 'sdFormatDate',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdFormatDatePipe implements PipeTransform {\n transform(value: unknown, format = 'dd/MM/yyyy'): string | null {\n return DateUtilities.toFormat(value, format) || null;\n }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\n\n@Pipe({\n name: 'sdFormatDatetime',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdFormatDatetimePipe implements PipeTransform {\n transform(value: unknown, format = 'dd/MM/yyyy HH:mm:ss'): string | null {\n return DateUtilities.toFormat(value, format) || null;\n }\n}\n","import { inject, Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { ISdCoreConfiguration, SD_CORE_CONFIGURATION } from '@sdcorejs/angular/configurations';\nimport { NumberUtilities } from '@sdcorejs/angular/utilities/extensions';\n@Pipe({\n name: 'sdFormatNumber',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdFormatNumberPipe implements PipeTransform {\n private readonly coreConfiguration: ISdCoreConfiguration | null = inject(SD_CORE_CONFIGURATION, { optional: true });\n\n transform(value: any, digits?: number, format?: '1,234,567.89' | '1.234.567,89') {\n const resolvedFormat = format ?? this.coreConfiguration?.format?.number;\n const fixedValue = NumberUtilities.isNumber(value) ? (+value).toFixed(digits ?? 2) : null;\n if (resolvedFormat === '1.234.567,89') {\n return NumberUtilities.toVN(fixedValue);\n }\n return NumberUtilities.toISO(fixedValue);\n }\n}\n","import { Injectable, Pipe, PipeTransform, inject } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'sdSafeHtml',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdSafeHtmlPipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n transform(html: string | number | undefined | null) {\n if (typeof html === 'number') {\n return html;\n }\n if (!html) {\n return undefined;\n }\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\nimport { interval, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\n@Pipe({\n name: 'sdTimeDifferent',\n standalone: true,\n})\nexport class SdTimeDifferentPipe implements PipeTransform {\n private maxSecond = 60;\n private maxMinute = this.maxSecond * 60;\n private maxHour = this.maxMinute * 24;\n private maxDay = this.maxHour * 30;\n private maxMonth = this.maxHour * 365;\n transform(value: any, format: string, different: 'second' | 'minute' | 'hour' | 'day' | 'month'): Observable<string> {\n if (!DateUtilities.isDate(value)) {\n return of('');\n }\n if (!different) {\n return of(DateUtilities.toFormat(value, format));\n }\n if (Math.round((new Date().getTime() - new Date(value).getTime()) / 1000) < 0) {\n return of(DateUtilities.toFormat(value, format));\n }\n return interval(1000).pipe(\n map(() => {\n const timeDifferent = Math.round((new Date().getTime() - new Date(value).getTime()) / 1000);\n if (different === 'month' && timeDifferent < this.maxMonth) {\n return DateUtilities.timeDifference(value);\n }\n if (different === 'day' && timeDifferent < this.maxDay) {\n return DateUtilities.timeDifference(value);\n }\n if (different === 'hour' && timeDifferent < this.maxHour) {\n return DateUtilities.timeDifference(value);\n }\n if (different === 'minute' && timeDifferent < this.maxMinute) {\n return DateUtilities.timeDifference(value);\n }\n if (different === 'second' && timeDifferent < this.maxSecond) {\n return DateUtilities.timeDifference(value);\n }\n return DateUtilities.toFormat(value, format);\n })\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\n@Pipe({\n name: 'sdEmpty',\n standalone: true,\n})\nexport class SdEmptyPipe implements PipeTransform {\n transform(value: any): string {\n if (value === undefined || value === null || value === '') {\n return EMPTY_STR;\n }\n return value;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\n\n@Pipe({\n name: 'sdView',\n standalone: true,\n})\nexport class SdViewPipe implements PipeTransform {\n transform(value: unknown): string {\n if (value === null || value === undefined || value === '' || (typeof value === 'number' && Number.isNaN(value))) {\n return EMPTY_STR;\n }\n\n if (Array.isArray(value)) {\n if (!value.length) return EMPTY_STR;\n return value.map(item => this.transform(item)).join(', ');\n }\n\n return `${value}`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-pipes.mjs","sources":["../../../projects/sdcorejs-angular/pipes/src/format-date.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/format-datetime.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/format-number.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/safe-html.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/time-different.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/empty.pipe.ts","../../../projects/sdcorejs-angular/pipes/src/view.pipe.ts","../../../projects/sdcorejs-angular/pipes/sdcorejs-angular-pipes.ts"],"sourcesContent":["import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n name: 'sdFormatDate',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdFormatDatePipe implements PipeTransform {\n transform(value: unknown, format = 'dd/MM/yyyy'): string | null {\n return DateUtilities.toFormat(value, format) || null;\n }\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n name: 'sdFormatDatetime',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdFormatDatetimePipe implements PipeTransform {\n transform(value: unknown, format = 'dd/MM/yyyy HH:mm:ss'): string | null {\n return DateUtilities.toFormat(value, format) || null;\n }\n}\n","import { inject, Injectable, Pipe, PipeTransform } from '@angular/core';\nimport { ISdCoreConfiguration, SD_CORE_CONFIGURATION } from '@sdcorejs/angular/configurations';\nimport { NumberUtilities } from '@sdcorejs/utils/fns';\n@Pipe({\n name: 'sdFormatNumber',\n standalone: true,\n})\n@Injectable({\n providedIn: 'root',\n})\nexport class SdFormatNumberPipe implements PipeTransform {\n private readonly coreConfiguration: ISdCoreConfiguration | null = inject(SD_CORE_CONFIGURATION, { optional: true });\n\n transform(value: any, digits?: number, format?: '1,234,567.89' | '1.234.567,89') {\n const resolvedFormat = format ?? this.coreConfiguration?.format?.number;\n const fixedValue = NumberUtilities.isNumber(value) ? (+value).toFixed(digits ?? 2) : null;\n if (resolvedFormat === '1.234.567,89') {\n return NumberUtilities.toVN(fixedValue);\n }\n return NumberUtilities.toISO(fixedValue);\n }\n}\n","import { Injectable, Pipe, PipeTransform, SecurityContext, inject } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * Render an HTML string through `[innerHTML]`.\n *\n * why: this pipe used to call `bypassSecurityTrustHtml()` unconditionally, on every value, with no\n * sanitize step. That turned every call site into a stored-XSS sink — and the library itself pipes\n * server-supplied table cell data through it\n * (`components/table/src/components/desktop-cell/view/view.component.html`), while\n * `components/table/sd-table.md` already described the value as \"sanitized via sdSafeHtml\".\n *\n * Now it **sanitizes by default** and the bypass is an explicit, per-call-site opt-in:\n *\n * ```html\n * <!-- untrusted / server-supplied: script, on* handlers and javascript: urls are stripped -->\n * <div [innerHTML]=\"row.note | sdSafeHtml\"></div>\n *\n * <!-- app-authored markup you control, e.g. an inline SVG sprite -->\n * <span [innerHTML]=\"iconSvg | sdSafeHtml: true\"></span>\n * ```\n *\n * This mirrors the decision already taken for the toast in `services/notify`: text-safe by default,\n * opt-in HTML. Auto-detecting \"this looks like HTML\" is deliberately NOT done — it would escalate\n * untrusted text that merely contains `<` straight back into the unsanitized sink.\n */\n@Pipe({\n name: 'sdSafeHtml',\n standalone: true,\n})\n// why: kept `providedIn: 'root'` — consumer có thể `inject(SdSafeHtmlPipe)` để dùng ngoài template.\n// Bỏ nó đi là một breaking change về DI (NullInjectorError) không liên quan gì tới việc siết XSS.\n@Injectable({\n providedIn: 'root',\n})\nexport class SdSafeHtmlPipe implements PipeTransform {\n readonly #sanitizer = inject(DomSanitizer);\n\n transform(html: string | number | undefined | null, trusted = false): SafeHtml | string | number | undefined {\n if (typeof html === 'number') {\n return html;\n }\n if (!html) {\n return undefined;\n }\n if (trusted) {\n // Caller has explicitly declared this markup as app-authored.\n return this.#sanitizer.bypassSecurityTrustHtml(html);\n }\n // `sanitize` returns `null` when the value is entirely stripped; normalise to `''` so the\n // binding clears the element instead of rendering the string \"null\".\n return this.#sanitizer.sanitize(SecurityContext.HTML, html) ?? '';\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { interval, Observable, of } from 'rxjs';\nimport { map, takeWhile } from 'rxjs/operators';\n@Pipe({\n name: 'sdTimeDifferent',\n standalone: true,\n})\nexport class SdTimeDifferentPipe implements PipeTransform {\n private maxSecond = 60;\n private maxMinute = this.maxSecond * 60;\n private maxHour = this.maxMinute * 24;\n private maxDay = this.maxHour * 30;\n private maxMonth = this.maxHour * 365;\n transform(value: any, format: string, different: 'second' | 'minute' | 'hour' | 'day' | 'month'): Observable<string> {\n if (!DateUtilities.isDate(value)) {\n return of('');\n }\n if (!different) {\n return of(DateUtilities.toFormat(value, format));\n }\n const elapsedSeconds = () => Math.round((new Date().getTime() - new Date(value).getTime()) / 1000);\n if (elapsedSeconds() < 0) {\n return of(DateUtilities.toFormat(value, format));\n }\n const threshold = this.#threshold(different);\n // why: quá ngưỡng thì output là một chuỗi ngày tĩnh, tick mỗi giây không đổi được gì nữa.\n // Trả `of()` để không tạo timer nào cho các giá trị đã cũ (list N dòng = N timer thừa).\n if (elapsedSeconds() >= threshold) {\n return of(DateUtilities.toFormat(value, format));\n }\n // why: `interval(1000)` cũ KHÔNG BAO GIỜ complete — mỗi usage giữ một timer + một lượt\n // change-detection của async pipe mỗi giây, vĩnh viễn, kể cả khi giá trị đã vượt ngưỡng\n // tương đối. `takeWhile(..., true)` phát nốt lần cuối (dạng ngày tuyệt đối) rồi complete.\n return interval(1000).pipe(\n map(() => elapsedSeconds()),\n takeWhile(elapsed => elapsed < threshold, true),\n map(elapsed => (elapsed < threshold ? DateUtilities.timeDifference(value) : DateUtilities.toFormat(value, format)))\n );\n }\n\n #threshold(different: 'second' | 'minute' | 'hour' | 'day' | 'month'): number {\n switch (different) {\n case 'month':\n return this.maxMonth;\n case 'day':\n return this.maxDay;\n case 'hour':\n return this.maxHour;\n case 'minute':\n return this.maxMinute;\n default:\n return this.maxSecond;\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\n@Pipe({\n name: 'sdEmpty',\n standalone: true,\n})\nexport class SdEmptyPipe implements PipeTransform {\n transform(value: any): string {\n if (value === undefined || value === null || value === '') {\n return EMPTY_STR;\n }\n return value;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\n\n@Pipe({\n name: 'sdView',\n standalone: true,\n})\nexport class SdViewPipe implements PipeTransform {\n transform(value: unknown): string {\n if (value === null || value === undefined || value === '' || (typeof value === 'number' && Number.isNaN(value))) {\n return EMPTY_STR;\n }\n\n if (Array.isArray(value)) {\n if (!value.length) return EMPTY_STR;\n return value.map(item => this.transform(item)).join(', ');\n }\n\n return `${value}`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,58 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, DestroyRef, Injectable, NgModule } from '@angular/core';
3
- import { HttpClient, HttpRequest, HttpResponse, HttpErrorResponse, HttpHeaders, HttpParams, HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
2
+ import { InjectionToken, inject, DestroyRef, Injectable, isDevMode, NgModule } from '@angular/core';
3
+ import { HttpClient, HttpRequest, HttpResponse, HttpErrorResponse, HttpHeaders, HttpParams, HTTP_INTERCEPTORS } from '@angular/common/http';
4
4
  import { SdCacheService } from '@sdcorejs/angular/services/cache';
5
- import { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';
5
+ import { SdGraphSerializer, digestSdPersistenceKey } from '@sdcorejs/angular/services/persistence';
6
+ import { BrowserUtilities } from '@sdcorejs/utils/fns';
6
7
  import { Subscription, throwError, timer, of, TimeoutError, from, defer } from 'rxjs';
7
8
  import { timeout, filter, map, retry, switchMap, materialize, concatMap, catchError, dematerialize } from 'rxjs/operators';
9
+ import { sdMatchesSecureRoute } from '@sdcorejs/angular/utilities/extensions';
8
10
 
9
11
  const SD_API_CONFIG = new InjectionToken('sd-api.configuration');
10
12
  /** @deprecated Use `SD_API_CONFIG`. This is the same injection token. */
11
13
  const SD_API_CONFIGURATION = SD_API_CONFIG;
14
+ /**
15
+ * Lỗi nghiệp vụ: HTTP 200 nhưng body envelope báo thất bại (`{ ok: false, ... }`).
16
+ *
17
+ * why: trước đây `SdApiService` `throw body` — một plain object. Hệ quả: `error instanceof Error`
18
+ * là `false`, `error.message` là `undefined`, nên mọi `catch` của consumer và predicate
19
+ * `retry.retryWhen` đều bỏ sót nhánh này. Bọc vào một Error thật để envelope lỗi đi chung
20
+ * đường với lỗi HTTP; body gốc vẫn giữ nguyên ở `.body`.
21
+ */
22
+ class SdApiError extends Error {
23
+ name = 'SdApiError';
24
+ /** Body nguyên bản của response (đúng object server trả về). */
25
+ body;
26
+ constructor(body, message) {
27
+ super(message ?? readSdApiEnvelopeMessage(body));
28
+ this.body = body;
29
+ }
30
+ }
31
+ /** Lấy `message` từ envelope nếu server có gửi, để `error.message` nói được điều gì đó hữu ích. */
32
+ function readSdApiEnvelopeMessage(body) {
33
+ if (body !== null && typeof body === 'object' && 'message' in body && typeof body.message === 'string' && body.message.trim()) {
34
+ return body.message;
35
+ }
36
+ return 'The API response envelope reported ok: false';
37
+ }
38
+
39
+ /**
40
+ * Handler nào chịu trách nhiệm cho `url`?
41
+ *
42
+ * why: trước đây là `url.startsWith(host)` — so chuỗi thô. Với host `https://api.example.com`,
43
+ * url `https://api.example.com.attacker.tld/x` cũng "khớp", nên handler chạy `intercept` cho host
44
+ * giả mạo đó và gắn luôn header auth mà nó đính kèm. `sdMatchesSecureRoute` parse URL rồi so
45
+ * origin + path prefix theo segment, nên `.attacker.tld` khác origin → không khớp, và
46
+ * `/api/v1beta` không bị coi là nằm dưới `/api/v1`.
47
+ *
48
+ * Việc chọn base origin khi không có `window.location` (SSR/prerender) do
49
+ * `sdResolveBaseOrigin` trong `url-safety` lo — trước đây file này tự giữ một origin giả riêng,
50
+ * nhưng `SdKeycloakInterceptor` lại không có, nên nó âm thầm ngừng đính token trên server. Logic
51
+ * đó giờ nằm ở helper chung để mọi call site cùng hành xử.
52
+ */
53
+ function sdApiMatchesHandlerHosts(url, hosts) {
54
+ return sdMatchesSecureRoute(url, hosts);
55
+ }
12
56
 
13
57
  /**
14
58
  * Response generics intentionally default to `unknown` for type safety.
@@ -26,6 +70,7 @@ class SdApiService {
26
70
  #sharedRequests = new Map();
27
71
  #activeRequests = new Set();
28
72
  #objectIds = new WeakMap();
73
+ #keySerializer = new SdGraphSerializer();
29
74
  #nextObjectId = 1;
30
75
  #destroyed = false;
31
76
  constructor() {
@@ -73,6 +118,10 @@ class SdApiService {
73
118
  return this.#request(url, method, body, option);
74
119
  }
75
120
  const key = this.#generateKey(url, method, body, option);
121
+ // why: không sinh được key canonical thì bỏ hẳn lớp cache (xem #digestKey) — KHÔNG mint key
122
+ // duy nhất, vì key đó chảy thẳng vào cache bền và không bao giờ đọc lại được.
123
+ if (key === undefined)
124
+ return this.#request(url, method, body, option);
76
125
  const cache = this.#cacheService.create(key, option.cacheOption);
77
126
  try {
78
127
  const cached = cache.snapshot();
@@ -265,16 +314,18 @@ class SdApiService {
265
314
  }
266
315
  #mapResponse(body, handler) {
267
316
  if (body !== null && typeof body === 'object' && 'ok' in body && body.ok === false) {
268
- throw body;
317
+ // why: ném plain object khiến `instanceof Error`, `.message` và mọi retry predicate trượt
318
+ // qua nhánh này. Bọc vào SdApiError nhưng vẫn giữ body gốc ở `.body`.
319
+ throw new SdApiError(body);
269
320
  }
270
321
  return handler?.mapResponse ? handler.mapResponse(body) : body;
271
322
  }
272
323
  #getHandler(url) {
273
324
  const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);
274
- return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));
325
+ return handlers.find(handler => sdApiMatchesHandlerHosts(url, handler.hosts));
275
326
  }
276
327
  #generateKey(url, method, body, option) {
277
- return Utilities.hash({
328
+ return this.#digestKey({
278
329
  method,
279
330
  url,
280
331
  body: this.#normalizeBody(body),
@@ -298,11 +349,43 @@ class SdApiService {
298
349
  });
299
350
  }
300
351
  #generateRequestKey(url, method, body, option) {
301
- return Utilities.hash({
302
- responseKey: this.#generateKey(url, method, body, option),
352
+ const responseKey = this.#generateKey(url, method, body, option);
353
+ // why: không key cache thì cũng KHÔNG được có key dedupe. Nếu vẫn digest với
354
+ // `responseKey: undefined` thì mọi request không canonicalize được sẽ ra chung một key và
355
+ // share nhầm response in-flight của nhau — đúng thứ fail-closed sinh ra để chặn.
356
+ if (responseKey === undefined)
357
+ return undefined;
358
+ return this.#digestKey({
359
+ responseKey,
303
360
  dedupeWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),
304
361
  });
305
362
  }
363
+ /**
364
+ * why: key cache + key dedupe trước đây lấy từ `Utilities.hash` — rolling hash 32-bit rồi
365
+ * `Math.abs` nên thực chất chỉ còn 31 bit. Một va chạm là hai request KHÁC nhau dùng chung một
366
+ * response in-flight hoặc chung một body đã cache, tức rò dữ liệu chéo request. Đổi sang
367
+ * SHA-256 (`digestSdPersistenceKey`, đồng bộ, đã dùng sẵn ở services/persistence + services/cache
368
+ * nên không phải đổi call site sang async) trên chuỗi canonical của `SdGraphSerializer` —
369
+ * serializer này sort key object và xử lý vòng lặp tham chiếu nên hai request giống nhau về
370
+ * ngữ nghĩa luôn ra cùng một chuỗi.
371
+ *
372
+ * Trả `undefined` = "không có key" ⇒ caller BỎ HẲN cache + dedupe cho lời gọi này.
373
+ */
374
+ #digestKey(descriptor) {
375
+ try {
376
+ return `sd-api@1:${digestSdPersistenceKey(this.#keySerializer.stringify(descriptor))}`;
377
+ }
378
+ catch {
379
+ // why: fail-closed. Không canonicalize được (giá trị lạ trong headers/params) thì bỏ hẳn
380
+ // cache/dedupe — mất tối ưu còn hơn chia sẻ nhầm response.
381
+ //
382
+ // Bản trước sinh một key DUY NHẤT mỗi lần gọi. Nhưng key này cũng chính là key cache, và
383
+ // `SdCacheService.create(key, cacheOption)` với `cacheOption.type: 'local'` ghi xuống storage
384
+ // bền: mỗi request không canonicalize được để lại một entry không bao giờ đọc lại (key không
385
+ // bao giờ sinh ra lần thứ hai) và không bao giờ bị evict — rò rỉ storage không giới hạn.
386
+ return undefined;
387
+ }
388
+ }
306
389
  #normalizeDedupeWindow(dedupeWindowMs) {
307
390
  return this.#normalizeFiniteNumber(dedupeWindowMs, this.#defaultDedupeWindowMs, 0, this.#maxTimerMs);
308
391
  }
@@ -471,7 +554,9 @@ class SdHttpInterceptor {
471
554
  }
472
555
  #findHandler(url) {
473
556
  const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);
474
- return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));
557
+ // why: `url.startsWith(host)` cho phép host nhìn-giống-thật (`https://api.example.com.attacker.tld`)
558
+ // khớp handler của `https://api.example.com` và nhận trọn `intercept` — kể cả header auth.
559
+ return handlers.find(handler => sdApiMatchesHandlerHosts(url, handler.hosts));
475
560
  }
476
561
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdHttpInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
477
562
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdHttpInterceptor });
@@ -480,23 +565,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImpo
480
565
  type: Injectable
481
566
  }] });
482
567
 
568
+ /**
569
+ * Thông điệp của assertion dev-mode ở constructor. Export ra để spec khẳng định đúng nội dung,
570
+ * và để consumer grep được khi thấy nó trong console.
571
+ */
572
+ const SD_API_MISSING_HTTP_CLIENT_MESSAGE = '[sd-api] SdApiModule không còn tự cấu hình HttpClient. ' +
573
+ 'Thêm `provideHttpClient(withInterceptorsFromDi())` vào providers của application ' +
574
+ '(app.config.ts hoặc AppModule) — nếu không, lời gọi API đầu tiên sẽ ném ' +
575
+ '`NullInjectorError: No provider for HttpClient`.';
576
+ // why: KHÔNG gọi `provideHttpClient(withInterceptorsFromDi())` ở đây. Đây là NgModule của thư viện,
577
+ // mà `provideHttpClient` đăng ký LẠI toàn bộ cấu hình HttpClient ở root injector: app nào đã khai
578
+ // báo `provideHttpClient(withInterceptors([...]))` rồi mới import SdApiModule sẽ mất sạch functional
579
+ // interceptor của chính nó mà không có cảnh báo nào. Module này chỉ góp `HTTP_INTERCEPTORS`;
580
+ // việc cấu hình HttpClient (và bật `withInterceptorsFromDi()`) thuộc về application.
483
581
  class SdApiModule {
582
+ constructor() {
583
+ // why: bỏ `provideHttpClient(...)` khỏi module là đúng, nhưng nó phá mọi consumer NgModule đang
584
+ // theo đúng hướng dẫn cũ `imports: [SdApiModule]` — và phá KHÔNG ở thời điểm build. Họ chỉ gặp
585
+ // `NullInjectorError: No provider for HttpClient` ở lời gọi API ĐẦU TIÊN lúc runtime, cách rất
586
+ // xa chỗ cấu hình sai. Kiểm tra ngay lúc dựng module và gọi thẳng tên API còn thiếu.
587
+ //
588
+ // Chỉ cảnh báo (không ném) vì đây là thư viện: có app cấu hình HttpClient ở injector con hoặc
589
+ // trong test harness riêng, ném ở đây sẽ chặn cả những setup hợp lệ đó.
590
+ if (isDevMode() && inject(HttpClient, { optional: true }) === null) {
591
+ console.error(SD_API_MISSING_HTTP_CLIENT_MESSAGE);
592
+ }
593
+ }
484
594
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
485
595
  static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.21", ngImport: i0, type: SdApiModule });
486
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiModule, providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }] });
596
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiModule, providers: [{ provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }] });
487
597
  }
488
598
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdApiModule, decorators: [{
489
599
  type: NgModule,
490
600
  args: [{
491
601
  imports: [],
492
602
  exports: [],
493
- providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],
603
+ providers: [{ provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],
494
604
  }]
495
- }] });
605
+ }], ctorParameters: () => [] });
496
606
 
497
607
  /**
498
608
  * Generated bundle index. Do not edit.
499
609
  */
500
610
 
501
- export { SD_API_CONFIG, SD_API_CONFIGURATION, SdApiModule, SdApiService, SdHttpInterceptor };
611
+ export { SD_API_CONFIG, SD_API_CONFIGURATION, SD_API_MISSING_HTTP_CLIENT_MESSAGE, SdApiError, SdApiModule, SdApiService, SdHttpInterceptor };
502
612
  //# sourceMappingURL=sdcorejs-angular-services-api.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services-api.mjs","sources":["../../../projects/sdcorejs-angular/services/api/src/api.model.ts","../../../projects/sdcorejs-angular/services/api/src/api.service.ts","../../../projects/sdcorejs-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sdcorejs-angular/services/api/src/api.module.ts","../../../projects/sdcorejs-angular/services/api/sdcorejs-angular-services-api.ts"],"sourcesContent":["import { HttpContext, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { SdCacheOption } from '@sdcorejs/angular/services/cache';\n\nexport type SdApiResponseType = 'arraybuffer' | 'blob' | 'json' | 'text';\ntype SdApiBivariantCallback<TArgument, TResult> = { bivarianceHack(argument: TArgument): TResult }['bivarianceHack'];\n\nexport interface SdApiHttpOption {\n headers?: HttpHeaders | Record<string, string | string[]>;\n context?: HttpContext;\n params?: HttpParams | Record<string, string | number | boolean | readonly (string | number | boolean)[]>;\n observe?: 'body';\n reportProgress?: boolean;\n responseType?: SdApiResponseType;\n withCredentials?: boolean;\n transferCache?: { includeHeaders?: string[] } | boolean;\n}\n\nexport interface SdApiRetryOption {\n /** Number of retries after the initial request. Values are clamped to a finite safe limit. */\n attempts: number;\n /** Delay before the first retry. Defaults to 0. */\n delayMs?: number;\n /** Multiplier applied to each subsequent delay. Defaults to 1. */\n backoff?: number;\n /** Overrides the default transient HTTP-status predicate. `attempt` is one-based. */\n retryWhen?: (error: unknown, attempt: number) => boolean;\n /** Required to retry POST, PUT, PATCH, or DELETE. */\n mutations?: boolean;\n}\n\nexport interface SdApiOption {\n cacheOption?: SdCacheOption;\n timeout?: number; // Default: 60000 (60s)\n /** Cancels only this caller; a shared HTTP request continues while another caller remains. */\n signal?: AbortSignal;\n /** Enables request deduplication. Defaults to true for GET and false for mutations. */\n dedupe?: boolean;\n /** Keeps a successful dedupe result replayable for this duration. Defaults to 1000ms. */\n dedupeWindowMs?: number;\n /** Opt-in bounded retry policy. The default is no retries. */\n retry?: SdApiRetryOption;\n /**\n * @deprecated Use `dedupe`. When both are provided, `dedupe` takes precedence.\n * Explicit `true` remains a compatibility opt-in for mutation deduplication.\n */\n autoCache?: boolean;\n}\n\nexport type SdGetOption = SdApiHttpOption & SdApiOption;\nexport type SdPostOption = SdApiHttpOption & SdApiOption;\nexport type SdPutOption = SdApiHttpOption & SdApiOption;\nexport type SdPatchOption = SdApiHttpOption & SdApiOption;\nexport type SdDeleteOption = SdApiHttpOption & SdApiOption;\nexport type SdApiRequestUpdate = Parameters<HttpRequest<unknown>['clone']>[0];\n\nexport interface SdApiHandler {\n /** Danh sách host URL mà handler này sẽ xử lý */\n hosts: string[];\n /** Can thiệp request: gắn header, token, transform body... */\n intercept?: SdApiBivariantCallback<HttpRequest<unknown>, HttpRequest<unknown> | SdApiRequestUpdate>;\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\n beforeRemote?: SdApiBivariantCallback<HttpRequest<unknown>, void | Promise<void>>;\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\n afterRemote?: SdApiBivariantCallback<HttpResponse<unknown> | HttpErrorResponse | Error, void | Promise<void>>;\n /** Transform response body thành kiểu dữ liệu mong muốn */\n mapResponse?: SdApiBivariantCallback<unknown, unknown>;\n /** Timeout tính bằng milliseconds. Mặc định: 60000 (60 giây) */\n timeout?: number;\n}\n\nexport interface ISdApiConfiguration {\n handlers?: SdApiHandler[];\n}\n\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n\n/** @deprecated Use `SD_API_CONFIG`. This is the same injection token. */\nexport const SD_API_CONFIGURATION = SD_API_CONFIG;\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { Observable, of, Subscription, throwError, timer, TimeoutError } from 'rxjs';\nimport { filter, map, retry, timeout } from 'rxjs/operators';\nimport {\n ISdApiConfiguration,\n SD_API_CONFIG,\n SdApiHandler,\n SdApiRetryOption,\n SdDeleteOption,\n SdGetOption,\n SdPatchOption,\n SdPostOption,\n SdPutOption,\n} from './api.model';\n\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdPatchOption & SdDeleteOption;\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\ntype SharedRequestState = 'pending' | 'succeeded' | 'failed' | 'cancelled';\n\ninterface SharedRequest {\n readonly key?: string;\n readonly replayWindowMs: number;\n readonly promise: Promise<unknown>;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n subscription: Subscription;\n owners: number;\n state: SharedRequestState;\n replayTimer?: ReturnType<typeof setTimeout>;\n}\n\ninterface PreparedRequest {\n request: SharedRequest;\n source: Observable<unknown>;\n}\n\n/**\n * Response generics intentionally default to `unknown` for type safety.\n * Callers should specify `T`; migration guidance is tracked for Task 13.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SdApiService {\n readonly #defaultTimeout = 60000;\n readonly #defaultDedupeWindowMs = 1000;\n readonly #maxTimerMs = 2_147_483_647;\n readonly #maxRetryAttempts = 10;\n readonly #httpClient = inject(HttpClient);\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n readonly #cacheService = inject(SdCacheService);\n readonly #destroyRef = inject(DestroyRef);\n readonly #sharedRequests = new Map<string, SharedRequest>();\n readonly #activeRequests = new Set<SharedRequest>();\n readonly #objectIds = new WeakMap<object, number>();\n #nextObjectId = 1;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#destroy());\n }\n\n get http(): HttpClient {\n return this.#httpClient;\n }\n\n get = <T = unknown>(url: string, option?: SdGetOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\n };\n\n post = <T = unknown>(url: string, body?: unknown, option?: SdPostOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\n };\n\n put = <T = unknown>(url: string, body?: unknown, option?: SdPutOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\n };\n\n patch = <T = unknown>(url: string, body?: unknown, option?: SdPatchOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PATCH', body, option);\n };\n\n delete = <T = unknown>(url: string, option?: SdDeleteOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\n };\n\n upload = async <T = unknown>(url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<T | null | undefined> => {\n const file = await BrowserUtilities.upload(option);\n if (!Array.isArray(file) && file) {\n return this.uploadFile<T>(url, file);\n }\n return undefined;\n };\n\n uploadFile = async <T = unknown>(url: string, file: File | null | undefined): Promise<T | null> => {\n if (!file) return null;\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n return this.post<T>(url, formData, { dedupe: false });\n };\n\n async #executeWithLayeredCache<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n throw this.#createAbortError();\n }\n\n if (!option?.cacheOption) {\n return this.#request<T>(url, method, body, option);\n }\n\n const key = this.#generateKey(url, method, body, option);\n const cache = this.#cacheService.create<T>(key, option.cacheOption);\n try {\n const cached = cache.snapshot();\n if (cached.present) return cached.value;\n\n const result = await this.#request<T>(url, method, body, option);\n cache.set(result);\n return result;\n } finally {\n cache.release();\n }\n }\n\n #request<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n return Promise.reject(this.#createAbortError());\n }\n\n const shouldDedupe = option?.dedupe ?? option?.autoCache ?? method === 'GET';\n const key = shouldDedupe ? this.#generateRequestKey(url, method, body, option) : undefined;\n let request = key ? this.#sharedRequests.get(key) : undefined;\n\n if (!request) {\n const prepared = this.#prepareRequest(url, method, body, option, key);\n request = prepared.request;\n if (key) this.#sharedRequests.set(key, request);\n this.#startRequest(request, prepared.source);\n }\n\n return this.#attachCaller<T>(request, option?.signal);\n }\n\n #prepareRequest(\n url: string,\n method: HttpMethod,\n body: unknown,\n option: SdHttpOptions | undefined,\n key: string | undefined\n ): PreparedRequest {\n let resolve!: (value: unknown) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<unknown>((resolvePromise, rejectPromise) => {\n resolve = resolvePromise;\n reject = rejectPromise;\n });\n const request: SharedRequest = {\n key,\n replayWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n promise,\n resolve,\n reject,\n subscription: Subscription.EMPTY,\n owners: 0,\n state: 'pending',\n };\n this.#activeRequests.add(request);\n\n const handler = this.#getHandler(url);\n const httpRequest = new HttpRequest<unknown>(method, url, body ?? null, {\n headers: this.#toHttpHeaders(option?.headers),\n context: option?.context,\n params: this.#toHttpParams(option?.params),\n reportProgress: option?.reportProgress,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials,\n transferCache: option?.transferCache,\n });\n const source = this.#withRetry(\n this.#httpClient.request(httpRequest).pipe(\n timeout(this.#resolveTimeout(url, option?.timeout)),\n filter((event): event is HttpResponse<unknown> => event instanceof HttpResponse),\n map(response => this.#mapResponse(response.body, handler))\n ),\n method,\n option?.retry\n );\n\n return { request, source };\n }\n\n #startRequest(request: SharedRequest, source: Observable<unknown>): void {\n request.subscription = source.subscribe({\n next: value => this.#completeSuccess(request, value),\n error: error => this.#completeError(request, error),\n complete: () => {\n if (request.state === 'pending') {\n this.#completeError(request, new Error('HTTP request completed without a response'));\n }\n },\n });\n }\n\n #attachCaller<T>(request: SharedRequest, signal?: AbortSignal): Promise<T> {\n request.owners++;\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n if (signal) signal.removeEventListener('abort', abort);\n };\n const release = (): void => {\n request.owners = Math.max(0, request.owners - 1);\n if (request.state === 'pending' && request.owners === 0) {\n this.#cancelRequest(request);\n }\n };\n const abort = (): void => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(this.#createAbortError());\n };\n\n if (signal) {\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) {\n abort();\n return;\n }\n }\n\n request.promise.then(\n value => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n resolve(value as T);\n },\n error => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(error);\n }\n );\n });\n }\n\n #completeSuccess(request: SharedRequest, value: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'succeeded';\n request.resolve(value);\n\n if (!request.key) {\n this.#activeRequests.delete(request);\n return;\n }\n\n if (request.replayWindowMs === 0) {\n this.#evictRequest(request);\n return;\n }\n\n request.replayTimer = setTimeout(() => this.#evictRequest(request), request.replayWindowMs);\n }\n\n #completeError(request: SharedRequest, error: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'failed';\n this.#removeRequest(request);\n request.reject(error);\n }\n\n #cancelRequest(request: SharedRequest): void {\n if (request.state !== 'pending') return;\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n this.#removeRequest(request);\n request.reject(this.#createAbortError());\n }\n\n #evictRequest(request: SharedRequest): void {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n this.#removeRequest(request);\n }\n\n #removeRequest(request: SharedRequest): void {\n if (request.key && this.#sharedRequests.get(request.key) === request) {\n this.#sharedRequests.delete(request.key);\n }\n this.#activeRequests.delete(request);\n }\n\n #withRetry(source: Observable<unknown>, method: HttpMethod, option?: SdApiRetryOption): Observable<unknown> {\n const attempts = this.#normalizeRetryAttempts(option?.attempts);\n const mutation = method !== 'GET';\n if (attempts === 0 || (mutation && option?.mutations !== true)) {\n return source;\n }\n\n return source.pipe(\n retry({\n count: attempts,\n delay: (error: unknown, attempt: number) => {\n if (this.#isAbortError(error) || !this.#shouldRetry(error, attempt, option)) {\n return throwError(() => error);\n }\n\n const baseDelay = this.#normalizeRetryDelay(option?.delayMs);\n const backoff = this.#normalizeRetryBackoff(option?.backoff);\n const computedDelay = baseDelay * Math.pow(backoff, attempt - 1);\n const delayMs = Number.isFinite(computedDelay) ? Math.min(this.#maxTimerMs, computedDelay) : this.#maxTimerMs;\n return delayMs > 0 ? timer(delayMs) : of(undefined);\n },\n })\n );\n }\n\n #shouldRetry(error: unknown, attempt: number, option: SdApiRetryOption | undefined): boolean {\n if (option?.retryWhen) {\n return option.retryWhen(error, attempt);\n }\n if (error instanceof TimeoutError) return true;\n if (!(error instanceof HttpErrorResponse)) return false;\n return error.status === 0 || [408, 425, 429, 500, 502, 503, 504].includes(error.status);\n }\n\n #mapResponse(body: unknown, handler: SdApiHandler | undefined): unknown {\n if (body !== null && typeof body === 'object' && 'ok' in body && body.ok === false) {\n throw body;\n }\n return handler?.mapResponse ? handler.mapResponse(body) : body;\n }\n\n #getHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));\n }\n\n #generateKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string {\n return Utilities.hash({\n method,\n url,\n body: this.#normalizeBody(body),\n headers: this.#normalizeHeaders(option?.headers),\n params: this.#normalizeParams(option?.params),\n context: option?.context ? this.#getObjectId(option.context) : undefined,\n reportProgress: option?.reportProgress ?? false,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials ?? false,\n transferCache: option?.transferCache,\n timeout: this.#resolveTimeout(url, option?.timeout),\n retry: option?.retry\n ? {\n attempts: this.#normalizeRetryAttempts(option.retry.attempts),\n delayMs: this.#normalizeRetryDelay(option.retry.delayMs),\n backoff: this.#normalizeRetryBackoff(option.retry.backoff),\n mutations: option.retry.mutations,\n retryWhen: option.retry.retryWhen ? this.#getObjectId(option.retry.retryWhen) : undefined,\n }\n : undefined,\n });\n }\n\n #generateRequestKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string {\n return Utilities.hash({\n responseKey: this.#generateKey(url, method, body, option),\n dedupeWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n });\n }\n\n #normalizeDedupeWindow(dedupeWindowMs: number | undefined): number {\n return this.#normalizeFiniteNumber(dedupeWindowMs, this.#defaultDedupeWindowMs, 0, this.#maxTimerMs);\n }\n\n #resolveTimeout(url: string, timeoutMs: number | undefined): number {\n const configuredTimeout = timeoutMs === undefined ? this.#getHandler(url)?.timeout : timeoutMs;\n return this.#normalizeFiniteNumber(configuredTimeout, this.#defaultTimeout, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryAttempts(attempts: number | undefined): number {\n return Math.floor(this.#normalizeFiniteNumber(attempts, 0, 0, this.#maxRetryAttempts));\n }\n\n #normalizeRetryDelay(delayMs: number | undefined): number {\n return this.#normalizeFiniteNumber(delayMs, 0, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryBackoff(backoff: number | undefined): number {\n const normalized = this.#normalizeFiniteNumber(backoff, 1, 0, this.#maxTimerMs);\n return normalized > 0 ? normalized : 1;\n }\n\n #normalizeFiniteNumber(value: number | undefined, defaultValue: number, minimum: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return defaultValue;\n return Math.min(maximum, Math.max(minimum, value));\n }\n\n #normalizeBody(body: unknown, ancestors = new WeakSet<object>()): unknown {\n if (body === null || typeof body !== 'object') return body;\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n return { urlSearchParams: body.toString() };\n }\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n return { objectType: 'FormData', objectId: this.#getObjectId(body) };\n }\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n return { objectType: 'Blob', objectId: this.#getObjectId(body) };\n }\n if (typeof ArrayBuffer !== 'undefined' && (body instanceof ArrayBuffer || ArrayBuffer.isView(body))) {\n return { objectType: 'ArrayBuffer', objectId: this.#getObjectId(body) };\n }\n if (body instanceof Date) {\n return { date: body.getTime() };\n }\n if (ancestors.has(body)) {\n return { circularObjectId: this.#getObjectId(body) };\n }\n if (Array.isArray(body)) {\n ancestors.add(body);\n const normalized = body.map(value => this.#normalizeBody(value, ancestors));\n ancestors.delete(body);\n return normalized;\n }\n const prototype = Object.getPrototypeOf(body);\n if (prototype === Object.prototype || prototype === null) {\n ancestors.add(body);\n const normalized = Object.fromEntries(Object.entries(body).map(([key, value]) => [key, this.#normalizeBody(value, ancestors)]));\n ancestors.delete(body);\n return normalized;\n }\n return { objectType: prototype?.constructor?.name ?? 'Object', objectId: this.#getObjectId(body) };\n }\n\n #normalizeHeaders(headers: SdHttpOptions['headers']): unknown {\n if (headers instanceof HttpHeaders) {\n return headers\n .keys()\n .sort()\n .map(key => [key.toLowerCase(), headers.getAll(key)]);\n }\n return headers;\n }\n\n #normalizeParams(params: SdHttpOptions['params']): unknown {\n if (params instanceof HttpParams) {\n return params\n .keys()\n .sort()\n .map(key => [key, params.getAll(key)]);\n }\n return params;\n }\n\n #toHttpHeaders(headers: SdHttpOptions['headers']): HttpHeaders | undefined {\n if (!headers || headers instanceof HttpHeaders) return headers;\n return new HttpHeaders(headers);\n }\n\n #toHttpParams(params: SdHttpOptions['params']): HttpParams | undefined {\n if (!params || params instanceof HttpParams) return params;\n return new HttpParams({ fromObject: params });\n }\n\n #getObjectId(value: object): number {\n const existing = this.#objectIds.get(value);\n if (existing !== undefined) return existing;\n const id = this.#nextObjectId++;\n this.#objectIds.set(value, id);\n return id;\n }\n\n #createAbortError(): Error {\n const error = new Error('The operation was aborted');\n error.name = 'AbortError';\n return error;\n }\n\n #isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n }\n\n #destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n for (const request of [...this.#activeRequests]) {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n if (request.state === 'pending') {\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n request.reject(this.#createAbortError());\n }\n this.#removeRequest(request);\n }\n this.#sharedRequests.clear();\n this.#activeRequests.clear();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { defer, from, Observable, of, throwError } from 'rxjs';\nimport { catchError, concatMap, dematerialize, map, materialize, switchMap } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler } from '../api.model';\n\n@Injectable()\nexport class SdHttpInterceptor implements HttpInterceptor {\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!request.url) throw new Error('Invalid URL');\n\n const handler = this.#findHandler(request.url);\n if (handler?.intercept) {\n const interceptedRequest = handler.intercept(request);\n request = interceptedRequest instanceof HttpRequest ? interceptedRequest : request.clone(interceptedRequest);\n }\n if (typeof FormData !== 'undefined' && request.body instanceof FormData) {\n request = request.clone({ headers: request.headers.delete('Content-Type') });\n }\n\n const beforeRemote = handler?.beforeRemote?.(request);\n if (beforeRemote instanceof Promise) {\n return from(beforeRemote).pipe(switchMap(() => this.#handleRemote(request, next, handler)));\n }\n return this.#handleRemote(request, next, handler);\n }\n\n #handleRemote(request: HttpRequest<unknown>, next: HttpHandler, handler: SdApiHandler | undefined): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n materialize(),\n concatMap(notification => {\n const afterValue =\n notification.kind === 'N' && notification.value instanceof HttpResponse\n ? notification.value\n : notification.kind === 'E' && (notification.error instanceof Error || notification.error instanceof HttpErrorResponse)\n ? notification.error\n : undefined;\n if (!afterValue || !handler?.afterRemote) {\n return of(notification);\n }\n\n return defer(() => {\n const result = handler.afterRemote?.(afterValue);\n return result instanceof Promise ? result : Promise.resolve();\n }).pipe(\n map(() => notification),\n catchError(hookError => (notification.kind === 'E' ? of(notification) : throwError(() => hookError)))\n );\n }),\n dematerialize()\n );\n }\n\n #findHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));\n }\n}\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-services-api.mjs","sources":["../../../projects/sdcorejs-angular/services/api/src/api.model.ts","../../../projects/sdcorejs-angular/services/api/src/api-host.ts","../../../projects/sdcorejs-angular/services/api/src/api.service.ts","../../../projects/sdcorejs-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sdcorejs-angular/services/api/src/api.module.ts","../../../projects/sdcorejs-angular/services/api/sdcorejs-angular-services-api.ts"],"sourcesContent":["import { HttpContext, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { SdCacheOption } from '@sdcorejs/angular/services/cache';\n\nexport type SdApiResponseType = 'arraybuffer' | 'blob' | 'json' | 'text';\ntype SdApiBivariantCallback<TArgument, TResult> = { bivarianceHack(argument: TArgument): TResult }['bivarianceHack'];\n\nexport interface SdApiHttpOption {\n headers?: HttpHeaders | Record<string, string | string[]>;\n context?: HttpContext;\n params?: HttpParams | Record<string, string | number | boolean | readonly (string | number | boolean)[]>;\n observe?: 'body';\n reportProgress?: boolean;\n responseType?: SdApiResponseType;\n withCredentials?: boolean;\n transferCache?: { includeHeaders?: string[] } | boolean;\n}\n\nexport interface SdApiRetryOption {\n /** Number of retries after the initial request. Values are clamped to a finite safe limit. */\n attempts: number;\n /** Delay before the first retry. Defaults to 0. */\n delayMs?: number;\n /** Multiplier applied to each subsequent delay. Defaults to 1. */\n backoff?: number;\n /** Overrides the default transient HTTP-status predicate. `attempt` is one-based. */\n retryWhen?: (error: unknown, attempt: number) => boolean;\n /** Required to retry POST, PUT, PATCH, or DELETE. */\n mutations?: boolean;\n}\n\nexport interface SdApiOption {\n cacheOption?: SdCacheOption;\n timeout?: number; // Default: 60000 (60s)\n /** Cancels only this caller; a shared HTTP request continues while another caller remains. */\n signal?: AbortSignal;\n /** Enables request deduplication. Defaults to true for GET and false for mutations. */\n dedupe?: boolean;\n /** Keeps a successful dedupe result replayable for this duration. Defaults to 1000ms. */\n dedupeWindowMs?: number;\n /** Opt-in bounded retry policy. The default is no retries. */\n retry?: SdApiRetryOption;\n /**\n * @deprecated Use `dedupe`. When both are provided, `dedupe` takes precedence.\n * Explicit `true` remains a compatibility opt-in for mutation deduplication.\n */\n autoCache?: boolean;\n}\n\nexport type SdGetOption = SdApiHttpOption & SdApiOption;\nexport type SdPostOption = SdApiHttpOption & SdApiOption;\nexport type SdPutOption = SdApiHttpOption & SdApiOption;\nexport type SdPatchOption = SdApiHttpOption & SdApiOption;\nexport type SdDeleteOption = SdApiHttpOption & SdApiOption;\nexport type SdApiRequestUpdate = Parameters<HttpRequest<unknown>['clone']>[0];\n\nexport interface SdApiHandler {\n /** Danh sách host URL mà handler này sẽ xử lý */\n hosts: string[];\n /** Can thiệp request: gắn header, token, transform body... */\n intercept?: SdApiBivariantCallback<HttpRequest<unknown>, HttpRequest<unknown> | SdApiRequestUpdate>;\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\n beforeRemote?: SdApiBivariantCallback<HttpRequest<unknown>, void | Promise<void>>;\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\n afterRemote?: SdApiBivariantCallback<HttpResponse<unknown> | HttpErrorResponse | Error, void | Promise<void>>;\n /** Transform response body thành kiểu dữ liệu mong muốn */\n mapResponse?: SdApiBivariantCallback<unknown, unknown>;\n /** Timeout tính bằng milliseconds. Mặc định: 60000 (60 giây) */\n timeout?: number;\n}\n\nexport interface ISdApiConfiguration {\n handlers?: SdApiHandler[];\n}\n\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n\n/** @deprecated Use `SD_API_CONFIG`. This is the same injection token. */\nexport const SD_API_CONFIGURATION = SD_API_CONFIG;\n\n/**\n * Lỗi nghiệp vụ: HTTP 200 nhưng body envelope báo thất bại (`{ ok: false, ... }`).\n *\n * why: trước đây `SdApiService` `throw body` — một plain object. Hệ quả: `error instanceof Error`\n * là `false`, `error.message` là `undefined`, nên mọi `catch` của consumer và predicate\n * `retry.retryWhen` đều bỏ sót nhánh này. Bọc vào một Error thật để envelope lỗi đi chung\n * đường với lỗi HTTP; body gốc vẫn giữ nguyên ở `.body`.\n */\nexport class SdApiError<TBody = unknown> extends Error {\n override readonly name = 'SdApiError';\n\n /** Body nguyên bản của response (đúng object server trả về). */\n readonly body: TBody;\n\n constructor(body: TBody, message?: string) {\n super(message ?? readSdApiEnvelopeMessage(body));\n this.body = body;\n }\n}\n\n/** Lấy `message` từ envelope nếu server có gửi, để `error.message` nói được điều gì đó hữu ích. */\nfunction readSdApiEnvelopeMessage(body: unknown): string {\n if (body !== null && typeof body === 'object' && 'message' in body && typeof body.message === 'string' && body.message.trim()) {\n return body.message;\n }\n return 'The API response envelope reported ok: false';\n}\n","import { sdMatchesSecureRoute } from '@sdcorejs/angular/utilities/extensions';\n\n/**\n * Handler nào chịu trách nhiệm cho `url`?\n *\n * why: trước đây là `url.startsWith(host)` — so chuỗi thô. Với host `https://api.example.com`,\n * url `https://api.example.com.attacker.tld/x` cũng \"khớp\", nên handler chạy `intercept` cho host\n * giả mạo đó và gắn luôn header auth mà nó đính kèm. `sdMatchesSecureRoute` parse URL rồi so\n * origin + path prefix theo segment, nên `.attacker.tld` khác origin → không khớp, và\n * `/api/v1beta` không bị coi là nằm dưới `/api/v1`.\n *\n * Việc chọn base origin khi không có `window.location` (SSR/prerender) do\n * `sdResolveBaseOrigin` trong `url-safety` lo — trước đây file này tự giữ một origin giả riêng,\n * nhưng `SdKeycloakInterceptor` lại không có, nên nó âm thầm ngừng đính token trên server. Logic\n * đó giờ nằm ở helper chung để mọi call site cùng hành xử.\n */\nexport function sdApiMatchesHandlerHosts(url: string, hosts: readonly string[] | undefined): boolean {\n return sdMatchesSecureRoute(url, hosts);\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { digestSdPersistenceKey, SdGraphSerializer } from '@sdcorejs/angular/services/persistence';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\nimport { Observable, of, Subscription, throwError, timer, TimeoutError } from 'rxjs';\nimport { filter, map, retry, timeout } from 'rxjs/operators';\nimport { sdApiMatchesHandlerHosts } from './api-host';\nimport {\n ISdApiConfiguration,\n SD_API_CONFIG,\n SdApiError,\n SdApiHandler,\n SdApiRetryOption,\n SdDeleteOption,\n SdGetOption,\n SdPatchOption,\n SdPostOption,\n SdPutOption,\n} from './api.model';\n\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdPatchOption & SdDeleteOption;\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\ntype SharedRequestState = 'pending' | 'succeeded' | 'failed' | 'cancelled';\n\ninterface SharedRequest {\n readonly key?: string;\n readonly replayWindowMs: number;\n readonly promise: Promise<unknown>;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n subscription: Subscription;\n owners: number;\n state: SharedRequestState;\n replayTimer?: ReturnType<typeof setTimeout>;\n}\n\ninterface PreparedRequest {\n request: SharedRequest;\n source: Observable<unknown>;\n}\n\n/**\n * Response generics intentionally default to `unknown` for type safety.\n * Callers should specify `T`; migration guidance is tracked for Task 13.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SdApiService {\n readonly #defaultTimeout = 60000;\n readonly #defaultDedupeWindowMs = 1000;\n readonly #maxTimerMs = 2_147_483_647;\n readonly #maxRetryAttempts = 10;\n readonly #httpClient = inject(HttpClient);\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n readonly #cacheService = inject(SdCacheService);\n readonly #destroyRef = inject(DestroyRef);\n readonly #sharedRequests = new Map<string, SharedRequest>();\n readonly #activeRequests = new Set<SharedRequest>();\n readonly #objectIds = new WeakMap<object, number>();\n readonly #keySerializer = new SdGraphSerializer();\n #nextObjectId = 1;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#destroy());\n }\n\n get http(): HttpClient {\n return this.#httpClient;\n }\n\n get = <T = unknown>(url: string, option?: SdGetOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\n };\n\n post = <T = unknown>(url: string, body?: unknown, option?: SdPostOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\n };\n\n put = <T = unknown>(url: string, body?: unknown, option?: SdPutOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\n };\n\n patch = <T = unknown>(url: string, body?: unknown, option?: SdPatchOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PATCH', body, option);\n };\n\n delete = <T = unknown>(url: string, option?: SdDeleteOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\n };\n\n upload = async <T = unknown>(url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<T | null | undefined> => {\n const file = await BrowserUtilities.upload(option);\n if (!Array.isArray(file) && file) {\n return this.uploadFile<T>(url, file);\n }\n return undefined;\n };\n\n uploadFile = async <T = unknown>(url: string, file: File | null | undefined): Promise<T | null> => {\n if (!file) return null;\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n return this.post<T>(url, formData, { dedupe: false });\n };\n\n async #executeWithLayeredCache<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n throw this.#createAbortError();\n }\n\n if (!option?.cacheOption) {\n return this.#request<T>(url, method, body, option);\n }\n\n const key = this.#generateKey(url, method, body, option);\n // why: không sinh được key canonical thì bỏ hẳn lớp cache (xem #digestKey) — KHÔNG mint key\n // duy nhất, vì key đó chảy thẳng vào cache bền và không bao giờ đọc lại được.\n if (key === undefined) return this.#request<T>(url, method, body, option);\n\n const cache = this.#cacheService.create<T>(key, option.cacheOption);\n try {\n const cached = cache.snapshot();\n if (cached.present) return cached.value;\n\n const result = await this.#request<T>(url, method, body, option);\n cache.set(result);\n return result;\n } finally {\n cache.release();\n }\n }\n\n #request<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n return Promise.reject(this.#createAbortError());\n }\n\n const shouldDedupe = option?.dedupe ?? option?.autoCache ?? method === 'GET';\n const key = shouldDedupe ? this.#generateRequestKey(url, method, body, option) : undefined;\n let request = key ? this.#sharedRequests.get(key) : undefined;\n\n if (!request) {\n const prepared = this.#prepareRequest(url, method, body, option, key);\n request = prepared.request;\n if (key) this.#sharedRequests.set(key, request);\n this.#startRequest(request, prepared.source);\n }\n\n return this.#attachCaller<T>(request, option?.signal);\n }\n\n #prepareRequest(\n url: string,\n method: HttpMethod,\n body: unknown,\n option: SdHttpOptions | undefined,\n key: string | undefined\n ): PreparedRequest {\n let resolve!: (value: unknown) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<unknown>((resolvePromise, rejectPromise) => {\n resolve = resolvePromise;\n reject = rejectPromise;\n });\n const request: SharedRequest = {\n key,\n replayWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n promise,\n resolve,\n reject,\n subscription: Subscription.EMPTY,\n owners: 0,\n state: 'pending',\n };\n this.#activeRequests.add(request);\n\n const handler = this.#getHandler(url);\n const httpRequest = new HttpRequest<unknown>(method, url, body ?? null, {\n headers: this.#toHttpHeaders(option?.headers),\n context: option?.context,\n params: this.#toHttpParams(option?.params),\n reportProgress: option?.reportProgress,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials,\n transferCache: option?.transferCache,\n });\n const source = this.#withRetry(\n this.#httpClient.request(httpRequest).pipe(\n timeout(this.#resolveTimeout(url, option?.timeout)),\n filter((event): event is HttpResponse<unknown> => event instanceof HttpResponse),\n map(response => this.#mapResponse(response.body, handler))\n ),\n method,\n option?.retry\n );\n\n return { request, source };\n }\n\n #startRequest(request: SharedRequest, source: Observable<unknown>): void {\n request.subscription = source.subscribe({\n next: value => this.#completeSuccess(request, value),\n error: error => this.#completeError(request, error),\n complete: () => {\n if (request.state === 'pending') {\n this.#completeError(request, new Error('HTTP request completed without a response'));\n }\n },\n });\n }\n\n #attachCaller<T>(request: SharedRequest, signal?: AbortSignal): Promise<T> {\n request.owners++;\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n if (signal) signal.removeEventListener('abort', abort);\n };\n const release = (): void => {\n request.owners = Math.max(0, request.owners - 1);\n if (request.state === 'pending' && request.owners === 0) {\n this.#cancelRequest(request);\n }\n };\n const abort = (): void => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(this.#createAbortError());\n };\n\n if (signal) {\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) {\n abort();\n return;\n }\n }\n\n request.promise.then(\n value => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n resolve(value as T);\n },\n error => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(error);\n }\n );\n });\n }\n\n #completeSuccess(request: SharedRequest, value: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'succeeded';\n request.resolve(value);\n\n if (!request.key) {\n this.#activeRequests.delete(request);\n return;\n }\n\n if (request.replayWindowMs === 0) {\n this.#evictRequest(request);\n return;\n }\n\n request.replayTimer = setTimeout(() => this.#evictRequest(request), request.replayWindowMs);\n }\n\n #completeError(request: SharedRequest, error: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'failed';\n this.#removeRequest(request);\n request.reject(error);\n }\n\n #cancelRequest(request: SharedRequest): void {\n if (request.state !== 'pending') return;\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n this.#removeRequest(request);\n request.reject(this.#createAbortError());\n }\n\n #evictRequest(request: SharedRequest): void {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n this.#removeRequest(request);\n }\n\n #removeRequest(request: SharedRequest): void {\n if (request.key && this.#sharedRequests.get(request.key) === request) {\n this.#sharedRequests.delete(request.key);\n }\n this.#activeRequests.delete(request);\n }\n\n #withRetry(source: Observable<unknown>, method: HttpMethod, option?: SdApiRetryOption): Observable<unknown> {\n const attempts = this.#normalizeRetryAttempts(option?.attempts);\n const mutation = method !== 'GET';\n if (attempts === 0 || (mutation && option?.mutations !== true)) {\n return source;\n }\n\n return source.pipe(\n retry({\n count: attempts,\n delay: (error: unknown, attempt: number) => {\n if (this.#isAbortError(error) || !this.#shouldRetry(error, attempt, option)) {\n return throwError(() => error);\n }\n\n const baseDelay = this.#normalizeRetryDelay(option?.delayMs);\n const backoff = this.#normalizeRetryBackoff(option?.backoff);\n const computedDelay = baseDelay * Math.pow(backoff, attempt - 1);\n const delayMs = Number.isFinite(computedDelay) ? Math.min(this.#maxTimerMs, computedDelay) : this.#maxTimerMs;\n return delayMs > 0 ? timer(delayMs) : of(undefined);\n },\n })\n );\n }\n\n #shouldRetry(error: unknown, attempt: number, option: SdApiRetryOption | undefined): boolean {\n if (option?.retryWhen) {\n return option.retryWhen(error, attempt);\n }\n if (error instanceof TimeoutError) return true;\n if (!(error instanceof HttpErrorResponse)) return false;\n return error.status === 0 || [408, 425, 429, 500, 502, 503, 504].includes(error.status);\n }\n\n #mapResponse(body: unknown, handler: SdApiHandler | undefined): unknown {\n if (body !== null && typeof body === 'object' && 'ok' in body && body.ok === false) {\n // why: ném plain object khiến `instanceof Error`, `.message` và mọi retry predicate trượt\n // qua nhánh này. Bọc vào SdApiError nhưng vẫn giữ body gốc ở `.body`.\n throw new SdApiError(body);\n }\n return handler?.mapResponse ? handler.mapResponse(body) : body;\n }\n\n #getHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => sdApiMatchesHandlerHosts(url, handler.hosts));\n }\n\n #generateKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string | undefined {\n return this.#digestKey({\n method,\n url,\n body: this.#normalizeBody(body),\n headers: this.#normalizeHeaders(option?.headers),\n params: this.#normalizeParams(option?.params),\n context: option?.context ? this.#getObjectId(option.context) : undefined,\n reportProgress: option?.reportProgress ?? false,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials ?? false,\n transferCache: option?.transferCache,\n timeout: this.#resolveTimeout(url, option?.timeout),\n retry: option?.retry\n ? {\n attempts: this.#normalizeRetryAttempts(option.retry.attempts),\n delayMs: this.#normalizeRetryDelay(option.retry.delayMs),\n backoff: this.#normalizeRetryBackoff(option.retry.backoff),\n mutations: option.retry.mutations,\n retryWhen: option.retry.retryWhen ? this.#getObjectId(option.retry.retryWhen) : undefined,\n }\n : undefined,\n });\n }\n\n #generateRequestKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string | undefined {\n const responseKey = this.#generateKey(url, method, body, option);\n // why: không có key cache thì cũng KHÔNG được có key dedupe. Nếu vẫn digest với\n // `responseKey: undefined` thì mọi request không canonicalize được sẽ ra chung một key và\n // share nhầm response in-flight của nhau — đúng thứ fail-closed sinh ra để chặn.\n if (responseKey === undefined) return undefined;\n\n return this.#digestKey({\n responseKey,\n dedupeWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n });\n }\n\n /**\n * why: key cache + key dedupe trước đây lấy từ `Utilities.hash` — rolling hash 32-bit rồi\n * `Math.abs` nên thực chất chỉ còn 31 bit. Một va chạm là hai request KHÁC nhau dùng chung một\n * response in-flight hoặc chung một body đã cache, tức rò dữ liệu chéo request. Đổi sang\n * SHA-256 (`digestSdPersistenceKey`, đồng bộ, đã dùng sẵn ở services/persistence + services/cache\n * nên không phải đổi call site sang async) trên chuỗi canonical của `SdGraphSerializer` —\n * serializer này sort key object và xử lý vòng lặp tham chiếu nên hai request giống nhau về\n * ngữ nghĩa luôn ra cùng một chuỗi.\n *\n * Trả `undefined` = \"không có key\" ⇒ caller BỎ HẲN cache + dedupe cho lời gọi này.\n */\n #digestKey(descriptor: Record<string, unknown>): string | undefined {\n try {\n return `sd-api@1:${digestSdPersistenceKey(this.#keySerializer.stringify(descriptor))}`;\n } catch {\n // why: fail-closed. Không canonicalize được (giá trị lạ trong headers/params) thì bỏ hẳn\n // cache/dedupe — mất tối ưu còn hơn chia sẻ nhầm response.\n //\n // Bản trước sinh một key DUY NHẤT mỗi lần gọi. Nhưng key này cũng chính là key cache, và\n // `SdCacheService.create(key, cacheOption)` với `cacheOption.type: 'local'` ghi xuống storage\n // bền: mỗi request không canonicalize được để lại một entry không bao giờ đọc lại (key không\n // bao giờ sinh ra lần thứ hai) và không bao giờ bị evict — rò rỉ storage không giới hạn.\n return undefined;\n }\n }\n\n #normalizeDedupeWindow(dedupeWindowMs: number | undefined): number {\n return this.#normalizeFiniteNumber(dedupeWindowMs, this.#defaultDedupeWindowMs, 0, this.#maxTimerMs);\n }\n\n #resolveTimeout(url: string, timeoutMs: number | undefined): number {\n const configuredTimeout = timeoutMs === undefined ? this.#getHandler(url)?.timeout : timeoutMs;\n return this.#normalizeFiniteNumber(configuredTimeout, this.#defaultTimeout, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryAttempts(attempts: number | undefined): number {\n return Math.floor(this.#normalizeFiniteNumber(attempts, 0, 0, this.#maxRetryAttempts));\n }\n\n #normalizeRetryDelay(delayMs: number | undefined): number {\n return this.#normalizeFiniteNumber(delayMs, 0, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryBackoff(backoff: number | undefined): number {\n const normalized = this.#normalizeFiniteNumber(backoff, 1, 0, this.#maxTimerMs);\n return normalized > 0 ? normalized : 1;\n }\n\n #normalizeFiniteNumber(value: number | undefined, defaultValue: number, minimum: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return defaultValue;\n return Math.min(maximum, Math.max(minimum, value));\n }\n\n #normalizeBody(body: unknown, ancestors = new WeakSet<object>()): unknown {\n if (body === null || typeof body !== 'object') return body;\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n return { urlSearchParams: body.toString() };\n }\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n return { objectType: 'FormData', objectId: this.#getObjectId(body) };\n }\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n return { objectType: 'Blob', objectId: this.#getObjectId(body) };\n }\n if (typeof ArrayBuffer !== 'undefined' && (body instanceof ArrayBuffer || ArrayBuffer.isView(body))) {\n return { objectType: 'ArrayBuffer', objectId: this.#getObjectId(body) };\n }\n if (body instanceof Date) {\n return { date: body.getTime() };\n }\n if (ancestors.has(body)) {\n return { circularObjectId: this.#getObjectId(body) };\n }\n if (Array.isArray(body)) {\n ancestors.add(body);\n const normalized = body.map(value => this.#normalizeBody(value, ancestors));\n ancestors.delete(body);\n return normalized;\n }\n const prototype = Object.getPrototypeOf(body);\n if (prototype === Object.prototype || prototype === null) {\n ancestors.add(body);\n const normalized = Object.fromEntries(Object.entries(body).map(([key, value]) => [key, this.#normalizeBody(value, ancestors)]));\n ancestors.delete(body);\n return normalized;\n }\n return { objectType: prototype?.constructor?.name ?? 'Object', objectId: this.#getObjectId(body) };\n }\n\n #normalizeHeaders(headers: SdHttpOptions['headers']): unknown {\n if (headers instanceof HttpHeaders) {\n return headers\n .keys()\n .sort()\n .map(key => [key.toLowerCase(), headers.getAll(key)]);\n }\n return headers;\n }\n\n #normalizeParams(params: SdHttpOptions['params']): unknown {\n if (params instanceof HttpParams) {\n return params\n .keys()\n .sort()\n .map(key => [key, params.getAll(key)]);\n }\n return params;\n }\n\n #toHttpHeaders(headers: SdHttpOptions['headers']): HttpHeaders | undefined {\n if (!headers || headers instanceof HttpHeaders) return headers;\n return new HttpHeaders(headers);\n }\n\n #toHttpParams(params: SdHttpOptions['params']): HttpParams | undefined {\n if (!params || params instanceof HttpParams) return params;\n return new HttpParams({ fromObject: params });\n }\n\n #getObjectId(value: object): number {\n const existing = this.#objectIds.get(value);\n if (existing !== undefined) return existing;\n const id = this.#nextObjectId++;\n this.#objectIds.set(value, id);\n return id;\n }\n\n #createAbortError(): Error {\n const error = new Error('The operation was aborted');\n error.name = 'AbortError';\n return error;\n }\n\n #isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n }\n\n #destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n for (const request of [...this.#activeRequests]) {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n if (request.state === 'pending') {\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n request.reject(this.#createAbortError());\n }\n this.#removeRequest(request);\n }\n this.#sharedRequests.clear();\n this.#activeRequests.clear();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { defer, from, Observable, of, throwError } from 'rxjs';\nimport { catchError, concatMap, dematerialize, map, materialize, switchMap } from 'rxjs/operators';\nimport { sdApiMatchesHandlerHosts } from '../api-host';\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler } from '../api.model';\n\n@Injectable()\nexport class SdHttpInterceptor implements HttpInterceptor {\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!request.url) throw new Error('Invalid URL');\n\n const handler = this.#findHandler(request.url);\n if (handler?.intercept) {\n const interceptedRequest = handler.intercept(request);\n request = interceptedRequest instanceof HttpRequest ? interceptedRequest : request.clone(interceptedRequest);\n }\n if (typeof FormData !== 'undefined' && request.body instanceof FormData) {\n request = request.clone({ headers: request.headers.delete('Content-Type') });\n }\n\n const beforeRemote = handler?.beforeRemote?.(request);\n if (beforeRemote instanceof Promise) {\n return from(beforeRemote).pipe(switchMap(() => this.#handleRemote(request, next, handler)));\n }\n return this.#handleRemote(request, next, handler);\n }\n\n #handleRemote(request: HttpRequest<unknown>, next: HttpHandler, handler: SdApiHandler | undefined): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n materialize(),\n concatMap(notification => {\n const afterValue =\n notification.kind === 'N' && notification.value instanceof HttpResponse\n ? notification.value\n : notification.kind === 'E' && (notification.error instanceof Error || notification.error instanceof HttpErrorResponse)\n ? notification.error\n : undefined;\n if (!afterValue || !handler?.afterRemote) {\n return of(notification);\n }\n\n return defer(() => {\n const result = handler.afterRemote?.(afterValue);\n return result instanceof Promise ? result : Promise.resolve();\n }).pipe(\n map(() => notification),\n catchError(hookError => (notification.kind === 'E' ? of(notification) : throwError(() => hookError)))\n );\n }),\n dematerialize()\n );\n }\n\n #findHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n // why: `url.startsWith(host)` cho phép host nhìn-giống-thật (`https://api.example.com.attacker.tld`)\n // khớp handler của `https://api.example.com` và nhận trọn `intercept` — kể cả header auth.\n return handlers.find(handler => sdApiMatchesHandlerHosts(url, handler.hosts));\n }\n}\n","import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http';\nimport { inject, isDevMode, NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n/**\n * Thông điệp của assertion dev-mode ở constructor. Export ra để spec khẳng định đúng nội dung,\n * và để consumer grep được khi thấy nó trong console.\n */\nexport const SD_API_MISSING_HTTP_CLIENT_MESSAGE =\n '[sd-api] SdApiModule không còn tự cấu hình HttpClient. ' +\n 'Thêm `provideHttpClient(withInterceptorsFromDi())` vào providers của application ' +\n '(app.config.ts hoặc AppModule) — nếu không, lời gọi API đầu tiên sẽ ném ' +\n '`NullInjectorError: No provider for HttpClient`.';\n\n// why: KHÔNG gọi `provideHttpClient(withInterceptorsFromDi())` ở đây. Đây là NgModule của thư viện,\n// mà `provideHttpClient` đăng ký LẠI toàn bộ cấu hình HttpClient ở root injector: app nào đã khai\n// báo `provideHttpClient(withInterceptors([...]))` rồi mới import SdApiModule sẽ mất sạch functional\n// interceptor của chính nó mà không có cảnh báo nào. Module này chỉ góp `HTTP_INTERCEPTORS`;\n// việc cấu hình HttpClient (và bật `withInterceptorsFromDi()`) thuộc về application.\n@NgModule({\n imports: [],\n exports: [],\n providers: [{ provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {\n constructor() {\n // why: bỏ `provideHttpClient(...)` khỏi module là đúng, nhưng nó phá mọi consumer NgModule đang\n // theo đúng hướng dẫn cũ `imports: [SdApiModule]` — và phá KHÔNG ở thời điểm build. Họ chỉ gặp\n // `NullInjectorError: No provider for HttpClient` ở lời gọi API ĐẦU TIÊN lúc runtime, cách rất\n // xa chỗ cấu hình sai. Kiểm tra ngay lúc dựng module và gọi thẳng tên API còn thiếu.\n //\n // Chỉ cảnh báo (không ném) vì đây là thư viện: có app cấu hình HttpClient ở injector con hoặc\n // trong test harness riêng, ném ở đây sẽ chặn cả những setup hợp lệ đó.\n if (isDevMode() && inject(HttpClient, { optional: true }) === null) {\n console.error(SD_API_MISSING_HTTP_CLIENT_MESSAGE);\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}