@oneluiz/dual-datepicker 3.5.1 → 3.9.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 (35) hide show
  1. package/core/built-in-presets.d.ts +98 -0
  2. package/core/calendar-grid/calendar-grid.cache.d.ts +39 -0
  3. package/core/calendar-grid/calendar-grid.factory.d.ts +26 -0
  4. package/core/calendar-grid/calendar-grid.types.d.ts +57 -0
  5. package/core/calendar-grid/index.d.ts +50 -0
  6. package/core/calendar-grid/range-highlighter.cache.d.ts +105 -0
  7. package/core/calendar-grid/range-highlighter.d.ts +85 -0
  8. package/core/calendar-grid/range-highlighter.types.d.ts +182 -0
  9. package/core/calendar-grid/virtual-weeks.logic.d.ts +116 -0
  10. package/core/calendar-grid/virtual-weeks.types.d.ts +71 -0
  11. package/core/index.d.ts +22 -0
  12. package/core/preset-providers.d.ts +176 -0
  13. package/core/preset-registry.d.ts +181 -0
  14. package/core/preset.engine.d.ts +57 -21
  15. package/core/range-preset.plugin.d.ts +188 -0
  16. package/dual-datepicker.component.d.ts +78 -1
  17. package/esm2022/core/built-in-presets.mjs +289 -0
  18. package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +92 -0
  19. package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +97 -0
  20. package/esm2022/core/calendar-grid/calendar-grid.types.mjs +8 -0
  21. package/esm2022/core/calendar-grid/index.mjs +51 -0
  22. package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +198 -0
  23. package/esm2022/core/calendar-grid/range-highlighter.mjs +185 -0
  24. package/esm2022/core/calendar-grid/range-highlighter.types.mjs +11 -0
  25. package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +149 -0
  26. package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +11 -0
  27. package/esm2022/core/index.mjs +26 -1
  28. package/esm2022/core/preset-providers.mjs +243 -0
  29. package/esm2022/core/preset-registry.mjs +277 -0
  30. package/esm2022/core/preset.engine.mjs +86 -210
  31. package/esm2022/core/range-preset.plugin.mjs +70 -0
  32. package/esm2022/dual-datepicker.component.mjs +202 -39
  33. package/fesm2022/oneluiz-dual-datepicker.mjs +1985 -282
  34. package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
  35. package/package.json +2 -2
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Provider Functions for Built-in Presets
3
+ *
4
+ * Version: 3.6.0
5
+ *
6
+ * Automatic registration of built-in date range presets.
7
+ * These providers ensure backward compatibility by auto-registering
8
+ * all standard presets (TODAY, LAST_7_DAYS, THIS_MONTH, etc.)
9
+ *
10
+ * USAGE IN LIBRARY (Internal):
11
+ * Built-in presets are registered automatically via Angular providers.
12
+ * Library consumers don't need to do anything.
13
+ *
14
+ * USAGE IN APP (Custom Presets):
15
+ * ```typescript
16
+ * // app.config.ts
17
+ * export const appConfig: ApplicationConfig = {
18
+ * providers: [
19
+ * // ... other providers
20
+ * provideCustomPresets([
21
+ * {
22
+ * key: 'THIS_FISCAL_QUARTER',
23
+ * resolve: (clock, adapter) => {
24
+ * const now = clock.now();
25
+ * // ... fiscal logic
26
+ * return { start, end };
27
+ * }
28
+ * }
29
+ * ])
30
+ * ]
31
+ * };
32
+ * ```
33
+ */
34
+ import { APP_INITIALIZER, makeEnvironmentProviders } from '@angular/core';
35
+ import { PresetRegistry } from './preset-registry';
36
+ import { BUILT_IN_PRESETS } from './built-in-presets';
37
+ /**
38
+ * Initializer function that registers built-in presets
39
+ *
40
+ * Runs at application startup (APP_INITIALIZER)
41
+ *
42
+ * @param registry - PresetRegistry instance
43
+ * @returns Initialization function
44
+ */
45
+ function initializeBuiltInPresets(registry) {
46
+ return () => {
47
+ // Register all built-in presets
48
+ BUILT_IN_PRESETS.forEach(preset => {
49
+ registry.register(preset);
50
+ });
51
+ // Log registration for debugging (can be removed in production)
52
+ if (typeof console !== 'undefined' && console.debug) {
53
+ console.debug(`[ng-dual-datepicker] Registered ${BUILT_IN_PRESETS.length} built-in presets:`, BUILT_IN_PRESETS.map(p => p.key).join(', '));
54
+ }
55
+ };
56
+ }
57
+ /**
58
+ * Provide built-in date range presets
59
+ *
60
+ * This provider is automatically included in the library's root providers.
61
+ * Library consumers don't need to add this manually.
62
+ *
63
+ * @returns EnvironmentProviders for built-in presets
64
+ *
65
+ * @internal
66
+ */
67
+ export function provideBuiltInPresets() {
68
+ return makeEnvironmentProviders([
69
+ {
70
+ provide: APP_INITIALIZER,
71
+ multi: true,
72
+ useFactory: initializeBuiltInPresets,
73
+ deps: [PresetRegistry]
74
+ }
75
+ ]);
76
+ }
77
+ /**
78
+ * Provide custom date range presets
79
+ *
80
+ * Use this to register your own industry-specific presets:
81
+ * - Fiscal presets
82
+ * - Hotel/hospitality presets
83
+ * - Logistics presets
84
+ * - Custom business logic
85
+ *
86
+ * @param presets - Array of custom RangePresetPlugin implementations
87
+ * @returns EnvironmentProviders for custom presets
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * // Fiscal presets
92
+ * const FISCAL_PRESETS: RangePresetPlugin[] = [
93
+ * {
94
+ * key: 'THIS_FISCAL_QUARTER',
95
+ * resolve: (clock, adapter) => {
96
+ * const now = clock.now();
97
+ * const month = adapter.getMonth(now);
98
+ *
99
+ * // Fiscal year starts April (month 3)
100
+ * const fiscalMonth = (month + 9) % 12;
101
+ * const quarterStart = Math.floor(fiscalMonth / 3) * 3;
102
+ * const calendarMonth = (quarterStart - 9 + 12) % 12;
103
+ *
104
+ * const year = adapter.getYear(now);
105
+ * const fiscalYear = month < 3 ? year - 1 : year;
106
+ *
107
+ * const start = new Date(fiscalYear, calendarMonth, 1);
108
+ * const end = new Date(fiscalYear, calendarMonth + 3, 0);
109
+ *
110
+ * return {
111
+ * start: adapter.normalize(start),
112
+ * end: adapter.normalize(end)
113
+ * };
114
+ * }
115
+ * },
116
+ * {
117
+ * key: 'FISCAL_YEAR_TO_DATE',
118
+ * resolve: (clock, adapter) => {
119
+ * const now = clock.now();
120
+ * const month = adapter.getMonth(now);
121
+ * const year = adapter.getYear(now);
122
+ *
123
+ * // Fiscal year starts April 1
124
+ * const fiscalYearStart = month >= 3
125
+ * ? new Date(year, 3, 1)
126
+ * : new Date(year - 1, 3, 1);
127
+ *
128
+ * return {
129
+ * start: adapter.normalize(fiscalYearStart),
130
+ * end: adapter.normalize(now)
131
+ * };
132
+ * }
133
+ * }
134
+ * ];
135
+ *
136
+ * // In app.config.ts
137
+ * export const appConfig: ApplicationConfig = {
138
+ * providers: [
139
+ * provideCustomPresets(FISCAL_PRESETS)
140
+ * ]
141
+ * };
142
+ *
143
+ * // Use in components
144
+ * store.applyPreset('THIS_FISCAL_QUARTER');
145
+ * store.applyPreset('FISCAL_YEAR_TO_DATE');
146
+ * ```
147
+ *
148
+ * @example
149
+ * ```typescript
150
+ * // Hotel presets
151
+ * const HOTEL_PRESETS: RangePresetPlugin[] = [
152
+ * {
153
+ * key: 'CHECK_IN_WEEK',
154
+ * resolve: (clock, adapter) => {
155
+ * const now = clock.now();
156
+ * const dayOfWeek = adapter.getDayOfWeek(now);
157
+ *
158
+ * // Check-in week: Friday to Friday
159
+ * const daysToNextFriday = dayOfWeek <= 5
160
+ * ? 5 - dayOfWeek
161
+ * : 7 - dayOfWeek + 5;
162
+ *
163
+ * const nextFriday = adapter.addDays(now, daysToNextFriday);
164
+ * const followingFriday = adapter.addDays(nextFriday, 7);
165
+ *
166
+ * return { start: nextFriday, end: followingFriday };
167
+ * }
168
+ * },
169
+ * {
170
+ * key: 'NEXT_30_NIGHTS',
171
+ * resolve: (clock, adapter) => {
172
+ * const now = clock.now();
173
+ * const tomorrow = adapter.addDays(now, 1);
174
+ * const end = adapter.addDays(tomorrow, 30);
175
+ * return { start: tomorrow, end };
176
+ * }
177
+ * }
178
+ * ];
179
+ *
180
+ * providers: [provideCustomPresets(HOTEL_PRESETS)]
181
+ * ```
182
+ */
183
+ export function provideCustomPresets(presets) {
184
+ return makeEnvironmentProviders([
185
+ {
186
+ provide: APP_INITIALIZER,
187
+ multi: true,
188
+ useFactory: (registry) => {
189
+ return () => {
190
+ presets.forEach(preset => {
191
+ registry.register(preset);
192
+ });
193
+ if (typeof console !== 'undefined' && console.debug) {
194
+ console.debug(`[ng-dual-datepicker] Registered ${presets.length} custom presets:`, presets.map(p => p.key).join(', '));
195
+ }
196
+ };
197
+ },
198
+ deps: [PresetRegistry]
199
+ }
200
+ ]);
201
+ }
202
+ /**
203
+ * Provide preset package
204
+ *
205
+ * Convenience function for external preset packages.
206
+ *
207
+ * @param packageName - Name of the preset package (for logging)
208
+ * @param presets - Array of presets from the package
209
+ * @returns EnvironmentProviders
210
+ *
211
+ * @example
212
+ * ```typescript
213
+ * // @acme/fiscal-presets package
214
+ * export function provideFiscalPresets(): EnvironmentProviders {
215
+ * return providePresetPackage('@acme/fiscal-presets', FISCAL_PRESETS);
216
+ * }
217
+ *
218
+ * // In app
219
+ * import { provideFiscalPresets } from '@acme/fiscal-presets';
220
+ *
221
+ * providers: [provideFiscalPresets()]
222
+ * ```
223
+ */
224
+ export function providePresetPackage(packageName, presets) {
225
+ return makeEnvironmentProviders([
226
+ {
227
+ provide: APP_INITIALIZER,
228
+ multi: true,
229
+ useFactory: (registry) => {
230
+ return () => {
231
+ presets.forEach(preset => {
232
+ registry.register(preset);
233
+ });
234
+ if (typeof console !== 'undefined' && console.debug) {
235
+ console.debug(`[${packageName}] Registered ${presets.length} presets:`, presets.map(p => p.key).join(', '));
236
+ }
237
+ };
238
+ },
239
+ deps: [PresetRegistry]
240
+ }
241
+ ]);
242
+ }
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LXByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC1wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBd0Isd0JBQXdCLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3REOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHdCQUF3QixDQUFDLFFBQXdCO0lBQ3hELE9BQU8sR0FBRyxFQUFFO1FBQ1YsZ0NBQWdDO1FBQ2hDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0VBQWdFO1FBQ2hFLElBQUksT0FBTyxPQUFPLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwRCxPQUFPLENBQUMsS0FBSyxDQUNYLG1DQUFtQyxnQkFBZ0IsQ0FBQyxNQUFNLG9CQUFvQixFQUM5RSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixLQUFLLEVBQUUsSUFBSTtZQUNYLFVBQVUsRUFBRSx3QkFBd0I7WUFDcEMsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQ3ZCO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5R0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBNEI7SUFDL0QsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QjtZQUNFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsVUFBVSxFQUFFLENBQUMsUUFBd0IsRUFBRSxFQUFFO2dCQUN2QyxPQUFPLEdBQUcsRUFBRTtvQkFDVixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUN2QixRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1QixDQUFDLENBQUMsQ0FBQztvQkFFSCxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQ1gsbUNBQW1DLE9BQU8sQ0FBQyxNQUFNLGtCQUFrQixFQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDbkMsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUM7U0FDdkI7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsV0FBbUIsRUFDbkIsT0FBNEI7SUFFNUIsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QjtZQUNFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsVUFBVSxFQUFFLENBQUMsUUFBd0IsRUFBRSxFQUFFO2dCQUN2QyxPQUFPLEdBQUcsRUFBRTtvQkFDVixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO3dCQUN2QixRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM1QixDQUFDLENBQUMsQ0FBQztvQkFFSCxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQ1gsSUFBSSxXQUFXLGdCQUFnQixPQUFPLENBQUMsTUFBTSxXQUFXLEVBQ3hELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNuQyxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQztTQUN2QjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByb3ZpZGVyIEZ1bmN0aW9ucyBmb3IgQnVpbHQtaW4gUHJlc2V0c1xuICogXG4gKiBWZXJzaW9uOiAzLjYuMFxuICogXG4gKiBBdXRvbWF0aWMgcmVnaXN0cmF0aW9uIG9mIGJ1aWx0LWluIGRhdGUgcmFuZ2UgcHJlc2V0cy5cbiAqIFRoZXNlIHByb3ZpZGVycyBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBieSBhdXRvLXJlZ2lzdGVyaW5nXG4gKiBhbGwgc3RhbmRhcmQgcHJlc2V0cyAoVE9EQVksIExBU1RfN19EQVlTLCBUSElTX01PTlRILCBldGMuKVxuICogXG4gKiBVU0FHRSBJTiBMSUJSQVJZIChJbnRlcm5hbCk6XG4gKiBCdWlsdC1pbiBwcmVzZXRzIGFyZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkgdmlhIEFuZ3VsYXIgcHJvdmlkZXJzLlxuICogTGlicmFyeSBjb25zdW1lcnMgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy5cbiAqIFxuICogVVNBR0UgSU4gQVBQIChDdXN0b20gUHJlc2V0cyk6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBhcHAuY29uZmlnLnRzXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgLy8gLi4uIG90aGVyIHByb3ZpZGVyc1xuICogICAgIHByb3ZpZGVDdXN0b21QcmVzZXRzKFtcbiAqICAgICAgIHtcbiAqICAgICAgICAga2V5OiAnVEhJU19GSVNDQUxfUVVBUlRFUicsXG4gKiAgICAgICAgIHJlc29sdmU6IChjbG9jaywgYWRhcHRlcikgPT4ge1xuICogICAgICAgICAgIGNvbnN0IG5vdyA9IGNsb2NrLm5vdygpO1xuICogICAgICAgICAgIC8vIC4uLiBmaXNjYWwgbG9naWNcbiAqICAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICBdKVxuICogICBdXG4gKiB9O1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgQVBQX0lOSVRJQUxJWkVSLCBFbnZpcm9ubWVudFByb3ZpZGVycywgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFByZXNldFJlZ2lzdHJ5IH0gZnJvbSAnLi9wcmVzZXQtcmVnaXN0cnknO1xuaW1wb3J0IHsgQlVJTFRfSU5fUFJFU0VUUyB9IGZyb20gJy4vYnVpbHQtaW4tcHJlc2V0cyc7XG5pbXBvcnQgeyBSYW5nZVByZXNldFBsdWdpbiB9IGZyb20gJy4vcmFuZ2UtcHJlc2V0LnBsdWdpbic7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgZnVuY3Rpb24gdGhhdCByZWdpc3RlcnMgYnVpbHQtaW4gcHJlc2V0c1xuICogXG4gKiBSdW5zIGF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAgKEFQUF9JTklUSUFMSVpFUilcbiAqIFxuICogQHBhcmFtIHJlZ2lzdHJ5IC0gUHJlc2V0UmVnaXN0cnkgaW5zdGFuY2VcbiAqIEByZXR1cm5zIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGluaXRpYWxpemVCdWlsdEluUHJlc2V0cyhyZWdpc3RyeTogUHJlc2V0UmVnaXN0cnkpOiAoKSA9PiB2b2lkIHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICAvLyBSZWdpc3RlciBhbGwgYnVpbHQtaW4gcHJlc2V0c1xuICAgIEJVSUxUX0lOX1BSRVNFVFMuZm9yRWFjaChwcmVzZXQgPT4ge1xuICAgICAgcmVnaXN0cnkucmVnaXN0ZXIocHJlc2V0KTtcbiAgICB9KTtcblxuICAgIC8vIExvZyByZWdpc3RyYXRpb24gZm9yIGRlYnVnZ2luZyAoY2FuIGJlIHJlbW92ZWQgaW4gcHJvZHVjdGlvbilcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgIGBbbmctZHVhbC1kYXRlcGlja2VyXSBSZWdpc3RlcmVkICR7QlVJTFRfSU5fUFJFU0VUUy5sZW5ndGh9IGJ1aWx0LWluIHByZXNldHM6YCxcbiAgICAgICAgQlVJTFRfSU5fUFJFU0VUUy5tYXAocCA9PiBwLmtleSkuam9pbignLCAnKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUHJvdmlkZSBidWlsdC1pbiBkYXRlIHJhbmdlIHByZXNldHNcbiAqIFxuICogVGhpcyBwcm92aWRlciBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5J3Mgcm9vdCBwcm92aWRlcnMuXG4gKiBMaWJyYXJ5IGNvbnN1bWVycyBkb24ndCBuZWVkIHRvIGFkZCB0aGlzIG1hbnVhbGx5LlxuICogXG4gKiBAcmV0dXJucyBFbnZpcm9ubWVudFByb3ZpZGVycyBmb3IgYnVpbHQtaW4gcHJlc2V0c1xuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVCdWlsdEluUHJlc2V0cygpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRmFjdG9yeTogaW5pdGlhbGl6ZUJ1aWx0SW5QcmVzZXRzLFxuICAgICAgZGVwczogW1ByZXNldFJlZ2lzdHJ5XVxuICAgIH1cbiAgXSk7XG59XG5cbi8qKlxuICogUHJvdmlkZSBjdXN0b20gZGF0ZSByYW5nZSBwcmVzZXRzXG4gKiBcbiAqIFVzZSB0aGlzIHRvIHJlZ2lzdGVyIHlvdXIgb3duIGluZHVzdHJ5LXNwZWNpZmljIHByZXNldHM6XG4gKiAtIEZpc2NhbCBwcmVzZXRzXG4gKiAtIEhvdGVsL2hvc3BpdGFsaXR5IHByZXNldHNcbiAqIC0gTG9naXN0aWNzIHByZXNldHNcbiAqIC0gQ3VzdG9tIGJ1c2luZXNzIGxvZ2ljXG4gKiBcbiAqIEBwYXJhbSBwcmVzZXRzIC0gQXJyYXkgb2YgY3VzdG9tIFJhbmdlUHJlc2V0UGx1Z2luIGltcGxlbWVudGF0aW9uc1xuICogQHJldHVybnMgRW52aXJvbm1lbnRQcm92aWRlcnMgZm9yIGN1c3RvbSBwcmVzZXRzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBGaXNjYWwgcHJlc2V0c1xuICogY29uc3QgRklTQ0FMX1BSRVNFVFM6IFJhbmdlUHJlc2V0UGx1Z2luW10gPSBbXG4gKiAgIHtcbiAqICAgICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgICByZXNvbHZlOiAoY2xvY2ssIGFkYXB0ZXIpID0+IHtcbiAqICAgICAgIGNvbnN0IG5vdyA9IGNsb2NrLm5vdygpO1xuICogICAgICAgY29uc3QgbW9udGggPSBhZGFwdGVyLmdldE1vbnRoKG5vdyk7XG4gKiAgICAgICBcbiAqICAgICAgIC8vIEZpc2NhbCB5ZWFyIHN0YXJ0cyBBcHJpbCAobW9udGggMylcbiAqICAgICAgIGNvbnN0IGZpc2NhbE1vbnRoID0gKG1vbnRoICsgOSkgJSAxMjtcbiAqICAgICAgIGNvbnN0IHF1YXJ0ZXJTdGFydCA9IE1hdGguZmxvb3IoZmlzY2FsTW9udGggLyAzKSAqIDM7XG4gKiAgICAgICBjb25zdCBjYWxlbmRhck1vbnRoID0gKHF1YXJ0ZXJTdGFydCAtIDkgKyAxMikgJSAxMjtcbiAqICAgICAgIFxuICogICAgICAgY29uc3QgeWVhciA9IGFkYXB0ZXIuZ2V0WWVhcihub3cpO1xuICogICAgICAgY29uc3QgZmlzY2FsWWVhciA9IG1vbnRoIDwgMyA/IHllYXIgLSAxIDogeWVhcjtcbiAqICAgICAgIFxuICogICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShmaXNjYWxZZWFyLCBjYWxlbmRhck1vbnRoLCAxKTtcbiAqICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKGZpc2NhbFllYXIsIGNhbGVuZGFyTW9udGggKyAzLCAwKTtcbiAqICAgICAgIFxuICogICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgc3RhcnQ6IGFkYXB0ZXIubm9ybWFsaXplKHN0YXJ0KSxcbiAqICAgICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpXG4gKiAgICAgICB9O1xuICogICAgIH1cbiAqICAgfSxcbiAqICAge1xuICogICAgIGtleTogJ0ZJU0NBTF9ZRUFSX1RPX0RBVEUnLFxuICogICAgIHJlc29sdmU6IChjbG9jaywgYWRhcHRlcikgPT4ge1xuICogICAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgICBjb25zdCBtb250aCA9IGFkYXB0ZXIuZ2V0TW9udGgobm93KTtcbiAqICAgICAgIGNvbnN0IHllYXIgPSBhZGFwdGVyLmdldFllYXIobm93KTtcbiAqICAgICAgIFxuICogICAgICAgLy8gRmlzY2FsIHllYXIgc3RhcnRzIEFwcmlsIDFcbiAqICAgICAgIGNvbnN0IGZpc2NhbFllYXJTdGFydCA9IG1vbnRoID49IDMgXG4gKiAgICAgICAgID8gbmV3IERhdGUoeWVhciwgMywgMSlcbiAqICAgICAgICAgOiBuZXcgRGF0ZSh5ZWFyIC0gMSwgMywgMSk7XG4gKiAgICAgICBcbiAqICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgIHN0YXJ0OiBhZGFwdGVyLm5vcm1hbGl6ZShmaXNjYWxZZWFyU3RhcnQpLFxuICogICAgICAgICBlbmQ6IGFkYXB0ZXIubm9ybWFsaXplKG5vdylcbiAqICAgICAgIH07XG4gKiAgICAgfVxuICogICB9XG4gKiBdO1xuICogXG4gKiAvLyBJbiBhcHAuY29uZmlnLnRzXG4gKiBleHBvcnQgY29uc3QgYXBwQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZyA9IHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgcHJvdmlkZUN1c3RvbVByZXNldHMoRklTQ0FMX1BSRVNFVFMpXG4gKiAgIF1cbiAqIH07XG4gKiBcbiAqIC8vIFVzZSBpbiBjb21wb25lbnRzXG4gKiBzdG9yZS5hcHBseVByZXNldCgnVEhJU19GSVNDQUxfUVVBUlRFUicpO1xuICogc3RvcmUuYXBwbHlQcmVzZXQoJ0ZJU0NBTF9ZRUFSX1RPX0RBVEUnKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gSG90ZWwgcHJlc2V0c1xuICogY29uc3QgSE9URUxfUFJFU0VUUzogUmFuZ2VQcmVzZXRQbHVnaW5bXSA9IFtcbiAqICAge1xuICogICAgIGtleTogJ0NIRUNLX0lOX1dFRUsnLFxuICogICAgIHJlc29sdmU6IChjbG9jaywgYWRhcHRlcikgPT4ge1xuICogICAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgICBjb25zdCBkYXlPZldlZWsgPSBhZGFwdGVyLmdldERheU9mV2Vlayhub3cpO1xuICogICAgICAgXG4gKiAgICAgICAvLyBDaGVjay1pbiB3ZWVrOiBGcmlkYXkgdG8gRnJpZGF5XG4gKiAgICAgICBjb25zdCBkYXlzVG9OZXh0RnJpZGF5ID0gZGF5T2ZXZWVrIDw9IDUgXG4gKiAgICAgICAgID8gNSAtIGRheU9mV2VlayBcbiAqICAgICAgICAgOiA3IC0gZGF5T2ZXZWVrICsgNTtcbiAqICAgICAgIFxuICogICAgICAgY29uc3QgbmV4dEZyaWRheSA9IGFkYXB0ZXIuYWRkRGF5cyhub3csIGRheXNUb05leHRGcmlkYXkpO1xuICogICAgICAgY29uc3QgZm9sbG93aW5nRnJpZGF5ID0gYWRhcHRlci5hZGREYXlzKG5leHRGcmlkYXksIDcpO1xuICogICAgICAgXG4gKiAgICAgICByZXR1cm4geyBzdGFydDogbmV4dEZyaWRheSwgZW5kOiBmb2xsb3dpbmdGcmlkYXkgfTtcbiAqICAgICB9XG4gKiAgIH0sXG4gKiAgIHtcbiAqICAgICBrZXk6ICdORVhUXzMwX05JR0hUUycsXG4gKiAgICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgICBjb25zdCBub3cgPSBjbG9jay5ub3coKTtcbiAqICAgICAgIGNvbnN0IHRvbW9ycm93ID0gYWRhcHRlci5hZGREYXlzKG5vdywgMSk7XG4gKiAgICAgICBjb25zdCBlbmQgPSBhZGFwdGVyLmFkZERheXModG9tb3Jyb3csIDMwKTtcbiAqICAgICAgIHJldHVybiB7IHN0YXJ0OiB0b21vcnJvdywgZW5kIH07XG4gKiAgICAgfVxuICogICB9XG4gKiBdO1xuICogXG4gKiBwcm92aWRlcnM6IFtwcm92aWRlQ3VzdG9tUHJlc2V0cyhIT1RFTF9QUkVTRVRTKV1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUN1c3RvbVByZXNldHMocHJlc2V0czogUmFuZ2VQcmVzZXRQbHVnaW5bXSk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VGYWN0b3J5OiAocmVnaXN0cnk6IFByZXNldFJlZ2lzdHJ5KSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcHJlc2V0cy5mb3JFYWNoKHByZXNldCA9PiB7XG4gICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlcihwcmVzZXQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgICBgW25nLWR1YWwtZGF0ZXBpY2tlcl0gUmVnaXN0ZXJlZCAke3ByZXNldHMubGVuZ3RofSBjdXN0b20gcHJlc2V0czpgLFxuICAgICAgICAgICAgICBwcmVzZXRzLm1hcChwID0+IHAua2V5KS5qb2luKCcsICcpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBkZXBzOiBbUHJlc2V0UmVnaXN0cnldXG4gICAgfVxuICBdKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlIHByZXNldCBwYWNrYWdlXG4gKiBcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBleHRlcm5hbCBwcmVzZXQgcGFja2FnZXMuXG4gKiBcbiAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIE5hbWUgb2YgdGhlIHByZXNldCBwYWNrYWdlIChmb3IgbG9nZ2luZylcbiAqIEBwYXJhbSBwcmVzZXRzIC0gQXJyYXkgb2YgcHJlc2V0cyBmcm9tIHRoZSBwYWNrYWdlXG4gKiBAcmV0dXJucyBFbnZpcm9ubWVudFByb3ZpZGVyc1xuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQGFjbWUvZmlzY2FsLXByZXNldHMgcGFja2FnZVxuICogZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVGaXNjYWxQcmVzZXRzKCk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAqICAgcmV0dXJuIHByb3ZpZGVQcmVzZXRQYWNrYWdlKCdAYWNtZS9maXNjYWwtcHJlc2V0cycsIEZJU0NBTF9QUkVTRVRTKTtcbiAqIH1cbiAqIFxuICogLy8gSW4gYXBwXG4gKiBpbXBvcnQgeyBwcm92aWRlRmlzY2FsUHJlc2V0cyB9IGZyb20gJ0BhY21lL2Zpc2NhbC1wcmVzZXRzJztcbiAqIFxuICogcHJvdmlkZXJzOiBbcHJvdmlkZUZpc2NhbFByZXNldHMoKV1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVByZXNldFBhY2thZ2UoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHByZXNldHM6IFJhbmdlUHJlc2V0UGx1Z2luW11cbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VGYWN0b3J5OiAocmVnaXN0cnk6IFByZXNldFJlZ2lzdHJ5KSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcHJlc2V0cy5mb3JFYWNoKHByZXNldCA9PiB7XG4gICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlcihwcmVzZXQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgICAgICAgICBgWyR7cGFja2FnZU5hbWV9XSBSZWdpc3RlcmVkICR7cHJlc2V0cy5sZW5ndGh9IHByZXNldHM6YCxcbiAgICAgICAgICAgICAgcHJlc2V0cy5tYXAocCA9PiBwLmtleSkuam9pbignLCAnKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZGVwczogW1ByZXNldFJlZ2lzdHJ5XVxuICAgIH1cbiAgXSk7XG59XG4iXX0=
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Preset Registry Service
3
+ *
4
+ * Version: 3.6.0
5
+ *
6
+ * Central registry for all date range preset plugins (built-in and custom).
7
+ *
8
+ * ARCHITECTURE:
9
+ * - Singleton service (providedIn: 'root')
10
+ * - Manages Map<string, RangePresetPlugin>
11
+ * - Thread-safe registration
12
+ * - Supports plugin override (useful for testing)
13
+ *
14
+ * USAGE:
15
+ * ```typescript
16
+ * // In app
17
+ * const registry = inject(PresetRegistry);
18
+ *
19
+ * // Register custom preset
20
+ * registry.register({
21
+ * key: 'MY_CUSTOM_PRESET',
22
+ * resolve: (clock, adapter) => {
23
+ * const now = clock.now();
24
+ * return { start: now, end: now };
25
+ * }
26
+ * });
27
+ *
28
+ * // Check if preset exists
29
+ * if (registry.has('MY_CUSTOM_PRESET')) {
30
+ * store.applyPreset('MY_CUSTOM_PRESET');
31
+ * }
32
+ *
33
+ * // Get all registered presets
34
+ * const allPresets = registry.getAll();
35
+ * console.log('Available presets:', allPresets.map(p => p.key));
36
+ * ```
37
+ *
38
+ * EXTERNAL PACKAGES:
39
+ * ```typescript
40
+ * // @acme/fiscal-presets
41
+ * export function provideFiscalPresets() {
42
+ * return {
43
+ * provide: APP_INITIALIZER,
44
+ * multi: true,
45
+ * useFactory: (registry: PresetRegistry) => {
46
+ * return () => {
47
+ * FISCAL_PRESETS.forEach(p => registry.register(p));
48
+ * };
49
+ * },
50
+ * deps: [PresetRegistry]
51
+ * };
52
+ * }
53
+ * ```
54
+ */
55
+ import { Injectable } from '@angular/core';
56
+ import { isRangePresetPlugin } from './range-preset.plugin';
57
+ import * as i0 from "@angular/core";
58
+ /**
59
+ * Preset Registry Service
60
+ *
61
+ * Manages registration and retrieval of date range preset plugins.
62
+ *
63
+ * DESIGN:
64
+ * - Uses Map for O(1) lookups
65
+ * - Immutable getAll() returns copy
66
+ * - Supports plugin override (last registration wins)
67
+ * - Validates plugins before registration
68
+ */
69
+ export class PresetRegistry {
70
+ /**
71
+ * Internal map of registered presets
72
+ * Key: preset key (e.g., 'TODAY', 'LAST_7_DAYS')
73
+ * Value: RangePresetPlugin instance
74
+ */
75
+ presets = new Map();
76
+ /**
77
+ * Register a date range preset plugin
78
+ *
79
+ * If a preset with the same key already exists, it will be overridden.
80
+ * This is useful for:
81
+ * - Testing (override built-in presets with mocks)
82
+ * - Customization (replace default behavior)
83
+ * - Hot-reload scenarios
84
+ *
85
+ * @param plugin - The preset plugin to register
86
+ * @throws Error if plugin is invalid (missing key or resolve function)
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * registry.register({
91
+ * key: 'LAST_BUSINESS_WEEK',
92
+ * resolve: (clock, adapter) => {
93
+ * const now = clock.now();
94
+ * const dayOfWeek = adapter.getDayOfWeek(now);
95
+ *
96
+ * // Go back to last Friday
97
+ * const daysToLastFriday = dayOfWeek === 0 ? 2 : (dayOfWeek + 2) % 7;
98
+ * const lastFriday = adapter.addDays(now, -daysToLastFriday);
99
+ *
100
+ * // Business week: Monday to Friday
101
+ * const monday = adapter.addDays(lastFriday, -4);
102
+ *
103
+ * return { start: monday, end: lastFriday };
104
+ * }
105
+ * });
106
+ * ```
107
+ */
108
+ register(plugin) {
109
+ // Validate plugin
110
+ if (!isRangePresetPlugin(plugin)) {
111
+ throw new Error(`Invalid preset plugin: must have 'key' (string) and 'resolve' (function). ` +
112
+ `Received: ${JSON.stringify(plugin)}`);
113
+ }
114
+ // Validate key is not empty
115
+ if (!plugin.key || plugin.key.trim().length === 0) {
116
+ throw new Error('Preset plugin key cannot be empty');
117
+ }
118
+ // Register (override if exists)
119
+ const key = plugin.key.toUpperCase(); // Normalize to uppercase
120
+ // Warn if overriding
121
+ if (this.presets.has(key)) {
122
+ console.warn(`[PresetRegistry] Overriding existing preset: "${key}". ` +
123
+ `This is normal if you're customizing built-in presets.`);
124
+ }
125
+ this.presets.set(key, plugin);
126
+ }
127
+ /**
128
+ * Register multiple preset plugins at once
129
+ *
130
+ * Convenience method for bulk registration.
131
+ * Useful when importing preset packages.
132
+ *
133
+ * @param plugins - Array of preset plugins to register
134
+ *
135
+ * @example
136
+ * ```typescript
137
+ * import { FISCAL_PRESETS } from '@acme/fiscal-presets';
138
+ *
139
+ * registry.registerAll(FISCAL_PRESETS);
140
+ * ```
141
+ */
142
+ registerAll(plugins) {
143
+ plugins.forEach(plugin => this.register(plugin));
144
+ }
145
+ /**
146
+ * Get a preset plugin by key
147
+ *
148
+ * @param key - Preset key (case-insensitive, e.g., 'today' or 'TODAY')
149
+ * @returns The preset plugin or undefined if not found
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const preset = registry.get('LAST_7_DAYS');
154
+ * if (preset) {
155
+ * const range = preset.resolve(clock, adapter);
156
+ * console.log('Range:', range);
157
+ * }
158
+ * ```
159
+ */
160
+ get(key) {
161
+ return this.presets.get(key.toUpperCase());
162
+ }
163
+ /**
164
+ * Check if a preset exists in the registry
165
+ *
166
+ * @param key - Preset key (case-insensitive)
167
+ * @returns true if preset exists, false otherwise
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * if (registry.has('THIS_FISCAL_QUARTER')) {
172
+ * store.applyPreset('THIS_FISCAL_QUARTER');
173
+ * } else {
174
+ * console.error('Fiscal quarter preset not registered');
175
+ * }
176
+ * ```
177
+ */
178
+ has(key) {
179
+ return this.presets.has(key.toUpperCase());
180
+ }
181
+ /**
182
+ * Get all registered preset plugins
183
+ *
184
+ * Returns a NEW array (immutable) to prevent external modification.
185
+ *
186
+ * @returns Array of all registered preset plugins
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * const allPresets = registry.getAll();
191
+ * console.log('Available presets:');
192
+ * allPresets.forEach(preset => {
193
+ * console.log(`- ${preset.key}`);
194
+ * });
195
+ * ```
196
+ */
197
+ getAll() {
198
+ return Array.from(this.presets.values());
199
+ }
200
+ /**
201
+ * Get all preset keys
202
+ *
203
+ * Convenience method to list available preset identifiers.
204
+ *
205
+ * @returns Array of preset keys (uppercase)
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * const keys = registry.getAllKeys();
210
+ * // ['TODAY', 'YESTERDAY', 'LAST_7_DAYS', 'THIS_MONTH', ...]
211
+ * ```
212
+ */
213
+ getAllKeys() {
214
+ return Array.from(this.presets.keys());
215
+ }
216
+ /**
217
+ * Get count of registered presets
218
+ *
219
+ * @returns Number of registered presets
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * console.log(`${registry.count()} presets available`);
224
+ * ```
225
+ */
226
+ count() {
227
+ return this.presets.size;
228
+ }
229
+ /**
230
+ * Unregister a preset plugin
231
+ *
232
+ * Useful for:
233
+ * - Testing cleanup
234
+ * - Dynamic preset management
235
+ * - Removing deprecated presets
236
+ *
237
+ * @param key - Preset key to remove (case-insensitive)
238
+ * @returns true if preset was removed, false if it didn't exist
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * registry.unregister('MY_TEMPORARY_PRESET');
243
+ * ```
244
+ */
245
+ unregister(key) {
246
+ return this.presets.delete(key.toUpperCase());
247
+ }
248
+ /**
249
+ * Clear all registered presets
250
+ *
251
+ * ⚠️ USE WITH CAUTION: This removes ALL presets including built-ins.
252
+ *
253
+ * Useful for:
254
+ * - Test teardown
255
+ * - Complete re-initialization scenarios
256
+ *
257
+ * @example
258
+ * ```typescript
259
+ * // In test cleanup
260
+ * afterEach(() => {
261
+ * registry.clear();
262
+ * });
263
+ * ```
264
+ */
265
+ clear() {
266
+ this.presets.clear();
267
+ }
268
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
269
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetRegistry, providedIn: 'root' });
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetRegistry, decorators: [{
272
+ type: Injectable,
273
+ args: [{
274
+ providedIn: 'root'
275
+ }]
276
+ }] });
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LXJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvcHJlc2V0LXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFERztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFxQixtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUvRTs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFDekI7Ozs7T0FJRztJQUNjLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztJQUVoRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQStCRztJQUNILFFBQVEsQ0FBQyxNQUF5QjtRQUNoQyxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYiw0RUFBNEU7Z0JBQzVFLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUN0QyxDQUFDO1FBQ0osQ0FBQztRQUVELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELGdDQUFnQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMseUJBQXlCO1FBRS9ELHFCQUFxQjtRQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxDQUFDLElBQUksQ0FDVixpREFBaUQsR0FBRyxLQUFLO2dCQUN6RCx3REFBd0QsQ0FDekQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsV0FBVyxDQUFDLE9BQTRCO1FBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsR0FBRyxDQUFDLEdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILEdBQUcsQ0FBQyxHQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsTUFBTTtRQUNKLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILFVBQVU7UUFDUixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7T0FnQkc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO3dHQXZOVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJlc2V0IFJlZ2lzdHJ5IFNlcnZpY2VcbiAqIFxuICogVmVyc2lvbjogMy42LjBcbiAqIFxuICogQ2VudHJhbCByZWdpc3RyeSBmb3IgYWxsIGRhdGUgcmFuZ2UgcHJlc2V0IHBsdWdpbnMgKGJ1aWx0LWluIGFuZCBjdXN0b20pLlxuICogXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiAtIFNpbmdsZXRvbiBzZXJ2aWNlIChwcm92aWRlZEluOiAncm9vdCcpXG4gKiAtIE1hbmFnZXMgTWFwPHN0cmluZywgUmFuZ2VQcmVzZXRQbHVnaW4+XG4gKiAtIFRocmVhZC1zYWZlIHJlZ2lzdHJhdGlvblxuICogLSBTdXBwb3J0cyBwbHVnaW4gb3ZlcnJpZGUgKHVzZWZ1bCBmb3IgdGVzdGluZylcbiAqIFxuICogVVNBR0U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBhcHBcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gaW5qZWN0KFByZXNldFJlZ2lzdHJ5KTtcbiAqIFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldFxuICogcmVnaXN0cnkucmVnaXN0ZXIoe1xuICogICBrZXk6ICdNWV9DVVNUT01fUFJFU0VUJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vdywgZW5kOiBub3cgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIENoZWNrIGlmIHByZXNldCBleGlzdHNcbiAqIGlmIChyZWdpc3RyeS5oYXMoJ01ZX0NVU1RPTV9QUkVTRVQnKSkge1xuICogICBzdG9yZS5hcHBseVByZXNldCgnTVlfQ1VTVE9NX1BSRVNFVCcpO1xuICogfVxuICogXG4gKiAvLyBHZXQgYWxsIHJlZ2lzdGVyZWQgcHJlc2V0c1xuICogY29uc3QgYWxsUHJlc2V0cyA9IHJlZ2lzdHJ5LmdldEFsbCgpO1xuICogY29uc29sZS5sb2coJ0F2YWlsYWJsZSBwcmVzZXRzOicsIGFsbFByZXNldHMubWFwKHAgPT4gcC5rZXkpKTtcbiAqIGBgYFxuICogXG4gKiBFWFRFUk5BTCBQQUNLQUdFUzpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEBhY21lL2Zpc2NhbC1wcmVzZXRzXG4gKiBleHBvcnQgZnVuY3Rpb24gcHJvdmlkZUZpc2NhbFByZXNldHMoKSB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICogICAgIG11bHRpOiB0cnVlLFxuICogICAgIHVzZUZhY3Rvcnk6IChyZWdpc3RyeTogUHJlc2V0UmVnaXN0cnkpID0+IHtcbiAqICAgICAgIHJldHVybiAoKSA9PiB7XG4gKiAgICAgICAgIEZJU0NBTF9QUkVTRVRTLmZvckVhY2gocCA9PiByZWdpc3RyeS5yZWdpc3RlcihwKSk7XG4gKiAgICAgICB9O1xuICogICAgIH0sXG4gKiAgICAgZGVwczogW1ByZXNldFJlZ2lzdHJ5XVxuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmFuZ2VQcmVzZXRQbHVnaW4sIGlzUmFuZ2VQcmVzZXRQbHVnaW4gfSBmcm9tICcuL3JhbmdlLXByZXNldC5wbHVnaW4nO1xuXG4vKipcbiAqIFByZXNldCBSZWdpc3RyeSBTZXJ2aWNlXG4gKiBcbiAqIE1hbmFnZXMgcmVnaXN0cmF0aW9uIGFuZCByZXRyaWV2YWwgb2YgZGF0ZSByYW5nZSBwcmVzZXQgcGx1Z2lucy5cbiAqIFxuICogREVTSUdOOlxuICogLSBVc2VzIE1hcCBmb3IgTygxKSBsb29rdXBzXG4gKiAtIEltbXV0YWJsZSBnZXRBbGwoKSByZXR1cm5zIGNvcHlcbiAqIC0gU3VwcG9ydHMgcGx1Z2luIG92ZXJyaWRlIChsYXN0IHJlZ2lzdHJhdGlvbiB3aW5zKVxuICogLSBWYWxpZGF0ZXMgcGx1Z2lucyBiZWZvcmUgcmVnaXN0cmF0aW9uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByZXNldFJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEludGVybmFsIG1hcCBvZiByZWdpc3RlcmVkIHByZXNldHNcbiAgICogS2V5OiBwcmVzZXQga2V5IChlLmcuLCAnVE9EQVknLCAnTEFTVF83X0RBWVMnKVxuICAgKiBWYWx1ZTogUmFuZ2VQcmVzZXRQbHVnaW4gaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlc2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBSYW5nZVByZXNldFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBkYXRlIHJhbmdlIHByZXNldCBwbHVnaW5cbiAgICogXG4gICAqIElmIGEgcHJlc2V0IHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4uXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvcjpcbiAgICogLSBUZXN0aW5nIChvdmVycmlkZSBidWlsdC1pbiBwcmVzZXRzIHdpdGggbW9ja3MpXG4gICAqIC0gQ3VzdG9taXphdGlvbiAocmVwbGFjZSBkZWZhdWx0IGJlaGF2aW9yKVxuICAgKiAtIEhvdC1yZWxvYWQgc2NlbmFyaW9zXG4gICAqIFxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHByZXNldCBwbHVnaW4gdG8gcmVnaXN0ZXJcbiAgICogQHRocm93cyBFcnJvciBpZiBwbHVnaW4gaXMgaW52YWxpZCAobWlzc2luZyBrZXkgb3IgcmVzb2x2ZSBmdW5jdGlvbilcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogcmVnaXN0cnkucmVnaXN0ZXIoe1xuICAgKiAgIGtleTogJ0xBU1RfQlVTSU5FU1NfV0VFSycsXG4gICAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gICAqICAgICBjb25zdCBub3cgPSBjbG9jay5ub3coKTtcbiAgICogICAgIGNvbnN0IGRheU9mV2VlayA9IGFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKG5vdyk7XG4gICAqICAgICBcbiAgICogICAgIC8vIEdvIGJhY2sgdG8gbGFzdCBGcmlkYXlcbiAgICogICAgIGNvbnN0IGRheXNUb0xhc3RGcmlkYXkgPSBkYXlPZldlZWsgPT09IDAgPyAyIDogKGRheU9mV2VlayArIDIpICUgNztcbiAgICogICAgIGNvbnN0IGxhc3RGcmlkYXkgPSBhZGFwdGVyLmFkZERheXMobm93LCAtZGF5c1RvTGFzdEZyaWRheSk7XG4gICAqICAgICBcbiAgICogICAgIC8vIEJ1c2luZXNzIHdlZWs6IE1vbmRheSB0byBGcmlkYXlcbiAgICogICAgIGNvbnN0IG1vbmRheSA9IGFkYXB0ZXIuYWRkRGF5cyhsYXN0RnJpZGF5LCAtNCk7XG4gICAqICAgICBcbiAgICogICAgIHJldHVybiB7IHN0YXJ0OiBtb25kYXksIGVuZDogbGFzdEZyaWRheSB9O1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXIocGx1Z2luOiBSYW5nZVByZXNldFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFZhbGlkYXRlIHBsdWdpblxuICAgIGlmICghaXNSYW5nZVByZXNldFBsdWdpbihwbHVnaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHByZXNldCBwbHVnaW46IG11c3QgaGF2ZSAna2V5JyAoc3RyaW5nKSBhbmQgJ3Jlc29sdmUnIChmdW5jdGlvbikuIGAgK1xuICAgICAgICBgUmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkocGx1Z2luKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGtleSBpcyBub3QgZW1wdHlcbiAgICBpZiAoIXBsdWdpbi5rZXkgfHwgcGx1Z2luLmtleS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ByZXNldCBwbHVnaW4ga2V5IGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIC8vIFJlZ2lzdGVyIChvdmVycmlkZSBpZiBleGlzdHMpXG4gICAgY29uc3Qga2V5ID0gcGx1Z2luLmtleS50b1VwcGVyQ2FzZSgpOyAvLyBOb3JtYWxpemUgdG8gdXBwZXJjYXNlXG4gICAgXG4gICAgLy8gV2FybiBpZiBvdmVycmlkaW5nXG4gICAgaWYgKHRoaXMucHJlc2V0cy5oYXMoa2V5KSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1ByZXNldFJlZ2lzdHJ5XSBPdmVycmlkaW5nIGV4aXN0aW5nIHByZXNldDogXCIke2tleX1cIi4gYCArXG4gICAgICAgIGBUaGlzIGlzIG5vcm1hbCBpZiB5b3UncmUgY3VzdG9taXppbmcgYnVpbHQtaW4gcHJlc2V0cy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2V0cy5zZXQoa2V5LCBwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIG11bHRpcGxlIHByZXNldCBwbHVnaW5zIGF0IG9uY2VcbiAgICogXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgYnVsayByZWdpc3RyYXRpb24uXG4gICAqIFVzZWZ1bCB3aGVuIGltcG9ydGluZyBwcmVzZXQgcGFja2FnZXMuXG4gICAqIFxuICAgKiBAcGFyYW0gcGx1Z2lucyAtIEFycmF5IG9mIHByZXNldCBwbHVnaW5zIHRvIHJlZ2lzdGVyXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IEZJU0NBTF9QUkVTRVRTIH0gZnJvbSAnQGFjbWUvZmlzY2FsLXByZXNldHMnO1xuICAgKiBcbiAgICogcmVnaXN0cnkucmVnaXN0ZXJBbGwoRklTQ0FMX1BSRVNFVFMpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlZ2lzdGVyQWxsKHBsdWdpbnM6IFJhbmdlUHJlc2V0UGx1Z2luW10pOiB2b2lkIHtcbiAgICBwbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHRoaXMucmVnaXN0ZXIocGx1Z2luKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcHJlc2V0IHBsdWdpbiBieSBrZXlcbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcmVzZXQga2V5IChjYXNlLWluc2Vuc2l0aXZlLCBlLmcuLCAndG9kYXknIG9yICdUT0RBWScpXG4gICAqIEByZXR1cm5zIFRoZSBwcmVzZXQgcGx1Z2luIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcHJlc2V0ID0gcmVnaXN0cnkuZ2V0KCdMQVNUXzdfREFZUycpO1xuICAgKiBpZiAocHJlc2V0KSB7XG4gICAqICAgY29uc3QgcmFuZ2UgPSBwcmVzZXQucmVzb2x2ZShjbG9jaywgYWRhcHRlcik7XG4gICAqICAgY29uc29sZS5sb2coJ1JhbmdlOicsIHJhbmdlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IFJhbmdlUHJlc2V0UGx1Z2luIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZXRzLmdldChrZXkudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwcmVzZXQgZXhpc3RzIGluIHRoZSByZWdpc3RyeVxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByZXNldCBrZXkgKGNhc2UtaW5zZW5zaXRpdmUpXG4gICAqIEByZXR1cm5zIHRydWUgaWYgcHJlc2V0IGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChyZWdpc3RyeS5oYXMoJ1RISVNfRklTQ0FMX1FVQVJURVInKSkge1xuICAgKiAgIHN0b3JlLmFwcGx5UHJlc2V0KCdUSElTX0ZJU0NBTF9RVUFSVEVSJyk7XG4gICAqIH0gZWxzZSB7XG4gICAqICAgY29uc29sZS5lcnJvcignRmlzY2FsIHF1YXJ0ZXIgcHJlc2V0IG5vdCByZWdpc3RlcmVkJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcmVzZXRzLmhhcyhrZXkudG9VcHBlckNhc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIHByZXNldCBwbHVnaW5zXG4gICAqIFxuICAgKiBSZXR1cm5zIGEgTkVXIGFycmF5IChpbW11dGFibGUpIHRvIHByZXZlbnQgZXh0ZXJuYWwgbW9kaWZpY2F0aW9uLlxuICAgKiBcbiAgICogQHJldHVybnMgQXJyYXkgb2YgYWxsIHJlZ2lzdGVyZWQgcHJlc2V0IHBsdWdpbnNcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYWxsUHJlc2V0cyA9IHJlZ2lzdHJ5LmdldEFsbCgpO1xuICAgKiBjb25zb2xlLmxvZygnQXZhaWxhYmxlIHByZXNldHM6Jyk7XG4gICAqIGFsbFByZXNldHMuZm9yRWFjaChwcmVzZXQgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKGAtICR7cHJlc2V0LmtleX1gKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0QWxsKCk6IFJhbmdlUHJlc2V0UGx1Z2luW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMucHJlc2V0cy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwcmVzZXQga2V5c1xuICAgKiBcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGxpc3QgYXZhaWxhYmxlIHByZXNldCBpZGVudGlmaWVycy5cbiAgICogXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHByZXNldCBrZXlzICh1cHBlcmNhc2UpXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGtleXMgPSByZWdpc3RyeS5nZXRBbGxLZXlzKCk7XG4gICAqIC8vIFsnVE9EQVknLCAnWUVTVEVSREFZJywgJ0xBU1RfN19EQVlTJywgJ1RISVNfTU9OVEgnLCAuLi5dXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0QWxsS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5wcmVzZXRzLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvdW50IG9mIHJlZ2lzdGVyZWQgcHJlc2V0c1xuICAgKiBcbiAgICogQHJldHVybnMgTnVtYmVyIG9mIHJlZ2lzdGVyZWQgcHJlc2V0c1xuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zb2xlLmxvZyhgJHtyZWdpc3RyeS5jb3VudCgpfSBwcmVzZXRzIGF2YWlsYWJsZWApO1xuICAgKiBgYGBcbiAgICovXG4gIGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJlc2V0cy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgYSBwcmVzZXQgcGx1Z2luXG4gICAqIFxuICAgKiBVc2VmdWwgZm9yOlxuICAgKiAtIFRlc3RpbmcgY2xlYW51cFxuICAgKiAtIER5bmFtaWMgcHJlc2V0IG1hbmFnZW1lbnRcbiAgICogLSBSZW1vdmluZyBkZXByZWNhdGVkIHByZXNldHNcbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcmVzZXQga2V5IHRvIHJlbW92ZSAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBwcmVzZXQgd2FzIHJlbW92ZWQsIGZhbHNlIGlmIGl0IGRpZG4ndCBleGlzdFxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS51bnJlZ2lzdGVyKCdNWV9URU1QT1JBUllfUFJFU0VUJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdW5yZWdpc3RlcihrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByZXNldHMuZGVsZXRlKGtleS50b1VwcGVyQ2FzZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcmVnaXN0ZXJlZCBwcmVzZXRzXG4gICAqIFxuICAgKiDimqDvuI8gVVNFIFdJVEggQ0FVVElPTjogVGhpcyByZW1vdmVzIEFMTCBwcmVzZXRzIGluY2x1ZGluZyBidWlsdC1pbnMuXG4gICAqIFxuICAgKiBVc2VmdWwgZm9yOlxuICAgKiAtIFRlc3QgdGVhcmRvd25cbiAgICogLSBDb21wbGV0ZSByZS1pbml0aWFsaXphdGlvbiBzY2VuYXJpb3NcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gSW4gdGVzdCBjbGVhbnVwXG4gICAqIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAqICAgcmVnaXN0cnkuY2xlYXIoKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5wcmVzZXRzLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==