@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-services-notify.mjs","sources":["../../../projects/sdcorejs-angular/services/notify/src/components/toast/toast.component.ts","../../../projects/sdcorejs-angular/services/notify/src/components/toast/toast.component.html","../../../projects/sdcorejs-angular/services/notify/src/components/toast-container.component.ts","../../../projects/sdcorejs-angular/services/notify/src/notify.service.ts","../../../projects/sdcorejs-angular/services/notify/sdcorejs-angular-services-notify.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n SecurityContext,\n computed,\n signal,\n inject,\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\n\nimport { ToastData } from '../../notify.model';\nimport { SdNotifyService } from '../../notify.service';\n\nconst TOAST_EXIT_ANIMATION_MS = 200;\n\n@Component({\n selector: 'toast',\n standalone: true,\n imports: [CommonModule, TranslatePipe],\n templateUrl: './toast.component.html',\n styleUrl: './toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-autoid]': 'autoId',\n '[attr.data-type]': 'data.type',\n '[attr.data-title]': 'data.title ?? null',\n '[attr.data-message]': 'dataMessage',\n },\n})\nexport class ToastComponent implements OnInit, OnDestroy {\n private notifyService = inject(SdNotifyService);\n private sanitizer = inject(DomSanitizer);\n\n @Input({ required: true }) data!: ToastData;\n\n readonly isExpanded = signal(false);\n readonly isClosing = signal(false);\n readonly hostClasses = computed(() => (this.isClosing() ? 'bg-white sd-toast sd-toast--closing' : 'bg-white sd-toast'));\n readonly MAX_SHOW = 2;\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private start = 0;\n private remaining = 0;\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n ngOnInit(): void {\n this.remaining = this.data.duration;\n this.resumeTimer();\n }\n\n ngOnDestroy(): void {\n this.clearAutoDismissTimer();\n this.clearCloseTimer();\n }\n\n @HostListener('mouseenter')\n pauseTimer(): void {\n if (!this.timer || this.isClosing()) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = null;\n this.remaining = Math.max(this.remaining - (Date.now() - this.start), 0);\n }\n\n @HostListener('mouseleave')\n resumeTimer(): void {\n if (this.remaining <= 0 || this.timer || this.isClosing()) {\n return;\n }\n\n this.start = Date.now();\n this.timer = setTimeout(() => {\n this.close();\n }, this.remaining);\n }\n\n close(): void {\n if (this.isClosing()) {\n return;\n }\n\n this.clearAutoDismissTimer();\n this.isClosing.set(true);\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n this.notifyService.remove(this.data.id);\n }, TOAST_EXIT_ANIMATION_MS);\n }\n\n onActionClick(): void {\n this.data.onAction?.();\n }\n\n toggleExpand(): void {\n this.isExpanded.update(v => !v);\n }\n\n sanitizeHtml(value: string): string {\n return this.sanitizer.sanitize(SecurityContext.HTML, value) ?? '';\n }\n\n get singleMessage(): string {\n return this.data.message as string;\n }\n\n get isMultiMessage(): boolean {\n return Array.isArray(this.data.message);\n }\n\n get messages(): string[] {\n return this.data.message as string[];\n }\n\n get displayMessages(): string[] {\n const msgs = this.messages;\n if (this.isExpanded()) return msgs;\n return msgs.slice(0, this.MAX_SHOW);\n }\n\n get restCount(): number {\n return this.messages.length - this.MAX_SHOW;\n }\n\n get hasMore(): boolean {\n return this.isMultiMessage && this.messages.length > this.MAX_SHOW;\n }\n\n get autoId(): string {\n return `services-notify-toast-${this.data.type}`;\n }\n\n get dataMessage(): string {\n return Array.isArray(this.data.message) ? this.data.message.join(' | ') : this.data.message;\n }\n\n private clearAutoDismissTimer(): void {\n if (!this.timer) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n private clearCloseTimer(): void {\n if (!this.closeTimer) {\n return;\n }\n\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n}\n","<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\n\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\n @switch (data.type) {\n @case ('success') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\n }\n @case ('info') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\n }\n @case ('warning') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n }\n }\n</div>\n\n<div class=\"sd-toast__content\">\n <div class=\"sd-toast__header\">\n <strong class=\"sd-toast__title\">{{ data.title || ('core.notify.type.' + data.type | translate) }}</strong>\n <button class=\"sd-toast__close\" (click)=\"close()\">&times;</button>\n </div>\n\n <div class=\"sd-toast__body\">\n @if (!isMultiMessage) {\n <!-- Text rendering is the default safe path; HTML is opt-in and sanitized. -->\n @if (data.html) {\n <div [innerHTML]=\"sanitizeHtml(singleMessage)\"></div>\n } @else {\n <div>{{ singleMessage }}</div>\n }\n } @else {\n <ul class=\"msg-list\">\n @for (msg of displayMessages; track msg) {\n @if (data.html) {\n <li [innerHTML]=\"sanitizeHtml('- ' + msg)\"></li>\n } @else {\n <li>{{ '- ' + msg }}</li>\n }\n }\n </ul>\n\n @if (hasMore) {\n <button\n type=\"button\"\n class=\"toggle-more btn-link\"\n [class]=\"'text-' + data.type\"\n (click)=\"toggleExpand()\">\n {{ isExpanded() ? ('core.notify.show-less' | translate) : ('core.notify.show-more' | translate: { count: restCount }) }}\n </button>\n }\n }\n </div>\n\n @if (data.actionLabel) {\n <div class=\"sd-toast__actions\">\n <button\n class=\"btn-action\"\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\n (click)=\"onActionClick()\">\n {{ data.actionLabel }}\n </button>\n </div>\n }\n</div>\n","import { Component, signal, WritableSignal } from '@angular/core';\nimport { ToastData } from '../notify.model';\nimport { ToastComponent } from './toast/toast.component';\n\n@Component({\n selector: 'toast-container',\n standalone: true,\n imports: [ToastComponent],\n template: `\n <div class=\"toast-container\">\n @for (toast of toasts(); track toast.id) {\n <toast [data]=\"toast\"> </toast>\n }\n </div>\n `,\n styles: [\n `\n .toast-container {\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n pointer-events: none; /* Cho phép click xuyên qua vùng trống */\n }\n sd-toast {\n pointer-events: auto; /* Bật lại click cho toast */\n }\n `,\n ],\n})\nexport class ToastContainerComponent {\n toasts: WritableSignal<ToastData[]> = signal([]);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { ApplicationRef, createComponent, EnvironmentInjector, inject, Injectable, signal } from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\n\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { ToastContainerComponent } from './components/toast-container.component';\nimport { NotifyOption, ToastData, ToastType } from './notify.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdNotifyService {\n readonly toasts = signal<ToastData[]>([]);\n\n // Constants\n readonly #DEBOUNCE_TIME = 500;\n readonly #DEFAULT_SUCCESS_DURATION = 3000;\n readonly #DEFAULT_BUFFERED_DURATION = 5000;\n readonly #MAX_TOASTS = 5;\n\n // State\n #buffer: Record<string, string[]> = {};\n #timers: Record<string, ReturnType<typeof setTimeout> | null> = {};\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n readonly #i18n = inject(I18nService);\n\n constructor() {\n this.#initContainer();\n }\n\n #initContainer() {\n const componentRef = createComponent(ToastContainerComponent, {\n environmentInjector: this.injector,\n });\n componentRef.instance.toasts = this.toasts;\n this.appRef.attachView(componentRef.hostView);\n const domElem = (componentRef.hostView as any).rootNodes[0] as HTMLElement;\n this.document.body.appendChild(domElem);\n }\n\n // Public API\n success(message: string, option?: NotifyOption) {\n this.#addImmediate('success', message, option);\n }\n\n info(message: string, option?: NotifyOption) {\n this.#addImmediate('info', message, option);\n }\n\n warning(message: string | string[], option?: NotifyOption) {\n this.#addToBuffer('warning', message, option);\n }\n\n error(message: string | string[], option?: NotifyOption) {\n this.#addToBuffer('error', message, option);\n }\n\n remove(id: string) {\n this.toasts.update(current => current.filter(t => t.id !== id));\n }\n\n clearAll() {\n this.toasts.set([]);\n this.#clearAllTimers();\n }\n\n clearByType(type: ToastType) {\n this.toasts.update(current => current.filter(t => t.type !== type));\n }\n\n // Private helpers\n #addImmediate(type: ToastType, message: string, option?: NotifyOption) {\n const newToast: ToastData = {\n id: Utilities.generateUuid(),\n type,\n message,\n title: option?.title,\n duration: option?.duration ?? this.#DEFAULT_SUCCESS_DURATION,\n actionLabel: option?.actionLabel,\n onAction: option?.onAction,\n html: option?.html,\n };\n\n this.toasts.update(current => {\n const updated = [newToast, ...current];\n return updated.slice(0, this.#MAX_TOASTS);\n });\n }\n\n #addToBuffer(type: ToastType, message: string | string[], option?: NotifyOption) {\n if (!this.#buffer[type]) {\n this.#buffer[type] = [];\n }\n\n const msgs = Array.isArray(message) ? message : [message];\n this.#buffer[type].push(...msgs);\n\n // Clear existing timer and set new one\n if (this.#timers[type]) {\n clearTimeout(this.#timers[type]!);\n }\n\n this.#timers[type] = setTimeout(() => {\n this.#flushBuffer(type, option);\n }, this.#DEBOUNCE_TIME);\n }\n\n #flushBuffer(type: ToastType, option?: NotifyOption) {\n const messages = [...new Set(this.#buffer[type])];\n\n // Cleanup\n this.#buffer[type] = [];\n this.#timers[type] = null;\n\n if (messages.length === 0) return;\n\n const title = option?.title ?? this.#i18n.t(`core.notify.type.${type}`);\n const finalTitle = messages.length > 1 ? `${title} (${messages.length})` : title;\n\n const newToast: ToastData = {\n id: Utilities.generateUuid(),\n type,\n message: messages.length === 1 ? messages[0] : messages,\n title: finalTitle,\n duration: option?.duration ?? this.#DEFAULT_BUFFERED_DURATION,\n actionLabel: option?.actionLabel,\n onAction: option?.onAction,\n html: option?.html,\n };\n\n this.toasts.update(current => {\n const updated = [newToast, ...current];\n return updated.slice(0, this.#MAX_TOASTS);\n });\n }\n\n #clearAllTimers() {\n Object.values(this.#timers).forEach(timer => {\n if (timer) clearTimeout(timer);\n });\n this.#timers = {};\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-services-notify.mjs","sources":["../../../projects/sdcorejs-angular/services/notify/src/components/toast/toast.component.ts","../../../projects/sdcorejs-angular/services/notify/src/components/toast/toast.component.html","../../../projects/sdcorejs-angular/services/notify/src/components/toast-container.component.ts","../../../projects/sdcorejs-angular/services/notify/src/notify.service.ts","../../../projects/sdcorejs-angular/services/notify/sdcorejs-angular-services-notify.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostListener,\n Input,\n OnDestroy,\n OnInit,\n SecurityContext,\n computed,\n signal,\n inject,\n} from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\nimport { ToastData } from '../../notify.model';\nimport { SdNotifyService } from '../../notify.service';\n\nconst TOAST_EXIT_ANIMATION_MS = 200;\n\n@Component({\n selector: 'toast',\n standalone: true,\n imports: [CommonModule, SdTranslatePipe],\n templateUrl: './toast.component.html',\n styleUrl: './toast.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-autoid]': 'autoId',\n '[attr.data-type]': 'data.type',\n '[attr.data-title]': 'data.title ?? null',\n '[attr.data-message]': 'dataMessage',\n },\n})\nexport class ToastComponent implements OnInit, OnDestroy {\n private notifyService = inject(SdNotifyService);\n private sanitizer = inject(DomSanitizer);\n\n @Input({ required: true }) data!: ToastData;\n\n readonly isExpanded = signal(false);\n readonly isClosing = signal(false);\n readonly hostClasses = computed(() => (this.isClosing() ? 'bg-white sd-toast sd-toast--closing' : 'bg-white sd-toast'));\n readonly MAX_SHOW = 2;\n\n private timer: ReturnType<typeof setTimeout> | null = null;\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\n private start = 0;\n private remaining = 0;\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() {}\n\n ngOnInit(): void {\n this.remaining = this.data.duration;\n this.resumeTimer();\n }\n\n ngOnDestroy(): void {\n this.clearAutoDismissTimer();\n this.clearCloseTimer();\n }\n\n @HostListener('mouseenter')\n pauseTimer(): void {\n if (!this.timer || this.isClosing()) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = null;\n this.remaining = Math.max(this.remaining - (Date.now() - this.start), 0);\n }\n\n @HostListener('mouseleave')\n resumeTimer(): void {\n if (this.remaining <= 0 || this.timer || this.isClosing()) {\n return;\n }\n\n this.start = Date.now();\n this.timer = setTimeout(() => {\n this.close();\n }, this.remaining);\n }\n\n close(): void {\n if (this.isClosing()) {\n return;\n }\n\n this.clearAutoDismissTimer();\n this.isClosing.set(true);\n this.closeTimer = setTimeout(() => {\n this.closeTimer = null;\n this.notifyService.remove(this.data.id);\n }, TOAST_EXIT_ANIMATION_MS);\n }\n\n onActionClick(): void {\n this.data.onAction?.();\n }\n\n toggleExpand(): void {\n this.isExpanded.update(v => !v);\n }\n\n sanitizeHtml(value: string): string {\n return this.sanitizer.sanitize(SecurityContext.HTML, value) ?? '';\n }\n\n get singleMessage(): string {\n return this.data.message as string;\n }\n\n get isMultiMessage(): boolean {\n return Array.isArray(this.data.message);\n }\n\n get messages(): string[] {\n return this.data.message as string[];\n }\n\n get displayMessages(): string[] {\n const msgs = this.messages;\n if (this.isExpanded()) return msgs;\n return msgs.slice(0, this.MAX_SHOW);\n }\n\n get restCount(): number {\n return this.messages.length - this.MAX_SHOW;\n }\n\n get hasMore(): boolean {\n return this.isMultiMessage && this.messages.length > this.MAX_SHOW;\n }\n\n get autoId(): string {\n return `services-notify-toast-${this.data.type}`;\n }\n\n get dataMessage(): string {\n return Array.isArray(this.data.message) ? this.data.message.join(' | ') : this.data.message;\n }\n\n private clearAutoDismissTimer(): void {\n if (!this.timer) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n private clearCloseTimer(): void {\n if (!this.closeTimer) {\n return;\n }\n\n clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n}\n","<div class=\"sd-toast__bar\" [class]=\"'bg-' + data.type\"></div>\n\n<div class=\"sd-toast__icon\" [class]=\"'text-' + data.type\">\n @switch (data.type) {\n @case ('success') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\n }\n @case ('info') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>\n }\n @case ('warning') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>\n }\n @case ('error') {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n }\n }\n</div>\n\n<div class=\"sd-toast__content\">\n <div class=\"sd-toast__header\">\n <strong class=\"sd-toast__title\">{{ data.title || ('core.notify.type.' + data.type | sdTranslate) }}</strong>\n <button class=\"sd-toast__close\" (click)=\"close()\">&times;</button>\n </div>\n\n <div class=\"sd-toast__body\">\n @if (!isMultiMessage) {\n <!-- Text rendering is the default safe path; HTML is opt-in and sanitized. -->\n @if (data.html) {\n <div [innerHTML]=\"sanitizeHtml(singleMessage)\"></div>\n } @else {\n <div>{{ singleMessage }}</div>\n }\n } @else {\n <ul class=\"msg-list\">\n @for (msg of displayMessages; track msg) {\n @if (data.html) {\n <li [innerHTML]=\"sanitizeHtml('- ' + msg)\"></li>\n } @else {\n <li>{{ '- ' + msg }}</li>\n }\n }\n </ul>\n\n @if (hasMore) {\n <button\n type=\"button\"\n class=\"toggle-more btn-link\"\n [class]=\"'text-' + data.type\"\n (click)=\"toggleExpand()\">\n {{ isExpanded() ? ('core.notify.show-less' | sdTranslate) : ('core.notify.show-more' | sdTranslate: { count: restCount }) }}\n </button>\n }\n }\n </div>\n\n @if (data.actionLabel) {\n <div class=\"sd-toast__actions\">\n <button\n class=\"btn-action\"\n [class]=\"'bg-' + data.type + '-light text-' + data.type\"\n (click)=\"onActionClick()\">\n {{ data.actionLabel }}\n </button>\n </div>\n }\n</div>\n","import { Component, signal, WritableSignal } from '@angular/core';\nimport { ToastData } from '../notify.model';\nimport { ToastComponent } from './toast/toast.component';\n\n@Component({\n selector: 'toast-container',\n standalone: true,\n imports: [ToastComponent],\n template: `\n <div class=\"toast-container\">\n @for (toast of toasts(); track toast.id) {\n <toast [data]=\"toast\"> </toast>\n }\n </div>\n `,\n styles: [\n `\n .toast-container {\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n pointer-events: none; /* Cho phép click xuyên qua vùng trống */\n }\n sd-toast {\n pointer-events: auto; /* Bật lại click cho toast */\n }\n `,\n ],\n})\nexport class ToastContainerComponent {\n toasts: WritableSignal<ToastData[]> = signal([]);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { ApplicationRef, ComponentRef, createComponent, DestroyRef, EnvironmentInjector, inject, Injectable, signal } from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\n\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { ToastContainerComponent } from './components/toast-container.component';\nimport { NotifyOption, ToastData, ToastType } from './notify.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdNotifyService {\n readonly toasts = signal<ToastData[]>([]);\n\n // Constants\n readonly #DEBOUNCE_TIME = 500;\n readonly #DEFAULT_SUCCESS_DURATION = 3000;\n readonly #DEFAULT_BUFFERED_DURATION = 5000;\n readonly #MAX_TOASTS = 5;\n\n // State\n #buffer: Record<string, string[]> = {};\n #timers: Record<string, ReturnType<typeof setTimeout> | null> = {};\n #containerRef?: ComponentRef<ToastContainerComponent>;\n #containerElement?: HTMLElement;\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly document = inject(DOCUMENT);\n readonly #destroyRef = inject(DestroyRef);\n readonly #i18n = inject(I18nService);\n /** Đặt trong `#teardown()` — mọi API public trở thành no-op sau khi injector bị destroy. */\n #destroyed = false;\n\n constructor() {\n this.#initContainer();\n // why: providedIn:'root' KHÔNG có nghĩa là sống mãi — root injector vẫn bị destroy\n // (TestBed reset, mỗi request khi SSR, micro-frontend unmount). Không có hook teardown thì\n // ComponentRef + node <body> ở lại vĩnh viễn và timer debounce đang chờ sẽ flush vào signal\n // của service đã chết → toast ma + leak view/DOM tích luỹ theo từng lần bootstrap.\n this.#destroyRef.onDestroy(() => this.#teardown());\n }\n\n #initContainer() {\n const componentRef = createComponent(ToastContainerComponent, {\n environmentInjector: this.injector,\n });\n componentRef.instance.toasts = this.toasts;\n this.appRef.attachView(componentRef.hostView);\n const domElem = (componentRef.hostView as any).rootNodes[0] as HTMLElement;\n this.document.body.appendChild(domElem);\n this.#containerRef = componentRef;\n this.#containerElement = domElem;\n }\n\n #teardown() {\n // why: cờ này chặn MỌI lời gọi sau teardown. Chỉ dọn timer đang chờ là chưa đủ: một\n // `error()`/`warning()` gọi sau khi injector đã destroy vẫn chạy `#addToBuffer` và hẹn một\n // timer 500ms MỚI mà không còn ai clear — nó flush vào signal của service đã chết.\n this.#destroyed = true;\n // why: dọn timer TRƯỚC khi huỷ view — flush chạy sau khi container đã destroy sẽ\n // update signal mà không còn ai render, thuần tuý là công vô ích trên state đã chết.\n this.#clearAllTimers();\n this.#buffer = {};\n\n const componentRef = this.#containerRef;\n const containerElement = this.#containerElement;\n this.#containerRef = undefined;\n this.#containerElement = undefined;\n\n // why: hook destroy của service chạy SAU ApplicationRef.destroy() khi root injector bị tháo\n // (hook đăng ký theo thứ tự khởi tạo, mà appRef luôn có trước). Lúc đó view đã bị huỷ và\n // detachView chỉ log NG0406 — nên chỉ detach khi appRef còn sống.\n if (componentRef && !this.appRef.destroyed && !componentRef.hostView.destroyed) {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n // why: createComponent() tạo host node rời rồi ta tự appendChild, nên destroy() không\n // bảo đảm gỡ node khỏi <body> — gỡ tay để không để lại rác DOM. remove() an toàn khi\n // node đã bị tách.\n containerElement?.remove();\n }\n\n // Public API\n success(message: string, option?: NotifyOption) {\n this.#addImmediate('success', message, option);\n }\n\n info(message: string, option?: NotifyOption) {\n this.#addImmediate('info', message, option);\n }\n\n warning(message: string | string[], option?: NotifyOption) {\n this.#addToBuffer('warning', message, option);\n }\n\n error(message: string | string[], option?: NotifyOption) {\n this.#addToBuffer('error', message, option);\n }\n\n remove(id: string) {\n this.toasts.update(current => current.filter(t => t.id !== id));\n }\n\n clearAll() {\n this.toasts.set([]);\n this.#clearAllTimers();\n }\n\n clearByType(type: ToastType) {\n this.toasts.update(current => current.filter(t => t.type !== type));\n }\n\n // Private helpers\n #addImmediate(type: ToastType, message: string, option?: NotifyOption) {\n if (this.#destroyed) return;\n const newToast: ToastData = {\n id: Utilities.generateUuid(),\n type,\n message,\n title: option?.title,\n duration: option?.duration ?? this.#DEFAULT_SUCCESS_DURATION,\n actionLabel: option?.actionLabel,\n onAction: option?.onAction,\n html: option?.html,\n };\n\n this.toasts.update(current => {\n const updated = [newToast, ...current];\n return updated.slice(0, this.#MAX_TOASTS);\n });\n }\n\n #addToBuffer(type: ToastType, message: string | string[], option?: NotifyOption) {\n if (this.#destroyed) return;\n if (!this.#buffer[type]) {\n this.#buffer[type] = [];\n }\n\n const msgs = Array.isArray(message) ? message : [message];\n this.#buffer[type].push(...msgs);\n\n // Clear existing timer and set new one\n if (this.#timers[type]) {\n clearTimeout(this.#timers[type]!);\n }\n\n this.#timers[type] = setTimeout(() => {\n this.#flushBuffer(type, option);\n }, this.#DEBOUNCE_TIME);\n }\n\n #flushBuffer(type: ToastType, option?: NotifyOption) {\n const messages = [...new Set(this.#buffer[type])];\n\n // Cleanup\n this.#buffer[type] = [];\n this.#timers[type] = null;\n\n if (messages.length === 0) return;\n\n const title = option?.title ?? this.#i18n.t(`core.notify.type.${type}`);\n const finalTitle = messages.length > 1 ? `${title} (${messages.length})` : title;\n\n const newToast: ToastData = {\n id: Utilities.generateUuid(),\n type,\n message: messages.length === 1 ? messages[0] : messages,\n title: finalTitle,\n duration: option?.duration ?? this.#DEFAULT_BUFFERED_DURATION,\n actionLabel: option?.actionLabel,\n onAction: option?.onAction,\n html: option?.html,\n };\n\n this.toasts.update(current => {\n const updated = [newToast, ...current];\n return updated.slice(0, this.#MAX_TOASTS);\n });\n }\n\n #clearAllTimers() {\n Object.values(this.#timers).forEach(timer => {\n if (timer) clearTimeout(timer);\n });\n this.#timers = {};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAmBA,MAAM,uBAAuB,GAAG,GAAG;MAiBtB,cAAc,CAAA;AACjB,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAEb,IAAA,IAAI;AAEtB,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,WAAW,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,qCAAqC,GAAG,mBAAmB,CAAC,CAAC;IAC9G,QAAQ,GAAG,CAAC;IAEb,KAAK,GAAyC,IAAI;IAClD,UAAU,GAAyC,IAAI;IACvD,KAAK,GAAG,CAAC;IACT,SAAS,GAAG,CAAC;AAKrB,IAAA,WAAA,GAAA,EAAe;IAEf,QAAQ,GAAA;QACN,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ;QACnC,IAAI,CAAC,WAAW,EAAE;IACpB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,eAAe,EAAE;IACxB;IAGA,UAAU,GAAA;QACR,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACnC;QACF;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACzD;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAK;YAC3B,IAAI,CAAC,KAAK,EAAE;AACd,QAAA,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;IACpB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB;QACF;QAEA,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,MAAK;AAChC,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;YACtB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,CAAC,EAAE,uBAAuB,CAAC;IAC7B;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI;IACxB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;IACnE;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAiB;IACpC;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACzC;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAmB;IACtC;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;QAC1B,IAAI,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,IAAI;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;IACrC;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;IAC7C;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;IACpE;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,yBAAyB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IAClD;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO;IAC7F;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf;QACF;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;IACnB;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB;QACF;AAEA,QAAA,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;wGAjIW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,eAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpC3B,s8EAmEA,EAAA,MAAA,EAAA,CAAA,+tDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3CY,YAAY,0BAAE,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAY5B,cAAc,EAAA,UAAA,EAAA,CAAA;kBAf1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,OAAO,EAAA,UAAA,EACL,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,CAAC,EAAA,eAAA,EAGvB,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,oBAAoB,EAAE,QAAQ;AAC9B,wBAAA,kBAAkB,EAAE,WAAW;AAC/B,wBAAA,mBAAmB,EAAE,oBAAoB;AACzC,wBAAA,qBAAqB,EAAE,aAAa;AACrC,qBAAA,EAAA,QAAA,EAAA,s8EAAA,EAAA,MAAA,EAAA,CAAA,+tDAAA,CAAA,EAAA;wDAM0B,IAAI,EAAA,CAAA;sBAA9B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBA4BzB,UAAU,EAAA,CAAA;sBADT,YAAY;uBAAC,YAAY;gBAY1B,WAAW,EAAA,CAAA;sBADV,YAAY;uBAAC,YAAY;;;ME9Cf,uBAAuB,CAAA;AAClC,IAAA,MAAM,GAAgC,MAAM,CAAC,EAAE,CAAC;wGADrC,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxBxB;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,yJAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAPS,cAAc,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAyBb,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA5BnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,cAAc,CAAC,EAAA,QAAA,EACf;;;;;;AAMT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,yJAAA,CAAA,EAAA;;;MCFU,eAAe,CAAA;AACjB,IAAA,MAAM,GAAG,MAAM,CAAc,EAAE,CAAC;;IAGhC,cAAc,GAAG,GAAG;IACpB,yBAAyB,GAAG,IAAI;IAChC,0BAA0B,GAAG,IAAI;IACjC,WAAW,GAAG,CAAC;;IAGxB,OAAO,GAA6B,EAAE;IACtC,OAAO,GAAyD,EAAE;AAClE,IAAA,aAAa;AACb,IAAA,iBAAiB;AACA,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;;IAEpC,UAAU,GAAG,KAAK;AAElB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,cAAc,EAAE;;;;;AAKrB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACpD;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,uBAAuB,EAAE;YAC5D,mBAAmB,EAAE,IAAI,CAAC,QAAQ;AACnC,SAAA,CAAC;QACF,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;QAC1C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC7C,MAAM,OAAO,GAAI,YAAY,CAAC,QAAgB,CAAC,SAAS,CAAC,CAAC,CAAgB;QAC1E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;AACjC,QAAA,IAAI,CAAC,iBAAiB,GAAG,OAAO;IAClC;IAEA,SAAS,GAAA;;;;AAIP,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;;QAGtB,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AAEjB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa;AACvC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB;AAC/C,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;;;;AAKlC,QAAA,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE;YAC9E,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC7C,YAAY,CAAC,OAAO,EAAE;QACxB;;;;QAIA,gBAAgB,EAAE,MAAM,EAAE;IAC5B;;IAGA,OAAO,CAAC,OAAe,EAAE,MAAqB,EAAA;QAC5C,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;IAChD;IAEA,IAAI,CAAC,OAAe,EAAE,MAAqB,EAAA;QACzC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IAC7C;IAEA,OAAO,CAAC,OAA0B,EAAE,MAAqB,EAAA;QACvD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;IAC/C;IAEA,KAAK,CAAC,OAA0B,EAAE,MAAqB,EAAA;QACrD,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IAC7C;AAEA,IAAA,MAAM,CAAC,EAAU,EAAA;QACf,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,WAAW,CAAC,IAAe,EAAA;QACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrE;;AAGA,IAAA,aAAa,CAAC,IAAe,EAAE,OAAe,EAAE,MAAqB,EAAA;QACnE,IAAI,IAAI,CAAC,UAAU;YAAE;AACrB,QAAA,MAAM,QAAQ,GAAc;AAC1B,YAAA,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE;YAC5B,IAAI;YACJ,OAAO;YACP,KAAK,EAAE,MAAM,EAAE,KAAK;AACpB,YAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,yBAAyB;YAC5D,WAAW,EAAE,MAAM,EAAE,WAAW;YAChC,QAAQ,EAAE,MAAM,EAAE,QAAQ;YAC1B,IAAI,EAAE,MAAM,EAAE,IAAI;SACnB;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAG;YAC3B,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC;YACtC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,YAAY,CAAC,IAAe,EAAE,OAA0B,EAAE,MAAqB,EAAA;QAC7E,IAAI,IAAI,CAAC,UAAU;YAAE;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;QACzB;AAEA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;;AAGhC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACtB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;QACnC;QAEA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAK;AACnC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;AACjC,QAAA,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC;IACzB;IAEA,YAAY,CAAC,IAAe,EAAE,MAAqB,EAAA;AACjD,QAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;AAGjD,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;AAEzB,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;AAE3B,QAAA,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE,CAAC;QACvE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAC,MAAM,GAAG,GAAG,KAAK;AAEhF,QAAA,MAAM,QAAQ,GAAc;AAC1B,YAAA,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE;YAC5B,IAAI;AACJ,YAAA,OAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ;AACvD,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,0BAA0B;YAC7D,WAAW,EAAE,MAAM,EAAE,WAAW;YAChC,QAAQ,EAAE,MAAM,EAAE,QAAQ;YAC1B,IAAI,EAAE,MAAM,EAAE,IAAI;SACnB;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAG;YAC3B,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC;YACtC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,IAAG;AAC1C,YAAA,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC;AAChC,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;IACnB;wGA9KW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACXD;;AAEG;;;;"}
@@ -130,6 +130,10 @@ class SdStorageService {
130
130
  const identityCanonicalizer = option.identityCanonicalizer ?? this.#configuration?.identityCanonicalizer ?? this.#defaultIdentityCanonicalizer;
131
131
  const canonicalKey = canonicalizeSdPersistenceValue(identityCanonicalizer, key, 'storage key');
132
132
  const legacyStorageKey = this.#legacyStorageKey(key);
133
+ // why: KHÔNG có namespace mặc định. Một hằng số dùng chung cho cả thư viện (vd `'sdcorejs'`) không
134
+ // tách được hai app chung origin — cả hai đều nhận đúng hằng số đó nên vẫn va nhau y như cũ — mà
135
+ // lại đổi identity của MỌI handle đang chạy, khiến dữ liệu đã persist bị bỏ rơi khi nâng cấp.
136
+ // Tách partition là việc của app: khai báo `namespace` per-handle hoặc qua `SD_STORAGE_CONFIG`.
133
137
  const namespace = option.namespace ?? this.#configuration?.namespace;
134
138
  const version = option.version ?? this.#configuration?.version;
135
139
  const area = option.type ?? 'local';
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services-storage.mjs","sources":["../../../projects/sdcorejs-angular/services/storage/src/storage.model.ts","../../../projects/sdcorejs-angular/services/storage/src/storage.service.ts","../../../projects/sdcorejs-angular/services/storage/sdcorejs-angular-services-storage.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { SdPersistenceIdentityCanonicalizer, SdPersistenceSerializer } from '@sdcorejs/angular/services/persistence';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport interface SdStorageOption<T = unknown> {\n type?: 'local' | 'session';\n default?: T;\n args?: Readonly<Record<string, unknown>>;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n}\n\nexport interface SdStorage<T = unknown> {\n get: () => T | undefined;\n set: (data: T) => void;\n setSilent: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n destroy: () => void;\n subject: BehaviorSubject<T | undefined>;\n observer: Observable<T | undefined>;\n}\n\nexport interface SdStorageWithDefault<T> extends Omit<SdStorage<T>, 'get' | 'subject' | 'observer'> {\n get: () => T;\n subject: BehaviorSubject<T>;\n observer: Observable<T>;\n}\n\nexport interface ISdStorageConfiguration {\n key?: (key: string) => string;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n}\n\nexport const SD_STORAGE_CONFIG = new InjectionToken<ISdStorageConfiguration>('storage.configuration');\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport {\n SD_PERSISTENCE_STORAGE_ADAPTER,\n SdGraphIdentityCanonicalizer,\n SdGraphSerializer,\n SdPersistenceIdentityCanonicalizer,\n SdPersistenceSerializer,\n SdPersistenceStorageArea,\n buildSdPersistenceKey,\n canonicalizeSdPersistenceValue,\n digestSdPersistenceKey,\n parseSdPersistenceEnvelope,\n readSdPersistenceStorageItem,\n stringifySdPersistenceTombstoneEnvelope,\n stringifySdPersistenceValueEnvelope,\n} from '@sdcorejs/angular/services/persistence';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { BehaviorSubject } from 'rxjs';\nimport { SD_STORAGE_CONFIG, SdStorage, SdStorageOption, SdStorageWithDefault } from './storage.model';\n\ninterface StorageEntry {\n data: unknown;\n createdOn: Date;\n}\n\ntype StorageEntryRead = { status: 'found'; entry: StorageEntry } | { status: 'absent' } | { status: 'unavailable' };\n\ninterface StorageHandleFacade {\n emit: (present: boolean, value: unknown) => void;\n complete: () => void;\n}\n\ninterface StorageState {\n entry?: StorageEntry;\n hydrated: boolean;\n handles: Set<StorageHandleFacade>;\n disposed: boolean;\n}\n\ninterface NormalizedStorageOption {\n area: SdPersistenceStorageArea;\n storageKey: string;\n legacyStorageKey?: string;\n ownerDigest: string;\n identityDigest: string;\n serializer: SdPersistenceSerializer;\n}\n\ninterface StorageHandleOperations<T> {\n get: () => T | undefined;\n set: (data: T) => void;\n setSilent: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n destroy: () => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdStorageService {\n readonly #configuration = inject(SD_STORAGE_CONFIG, { optional: true });\n readonly #adapter = inject(SD_PERSISTENCE_STORAGE_ADAPTER);\n readonly #destroyRef = inject(DestroyRef);\n readonly #defaultSerializer = new SdGraphSerializer();\n readonly #defaultIdentityCanonicalizer = new SdGraphIdentityCanonicalizer();\n readonly #states = new Map<string, StorageState>();\n readonly #failedOwners = new Map<string, true>();\n readonly #maxFailedOwners = 256;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n for (const state of this.#states.values()) {\n state.disposed = true;\n state.entry = undefined;\n for (const handle of state.handles) handle.complete();\n state.handles.clear();\n }\n this.#states.clear();\n this.#failedOwners.clear();\n });\n }\n\n create<T>(key: string | object, option: SdStorageOption<T> & { default: T }): SdStorageWithDefault<T>;\n create<T = unknown>(key: string | object, option?: SdStorageOption<unknown>): SdStorage<T>;\n create<T = unknown>(key: string | object, option: SdStorageOption<T> = {}): SdStorage<T> | SdStorageWithDefault<T> {\n if (this.#destroyed) throw new Error('Storage service has been destroyed');\n if (!key) throw new Error('Key is required');\n const normalized = this.#normalize(key, option);\n const state = this.#getOrCreateState(normalized);\n if (Object.prototype.hasOwnProperty.call(option, 'default')) {\n return this.#createDefaultHandle(state, normalized, this.#cloneAs<T>(normalized.serializer, option.default));\n }\n return this.#createOptionalHandle<T>(state, normalized);\n }\n\n #getOrCreateState(normalized: NormalizedStorageOption): StorageState {\n const existing = this.#states.get(normalized.ownerDigest);\n if (existing) return existing;\n const state: StorageState = {\n hydrated: false,\n handles: new Set<StorageHandleFacade>(),\n disposed: false,\n };\n this.#states.set(normalized.ownerDigest, state);\n this.#hydrateState(state, normalized);\n return state;\n }\n\n #createOptionalHandle<T>(state: StorageState, normalized: NormalizedStorageOption): SdStorage<T> {\n const read = (): T | undefined => this.#readOptional<T>(state, normalized);\n const subject = new BehaviorSubject<T | undefined>(read());\n const facade: StorageHandleFacade = {\n emit: (present, value) => subject.next(present ? this.#cloneAs<T>(normalized.serializer, value) : undefined),\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, read);\n return { ...operations, subject, observer: subject.asObservable() };\n }\n\n #createDefaultHandle<T>(state: StorageState, normalized: NormalizedStorageOption, defaultSnapshot: T): SdStorageWithDefault<T> {\n const read = (): T => this.#readWithDefault(state, normalized, defaultSnapshot);\n const subject = new BehaviorSubject<T>(read());\n const facade: StorageHandleFacade = {\n emit: (present, value) => {\n const next = present ? this.#cloneAs<T>(normalized.serializer, value) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot);\n subject.next(this.#cloneAs<T>(normalized.serializer, next));\n },\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, read);\n return { ...operations, get: read, subject, observer: subject.asObservable() };\n }\n\n #attachHandle<T>(\n state: StorageState,\n normalized: NormalizedStorageOption,\n facade: StorageHandleFacade,\n read: () => T | undefined\n ): StorageHandleOperations<T> {\n state.handles.add(facade);\n let active = true;\n const assertActive = (): void => {\n if (!active || state.disposed || this.#destroyed) throw new Error('Storage handle has been destroyed');\n };\n const get = (): T | undefined => {\n assertActive();\n return read();\n };\n const write = (data: T, emit: boolean): void => {\n assertActive();\n const entry: StorageEntry = { data: normalized.serializer.clone(data), createdOn: new Date() };\n state.entry = entry;\n state.hydrated = true;\n this.#writePersistent(normalized, entry);\n if (emit) this.#broadcast(state);\n };\n const set = (data: T): void => write(data, true);\n const setSilent = (data: T): void => write(data, false);\n const has = (): boolean => {\n assertActive();\n return this.#ensureEntry(state, normalized) !== undefined;\n };\n const remove = (): void => {\n assertActive();\n state.entry = undefined;\n state.hydrated = true;\n this.#writeTombstone(normalized);\n this.#broadcast(state);\n };\n const destroy = (): void => {\n if (!active) return;\n active = false;\n state.handles.delete(facade);\n facade.complete();\n if (state.handles.size > 0) return;\n state.disposed = true;\n state.entry = undefined;\n this.#states.delete(normalized.ownerDigest);\n };\n return { get, set, setSilent, has, remove, destroy };\n }\n\n #normalize<T>(key: string | object, option: SdStorageOption<T>): NormalizedStorageOption {\n const serializer = option.serializer ?? this.#configuration?.serializer ?? this.#defaultSerializer;\n const identityCanonicalizer =\n option.identityCanonicalizer ?? this.#configuration?.identityCanonicalizer ?? this.#defaultIdentityCanonicalizer;\n const canonicalKey = canonicalizeSdPersistenceValue(identityCanonicalizer, key, 'storage key');\n const legacyStorageKey = this.#legacyStorageKey(key);\n const namespace = option.namespace ?? this.#configuration?.namespace;\n const version = option.version ?? this.#configuration?.version;\n const area = option.type ?? 'local';\n const serializerFormat = this.#serializerFormat(serializer);\n const hasArgs = Object.prototype.hasOwnProperty.call(option, 'args');\n const hasDefault = Object.prototype.hasOwnProperty.call(option, 'default');\n const fields = [\n { tag: 'area', value: canonicalizeSdPersistenceValue(identityCanonicalizer, area, 'storage area') },\n { tag: 'namespace', value: this.#optionalIdentity(identityCanonicalizer, namespace !== undefined, namespace, 'storage namespace') },\n { tag: 'version', value: this.#optionalIdentity(identityCanonicalizer, version !== undefined, version, 'storage version') },\n { tag: 'args', value: this.#optionalIdentity(identityCanonicalizer, hasArgs, option.args, 'storage args') },\n { tag: 'default', value: this.#optionalIdentity(identityCanonicalizer, hasDefault, option.default, 'storage default') },\n { tag: 'serializer', value: serializerFormat },\n { tag: 'identityCanonicalizer', value: this.#identityCanonicalizerFormat(identityCanonicalizer) },\n ];\n const identity = buildSdPersistenceKey(canonicalKey, fields);\n const identityDigest = digestSdPersistenceKey(identity);\n const storageKey = this.#convertKey(`sdcorejs.storage@1:${identityDigest}`);\n const ownerDigest = digestSdPersistenceKey(buildSdPersistenceKey(storageKey, [{ tag: 'area', value: area }]));\n return {\n area,\n storageKey,\n legacyStorageKey,\n ownerDigest,\n identityDigest,\n serializer,\n };\n }\n\n #convertKey(baseKey: string): string {\n try {\n return this.#configuration?.key?.(baseKey) ?? baseKey;\n } catch {\n return baseKey;\n }\n }\n\n #legacyStorageKey(key: string | object): string | undefined {\n try {\n return this.#convertKey(typeof key === 'string' ? key : Utilities.hash(key));\n } catch {\n return undefined;\n }\n }\n\n #optionalIdentity(canonicalizer: SdPersistenceIdentityCanonicalizer, present: boolean, value: unknown, label: string): string {\n return present ? `1${canonicalizeSdPersistenceValue(canonicalizer, value, label)}` : '0';\n }\n\n #identityCanonicalizerFormat(canonicalizer: SdPersistenceIdentityCanonicalizer): string {\n if (typeof canonicalizer.format !== 'string' || canonicalizer.format.length === 0) {\n throw new Error('Persistence identity canonicalizer format must be a non-empty string');\n }\n return canonicalizer.format;\n }\n\n #serializerFormat(serializer: SdPersistenceSerializer): string {\n if (typeof serializer.format !== 'string' || serializer.format.length === 0) {\n throw new Error('Persistence serializer format must be a non-empty string');\n }\n return serializer.format;\n }\n\n #readOptional<T>(state: StorageState, normalized: NormalizedStorageOption): T | undefined {\n const entry = this.#ensureEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : undefined;\n }\n\n #readWithDefault<T>(state: StorageState, normalized: NormalizedStorageOption, defaultSnapshot: T): T {\n const entry = this.#ensureEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot);\n }\n\n #ensureEntry(state: StorageState, normalized: NormalizedStorageOption): StorageEntry | undefined {\n if (!state.hydrated) {\n this.#hydrateState(state, normalized);\n }\n return state.entry;\n }\n\n #hydrateState(state: StorageState, normalized: NormalizedStorageOption): void {\n const read = this.#readEntry(normalized);\n state.entry = read.status === 'found' ? read.entry : undefined;\n state.hydrated = read.status !== 'unavailable';\n }\n\n #broadcast(state: StorageState): void {\n const present = state.entry !== undefined;\n const value = state.entry?.data;\n for (const handle of state.handles) handle.emit(present, value);\n }\n\n #readEntry(normalized: NormalizedStorageOption): StorageEntryRead {\n if (this.#failedOwners.has(normalized.ownerDigest)) return { status: 'unavailable' };\n const primary = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.storageKey);\n if (primary.status === 'found') {\n let envelope: ReturnType<typeof parseSdPersistenceEnvelope>;\n try {\n envelope = parseSdPersistenceEnvelope(primary.value, normalized.identityDigest, normalized.serializer.format);\n } catch {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (envelope?.kind === 'tombstone') return { status: 'absent' };\n const entry = envelope?.kind === 'value' ? this.#parseCurrentEntry(envelope.payload, normalized.serializer) : undefined;\n if (entry) return { status: 'found', entry };\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (primary.status === 'unavailable') return { status: 'unavailable' };\n if (normalized.legacyStorageKey === undefined) return { status: 'absent' };\n const legacyRead = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.legacyStorageKey);\n if (legacyRead.status === 'unavailable') return { status: 'unavailable' };\n if (legacyRead.status === 'absent') return { status: 'absent' };\n const legacy = this.#parseLegacy(legacyRead.value);\n if (!legacy) {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n this.#writePersistent(normalized, legacy);\n return { status: 'found', entry: legacy };\n }\n\n #parseCurrentEntry(payload: string, serializer: SdPersistenceSerializer): StorageEntry | undefined {\n try {\n return this.#validateEntry(serializer.parse<unknown>(payload));\n } catch {\n return undefined;\n }\n }\n\n #parseLegacy(raw: string): StorageEntry | undefined {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!this.#hasExactEntryKeys(parsed)) return undefined;\n const createdOn = this.#toValidDate(parsed['createdOn']);\n return createdOn ? { data: parsed['data'], createdOn } : undefined;\n } catch {\n return undefined;\n }\n }\n\n #validateEntry(value: unknown): StorageEntry | undefined {\n if (!this.#hasExactEntryKeys(value)) return undefined;\n const createdOn = this.#toValidDate(value['createdOn']);\n return createdOn ? { data: value['data'], createdOn } : undefined;\n }\n\n #toValidDate(value: unknown): Date | undefined {\n const date = value instanceof Date ? value : typeof value === 'string' || typeof value === 'number' ? new Date(value) : undefined;\n return date && Number.isFinite(date.getTime()) ? date : undefined;\n }\n\n #writePersistent(normalized: NormalizedStorageOption, entry: StorageEntry): boolean {\n try {\n const payload = normalized.serializer.stringify(entry);\n if (\n this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceValueEnvelope(normalized.identityDigest, normalized.serializer.format, payload)\n )\n ) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n } catch {\n // Fall through to canonical quarantine.\n }\n this.#safeRemove(normalized.area, normalized.storageKey);\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return false;\n }\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #safeRemove(area: SdPersistenceStorageArea, key: string): boolean {\n try {\n return this.#adapter.removeItem(area, key);\n } catch {\n return false;\n }\n }\n\n #writeTombstone(normalized: NormalizedStorageOption): boolean {\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n this.#safeRemove(normalized.area, normalized.storageKey);\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #tryPersistTombstone(normalized: NormalizedStorageOption): boolean {\n try {\n return this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceTombstoneEnvelope(normalized.identityDigest, normalized.serializer.format)\n );\n } catch {\n return false;\n }\n }\n\n #clearFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n }\n\n #recordFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n this.#failedOwners.set(ownerDigest, true);\n if (this.#failedOwners.size <= this.#maxFailedOwners) return;\n const oldest = this.#failedOwners.keys().next().value;\n if (oldest !== undefined) this.#failedOwners.delete(oldest);\n }\n\n #cloneAs<T>(serializer: SdPersistenceSerializer, value: unknown): T {\n const entry = serializer.parse<{ data: T; createdOn: Date }>(serializer.stringify({ data: value, createdOn: new Date(0) }));\n return entry.data;\n }\n\n #isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n #hasExactEntryKeys(value: unknown): value is Record<string, unknown> {\n return (\n this.#isRecord(value) &&\n Reflect.ownKeys(value).length === 2 &&\n Object.prototype.hasOwnProperty.call(value, 'data') &&\n Object.prototype.hasOwnProperty.call(value, 'createdOn')\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAuCa,iBAAiB,GAAG,IAAI,cAAc,CAA0B,uBAAuB;;MCmBvF,gBAAgB,CAAA;IAClB,cAAc,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9D,IAAA,QAAQ,GAAG,MAAM,CAAC,8BAA8B,CAAC;AACjD,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,kBAAkB,GAAG,IAAI,iBAAiB,EAAE;AAC5C,IAAA,6BAA6B,GAAG,IAAI,4BAA4B,EAAE;AAClE,IAAA,OAAO,GAAG,IAAI,GAAG,EAAwB;AACzC,IAAA,aAAa,GAAG,IAAI,GAAG,EAAgB;IACvC,gBAAgB,GAAG,GAAG;IAC/B,UAAU,GAAG,KAAK;AAElB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;YACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;AACzC,gBAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,gBAAA,KAAK,CAAC,KAAK,GAAG,SAAS;AACvB,gBAAA,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;oBAAE,MAAM,CAAC,QAAQ,EAAE;AACrD,gBAAA,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;YACvB;AACA,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ;AAIA,IAAA,MAAM,CAAc,GAAoB,EAAE,MAAA,GAA6B,EAAE,EAAA;QACvE,IAAI,IAAI,CAAC,UAAU;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;AAC1E,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AAChD,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;YAC3D,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9G;QACA,OAAO,IAAI,CAAC,qBAAqB,CAAI,KAAK,EAAE,UAAU,CAAC;IACzD;AAEA,IAAA,iBAAiB,CAAC,UAAmC,EAAA;AACnD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;AACzD,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;AAC7B,QAAA,MAAM,KAAK,GAAiB;AAC1B,YAAA,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,IAAI,GAAG,EAAuB;AACvC,YAAA,QAAQ,EAAE,KAAK;SAChB;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC;AAC/C,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC;AACrC,QAAA,OAAO,KAAK;IACd;IAEA,qBAAqB,CAAI,KAAmB,EAAE,UAAmC,EAAA;AAC/E,QAAA,MAAM,IAAI,GAAG,MAAqB,IAAI,CAAC,aAAa,CAAI,KAAK,EAAE,UAAU,CAAC;QAC1E,MAAM,OAAO,GAAG,IAAI,eAAe,CAAgB,IAAI,EAAE,CAAC;AAC1D,QAAA,MAAM,MAAM,GAAwB;AAClC,YAAA,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;AAC5G,YAAA,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE;SACnC;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC;AACtE,QAAA,OAAO,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;IACrE;AAEA,IAAA,oBAAoB,CAAI,KAAmB,EAAE,UAAmC,EAAE,eAAkB,EAAA;AAClG,QAAA,MAAM,IAAI,GAAG,MAAS,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,eAAe,CAAI,IAAI,EAAE,CAAC;AAC9C,QAAA,MAAM,MAAM,GAAwB;AAClC,YAAA,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,KAAI;AACvB,gBAAA,MAAM,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,eAAe,CAAC;AAChI,gBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;AACD,YAAA,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE;SACnC;AACD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC;AACtE,QAAA,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;IAChF;AAEA,IAAA,aAAa,CACX,KAAmB,EACnB,UAAmC,EACnC,MAA2B,EAC3B,IAAyB,EAAA;AAEzB,QAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,MAAM,GAAG,IAAI;QACjB,MAAM,YAAY,GAAG,MAAW;YAC9B,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU;AAAE,gBAAA,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;AACxG,QAAA,CAAC;QACD,MAAM,GAAG,GAAG,MAAoB;AAC9B,YAAA,YAAY,EAAE;YACd,OAAO,IAAI,EAAE;AACf,QAAA,CAAC;AACD,QAAA,MAAM,KAAK,GAAG,CAAC,IAAO,EAAE,IAAa,KAAU;AAC7C,YAAA,YAAY,EAAE;YACd,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;AAC9F,YAAA,KAAK,CAAC,KAAK,GAAG,KAAK;AACnB,YAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC;AACxC,YAAA,IAAI,IAAI;AAAE,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAClC,QAAA,CAAC;AACD,QAAA,MAAM,GAAG,GAAG,CAAC,IAAO,KAAW,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAChD,QAAA,MAAM,SAAS,GAAG,CAAC,IAAO,KAAW,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QACvD,MAAM,GAAG,GAAG,MAAc;AACxB,YAAA,YAAY,EAAE;YACd,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,SAAS;AAC3D,QAAA,CAAC;QACD,MAAM,MAAM,GAAG,MAAW;AACxB,YAAA,YAAY,EAAE;AACd,YAAA,KAAK,CAAC,KAAK,GAAG,SAAS;AACvB,YAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACxB,QAAA,CAAC;QACD,MAAM,OAAO,GAAG,MAAW;AACzB,YAAA,IAAI,CAAC,MAAM;gBAAE;YACb,MAAM,GAAG,KAAK;AACd,YAAA,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5B,MAAM,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;gBAAE;AAC5B,YAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;AACrB,YAAA,KAAK,CAAC,KAAK,GAAG,SAAS;YACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;AAC7C,QAAA,CAAC;AACD,QAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IACtD;IAEA,UAAU,CAAI,GAAoB,EAAE,MAA0B,EAAA;AAC5D,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE,UAAU,IAAI,IAAI,CAAC,kBAAkB;AAClG,QAAA,MAAM,qBAAqB,GACzB,MAAM,CAAC,qBAAqB,IAAI,IAAI,CAAC,cAAc,EAAE,qBAAqB,IAAI,IAAI,CAAC,6BAA6B;QAClH,MAAM,YAAY,GAAG,8BAA8B,CAAC,qBAAqB,EAAE,GAAG,EAAE,aAAa,CAAC;QAC9F,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,EAAE,SAAS;QACpE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO;AAC9D,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,OAAO;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC;AAC3D,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACpE,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AAC1E,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B,CAAC,qBAAqB,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE;YACnG,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,SAAS,KAAK,SAAS,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE;YACnI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,OAAO,KAAK,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE;YAC3H,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE;YAC3G,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE;AACvH,YAAA,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE;AAC9C,YAAA,EAAE,GAAG,EAAE,uBAAuB,EAAE,KAAK,EAAE,IAAI,CAAC,4BAA4B,CAAC,qBAAqB,CAAC,EAAE;SAClG;QACD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,YAAY,EAAE,MAAM,CAAC;AAC5D,QAAA,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,CAAA,mBAAA,EAAsB,cAAc,CAAA,CAAE,CAAC;QAC3E,MAAM,WAAW,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7G,OAAO;YACL,IAAI;YACJ,UAAU;YACV,gBAAgB;YAChB,WAAW;YACX,cAAc;YACd,UAAU;SACX;IACH;AAEA,IAAA,WAAW,CAAC,OAAe,EAAA;AACzB,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,OAAO;QACvD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,OAAO;QAChB;IACF;AAEA,IAAA,iBAAiB,CAAC,GAAoB,EAAA;AACpC,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9E;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;AAEA,IAAA,iBAAiB,CAAC,aAAiD,EAAE,OAAgB,EAAE,KAAc,EAAE,KAAa,EAAA;AAClH,QAAA,OAAO,OAAO,GAAG,CAAA,CAAA,EAAI,8BAA8B,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA,CAAE,GAAG,GAAG;IAC1F;AAEA,IAAA,4BAA4B,CAAC,aAAiD,EAAA;AAC5E,QAAA,IAAI,OAAO,aAAa,CAAC,MAAM,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACjF,YAAA,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC;QACzF;QACA,OAAO,aAAa,CAAC,MAAM;IAC7B;AAEA,IAAA,iBAAiB,CAAC,UAAmC,EAAA;AACnD,QAAA,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAC3E,YAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;QAC7E;QACA,OAAO,UAAU,CAAC,MAAM;IAC1B;IAEA,aAAa,CAAI,KAAmB,EAAE,UAAmC,EAAA;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC;QAClD,OAAO,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS;IAChF;AAEA,IAAA,gBAAgB,CAAI,KAAmB,EAAE,UAAmC,EAAE,eAAkB,EAAA;QAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC;AAClD,QAAA,OAAO,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAI,UAAU,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/H;IAEA,YAAY,CAAC,KAAmB,EAAE,UAAmC,EAAA;AACnE,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC;QACvC;QACA,OAAO,KAAK,CAAC,KAAK;IACpB;IAEA,aAAa,CAAC,KAAmB,EAAE,UAAmC,EAAA;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;AACxC,QAAA,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;QAC9D,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,aAAa;IAChD;AAEA,IAAA,UAAU,CAAC,KAAmB,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS;AACzC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI;AAC/B,QAAA,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;IACjE;AAEA,IAAA,UAAU,CAAC,UAAmC,EAAA;QAC5C,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;AAAE,YAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE;AACpF,QAAA,MAAM,OAAO,GAAG,4BAA4B,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;AACnG,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;AAC9B,YAAA,IAAI,QAAuD;AAC3D,YAAA,IAAI;AACF,gBAAA,QAAQ,GAAG,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;YAC/G;AAAE,YAAA,MAAM;AACN,gBAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAChC,gBAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;YAC7B;AACA,YAAA,IAAI,QAAQ,EAAE,IAAI,KAAK,WAAW;AAAE,gBAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;YAC/D,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,SAAS;AACvH,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;AAC5C,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAChC,YAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC7B;AACA,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa;AAAE,YAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE;AACtE,QAAA,IAAI,UAAU,CAAC,gBAAgB,KAAK,SAAS;AAAE,YAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;AAC1E,QAAA,MAAM,UAAU,GAAG,4BAA4B,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,gBAAgB,CAAC;AAC5G,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa;AAAE,YAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE;AACzE,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ;AAAE,YAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AAChC,YAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;QAC7B;AACA,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC;QACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC3C;IAEA,kBAAkB,CAAC,OAAe,EAAE,UAAmC,EAAA;AACrE,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAU,OAAO,CAAC,CAAC;QAChE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;AAEA,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY;AACzC,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;AAAE,gBAAA,OAAO,SAAS;YACtD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACxD,YAAA,OAAO,SAAS,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS;QACpE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;AAEA,IAAA,cAAc,CAAC,KAAc,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,SAAS;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACvD,QAAA,OAAO,SAAS,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS;IACnE;AAEA,IAAA,YAAY,CAAC,KAAc,EAAA;AACzB,QAAA,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS;AACjI,QAAA,OAAO,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS;IACnE;IAEA,gBAAgB,CAAC,UAAmC,EAAE,KAAmB,EAAA;AACvE,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC;AACtD,YAAA,IACE,IAAI,CAAC,QAAQ,CAAC,OAAO,CACnB,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,UAAU,EACrB,mCAAmC,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CACtG,EACD;AACA,gBAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC9C,gBAAA,OAAO,IAAI;YACb;QACF;AAAE,QAAA,MAAM;;QAER;QACA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC9C,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC/C,QAAA,OAAO,KAAK;IACd;IAEA,WAAW,CAAC,IAA8B,EAAE,GAAW,EAAA;AACrD,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;QAC5C;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,eAAe,CAAC,UAAmC,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC9C,YAAA,OAAO,IAAI;QACb;QACA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;AACxD,QAAA,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC;AAC/C,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,oBAAoB,CAAC,UAAmC,EAAA;AACtD,QAAA,IAAI;YACF,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAC1B,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,UAAU,EACrB,uCAAuC,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CACjG;QACH;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,KAAK;QACd;IACF;AAEA,IAAA,iBAAiB,CAAC,WAAmB,EAAA;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;IACxC;AAEA,IAAA,kBAAkB,CAAC,WAAmB,EAAA;AACpC,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC;QACzC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB;YAAE;AACtD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;QACrD,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7D;IAEA,QAAQ,CAAI,UAAmC,EAAE,KAAc,EAAA;QAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAA+B,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3H,OAAO,KAAK,CAAC,IAAI;IACnB;AAEA,IAAA,SAAS,CAAC,KAAc,EAAA;AACtB,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7E;AAEA,IAAA,kBAAkB,CAAC,KAAc,EAAA;AAC/B,QAAA,QACE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YACrB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;YACnC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;AACnD,YAAA,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC;IAE5D;wGA/WW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cADH,MAAM,EAAA,CAAA;;4FACnB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAD5B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACzDlC;;AAEG;;;;"}
1
+ {"version":3,"file":"sdcorejs-angular-services-storage.mjs","sources":["../../../projects/sdcorejs-angular/services/storage/src/storage.model.ts","../../../projects/sdcorejs-angular/services/storage/src/storage.service.ts","../../../projects/sdcorejs-angular/services/storage/sdcorejs-angular-services-storage.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { SdPersistenceIdentityCanonicalizer, SdPersistenceSerializer } from '@sdcorejs/angular/services/persistence';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport interface SdStorageOption<T = unknown> {\n type?: 'local' | 'session';\n default?: T;\n args?: Readonly<Record<string, unknown>>;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n}\n\nexport interface SdStorage<T = unknown> {\n get: () => T | undefined;\n set: (data: T) => void;\n setSilent: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n destroy: () => void;\n subject: BehaviorSubject<T | undefined>;\n observer: Observable<T | undefined>;\n}\n\nexport interface SdStorageWithDefault<T> extends Omit<SdStorage<T>, 'get' | 'subject' | 'observer'> {\n get: () => T;\n subject: BehaviorSubject<T>;\n observer: Observable<T>;\n}\n\nexport interface ISdStorageConfiguration {\n key?: (key: string) => string;\n namespace?: string;\n version?: string | number;\n serializer?: SdPersistenceSerializer;\n identityCanonicalizer?: SdPersistenceIdentityCanonicalizer;\n}\n\nexport const SD_STORAGE_CONFIG = new InjectionToken<ISdStorageConfiguration>('storage.configuration');\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport {\n SD_PERSISTENCE_STORAGE_ADAPTER,\n SdGraphIdentityCanonicalizer,\n SdGraphSerializer,\n SdPersistenceIdentityCanonicalizer,\n SdPersistenceSerializer,\n SdPersistenceStorageArea,\n buildSdPersistenceKey,\n canonicalizeSdPersistenceValue,\n digestSdPersistenceKey,\n parseSdPersistenceEnvelope,\n readSdPersistenceStorageItem,\n stringifySdPersistenceTombstoneEnvelope,\n stringifySdPersistenceValueEnvelope,\n} from '@sdcorejs/angular/services/persistence';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { BehaviorSubject } from 'rxjs';\nimport { SD_STORAGE_CONFIG, SdStorage, SdStorageOption, SdStorageWithDefault } from './storage.model';\n\ninterface StorageEntry {\n data: unknown;\n createdOn: Date;\n}\n\ntype StorageEntryRead = { status: 'found'; entry: StorageEntry } | { status: 'absent' } | { status: 'unavailable' };\n\ninterface StorageHandleFacade {\n emit: (present: boolean, value: unknown) => void;\n complete: () => void;\n}\n\ninterface StorageState {\n entry?: StorageEntry;\n hydrated: boolean;\n handles: Set<StorageHandleFacade>;\n disposed: boolean;\n}\n\ninterface NormalizedStorageOption {\n area: SdPersistenceStorageArea;\n storageKey: string;\n legacyStorageKey?: string;\n ownerDigest: string;\n identityDigest: string;\n serializer: SdPersistenceSerializer;\n}\n\ninterface StorageHandleOperations<T> {\n get: () => T | undefined;\n set: (data: T) => void;\n setSilent: (data: T) => void;\n has: () => boolean;\n remove: () => void;\n destroy: () => void;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SdStorageService {\n readonly #configuration = inject(SD_STORAGE_CONFIG, { optional: true });\n readonly #adapter = inject(SD_PERSISTENCE_STORAGE_ADAPTER);\n readonly #destroyRef = inject(DestroyRef);\n readonly #defaultSerializer = new SdGraphSerializer();\n readonly #defaultIdentityCanonicalizer = new SdGraphIdentityCanonicalizer();\n readonly #states = new Map<string, StorageState>();\n readonly #failedOwners = new Map<string, true>();\n readonly #maxFailedOwners = 256;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n for (const state of this.#states.values()) {\n state.disposed = true;\n state.entry = undefined;\n for (const handle of state.handles) handle.complete();\n state.handles.clear();\n }\n this.#states.clear();\n this.#failedOwners.clear();\n });\n }\n\n create<T>(key: string | object, option: SdStorageOption<T> & { default: T }): SdStorageWithDefault<T>;\n create<T = unknown>(key: string | object, option?: SdStorageOption<unknown>): SdStorage<T>;\n create<T = unknown>(key: string | object, option: SdStorageOption<T> = {}): SdStorage<T> | SdStorageWithDefault<T> {\n if (this.#destroyed) throw new Error('Storage service has been destroyed');\n if (!key) throw new Error('Key is required');\n const normalized = this.#normalize(key, option);\n const state = this.#getOrCreateState(normalized);\n if (Object.prototype.hasOwnProperty.call(option, 'default')) {\n return this.#createDefaultHandle(state, normalized, this.#cloneAs<T>(normalized.serializer, option.default));\n }\n return this.#createOptionalHandle<T>(state, normalized);\n }\n\n #getOrCreateState(normalized: NormalizedStorageOption): StorageState {\n const existing = this.#states.get(normalized.ownerDigest);\n if (existing) return existing;\n const state: StorageState = {\n hydrated: false,\n handles: new Set<StorageHandleFacade>(),\n disposed: false,\n };\n this.#states.set(normalized.ownerDigest, state);\n this.#hydrateState(state, normalized);\n return state;\n }\n\n #createOptionalHandle<T>(state: StorageState, normalized: NormalizedStorageOption): SdStorage<T> {\n const read = (): T | undefined => this.#readOptional<T>(state, normalized);\n const subject = new BehaviorSubject<T | undefined>(read());\n const facade: StorageHandleFacade = {\n emit: (present, value) => subject.next(present ? this.#cloneAs<T>(normalized.serializer, value) : undefined),\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, read);\n return { ...operations, subject, observer: subject.asObservable() };\n }\n\n #createDefaultHandle<T>(state: StorageState, normalized: NormalizedStorageOption, defaultSnapshot: T): SdStorageWithDefault<T> {\n const read = (): T => this.#readWithDefault(state, normalized, defaultSnapshot);\n const subject = new BehaviorSubject<T>(read());\n const facade: StorageHandleFacade = {\n emit: (present, value) => {\n const next = present ? this.#cloneAs<T>(normalized.serializer, value) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot);\n subject.next(this.#cloneAs<T>(normalized.serializer, next));\n },\n complete: () => subject.complete(),\n };\n const operations = this.#attachHandle(state, normalized, facade, read);\n return { ...operations, get: read, subject, observer: subject.asObservable() };\n }\n\n #attachHandle<T>(\n state: StorageState,\n normalized: NormalizedStorageOption,\n facade: StorageHandleFacade,\n read: () => T | undefined\n ): StorageHandleOperations<T> {\n state.handles.add(facade);\n let active = true;\n const assertActive = (): void => {\n if (!active || state.disposed || this.#destroyed) throw new Error('Storage handle has been destroyed');\n };\n const get = (): T | undefined => {\n assertActive();\n return read();\n };\n const write = (data: T, emit: boolean): void => {\n assertActive();\n const entry: StorageEntry = { data: normalized.serializer.clone(data), createdOn: new Date() };\n state.entry = entry;\n state.hydrated = true;\n this.#writePersistent(normalized, entry);\n if (emit) this.#broadcast(state);\n };\n const set = (data: T): void => write(data, true);\n const setSilent = (data: T): void => write(data, false);\n const has = (): boolean => {\n assertActive();\n return this.#ensureEntry(state, normalized) !== undefined;\n };\n const remove = (): void => {\n assertActive();\n state.entry = undefined;\n state.hydrated = true;\n this.#writeTombstone(normalized);\n this.#broadcast(state);\n };\n const destroy = (): void => {\n if (!active) return;\n active = false;\n state.handles.delete(facade);\n facade.complete();\n if (state.handles.size > 0) return;\n state.disposed = true;\n state.entry = undefined;\n this.#states.delete(normalized.ownerDigest);\n };\n return { get, set, setSilent, has, remove, destroy };\n }\n\n #normalize<T>(key: string | object, option: SdStorageOption<T>): NormalizedStorageOption {\n const serializer = option.serializer ?? this.#configuration?.serializer ?? this.#defaultSerializer;\n const identityCanonicalizer =\n option.identityCanonicalizer ?? this.#configuration?.identityCanonicalizer ?? this.#defaultIdentityCanonicalizer;\n const canonicalKey = canonicalizeSdPersistenceValue(identityCanonicalizer, key, 'storage key');\n const legacyStorageKey = this.#legacyStorageKey(key);\n // why: KHÔNG có namespace mặc định. Một hằng số dùng chung cho cả thư viện (vd `'sdcorejs'`) không\n // tách được hai app chung origin — cả hai đều nhận đúng hằng số đó nên vẫn va nhau y như cũ — mà\n // lại đổi identity của MỌI handle đang chạy, khiến dữ liệu đã persist bị bỏ rơi khi nâng cấp.\n // Tách partition là việc của app: khai báo `namespace` per-handle hoặc qua `SD_STORAGE_CONFIG`.\n const namespace = option.namespace ?? this.#configuration?.namespace;\n const version = option.version ?? this.#configuration?.version;\n const area = option.type ?? 'local';\n const serializerFormat = this.#serializerFormat(serializer);\n const hasArgs = Object.prototype.hasOwnProperty.call(option, 'args');\n const hasDefault = Object.prototype.hasOwnProperty.call(option, 'default');\n const fields = [\n { tag: 'area', value: canonicalizeSdPersistenceValue(identityCanonicalizer, area, 'storage area') },\n { tag: 'namespace', value: this.#optionalIdentity(identityCanonicalizer, namespace !== undefined, namespace, 'storage namespace') },\n { tag: 'version', value: this.#optionalIdentity(identityCanonicalizer, version !== undefined, version, 'storage version') },\n { tag: 'args', value: this.#optionalIdentity(identityCanonicalizer, hasArgs, option.args, 'storage args') },\n { tag: 'default', value: this.#optionalIdentity(identityCanonicalizer, hasDefault, option.default, 'storage default') },\n { tag: 'serializer', value: serializerFormat },\n { tag: 'identityCanonicalizer', value: this.#identityCanonicalizerFormat(identityCanonicalizer) },\n ];\n const identity = buildSdPersistenceKey(canonicalKey, fields);\n const identityDigest = digestSdPersistenceKey(identity);\n const storageKey = this.#convertKey(`sdcorejs.storage@1:${identityDigest}`);\n const ownerDigest = digestSdPersistenceKey(buildSdPersistenceKey(storageKey, [{ tag: 'area', value: area }]));\n return {\n area,\n storageKey,\n legacyStorageKey,\n ownerDigest,\n identityDigest,\n serializer,\n };\n }\n\n #convertKey(baseKey: string): string {\n try {\n return this.#configuration?.key?.(baseKey) ?? baseKey;\n } catch {\n return baseKey;\n }\n }\n\n #legacyStorageKey(key: string | object): string | undefined {\n try {\n return this.#convertKey(typeof key === 'string' ? key : Utilities.hash(key));\n } catch {\n return undefined;\n }\n }\n\n #optionalIdentity(canonicalizer: SdPersistenceIdentityCanonicalizer, present: boolean, value: unknown, label: string): string {\n return present ? `1${canonicalizeSdPersistenceValue(canonicalizer, value, label)}` : '0';\n }\n\n #identityCanonicalizerFormat(canonicalizer: SdPersistenceIdentityCanonicalizer): string {\n if (typeof canonicalizer.format !== 'string' || canonicalizer.format.length === 0) {\n throw new Error('Persistence identity canonicalizer format must be a non-empty string');\n }\n return canonicalizer.format;\n }\n\n #serializerFormat(serializer: SdPersistenceSerializer): string {\n if (typeof serializer.format !== 'string' || serializer.format.length === 0) {\n throw new Error('Persistence serializer format must be a non-empty string');\n }\n return serializer.format;\n }\n\n #readOptional<T>(state: StorageState, normalized: NormalizedStorageOption): T | undefined {\n const entry = this.#ensureEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : undefined;\n }\n\n #readWithDefault<T>(state: StorageState, normalized: NormalizedStorageOption, defaultSnapshot: T): T {\n const entry = this.#ensureEntry(state, normalized);\n return entry ? this.#cloneAs<T>(normalized.serializer, entry.data) : this.#cloneAs<T>(normalized.serializer, defaultSnapshot);\n }\n\n #ensureEntry(state: StorageState, normalized: NormalizedStorageOption): StorageEntry | undefined {\n if (!state.hydrated) {\n this.#hydrateState(state, normalized);\n }\n return state.entry;\n }\n\n #hydrateState(state: StorageState, normalized: NormalizedStorageOption): void {\n const read = this.#readEntry(normalized);\n state.entry = read.status === 'found' ? read.entry : undefined;\n state.hydrated = read.status !== 'unavailable';\n }\n\n #broadcast(state: StorageState): void {\n const present = state.entry !== undefined;\n const value = state.entry?.data;\n for (const handle of state.handles) handle.emit(present, value);\n }\n\n #readEntry(normalized: NormalizedStorageOption): StorageEntryRead {\n if (this.#failedOwners.has(normalized.ownerDigest)) return { status: 'unavailable' };\n const primary = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.storageKey);\n if (primary.status === 'found') {\n let envelope: ReturnType<typeof parseSdPersistenceEnvelope>;\n try {\n envelope = parseSdPersistenceEnvelope(primary.value, normalized.identityDigest, normalized.serializer.format);\n } catch {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (envelope?.kind === 'tombstone') return { status: 'absent' };\n const entry = envelope?.kind === 'value' ? this.#parseCurrentEntry(envelope.payload, normalized.serializer) : undefined;\n if (entry) return { status: 'found', entry };\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n if (primary.status === 'unavailable') return { status: 'unavailable' };\n if (normalized.legacyStorageKey === undefined) return { status: 'absent' };\n const legacyRead = readSdPersistenceStorageItem(this.#adapter, normalized.area, normalized.legacyStorageKey);\n if (legacyRead.status === 'unavailable') return { status: 'unavailable' };\n if (legacyRead.status === 'absent') return { status: 'absent' };\n const legacy = this.#parseLegacy(legacyRead.value);\n if (!legacy) {\n this.#writeTombstone(normalized);\n return { status: 'absent' };\n }\n this.#writePersistent(normalized, legacy);\n return { status: 'found', entry: legacy };\n }\n\n #parseCurrentEntry(payload: string, serializer: SdPersistenceSerializer): StorageEntry | undefined {\n try {\n return this.#validateEntry(serializer.parse<unknown>(payload));\n } catch {\n return undefined;\n }\n }\n\n #parseLegacy(raw: string): StorageEntry | undefined {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!this.#hasExactEntryKeys(parsed)) return undefined;\n const createdOn = this.#toValidDate(parsed['createdOn']);\n return createdOn ? { data: parsed['data'], createdOn } : undefined;\n } catch {\n return undefined;\n }\n }\n\n #validateEntry(value: unknown): StorageEntry | undefined {\n if (!this.#hasExactEntryKeys(value)) return undefined;\n const createdOn = this.#toValidDate(value['createdOn']);\n return createdOn ? { data: value['data'], createdOn } : undefined;\n }\n\n #toValidDate(value: unknown): Date | undefined {\n const date = value instanceof Date ? value : typeof value === 'string' || typeof value === 'number' ? new Date(value) : undefined;\n return date && Number.isFinite(date.getTime()) ? date : undefined;\n }\n\n #writePersistent(normalized: NormalizedStorageOption, entry: StorageEntry): boolean {\n try {\n const payload = normalized.serializer.stringify(entry);\n if (\n this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceValueEnvelope(normalized.identityDigest, normalized.serializer.format, payload)\n )\n ) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n } catch {\n // Fall through to canonical quarantine.\n }\n this.#safeRemove(normalized.area, normalized.storageKey);\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return false;\n }\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #safeRemove(area: SdPersistenceStorageArea, key: string): boolean {\n try {\n return this.#adapter.removeItem(area, key);\n } catch {\n return false;\n }\n }\n\n #writeTombstone(normalized: NormalizedStorageOption): boolean {\n if (this.#tryPersistTombstone(normalized)) {\n this.#clearFailedOwner(normalized.ownerDigest);\n return true;\n }\n this.#safeRemove(normalized.area, normalized.storageKey);\n this.#recordFailedOwner(normalized.ownerDigest);\n return false;\n }\n\n #tryPersistTombstone(normalized: NormalizedStorageOption): boolean {\n try {\n return this.#adapter.setItem(\n normalized.area,\n normalized.storageKey,\n stringifySdPersistenceTombstoneEnvelope(normalized.identityDigest, normalized.serializer.format)\n );\n } catch {\n return false;\n }\n }\n\n #clearFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n }\n\n #recordFailedOwner(ownerDigest: string): void {\n this.#failedOwners.delete(ownerDigest);\n this.#failedOwners.set(ownerDigest, true);\n if (this.#failedOwners.size <= this.#maxFailedOwners) return;\n const oldest = this.#failedOwners.keys().next().value;\n if (oldest !== undefined) this.#failedOwners.delete(oldest);\n }\n\n #cloneAs<T>(serializer: SdPersistenceSerializer, value: unknown): T {\n const entry = serializer.parse<{ data: T; createdOn: Date }>(serializer.stringify({ data: value, createdOn: new Date(0) }));\n return entry.data;\n }\n\n #isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n #hasExactEntryKeys(value: unknown): value is Record<string, unknown> {\n return (\n this.#isRecord(value) &&\n Reflect.ownKeys(value).length === 2 &&\n Object.prototype.hasOwnProperty.call(value, 'data') &&\n Object.prototype.hasOwnProperty.call(value, 'createdOn')\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,6 @@ export * from '@sdcorejs/angular/services/confirm';
6
6
  export * from '@sdcorejs/angular/services/api';
7
7
  export * from '@sdcorejs/angular/services/loading';
8
8
  export * from '@sdcorejs/angular/services/excel';
9
- export * from '@sdcorejs/angular/services/docx';
10
9
  export * from '@sdcorejs/angular/services/viewport';
11
10
  export * from '@sdcorejs/angular/services/unsaved-changes';
12
11
  export * from '@sdcorejs/angular/services/task';
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services.mjs","sources":["../../../projects/sdcorejs-angular/services/sdcorejs-angular-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;AAAA;;AAEG"}
1
+ {"version":3,"file":"sdcorejs-angular-services.mjs","sources":["../../../projects/sdcorejs-angular/services/sdcorejs-angular-services.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;AAEG"}