@odx/angular 5.3.4 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/components/footer/README.md +3 -0
  3. package/components/footer/index.d.ts +3 -0
  4. package/components/footer/lib/footer.component.d.ts +23 -0
  5. package/components/footer/lib/footer.config.d.ts +30 -0
  6. package/components/footer/lib/footer.i18n.d.ts +3 -0
  7. package/components/footer/lib/helpers/create-footer-links.d.ts +12 -0
  8. package/components/footer/lib/helpers/index.d.ts +1 -0
  9. package/components/footer/lib/models/footer-link.d.ts +4 -0
  10. package/components/footer/lib/models/footer-variant.d.ts +5 -0
  11. package/components/footer/lib/models/index.d.ts +2 -0
  12. package/components/header/lib/header.component.d.ts +1 -1
  13. package/components/header-navigation/README.md +3 -0
  14. package/components/header-navigation/index.d.ts +3 -0
  15. package/components/header-navigation/lib/directives/header-navigation-link.directive.d.ts +11 -0
  16. package/components/header-navigation/lib/directives/index.d.ts +1 -0
  17. package/components/header-navigation/lib/header-navigation.component.d.ts +8 -0
  18. package/components/header-navigation/lib/header-navigation.module.d.ts +9 -0
  19. package/components/main-menu/lib/helpers/create-main-menu-links.d.ts +2 -1
  20. package/components/main-menu/lib/main-menu.component.d.ts +5 -5
  21. package/components/main-menu/lib/main-menu.config.d.ts +1 -0
  22. package/components/notification/README.md +3 -0
  23. package/components/notification/index.d.ts +7 -0
  24. package/components/notification/lib/components/index.d.ts +2 -0
  25. package/components/notification/lib/components/notification-center/notification-center.component.d.ts +19 -0
  26. package/components/notification/lib/components/notification-item/notification-item.component.d.ts +37 -0
  27. package/components/notification/lib/directives/index.d.ts +1 -0
  28. package/components/notification/lib/directives/notification-center.directive.d.ts +69 -0
  29. package/components/notification/lib/features/index.d.ts +5 -0
  30. package/components/notification/lib/features/with-browser-notifications.d.ts +17 -0
  31. package/components/notification/lib/features/with-load-notifications.d.ts +18 -0
  32. package/components/notification/lib/features/with-notification-transformer.d.ts +26 -0
  33. package/components/notification/lib/features/with-peristent-notifications.d.ts +63 -0
  34. package/components/notification/lib/features/with-save-notifications.d.ts +11 -0
  35. package/components/notification/lib/helpers/get-notifications-by-tag.d.ts +2 -0
  36. package/components/notification/lib/helpers/index.d.ts +3 -0
  37. package/components/notification/lib/helpers/sort-notifications.d.ts +3 -0
  38. package/components/notification/lib/helpers/to-notification-collection.d.ts +3 -0
  39. package/components/notification/lib/models/index.d.ts +8 -0
  40. package/components/notification/lib/models/notification-action.d.ts +2 -0
  41. package/components/notification/lib/models/notification-collection.d.ts +6 -0
  42. package/components/notification/lib/models/notification-feature.d.ts +5 -0
  43. package/components/notification/lib/models/notification-options.d.ts +7 -0
  44. package/components/notification/lib/models/notification-query.d.ts +2 -0
  45. package/components/notification/lib/models/notification-sort-fn.d.ts +2 -0
  46. package/components/notification/lib/models/notification.d.ts +6 -0
  47. package/components/notification/lib/models/notification.ref.d.ts +9 -0
  48. package/components/notification/lib/notification.config.d.ts +11 -0
  49. package/components/notification/lib/notification.i18n.d.ts +3 -0
  50. package/components/notification/lib/notification.logger.d.ts +3 -0
  51. package/components/notification/lib/notification.service.d.ts +110 -0
  52. package/components/notification/lib/notification.tokens.d.ts +4 -0
  53. package/components/notification/lib/services/index.d.ts +1 -0
  54. package/components/notification/lib/services/notification-center.service.d.ts +69 -0
  55. package/components/notification/testing/README.md +3 -0
  56. package/components/notification/testing/index.d.ts +1 -0
  57. package/components/notification/testing/lib/test-helpers.d.ts +5 -0
  58. package/components/toast/lib/toast.service.d.ts +30 -2
  59. package/esm2022/breakpoints/lib/directives/match-breakpoints.directive.mjs +3 -2
  60. package/esm2022/components/footer/index.mjs +4 -0
  61. package/esm2022/components/footer/lib/footer.component.mjs +51 -0
  62. package/esm2022/components/footer/lib/footer.config.mjs +29 -0
  63. package/esm2022/components/footer/lib/footer.i18n.mjs +19 -0
  64. package/esm2022/components/footer/lib/helpers/create-footer-links.mjs +25 -0
  65. package/esm2022/components/footer/lib/helpers/index.mjs +2 -0
  66. package/esm2022/components/footer/lib/models/footer-link.mjs +2 -0
  67. package/esm2022/components/footer/lib/models/footer-variant.mjs +5 -0
  68. package/esm2022/components/footer/lib/models/index.mjs +3 -0
  69. package/esm2022/components/footer/odx-angular-components-footer.mjs +5 -0
  70. package/esm2022/components/header/lib/header.component.mjs +3 -3
  71. package/esm2022/components/header-navigation/index.mjs +4 -0
  72. package/esm2022/components/header-navigation/lib/directives/header-navigation-link.directive.mjs +37 -0
  73. package/esm2022/components/header-navigation/lib/directives/index.mjs +2 -0
  74. package/esm2022/components/header-navigation/lib/header-navigation.component.mjs +28 -0
  75. package/esm2022/components/header-navigation/lib/header-navigation.module.mjs +19 -0
  76. package/esm2022/components/header-navigation/odx-angular-components-header-navigation.mjs +5 -0
  77. package/esm2022/components/main-menu/lib/helpers/create-main-menu-links.mjs +7 -4
  78. package/esm2022/components/main-menu/lib/main-menu.component.mjs +9 -11
  79. package/esm2022/components/main-menu/lib/main-menu.config.mjs +1 -1
  80. package/esm2022/components/notification/index.mjs +8 -0
  81. package/esm2022/components/notification/lib/components/index.mjs +3 -0
  82. package/esm2022/components/notification/lib/components/notification-center/notification-center.component.mjs +65 -0
  83. package/esm2022/components/notification/lib/components/notification-item/notification-item.component.mjs +65 -0
  84. package/esm2022/components/notification/lib/directives/index.mjs +2 -0
  85. package/esm2022/components/notification/lib/directives/notification-center.directive.mjs +142 -0
  86. package/esm2022/components/notification/lib/features/index.mjs +6 -0
  87. package/esm2022/components/notification/lib/features/with-browser-notifications.mjs +75 -0
  88. package/esm2022/components/notification/lib/features/with-load-notifications.mjs +45 -0
  89. package/esm2022/components/notification/lib/features/with-notification-transformer.mjs +34 -0
  90. package/esm2022/components/notification/lib/features/with-peristent-notifications.mjs +94 -0
  91. package/esm2022/components/notification/lib/features/with-save-notifications.mjs +45 -0
  92. package/esm2022/components/notification/lib/helpers/get-notifications-by-tag.mjs +7 -0
  93. package/esm2022/components/notification/lib/helpers/index.mjs +4 -0
  94. package/esm2022/components/notification/lib/helpers/sort-notifications.mjs +10 -0
  95. package/esm2022/components/notification/lib/helpers/to-notification-collection.mjs +9 -0
  96. package/esm2022/components/notification/lib/models/index.mjs +9 -0
  97. package/esm2022/components/notification/lib/models/notification-action.mjs +2 -0
  98. package/esm2022/components/notification/lib/models/notification-collection.mjs +2 -0
  99. package/esm2022/components/notification/lib/models/notification-feature.mjs +4 -0
  100. package/esm2022/components/notification/lib/models/notification-options.mjs +2 -0
  101. package/esm2022/components/notification/lib/models/notification-query.mjs +2 -0
  102. package/esm2022/components/notification/lib/models/notification-sort-fn.mjs +2 -0
  103. package/esm2022/components/notification/lib/models/notification.mjs +2 -0
  104. package/esm2022/components/notification/lib/models/notification.ref.mjs +2 -0
  105. package/esm2022/components/notification/lib/notification.config.mjs +11 -0
  106. package/esm2022/components/notification/lib/notification.i18n.mjs +11 -0
  107. package/esm2022/components/notification/lib/notification.logger.mjs +3 -0
  108. package/esm2022/components/notification/lib/notification.service.mjs +168 -0
  109. package/esm2022/components/notification/lib/notification.tokens.mjs +7 -0
  110. package/esm2022/components/notification/lib/services/index.mjs +2 -0
  111. package/esm2022/components/notification/lib/services/notification-center.service.mjs +96 -0
  112. package/esm2022/components/notification/odx-angular-components-notification.mjs +5 -0
  113. package/esm2022/components/notification/testing/index.mjs +2 -0
  114. package/esm2022/components/notification/testing/lib/test-helpers.mjs +33 -0
  115. package/esm2022/components/notification/testing/odx-angular-components-notification-testing.mjs +5 -0
  116. package/esm2022/components/toast/lib/components/toast-container/toast-container.component.mjs +6 -6
  117. package/esm2022/components/toast/lib/toast.service.mjs +38 -8
  118. package/esm2022/utils/lib/helpers/array.mjs +24 -1
  119. package/esm2022/utils/lib/helpers/build-website-url.mjs +24 -1
  120. package/fesm2022/odx-angular-breakpoints.mjs +2 -1
  121. package/fesm2022/odx-angular-breakpoints.mjs.map +1 -1
  122. package/fesm2022/odx-angular-components-footer.mjs +131 -0
  123. package/fesm2022/odx-angular-components-footer.mjs.map +1 -0
  124. package/fesm2022/odx-angular-components-header-navigation.mjs +84 -0
  125. package/fesm2022/odx-angular-components-header-navigation.mjs.map +1 -0
  126. package/fesm2022/odx-angular-components-header.mjs +2 -2
  127. package/fesm2022/odx-angular-components-header.mjs.map +1 -1
  128. package/fesm2022/odx-angular-components-main-menu.mjs +11 -9
  129. package/fesm2022/odx-angular-components-main-menu.mjs.map +1 -1
  130. package/fesm2022/odx-angular-components-notification-testing.mjs +39 -0
  131. package/fesm2022/odx-angular-components-notification-testing.mjs.map +1 -0
  132. package/fesm2022/odx-angular-components-notification.mjs +832 -0
  133. package/fesm2022/odx-angular-components-notification.mjs.map +1 -0
  134. package/fesm2022/odx-angular-components-toast.mjs +42 -11
  135. package/fesm2022/odx-angular-components-toast.mjs.map +1 -1
  136. package/fesm2022/odx-angular-utils.mjs +46 -0
  137. package/fesm2022/odx-angular-utils.mjs.map +1 -1
  138. package/package.json +25 -1
  139. package/utils/lib/helpers/array.d.ts +23 -0
  140. package/utils/lib/helpers/build-website-url.d.ts +23 -0
@@ -0,0 +1,142 @@
1
+ import { DestroyRef, Directive, Input, Output, inject } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { DisabledController } from '@odx/angular';
4
+ import { BadgeDirective } from '@odx/angular/components/badge';
5
+ import { DropdownDirective } from '@odx/angular/components/dropdown';
6
+ import { Position } from '@odx/angular/utils';
7
+ import { map, merge, startWith, switchMap, tap } from 'rxjs';
8
+ import { NotificationCenterComponent } from '../components';
9
+ import { NotificationCenterService } from '../services';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@odx/angular/components/badge";
12
+ import * as i2 from "@odx/angular/components/dropdown";
13
+ /**
14
+ * A directive that provides an interface for managing notifications.
15
+ * It allows configuring a notification center with dynamic content, sorting, and badge display functionalities.
16
+ */
17
+ export class NotificationCenterDirective {
18
+ constructor() {
19
+ this.badgeDirective = inject(BadgeDirective, { self: true });
20
+ this.destroyRef = inject(DestroyRef);
21
+ this.disabledController = DisabledController.inject();
22
+ this.dropdownDirective = inject(DropdownDirective, { self: true });
23
+ this.notificationCenterService = inject(NotificationCenterService, { self: true });
24
+ this.dropdownStateChange$ = merge(this.dropdownDirective.beforeOpen, this.dropdownDirective.beforeClose).pipe(startWith(void 0));
25
+ this.badgeValue$ = this.notificationCenterService.unseenNotifications$.pipe(switchMap(({ count }) => this.dropdownStateChange$.pipe(map(() => this.formatBadgeValue(count)))));
26
+ /**
27
+ * An event that is emitted when a new notification is added.
28
+ * Listeners can use this event to react to new notifications being added to the notification center.
29
+ */
30
+ // eslint-disable-next-line @angular-eslint/no-output-rename
31
+ this.notificationAdd = this.notificationCenterService.onNotificationAdd$;
32
+ /**
33
+ * An event that is emitted when a notification is updated.
34
+ * This can be used to react to changes in notifications, such as their read status or content updates.
35
+ */
36
+ // eslint-disable-next-line @angular-eslint/no-output-rename
37
+ this.notificationUpdate = this.notificationCenterService.onNotificationUpdate$;
38
+ /**
39
+ * An event that is emitted when a notification is removed from the notification center.
40
+ * Use this event to handle the removal of notifications, such as cleaning up resources or updating UI elements.
41
+ */
42
+ // eslint-disable-next-line @angular-eslint/no-output-rename
43
+ this.notificationRemove = this.notificationCenterService.onNotificationRemove$;
44
+ /**
45
+ * An event that is emitted when a notification is marked as seen.
46
+ * This event can be used to perform actions when the user acknowledges a notification.
47
+ */
48
+ // eslint-disable-next-line @angular-eslint/no-output-rename
49
+ this.notificationSeen = this.notificationCenterService.onNotificationSeen$;
50
+ }
51
+ /**
52
+ * Sets the tag for filtering notifications. Only notifications with this tag will be shown in the notification center.
53
+ * @param value The tag value to filter notifications. If null, all notifications are shown.
54
+ */
55
+ set tag(value) {
56
+ this.notificationCenterService.setTag(value);
57
+ }
58
+ /**
59
+ * Sets the title of the notification center. The title can be dynamic and change based on the application state.
60
+ * @param value The title content, which can be a string or an Observable returning a string. Allows for dynamic titles.
61
+ */
62
+ set title(value) {
63
+ this.notificationCenterService.setTitle(value);
64
+ }
65
+ /**
66
+ * Sets the sorting function used to order notifications within the notification center.
67
+ * @param value A function that compares two notifications and returns the sort order.
68
+ *
69
+ * @example
70
+ * sortFfn = (a: NotificationRef, b: NotificationRef) => {
71
+ if (a.createdAt < b.createdAt) return -1;
72
+ if (a.createdAt > b.createdAt) return 1;
73
+ return 0;
74
+ };
75
+ */
76
+ set sortFn(value) {
77
+ this.notificationCenterService.setSortFn(value);
78
+ }
79
+ ngOnInit() {
80
+ this.badgeDirective.position = Position.BOTTOM;
81
+ this.badgeDirective.offset = 6;
82
+ this.dropdownDirective.content = NotificationCenterComponent;
83
+ this.dropdownDirective.options = {
84
+ containerClass: 'odx-notification-center-overlay',
85
+ position: Position.BOTTOM_END,
86
+ enableFallback: false,
87
+ };
88
+ }
89
+ ngAfterViewInit() {
90
+ merge(this.handleBadgeUpdates(), this.handleDropdownUpdates()).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
91
+ }
92
+ formatBadgeValue(value) {
93
+ return this.dropdownDirective.isOpen || value === 0 ? null : value.toFixed(0);
94
+ }
95
+ handleBadgeUpdates() {
96
+ return this.badgeValue$.pipe(tap((value) => {
97
+ this.badgeDirective.value = value;
98
+ this.badgeDirective.ngOnChanges();
99
+ }));
100
+ }
101
+ handleDropdownUpdates() {
102
+ return this.notificationCenterService.notifications$.pipe(tap(({ isEmpty }) => {
103
+ this.disabledController?.setDisabledState(isEmpty);
104
+ if (!isEmpty)
105
+ return;
106
+ this.dropdownDirective.close();
107
+ }));
108
+ }
109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationCenterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
110
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: NotificationCenterDirective, isStandalone: true, selector: "[odxNotificationCenter]", inputs: { tag: ["odxNotificationCenter", "tag"], title: ["odxNotificationCenterTitle", "title"], sortFn: ["odxNotificationCenterSortFn", "sortFn"] }, outputs: { notificationAdd: "odxNotificationCenterAdd", notificationUpdate: "odxNotificationCenterUpdate", notificationRemove: "odxNotificationCenterRemove", notificationSeen: "odxNotificationCenterSeen" }, providers: [NotificationCenterService], hostDirectives: [{ directive: i1.BadgeDirective, inputs: ["odxBadgeVariant", "odxNotificationCenterBadgeVariant"] }, { directive: i2.DropdownDirective }], ngImport: i0 }); }
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NotificationCenterDirective, decorators: [{
113
+ type: Directive,
114
+ args: [{
115
+ standalone: true,
116
+ selector: '[odxNotificationCenter]',
117
+ hostDirectives: [{ directive: BadgeDirective, inputs: ['odxBadgeVariant:odxNotificationCenterBadgeVariant'] }, DropdownDirective],
118
+ providers: [NotificationCenterService],
119
+ }]
120
+ }], propDecorators: { tag: [{
121
+ type: Input,
122
+ args: ['odxNotificationCenter']
123
+ }], title: [{
124
+ type: Input,
125
+ args: ['odxNotificationCenterTitle']
126
+ }], sortFn: [{
127
+ type: Input,
128
+ args: ['odxNotificationCenterSortFn']
129
+ }], notificationAdd: [{
130
+ type: Output,
131
+ args: ['odxNotificationCenterAdd']
132
+ }], notificationUpdate: [{
133
+ type: Output,
134
+ args: ['odxNotificationCenterUpdate']
135
+ }], notificationRemove: [{
136
+ type: Output,
137
+ args: ['odxNotificationCenterRemove']
138
+ }], notificationSeen: [{
139
+ type: Output,
140
+ args: ['odxNotificationCenterSeen']
141
+ }] } });
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWNlbnRlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9kaXJlY3RpdmVzL25vdGlmaWNhdGlvbi1jZW50ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQWMsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7O0FBRXhEOzs7R0FHRztBQU9ILE1BQU0sT0FBTywyQkFBMkI7SUFOeEM7UUFPbUIsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEQsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyx1QkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqRCxzQkFB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c0JBRHhCLE1BQU07dUJBQUMsNkJBQTZCO2dCQVM5QixnQkFBZ0I7c0JBRHRCLE1BQU07dUJBQUMsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGVzdHJveVJlZiwgRGlyZWN0aXZlLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGlzYWJsZWRDb250cm9sbGVyIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IER5bmFtaWNUZXh0Q29udGVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvZHluYW1pYy12aWV3JztcbmltcG9ydCB7IEJhZGdlRGlyZWN0aXZlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvYmFkZ2UnO1xuaW1wb3J0IHsgRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9kcm9wZG93bic7XG5pbXBvcnQgeyBQb3NpdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIG1lcmdlLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DZW50ZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNvcnRGbiB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBtYW5hZ2luZyBub3RpZmljYXRpb25zLlxuICogSXQgYWxsb3dzIGNvbmZpZ3VyaW5nIGEgbm90aWZpY2F0aW9uIGNlbnRlciB3aXRoIGR5bmFtaWMgY29udGVudCwgc29ydGluZywgYW5kIGJhZGdlIGRpc3BsYXkgZnVuY3Rpb25hbGl0aWVzLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbb2R4Tm90aWZpY2F0aW9uQ2VudGVyXScsXG4gIGhvc3REaXJlY3RpdmVzOiBbeyBkaXJlY3RpdmU6IEJhZGdlRGlyZWN0aXZlLCBpbnB1dHM6IFsnb2R4QmFkZ2VWYXJpYW50Om9keE5vdGlmaWNhdGlvbkNlbnRlckJhZGdlVmFyaWFudCddIH0sIERyb3Bkb3duRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbTm90aWZpY2F0aW9uQ2VudGVyU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvbkNlbnRlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFkZ2VEaXJlY3RpdmUgPSBpbmplY3QoQmFkZ2VEaXJlY3RpdmUsIHsgc2VsZjogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVkQ29udHJvbGxlciA9IERpc2FibGVkQ29udHJvbGxlci5pbmplY3QoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93bkRpcmVjdGl2ZSA9IGluamVjdChEcm9wZG93bkRpcmVjdGl2ZSwgeyBzZWxmOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbkNlbnRlclNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uQ2VudGVyU2VydmljZSwgeyBzZWxmOiB0cnVlIH0pO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duU3RhdGVDaGFuZ2UkID0gbWVyZ2UodGhpcy5kcm9wZG93bkRpcmVjdGl2ZS5iZWZvcmVPcGVuLCB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLmJlZm9yZUNsb3NlKS5waXBlKHN0YXJ0V2l0aCh2b2lkIDApKTtcbiAgcHJpdmF0ZSByZWFkb25seSBiYWRnZVZhbHVlJCA9IHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS51bnNlZW5Ob3RpZmljYXRpb25zJC5waXBlKFxuICAgIHN3aXRjaE1hcCgoeyBjb3VudCB9KSA9PiB0aGlzLmRyb3Bkb3duU3RhdGVDaGFuZ2UkLnBpcGUobWFwKCgpID0+IHRoaXMuZm9ybWF0QmFkZ2VWYWx1ZShjb3VudCkpKSksXG4gICk7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRhZyBmb3IgZmlsdGVyaW5nIG5vdGlmaWNhdGlvbnMuIE9ubHkgbm90aWZpY2F0aW9ucyB3aXRoIHRoaXMgdGFnIHdpbGwgYmUgc2hvd24gaW4gdGhlIG5vdGlmaWNhdGlvbiBjZW50ZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdGFnIHZhbHVlIHRvIGZpbHRlciBub3RpZmljYXRpb25zLiBJZiBudWxsLCBhbGwgbm90aWZpY2F0aW9ucyBhcmUgc2hvd24uXG4gICAqL1xuICBASW5wdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlcicpXG4gIHB1YmxpYyBzZXQgdGFnKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlLnNldFRhZyh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGl0bGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBjZW50ZXIuIFRoZSB0aXRsZSBjYW4gYmUgZHluYW1pYyBhbmQgY2hhbmdlIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBzdGF0ZS5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB0aXRsZSBjb250ZW50LCB3aGljaCBjYW4gYmUgYSBzdHJpbmcgb3IgYW4gT2JzZXJ2YWJsZSByZXR1cm5pbmcgYSBzdHJpbmcuIEFsbG93cyBmb3IgZHluYW1pYyB0aXRsZXMuXG4gICAqL1xuICBASW5wdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlclRpdGxlJylcbiAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogRHluYW1pY1RleHRDb250ZW50IHwgbnVsbCkge1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS5zZXRUaXRsZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc29ydGluZyBmdW5jdGlvbiB1c2VkIHRvIG9yZGVyIG5vdGlmaWNhdGlvbnMgd2l0aGluIHRoZSBub3RpZmljYXRpb24gY2VudGVyLlxuICAgKiBAcGFyYW0gdmFsdWUgQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHR3byBub3RpZmljYXRpb25zIGFuZCByZXR1cm5zIHRoZSBzb3J0IG9yZGVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAgc29ydEZmbiA9IChhOiBOb3RpZmljYXRpb25SZWYsIGI6IE5vdGlmaWNhdGlvblJlZikgPT4ge1xuICAgICAgICBpZiAoYS5jcmVhdGVkQXQgPCBiLmNyZWF0ZWRBdCkgcmV0dXJuIC0xO1xuICAgICAgICBpZiAoYS5jcmVhdGVkQXQgPiBiLmNyZWF0ZWRBdCkgcmV0dXJuIDE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfTtcbiAgICovXG4gIEBJbnB1dCgnb2R4Tm90aWZpY2F0aW9uQ2VudGVyU29ydEZuJylcbiAgcHVibGljIHNldCBzb3J0Rm4odmFsdWU6IE5vdGlmaWNhdGlvblNvcnRGbikge1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS5zZXRTb3J0Rm4odmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IG5vdGlmaWNhdGlvbiBpcyBhZGRlZC5cbiAgICogTGlzdGVuZXJzIGNhbiB1c2UgdGhpcyBldmVudCB0byByZWFjdCB0byBuZXcgbm90aWZpY2F0aW9ucyBiZWluZyBhZGRlZCB0byB0aGUgbm90aWZpY2F0aW9uIGNlbnRlci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBAT3V0cHV0KCdvZHhOb3RpZmljYXRpb25DZW50ZXJBZGQnKVxuICBwdWJsaWMgbm90aWZpY2F0aW9uQWRkID0gdGhpcy5ub3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uQWRkJDtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYSBub3RpZmljYXRpb24gaXMgdXBkYXRlZC5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIG5vdGlmaWNhdGlvbnMsIHN1Y2ggYXMgdGhlaXIgcmVhZCBzdGF0dXMgb3IgY29udGVudCB1cGRhdGVzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlclVwZGF0ZScpXG4gIHB1YmxpYyBub3RpZmljYXRpb25VcGRhdGUgPSB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlclNlcnZpY2Uub25Ob3RpZmljYXRpb25VcGRhdGUkO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBhIG5vdGlmaWNhdGlvbiBpcyByZW1vdmVkIGZyb20gdGhlIG5vdGlmaWNhdGlvbiBjZW50ZXIuXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGhhbmRsZSB0aGUgcmVtb3ZhbCBvZiBub3RpZmljYXRpb25zLCBzdWNoIGFzIGNsZWFuaW5nIHVwIHJlc291cmNlcyBvciB1cGRhdGluZyBVSSBlbGVtZW50cy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LXJlbmFtZVxuICBAT3V0cHV0KCdvZHhOb3RpZmljYXRpb25DZW50ZXJSZW1vdmUnKVxuICBwdWJsaWMgbm90aWZpY2F0aW9uUmVtb3ZlID0gdGhpcy5ub3RpZmljYXRpb25DZW50ZXJTZXJ2aWNlLm9uTm90aWZpY2F0aW9uUmVtb3ZlJDtcblxuICAvKipcbiAgICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYSBub3RpZmljYXRpb24gaXMgbWFya2VkIGFzIHNlZW4uXG4gICAqIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhY3Rpb25zIHdoZW4gdGhlIHVzZXIgYWNrbm93bGVkZ2VzIGEgbm90aWZpY2F0aW9uLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ29keE5vdGlmaWNhdGlvbkNlbnRlclNlZW4nKVxuICBwdWJsaWMgbm90aWZpY2F0aW9uU2VlbiA9IHRoaXMubm90aWZpY2F0aW9uQ2VudGVyU2VydmljZS5vbk5vdGlmaWNhdGlvblNlZW4kO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJhZGdlRGlyZWN0aXZlLnBvc2l0aW9uID0gUG9zaXRpb24uQk9UVE9NO1xuICAgIHRoaXMuYmFkZ2VEaXJlY3RpdmUub2Zmc2V0ID0gNjtcblxuICAgIHRoaXMuZHJvcGRvd25EaXJlY3RpdmUuY29udGVudCA9IE5vdGlmaWNhdGlvbkNlbnRlckNvbXBvbmVudDtcbiAgICB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLm9wdGlvbnMgPSB7XG4gICAgICBjb250YWluZXJDbGFzczogJ29keC1ub3RpZmljYXRpb24tY2VudGVyLW92ZXJsYXknLFxuICAgICAgcG9zaXRpb246IFBvc2l0aW9uLkJPVFRPTV9FTkQsXG4gICAgICBlbmFibGVGYWxsYmFjazogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgbWVyZ2UodGhpcy5oYW5kbGVCYWRnZVVwZGF0ZXMoKSwgdGhpcy5oYW5kbGVEcm9wZG93blVwZGF0ZXMoKSkucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEJhZGdlVmFsdWUodmFsdWU6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLmlzT3BlbiB8fCB2YWx1ZSA9PT0gMCA/IG51bGwgOiB2YWx1ZS50b0ZpeGVkKDApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCYWRnZVVwZGF0ZXMoKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuYmFkZ2VWYWx1ZSQucGlwZShcbiAgICAgIHRhcCgodmFsdWU6IER5bmFtaWNUZXh0Q29udGVudCB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5iYWRnZURpcmVjdGl2ZS52YWx1ZSA9IHZhbHVlIGFzIER5bmFtaWNUZXh0Q29udGVudDtcbiAgICAgICAgdGhpcy5iYWRnZURpcmVjdGl2ZS5uZ09uQ2hhbmdlcygpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJvcGRvd25VcGRhdGVzKCk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlclNlcnZpY2Uubm90aWZpY2F0aW9ucyQucGlwZShcbiAgICAgIHRhcCgoeyBpc0VtcHR5IH0pID0+IHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRyb2xsZXI/LnNldERpc2FibGVkU3RhdGUoaXNFbXB0eSk7XG4gICAgICAgIGlmICghaXNFbXB0eSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmRyb3Bkb3duRGlyZWN0aXZlLmNsb3NlKCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ export * from './with-browser-notifications';
2
+ export * from './with-load-notifications';
3
+ export * from './with-notification-transformer';
4
+ export * from './with-peristent-notifications';
5
+ export * from './with-save-notifications';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3dpdGgtYnJvd3Nlci1ub3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vd2l0aC1sb2FkLW5vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93aXRoLW5vdGlmaWNhdGlvbi10cmFuc2Zvcm1lcic7XG5leHBvcnQgKiBmcm9tICcuL3dpdGgtcGVyaXN0ZW50LW5vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi93aXRoLXNhdmUtbm90aWZpY2F0aW9ucyc7XG4iXX0=
@@ -0,0 +1,75 @@
1
+ import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
2
+ import { makeNotificationFeature } from '../models';
3
+ import { NotificationService } from '../notification.service';
4
+ import { PersistentNotificationSerializer } from './with-peristent-notifications';
5
+ /**
6
+ * Requests permission to display browser notifications and returns a boolean indicating whether permission was granted.
7
+ * @async
8
+ * @function requestBrowserNotificationPermissions
9
+ * @returns {Promise<boolean>} A promise that resolves to `true` if permission is granted, otherwise `false`.
10
+ */
11
+ async function requestBrowserNotificationPermissions() {
12
+ if (!('Notification' in window))
13
+ return false;
14
+ if (Notification.permission === 'granted')
15
+ return true;
16
+ if (Notification.permission === 'denied')
17
+ return false;
18
+ const permission = await Notification.requestPermission();
19
+ return permission === 'granted';
20
+ }
21
+ /**
22
+ * Creates a function responsible for sending out browser notifications with the given options.
23
+ * @function sendBrowserNotification
24
+ * @param {NotificationSerializer} serializer - The serializer to use for notification data.
25
+ * @param {BrowserNotificationExtras} [options] - Additional options for the browser notification.
26
+ * @returns {SendBrowserNotificationFn} A function to send browser notifications.
27
+ */
28
+ function sendBrowserNotification(serializer, options) {
29
+ return async (notificationRef) => {
30
+ if (!('Notification' in window))
31
+ return;
32
+ const [notificationObj] = await serializer.deserialize(await serializer.serialize([notificationRef]));
33
+ if (!notificationObj || notificationObj.hasBeenSeen)
34
+ return;
35
+ const { createdAt, item } = notificationObj;
36
+ new Notification(item.title, {
37
+ tag: notificationRef.options.tags?.[0],
38
+ lang: notificationRef.options.language,
39
+ ...options,
40
+ body: item.description,
41
+ timestamp: createdAt,
42
+ });
43
+ };
44
+ }
45
+ /**
46
+ * Configures the application to send browser notifications, using Angular's `ENVIRONMENT_INITIALIZER` for setup.
47
+ * @function withBrowserNotifications
48
+ * @param {WithBrowserNotificationsOptions} [options] - Optional configuration for browser notifications.
49
+ * @returns {NotificationFeature} A notification feature for integration into the application environment.
50
+ */
51
+ export function withBrowserNotifications(options) {
52
+ return makeNotificationFeature([
53
+ {
54
+ provide: ENVIRONMENT_INITIALIZER,
55
+ useFactory: () => {
56
+ const isEnabled = options?.isEnabled ?? true;
57
+ if (!isEnabled)
58
+ return () => void 0;
59
+ const notificationService = inject(NotificationService);
60
+ const serializer = new PersistentNotificationSerializer();
61
+ const sendBrowserNotificationFn = options?.sendFn ?? sendBrowserNotification(serializer, options?.extras);
62
+ return async () => {
63
+ if (!isEnabled)
64
+ return;
65
+ const permissionsGranted = await requestBrowserNotificationPermissions();
66
+ if (!permissionsGranted)
67
+ return;
68
+ notificationService.onNotificationAdd$.subscribe(sendBrowserNotificationFn);
69
+ };
70
+ },
71
+ multi: true,
72
+ },
73
+ ]);
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1icm93c2VyLW5vdGlmaWNhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLWJyb3dzZXItbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBd0MsdUJBQXVCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUEwQixnQ0FBZ0MsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBYTFHOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLHFDQUFxQztJQUNsRCxJQUFJLENBQUMsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2RCxJQUFJLFlBQVksQ0FBQyxVQUFVLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFFMUQsT0FBTyxVQUFVLEtBQUssU0FBUyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHVCQUF1QixDQUFDLFVBQWtDLEVBQUUsT0FBbUM7SUFDdEcsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLEVBQUU7UUFDL0IsSUFBSSxDQUFDLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQztZQUFFLE9BQU87UUFDeEMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsV0FBVztZQUFFLE9BQU87UUFDNUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFDNUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQWUsRUFBRTtZQUNyQyxHQUFHLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUN0QyxHQUFHLE9BQU87WUFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQXFCO1lBQ2hDLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxPQUF5QztJQUNoRixPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsU0FBUztvQkFBRSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLGdDQUFnQyxFQUFFLENBQUM7Z0JBQzFELE1BQU0seUJBQXlCLEdBQUcsT0FBTyxFQUFFLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUUxRyxPQUFPLEtBQUssSUFBSSxFQUFFO29CQUNoQixJQUFJLENBQUMsU0FBUzt3QkFBRSxPQUFPO29CQUN2QixNQUFNLGtCQUFrQixHQUFHLE1BQU0scUNBQXFDLEVBQUUsQ0FBQztvQkFDekUsSUFBSSxDQUFDLGtCQUFrQjt3QkFBRSxPQUFPO29CQUNoQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsQ0FBQztnQkFDOUUsQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUNELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uRmVhdHVyZSwgTm90aWZpY2F0aW9uUmVmLCBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VyaWFsaXplciwgUGVyc2lzdGVudE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIgfSBmcm9tICcuL3dpdGgtcGVyaXN0ZW50LW5vdGlmaWNhdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBCcm93c2VyTm90aWZpY2F0aW9uRXh0cmFzID0gT21pdDxOb3RpZmljYXRpb25PcHRpb25zLCAnYm9keScgfCAndGltZXN0YW1wJz47XG5leHBvcnQgdHlwZSBCcm93c2VyTm90aWZpY2F0aW9uID0gTm90aWZpY2F0aW9uO1xuZXhwb3J0IHR5cGUgQnJvd3Nlck5vdGlmaWNhdGlvbkZhY3RvcnkgPSAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IEJyb3dzZXJOb3RpZmljYXRpb247XG5leHBvcnQgdHlwZSBTZW5kQnJvd3Nlck5vdGlmaWNhdGlvbkZuID0gKG5vdGlmaWNhdGlvblJlZjogTm90aWZpY2F0aW9uUmVmKSA9PiB1bmtub3duO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhCcm93c2VyTm90aWZpY2F0aW9uc09wdGlvbnMge1xuICBzZW5kRm4/OiBTZW5kQnJvd3Nlck5vdGlmaWNhdGlvbkZuO1xuICBleHRyYXM/OiBCcm93c2VyTm90aWZpY2F0aW9uRXh0cmFzO1xuICBpc0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIHBlcm1pc3Npb24gdG8gZGlzcGxheSBicm93c2VyIG5vdGlmaWNhdGlvbnMgYW5kIHJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBwZXJtaXNzaW9uIHdhcyBncmFudGVkLlxuICogQGFzeW5jXG4gKiBAZnVuY3Rpb24gcmVxdWVzdEJyb3dzZXJOb3RpZmljYXRpb25QZXJtaXNzaW9uc1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0QnJvd3Nlck5vdGlmaWNhdGlvblBlcm1pc3Npb25zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoISgnTm90aWZpY2F0aW9uJyBpbiB3aW5kb3cpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChOb3RpZmljYXRpb24ucGVybWlzc2lvbiA9PT0gJ2dyYW50ZWQnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE5vdGlmaWNhdGlvbi5wZXJtaXNzaW9uID09PSAnZGVuaWVkJykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwZXJtaXNzaW9uID0gYXdhaXQgTm90aWZpY2F0aW9uLnJlcXVlc3RQZXJtaXNzaW9uKCk7XG5cbiAgcmV0dXJuIHBlcm1pc3Npb24gPT09ICdncmFudGVkJztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgb3V0IGJyb3dzZXIgbm90aWZpY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICogQGZ1bmN0aW9uIHNlbmRCcm93c2VyTm90aWZpY2F0aW9uXG4gKiBAcGFyYW0ge05vdGlmaWNhdGlvblNlcmlhbGl6ZXJ9IHNlcmlhbGl6ZXIgLSBUaGUgc2VyaWFsaXplciB0byB1c2UgZm9yIG5vdGlmaWNhdGlvbiBkYXRhLlxuICogQHBhcmFtIHtCcm93c2VyTm90aWZpY2F0aW9uRXh0cmFzfSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBicm93c2VyIG5vdGlmaWNhdGlvbi5cbiAqIEByZXR1cm5zIHtTZW5kQnJvd3Nlck5vdGlmaWNhdGlvbkZufSBBIGZ1bmN0aW9uIHRvIHNlbmQgYnJvd3NlciBub3RpZmljYXRpb25zLlxuICovXG5mdW5jdGlvbiBzZW5kQnJvd3Nlck5vdGlmaWNhdGlvbihzZXJpYWxpemVyOiBOb3RpZmljYXRpb25TZXJpYWxpemVyLCBvcHRpb25zPzogQnJvd3Nlck5vdGlmaWNhdGlvbkV4dHJhcyk6IFNlbmRCcm93c2VyTm90aWZpY2F0aW9uRm4ge1xuICByZXR1cm4gYXN5bmMgKG5vdGlmaWNhdGlvblJlZikgPT4ge1xuICAgIGlmICghKCdOb3RpZmljYXRpb24nIGluIHdpbmRvdykpIHJldHVybjtcbiAgICBjb25zdCBbbm90aWZpY2F0aW9uT2JqXSA9IGF3YWl0IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXdhaXQgc2VyaWFsaXplci5zZXJpYWxpemUoW25vdGlmaWNhdGlvblJlZl0pKTtcbiAgICBpZiAoIW5vdGlmaWNhdGlvbk9iaiB8fCBub3RpZmljYXRpb25PYmouaGFzQmVlblNlZW4pIHJldHVybjtcbiAgICBjb25zdCB7IGNyZWF0ZWRBdCwgaXRlbSB9ID0gbm90aWZpY2F0aW9uT2JqO1xuICAgIG5ldyBOb3RpZmljYXRpb24oaXRlbS50aXRsZSBhcyBzdHJpbmcsIHtcbiAgICAgIHRhZzogbm90aWZpY2F0aW9uUmVmLm9wdGlvbnMudGFncz8uWzBdLFxuICAgICAgbGFuZzogbm90aWZpY2F0aW9uUmVmLm9wdGlvbnMubGFuZ3VhZ2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYm9keTogaXRlbS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcsXG4gICAgICB0aW1lc3RhbXA6IGNyZWF0ZWRBdCxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBhcHBsaWNhdGlvbiB0byBzZW5kIGJyb3dzZXIgbm90aWZpY2F0aW9ucywgdXNpbmcgQW5ndWxhcidzIGBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUmAgZm9yIHNldHVwLlxuICogQGZ1bmN0aW9uIHdpdGhCcm93c2VyTm90aWZpY2F0aW9uc1xuICogQHBhcmFtIHtXaXRoQnJvd3Nlck5vdGlmaWNhdGlvbnNPcHRpb25zfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBicm93c2VyIG5vdGlmaWNhdGlvbnMuXG4gKiBAcmV0dXJucyB7Tm90aWZpY2F0aW9uRmVhdHVyZX0gQSBub3RpZmljYXRpb24gZmVhdHVyZSBmb3IgaW50ZWdyYXRpb24gaW50byB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQnJvd3Nlck5vdGlmaWNhdGlvbnMob3B0aW9ucz86IFdpdGhCcm93c2VyTm90aWZpY2F0aW9uc09wdGlvbnMpOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgcmV0dXJuIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaXNFbmFibGVkID0gb3B0aW9ucz8uaXNFbmFibGVkID8/IHRydWU7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm4gKCkgPT4gdm9pZCAwO1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gbmV3IFBlcnNpc3RlbnROb3RpZmljYXRpb25TZXJpYWxpemVyKCk7XG4gICAgICAgIGNvbnN0IHNlbmRCcm93c2VyTm90aWZpY2F0aW9uRm4gPSBvcHRpb25zPy5zZW5kRm4gPz8gc2VuZEJyb3dzZXJOb3RpZmljYXRpb24oc2VyaWFsaXplciwgb3B0aW9ucz8uZXh0cmFzKTtcblxuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcGVybWlzc2lvbnNHcmFudGVkID0gYXdhaXQgcmVxdWVzdEJyb3dzZXJOb3RpZmljYXRpb25QZXJtaXNzaW9ucygpO1xuICAgICAgICAgIGlmICghcGVybWlzc2lvbnNHcmFudGVkKSByZXR1cm47XG4gICAgICAgICAgbm90aWZpY2F0aW9uU2VydmljZS5vbk5vdGlmaWNhdGlvbkFkZCQuc3Vic2NyaWJlKHNlbmRCcm93c2VyTm90aWZpY2F0aW9uRm4pO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
@@ -0,0 +1,45 @@
1
+ import { ENVIRONMENT_INITIALIZER, inject } from '@angular/core';
2
+ import { from, isObservable, of } from 'rxjs';
3
+ import { makeNotificationFeature } from '../models';
4
+ import { NotificationService } from '../notification.service';
5
+ /**
6
+ * Loads notifications using the provided `loadFn`. This function abstracts over the differences
7
+ * between synchronous notifications, promises, and observables, providing a uniform Observable output.
8
+ * @function loadNotifications
9
+ * @param {LoadNotificationsFn} [loadFn] - An optional function to load notifications.
10
+ * @returns {Observable<NotificationRef[]>} An Observable stream of notification references.
11
+ */
12
+ function loadNotifications(loadFn) {
13
+ const notifications = loadFn?.();
14
+ if (isObservable(notifications)) {
15
+ return notifications;
16
+ }
17
+ if (notifications instanceof Promise) {
18
+ return from(notifications);
19
+ }
20
+ return of(notifications ?? []);
21
+ }
22
+ /**
23
+ * Integrates notification loading into the application environment. This function uses the Angular
24
+ * `ENVIRONMENT_INITIALIZER` to ensure that notifications are loaded as part of the application's
25
+ * initialization process.
26
+ * @function withLoadNotifications
27
+ * @param {LoadNotificationsFn} loadFn - The function to load notifications.
28
+ * @returns {NotificationFeature} A notification feature configured to load notifications at startup.
29
+ */
30
+ export function withLoadNotifications(loadFn) {
31
+ return makeNotificationFeature([
32
+ {
33
+ provide: ENVIRONMENT_INITIALIZER,
34
+ useFactory: () => {
35
+ const notificationService = inject(NotificationService);
36
+ const notifications$ = loadNotifications(loadFn);
37
+ return () => {
38
+ notifications$.subscribe((notificationRefs) => notificationService.load(notificationRefs));
39
+ };
40
+ },
41
+ multi: true,
42
+ },
43
+ ]);
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1sb2FkLW5vdGlmaWNhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLWxvYWQtbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBYyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBVTlEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsTUFBNEI7SUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUMvQixPQUFPLGFBQWEsQ0FBQztLQUN0QjtJQUNELElBQUksYUFBYSxZQUFZLE9BQU8sRUFBRTtRQUNwQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUM1QjtJQUNELE9BQU8sRUFBRSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUEyQjtJQUMvRCxPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3hELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUVqRCxPQUFPLEdBQUcsRUFBRTtvQkFDVixjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOVklST05NRU5UX0lOSVRJQUxJWkVSLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20sIGlzT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkZlYXR1cmUsIE5vdGlmaWNhdGlvblJlZiwgbWFrZU5vdGlmaWNhdGlvbkZlYXR1cmUgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gdGhhdCBsb2FkcyBub3RpZmljYXRpb25zLlxuICogQ2FuIHJldHVybiBub3RpZmljYXRpb25zIGRpcmVjdGx5IGFzIGFuIGFycmF5LCBhcyBhIFByb21pc2UsIG9yIGFzIGFuIE9ic2VydmFibGUuXG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IExvYWROb3RpZmljYXRpb25zRm5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblJlZltdPiB8IFByb21pc2U8Tm90aWZpY2F0aW9uUmVmW10+IHwgTm90aWZpY2F0aW9uUmVmW119IFRoZSBsb2FkZWQgbm90aWZpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZE5vdGlmaWNhdGlvbnNGbiA9ICgpID0+IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uUmVmW10+IHwgUHJvbWlzZTxOb3RpZmljYXRpb25SZWZbXT4gfCBOb3RpZmljYXRpb25SZWZbXTtcblxuLyoqXG4gKiBMb2FkcyBub3RpZmljYXRpb25zIHVzaW5nIHRoZSBwcm92aWRlZCBgbG9hZEZuYC4gVGhpcyBmdW5jdGlvbiBhYnN0cmFjdHMgb3ZlciB0aGUgZGlmZmVyZW5jZXNcbiAqIGJldHdlZW4gc3luY2hyb25vdXMgbm90aWZpY2F0aW9ucywgcHJvbWlzZXMsIGFuZCBvYnNlcnZhYmxlcywgcHJvdmlkaW5nIGEgdW5pZm9ybSBPYnNlcnZhYmxlIG91dHB1dC5cbiAqIEBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uc1xuICogQHBhcmFtIHtMb2FkTm90aWZpY2F0aW9uc0ZufSBbbG9hZEZuXSAtIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGxvYWQgbm90aWZpY2F0aW9ucy5cbiAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblJlZltdPn0gQW4gT2JzZXJ2YWJsZSBzdHJlYW0gb2Ygbm90aWZpY2F0aW9uIHJlZmVyZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIGxvYWROb3RpZmljYXRpb25zKGxvYWRGbj86IExvYWROb3RpZmljYXRpb25zRm4pOiBPYnNlcnZhYmxlPE5vdGlmaWNhdGlvblJlZltdPiB7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBsb2FkRm4/LigpO1xuICBpZiAoaXNPYnNlcnZhYmxlKG5vdGlmaWNhdGlvbnMpKSB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbnM7XG4gIH1cbiAgaWYgKG5vdGlmaWNhdGlvbnMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgcmV0dXJuIGZyb20obm90aWZpY2F0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG9mKG5vdGlmaWNhdGlvbnMgPz8gW10pO1xufVxuXG4vKipcbiAqIEludGVncmF0ZXMgbm90aWZpY2F0aW9uIGxvYWRpbmcgaW50byB0aGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgQW5ndWxhclxuICogYEVOVklST05NRU5UX0lOSVRJQUxJWkVSYCB0byBlbnN1cmUgdGhhdCBub3RpZmljYXRpb25zIGFyZSBsb2FkZWQgYXMgcGFydCBvZiB0aGUgYXBwbGljYXRpb24nc1xuICogaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy5cbiAqIEBmdW5jdGlvbiB3aXRoTG9hZE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7TG9hZE5vdGlmaWNhdGlvbnNGbn0gbG9hZEZuIC0gVGhlIGZ1bmN0aW9uIHRvIGxvYWQgbm90aWZpY2F0aW9ucy5cbiAqIEByZXR1cm5zIHtOb3RpZmljYXRpb25GZWF0dXJlfSBBIG5vdGlmaWNhdGlvbiBmZWF0dXJlIGNvbmZpZ3VyZWQgdG8gbG9hZCBub3RpZmljYXRpb25zIGF0IHN0YXJ0dXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoTG9hZE5vdGlmaWNhdGlvbnMobG9hZEZuOiBMb2FkTm90aWZpY2F0aW9uc0ZuKTogTm90aWZpY2F0aW9uRmVhdHVyZSB7XG4gIHJldHVybiBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZShbXG4gICAge1xuICAgICAgcHJvdmlkZTogRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uU2VydmljZSk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMkID0gbG9hZE5vdGlmaWNhdGlvbnMobG9hZEZuKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgobm90aWZpY2F0aW9uUmVmcykgPT4gbm90aWZpY2F0aW9uU2VydmljZS5sb2FkKG5vdGlmaWNhdGlvblJlZnMpKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
@@ -0,0 +1,34 @@
1
+ import { InjectionToken, inject } from '@angular/core';
2
+ import { makeNotificationFeature } from '../models';
3
+ /**
4
+ * An InjectionToken for the NotificationTransformFn. This token can be used to inject
5
+ * a custom notification transformation function into the Angular DI system.
6
+ * @type {InjectionToken<NotificationTransformFn>}
7
+ */
8
+ export const ODX_NOTIFICATION_TRANSFORMER = new InjectionToken('@odx/angular/components/notification::NotificationTransformer');
9
+ /**
10
+ * Attempts to inject a NotificationTransformFn from the Angular DI system.
11
+ * If no provider is found, it returns null.
12
+ * @function injectNotificationTransform
13
+ * @returns {NotificationTransformFn | null} The injected NotificationTransformFn, or null if not provided.
14
+ */
15
+ export function injectNotificationTransform() {
16
+ return inject(ODX_NOTIFICATION_TRANSFORMER, { optional: true });
17
+ }
18
+ /**
19
+ * Configures a notification transformation function to be used within the application.
20
+ * This function provides a mechanism to globally apply transformations to notifications
21
+ * before they are processed or displayed.
22
+ * @function withNotificationTransform
23
+ * @param {NotificationTransformFn} transformFn - The function to transform notifications.
24
+ * @returns {NotificationFeature} A NotificationFeature configured with the provided transformation function.
25
+ */
26
+ export function withNotificationTransform(transformFn) {
27
+ return makeNotificationFeature([
28
+ {
29
+ provide: ODX_NOTIFICATION_TRANSFORMER,
30
+ useValue: transformFn,
31
+ },
32
+ ]);
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1ub3RpZmljYXRpb24tdHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLW5vdGlmaWNhdGlvbi10cmFuc2Zvcm1lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSTFGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLGNBQWMsQ0FBMEIsK0RBQStELENBQUMsQ0FBQztBQUV6Sjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwyQkFBMkI7SUFDekMsT0FBTyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxXQUFvQztJQUM1RSxPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLDRCQUE0QjtZQUNyQyxRQUFRLEVBQUUsV0FBVztTQUN0QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25GZWF0dXJlLCBOb3RpZmljYXRpb25SZWYsIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IHR5cGUgTm90aWZpY2F0aW9uVHJhbnNmb3JtRm4gPSAocmVmOiBOb3RpZmljYXRpb25SZWYpID0+IE9ic2VydmFibGU8Tm90aWZpY2F0aW9uUmVmPjtcblxuLyoqXG4gKiBBbiBJbmplY3Rpb25Ub2tlbiBmb3IgdGhlIE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuLiBUaGlzIHRva2VuIGNhbiBiZSB1c2VkIHRvIGluamVjdFxuICogYSBjdXN0b20gbm90aWZpY2F0aW9uIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGludG8gdGhlIEFuZ3VsYXIgREkgc3lzdGVtLlxuICogQHR5cGUge0luamVjdGlvblRva2VuPE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuPn1cbiAqL1xuZXhwb3J0IGNvbnN0IE9EWF9OT1RJRklDQVRJT05fVFJBTlNGT1JNRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48Tm90aWZpY2F0aW9uVHJhbnNmb3JtRm4+KCdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb246Ok5vdGlmaWNhdGlvblRyYW5zZm9ybWVyJyk7XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gaW5qZWN0IGEgTm90aWZpY2F0aW9uVHJhbnNmb3JtRm4gZnJvbSB0aGUgQW5ndWxhciBESSBzeXN0ZW0uXG4gKiBJZiBubyBwcm92aWRlciBpcyBmb3VuZCwgaXQgcmV0dXJucyBudWxsLlxuICogQGZ1bmN0aW9uIGluamVjdE5vdGlmaWNhdGlvblRyYW5zZm9ybVxuICogQHJldHVybnMge05vdGlmaWNhdGlvblRyYW5zZm9ybUZuIHwgbnVsbH0gVGhlIGluamVjdGVkIE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuLCBvciBudWxsIGlmIG5vdCBwcm92aWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE5vdGlmaWNhdGlvblRyYW5zZm9ybSgpOiBOb3RpZmljYXRpb25UcmFuc2Zvcm1GbiB8IG51bGwge1xuICByZXR1cm4gaW5qZWN0KE9EWF9OT1RJRklDQVRJT05fVFJBTlNGT1JNRVIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBhIG5vdGlmaWNhdGlvbiB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0byBiZSB1c2VkIHdpdGhpbiB0aGUgYXBwbGljYXRpb24uXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIGdsb2JhbGx5IGFwcGx5IHRyYW5zZm9ybWF0aW9ucyB0byBub3RpZmljYXRpb25zXG4gKiBiZWZvcmUgdGhleSBhcmUgcHJvY2Vzc2VkIG9yIGRpc3BsYXllZC5cbiAqIEBmdW5jdGlvbiB3aXRoTm90aWZpY2F0aW9uVHJhbnNmb3JtXG4gKiBAcGFyYW0ge05vdGlmaWNhdGlvblRyYW5zZm9ybUZufSB0cmFuc2Zvcm1GbiAtIFRoZSBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gbm90aWZpY2F0aW9ucy5cbiAqIEByZXR1cm5zIHtOb3RpZmljYXRpb25GZWF0dXJlfSBBIE5vdGlmaWNhdGlvbkZlYXR1cmUgY29uZmlndXJlZCB3aXRoIHRoZSBwcm92aWRlZCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhOb3RpZmljYXRpb25UcmFuc2Zvcm0odHJhbnNmb3JtRm46IE5vdGlmaWNhdGlvblRyYW5zZm9ybUZuKTogTm90aWZpY2F0aW9uRmVhdHVyZSB7XG4gIHJldHVybiBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZShbXG4gICAge1xuICAgICAgcHJvdmlkZTogT0RYX05PVElGSUNBVElPTl9UUkFOU0ZPUk1FUixcbiAgICAgIHVzZVZhbHVlOiB0cmFuc2Zvcm1GbixcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
@@ -0,0 +1,94 @@
1
+ import { deepmerge } from '@odx/angular/internal';
2
+ import { isFunction, isString } from '@odx/angular/utils';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import { makeNotificationFeature } from '../models';
5
+ import { withLoadNotifications } from './with-load-notifications';
6
+ import { withSaveNotifications } from './with-save-notifications';
7
+ /**
8
+ * Implementation of NotificationSerializer for persistent storage.
9
+ * @class PersistentNotificationSerializer
10
+ * @implements {NotificationSerializer}
11
+ */
12
+ export class PersistentNotificationSerializer {
13
+ /**
14
+ * Serializes an array of NotificationRef objects into a string.
15
+ * @function serialize
16
+ * @memberof NotificationSerializer
17
+ * @param {NotificationRef[]} value - The notification references to serialize.
18
+ * @returns {Promise<string>} A promise that resolves to the serialized string representation of notification references.
19
+ */
20
+ async serialize(value) {
21
+ const serializedNotifications = await Promise.all(value.map(async (ref) => deepmerge(ref, {
22
+ item: {
23
+ title: await this.serializeDynamicTextContent(ref.item.title),
24
+ description: await this.serializeDynamicTextContent(ref.item.description),
25
+ },
26
+ })));
27
+ return JSON.stringify(serializedNotifications);
28
+ }
29
+ /**
30
+ * Deserializes a string into an array of NotificationRef objects.
31
+ * @function deserialize
32
+ * @memberof NotificationSerializer
33
+ * @param {string} value - The string representation of notification references to deserialize.
34
+ * @returns {Promise<NotificationRef[]>} A promise that resolves to the deserialized notification references.
35
+ */
36
+ async deserialize(value) {
37
+ return JSON.parse(value);
38
+ }
39
+ async serializeDynamicTextContent(content) {
40
+ if (!content)
41
+ return '';
42
+ if (isString(content))
43
+ return content;
44
+ return firstValueFrom(content).catch(() => '');
45
+ }
46
+ }
47
+ /**
48
+ * Initializes and returns a function for loading persistent notifications.
49
+ * @function initPersistentNotifications
50
+ * @param {WithPersistentNotificationsStorageOptions} options - The storage options including serializer and storage key.
51
+ * @returns {LoadNotificationsFn} A function to load notifications from storage.
52
+ */
53
+ export function initPersistentNotifications({ storage, storageKey, serializer, idTransformer, }) {
54
+ return async () => {
55
+ const storedValue = storage.getItem(storageKey);
56
+ if (!storedValue)
57
+ return [];
58
+ const notificationRefs = await serializer.deserialize(storedValue);
59
+ if (isFunction(idTransformer)) {
60
+ for (const notificationRef of notificationRefs) {
61
+ notificationRef.item.id = notificationRef.id = idTransformer(notificationRef);
62
+ }
63
+ }
64
+ return notificationRefs;
65
+ };
66
+ }
67
+ /**
68
+ * Returns a function for persisting notifications.
69
+ * @function persistNotifications
70
+ * @param {WithPersistentNotificationsStorageOptions} options - The storage options including serializer and storage key.
71
+ * @returns {SaveNotificationsFn} A function to save notifications to storage.
72
+ */
73
+ export function persistNotifications({ storage, storageKey, serializer }) {
74
+ return async (notificationRefs) => {
75
+ storage.setItem(storageKey, await serializer.serialize(notificationRefs));
76
+ };
77
+ }
78
+ /**
79
+ * Configures the application to use persistent notifications, automatically loading from and saving to the configured storage.
80
+ * @function withPersistentNotifications
81
+ * @param {Partial<WithPersistentNotificationsOptions>} [options] - Optional configuration for persistent notifications.
82
+ * @returns {NotificationFeature} A notification feature configured for persistence.
83
+ */
84
+ export function withPersistentNotifications(options) {
85
+ const storageOptions = {
86
+ storageKey: options?.storageOptions?.storageKey ?? '@odx/angular/components/notification::Storage',
87
+ storage: options?.storageOptions?.storage ?? localStorage,
88
+ serializer: options?.storageOptions?.serializer ?? new PersistentNotificationSerializer(),
89
+ };
90
+ const initFn = options?.initFn ?? initPersistentNotifications(storageOptions);
91
+ const saveFn = options?.saveFn ?? persistNotifications(storageOptions);
92
+ return makeNotificationFeature([withLoadNotifications(initFn), withSaveNotifications(saveFn)]);
93
+ }
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1wZXJpc3RlbnQtbm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9zcmMvbGliL2ZlYXR1cmVzL3dpdGgtcGVyaXN0ZW50LW5vdGlmaWNhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RixPQUFPLEVBQXVCLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPdkY7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxnQ0FBZ0M7SUFDM0M7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUF3QjtRQUM3QyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0MsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDdEIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNiLElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQzdELFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMxRTtTQUNGLENBQUMsQ0FDSCxDQUNGLENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQTRCO1FBQ3BFLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFFdEMsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRjtBQWVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEVBQzFDLE9BQU8sRUFDUCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGFBQWEsR0FDNkI7SUFDMUMsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNoQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkUsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDN0IsS0FBSyxNQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRTtnQkFDOUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDL0U7U0FDRjtRQUVELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQTZDO0lBQ2pILE9BQU8sS0FBSyxFQUFFLGdCQUFtQyxFQUFFLEVBQUU7UUFDbkQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsT0FBcUQ7SUFDL0YsTUFBTSxjQUFjLEdBQThDO1FBQ2hFLFVBQVUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsSUFBSSwrQ0FBK0M7UUFDbEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsT0FBTyxJQUFJLFlBQVk7UUFDekQsVUFBVSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxJQUFJLElBQUksZ0NBQWdDLEVBQUU7S0FDMUYsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLElBQUksMkJBQTJCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUUsTUFBTSxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV2RSxPQUFPLHVCQUF1QixDQUFDLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbWljVGV4dENvbnRlbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2R5bmFtaWMtdmlldyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNTdHJpbmcgfSBmcm9tICdAb2R4L2FuZ3VsYXIvdXRpbHMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkZlYXR1cmUsIE5vdGlmaWNhdGlvblJlZiwgbWFrZU5vdGlmaWNhdGlvbkZlYXR1cmUgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgTG9hZE5vdGlmaWNhdGlvbnNGbiwgd2l0aExvYWROb3RpZmljYXRpb25zIH0gZnJvbSAnLi93aXRoLWxvYWQtbm90aWZpY2F0aW9ucyc7XG5pbXBvcnQgeyBTYXZlTm90aWZpY2F0aW9uc0ZuLCB3aXRoU2F2ZU5vdGlmaWNhdGlvbnMgfSBmcm9tICcuL3dpdGgtc2F2ZS1ub3RpZmljYXRpb25zJztcblxuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25TZXJpYWxpemVyIHtcbiAgc2VyaWFsaXplKHZhbHVlOiBOb3RpZmljYXRpb25SZWZbXSk6IFByb21pc2U8c3RyaW5nPjtcbiAgZGVzZXJpYWxpemUodmFsdWU6IHN0cmluZyk6IFByb21pc2U8Tm90aWZpY2F0aW9uUmVmW10+O1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIgZm9yIHBlcnNpc3RlbnQgc3RvcmFnZS5cbiAqIEBjbGFzcyBQZXJzaXN0ZW50Tm90aWZpY2F0aW9uU2VyaWFsaXplclxuICogQGltcGxlbWVudHMge05vdGlmaWNhdGlvblNlcmlhbGl6ZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBQZXJzaXN0ZW50Tm90aWZpY2F0aW9uU2VyaWFsaXplciBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIge1xuICAvKipcbiAgICogU2VyaWFsaXplcyBhbiBhcnJheSBvZiBOb3RpZmljYXRpb25SZWYgb2JqZWN0cyBpbnRvIGEgc3RyaW5nLlxuICAgKiBAZnVuY3Rpb24gc2VyaWFsaXplXG4gICAqIEBtZW1iZXJvZiBOb3RpZmljYXRpb25TZXJpYWxpemVyXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uUmVmW119IHZhbHVlIC0gVGhlIG5vdGlmaWNhdGlvbiByZWZlcmVuY2VzIHRvIHNlcmlhbGl6ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNlcmlhbGl6ZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG5vdGlmaWNhdGlvbiByZWZlcmVuY2VzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlcmlhbGl6ZSh2YWx1ZTogTm90aWZpY2F0aW9uUmVmW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWROb3RpZmljYXRpb25zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB2YWx1ZS5tYXAoYXN5bmMgKHJlZikgPT5cbiAgICAgICAgZGVlcG1lcmdlKHJlZiwge1xuICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgIHRpdGxlOiBhd2FpdCB0aGlzLnNlcmlhbGl6ZUR5bmFtaWNUZXh0Q29udGVudChyZWYuaXRlbS50aXRsZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYXdhaXQgdGhpcy5zZXJpYWxpemVEeW5hbWljVGV4dENvbnRlbnQocmVmLml0ZW0uZGVzY3JpcHRpb24pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWROb3RpZmljYXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgYSBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBOb3RpZmljYXRpb25SZWYgb2JqZWN0cy5cbiAgICogQGZ1bmN0aW9uIGRlc2VyaWFsaXplXG4gICAqIEBtZW1iZXJvZiBOb3RpZmljYXRpb25TZXJpYWxpemVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygbm90aWZpY2F0aW9uIHJlZmVyZW5jZXMgdG8gZGVzZXJpYWxpemUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE5vdGlmaWNhdGlvblJlZltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlc2VyaWFsaXplZCBub3RpZmljYXRpb24gcmVmZXJlbmNlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXNlcmlhbGl6ZSh2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxOb3RpZmljYXRpb25SZWZbXT4ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VyaWFsaXplRHluYW1pY1RleHRDb250ZW50KGNvbnRlbnQ/OiBEeW5hbWljVGV4dENvbnRlbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghY29udGVudCkgcmV0dXJuICcnO1xuICAgIGlmIChpc1N0cmluZyhjb250ZW50KSkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oY29udGVudCkuY2F0Y2goKCkgPT4gJycpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnMge1xuICBzdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNlcmlhbGl6ZXI6IE5vdGlmaWNhdGlvblNlcmlhbGl6ZXI7XG4gIGlkVHJhbnNmb3JtZXI/OiAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNPcHRpb25zIHtcbiAgaW5pdEZuOiBMb2FkTm90aWZpY2F0aW9uc0ZuO1xuICBzYXZlRm46IFNhdmVOb3RpZmljYXRpb25zRm47XG4gIHN0b3JhZ2VPcHRpb25zOiBXaXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNTdG9yYWdlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIGZvciBsb2FkaW5nIHBlcnNpc3RlbnQgbm90aWZpY2F0aW9ucy5cbiAqIEBmdW5jdGlvbiBpbml0UGVyc2lzdGVudE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7V2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc3RvcmFnZSBvcHRpb25zIGluY2x1ZGluZyBzZXJpYWxpemVyIGFuZCBzdG9yYWdlIGtleS5cbiAqIEByZXR1cm5zIHtMb2FkTm90aWZpY2F0aW9uc0ZufSBBIGZ1bmN0aW9uIHRvIGxvYWQgbm90aWZpY2F0aW9ucyBmcm9tIHN0b3JhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0UGVyc2lzdGVudE5vdGlmaWNhdGlvbnMoe1xuICBzdG9yYWdlLFxuICBzdG9yYWdlS2V5LFxuICBzZXJpYWxpemVyLFxuICBpZFRyYW5zZm9ybWVyLFxufTogV2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnMpOiBMb2FkTm90aWZpY2F0aW9uc0ZuIHtcbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5KTtcbiAgICBpZiAoIXN0b3JlZFZhbHVlKSByZXR1cm4gW107XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uUmVmcyA9IGF3YWl0IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoc3RvcmVkVmFsdWUpO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oaWRUcmFuc2Zvcm1lcikpIHtcbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uUmVmIG9mIG5vdGlmaWNhdGlvblJlZnMpIHtcbiAgICAgICAgbm90aWZpY2F0aW9uUmVmLml0ZW0uaWQgPSBub3RpZmljYXRpb25SZWYuaWQgPSBpZFRyYW5zZm9ybWVyKG5vdGlmaWNhdGlvblJlZik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvblJlZnM7XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGZvciBwZXJzaXN0aW5nIG5vdGlmaWNhdGlvbnMuXG4gKiBAZnVuY3Rpb24gcGVyc2lzdE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7V2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zU3RvcmFnZU9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgc3RvcmFnZSBvcHRpb25zIGluY2x1ZGluZyBzZXJpYWxpemVyIGFuZCBzdG9yYWdlIGtleS5cbiAqIEByZXR1cm5zIHtTYXZlTm90aWZpY2F0aW9uc0ZufSBBIGZ1bmN0aW9uIHRvIHNhdmUgbm90aWZpY2F0aW9ucyB0byBzdG9yYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGVyc2lzdE5vdGlmaWNhdGlvbnMoeyBzdG9yYWdlLCBzdG9yYWdlS2V5LCBzZXJpYWxpemVyIH06IFdpdGhQZXJzaXN0ZW50Tm90aWZpY2F0aW9uc1N0b3JhZ2VPcHRpb25zKTogU2F2ZU5vdGlmaWNhdGlvbnNGbiB7XG4gIHJldHVybiBhc3luYyAobm90aWZpY2F0aW9uUmVmczogTm90aWZpY2F0aW9uUmVmW10pID0+IHtcbiAgICBzdG9yYWdlLnNldEl0ZW0oc3RvcmFnZUtleSwgYXdhaXQgc2VyaWFsaXplci5zZXJpYWxpemUobm90aWZpY2F0aW9uUmVmcykpO1xuICB9O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZSBwZXJzaXN0ZW50IG5vdGlmaWNhdGlvbnMsIGF1dG9tYXRpY2FsbHkgbG9hZGluZyBmcm9tIGFuZCBzYXZpbmcgdG8gdGhlIGNvbmZpZ3VyZWQgc3RvcmFnZS5cbiAqIEBmdW5jdGlvbiB3aXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNcbiAqIEBwYXJhbSB7UGFydGlhbDxXaXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnNPcHRpb25zPn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgcGVyc2lzdGVudCBub3RpZmljYXRpb25zLlxuICogQHJldHVybnMge05vdGlmaWNhdGlvbkZlYXR1cmV9IEEgbm90aWZpY2F0aW9uIGZlYXR1cmUgY29uZmlndXJlZCBmb3IgcGVyc2lzdGVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGVyc2lzdGVudE5vdGlmaWNhdGlvbnMob3B0aW9ucz86IFBhcnRpYWw8V2l0aFBlcnNpc3RlbnROb3RpZmljYXRpb25zT3B0aW9ucz4pOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgY29uc3Qgc3RvcmFnZU9wdGlvbnM6IFdpdGhQZXJzaXN0ZW50Tm90aWZpY2F0aW9uc1N0b3JhZ2VPcHRpb25zID0ge1xuICAgIHN0b3JhZ2VLZXk6IG9wdGlvbnM/LnN0b3JhZ2VPcHRpb25zPy5zdG9yYWdlS2V5ID8/ICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb246OlN0b3JhZ2UnLFxuICAgIHN0b3JhZ2U6IG9wdGlvbnM/LnN0b3JhZ2VPcHRpb25zPy5zdG9yYWdlID8/IGxvY2FsU3RvcmFnZSxcbiAgICBzZXJpYWxpemVyOiBvcHRpb25zPy5zdG9yYWdlT3B0aW9ucz8uc2VyaWFsaXplciA/PyBuZXcgUGVyc2lzdGVudE5vdGlmaWNhdGlvblNlcmlhbGl6ZXIoKSxcbiAgfTtcbiAgY29uc3QgaW5pdEZuID0gb3B0aW9ucz8uaW5pdEZuID8/IGluaXRQZXJzaXN0ZW50Tm90aWZpY2F0aW9ucyhzdG9yYWdlT3B0aW9ucyk7XG4gIGNvbnN0IHNhdmVGbiA9IG9wdGlvbnM/LnNhdmVGbiA/PyBwZXJzaXN0Tm90aWZpY2F0aW9ucyhzdG9yYWdlT3B0aW9ucyk7XG5cbiAgcmV0dXJuIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKFt3aXRoTG9hZE5vdGlmaWNhdGlvbnMoaW5pdEZuKSwgd2l0aFNhdmVOb3RpZmljYXRpb25zKHNhdmVGbildKTtcbn1cbiJdfQ==
@@ -0,0 +1,45 @@
1
+ import { ENVIRONMENT_INITIALIZER, Injector, inject, runInInjectionContext } from '@angular/core';
2
+ import { firstValueFrom, isObservable } from 'rxjs';
3
+ import { makeNotificationFeature } from '../models';
4
+ import { NotificationService } from '../notification.service';
5
+ /**
6
+ * Asynchronously saves notifications using the provided save function. It handles Observable and Promise results seamlessly.
7
+ * @async
8
+ * @function saveNotifications
9
+ * @param {NotificationRef[]} notifications - The notifications to be saved.
10
+ * @param {SaveNotificationsFn} [saveFn] - Optional custom save function.
11
+ * @returns {Promise<void>} A promise that resolves when the save operation is complete.
12
+ */
13
+ async function saveNotifications(notifications, saveFn) {
14
+ const save = saveFn?.(notifications);
15
+ if (isObservable(save)) {
16
+ await firstValueFrom(save);
17
+ }
18
+ else if (save instanceof Promise) {
19
+ await save;
20
+ }
21
+ }
22
+ /**
23
+ * Configures the application to automatically save notifications using a specified save function.
24
+ * This setup integrates with Angular's environment initialization process to ensure notifications are saved as needed.
25
+ * @function withSaveNotifications
26
+ * @param {SaveNotificationsFn} saveFn - The function to save notifications.
27
+ * @returns {NotificationFeature} A notification feature configured to automatically save notifications.
28
+ */
29
+ export function withSaveNotifications(saveFn) {
30
+ return makeNotificationFeature([
31
+ {
32
+ provide: ENVIRONMENT_INITIALIZER,
33
+ useFactory: () => {
34
+ const injector = Injector.create({ parent: inject(Injector), providers: [] });
35
+ const notificationService = inject(NotificationService);
36
+ const saveFnWithContext = (notifications) => runInInjectionContext(injector, () => saveFn(notifications));
37
+ return () => {
38
+ notificationService.notifications$.subscribe(({ values }) => saveNotifications(values, saveFnWithContext));
39
+ };
40
+ },
41
+ multi: true,
42
+ },
43
+ ]);
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1zYXZlLW5vdGlmaWNhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9mZWF0dXJlcy93aXRoLXNhdmUtbm90aWZpY2F0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQWMsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQXdDLHVCQUF1QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTlEOzs7Ozs7O0dBT0c7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQUMsYUFBZ0MsRUFBRSxNQUE0QjtJQUM3RixNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM1QjtTQUFNLElBQUksSUFBSSxZQUFZLE9BQU8sRUFBRTtRQUNsQyxNQUFNLElBQUksQ0FBQztLQUNaO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUEyQjtJQUMvRCxPQUFPLHVCQUF1QixDQUFDO1FBQzdCO1lBQ0UsT0FBTyxFQUFFLHVCQUF1QjtZQUNoQyxVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLGlCQUFpQixHQUF3QixDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUUvSCxPQUFPLEdBQUcsRUFBRTtvQkFDVixtQkFBbUIsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDN0csQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUNELEtBQUssRUFBRSxJQUFJO1NBQ1o7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WSVJPTk1FTlRfSU5JVElBTElaRVIsIEluamVjdG9yLCBpbmplY3QsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlyc3RWYWx1ZUZyb20sIGlzT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uRmVhdHVyZSwgTm90aWZpY2F0aW9uUmVmLCBtYWtlTm90aWZpY2F0aW9uRmVhdHVyZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBTYXZlTm90aWZpY2F0aW9uc0ZuID0gKG5vdGlmaWNhdGlvblJlZnM6IE5vdGlmaWNhdGlvblJlZltdKSA9PiBPYnNlcnZhYmxlPHZvaWQ+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2F2ZXMgbm90aWZpY2F0aW9ucyB1c2luZyB0aGUgcHJvdmlkZWQgc2F2ZSBmdW5jdGlvbi4gSXQgaGFuZGxlcyBPYnNlcnZhYmxlIGFuZCBQcm9taXNlIHJlc3VsdHMgc2VhbWxlc3NseS5cbiAqIEBhc3luY1xuICogQGZ1bmN0aW9uIHNhdmVOb3RpZmljYXRpb25zXG4gKiBAcGFyYW0ge05vdGlmaWNhdGlvblJlZltdfSBub3RpZmljYXRpb25zIC0gVGhlIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2F2ZWQuXG4gKiBAcGFyYW0ge1NhdmVOb3RpZmljYXRpb25zRm59IFtzYXZlRm5dIC0gT3B0aW9uYWwgY3VzdG9tIHNhdmUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2F2ZSBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVOb3RpZmljYXRpb25zKG5vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvblJlZltdLCBzYXZlRm4/OiBTYXZlTm90aWZpY2F0aW9uc0ZuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNhdmUgPSBzYXZlRm4/Lihub3RpZmljYXRpb25zKTtcbiAgaWYgKGlzT2JzZXJ2YWJsZShzYXZlKSkge1xuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHNhdmUpO1xuICB9IGVsc2UgaWYgKHNhdmUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgYXdhaXQgc2F2ZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGFwcGxpY2F0aW9uIHRvIGF1dG9tYXRpY2FsbHkgc2F2ZSBub3RpZmljYXRpb25zIHVzaW5nIGEgc3BlY2lmaWVkIHNhdmUgZnVuY3Rpb24uXG4gKiBUaGlzIHNldHVwIGludGVncmF0ZXMgd2l0aCBBbmd1bGFyJ3MgZW52aXJvbm1lbnQgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB0byBlbnN1cmUgbm90aWZpY2F0aW9ucyBhcmUgc2F2ZWQgYXMgbmVlZGVkLlxuICogQGZ1bmN0aW9uIHdpdGhTYXZlTm90aWZpY2F0aW9uc1xuICogQHBhcmFtIHtTYXZlTm90aWZpY2F0aW9uc0ZufSBzYXZlRm4gLSBUaGUgZnVuY3Rpb24gdG8gc2F2ZSBub3RpZmljYXRpb25zLlxuICogQHJldHVybnMge05vdGlmaWNhdGlvbkZlYXR1cmV9IEEgbm90aWZpY2F0aW9uIGZlYXR1cmUgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IHNhdmUgbm90aWZpY2F0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhTYXZlTm90aWZpY2F0aW9ucyhzYXZlRm46IFNhdmVOb3RpZmljYXRpb25zRm4pOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgcmV0dXJuIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwYXJlbnQ6IGluamVjdChJbmplY3RvciksIHByb3ZpZGVyczogW10gfSk7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTm90aWZpY2F0aW9uU2VydmljZSk7XG4gICAgICAgIGNvbnN0IHNhdmVGbldpdGhDb250ZXh0OiBTYXZlTm90aWZpY2F0aW9uc0ZuID0gKG5vdGlmaWNhdGlvbnMpID0+IHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4gc2F2ZUZuKG5vdGlmaWNhdGlvbnMpKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKCh7IHZhbHVlcyB9KSA9PiBzYXZlTm90aWZpY2F0aW9ucyh2YWx1ZXMsIHNhdmVGbldpdGhDb250ZXh0KSk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSk7XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ export function getNotificationsByTags(...tags) {
2
+ const cachedTags = new Set(tags.filter(Boolean));
3
+ return ({ options }) => {
4
+ return cachedTags.size < 1 || options.tags.every((tag) => cachedTags.has(tag));
5
+ };
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LW5vdGlmaWNhdGlvbnMtYnktdGFnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL3NyYy9saWIvaGVscGVycy9nZXQtbm90aWZpY2F0aW9ucy1ieS10YWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEdBQUcsSUFBc0M7SUFDOUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRWpELE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7UUFDckIsT0FBTyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb3RpZmljYXRpb25RdWVyeSB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25zQnlUYWdzKC4uLnRhZ3M6IEFycmF5PHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+KTogTm90aWZpY2F0aW9uUXVlcnkge1xuICBjb25zdCBjYWNoZWRUYWdzID0gbmV3IFNldCh0YWdzLmZpbHRlcihCb29sZWFuKSk7XG5cbiAgcmV0dXJuICh7IG9wdGlvbnMgfSkgPT4ge1xuICAgIHJldHVybiBjYWNoZWRUYWdzLnNpemUgPCAxIHx8IG9wdGlvbnMudGFncy5ldmVyeSgodGFnKSA9PiBjYWNoZWRUYWdzLmhhcyh0YWcpKTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './get-notifications-by-tag';
2
+ export * from './sort-notifications';
3
+ export * from './to-notification-collection';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9oZWxwZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nZXQtbm90aWZpY2F0aW9ucy1ieS10YWcnO1xuZXhwb3J0ICogZnJvbSAnLi9zb3J0LW5vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi90by1ub3RpZmljYXRpb24tY29sbGVjdGlvbic7XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import { isFunction } from '@odx/angular/utils';
2
+ import { tap } from 'rxjs';
3
+ export function sortNotifications(sortFn) {
4
+ return (source$) => source$.pipe(tap((values) => {
5
+ if (!isFunction(sortFn))
6
+ return;
7
+ values.sort(sortFn);
8
+ }));
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC1ub3RpZmljYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL3NyYy9saWIvaGVscGVycy9zb3J0LW5vdGlmaWNhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBNEIsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUEyQjtJQUMzRCxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDakIsT0FBTyxDQUFDLElBQUksQ0FDVixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQUUsT0FBTztRQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUNILENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uUmVmLCBOb3RpZmljYXRpb25Tb3J0Rm4gfSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gc29ydE5vdGlmaWNhdGlvbnMoc29ydEZuPzogTm90aWZpY2F0aW9uU29ydEZuKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPE5vdGlmaWNhdGlvblJlZltdPiB7XG4gIHJldHVybiAoc291cmNlJCkgPT5cbiAgICBzb3VyY2UkLnBpcGUoXG4gICAgICB0YXAoKHZhbHVlcykgPT4ge1xuICAgICAgICBpZiAoIWlzRnVuY3Rpb24oc29ydEZuKSkgcmV0dXJuO1xuICAgICAgICB2YWx1ZXMuc29ydChzb3J0Rm4pO1xuICAgICAgfSksXG4gICAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ import { map } from 'rxjs';
2
+ export function toNotificationCollection() {
3
+ return (source$) => source$.pipe(map((notificationRefs) => ({
4
+ values: notificationRefs,
5
+ count: notificationRefs.length,
6
+ isEmpty: notificationRefs.length === 0,
7
+ })));
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tbm90aWZpY2F0aW9uLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9oZWxwZXJzL3RvLW5vdGlmaWNhdGlvbi1jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzdDLE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtRQUM5QixPQUFPLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUM7S0FDdkMsQ0FBQyxDQUFDLENBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcGVyYXRvckZ1bmN0aW9uLCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkNvbGxlY3Rpb24sIE5vdGlmaWNhdGlvblJlZiB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b05vdGlmaWNhdGlvbkNvbGxlY3Rpb24oKTogT3BlcmF0b3JGdW5jdGlvbjxOb3RpZmljYXRpb25SZWZbXSwgTm90aWZpY2F0aW9uQ29sbGVjdGlvbj4ge1xuICByZXR1cm4gKHNvdXJjZSQpID0+XG4gICAgc291cmNlJC5waXBlKFxuICAgICAgbWFwKChub3RpZmljYXRpb25SZWZzKSA9PiAoe1xuICAgICAgICB2YWx1ZXM6IG5vdGlmaWNhdGlvblJlZnMsXG4gICAgICAgIGNvdW50OiBub3RpZmljYXRpb25SZWZzLmxlbmd0aCxcbiAgICAgICAgaXNFbXB0eTogbm90aWZpY2F0aW9uUmVmcy5sZW5ndGggPT09IDAsXG4gICAgICB9KSksXG4gICAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,9 @@
1
+ export * from './notification';
2
+ export * from './notification-action';
3
+ export * from './notification-collection';
4
+ export * from './notification-feature';
5
+ export * from './notification-options';
6
+ export * from './notification-query';
7
+ export * from './notification-sort-fn';
8
+ export * from './notification.ref';
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24tYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLWNvbGxlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24tZmVhdHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbi1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLXF1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9uLXNvcnQtZm4nO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24ucmVmJztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9zcmMvbGliL21vZGVscy9ub3RpZmljYXRpb24tYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb3RpZmljYXRpb25SZWYgfSBmcm9tICcuL25vdGlmaWNhdGlvbi5yZWYnO1xuXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25BY3Rpb24gPSAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IHZvaWQ7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWNvbGxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLWNvbGxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vdGlmaWNhdGlvblJlZiB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnJlZic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uQ29sbGVjdGlvbiB7XG4gIHZhbHVlczogTm90aWZpY2F0aW9uUmVmW107XG4gIGNvdW50OiBudW1iZXI7XG4gIGlzRW1wdHk6IGJvb2xlYW47XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export function makeNotificationFeature(provider) {
2
+ return provider;
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWZlYXR1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLWZlYXR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFFBQW1FO0lBQ3pHLE9BQU8sUUFBd0MsQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW52aXJvbm1lbnRQcm92aWRlcnMsIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbkZlYXR1cmUgPSBFbnZpcm9ubWVudFByb3ZpZGVycyAmIHsgybVvZHhCcmFuZDogJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL25vdGlmaWNhdGlvbjo6Tm90aWZpY2F0aW9uRmVhdHVyZScgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VOb3RpZmljYXRpb25GZWF0dXJlKHByb3ZpZGVyOiAoUHJvdmlkZXIgfCBOb3RpZmljYXRpb25GZWF0dXJlKVtdIHwgRW52aXJvbm1lbnRQcm92aWRlcnMpOiBOb3RpZmljYXRpb25GZWF0dXJlIHtcbiAgcmV0dXJuIHByb3ZpZGVyIGFzIG5ldmVyIGFzIE5vdGlmaWNhdGlvbkZlYXR1cmU7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLW9wdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uT3B0aW9ucyB7XG4gIGljb246IHN0cmluZztcbiAgdGFnczogc3RyaW5nW107XG4gIGRpc21pc3NhYmxlOiBib29sZWFuO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL3NyYy9saWIvbW9kZWxzL25vdGlmaWNhdGlvbi1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm90aWZpY2F0aW9uUmVmIH0gZnJvbSAnLi9ub3RpZmljYXRpb24ucmVmJztcblxuZXhwb3J0IHR5cGUgTm90aWZpY2F0aW9uUXVlcnkgPSAobm90aWZpY2F0aW9uUmVmOiBOb3RpZmljYXRpb25SZWYpID0+IGJvb2xlYW47XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLXNvcnQtZm4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9ub3RpZmljYXRpb24vc3JjL2xpYi9tb2RlbHMvbm90aWZpY2F0aW9uLXNvcnQtZm4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vdGlmaWNhdGlvblJlZiB9IGZyb20gJy4vbm90aWZpY2F0aW9uLnJlZic7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvblNvcnRGbiA9IFBhcmFtZXRlcnM8QXJyYXk8Tm90aWZpY2F0aW9uUmVmPlsnc29ydCddPlswXTtcbiJdfQ==