@sinequa/atomic-angular 0.0.140 → 0.1.3

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 (207) hide show
  1. package/README.md +145 -0
  2. package/components/no-result/i18n/en.json +5 -0
  3. package/components/no-result/i18n/fr.json +5 -0
  4. package/components/sort-selector/i18n/en.json +3 -0
  5. package/components/sort-selector/i18n/fr.json +3 -0
  6. package/components/source/i18n/en.json +3 -0
  7. package/components/source/i18n/fr.json +3 -0
  8. package/features/alerts/i18n/en.json +33 -0
  9. package/features/alerts/i18n/fr.json +33 -0
  10. package/features/bookmarks/i18n/en.json +11 -0
  11. package/features/bookmarks/i18n/fr.json +11 -0
  12. package/features/collections/i18n/en.json +17 -0
  13. package/features/collections/i18n/fr.json +16 -0
  14. package/features/dialogs/i18n/en.json +15 -0
  15. package/features/dialogs/i18n/fr.json +15 -0
  16. package/features/did-you-mean/i18n/en.json +5 -0
  17. package/features/did-you-mean/i18n/fr.json +5 -0
  18. package/features/drawer/i18n/en.json +22 -0
  19. package/features/drawer/i18n/fr.json +22 -0
  20. package/features/export/i18n/en.json +7 -0
  21. package/features/export/i18n/fr.json +7 -0
  22. package/features/feedback/i18n/en.json +26 -0
  23. package/features/feedback/i18n/fr.json +26 -0
  24. package/features/filters/i18n/en.json +14 -0
  25. package/features/filters/i18n/fr.json +14 -0
  26. package/features/labels/i18n/en.json +8 -0
  27. package/features/labels/i18n/fr.json +8 -0
  28. package/features/recent-searches/i18n/en.json +6 -0
  29. package/features/recent-searches/i18n/fr.json +6 -0
  30. package/features/saved-searches/i18n/en.json +8 -0
  31. package/features/saved-searches/i18n/fr.json +8 -0
  32. package/features/sign-in/i18n/en.json +12 -0
  33. package/features/sign-in/i18n/fr.json +14 -0
  34. package/fesm2022/sinequa-atomic-angular.mjs +7948 -2383
  35. package/fesm2022/sinequa-atomic-angular.mjs.map +1 -1
  36. package/index.d.ts +6036 -3
  37. package/package.json +68 -10
  38. package/assets/tailwind.css +0 -248
  39. package/esm2022/lib/assistant/index.mjs +0 -2
  40. package/esm2022/lib/assistant/signalR.web.service.mjs +0 -81
  41. package/esm2022/lib/components/dropdown.mjs +0 -127
  42. package/esm2022/lib/components/index.mjs +0 -5
  43. package/esm2022/lib/components/menu/index.mjs +0 -3
  44. package/esm2022/lib/components/menu/menu-item.mjs +0 -22
  45. package/esm2022/lib/components/menu/menu.mjs +0 -99
  46. package/esm2022/lib/components/metadata/index.mjs +0 -2
  47. package/esm2022/lib/components/metadata/metadata.component.mjs +0 -65
  48. package/esm2022/lib/components/theme/index.mjs +0 -3
  49. package/esm2022/lib/components/theme/theme-selector.component.mjs +0 -67
  50. package/esm2022/lib/components/theme/theme-toggle.component.mjs +0 -67
  51. package/esm2022/lib/directives/index.mjs +0 -5
  52. package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -47
  53. package/esm2022/lib/directives/select-article-on-click.directive.mjs +0 -39
  54. package/esm2022/lib/directives/show-bookmark.directive.mjs +0 -55
  55. package/esm2022/lib/directives/theme-provider.directive.mjs +0 -31
  56. package/esm2022/lib/guards/auth.guard.mjs +0 -27
  57. package/esm2022/lib/guards/index.mjs +0 -3
  58. package/esm2022/lib/guards/initialization.guard.mjs +0 -41
  59. package/esm2022/lib/interceptors/audit.interceptor.mjs +0 -23
  60. package/esm2022/lib/interceptors/auth.interceptor.mjs +0 -49
  61. package/esm2022/lib/interceptors/body.interceptor.mjs +0 -24
  62. package/esm2022/lib/interceptors/error.interceptor.mjs +0 -35
  63. package/esm2022/lib/interceptors/index.mjs +0 -7
  64. package/esm2022/lib/interceptors/toast.interceptor.mjs +0 -27
  65. package/esm2022/lib/models/aggregation.mjs +0 -2
  66. package/esm2022/lib/models/article-metadata.mjs +0 -2
  67. package/esm2022/lib/models/autocomplete.mjs +0 -2
  68. package/esm2022/lib/models/custom-json.mjs +0 -2
  69. package/esm2022/lib/models/filter-dropdown.mjs +0 -2
  70. package/esm2022/lib/models/index.mjs +0 -7
  71. package/esm2022/lib/models/user-settings.mjs +0 -2
  72. package/esm2022/lib/pipes/highlight-word.pipe.mjs +0 -33
  73. package/esm2022/lib/pipes/index.mjs +0 -3
  74. package/esm2022/lib/pipes/source-icon.pipe.mjs +0 -43
  75. package/esm2022/lib/providers/eager-provider.mjs +0 -24
  76. package/esm2022/lib/providers/index.mjs +0 -2
  77. package/esm2022/lib/public-api.mjs +0 -19
  78. package/esm2022/lib/resolvers/index.mjs +0 -2
  79. package/esm2022/lib/resolvers/query-name-resolver.mjs +0 -14
  80. package/esm2022/lib/resources/index.mjs +0 -2
  81. package/esm2022/lib/resources/themes.mjs +0 -53
  82. package/esm2022/lib/services/application.service.mjs +0 -245
  83. package/esm2022/lib/services/autocomplete.service.mjs +0 -85
  84. package/esm2022/lib/services/drawer/backdrop.service.mjs +0 -23
  85. package/esm2022/lib/services/drawer/drawer-stack.service.mjs +0 -152
  86. package/esm2022/lib/services/drawer/drawer.service.mjs +0 -38
  87. package/esm2022/lib/services/index.mjs +0 -12
  88. package/esm2022/lib/services/label.service.mjs +0 -161
  89. package/esm2022/lib/services/navigation.service.mjs +0 -59
  90. package/esm2022/lib/services/saved-searches.service.mjs +0 -75
  91. package/esm2022/lib/services/search.service.mjs +0 -89
  92. package/esm2022/lib/services/selection-history.service.mjs +0 -92
  93. package/esm2022/lib/services/selection.service.mjs +0 -87
  94. package/esm2022/lib/stores/aggregations.store.mjs +0 -62
  95. package/esm2022/lib/stores/app.store.mjs +0 -265
  96. package/esm2022/lib/stores/application.store.mjs +0 -93
  97. package/esm2022/lib/stores/index.mjs +0 -9
  98. package/esm2022/lib/stores/principal.store.mjs +0 -47
  99. package/esm2022/lib/stores/query-params.store.mjs +0 -208
  100. package/esm2022/lib/stores/selection.store.mjs +0 -46
  101. package/esm2022/lib/stores/theme.store.mjs +0 -116
  102. package/esm2022/lib/stores/user-settings.store.mjs +0 -272
  103. package/esm2022/lib/tokens/highlights.mjs +0 -32
  104. package/esm2022/lib/tokens/index.mjs +0 -2
  105. package/esm2022/lib/utils/debounced-signal.mjs +0 -38
  106. package/esm2022/lib/utils/index.mjs +0 -8
  107. package/esm2022/lib/utils/inline-worker.mjs +0 -40
  108. package/esm2022/lib/utils/query.mjs +0 -58
  109. package/esm2022/lib/utils/routes.mjs +0 -28
  110. package/esm2022/lib/utils/tailwind-utils.mjs +0 -6
  111. package/esm2022/lib/utils/theme-body-hook.mjs +0 -18
  112. package/esm2022/lib/utils/theme-registry.mjs +0 -6
  113. package/esm2022/lib/web-services/aggregations.service.mjs +0 -104
  114. package/esm2022/lib/web-services/app.service.mjs +0 -48
  115. package/esm2022/lib/web-services/audit.service.mjs +0 -122
  116. package/esm2022/lib/web-services/index.mjs +0 -10
  117. package/esm2022/lib/web-services/json-method-plugin.service.mjs +0 -54
  118. package/esm2022/lib/web-services/preview.service.mjs +0 -327
  119. package/esm2022/lib/web-services/principal.service.mjs +0 -46
  120. package/esm2022/lib/web-services/query.service.mjs +0 -123
  121. package/esm2022/lib/web-services/text-chunck.service.mjs +0 -46
  122. package/esm2022/public-api.mjs +0 -5
  123. package/esm2022/sinequa-atomic-angular.mjs +0 -5
  124. package/lib/assistant/index.d.ts +0 -1
  125. package/lib/assistant/signalR.web.service.d.ts +0 -46
  126. package/lib/components/dropdown.d.ts +0 -50
  127. package/lib/components/index.d.ts +0 -4
  128. package/lib/components/menu/index.d.ts +0 -2
  129. package/lib/components/menu/menu-item.d.ts +0 -8
  130. package/lib/components/menu/menu.d.ts +0 -24
  131. package/lib/components/metadata/index.d.ts +0 -1
  132. package/lib/components/metadata/metadata.component.d.ts +0 -24
  133. package/lib/components/theme/index.d.ts +0 -2
  134. package/lib/components/theme/theme-selector.component.d.ts +0 -70
  135. package/lib/components/theme/theme-toggle.component.d.ts +0 -10
  136. package/lib/directives/index.d.ts +0 -4
  137. package/lib/directives/infinite-scroll.directive.d.ts +0 -30
  138. package/lib/directives/select-article-on-click.directive.d.ts +0 -14
  139. package/lib/directives/show-bookmark.directive.d.ts +0 -52
  140. package/lib/directives/theme-provider.directive.d.ts +0 -20
  141. package/lib/guards/auth.guard.d.ts +0 -7
  142. package/lib/guards/index.d.ts +0 -2
  143. package/lib/guards/initialization.guard.d.ts +0 -20
  144. package/lib/interceptors/audit.interceptor.d.ts +0 -13
  145. package/lib/interceptors/auth.interceptor.d.ts +0 -14
  146. package/lib/interceptors/body.interceptor.d.ts +0 -11
  147. package/lib/interceptors/error.interceptor.d.ts +0 -9
  148. package/lib/interceptors/index.d.ts +0 -5
  149. package/lib/interceptors/toast.interceptor.d.ts +0 -13
  150. package/lib/models/aggregation.d.ts +0 -12
  151. package/lib/models/article-metadata.d.ts +0 -5
  152. package/lib/models/autocomplete.d.ts +0 -5
  153. package/lib/models/custom-json.d.ts +0 -58
  154. package/lib/models/filter-dropdown.d.ts +0 -10
  155. package/lib/models/index.d.ts +0 -6
  156. package/lib/models/user-settings.d.ts +0 -32
  157. package/lib/pipes/highlight-word.pipe.d.ts +0 -22
  158. package/lib/pipes/index.d.ts +0 -2
  159. package/lib/pipes/source-icon.pipe.d.ts +0 -54
  160. package/lib/providers/eager-provider.d.ts +0 -11
  161. package/lib/providers/index.d.ts +0 -1
  162. package/lib/public-api.d.ts +0 -15
  163. package/lib/resolvers/index.d.ts +0 -1
  164. package/lib/resolvers/query-name-resolver.d.ts +0 -9
  165. package/lib/resources/index.d.ts +0 -1
  166. package/lib/resources/themes.d.ts +0 -51
  167. package/lib/services/application.service.d.ts +0 -178
  168. package/lib/services/autocomplete.service.d.ts +0 -91
  169. package/lib/services/drawer/backdrop.service.d.ts +0 -9
  170. package/lib/services/drawer/drawer-stack.service.d.ts +0 -70
  171. package/lib/services/drawer/drawer.service.d.ts +0 -15
  172. package/lib/services/index.d.ts +0 -11
  173. package/lib/services/label.service.d.ts +0 -117
  174. package/lib/services/navigation.service.d.ts +0 -33
  175. package/lib/services/saved-searches.service.d.ts +0 -145
  176. package/lib/services/search.service.d.ts +0 -155
  177. package/lib/services/selection-history.service.d.ts +0 -50
  178. package/lib/services/selection.service.d.ts +0 -127
  179. package/lib/stores/aggregations.store.d.ts +0 -50
  180. package/lib/stores/app.store.d.ts +0 -208
  181. package/lib/stores/application.store.d.ts +0 -106
  182. package/lib/stores/index.d.ts +0 -8
  183. package/lib/stores/principal.store.d.ts +0 -53
  184. package/lib/stores/query-params.store.d.ts +0 -187
  185. package/lib/stores/selection.store.d.ts +0 -62
  186. package/lib/stores/theme.store.d.ts +0 -55
  187. package/lib/stores/user-settings.store.d.ts +0 -161
  188. package/lib/tokens/highlights.d.ts +0 -8
  189. package/lib/tokens/index.d.ts +0 -1
  190. package/lib/utils/debounced-signal.d.ts +0 -25
  191. package/lib/utils/index.d.ts +0 -7
  192. package/lib/utils/inline-worker.d.ts +0 -11
  193. package/lib/utils/query.d.ts +0 -26
  194. package/lib/utils/routes.d.ts +0 -16
  195. package/lib/utils/tailwind-utils.d.ts +0 -2
  196. package/lib/utils/theme-body-hook.d.ts +0 -6
  197. package/lib/utils/theme-registry.d.ts +0 -3
  198. package/lib/web-services/aggregations.service.d.ts +0 -60
  199. package/lib/web-services/app.service.d.ts +0 -30
  200. package/lib/web-services/audit.service.d.ts +0 -75
  201. package/lib/web-services/index.d.ts +0 -9
  202. package/lib/web-services/json-method-plugin.service.d.ts +0 -41
  203. package/lib/web-services/preview.service.d.ts +0 -295
  204. package/lib/web-services/principal.service.d.ts +0 -28
  205. package/lib/web-services/query.service.d.ts +0 -29
  206. package/lib/web-services/text-chunck.service.d.ts +0 -22
  207. package/public-api.d.ts +0 -1
@@ -1,47 +0,0 @@
1
- import { withDevtools } from "@angular-architects/ngrx-toolkit";
2
- import { computed, inject } from "@angular/core";
3
- import { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from "@ngrx/signals";
4
- import { firstValueFrom, map } from "rxjs";
5
- import { globalConfig } from "@sinequa/atomic";
6
- import { PrincipalService } from "../web-services/principal.service";
7
- export const PrincipalStore = signalStore({ providedIn: 'root' }, withDevtools("Principal"), withState({ principal: {}, userOverrideActive: false }), withPrincipalFeatures());
8
- /**
9
- * Enhances the store with principal-related features.
10
- *
11
- * This function integrates state, methods, and computed properties related to the principal.
12
- *
13
- * @returns A feature that can be added to a signal store.
14
- *
15
- * @feature
16
- * - State:
17
- * - `principal`: An object representing the principal.
18
- * - `userOverrideActive`: A boolean indicating if user override is active.
19
- *
20
- * - Methods:
21
- * - `initialize()`: Initializes the principal state by fetching the principal data from the `PrincipalService`.
22
- *
23
- * - Computed Properties:
24
- * - `allowUserOverride`: A computed boolean indicating if user override is allowed based on the principal's administrator status and the `userOverrideActive` state.
25
- * - `isOverridingUser`: A computed boolean indicating if the user override is currently active.
26
- */
27
- export function withPrincipalFeatures() {
28
- return signalStoreFeature(withState({ principal: {}, userOverrideActive: false }), withMethods((store, principalService = inject(PrincipalService)) => ({
29
- /**
30
- * Initializes the principal store by fetching the principal data from the principal service.
31
- * It patches the store with the fetched principal data and a user override active flag from the global configuration.
32
- *
33
- * @returns A promise that resolves when the principal data has been fetched and the store has been patched.
34
- */
35
- initialize() {
36
- return firstValueFrom(principalService.getPrincipal()
37
- .pipe(map(principal => {
38
- const { userOverrideActive = false } = globalConfig;
39
- patchState(store, { principal, userOverrideActive });
40
- })));
41
- }
42
- })), withComputed(({ principal, userOverrideActive }) => ({
43
- allowUserOverride: computed(() => principal().isAdministrator && userOverrideActive() === false),
44
- isOverridingUser: computed(() => userOverrideActive() === true)
45
- })));
46
- }
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbmNpcGFsLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXRvbWljLWFuZ3VsYXIvc3JjL2xpYi9zdG9yZXMvcHJpbmNpcGFsLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSCxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQWEsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFPckUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FDdkMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQ3RCLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFDekIsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQW9CLENBQUMsRUFDekUscUJBQXFCLEVBQUUsQ0FDeEIsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sa0JBQWtCLENBQ3ZCLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFvQixDQUFDLEVBQ3pFLFdBQVcsQ0FBQyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRTs7Ozs7V0FLRztRQUNILFVBQVU7WUFDUixPQUFPLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUU7aUJBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3BCLE1BQU0sRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQUUsR0FBRyxZQUFZLENBQUM7Z0JBQ3BELFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFBO1lBQ3RELENBQUMsQ0FBQyxDQUNILENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUMsRUFDSCxZQUFZLENBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxlQUFlLElBQUksa0JBQWtCLEVBQUUsS0FBSyxLQUFLLENBQUU7UUFDakcsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEtBQUssSUFBSSxDQUFDO0tBQ2hFLENBQUMsQ0FBQyxDQUNKLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd2l0aERldnRvb2xzIH0gZnJvbSBcIkBhbmd1bGFyLWFyY2hpdGVjdHMvbmdyeC10b29sa2l0XCI7XHJcbmltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBwYXRjaFN0YXRlLCBzaWduYWxTdG9yZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoQ29tcHV0ZWQsIHdpdGhNZXRob2RzLCB3aXRoU3RhdGUgfSBmcm9tIFwiQG5ncngvc2lnbmFsc1wiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgbWFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmltcG9ydCB7IFByaW5jaXBhbCwgZ2xvYmFsQ29uZmlnIH0gZnJvbSBcIkBzaW5lcXVhL2F0b21pY1wiO1xyXG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3dlYi1zZXJ2aWNlcy9wcmluY2lwYWwuc2VydmljZVwiO1xyXG5cclxudHlwZSBQcmluY2lwYWxTdGF0ZSA9IHtcclxuICBwcmluY2lwYWw6IFByaW5jaXBhbDtcclxuICB1c2VyT3ZlcnJpZGVBY3RpdmU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBQcmluY2lwYWxTdG9yZSA9IHNpZ25hbFN0b3JlKFxyXG4gIHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0sXHJcbiAgd2l0aERldnRvb2xzKFwiUHJpbmNpcGFsXCIpLFxyXG4gIHdpdGhTdGF0ZSh7IHByaW5jaXBhbDoge30sIHVzZXJPdmVycmlkZUFjdGl2ZTogZmFsc2UgfSBhcyBQcmluY2lwYWxTdGF0ZSksXHJcbiAgd2l0aFByaW5jaXBhbEZlYXR1cmVzKClcclxuKTtcclxuXHJcbi8qKlxyXG4gKiBFbmhhbmNlcyB0aGUgc3RvcmUgd2l0aCBwcmluY2lwYWwtcmVsYXRlZCBmZWF0dXJlcy5cclxuICpcclxuICogVGhpcyBmdW5jdGlvbiBpbnRlZ3JhdGVzIHN0YXRlLCBtZXRob2RzLCBhbmQgY29tcHV0ZWQgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBwcmluY2lwYWwuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEEgZmVhdHVyZSB0aGF0IGNhbiBiZSBhZGRlZCB0byBhIHNpZ25hbCBzdG9yZS5cclxuICpcclxuICogQGZlYXR1cmVcclxuICogLSBTdGF0ZTpcclxuICogICAtIGBwcmluY2lwYWxgOiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwcmluY2lwYWwuXHJcbiAqICAgLSBgdXNlck92ZXJyaWRlQWN0aXZlYDogQSBib29sZWFuIGluZGljYXRpbmcgaWYgdXNlciBvdmVycmlkZSBpcyBhY3RpdmUuXHJcbiAqXHJcbiAqIC0gTWV0aG9kczpcclxuICogICAtIGBpbml0aWFsaXplKClgOiBJbml0aWFsaXplcyB0aGUgcHJpbmNpcGFsIHN0YXRlIGJ5IGZldGNoaW5nIHRoZSBwcmluY2lwYWwgZGF0YSBmcm9tIHRoZSBgUHJpbmNpcGFsU2VydmljZWAuXHJcbiAqXHJcbiAqIC0gQ29tcHV0ZWQgUHJvcGVydGllczpcclxuICogICAtIGBhbGxvd1VzZXJPdmVycmlkZWA6IEEgY29tcHV0ZWQgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHVzZXIgb3ZlcnJpZGUgaXMgYWxsb3dlZCBiYXNlZCBvbiB0aGUgcHJpbmNpcGFsJ3MgYWRtaW5pc3RyYXRvciBzdGF0dXMgYW5kIHRoZSBgdXNlck92ZXJyaWRlQWN0aXZlYCBzdGF0ZS5cclxuICogICAtIGBpc092ZXJyaWRpbmdVc2VyYDogQSBjb21wdXRlZCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHVzZXIgb3ZlcnJpZGUgaXMgY3VycmVudGx5IGFjdGl2ZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB3aXRoUHJpbmNpcGFsRmVhdHVyZXMoKSB7XHJcbiAgcmV0dXJuIHNpZ25hbFN0b3JlRmVhdHVyZShcclxuICAgIHdpdGhTdGF0ZSh7IHByaW5jaXBhbDoge30sIHVzZXJPdmVycmlkZUFjdGl2ZTogZmFsc2UgfSBhcyBQcmluY2lwYWxTdGF0ZSksXHJcbiAgICB3aXRoTWV0aG9kcygoc3RvcmUsIHByaW5jaXBhbFNlcnZpY2UgPSBpbmplY3QoUHJpbmNpcGFsU2VydmljZSkpID0+ICh7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBJbml0aWFsaXplcyB0aGUgcHJpbmNpcGFsIHN0b3JlIGJ5IGZldGNoaW5nIHRoZSBwcmluY2lwYWwgZGF0YSBmcm9tIHRoZSBwcmluY2lwYWwgc2VydmljZS5cclxuICAgICAgICogSXQgcGF0Y2hlcyB0aGUgc3RvcmUgd2l0aCB0aGUgZmV0Y2hlZCBwcmluY2lwYWwgZGF0YSBhbmQgYSB1c2VyIG92ZXJyaWRlIGFjdGl2ZSBmbGFnIGZyb20gdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uLlxyXG4gICAgICAgKlxyXG4gICAgICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwcmluY2lwYWwgZGF0YSBoYXMgYmVlbiBmZXRjaGVkIGFuZCB0aGUgc3RvcmUgaGFzIGJlZW4gcGF0Y2hlZC5cclxuICAgICAgICovXHJcbiAgICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHByaW5jaXBhbFNlcnZpY2UuZ2V0UHJpbmNpcGFsKClcclxuICAgICAgICAgIC5waXBlKG1hcChwcmluY2lwYWwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB7IHVzZXJPdmVycmlkZUFjdGl2ZSA9IGZhbHNlIH0gPSBnbG9iYWxDb25maWc7XHJcbiAgICAgICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIHsgcHJpbmNpcGFsLCB1c2VyT3ZlcnJpZGVBY3RpdmUgfSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKSk7XHJcbiAgICAgIH1cclxuICAgIH0pKSxcclxuICAgIHdpdGhDb21wdXRlZCgoe3ByaW5jaXBhbCwgdXNlck92ZXJyaWRlQWN0aXZlfSkgPT4gKHtcclxuICAgICAgYWxsb3dVc2VyT3ZlcnJpZGU6IGNvbXB1dGVkKCgpID0+IHByaW5jaXBhbCgpLmlzQWRtaW5pc3RyYXRvciAmJiB1c2VyT3ZlcnJpZGVBY3RpdmUoKSA9PT0gZmFsc2UgKSxcclxuICAgICAgaXNPdmVycmlkaW5nVXNlcjogY29tcHV0ZWQoKCkgPT4gdXNlck92ZXJyaWRlQWN0aXZlKCkgPT09IHRydWUpXHJcbiAgICB9KSlcclxuICApO1xyXG59Il19
@@ -1,208 +0,0 @@
1
- import { withDevtools } from '@angular-architects/ngrx-toolkit';
2
- import { getState, patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';
3
- import { addConcepts, queryParamsFromUrl } from '@sinequa/atomic';
4
- import { inject, Injector, runInInjectionContext } from '@angular/core';
5
- import { buildQuery } from '../utils';
6
- const initialState = {};
7
- export const QueryParamsStore = signalStore({ providedIn: 'root' }, withDevtools("QueryParams"), withState(initialState), withQueryParamsFeatures());
8
- export function withQueryParamsFeatures() {
9
- return signalStoreFeature(withState(initialState), withMethods((store, injector = inject(Injector)) => ({
10
- /**
11
- * Sets the state from the given URL by extracting query parameters and updating the store.
12
- *
13
- * @param url - The URL containing query parameters to set the state from.
14
- *
15
- * The function performs the following steps:
16
- * 1. Extracts the path from the URL.
17
- * 2. Parses the query parameters from the URL.
18
- * 3. Decodes and parses the filters from the query parameters.
19
- * 4. Converts the page parameter to a number if it exists.
20
- * 5. Updates the store state with the extracted and parsed values.
21
- */
22
- setFromUrl(url) {
23
- const path = url.split('?')[0];
24
- const { q: text, f, id, p, s: sort, c, t: tab } = queryParamsFromUrl(url);
25
- const filters = f ? JSON.parse(decodeURIComponent(f)) : [];
26
- const spellingCorrectionMode = c;
27
- let page;
28
- if (p) {
29
- page = parseInt(p, 10);
30
- }
31
- patchState(store, (state) => {
32
- return { ...state, path, text, filters, id, page, sort, spellingCorrectionMode, tab };
33
- });
34
- },
35
- /**
36
- * Adds a filter to the store's state.
37
- *
38
- * @param filter - The filter to be added to the state.
39
- *
40
- * The function calls the `updateFilter` method to add the filter to the state.
41
- */
42
- addFilter(filter) {
43
- this.updateFilter(filter);
44
- },
45
- /**
46
- * Updates the filter in the store's state.
47
- *
48
- * @param filter - The filter to be updated. If the filter is `undefined`, the state remains unchanged.
49
- *
50
- * The function performs the following operations:
51
- * - Adds the filter to the state if it doesn't already exist and has values.
52
- * - Removes the filter if the 'between' operator is selected but no values are provided.
53
- * - Removes the filter if no values are selected and the operator is not 'between'.
54
- * - Updates the filter values if the filter already exists.
55
- *
56
- * @remarks
57
- * - If the filter is `undefined`, the state remains unchanged.
58
- * - If the filter's operator is 'between' and both `start` and `end` are `undefined`, the filter is removed.
59
- * - If the filter's operator is not 'between' and `filters`, `value`, and `values` are all `undefined`, the filter is removed.
60
- * - If the filter already exists, its values are updated.
61
- */
62
- updateFilter(filter) {
63
- patchState(store, (state) => {
64
- if (filter === undefined)
65
- return state;
66
- const allFilters = state.filters || [];
67
- const existing = allFilters.findIndex((f) => f.field === filter.field);
68
- // Add filter if it doesn't exist and has values
69
- if (existing === -1) {
70
- return ({ ...state, filters: [...allFilters || [], filter] });
71
- }
72
- if (existing >= 0) {
73
- // remove filter if between operator is selected but no values are selected
74
- if (filter.operator === 'between' && filter.start === undefined && filter.end === undefined) {
75
- return ({ ...state, filters: allFilters.filter(f => f.field !== filter.field) });
76
- }
77
- // Remove filter if no values are selected
78
- if (filter.operator !== 'between' && filter.filters === undefined && filter.value === undefined && filter.values === undefined) {
79
- return ({ ...state, filters: (allFilters || []).filter(f => f?.field !== filter.field) });
80
- }
81
- // Update filter values
82
- if (existing >= 0) {
83
- const filters = allFilters.toSpliced(existing, 1, filter);
84
- return ({ ...state, filters });
85
- }
86
- }
87
- return state;
88
- });
89
- },
90
- /**
91
- * Removes a filter from the store based on the specified field.
92
- *
93
- * @param field - The field of the filter to be removed.
94
- */
95
- removeFilter(field) {
96
- if (!field)
97
- return;
98
- patchState(store, (state) => {
99
- const filters = state.filters?.filter(f => f.field !== field);
100
- return { ...state, filters };
101
- });
102
- },
103
- /**
104
- * Removes a filter from the state by its name.
105
- *
106
- * @param name - The name of the filter to be removed.
107
- */
108
- removeFilterByName(name) {
109
- if (!name)
110
- return;
111
- patchState(store, (state) => {
112
- const filters = state.filters?.filter(f => f.name !== name);
113
- return { ...state, filters };
114
- });
115
- },
116
- /**
117
- * Clears all filters from the state.
118
- *
119
- * This method updates the state by setting the `filters` property to an empty array.
120
- * It uses the `patchState` function to apply the state change.
121
- */
122
- clearFilters() {
123
- patchState(store, (state) => {
124
- return { ...state, filters: [] };
125
- });
126
- },
127
- /**
128
- * Updates the current state with the provided query parameters.
129
- *
130
- * @param params - A partial object containing the query parameters to be updated.
131
- */
132
- patch(params) {
133
- patchState(store, (state) => {
134
- return { ...state, ...params };
135
- });
136
- },
137
- /**
138
- * Retrieves a filter object based on the provided field or name.
139
- *
140
- * @param {string} fieldOrName - The field or name to search for in the filters.
141
- * @returns {Partial<LegacyFilter & {count: number}> | null} - The filter object with an additional count property, or null if not found.
142
- *
143
- * The method performs the following steps:
144
- * 1. Checks if the `fieldOrName` parameter is provided. If not, returns null.
145
- * 2. Searches for a filter with a matching field in the store's filters.
146
- * 3. If no filter is found by field, searches for a filter with a matching name.
147
- * 4. If a filter is found and has a `value` property, returns the filter with a count of 1.
148
- * 5. If a filter is found and does not have an array of filters, returns the filter with a count of 1.
149
- * 6. If a filter is found and has a `values` property, returns the filter with the count set to the length of the `values` array.
150
- * 7. If a filter is found and has an array of filters, returns the filter with the count set to the length of the `filters` array.
151
- * 8. If none of the above conditions are met, returns the filter with a count of 0.
152
- */
153
- getFilter(fieldOrName) {
154
- if (!fieldOrName)
155
- return null;
156
- let filter = getState(store).filters?.find(f => f?.field === fieldOrName);
157
- // if not found, return checks for the filter name
158
- if (!filter)
159
- filter = getState(store).filters?.find(f => f?.name === fieldOrName);
160
- // if filter is found, return null
161
- if (!filter)
162
- return null;
163
- if (filter.operator && filter.operator === 'or') {
164
- const count = Array.isArray(filter.filters) ? filter.filters.length : 1;
165
- return ({ ...filter, count });
166
- }
167
- if (filter.operator && filter.operator === 'and') {
168
- return ({ ...filter, count: 1 });
169
- }
170
- if (filter && filter.value)
171
- return ({ ...filter, count: 1 });
172
- if (filter && filter.values)
173
- return ({ ...filter, count: filter.values.length });
174
- if (filter && Array.isArray(filter.filters) === false)
175
- return ({ ...filter, count: 1 });
176
- if (filter && Array.isArray(filter.filters))
177
- return ({ ...filter, count: filter.filters.length });
178
- return ({ ...filter, count: 0 });
179
- },
180
- /**
181
- * Constructs and returns a query object based on the current state of the store.
182
- *
183
- * This method retrieves various parameters from the store's state, such as filters, sort order, tab, query text, query name, and spelling correction mode.
184
- * It processes the filters to separate out "concepts" filters and incorporates them into the query text.
185
- * The remaining filters are combined appropriately.
186
- * Finally, it builds and returns the query object using the processed parameters.
187
- *
188
- * @returns Query The constructed query object.
189
- */
190
- getQuery() {
191
- const { filters: allFilters = [], sort, tab, text: queryText = '', name, spellingCorrectionMode } = getState(store);
192
- let text = queryText;
193
- // remove concepts filters from the query to add them in the query expression
194
- const [conceptsFilters] = allFilters.filter(f => f.field === "concepts");
195
- if (conceptsFilters) {
196
- const concepts = conceptsFilters.filters ? conceptsFilters.filters.map(f => f.value) : [conceptsFilters.value];
197
- text = addConcepts(queryText, concepts);
198
- }
199
- const filters = allFilters.filter(f => f.field !== "concepts");
200
- const f = filters.length > 1
201
- ? { operator: "and", filters }
202
- : filters[0];
203
- const query = runInInjectionContext(injector, () => buildQuery({ filters: f, name, sort, spellingCorrectionMode, tab, text }));
204
- return query;
205
- }
206
- })));
207
- }
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktcGFyYW1zLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXRvbWljLWFuZ3VsYXIvc3JjL2xpYi9zdG9yZXMvcXVlcnktcGFyYW1zLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RyxPQUFPLEVBQUUsV0FBVyxFQUF1QixrQkFBa0IsRUFBMEIsTUFBTSxpQkFBaUIsQ0FBQztBQUUvRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBUXRDLE1BQU0sWUFBWSxHQUFxQixFQUFFLENBQUM7QUFFMUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUN6QyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsRUFDdEIsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUMzQixTQUFTLENBQUMsWUFBWSxDQUFDLEVBQ3ZCLHVCQUF1QixFQUFFLENBQzFCLENBQUE7QUFFRCxNQUFNLFVBQVUsdUJBQXVCO0lBQ3JDLE9BQU8sa0JBQWtCLENBQ3ZCLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFDdkIsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkQ7Ozs7Ozs7Ozs7O1dBV0c7UUFDSCxVQUFVLENBQUMsR0FBVztZQUNwQixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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LENBQUMsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpdGhEZXZ0b29scyB9IGZyb20gJ0Bhbmd1bGFyLWFyY2hpdGVjdHMvbmdyeC10b29sa2l0JztcbmltcG9ydCB7IGdldFN0YXRlLCBwYXRjaFN0YXRlLCBzaWduYWxTdG9yZSwgc2lnbmFsU3RvcmVGZWF0dXJlLCB3aXRoTWV0aG9kcywgd2l0aFN0YXRlIH0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5cbmltcG9ydCB7IGFkZENvbmNlcHRzLCBMZWdhY3lGaWx0ZXIsIFF1ZXJ5LCBxdWVyeVBhcmFtc0Zyb21VcmwsIFNwZWxsaW5nQ29ycmVjdGlvbk1vZGUgfSBmcm9tICdAc2luZXF1YS9hdG9taWMnO1xuXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdG9yLCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGJ1aWxkUXVlcnkgfSBmcm9tICcuLi91dGlscyc7XG5cbnR5cGUgUXVlcnlQYXJhbXNTdGF0ZSA9IFBhcnRpYWw8T21pdDxRdWVyeSwgXCJmaWx0ZXJzXCI+PiAmIHtcbiAgcGF0aD86IHN0cmluZztcbiAgZmlsdGVycz86IExlZ2FjeUZpbHRlcltdO1xuICBpZD86IHN0cmluZztcbn07XG5cbmNvbnN0IGluaXRpYWxTdGF0ZTogUXVlcnlQYXJhbXNTdGF0ZSA9IHt9O1xuXG5leHBvcnQgY29uc3QgUXVlcnlQYXJhbXNTdG9yZSA9IHNpZ25hbFN0b3JlKFxuICB7IHByb3ZpZGVkSW46ICdyb290JyB9LFxuICB3aXRoRGV2dG9vbHMoXCJRdWVyeVBhcmFtc1wiKSxcbiAgd2l0aFN0YXRlKGluaXRpYWxTdGF0ZSksXG4gIHdpdGhRdWVyeVBhcmFtc0ZlYXR1cmVzKClcbilcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhRdWVyeVBhcmFtc0ZlYXR1cmVzKCkge1xuICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgIHdpdGhTdGF0ZShpbml0aWFsU3RhdGUpLFxuICAgIHdpdGhNZXRob2RzKChzdG9yZSwgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpKSA9PiAoe1xuICAgICAgLyoqXG4gICAgICAgKiBTZXRzIHRoZSBzdGF0ZSBmcm9tIHRoZSBnaXZlbiBVUkwgYnkgZXh0cmFjdGluZyBxdWVyeSBwYXJhbWV0ZXJzIGFuZCB1cGRhdGluZyB0aGUgc3RvcmUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHVybCAtIFRoZSBVUkwgY29udGFpbmluZyBxdWVyeSBwYXJhbWV0ZXJzIHRvIHNldCB0aGUgc3RhdGUgZnJvbS5cbiAgICAgICAqXG4gICAgICAgKiBUaGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgICAgICAqIDEuIEV4dHJhY3RzIHRoZSBwYXRoIGZyb20gdGhlIFVSTC5cbiAgICAgICAqIDIuIFBhcnNlcyB0aGUgcXVlcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBVUkwuXG4gICAgICAgKiAzLiBEZWNvZGVzIGFuZCBwYXJzZXMgdGhlIGZpbHRlcnMgZnJvbSB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICAgICAqIDQuIENvbnZlcnRzIHRoZSBwYWdlIHBhcmFtZXRlciB0byBhIG51bWJlciBpZiBpdCBleGlzdHMuXG4gICAgICAgKiA1LiBVcGRhdGVzIHRoZSBzdG9yZSBzdGF0ZSB3aXRoIHRoZSBleHRyYWN0ZWQgYW5kIHBhcnNlZCB2YWx1ZXMuXG4gICAgICAgKi9cbiAgICAgIHNldEZyb21VcmwodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHVybC5zcGxpdCgnPycpWzBdO1xuXG4gICAgICAgIGNvbnN0IHsgcTogdGV4dCwgZiwgaWQsIHAsIHM6IHNvcnQsIGMsIHQ6IHRhYiB9ID0gcXVlcnlQYXJhbXNGcm9tVXJsKHVybCk7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBmID8gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoZikpIDogW107XG4gICAgICAgIGNvbnN0IHNwZWxsaW5nQ29ycmVjdGlvbk1vZGUgPSBjIGFzIFNwZWxsaW5nQ29ycmVjdGlvbk1vZGU7XG5cbiAgICAgICAgbGV0IHBhZ2U6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICBwYWdlID0gcGFyc2VJbnQocCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlOiBRdWVyeVBhcmFtc1N0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHBhdGgsIHRleHQsIGZpbHRlcnMsIGlkLCBwYWdlLCBzb3J0LCBzcGVsbGluZ0NvcnJlY3Rpb25Nb2RlLCB0YWIgfTtcbiAgICAgICAgfSlcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIEFkZHMgYSBmaWx0ZXIgdG8gdGhlIHN0b3JlJ3Mgc3RhdGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGZpbHRlciAtIFRoZSBmaWx0ZXIgdG8gYmUgYWRkZWQgdG8gdGhlIHN0YXRlLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBmdW5jdGlvbiBjYWxscyB0aGUgYHVwZGF0ZUZpbHRlcmAgbWV0aG9kIHRvIGFkZCB0aGUgZmlsdGVyIHRvIHRoZSBzdGF0ZS5cbiAgICAgICAqL1xuICAgICAgYWRkRmlsdGVyKGZpbHRlcjogTGVnYWN5RmlsdGVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyKGZpbHRlcik7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGVzIHRoZSBmaWx0ZXIgaW4gdGhlIHN0b3JlJ3Mgc3RhdGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGZpbHRlciAtIFRoZSBmaWx0ZXIgdG8gYmUgdXBkYXRlZC4gSWYgdGhlIGZpbHRlciBpcyBgdW5kZWZpbmVkYCwgdGhlIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkLlxuICAgICAgICpcbiAgICAgICAqIFRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnM6XG4gICAgICAgKiAtIEFkZHMgdGhlIGZpbHRlciB0byB0aGUgc3RhdGUgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGFuZCBoYXMgdmFsdWVzLlxuICAgICAgICogLSBSZW1vdmVzIHRoZSBmaWx0ZXIgaWYgdGhlICdiZXR3ZWVuJyBvcGVyYXRvciBpcyBzZWxlY3RlZCBidXQgbm8gdmFsdWVzIGFyZSBwcm92aWRlZC5cbiAgICAgICAqIC0gUmVtb3ZlcyB0aGUgZmlsdGVyIGlmIG5vIHZhbHVlcyBhcmUgc2VsZWN0ZWQgYW5kIHRoZSBvcGVyYXRvciBpcyBub3QgJ2JldHdlZW4nLlxuICAgICAgICogLSBVcGRhdGVzIHRoZSBmaWx0ZXIgdmFsdWVzIGlmIHRoZSBmaWx0ZXIgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIC0gSWYgdGhlIGZpbHRlciBpcyBgdW5kZWZpbmVkYCwgdGhlIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkLlxuICAgICAgICogLSBJZiB0aGUgZmlsdGVyJ3Mgb3BlcmF0b3IgaXMgJ2JldHdlZW4nIGFuZCBib3RoIGBzdGFydGAgYW5kIGBlbmRgIGFyZSBgdW5kZWZpbmVkYCwgdGhlIGZpbHRlciBpcyByZW1vdmVkLlxuICAgICAgICogLSBJZiB0aGUgZmlsdGVyJ3Mgb3BlcmF0b3IgaXMgbm90ICdiZXR3ZWVuJyBhbmQgYGZpbHRlcnNgLCBgdmFsdWVgLCBhbmQgYHZhbHVlc2AgYXJlIGFsbCBgdW5kZWZpbmVkYCwgdGhlIGZpbHRlciBpcyByZW1vdmVkLlxuICAgICAgICogLSBJZiB0aGUgZmlsdGVyIGFscmVhZHkgZXhpc3RzLCBpdHMgdmFsdWVzIGFyZSB1cGRhdGVkLlxuICAgICAgICovXG4gICAgICB1cGRhdGVGaWx0ZXIoZmlsdGVyOiBMZWdhY3lGaWx0ZXIpIHtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgaWYoZmlsdGVyID09PSB1bmRlZmluZWQpIHJldHVybiBzdGF0ZTtcblxuICAgICAgICAgIGNvbnN0IGFsbEZpbHRlcnMgPSBzdGF0ZS5maWx0ZXJzIHx8IFtdO1xuXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhbGxGaWx0ZXJzLmZpbmRJbmRleCgoZikgPT4gZi5maWVsZCA9PT0gZmlsdGVyLmZpZWxkKTtcblxuICAgICAgICAgIC8vIEFkZCBmaWx0ZXIgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgaGFzIHZhbHVlc1xuICAgICAgICAgIGlmIChleGlzdGluZyA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAoey4uLnN0YXRlLCBmaWx0ZXJzOiBbLi4uYWxsRmlsdGVycyB8fCBbXSwgZmlsdGVyXX0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKGV4aXN0aW5nID49MCl7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSBmaWx0ZXIgaWYgYmV0d2VlbiBvcGVyYXRvciBpcyBzZWxlY3RlZCBidXQgbm8gdmFsdWVzIGFyZSBzZWxlY3RlZFxuICAgICAgICAgICAgaWYoZmlsdGVyLm9wZXJhdG9yID09PSAnYmV0d2VlbicgJiYgZmlsdGVyLnN0YXJ0ID09PSB1bmRlZmluZWQgJiYgZmlsdGVyLmVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoey4uLnN0YXRlLCBmaWx0ZXJzOiBhbGxGaWx0ZXJzLmZpbHRlcihmID0+IGYuZmllbGQgIT09IGZpbHRlci5maWVsZCl9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGZpbHRlciBpZiBubyB2YWx1ZXMgYXJlIHNlbGVjdGVkXG4gICAgICAgICAgICBpZiAoZmlsdGVyLm9wZXJhdG9yICE9PSAnYmV0d2VlbicgJiYgZmlsdGVyLmZpbHRlcnMgPT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIudmFsdWUgPT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIudmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICh7Li4uc3RhdGUsIGZpbHRlcnM6IChhbGxGaWx0ZXJzIHx8IFtdKS5maWx0ZXIoZiA9PiBmPy5maWVsZCAhPT0gZmlsdGVyLmZpZWxkKX0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgZmlsdGVyIHZhbHVlc1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nID49IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IGFsbEZpbHRlcnMudG9TcGxpY2VkKGV4aXN0aW5nLCAxLCBmaWx0ZXIpO1xuICAgICAgICAgICAgICByZXR1cm4gKHsuLi5zdGF0ZSwgZmlsdGVyc30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZXMgYSBmaWx0ZXIgZnJvbSB0aGUgc3RvcmUgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBmaWVsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBUaGUgZmllbGQgb2YgdGhlIGZpbHRlciB0byBiZSByZW1vdmVkLlxuICAgICAgICovXG4gICAgICByZW1vdmVGaWx0ZXIoZmllbGQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYoIWZpZWxkKSByZXR1cm47XG4gICAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBzdGF0ZS5maWx0ZXJzPy5maWx0ZXIoZiA9PiBmLmZpZWxkICE9PSBmaWVsZCk7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIGZpbHRlcnMgfTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmVzIGEgZmlsdGVyIGZyb20gdGhlIHN0YXRlIGJ5IGl0cyBuYW1lLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpbHRlciB0byBiZSByZW1vdmVkLlxuICAgICAgICovXG4gICAgICByZW1vdmVGaWx0ZXJCeU5hbWUobmFtZT86IHN0cmluZykge1xuICAgICAgICBpZighbmFtZSkgcmV0dXJuO1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gc3RhdGUuZmlsdGVycz8uZmlsdGVyKGYgPT4gZi5uYW1lICE9PSBuYW1lKTtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZmlsdGVycyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIENsZWFycyBhbGwgZmlsdGVycyBmcm9tIHRoZSBzdGF0ZS5cbiAgICAgICAqXG4gICAgICAgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBzdGF0ZSBieSBzZXR0aW5nIHRoZSBgZmlsdGVyc2AgcHJvcGVydHkgdG8gYW4gZW1wdHkgYXJyYXkuXG4gICAgICAgKiBJdCB1c2VzIHRoZSBgcGF0Y2hTdGF0ZWAgZnVuY3Rpb24gdG8gYXBwbHkgdGhlIHN0YXRlIGNoYW5nZS5cbiAgICAgICAqL1xuICAgICAgY2xlYXJGaWx0ZXJzKCkge1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgZmlsdGVyczogW10gfTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlcnMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEEgcGFydGlhbCBvYmplY3QgY29udGFpbmluZyB0aGUgcXVlcnkgcGFyYW1ldGVycyB0byBiZSB1cGRhdGVkLlxuICAgICAgICovXG4gICAgICBwYXRjaChwYXJhbXM6IFBhcnRpYWw8UXVlcnlQYXJhbXNTdGF0ZT4pIHtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIC4uLnBhcmFtcyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIFJldHJpZXZlcyBhIGZpbHRlciBvYmplY3QgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGZpZWxkIG9yIG5hbWUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkT3JOYW1lIC0gVGhlIGZpZWxkIG9yIG5hbWUgdG8gc2VhcmNoIGZvciBpbiB0aGUgZmlsdGVycy5cbiAgICAgICAqIEByZXR1cm5zIHtQYXJ0aWFsPExlZ2FjeUZpbHRlciAmIHtjb3VudDogbnVtYmVyfT4gfCBudWxsfSAtIFRoZSBmaWx0ZXIgb2JqZWN0IHdpdGggYW4gYWRkaXRpb25hbCBjb3VudCBwcm9wZXJ0eSwgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gICAgICAgKlxuICAgICAgICogVGhlIG1ldGhvZCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICAgICAgICogMS4gQ2hlY2tzIGlmIHRoZSBgZmllbGRPck5hbWVgIHBhcmFtZXRlciBpcyBwcm92aWRlZC4gSWYgbm90LCByZXR1cm5zIG51bGwuXG4gICAgICAgKiAyLiBTZWFyY2hlcyBmb3IgYSBmaWx0ZXIgd2l0aCBhIG1hdGNoaW5nIGZpZWxkIGluIHRoZSBzdG9yZSdzIGZpbHRlcnMuXG4gICAgICAgKiAzLiBJZiBubyBmaWx0ZXIgaXMgZm91bmQgYnkgZmllbGQsIHNlYXJjaGVzIGZvciBhIGZpbHRlciB3aXRoIGEgbWF0Y2hpbmcgbmFtZS5cbiAgICAgICAqIDQuIElmIGEgZmlsdGVyIGlzIGZvdW5kIGFuZCBoYXMgYSBgdmFsdWVgIHByb3BlcnR5LCByZXR1cm5zIHRoZSBmaWx0ZXIgd2l0aCBhIGNvdW50IG9mIDEuXG4gICAgICAgKiA1LiBJZiBhIGZpbHRlciBpcyBmb3VuZCBhbmQgZG9lcyBub3QgaGF2ZSBhbiBhcnJheSBvZiBmaWx0ZXJzLCByZXR1cm5zIHRoZSBmaWx0ZXIgd2l0aCBhIGNvdW50IG9mIDEuXG4gICAgICAgKiA2LiBJZiBhIGZpbHRlciBpcyBmb3VuZCBhbmQgaGFzIGEgYHZhbHVlc2AgcHJvcGVydHksIHJldHVybnMgdGhlIGZpbHRlciB3aXRoIHRoZSBjb3VudCBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgYHZhbHVlc2AgYXJyYXkuXG4gICAgICAgKiA3LiBJZiBhIGZpbHRlciBpcyBmb3VuZCBhbmQgaGFzIGFuIGFycmF5IG9mIGZpbHRlcnMsIHJldHVybnMgdGhlIGZpbHRlciB3aXRoIHRoZSBjb3VudCBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgYGZpbHRlcnNgIGFycmF5LlxuICAgICAgICogOC4gSWYgbm9uZSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbWV0LCByZXR1cm5zIHRoZSBmaWx0ZXIgd2l0aCBhIGNvdW50IG9mIDAuXG4gICAgICAgKi9cbiAgICAgIGdldEZpbHRlcihmaWVsZE9yTmFtZT86IHN0cmluZyk6IFBhcnRpYWw8TGVnYWN5RmlsdGVyICYge2NvdW50OiBudW1iZXJ9PiB8IG51bGwge1xuICAgICAgICBpZighZmllbGRPck5hbWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBmaWx0ZXIgPSBnZXRTdGF0ZShzdG9yZSkuZmlsdGVycz8uZmluZChmID0+IGY/LmZpZWxkID09PSBmaWVsZE9yTmFtZSk7XG4gICAgICAgIC8vIGlmIG5vdCBmb3VuZCwgcmV0dXJuIGNoZWNrcyBmb3IgdGhlIGZpbHRlciBuYW1lXG4gICAgICAgIGlmKCFmaWx0ZXIpIGZpbHRlciA9IGdldFN0YXRlKHN0b3JlKS5maWx0ZXJzPy5maW5kKGYgPT4gZj8ubmFtZSA9PT0gZmllbGRPck5hbWUpO1xuXG4gICAgICAgIC8vIGlmIGZpbHRlciBpcyBmb3VuZCwgcmV0dXJuIG51bGxcbiAgICAgICAgaWYoIWZpbHRlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYoZmlsdGVyLm9wZXJhdG9yICYmIGZpbHRlci5vcGVyYXRvciA9PT0gJ29yJykge1xuICAgICAgICAgIGNvbnN0IGNvdW50ID0gQXJyYXkuaXNBcnJheShmaWx0ZXIuZmlsdGVycykgPyBmaWx0ZXIuZmlsdGVycy5sZW5ndGggOiAxO1xuICAgICAgICAgIHJldHVybiAoey4uLmZpbHRlciwgY291bnQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZmlsdGVyLm9wZXJhdG9yICYmIGZpbHRlci5vcGVyYXRvciA9PT0gJ2FuZCcpIHtcbiAgICAgICAgICByZXR1cm4gKHsuLi5maWx0ZXIsIGNvdW50OiAxIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoZmlsdGVyICYmIGZpbHRlci52YWx1ZSkgcmV0dXJuICh7Li4uZmlsdGVyLCBjb3VudDogMX0pO1xuICAgICAgICBpZihmaWx0ZXIgJiYgZmlsdGVyLnZhbHVlcykgcmV0dXJuICh7Li4uZmlsdGVyLCBjb3VudDogZmlsdGVyLnZhbHVlcy5sZW5ndGh9KTtcbiAgICAgICAgaWYoZmlsdGVyICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyLmZpbHRlcnMpID09PSBmYWxzZSkgcmV0dXJuICh7Li4uZmlsdGVyLCBjb3VudDogMX0pO1xuICAgICAgICBpZihmaWx0ZXIgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXIuZmlsdGVycykpIHJldHVybiAoey4uLmZpbHRlciwgY291bnQ6IGZpbHRlci5maWx0ZXJzLmxlbmd0aH0pO1xuXG4gICAgICAgIHJldHVybiAoey4uLmZpbHRlciwgY291bnQ6IDB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAgICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYSBxdWVyeSBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN0b3JlLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyB2YXJpb3VzIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3RvcmUncyBzdGF0ZSwgc3VjaCBhcyBmaWx0ZXJzLCBzb3J0IG9yZGVyLCB0YWIsIHF1ZXJ5IHRleHQsIHF1ZXJ5IG5hbWUsIGFuZCBzcGVsbGluZyBjb3JyZWN0aW9uIG1vZGUuXG4gICAgICAgKiBJdCBwcm9jZXNzZXMgdGhlIGZpbHRlcnMgdG8gc2VwYXJhdGUgb3V0IFwiY29uY2VwdHNcIiBmaWx0ZXJzIGFuZCBpbmNvcnBvcmF0ZXMgdGhlbSBpbnRvIHRoZSBxdWVyeSB0ZXh0LlxuICAgICAgICogVGhlIHJlbWFpbmluZyBmaWx0ZXJzIGFyZSBjb21iaW5lZCBhcHByb3ByaWF0ZWx5LlxuICAgICAgICogRmluYWxseSwgaXQgYnVpbGRzIGFuZCByZXR1cm5zIHRoZSBxdWVyeSBvYmplY3QgdXNpbmcgdGhlIHByb2Nlc3NlZCBwYXJhbWV0ZXJzLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIFF1ZXJ5IFRoZSBjb25zdHJ1Y3RlZCBxdWVyeSBvYmplY3QuXG4gICAgICAgKi9cbiAgICAgIGdldFF1ZXJ5KCkge1xuICAgICAgICBjb25zdCB7IGZpbHRlcnM6IGFsbEZpbHRlcnMgPSBbXSwgc29ydCwgdGFiLCB0ZXh0OiBxdWVyeVRleHQgPSAnJywgbmFtZSwgc3BlbGxpbmdDb3JyZWN0aW9uTW9kZSB9ID0gZ2V0U3RhdGUoc3RvcmUpO1xuICAgICAgICBsZXQgdGV4dCA9IHF1ZXJ5VGV4dDtcblxuICAgICAgICAvLyByZW1vdmUgY29uY2VwdHMgZmlsdGVycyBmcm9tIHRoZSBxdWVyeSB0byBhZGQgdGhlbSBpbiB0aGUgcXVlcnkgZXhwcmVzc2lvblxuICAgICAgICBjb25zdCBbY29uY2VwdHNGaWx0ZXJzXSA9IGFsbEZpbHRlcnMuZmlsdGVyKGYgPT4gZi5maWVsZCA9PT0gXCJjb25jZXB0c1wiKTtcbiAgICAgICAgaWYgKGNvbmNlcHRzRmlsdGVycykge1xuICAgICAgICAgIGNvbnN0IGNvbmNlcHRzID0gY29uY2VwdHNGaWx0ZXJzLmZpbHRlcnMgPyAoY29uY2VwdHNGaWx0ZXJzLmZpbHRlcnMgYXMgTGVnYWN5RmlsdGVyW10pLm1hcChmID0+IGYudmFsdWUpIGFzIHN0cmluZ1tdIDogW2NvbmNlcHRzRmlsdGVycy52YWx1ZV0gYXMgc3RyaW5nW107XG4gICAgICAgICAgdGV4dCA9IGFkZENvbmNlcHRzKHF1ZXJ5VGV4dCwgY29uY2VwdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVycyA9IGFsbEZpbHRlcnMuZmlsdGVyKGYgPT4gZi5maWVsZCAhPT0gXCJjb25jZXB0c1wiKTtcbiAgICAgICAgY29uc3QgZiA9IGZpbHRlcnMubGVuZ3RoID4gMVxuICAgICAgICAgID8geyBvcGVyYXRvcjogXCJhbmRcIiwgZmlsdGVycyB9IGFzIExlZ2FjeUZpbHRlclxuICAgICAgICAgIDogZmlsdGVyc1swXSBhcyBMZWdhY3lGaWx0ZXI7XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+ICBidWlsZFF1ZXJ5KHsgZmlsdGVyczogZiwgbmFtZSwgc29ydCwgc3BlbGxpbmdDb3JyZWN0aW9uTW9kZSwgdGFiLCB0ZXh0IH0pKTtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5O1xuICAgICAgfVxuICAgIH0pKVxuICApO1xufSJdfQ==
@@ -1,46 +0,0 @@
1
- import { withDevtools } from "@angular-architects/ngrx-toolkit";
2
- import { patchState, signalStore, signalStoreFeature, withMethods, withState } from "@ngrx/signals";
3
- const initialState = {};
4
- /**
5
- * @constant
6
- * @name SelectionStore
7
- * @description
8
- * A store that manages the selection state of articles. It is provided in the root of the application and includes
9
- * development tools for easier debugging. The store maintains the state with the following properties:
10
- * - `article`: The selected article.
11
- * - `id`: The ID of the selected article.
12
- * - `queryText`: The query text associated with the selection.
13
- *
14
- * @methods
15
- * - `update(article: Article, queryText?: string)`: Updates the store with a new article and optional query text.
16
- * - `updateQueryText(queryText: string)`: Updates the query text in the store.
17
- * - `clear()`: Clears the selection state, setting `article`, `id`, and `queryText` to `undefined`.
18
- */
19
- export const SelectionStore = signalStore({ providedIn: 'root' }, withDevtools("Selection"), withState(initialState), withSelectionFeatures());
20
- export function withSelectionFeatures() {
21
- return signalStoreFeature(withState(initialState), withMethods((store) => ({
22
- /**
23
- * Updates the state with the provided article and optional query text.
24
- *
25
- * @param article - The article object to update the state with.
26
- * @param queryText - Optional query text to update the state with.
27
- */
28
- update(newState) {
29
- patchState(store, (state) => {
30
- return { ...state, ...newState };
31
- });
32
- },
33
- /**
34
- * Clears the current selection state by setting the `article`, `id`, and `queryText` properties to `undefined`.
35
- *
36
- * @remarks
37
- * This method uses the `patchState` function to update the state of the store.
38
- */
39
- clear() {
40
- patchState(store, () => {
41
- return ({ article: undefined, id: undefined, queryText: undefined, previewHighlights: undefined });
42
- });
43
- }
44
- })));
45
- }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXRvbWljLWFuZ3VsYXIvc3JjL2xpYi9zdG9yZXMvc2VsZWN0aW9uLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBZ0JwRyxNQUFNLFlBQVksR0FBbUIsRUFBb0IsQ0FBQztBQUUxRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQ3ZDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUN0QixZQUFZLENBQUMsV0FBVyxDQUFDLEVBQ3pCLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFDdkIscUJBQXFCLEVBQUUsQ0FDeEIsQ0FBQztBQUVGLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxrQkFBa0IsQ0FDdkIsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUN2QixXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEI7Ozs7O1dBS0c7UUFDSCxNQUFNLENBQUMsUUFBaUM7WUFDdEMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRDs7Ozs7V0FLRztRQUNILEtBQUs7WUFDSCxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDckIsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNyRyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDLENBQUMsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpdGhEZXZ0b29scyB9IGZyb20gXCJAYW5ndWxhci1hcmNoaXRlY3RzL25ncngtdG9vbGtpdFwiO1xuaW1wb3J0IHsgcGF0Y2hTdGF0ZSwgc2lnbmFsU3RvcmUsIHNpZ25hbFN0b3JlRmVhdHVyZSwgd2l0aE1ldGhvZHMsIHdpdGhTdGF0ZSB9IGZyb20gXCJAbmdyeC9zaWduYWxzXCI7XG5cbmltcG9ydCB7IEFydGljbGUsIEN1c3RvbUhpZ2hsaWdodHMgfSBmcm9tIFwiQHNpbmVxdWEvYXRvbWljXCI7XG5cbmV4cG9ydCB0eXBlIFByZXZpZXdIaWdobGlnaHRzID0ge1xuICBoaWdobGlnaHRzOiBDdXN0b21IaWdobGlnaHRzW107XG4gIHNuaXBwZXRJZD86IG51bWJlcjtcbn07XG5cbnR5cGUgU2VsZWN0aW9uU3RhdGUgPSB7XG4gIGFydGljbGU6IEFydGljbGU7XG4gIGlkOiBzdHJpbmc7XG4gIHF1ZXJ5VGV4dDogc3RyaW5nO1xuICBwcmV2aWV3SGlnaGxpZ2h0czogUHJldmlld0hpZ2hsaWdodHM7XG59O1xuXG5jb25zdCBpbml0aWFsU3RhdGU6IFNlbGVjdGlvblN0YXRlID0ge30gYXMgU2VsZWN0aW9uU3RhdGU7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBTZWxlY3Rpb25TdG9yZVxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHN0b3JlIHRoYXQgbWFuYWdlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGFydGljbGVzLiBJdCBpcyBwcm92aWRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb24gYW5kIGluY2x1ZGVzXG4gKiBkZXZlbG9wbWVudCB0b29scyBmb3IgZWFzaWVyIGRlYnVnZ2luZy4gVGhlIHN0b3JlIG1haW50YWlucyB0aGUgc3RhdGUgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhcnRpY2xlYDogVGhlIHNlbGVjdGVkIGFydGljbGUuXG4gKiAtIGBpZGA6IFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgYXJ0aWNsZS5cbiAqIC0gYHF1ZXJ5VGV4dGA6IFRoZSBxdWVyeSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0aW9uLlxuICpcbiAqIEBtZXRob2RzXG4gKiAtIGB1cGRhdGUoYXJ0aWNsZTogQXJ0aWNsZSwgcXVlcnlUZXh0Pzogc3RyaW5nKWA6IFVwZGF0ZXMgdGhlIHN0b3JlIHdpdGggYSBuZXcgYXJ0aWNsZSBhbmQgb3B0aW9uYWwgcXVlcnkgdGV4dC5cbiAqIC0gYHVwZGF0ZVF1ZXJ5VGV4dChxdWVyeVRleHQ6IHN0cmluZylgOiBVcGRhdGVzIHRoZSBxdWVyeSB0ZXh0IGluIHRoZSBzdG9yZS5cbiAqIC0gYGNsZWFyKClgOiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBzdGF0ZSwgc2V0dGluZyBgYXJ0aWNsZWAsIGBpZGAsIGFuZCBgcXVlcnlUZXh0YCB0byBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvblN0b3JlID0gc2lnbmFsU3RvcmUoXG4gIHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0sXG4gIHdpdGhEZXZ0b29scyhcIlNlbGVjdGlvblwiKSxcbiAgd2l0aFN0YXRlKGluaXRpYWxTdGF0ZSksXG4gIHdpdGhTZWxlY3Rpb25GZWF0dXJlcygpXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNlbGVjdGlvbkZlYXR1cmVzKCkge1xuICByZXR1cm4gc2lnbmFsU3RvcmVGZWF0dXJlKFxuICAgIHdpdGhTdGF0ZShpbml0aWFsU3RhdGUpLFxuICAgIHdpdGhNZXRob2RzKChzdG9yZSkgPT4gKHtcbiAgICAgIC8qKlxuICAgICAgICogVXBkYXRlcyB0aGUgc3RhdGUgd2l0aCB0aGUgcHJvdmlkZWQgYXJ0aWNsZSBhbmQgb3B0aW9uYWwgcXVlcnkgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gYXJ0aWNsZSAtIFRoZSBhcnRpY2xlIG9iamVjdCB0byB1cGRhdGUgdGhlIHN0YXRlIHdpdGguXG4gICAgICAgKiBAcGFyYW0gcXVlcnlUZXh0IC0gT3B0aW9uYWwgcXVlcnkgdGV4dCB0byB1cGRhdGUgdGhlIHN0YXRlIHdpdGguXG4gICAgICAgKi9cbiAgICAgIHVwZGF0ZShuZXdTdGF0ZTogUGFydGlhbDxTZWxlY3Rpb25TdGF0ZT4pIHtcbiAgICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIC4uLm5ld1N0YXRlIH07XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBzdGF0ZSBieSBzZXR0aW5nIHRoZSBgYXJ0aWNsZWAsIGBpZGAsIGFuZCBgcXVlcnlUZXh0YCBwcm9wZXJ0aWVzIHRvIGB1bmRlZmluZWRgLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBgcGF0Y2hTdGF0ZWAgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgc3RvcmUuXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCkge1xuICAgICAgICBwYXRjaFN0YXRlKHN0b3JlLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICh7IGFydGljbGU6IHVuZGVmaW5lZCwgaWQ6IHVuZGVmaW5lZCwgcXVlcnlUZXh0OiB1bmRlZmluZWQsIHByZXZpZXdIaWdobGlnaHRzOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pKVxuICApO1xufSJdfQ==
@@ -1,116 +0,0 @@
1
- import { withDevtools } from "@angular-architects/ngrx-toolkit";
2
- import { patchState, signalStore, withMethods, withState } from "@ngrx/signals";
3
- import { THEMES } from "../resources";
4
- const initialState = {
5
- scopes: {}
6
- };
7
- export const ThemeStore = signalStore({ providedIn: 'root' }, withState(initialState), withDevtools('Theme'), withMethods((store) => ({
8
- loadDefaultTheme(scope, darkMode) {
9
- this.setCurrentTheme(scope, 'Default', darkMode);
10
- },
11
- /**
12
- * Sets the current theme for a given scope.
13
- *
14
- * @param {string} scope - The scope for which the theme is being set.
15
- * @param {string} themeName - The name of the theme to be applied.
16
- * @param {boolean} [darkMode] - Optional. Specifies whether dark mode should be enabled. If not provided, it defaults to the current scope's dark mode setting or false.
17
- * @returns {void}
18
- */
19
- setCurrentTheme(scope, themeName, darkMode) {
20
- const cssVars = processCssVars(themeName);
21
- const currentScope = store.scopes()[scope];
22
- patchState(store, (state => ({
23
- ...state,
24
- scopes: {
25
- ...store.scopes(),
26
- [scope]: {
27
- cssVars,
28
- darkMode: darkMode ?? currentScope?.darkMode ?? false,
29
- themeName: themeName
30
- }
31
- }
32
- })));
33
- },
34
- /**
35
- * Sets the dark mode preference for a given scope.
36
- *
37
- * @param scope - The scope for which to set the dark mode preference.
38
- * @param darkMode - A boolean indicating whether dark mode should be enabled (true) or disabled (false).
39
- *
40
- * This function updates the state by patching it with the new dark mode setting for the specified scope.
41
- * It retains the existing CSS variables and theme name for the scope.
42
- */
43
- setDarkMode(scope, darkMode) {
44
- const currentScope = store.scopes()[scope];
45
- patchState(store, (state => ({
46
- ...state,
47
- scopes: {
48
- ...store.scopes(),
49
- [scope]: {
50
- cssVars: currentScope?.cssVars ?? {},
51
- darkMode,
52
- themeName: currentScope?.themeName
53
- }
54
- }
55
- })));
56
- },
57
- })));
58
- /**
59
- * Processes the CSS variables for a given theme name.
60
- *
61
- * @param themeName - The name of the theme to process.
62
- * @returns An object containing the CSS variables for both light and dark themes.
63
- * @throws Will throw an error if the theme with the specified name is not found.
64
- */
65
- export function processCssVars(themeName) {
66
- const theme = THEMES.find(theme => theme.name === themeName);
67
- if (!theme)
68
- throw new Error(`Theme "${themeName}" not found`);
69
- const cssVars = {
70
- light: themeColorsToCssVariables(theme.colors),
71
- dark: themeColorsToCssVariables(theme.colorsDark)
72
- };
73
- return cssVars;
74
- }
75
- /**
76
- * Converts an object of theme colors to CSS variables.
77
- *
78
- * @param colors - An object where keys are theme color names and values are the corresponding color values.
79
- * @returns An object where keys are CSS variable names and values are the corresponding color values.
80
- */
81
- export function themeColorsToCssVariables(colors) {
82
- const cssVars = colors
83
- ? Object.fromEntries(Object.entries(colors).map(([name, value]) => {
84
- if (value === undefined)
85
- return [];
86
- const cssName = themeColorNameToCssVariable(name);
87
- return [cssName, value];
88
- }))
89
- : {};
90
- return cssVars;
91
- }
92
- /**
93
- * Converts a camelCase theme color name to a CSS variable format.
94
- *
95
- * This function takes a camelCase string and transforms it into a CSS variable
96
- * name by inserting hyphens between lowercase and uppercase letters and converting
97
- * the entire string to lowercase.
98
- *
99
- * @param name - The camelCase theme color name to be converted.
100
- * @returns The corresponding CSS variable name in kebab-case.
101
- */
102
- export function themeColorNameToCssVariable(name) {
103
- return `--${name.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`;
104
- }
105
- /**
106
- * Applies a set of CSS variables to a given HTML element.
107
- *
108
- * @param element - The HTML element to which the CSS variables will be applied.
109
- * @param cssVars - An optional record of CSS variable names and their corresponding values.
110
- */
111
- export function applyThemeToNativeElement(element, cssVars) {
112
- if (!cssVars)
113
- return;
114
- Object.keys(cssVars).forEach((key) => element.style.setProperty(key, cssVars[key]));
115
- }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3N0b3Jlcy90aGVtZS5zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBbUJ0QyxNQUFNLFlBQVksR0FBb0I7SUFDcEMsTUFBTSxFQUFFLEVBQUU7Q0FDWCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FDbkMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFDdkIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUVyQixXQUFXLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEIsZ0JBQWdCLENBQUMsS0FBYSxFQUFFLFFBQWtCO1FBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGVBQWUsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxRQUFrQjtRQUNsRSxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FDaEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1IsR0FBRyxLQUFLO1lBQ1IsTUFBTSxFQUFFO2dCQUNOLEdBQUcs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b2xzIH0gZnJvbSBcIkBhbmd1bGFyLWFyY2hpdGVjdHMvbmdyeC10b29sa2l0XCI7XG5pbXBvcnQgeyBwYXRjaFN0YXRlLCBzaWduYWxTdG9yZSwgd2l0aE1ldGhvZHMsIHdpdGhTdGF0ZSB9IGZyb20gXCJAbmdyeC9zaWduYWxzXCI7XG5cbmltcG9ydCB7IFRIRU1FUyB9IGZyb20gXCIuLi9yZXNvdXJjZXNcIjtcblxuZXhwb3J0IHR5cGUgQ3NzVmFycyA9IHtcbiAgbGlnaHQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBkYXJrPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFRoZW1lU2NvcGUgPSB7XG4gIFtrZXk6IHN0cmluZ106IHtcbiAgICBjc3NWYXJzOiBDc3NWYXJzO1xuICAgIGRhcmtNb2RlPzogYm9vbGVhbjtcbiAgICB0aGVtZU5hbWU6IHN0cmluZztcbiAgfTtcbn07XG5cbmV4cG9ydCB0eXBlIFRoZW1lU3RvcmVTdGF0ZSA9IHtcbiAgc2NvcGVzOiBUaGVtZVNjb3BlO1xufTtcblxuY29uc3QgaW5pdGlhbFN0YXRlOiBUaGVtZVN0b3JlU3RhdGUgPSB7XG4gIHNjb3Blczoge31cbn07XG5cbmV4cG9ydCBjb25zdCBUaGVtZVN0b3JlID0gc2lnbmFsU3RvcmUoXG4gIHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0sXG4gIHdpdGhTdGF0ZShpbml0aWFsU3RhdGUpLFxuICB3aXRoRGV2dG9vbHMoJ1RoZW1lJyksXG5cbiAgd2l0aE1ldGhvZHMoKHN0b3JlKSA9PiAoe1xuICAgIGxvYWREZWZhdWx0VGhlbWUoc2NvcGU6IHN0cmluZywgZGFya01vZGU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICB0aGlzLnNldEN1cnJlbnRUaGVtZShzY29wZSwgJ0RlZmF1bHQnLCBkYXJrTW9kZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdGhlbWUgZm9yIGEgZ2l2ZW4gc2NvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGUgLSBUaGUgc2NvcGUgZm9yIHdoaWNoIHRoZSB0aGVtZSBpcyBiZWluZyBzZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRoZW1lTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0aGVtZSB0byBiZSBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RhcmtNb2RlXSAtIE9wdGlvbmFsLiBTcGVjaWZpZXMgd2hldGhlciBkYXJrIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgc2NvcGUncyBkYXJrIG1vZGUgc2V0dGluZyBvciBmYWxzZS5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBzZXRDdXJyZW50VGhlbWUoc2NvcGU6IHN0cmluZywgdGhlbWVOYW1lOiBzdHJpbmcsIGRhcmtNb2RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgY29uc3QgY3NzVmFycyA9IHByb2Nlc3NDc3NWYXJzKHRoZW1lTmFtZSk7XG4gICAgICBjb25zdCBjdXJyZW50U2NvcGUgPSBzdG9yZS5zY29wZXMoKVtzY29wZV07XG5cbiAgICAgIHBhdGNoU3RhdGUoc3RvcmUsIChcbiAgICAgICAgc3RhdGUgPT4gKHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBzY29wZXM6IHtcbiAgICAgICAgICAgIC4uLnN0b3JlLnNjb3BlcygpLFxuICAgICAgICAgICAgW3Njb3BlXToge1xuICAgICAgICAgICAgICBjc3NWYXJzLFxuICAgICAgICAgICAgICBkYXJrTW9kZTogZGFya01vZGUgPz8gY3VycmVudFNjb3BlPy5kYXJrTW9kZSA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgdGhlbWVOYW1lOiB0aGVtZU5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGFyayBtb2RlIHByZWZlcmVuY2UgZm9yIGEgZ2l2ZW4gc2NvcGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgZm9yIHdoaWNoIHRvIHNldCB0aGUgZGFyayBtb2RlIHByZWZlcmVuY2UuXG4gICAgICogQHBhcmFtIGRhcmtNb2RlIC0gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBkYXJrIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQgKHRydWUpIG9yIGRpc2FibGVkIChmYWxzZSkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHN0YXRlIGJ5IHBhdGNoaW5nIGl0IHdpdGggdGhlIG5ldyBkYXJrIG1vZGUgc2V0dGluZyBmb3IgdGhlIHNwZWNpZmllZCBzY29wZS5cbiAgICAgKiBJdCByZXRhaW5zIHRoZSBleGlzdGluZyBDU1MgdmFyaWFibGVzIGFuZCB0aGVtZSBuYW1lIGZvciB0aGUgc2NvcGUuXG4gICAgICovXG4gICAgc2V0RGFya01vZGUoc2NvcGU6IHN0cmluZywgZGFya01vZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRTY29wZSA9IHN0b3JlLnNjb3BlcygpW3Njb3BlXTtcblxuICAgICAgcGF0Y2hTdGF0ZShzdG9yZSwgKFxuICAgICAgICBzdGF0ZSA9PiAoe1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHNjb3Blczoge1xuICAgICAgICAgICAgLi4uc3RvcmUuc2NvcGVzKCksXG4gICAgICAgICAgICBbc2NvcGVdOiB7XG4gICAgICAgICAgICAgIGNzc1ZhcnM6IGN1cnJlbnRTY29wZT8uY3NzVmFycyA/PyB7fSxcbiAgICAgICAgICAgICAgZGFya01vZGUsXG4gICAgICAgICAgICAgIHRoZW1lTmFtZTogY3VycmVudFNjb3BlPy50aGVtZU5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9LFxuICB9KSlcbik7XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBDU1MgdmFyaWFibGVzIGZvciBhIGdpdmVuIHRoZW1lIG5hbWUuXG4gKlxuICogQHBhcmFtIHRoZW1lTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0aGVtZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIENTUyB2YXJpYWJsZXMgZm9yIGJvdGggbGlnaHQgYW5kIGRhcmsgdGhlbWVzLlxuICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSB0aGVtZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ3NzVmFycyh0aGVtZU5hbWU6IHN0cmluZyk6IENzc1ZhcnMge1xuICBjb25zdCB0aGVtZSA9IFRIRU1FUy5maW5kKHRoZW1lID0+IHRoZW1lLm5hbWUgPT09IHRoZW1lTmFtZSk7XG5cbiAgaWYgKCF0aGVtZSkgdGhyb3cgbmV3IEVycm9yKGBUaGVtZSBcIiR7dGhlbWVOYW1lfVwiIG5vdCBmb3VuZGApO1xuXG4gIGNvbnN0IGNzc1ZhcnMgPSB7XG4gICAgbGlnaHQ6IHRoZW1lQ29sb3JzVG9Dc3NWYXJpYWJsZXModGhlbWUhLmNvbG9ycyksXG4gICAgZGFyazogdGhlbWVDb2xvcnNUb0Nzc1ZhcmlhYmxlcyh0aGVtZSEuY29sb3JzRGFyaylcbiAgfTtcblxuICByZXR1cm4gY3NzVmFycztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdGhlbWUgY29sb3JzIHRvIENTUyB2YXJpYWJsZXMuXG4gKlxuICogQHBhcmFtIGNvbG9ycyAtIEFuIG9iamVjdCB3aGVyZSBrZXlzIGFyZSB0aGVtZSBjb2xvciBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBjb2xvciB2YWx1ZXMuXG4gKiBAcmV0dXJucyBBbiBvYmplY3Qgd2hlcmUga2V5cyBhcmUgQ1NTIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIGNvbG9yIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRoZW1lQ29sb3JzVG9Dc3NWYXJpYWJsZXMoY29sb3JzOiBhbnkpOiBhbnkge1xuICBjb25zdCBjc3NWYXJzID0gY29sb3JzXG4gICAgPyBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhjb2xvcnMpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdXG4gICAgICAgIGNvbnN0IGNzc05hbWUgPSB0aGVtZUNvbG9yTmFtZVRvQ3NzVmFyaWFibGUobmFtZSlcbiAgICAgICAgcmV0dXJuIFtjc3NOYW1lLCB2YWx1ZV1cbiAgICAgIH0pKVxuICAgIDoge307XG5cbiAgcmV0dXJuIGNzc1ZhcnM7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBjYW1lbENhc2UgdGhlbWUgY29sb3IgbmFtZSB0byBhIENTUyB2YXJpYWJsZSBmb3JtYXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGNhbWVsQ2FzZSBzdHJpbmcgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIENTUyB2YXJpYWJsZVxuICogbmFtZSBieSBpbnNlcnRpbmcgaHlwaGVucyBiZXR3ZWVuIGxvd2VyY2FzZSBhbmQgdXBwZXJjYXNlIGxldHRlcnMgYW5kIGNvbnZlcnRpbmdcbiAqIHRoZSBlbnRpcmUgc3RyaW5nIHRvIGxvd2VyY2FzZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBjYW1lbENhc2UgdGhlbWUgY29sb3IgbmFtZSB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJucyBUaGUgY29ycmVzcG9uZGluZyBDU1MgdmFyaWFibGUgbmFtZSBpbiBrZWJhYi1jYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhlbWVDb2xvck5hbWVUb0Nzc1ZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgLS0ke25hbWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMS0kMlwiKS50b0xvd2VyQ2FzZSgpfWA7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNldCBvZiBDU1MgdmFyaWFibGVzIHRvIGEgZ2l2ZW4gSFRNTCBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIEhUTUwgZWxlbWVudCB0byB3aGljaCB0aGUgQ1NTIHZhcmlhYmxlcyB3aWxsIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gY3NzVmFycyAtIEFuIG9wdGlvbmFsIHJlY29yZCBvZiBDU1MgdmFyaWFibGUgbmFtZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUaGVtZVRvTmF0aXZlRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzVmFycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgaWYgKCFjc3NWYXJzKSByZXR1cm47XG5cbiAgT2JqZWN0LmtleXMoY3NzVmFycykuZm9yRWFjaCgoa2V5KSA9PlxuICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoa2V5LCBjc3NWYXJzW2tleV0pXG4gICk7XG59XG4iXX0=