@sdcorejs/angular 20.1.2 → 20.1.4

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 (177) hide show
  1. package/README.md +127 -807
  2. package/components/audit-diff/index.d.ts +74 -0
  3. package/components/badge/index.d.ts +1 -1
  4. package/components/breadcrumb/index.d.ts +53 -0
  5. package/components/data-state/index.d.ts +44 -0
  6. package/components/document-builder/index.d.ts +5 -5
  7. package/components/form-generic/index.d.ts +89 -103
  8. package/components/import-excel/index.d.ts +4 -14
  9. package/components/index.d.ts +4 -0
  10. package/components/job-progress/index.d.ts +38 -0
  11. package/components/mini-editor/index.d.ts +9 -9
  12. package/components/modal/index.d.ts +7 -1
  13. package/components/preview/index.d.ts +181 -28
  14. package/components/side-drawer/index.d.ts +7 -1
  15. package/components/tab/index.d.ts +9 -2
  16. package/components/table/index.d.ts +8 -7
  17. package/components/tree/index.d.ts +24 -2
  18. package/components/upload-file/index.d.ts +5 -4
  19. package/directives/index.d.ts +10 -8
  20. package/fesm2022/sdcorejs-angular-components-anchor.mjs +14 -14
  21. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs +332 -0
  23. package/fesm2022/sdcorejs-angular-components-audit-diff.mjs.map +1 -0
  24. package/fesm2022/sdcorejs-angular-components-badge.mjs +1 -0
  25. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs +121 -0
  27. package/fesm2022/sdcorejs-angular-components-breadcrumb.mjs.map +1 -0
  28. package/fesm2022/sdcorejs-angular-components-data-state.mjs +68 -0
  29. package/fesm2022/sdcorejs-angular-components-data-state.mjs.map +1 -0
  30. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +18 -23
  31. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-editor.mjs +6 -4
  33. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +633 -886
  35. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-import-excel.mjs +26 -41
  37. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-job-progress.mjs +97 -0
  39. package/fesm2022/sdcorejs-angular-components-job-progress.mjs.map +1 -0
  40. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs +10 -20
  41. package/fesm2022/sdcorejs-angular-components-mini-editor.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-modal.mjs +61 -4
  43. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-components-preview.mjs +1438 -218
  45. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +9 -17
  47. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-components-query-builder.mjs +1 -1
  49. package/fesm2022/sdcorejs-angular-components-query-builder.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +39 -2
  51. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-components-tab-router.mjs +76 -52
  53. package/fesm2022/sdcorejs-angular-components-tab-router.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-components-tab.mjs +48 -4
  55. package/fesm2022/sdcorejs-angular-components-tab.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-components-table.mjs +123 -89
  57. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-components-tree.mjs +188 -18
  59. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +17 -23
  61. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-components.mjs +4 -0
  63. package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-directives.mjs +29 -41
  65. package/fesm2022/sdcorejs-angular-directives.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +9 -8
  67. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +20 -83
  69. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +8 -4
  71. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-forms-chip.mjs +8 -4
  73. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +18 -14
  75. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-forms-date.mjs +48 -70
  77. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  78. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +62 -528
  79. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  80. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs +384 -0
  81. package/fesm2022/sdcorejs-angular-forms-entity-picker.mjs.map +1 -0
  82. package/fesm2022/sdcorejs-angular-forms-input-color.mjs +5 -3
  83. package/fesm2022/sdcorejs-angular-forms-input-color.mjs.map +1 -1
  84. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +16 -11
  85. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  86. package/fesm2022/sdcorejs-angular-forms-input.mjs +297 -59
  87. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  88. package/fesm2022/sdcorejs-angular-forms-models.mjs +155 -2
  89. package/fesm2022/sdcorejs-angular-forms-models.mjs.map +1 -1
  90. package/fesm2022/sdcorejs-angular-forms-radio.mjs +44 -78
  91. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  92. package/fesm2022/sdcorejs-angular-forms-select.mjs +8 -21
  93. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  94. package/fesm2022/sdcorejs-angular-forms-switch.mjs +19 -76
  95. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  96. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +8 -6
  97. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  98. package/fesm2022/sdcorejs-angular-forms-time-range.mjs +280 -0
  99. package/fesm2022/sdcorejs-angular-forms-time-range.mjs.map +1 -0
  100. package/fesm2022/sdcorejs-angular-forms-time.mjs +310 -0
  101. package/fesm2022/sdcorejs-angular-forms-time.mjs.map +1 -0
  102. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs +210 -0
  103. package/fesm2022/sdcorejs-angular-forms-tree-select.mjs.map +1 -0
  104. package/fesm2022/sdcorejs-angular-forms.mjs +73 -4
  105. package/fesm2022/sdcorejs-angular-forms.mjs.map +1 -1
  106. package/fesm2022/sdcorejs-angular-i18n.mjs +355 -10
  107. package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
  108. package/fesm2022/sdcorejs-angular-interceptors.mjs +12 -17
  109. package/fesm2022/sdcorejs-angular-interceptors.mjs.map +1 -1
  110. package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
  111. package/fesm2022/sdcorejs-angular-modules-layout.mjs +861 -80
  112. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  113. package/fesm2022/sdcorejs-angular-modules.mjs +0 -1
  114. package/fesm2022/sdcorejs-angular-modules.mjs.map +1 -1
  115. package/fesm2022/sdcorejs-angular-pipes.mjs +5 -7
  116. package/fesm2022/sdcorejs-angular-pipes.mjs.map +1 -1
  117. package/fesm2022/sdcorejs-angular-services-api.mjs +407 -137
  118. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  119. package/fesm2022/sdcorejs-angular-services-cache.mjs +515 -105
  120. package/fesm2022/sdcorejs-angular-services-cache.mjs.map +1 -1
  121. package/fesm2022/sdcorejs-angular-services-confirm.mjs +5 -7
  122. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  123. package/fesm2022/sdcorejs-angular-services-docx.mjs +7 -10
  124. package/fesm2022/sdcorejs-angular-services-docx.mjs.map +1 -1
  125. package/fesm2022/sdcorejs-angular-services-loading.mjs +340 -66
  126. package/fesm2022/sdcorejs-angular-services-loading.mjs.map +1 -1
  127. package/fesm2022/sdcorejs-angular-services-notify.mjs +7 -10
  128. package/fesm2022/sdcorejs-angular-services-notify.mjs.map +1 -1
  129. package/fesm2022/sdcorejs-angular-services-persistence.mjs +899 -0
  130. package/fesm2022/sdcorejs-angular-services-persistence.mjs.map +1 -0
  131. package/fesm2022/sdcorejs-angular-services-storage.mjs +324 -122
  132. package/fesm2022/sdcorejs-angular-services-storage.mjs.map +1 -1
  133. package/fesm2022/sdcorejs-angular-services-task.mjs +389 -0
  134. package/fesm2022/sdcorejs-angular-services-task.mjs.map +1 -0
  135. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs +255 -0
  136. package/fesm2022/sdcorejs-angular-services-unsaved-changes.mjs.map +1 -0
  137. package/fesm2022/sdcorejs-angular-services-viewport.mjs +76 -0
  138. package/fesm2022/sdcorejs-angular-services-viewport.mjs.map +1 -0
  139. package/fesm2022/sdcorejs-angular-services.mjs +4 -0
  140. package/fesm2022/sdcorejs-angular-services.mjs.map +1 -1
  141. package/forms/autocomplete/index.d.ts +3 -4
  142. package/forms/checkbox/index.d.ts +4 -8
  143. package/forms/date/index.d.ts +3 -3
  144. package/forms/date-range/index.d.ts +6 -7
  145. package/forms/datetime/index.d.ts +3 -3
  146. package/forms/entity-picker/index.d.ts +128 -0
  147. package/forms/index.d.ts +15 -5
  148. package/forms/input/index.d.ts +76 -11
  149. package/forms/input-color/index.d.ts +3 -1
  150. package/forms/input-number/index.d.ts +4 -2
  151. package/forms/models/index.d.ts +86 -3
  152. package/forms/radio/index.d.ts +12 -8
  153. package/forms/switch/index.d.ts +4 -7
  154. package/forms/time/index.d.ts +117 -0
  155. package/forms/time-range/index.d.ts +98 -0
  156. package/forms/tree-select/index.d.ts +76 -0
  157. package/i18n/index.d.ts +68 -2
  158. package/interceptors/index.d.ts +5 -6
  159. package/modules/icon/index.d.ts +2 -3
  160. package/modules/index.d.ts +0 -1
  161. package/modules/layout/index.d.ts +288 -15
  162. package/package.json +50 -5
  163. package/pipes/index.d.ts +2 -2
  164. package/services/api/index.d.ts +68 -24
  165. package/services/cache/index.d.ts +52 -16
  166. package/services/confirm/index.d.ts +3 -2
  167. package/services/docx/index.d.ts +2 -3
  168. package/services/index.d.ts +4 -0
  169. package/services/loading/index.d.ts +16 -8
  170. package/services/persistence/index.d.ts +159 -0
  171. package/services/storage/index.d.ts +26 -8
  172. package/services/task/index.d.ts +104 -0
  173. package/services/unsaved-changes/index.d.ts +83 -0
  174. package/services/viewport/index.d.ts +42 -0
  175. package/fesm2022/sdcorejs-angular-modules-authom.mjs +0 -360
  176. package/fesm2022/sdcorejs-angular-modules-authom.mjs.map +0 -1
  177. package/modules/authom/index.d.ts +0 -70
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-services-api.mjs","sources":["../../../projects/sdcorejs-angular/services/api/src/api.model.ts","../../../projects/sdcorejs-angular/services/api/src/api.service.ts","../../../projects/sdcorejs-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sdcorejs-angular/services/api/src/api.module.ts","../../../projects/sdcorejs-angular/services/api/sdcorejs-angular-services-api.ts"],"sourcesContent":["import { HttpClient, HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { SdCacheOption } from '@sdcorejs/angular/services/cache';\n// import hash from 'object-hash';\n\nexport interface SdApiOption {\n cacheOption?: SdCacheOption;\n timeout?: number; // Default: 30000 (30s)\n autoCache?: boolean; // Default: true\n}\ntype HttpGetOption = Parameters<HttpClient['get']>[1];\nexport type SdGetOption = HttpGetOption & SdApiOption;\n\ntype HttpPostOption = Parameters<HttpClient['post']>[2];\nexport type SdPostOption = HttpPostOption & SdApiOption;\n\ntype HttpPutOption = Parameters<HttpClient['put']>[2];\nexport type SdPutOption = HttpPutOption & SdApiOption;\n\ntype HttpDeleteOption = Parameters<HttpClient['delete']>[1];\nexport type SdDeleteOption = HttpDeleteOption & SdApiOption;\n\nexport interface SdApiHandler {\n /** Danh sách host URL mà handler này sẽ xử lý */\n hosts: string[];\n /** Can thiệp request: gắn header, token, transform body... */\n intercept?: (request: HttpRequest<any>) => HttpRequest<any>;\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\n beforeRemote?: (request: HttpRequest<any>) => void | Promise<void>;\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\n afterRemote?: (response: HttpResponse<any> | HttpErrorResponse | Error) => void | Promise<void>;\n /** Transform response body thành kiểu dữ liệu mong muốn */\n mapResponse?: <Tres = any, Tdata = any>(response: Tres) => Tdata;\n /** Timeout tính bằng milliseconds. Mặc định: 30000 (30 giây) */\n timeout?: number;\n}\n\nexport interface ISdApiConfiguration {\n handlers: SdApiHandler[];\n}\n\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n\nexport const SD_API_CONFIGURATION = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { lastValueFrom, Observable } from 'rxjs';\nimport { catchError, map, shareReplay, timeout } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler, SdDeleteOption, SdGetOption, SdPostOption, SdPutOption } from './api.model';\n\n// Gom nhóm các Option lại cho gọn\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdDeleteOption;\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SdApiService {\n readonly #defaultTimeout = 60000; // 60s\n readonly #dedupCacheDuration = 1000; // 1s (Deduplication cache duration)\n #httpClient = inject(HttpClient);\n #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) || [];\n #cacheService = inject(SdCacheService);\n\n // Thay đổi cấu trúc Cache: Lưu Observable thay vì Subject phức tạp\n // Key: hash string -> Value: { stream$: Observable, expiry: number }\n #inFlightRequests = new Map<string, { stream$: Observable<any>; expiry: number }>();\n\n constructor() {\n // Optional: Cơ chế dọn dẹp cache định kỳ (mỗi 1 phút dọn dẹp các key hết hạn)\n setInterval(() => this.#cleanupCache(), 60000);\n }\n\n get http() {\n return this.#httpClient;\n }\n\n // --- PUBLIC METHODS ---\n\n get = <T = any>(url: string, option?: SdGetOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\n };\n\n post = <T = any>(url: string, body?: any, option?: SdPostOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\n };\n\n put = <T = any>(url: string, body?: any, option?: SdPutOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\n };\n\n delete = <T = any>(url: string, option?: SdDeleteOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\n };\n\n // Upload file logic giữ nguyên nhưng refactor nhẹ\n upload = async (url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<any> => {\n const file = await BrowserUtilities.upload(option);\n if (!Array.isArray(file) && file) {\n return this.uploadFile(url, file);\n }\n };\n\n uploadFile = async (url: string, file: File): Promise<any> => {\n if (!file) return null;\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n // Upload thường không cần deduplication cache, set autoCache: false\n return await this.post(url, formData, { autoCache: false });\n };\n\n // --- PRIVATE CORE LOGIC ---\n\n /**\n * Hàm trung gian xử lý Layer Cache (SdCacheService) trước khi gọi API thực tế\n */\n #executeWithLayeredCache = async <T>(url: string, method: HttpMethod, body?: any, option?: SdHttpOptions): Promise<T> => {\n // Layer 1: Persistent Cache (SdCacheService)\n if (option?.cacheOption) {\n const key = this.#generateKey(url, method, body, option);\n const { get, set, has } = this.#cacheService.create(key, option.cacheOption);\n\n if (has()) {\n return get();\n }\n\n const result = await this.#request<T>(url, method, body, option);\n set(result);\n return result;\n }\n\n // Không có cache dài hạn thì gọi trực tiếp logic deduplication\n return this.#request<T>(url, method, body, option);\n };\n\n /**\n * Core Request: Xử lý Deduplication, Timeout, Mapping Response\n */\n #request = <T>(url: string, method: HttpMethod, body: any, option?: SdHttpOptions): Promise<T> => {\n const key = this.#generateKey(url, method, body, option);\n\n // Layer 2: Deduplication Cache (In-Flight Request / Short-term cache)\n const now = Date.now();\n const cachedItem = this.#inFlightRequests.get(key);\n\n // Nếu đã có request đang chạy hoặc mới chạy xong trong vòng 1s -> Trả về stream đó luôn\n if (cachedItem && cachedItem.expiry > now) {\n return lastValueFrom(cachedItem.stream$);\n }\n\n // Setup request mới\n const handler = this.#getHandler(url);\n const apiTimeout = option?.timeout ?? handler?.timeout ?? this.#defaultTimeout;\n\n // Tạo Observable call API\n const request$ = this.#httpClient\n .request(method, url, {\n body,\n headers: option?.headers,\n params: option?.params,\n observe: 'response', // Lấy full response để check status\n responseType: option?.responseType,\n })\n .pipe(\n timeout(apiTimeout),\n map(res => {\n // Normalize Response Logic\n const bodyRes = res.body as any;\n // Logic check response cũ của bạn\n if (bodyRes && typeof bodyRes === 'object' && 'ok' in bodyRes && !bodyRes.ok) {\n throw bodyRes; // Giả sử structure trả về { ok: false, ... } là lỗi\n }\n\n if (handler?.mapResponse) {\n return handler.mapResponse(bodyRes);\n }\n\n return bodyRes;\n }),\n catchError(err => {\n // Xóa cache ngay lập tức nếu lỗi để user có thể retry\n this.#inFlightRequests.delete(key);\n throw err;\n }),\n // QUAN TRỌNG: shareReplay(1) giúp share kết quả cho các subscriber đến sau (trong 1s)\n shareReplay(1)\n );\n\n // Lưu vào Map\n this.#inFlightRequests.set(key, {\n stream$: request$,\n expiry: now + this.#dedupCacheDuration,\n });\n\n // Chuyển đổi sang Promise cho đúng return type của bạn\n return lastValueFrom(request$);\n };\n\n // --- HELPERS ---\n\n #getHandler = (url: string): SdApiHandler | undefined => {\n const handlers = this.#configurations.flatMap(b => b?.handlers || []);\n return handlers.find(e => e.hosts.some(host => url.startsWith(host)));\n };\n\n #generateKey = (url: string, method: HttpMethod, body: any, option?: SdHttpOptions): string => {\n // FormData không hash được nội dung file, luôn generate key mới\n if (body instanceof FormData || option?.autoCache === false) {\n return Utilities.generateUuid();\n }\n return Utilities.hash({\n url,\n method,\n params: option?.params,\n headers: option?.headers,\n body,\n });\n };\n\n // Dọn dẹp memory leak\n #cleanupCache() {\n const now = Date.now();\n this.#inFlightRequests.forEach((value, key) => {\n if (value.expiry < now) {\n this.#inFlightRequests.delete(key);\n }\n });\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { from, Observable, throwError } from 'rxjs';\nimport { catchError, map, switchMap } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG } from '../api.model';\n\n@Injectable()\nexport class SdHttpInterceptor implements HttpInterceptor {\n #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) || [];\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n const url = request.url;\n if (!url) {\n throw new Error(`Invalid URL`);\n }\n const handlers = this.#configurations.flatMap(configuration => configuration?.handlers || []);\n const handler = handlers?.find(e => e.hosts.some(host => url.startsWith(host)));\n const intercept = handler?.intercept;\n if (intercept) {\n request = request.clone(intercept(request));\n }\n if (request.body instanceof FormData) {\n request = request.clone({\n headers: request.headers.delete('Content-Type'),\n });\n }\n const beforeRemoteHandler = handler?.beforeRemote;\n const afterRemoteHandler = handler?.afterRemote;\n const beforeRemote = beforeRemoteHandler?.(request);\n if (beforeRemote instanceof Promise) {\n return from(beforeRemote).pipe(\n switchMap(() => next.handle(request)),\n map((event: HttpEvent<any>) => {\n if (event instanceof HttpResponse) {\n afterRemoteHandler?.(event);\n }\n return event;\n }),\n catchError((error: HttpErrorResponse) => {\n afterRemoteHandler?.(error);\n return throwError(() => error);\n })\n );\n }\n return next.handle(request).pipe(\n map((event: HttpEvent<any>) => {\n if (event instanceof HttpResponse) {\n afterRemoteHandler?.(event);\n }\n return event;\n }),\n catchError((error: HttpErrorResponse) => {\n afterRemoteHandler?.(error);\n return throwError(() => error);\n })\n );\n }\n}\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-services-api.mjs","sources":["../../../projects/sdcorejs-angular/services/api/src/api.model.ts","../../../projects/sdcorejs-angular/services/api/src/api.service.ts","../../../projects/sdcorejs-angular/services/api/src/interceptors/api.interceptor.ts","../../../projects/sdcorejs-angular/services/api/src/api.module.ts","../../../projects/sdcorejs-angular/services/api/sdcorejs-angular-services-api.ts"],"sourcesContent":["import { HttpContext, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { InjectionToken } from '@angular/core';\nimport { SdCacheOption } from '@sdcorejs/angular/services/cache';\n\nexport type SdApiResponseType = 'arraybuffer' | 'blob' | 'json' | 'text';\ntype SdApiBivariantCallback<TArgument, TResult> = { bivarianceHack(argument: TArgument): TResult }['bivarianceHack'];\n\nexport interface SdApiHttpOption {\n headers?: HttpHeaders | Record<string, string | string[]>;\n context?: HttpContext;\n params?: HttpParams | Record<string, string | number | boolean | readonly (string | number | boolean)[]>;\n observe?: 'body';\n reportProgress?: boolean;\n responseType?: SdApiResponseType;\n withCredentials?: boolean;\n transferCache?: { includeHeaders?: string[] } | boolean;\n}\n\nexport interface SdApiRetryOption {\n /** Number of retries after the initial request. Values are clamped to a finite safe limit. */\n attempts: number;\n /** Delay before the first retry. Defaults to 0. */\n delayMs?: number;\n /** Multiplier applied to each subsequent delay. Defaults to 1. */\n backoff?: number;\n /** Overrides the default transient HTTP-status predicate. `attempt` is one-based. */\n retryWhen?: (error: unknown, attempt: number) => boolean;\n /** Required to retry POST, PUT, PATCH, or DELETE. */\n mutations?: boolean;\n}\n\nexport interface SdApiOption {\n cacheOption?: SdCacheOption;\n timeout?: number; // Default: 60000 (60s)\n /** Cancels only this caller; a shared HTTP request continues while another caller remains. */\n signal?: AbortSignal;\n /** Enables request deduplication. Defaults to true for GET and false for mutations. */\n dedupe?: boolean;\n /** Keeps a successful dedupe result replayable for this duration. Defaults to 1000ms. */\n dedupeWindowMs?: number;\n /** Opt-in bounded retry policy. The default is no retries. */\n retry?: SdApiRetryOption;\n /**\n * @deprecated Use `dedupe`. When both are provided, `dedupe` takes precedence.\n * Explicit `true` remains a compatibility opt-in for mutation deduplication.\n */\n autoCache?: boolean;\n}\n\nexport type SdGetOption = SdApiHttpOption & SdApiOption;\nexport type SdPostOption = SdApiHttpOption & SdApiOption;\nexport type SdPutOption = SdApiHttpOption & SdApiOption;\nexport type SdPatchOption = SdApiHttpOption & SdApiOption;\nexport type SdDeleteOption = SdApiHttpOption & SdApiOption;\nexport type SdApiRequestUpdate = Parameters<HttpRequest<unknown>['clone']>[0];\n\nexport interface SdApiHandler {\n /** Danh sách host URL mà handler này sẽ xử lý */\n hosts: string[];\n /** Can thiệp request: gắn header, token, transform body... */\n intercept?: SdApiBivariantCallback<HttpRequest<unknown>, HttpRequest<unknown> | SdApiRequestUpdate>;\n /** Hook chạy TRƯỚC khi gửi request (dùng để log, tracking...) */\n beforeRemote?: SdApiBivariantCallback<HttpRequest<unknown>, void | Promise<void>>;\n /** Hook chạy SAU khi nhận response (xử lý lỗi, notify...) */\n afterRemote?: SdApiBivariantCallback<HttpResponse<unknown> | HttpErrorResponse | Error, void | Promise<void>>;\n /** Transform response body thành kiểu dữ liệu mong muốn */\n mapResponse?: SdApiBivariantCallback<unknown, unknown>;\n /** Timeout tính bằng milliseconds. Mặc định: 60000 (60 giây) */\n timeout?: number;\n}\n\nexport interface ISdApiConfiguration {\n handlers?: SdApiHandler[];\n}\n\nexport const SD_API_CONFIG = new InjectionToken<ISdApiConfiguration>('sd-api.configuration');\n\n/** @deprecated Use `SD_API_CONFIG`. This is the same injection token. */\nexport const SD_API_CONFIGURATION = SD_API_CONFIG;\n","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { SdCacheService } from '@sdcorejs/angular/services/cache';\nimport { BrowserUtilities, Utilities } from '@sdcorejs/utils/fns';\nimport { Observable, of, Subscription, throwError, timer, TimeoutError } from 'rxjs';\nimport { filter, map, retry, timeout } from 'rxjs/operators';\nimport {\n ISdApiConfiguration,\n SD_API_CONFIG,\n SdApiHandler,\n SdApiRetryOption,\n SdDeleteOption,\n SdGetOption,\n SdPatchOption,\n SdPostOption,\n SdPutOption,\n} from './api.model';\n\ntype SdHttpOptions = SdGetOption & SdPostOption & SdPutOption & SdPatchOption & SdDeleteOption;\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\ntype SharedRequestState = 'pending' | 'succeeded' | 'failed' | 'cancelled';\n\ninterface SharedRequest {\n readonly key?: string;\n readonly replayWindowMs: number;\n readonly promise: Promise<unknown>;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n subscription: Subscription;\n owners: number;\n state: SharedRequestState;\n replayTimer?: ReturnType<typeof setTimeout>;\n}\n\ninterface PreparedRequest {\n request: SharedRequest;\n source: Observable<unknown>;\n}\n\n/**\n * Response generics intentionally default to `unknown` for type safety.\n * Callers should specify `T`; migration guidance is tracked for Task 13.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class SdApiService {\n readonly #defaultTimeout = 60000;\n readonly #defaultDedupeWindowMs = 1000;\n readonly #maxTimerMs = 2_147_483_647;\n readonly #maxRetryAttempts = 10;\n readonly #httpClient = inject(HttpClient);\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n readonly #cacheService = inject(SdCacheService);\n readonly #destroyRef = inject(DestroyRef);\n readonly #sharedRequests = new Map<string, SharedRequest>();\n readonly #activeRequests = new Set<SharedRequest>();\n readonly #objectIds = new WeakMap<object, number>();\n #nextObjectId = 1;\n #destroyed = false;\n\n constructor() {\n this.#destroyRef.onDestroy(() => this.#destroy());\n }\n\n get http(): HttpClient {\n return this.#httpClient;\n }\n\n get = <T = unknown>(url: string, option?: SdGetOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'GET', undefined, option);\n };\n\n post = <T = unknown>(url: string, body?: unknown, option?: SdPostOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'POST', body, option);\n };\n\n put = <T = unknown>(url: string, body?: unknown, option?: SdPutOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PUT', body, option);\n };\n\n patch = <T = unknown>(url: string, body?: unknown, option?: SdPatchOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'PATCH', body, option);\n };\n\n delete = <T = unknown>(url: string, option?: SdDeleteOption): Promise<T> => {\n return this.#executeWithLayeredCache<T>(url, 'DELETE', undefined, option);\n };\n\n upload = async <T = unknown>(url: string, option?: { extensions?: string[]; maxSizeInMb?: number }): Promise<T | null | undefined> => {\n const file = await BrowserUtilities.upload(option);\n if (!Array.isArray(file) && file) {\n return this.uploadFile<T>(url, file);\n }\n return undefined;\n };\n\n uploadFile = async <T = unknown>(url: string, file: File | null | undefined): Promise<T | null> => {\n if (!file) return null;\n if (file.name.lastIndexOf('.') === -1) throw new Error('Invalid file extension');\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n return this.post<T>(url, formData, { dedupe: false });\n };\n\n async #executeWithLayeredCache<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n throw this.#createAbortError();\n }\n\n if (!option?.cacheOption) {\n return this.#request<T>(url, method, body, option);\n }\n\n const key = this.#generateKey(url, method, body, option);\n const cache = this.#cacheService.create<T>(key, option.cacheOption);\n try {\n const cached = cache.snapshot();\n if (cached.present) return cached.value;\n\n const result = await this.#request<T>(url, method, body, option);\n cache.set(result);\n return result;\n } finally {\n cache.release();\n }\n }\n\n #request<T>(url: string, method: HttpMethod, body?: unknown, option?: SdHttpOptions): Promise<T> {\n if (this.#destroyed || option?.signal?.aborted) {\n return Promise.reject(this.#createAbortError());\n }\n\n const shouldDedupe = option?.dedupe ?? option?.autoCache ?? method === 'GET';\n const key = shouldDedupe ? this.#generateRequestKey(url, method, body, option) : undefined;\n let request = key ? this.#sharedRequests.get(key) : undefined;\n\n if (!request) {\n const prepared = this.#prepareRequest(url, method, body, option, key);\n request = prepared.request;\n if (key) this.#sharedRequests.set(key, request);\n this.#startRequest(request, prepared.source);\n }\n\n return this.#attachCaller<T>(request, option?.signal);\n }\n\n #prepareRequest(\n url: string,\n method: HttpMethod,\n body: unknown,\n option: SdHttpOptions | undefined,\n key: string | undefined\n ): PreparedRequest {\n let resolve!: (value: unknown) => void;\n let reject!: (error: unknown) => void;\n const promise = new Promise<unknown>((resolvePromise, rejectPromise) => {\n resolve = resolvePromise;\n reject = rejectPromise;\n });\n const request: SharedRequest = {\n key,\n replayWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n promise,\n resolve,\n reject,\n subscription: Subscription.EMPTY,\n owners: 0,\n state: 'pending',\n };\n this.#activeRequests.add(request);\n\n const handler = this.#getHandler(url);\n const httpRequest = new HttpRequest<unknown>(method, url, body ?? null, {\n headers: this.#toHttpHeaders(option?.headers),\n context: option?.context,\n params: this.#toHttpParams(option?.params),\n reportProgress: option?.reportProgress,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials,\n transferCache: option?.transferCache,\n });\n const source = this.#withRetry(\n this.#httpClient.request(httpRequest).pipe(\n timeout(this.#resolveTimeout(url, option?.timeout)),\n filter((event): event is HttpResponse<unknown> => event instanceof HttpResponse),\n map(response => this.#mapResponse(response.body, handler))\n ),\n method,\n option?.retry\n );\n\n return { request, source };\n }\n\n #startRequest(request: SharedRequest, source: Observable<unknown>): void {\n request.subscription = source.subscribe({\n next: value => this.#completeSuccess(request, value),\n error: error => this.#completeError(request, error),\n complete: () => {\n if (request.state === 'pending') {\n this.#completeError(request, new Error('HTTP request completed without a response'));\n }\n },\n });\n }\n\n #attachCaller<T>(request: SharedRequest, signal?: AbortSignal): Promise<T> {\n request.owners++;\n\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n if (signal) signal.removeEventListener('abort', abort);\n };\n const release = (): void => {\n request.owners = Math.max(0, request.owners - 1);\n if (request.state === 'pending' && request.owners === 0) {\n this.#cancelRequest(request);\n }\n };\n const abort = (): void => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(this.#createAbortError());\n };\n\n if (signal) {\n signal.addEventListener('abort', abort, { once: true });\n if (signal.aborted) {\n abort();\n return;\n }\n }\n\n request.promise.then(\n value => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n resolve(value as T);\n },\n error => {\n if (settled) return;\n settled = true;\n cleanup();\n release();\n reject(error);\n }\n );\n });\n }\n\n #completeSuccess(request: SharedRequest, value: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'succeeded';\n request.resolve(value);\n\n if (!request.key) {\n this.#activeRequests.delete(request);\n return;\n }\n\n if (request.replayWindowMs === 0) {\n this.#evictRequest(request);\n return;\n }\n\n request.replayTimer = setTimeout(() => this.#evictRequest(request), request.replayWindowMs);\n }\n\n #completeError(request: SharedRequest, error: unknown): void {\n if (request.state !== 'pending') return;\n request.state = 'failed';\n this.#removeRequest(request);\n request.reject(error);\n }\n\n #cancelRequest(request: SharedRequest): void {\n if (request.state !== 'pending') return;\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n this.#removeRequest(request);\n request.reject(this.#createAbortError());\n }\n\n #evictRequest(request: SharedRequest): void {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n this.#removeRequest(request);\n }\n\n #removeRequest(request: SharedRequest): void {\n if (request.key && this.#sharedRequests.get(request.key) === request) {\n this.#sharedRequests.delete(request.key);\n }\n this.#activeRequests.delete(request);\n }\n\n #withRetry(source: Observable<unknown>, method: HttpMethod, option?: SdApiRetryOption): Observable<unknown> {\n const attempts = this.#normalizeRetryAttempts(option?.attempts);\n const mutation = method !== 'GET';\n if (attempts === 0 || (mutation && option?.mutations !== true)) {\n return source;\n }\n\n return source.pipe(\n retry({\n count: attempts,\n delay: (error: unknown, attempt: number) => {\n if (this.#isAbortError(error) || !this.#shouldRetry(error, attempt, option)) {\n return throwError(() => error);\n }\n\n const baseDelay = this.#normalizeRetryDelay(option?.delayMs);\n const backoff = this.#normalizeRetryBackoff(option?.backoff);\n const computedDelay = baseDelay * Math.pow(backoff, attempt - 1);\n const delayMs = Number.isFinite(computedDelay) ? Math.min(this.#maxTimerMs, computedDelay) : this.#maxTimerMs;\n return delayMs > 0 ? timer(delayMs) : of(undefined);\n },\n })\n );\n }\n\n #shouldRetry(error: unknown, attempt: number, option: SdApiRetryOption | undefined): boolean {\n if (option?.retryWhen) {\n return option.retryWhen(error, attempt);\n }\n if (error instanceof TimeoutError) return true;\n if (!(error instanceof HttpErrorResponse)) return false;\n return error.status === 0 || [408, 425, 429, 500, 502, 503, 504].includes(error.status);\n }\n\n #mapResponse(body: unknown, handler: SdApiHandler | undefined): unknown {\n if (body !== null && typeof body === 'object' && 'ok' in body && body.ok === false) {\n throw body;\n }\n return handler?.mapResponse ? handler.mapResponse(body) : body;\n }\n\n #getHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));\n }\n\n #generateKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string {\n return Utilities.hash({\n method,\n url,\n body: this.#normalizeBody(body),\n headers: this.#normalizeHeaders(option?.headers),\n params: this.#normalizeParams(option?.params),\n context: option?.context ? this.#getObjectId(option.context) : undefined,\n reportProgress: option?.reportProgress ?? false,\n responseType: option?.responseType ?? 'json',\n withCredentials: option?.withCredentials ?? false,\n transferCache: option?.transferCache,\n timeout: this.#resolveTimeout(url, option?.timeout),\n retry: option?.retry\n ? {\n attempts: this.#normalizeRetryAttempts(option.retry.attempts),\n delayMs: this.#normalizeRetryDelay(option.retry.delayMs),\n backoff: this.#normalizeRetryBackoff(option.retry.backoff),\n mutations: option.retry.mutations,\n retryWhen: option.retry.retryWhen ? this.#getObjectId(option.retry.retryWhen) : undefined,\n }\n : undefined,\n });\n }\n\n #generateRequestKey(url: string, method: HttpMethod, body: unknown, option?: SdHttpOptions): string {\n return Utilities.hash({\n responseKey: this.#generateKey(url, method, body, option),\n dedupeWindowMs: this.#normalizeDedupeWindow(option?.dedupeWindowMs),\n });\n }\n\n #normalizeDedupeWindow(dedupeWindowMs: number | undefined): number {\n return this.#normalizeFiniteNumber(dedupeWindowMs, this.#defaultDedupeWindowMs, 0, this.#maxTimerMs);\n }\n\n #resolveTimeout(url: string, timeoutMs: number | undefined): number {\n const configuredTimeout = timeoutMs === undefined ? this.#getHandler(url)?.timeout : timeoutMs;\n return this.#normalizeFiniteNumber(configuredTimeout, this.#defaultTimeout, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryAttempts(attempts: number | undefined): number {\n return Math.floor(this.#normalizeFiniteNumber(attempts, 0, 0, this.#maxRetryAttempts));\n }\n\n #normalizeRetryDelay(delayMs: number | undefined): number {\n return this.#normalizeFiniteNumber(delayMs, 0, 0, this.#maxTimerMs);\n }\n\n #normalizeRetryBackoff(backoff: number | undefined): number {\n const normalized = this.#normalizeFiniteNumber(backoff, 1, 0, this.#maxTimerMs);\n return normalized > 0 ? normalized : 1;\n }\n\n #normalizeFiniteNumber(value: number | undefined, defaultValue: number, minimum: number, maximum: number): number {\n if (value === undefined || !Number.isFinite(value)) return defaultValue;\n return Math.min(maximum, Math.max(minimum, value));\n }\n\n #normalizeBody(body: unknown, ancestors = new WeakSet<object>()): unknown {\n if (body === null || typeof body !== 'object') return body;\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n return { urlSearchParams: body.toString() };\n }\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n return { objectType: 'FormData', objectId: this.#getObjectId(body) };\n }\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n return { objectType: 'Blob', objectId: this.#getObjectId(body) };\n }\n if (typeof ArrayBuffer !== 'undefined' && (body instanceof ArrayBuffer || ArrayBuffer.isView(body))) {\n return { objectType: 'ArrayBuffer', objectId: this.#getObjectId(body) };\n }\n if (body instanceof Date) {\n return { date: body.getTime() };\n }\n if (ancestors.has(body)) {\n return { circularObjectId: this.#getObjectId(body) };\n }\n if (Array.isArray(body)) {\n ancestors.add(body);\n const normalized = body.map(value => this.#normalizeBody(value, ancestors));\n ancestors.delete(body);\n return normalized;\n }\n const prototype = Object.getPrototypeOf(body);\n if (prototype === Object.prototype || prototype === null) {\n ancestors.add(body);\n const normalized = Object.fromEntries(Object.entries(body).map(([key, value]) => [key, this.#normalizeBody(value, ancestors)]));\n ancestors.delete(body);\n return normalized;\n }\n return { objectType: prototype?.constructor?.name ?? 'Object', objectId: this.#getObjectId(body) };\n }\n\n #normalizeHeaders(headers: SdHttpOptions['headers']): unknown {\n if (headers instanceof HttpHeaders) {\n return headers\n .keys()\n .sort()\n .map(key => [key.toLowerCase(), headers.getAll(key)]);\n }\n return headers;\n }\n\n #normalizeParams(params: SdHttpOptions['params']): unknown {\n if (params instanceof HttpParams) {\n return params\n .keys()\n .sort()\n .map(key => [key, params.getAll(key)]);\n }\n return params;\n }\n\n #toHttpHeaders(headers: SdHttpOptions['headers']): HttpHeaders | undefined {\n if (!headers || headers instanceof HttpHeaders) return headers;\n return new HttpHeaders(headers);\n }\n\n #toHttpParams(params: SdHttpOptions['params']): HttpParams | undefined {\n if (!params || params instanceof HttpParams) return params;\n return new HttpParams({ fromObject: params });\n }\n\n #getObjectId(value: object): number {\n const existing = this.#objectIds.get(value);\n if (existing !== undefined) return existing;\n const id = this.#nextObjectId++;\n this.#objectIds.set(value, id);\n return id;\n }\n\n #createAbortError(): Error {\n const error = new Error('The operation was aborted');\n error.name = 'AbortError';\n return error;\n }\n\n #isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n }\n\n #destroy(): void {\n if (this.#destroyed) return;\n this.#destroyed = true;\n\n for (const request of [...this.#activeRequests]) {\n if (request.replayTimer !== undefined) {\n clearTimeout(request.replayTimer);\n request.replayTimer = undefined;\n }\n if (request.state === 'pending') {\n request.state = 'cancelled';\n request.subscription.unsubscribe();\n request.reject(this.#createAbortError());\n }\n this.#removeRequest(request);\n }\n this.#sharedRequests.clear();\n this.#activeRequests.clear();\n }\n}\n","import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { defer, from, Observable, of, throwError } from 'rxjs';\nimport { catchError, concatMap, dematerialize, map, materialize, switchMap } from 'rxjs/operators';\nimport { ISdApiConfiguration, SD_API_CONFIG, SdApiHandler } from '../api.model';\n\n@Injectable()\nexport class SdHttpInterceptor implements HttpInterceptor {\n readonly #configurations = inject<ISdApiConfiguration[]>(SD_API_CONFIG, { optional: true }) ?? [];\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n if (!request.url) throw new Error('Invalid URL');\n\n const handler = this.#findHandler(request.url);\n if (handler?.intercept) {\n const interceptedRequest = handler.intercept(request);\n request = interceptedRequest instanceof HttpRequest ? interceptedRequest : request.clone(interceptedRequest);\n }\n if (typeof FormData !== 'undefined' && request.body instanceof FormData) {\n request = request.clone({ headers: request.headers.delete('Content-Type') });\n }\n\n const beforeRemote = handler?.beforeRemote?.(request);\n if (beforeRemote instanceof Promise) {\n return from(beforeRemote).pipe(switchMap(() => this.#handleRemote(request, next, handler)));\n }\n return this.#handleRemote(request, next, handler);\n }\n\n #handleRemote(request: HttpRequest<unknown>, next: HttpHandler, handler: SdApiHandler | undefined): Observable<HttpEvent<unknown>> {\n return next.handle(request).pipe(\n materialize(),\n concatMap(notification => {\n const afterValue =\n notification.kind === 'N' && notification.value instanceof HttpResponse\n ? notification.value\n : notification.kind === 'E' && (notification.error instanceof Error || notification.error instanceof HttpErrorResponse)\n ? notification.error\n : undefined;\n if (!afterValue || !handler?.afterRemote) {\n return of(notification);\n }\n\n return defer(() => {\n const result = handler.afterRemote?.(afterValue);\n return result instanceof Promise ? result : Promise.resolve();\n }).pipe(\n map(() => notification),\n catchError(hookError => (notification.kind === 'E' ? of(notification) : throwError(() => hookError)))\n );\n }),\n dematerialize()\n );\n }\n\n #findHandler(url: string): SdApiHandler | undefined {\n const handlers = this.#configurations.flatMap(configuration => configuration.handlers ?? []);\n return handlers.find(handler => handler.hosts.some(host => url.startsWith(host)));\n }\n}\n","import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\nimport { NgModule } from '@angular/core';\nimport { SdHttpInterceptor } from './interceptors/api.interceptor';\n\n@NgModule({\n imports: [],\n exports: [],\n providers: [provideHttpClient(withInterceptorsFromDi()), { provide: HTTP_INTERCEPTORS, useClass: SdHttpInterceptor, multi: true }],\n})\nexport class SdApiModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}