@oneluiz/dual-datepicker 3.9.3 → 4.0.1

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 (65) hide show
  1. package/README.md +26 -2
  2. package/fesm2022/oneluiz-dual-datepicker.mjs +696 -1040
  3. package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
  4. package/package.json +16 -8
  5. package/core/built-in-presets.d.ts +0 -98
  6. package/core/calendar-grid/cache.config.d.ts +0 -34
  7. package/core/calendar-grid/calendar-grid.cache.d.ts +0 -39
  8. package/core/calendar-grid/calendar-grid.factory.d.ts +0 -26
  9. package/core/calendar-grid/calendar-grid.types.d.ts +0 -57
  10. package/core/calendar-grid/index.d.ts +0 -56
  11. package/core/calendar-grid/range-highlighter.cache.d.ts +0 -106
  12. package/core/calendar-grid/range-highlighter.d.ts +0 -85
  13. package/core/calendar-grid/range-highlighter.types.d.ts +0 -182
  14. package/core/calendar-grid/virtual-weeks.logic.d.ts +0 -116
  15. package/core/calendar-grid/virtual-weeks.types.d.ts +0 -71
  16. package/core/date-adapter.d.ts +0 -298
  17. package/core/date-clock.d.ts +0 -82
  18. package/core/dual-date-range.store.d.ts +0 -113
  19. package/core/index.d.ts +0 -33
  20. package/core/native-date-adapter.d.ts +0 -152
  21. package/core/preset-providers.d.ts +0 -176
  22. package/core/preset-registry.d.ts +0 -181
  23. package/core/preset.engine.d.ts +0 -124
  24. package/core/range-preset.plugin.d.ts +0 -188
  25. package/core/range.validator.d.ts +0 -37
  26. package/core/system-clock.d.ts +0 -13
  27. package/date-adapter.d.ts +0 -116
  28. package/dual-datepicker.component.d.ts +0 -243
  29. package/esm2022/core/built-in-presets.mjs +0 -289
  30. package/esm2022/core/calendar-grid/cache.config.mjs +0 -35
  31. package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +0 -98
  32. package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +0 -97
  33. package/esm2022/core/calendar-grid/calendar-grid.types.mjs +0 -8
  34. package/esm2022/core/calendar-grid/index.mjs +0 -57
  35. package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +0 -200
  36. package/esm2022/core/calendar-grid/range-highlighter.mjs +0 -185
  37. package/esm2022/core/calendar-grid/range-highlighter.types.mjs +0 -11
  38. package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +0 -149
  39. package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +0 -11
  40. package/esm2022/core/date-adapter.mjs +0 -77
  41. package/esm2022/core/date-clock.mjs +0 -65
  42. package/esm2022/core/dual-date-range.store.mjs +0 -329
  43. package/esm2022/core/index.mjs +0 -37
  44. package/esm2022/core/native-date-adapter.mjs +0 -286
  45. package/esm2022/core/preset-providers.mjs +0 -243
  46. package/esm2022/core/preset-registry.mjs +0 -277
  47. package/esm2022/core/preset.engine.mjs +0 -179
  48. package/esm2022/core/range-preset.plugin.mjs +0 -70
  49. package/esm2022/core/range.validator.mjs +0 -105
  50. package/esm2022/core/system-clock.mjs +0 -34
  51. package/esm2022/date-adapter.mjs +0 -12
  52. package/esm2022/dual-datepicker.component.mjs +0 -1312
  53. package/esm2022/native-date-adapter.mjs +0 -117
  54. package/esm2022/oneluiz-dual-datepicker.mjs +0 -5
  55. package/esm2022/preset-utils.mjs +0 -276
  56. package/esm2022/public-api.mjs +0 -13
  57. package/index.d.ts +0 -5
  58. package/native-date-adapter.d.ts +0 -26
  59. package/preset-utils.d.ts +0 -91
  60. package/public-api.d.ts +0 -9
  61. package/src/themes/bootstrap.scss +0 -202
  62. package/src/themes/bulma.scss +0 -209
  63. package/src/themes/custom.scss +0 -236
  64. package/src/themes/foundation.scss +0 -201
  65. package/src/themes/tailwind.scss +0 -109
@@ -1,277 +0,0 @@
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==
@@ -1,179 +0,0 @@
1
- /**
2
- * Headless Preset Engine
3
- * Pure functions that resolve date ranges WITHOUT render dependency
4
- * Perfect for SSR, global state, dashboard filters
5
- *
6
- * v3.5.0: SSR-Safe via Clock Injection
7
- * All date calculations use DateClock instead of new Date()
8
- * This ensures server and client resolve identical presets
9
- *
10
- * v3.5.1: Timezone-Safe via DateAdapter
11
- * All date operations use DateAdapter for consistent behavior
12
- * Fixes timezone bugs common in ERP/BI/POS systems
13
- *
14
- * v3.6.0: Plugin-Driven Architecture
15
- * Preset Engine now uses PresetRegistry for plugin-based extensibility
16
- * Follows Open/Closed Principle - extend without modifying core
17
- * Supports external preset packages for industry-specific needs
18
- */
19
- import { Injectable, inject } from '@angular/core';
20
- import { DATE_CLOCK } from './date-clock';
21
- import { SystemClock } from './system-clock';
22
- import { DATE_ADAPTER } from './date-adapter';
23
- import { NativeDateAdapter } from './native-date-adapter';
24
- import { PresetRegistry } from './preset-registry';
25
- import * as i0 from "@angular/core";
26
- /**
27
- * Preset Engine - Plugin-Driven Architecture
28
- *
29
- * ARCHITECTURE (v3.6.0):
30
- * - NO longer contains presets internally
31
- * - Uses PresetRegistry for plugin management
32
- * - Injects DateClock for SSR-safe time
33
- * - Injects DateAdapter for timezone-safe operations
34
- * - Follows Open/Closed Principle
35
- *
36
- * BACKWARD COMPATIBILITY:
37
- * - Old API unchanged: resolve(), register(), getPresetKeys()
38
- * - Built-in presets auto-registered via provider
39
- * - Existing code continues to work
40
- *
41
- * EXTENSIBILITY:
42
- * ```typescript
43
- * // Register custom preset via registry
44
- * const registry = inject(PresetRegistry);
45
- * registry.register({
46
- * key: 'MY_PRESET',
47
- * resolve: (clock, adapter) => {
48
- * const now = clock.now();
49
- * return { start: now, end: now };
50
- * }
51
- * });
52
- *
53
- * // Use via engine
54
- * const engine = inject(PresetEngine);
55
- * const range = engine.resolve('MY_PRESET');
56
- * ```
57
- */
58
- export class PresetEngine {
59
- clock;
60
- adapter;
61
- registry;
62
- constructor() {
63
- // Inject dependencies with fallbacks
64
- try {
65
- this.clock = inject(DATE_CLOCK, { optional: true }) ?? new SystemClock();
66
- this.adapter = inject(DATE_ADAPTER, { optional: true }) ?? new NativeDateAdapter();
67
- this.registry = inject(PresetRegistry);
68
- }
69
- catch {
70
- // Fallback if inject() fails outside injection context
71
- this.clock = new SystemClock();
72
- this.adapter = new NativeDateAdapter();
73
- this.registry = new PresetRegistry();
74
- }
75
- }
76
- /**
77
- * Register a custom preset
78
- *
79
- * @deprecated Use PresetRegistry.register() directly for new code
80
- * Kept for backward compatibility
81
- *
82
- * @param key - Preset key (e.g., 'MY_CUSTOM_PRESET')
83
- * @param preset - Legacy RangePreset object
84
- */
85
- register(key, preset) {
86
- // Convert legacy RangePreset to RangePresetPlugin
87
- this.registry.register({
88
- key: key,
89
- resolve: (clock, adapter) => {
90
- const now = clock.now();
91
- return preset.resolve(now);
92
- }
93
- });
94
- }
95
- /**
96
- * Resolve a preset to date range
97
- *
98
- * Plugin Architecture:
99
- * 1. Looks up plugin in PresetRegistry
100
- * 2. Calls plugin.resolve(clock, adapter)
101
- * 3. Returns ISO date range
102
- *
103
- * SSR Note: Uses injected DateClock for deterministic resolution
104
- * Timezone Note: Uses injected DateAdapter for consistent operations
105
- *
106
- * @param key - Preset key (e.g., 'TODAY', 'LAST_7_DAYS')
107
- * @param now - Optional override for current date (defaults to clock.now())
108
- * @returns ISO date range or null if preset not found
109
- */
110
- resolve(key, now) {
111
- const plugin = this.registry.get(key);
112
- if (!plugin) {
113
- console.warn(`[PresetEngine] Preset "${key}" not found in registry`);
114
- return null;
115
- }
116
- // Create temporary clock if now is provided
117
- const effectiveClock = now
118
- ? { now: () => now }
119
- : this.clock;
120
- // Resolve via plugin
121
- const { start, end } = plugin.resolve(effectiveClock, this.adapter);
122
- // Convert to ISO format
123
- return {
124
- start: this.adapter.toISODate(start),
125
- end: this.adapter.toISODate(end)
126
- };
127
- }
128
- /**
129
- * Get all available preset keys
130
- *
131
- * Delegates to PresetRegistry
132
- *
133
- * @returns Array of registered preset keys
134
- */
135
- getPresetKeys() {
136
- return this.registry.getAllKeys();
137
- }
138
- /**
139
- * Check if a preset exists
140
- *
141
- * @param key - Preset key to check
142
- * @returns true if preset is registered
143
- */
144
- hasPreset(key) {
145
- return this.registry.has(key);
146
- }
147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
148
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, providedIn: 'root' });
149
- }
150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetEngine, decorators: [{
151
- type: Injectable,
152
- args: [{
153
- providedIn: 'root'
154
- }]
155
- }], ctorParameters: () => [] });
156
- /**
157
- * Create a custom preset from a function
158
- *
159
- * @deprecated Use RangePresetPlugin interface instead
160
- * Kept for backward compatibility
161
- */
162
- export function createPreset(resolver) {
163
- return { resolve: resolver };
164
- }
165
- /**
166
- * @deprecated Use dependency injection instead:
167
- * ```typescript
168
- * private engine = inject(PresetEngine);
169
- * ```
170
- *
171
- * Singleton preset engine instance for backward compatibility
172
- *
173
- * WARNING: This singleton uses SystemClock directly and is NOT SSR-safe.
174
- * For SSR applications, inject PresetEngine and override DATE_CLOCK token.
175
- *
176
- * This export will be removed in v4.0.0
177
- */
178
- export const presetEngine = new PresetEngine();
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFtQm5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDZixLQUFLLENBQVk7SUFDakIsT0FBTyxDQUFjO0lBQ3JCLFFBQVEsQ0FBaUI7SUFFakM7UUFDRSxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDbkYsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxRQUFRLENBQUMsR0FBVyxFQUFFLE1BQW1CO1FBQ3ZDLGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyQixHQUFHLEVBQUUsR0FBRztZQUNSLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILE9BQU8sQ0FBQyxHQUFXLEVBQUUsR0FBVTtRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLHlCQUF5QixDQUFDLENBQUM7WUFDckUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsNENBQTRDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLEdBQUc7WUFDeEIsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtZQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVmLHFCQUFxQjtRQUNyQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwRSx3QkFBd0I7UUFDeEIsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDcEMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsU0FBUyxDQUFDLEdBQVc7UUFDbkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO3dHQWhHVSxZQUFZOzRHQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUFvR0Q7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixRQUFtRDtJQUVuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVhZGxlc3MgUHJlc2V0IEVuZ2luZVxuICogUHVyZSBmdW5jdGlvbnMgdGhhdCByZXNvbHZlIGRhdGUgcmFuZ2VzIFdJVEhPVVQgcmVuZGVyIGRlcGVuZGVuY3lcbiAqIFBlcmZlY3QgZm9yIFNTUiwgZ2xvYmFsIHN0YXRlLCBkYXNoYm9hcmQgZmlsdGVyc1xuICogXG4gKiB2My41LjA6IFNTUi1TYWZlIHZpYSBDbG9jayBJbmplY3Rpb25cbiAqIEFsbCBkYXRlIGNhbGN1bGF0aW9ucyB1c2UgRGF0ZUNsb2NrIGluc3RlYWQgb2YgbmV3IERhdGUoKVxuICogVGhpcyBlbnN1cmVzIHNlcnZlciBhbmQgY2xpZW50IHJlc29sdmUgaWRlbnRpY2FsIHByZXNldHNcbiAqIFxuICogdjMuNS4xOiBUaW1lem9uZS1TYWZlIHZpYSBEYXRlQWRhcHRlclxuICogQWxsIGRhdGUgb3BlcmF0aW9ucyB1c2UgRGF0ZUFkYXB0ZXIgZm9yIGNvbnNpc3RlbnQgYmVoYXZpb3JcbiAqIEZpeGVzIHRpbWV6b25lIGJ1Z3MgY29tbW9uIGluIEVSUC9CSS9QT1Mgc3lzdGVtc1xuICogXG4gKiB2My42LjA6IFBsdWdpbi1Ecml2ZW4gQXJjaGl0ZWN0dXJlXG4gKiBQcmVzZXQgRW5naW5lIG5vdyB1c2VzIFByZXNldFJlZ2lzdHJ5IGZvciBwbHVnaW4tYmFzZWQgZXh0ZW5zaWJpbGl0eVxuICogRm9sbG93cyBPcGVuL0Nsb3NlZCBQcmluY2lwbGUgLSBleHRlbmQgd2l0aG91dCBtb2RpZnlpbmcgY29yZVxuICogU3VwcG9ydHMgZXh0ZXJuYWwgcHJlc2V0IHBhY2thZ2VzIGZvciBpbmR1c3RyeS1zcGVjaWZpYyBuZWVkc1xuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUNsb2NrLCBEQVRFX0NMT0NLIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIsIERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IE5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnLi9uYXRpdmUtZGF0ZS1hZGFwdGVyJztcbmltcG9ydCB7IFByZXNldFJlZ2lzdHJ5IH0gZnJvbSAnLi9wcmVzZXQtcmVnaXN0cnknO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBSYW5nZVByZXNldFBsdWdpbiBmcm9tICcuL3JhbmdlLXByZXNldC5wbHVnaW4nIGluc3RlYWRcbiAqIEtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldCB7XG4gIC8qKlxuICAgKiBSZXNvbHZlIHByZXNldCB0byBhY3R1YWwgZGF0ZSByYW5nZVxuICAgKiBAcGFyYW0gbm93IC0gQ3VycmVudCBkYXRlIGZvciBkZXRlcm1pbmlzdGljIGNhbGN1bGF0aW9uXG4gICAqL1xuICByZXNvbHZlKG5vdzogRGF0ZSk6IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldFJhbmdlIHtcbiAgc3RhcnQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxuICBlbmQ6IHN0cmluZzsgLy8gSVNPIGZvcm1hdFxufVxuXG4vKipcbiAqIFByZXNldCBFbmdpbmUgLSBQbHVnaW4tRHJpdmVuIEFyY2hpdGVjdHVyZVxuICogXG4gKiBBUkNISVRFQ1RVUkUgKHYzLjYuMCk6XG4gKiAtIE5PIGxvbmdlciBjb250YWlucyBwcmVzZXRzIGludGVybmFsbHlcbiAqIC0gVXNlcyBQcmVzZXRSZWdpc3RyeSBmb3IgcGx1Z2luIG1hbmFnZW1lbnRcbiAqIC0gSW5qZWN0cyBEYXRlQ2xvY2sgZm9yIFNTUi1zYWZlIHRpbWVcbiAqIC0gSW5qZWN0cyBEYXRlQWRhcHRlciBmb3IgdGltZXpvbmUtc2FmZSBvcGVyYXRpb25zXG4gKiAtIEZvbGxvd3MgT3Blbi9DbG9zZWQgUHJpbmNpcGxlXG4gKiBcbiAqIEJBQ0tXQVJEIENPTVBBVElCSUxJVFk6XG4gKiAtIE9sZCBBUEkgdW5jaGFuZ2VkOiByZXNvbHZlKCksIHJlZ2lzdGVyKCksIGdldFByZXNldEtleXMoKVxuICogLSBCdWlsdC1pbiBwcmVzZXRzIGF1dG8tcmVnaXN0ZXJlZCB2aWEgcHJvdmlkZXJcbiAqIC0gRXhpc3RpbmcgY29kZSBjb250aW51ZXMgdG8gd29ya1xuICogXG4gKiBFWFRFTlNJQklMSVRZOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldCB2aWEgcmVnaXN0cnlcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gaW5qZWN0KFByZXNldFJlZ2lzdHJ5KTtcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKHtcbiAqICAga2V5OiAnTVlfUFJFU0VUJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vdywgZW5kOiBub3cgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIFVzZSB2aWEgZW5naW5lXG4gKiBjb25zdCBlbmdpbmUgPSBpbmplY3QoUHJlc2V0RW5naW5lKTtcbiAqIGNvbnN0IHJhbmdlID0gZW5naW5lLnJlc29sdmUoJ01ZX1BSRVNFVCcpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFByZXNldEVuZ2luZSB7XG4gIHByaXZhdGUgY2xvY2s6IERhdGVDbG9jaztcbiAgcHJpdmF0ZSBhZGFwdGVyOiBEYXRlQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWdpc3RyeTogUHJlc2V0UmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5qZWN0IGRlcGVuZGVuY2llcyB3aXRoIGZhbGxiYWNrc1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNsb2NrID0gaW5qZWN0KERBVEVfQ0xPQ0ssIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBpbmplY3QoREFURV9BREFQVEVSLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IG5ldyBOYXRpdmVEYXRlQWRhcHRlcigpO1xuICAgICAgdGhpcy5yZWdpc3RyeSA9IGluamVjdChQcmVzZXRSZWdpc3RyeSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjayBpZiBpbmplY3QoKSBmYWlscyBvdXRzaWRlIGluamVjdGlvbiBjb250ZXh0XG4gICAgICB0aGlzLmNsb2NrID0gbmV3IFN5c3RlbUNsb2NrKCk7XG4gICAgICB0aGlzLmFkYXB0ZXIgPSBuZXcgTmF0aXZlRGF0ZUFkYXB0ZXIoKTtcbiAgICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgUHJlc2V0UmVnaXN0cnkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjdXN0b20gcHJlc2V0XG4gICAqIFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgUHJlc2V0UmVnaXN0cnkucmVnaXN0ZXIoKSBkaXJlY3RseSBmb3IgbmV3IGNvZGVcbiAgICogS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByZXNldCBrZXkgKGUuZy4sICdNWV9DVVNUT01fUFJFU0VUJylcbiAgICogQHBhcmFtIHByZXNldCAtIExlZ2FjeSBSYW5nZVByZXNldCBvYmplY3RcbiAgICovXG4gIHJlZ2lzdGVyKGtleTogc3RyaW5nLCBwcmVzZXQ6IFJhbmdlUHJlc2V0KTogdm9pZCB7XG4gICAgLy8gQ29udmVydCBsZWdhY3kgUmFuZ2VQcmVzZXQgdG8gUmFuZ2VQcmVzZXRQbHVnaW5cbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vdyA9IGNsb2NrLm5vdygpO1xuICAgICAgICByZXR1cm4gcHJlc2V0LnJlc29sdmUobm93KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcHJlc2V0IHRvIGRhdGUgcmFuZ2VcbiAgICogXG4gICAqIFBsdWdpbiBBcmNoaXRlY3R1cmU6XG4gICAqIDEuIExvb2tzIHVwIHBsdWdpbiBpbiBQcmVzZXRSZWdpc3RyeVxuICAgKiAyLiBDYWxscyBwbHVnaW4ucmVzb2x2ZShjbG9jaywgYWRhcHRlcilcbiAgICogMy4gUmV0dXJucyBJU08gZGF0ZSByYW5nZVxuICAgKiBcbiAgICogU1NSIE5vdGU6IFVzZXMgaW5qZWN0ZWQgRGF0ZUNsb2NrIGZvciBkZXRlcm1pbmlzdGljIHJlc29sdXRpb25cbiAgICogVGltZXpvbmUgTm90ZTogVXNlcyBpbmplY3RlZCBEYXRlQWRhcHRlciBmb3IgY29uc2lzdGVudCBvcGVyYXRpb25zXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJlc2V0IGtleSAoZS5nLiwgJ1RPREFZJywgJ0xBU1RfN19EQVlTJylcbiAgICogQHBhcmFtIG5vdyAtIE9wdGlvbmFsIG92ZXJyaWRlIGZvciBjdXJyZW50IGRhdGUgKGRlZmF1bHRzIHRvIGNsb2NrLm5vdygpKVxuICAgKiBAcmV0dXJucyBJU08gZGF0ZSByYW5nZSBvciBudWxsIGlmIHByZXNldCBub3QgZm91bmRcbiAgICovXG4gIHJlc29sdmUoa2V5OiBzdHJpbmcsIG5vdz86IERhdGUpOiBQcmVzZXRSYW5nZSB8IG51bGwge1xuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucmVnaXN0cnkuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1ByZXNldEVuZ2luZV0gUHJlc2V0IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHJlZ2lzdHJ5YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGVtcG9yYXJ5IGNsb2NrIGlmIG5vdyBpcyBwcm92aWRlZFxuICAgIGNvbnN0IGVmZmVjdGl2ZUNsb2NrID0gbm93IFxuICAgICAgPyB7IG5vdzogKCkgPT4gbm93IH0gXG4gICAgICA6IHRoaXMuY2xvY2s7XG5cbiAgICAvLyBSZXNvbHZlIHZpYSBwbHVnaW5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHBsdWdpbi5yZXNvbHZlKGVmZmVjdGl2ZUNsb2NrLCB0aGlzLmFkYXB0ZXIpO1xuXG4gICAgLy8gQ29udmVydCB0byBJU08gZm9ybWF0XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiB0aGlzLmFkYXB0ZXIudG9JU09EYXRlKHN0YXJ0KSxcbiAgICAgIGVuZDogdGhpcy5hZGFwdGVyLnRvSVNPRGF0ZShlbmQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGF2YWlsYWJsZSBwcmVzZXQga2V5c1xuICAgKiBcbiAgICogRGVsZWdhdGVzIHRvIFByZXNldFJlZ2lzdHJ5XG4gICAqIFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiByZWdpc3RlcmVkIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRBbGxLZXlzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwcmVzZXQgZXhpc3RzXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJlc2V0IGtleSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHByZXNldCBpcyByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNQcmVzZXQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXMoa2V5KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGN1c3RvbSBwcmVzZXQgZnJvbSBhIGZ1bmN0aW9uXG4gKiBcbiAqIEBkZXByZWNhdGVkIFVzZSBSYW5nZVByZXNldFBsdWdpbiBpbnRlcmZhY2UgaW5zdGVhZFxuICogS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJlc2V0KFxuICByZXNvbHZlcjogKG5vdzogRGF0ZSkgPT4geyBzdGFydDogRGF0ZTsgZW5kOiBEYXRlIH1cbik6IFJhbmdlUHJlc2V0IHtcbiAgcmV0dXJuIHsgcmVzb2x2ZTogcmVzb2x2ZXIgfTtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgZGVwZW5kZW5jeSBpbmplY3Rpb24gaW5zdGVhZDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgZW5naW5lID0gaW5qZWN0KFByZXNldEVuZ2luZSk7XG4gKiBgYGBcbiAqIFxuICogU2luZ2xldG9uIHByZXNldCBlbmdpbmUgaW5zdGFuY2UgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAqIFxuICogV0FSTklORzogVGhpcyBzaW5nbGV0b24gdXNlcyBTeXN0ZW1DbG9jayBkaXJlY3RseSBhbmQgaXMgTk9UIFNTUi1zYWZlLlxuICogRm9yIFNTUiBhcHBsaWNhdGlvbnMsIGluamVjdCBQcmVzZXRFbmdpbmUgYW5kIG92ZXJyaWRlIERBVEVfQ0xPQ0sgdG9rZW4uXG4gKiBcbiAqIFRoaXMgZXhwb3J0IHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wLjBcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXNldEVuZ2luZSA9IG5ldyBQcmVzZXRFbmdpbmUoKTtcbiJdfQ==
@@ -1,70 +0,0 @@
1
- /**
2
- * Range Preset Plugin System
3
- *
4
- * Version: 3.6.0
5
- *
6
- * Plugin-based architecture for date range presets following Open/Closed Principle.
7
- *
8
- * WHY THIS EXISTS:
9
- * - Enterprise apps need industry-specific presets (fiscal, hotel, logistics)
10
- * - Presets should be distributable as external packages
11
- * - Core should NOT know about all possible presets
12
- * - Users should extend presets without modifying library code
13
- *
14
- * ARCHITECTURE:
15
- * ```
16
- * RangePresetPlugin (interface) - Contract for all presets
17
- * ↓
18
- * PresetRegistry (service) - Manages plugin registration
19
- * ↓
20
- * PresetEngine (refactored) - Resolves presets via registry
21
- * ↓
22
- * DualDateRangeStore - No changes, backward compatible
23
- * ```
24
- *
25
- * USAGE:
26
- * ```typescript
27
- * // Built-in presets work automatically
28
- * store.applyPreset('LAST_7_DAYS'); // ✅ Works
29
- *
30
- * // Register custom preset
31
- * const registry = inject(PresetRegistry);
32
- * registry.register({
33
- * key: 'THIS_FISCAL_QUARTER',
34
- * resolve: (clock, adapter) => {
35
- * const now = clock.now();
36
- * const fiscalStart = adapter.startOfMonth(now);
37
- * const fiscalEnd = adapter.endOfMonth(now);
38
- * return { start: fiscalStart, end: fiscalEnd };
39
- * }
40
- * });
41
- *
42
- * // Use custom preset
43
- * store.applyPreset('THIS_FISCAL_QUARTER'); // ✅ Works
44
- * ```
45
- *
46
- * EXTERNAL PACKAGES:
47
- * ```typescript
48
- * // @acme/fiscal-presets package
49
- * export const FISCAL_PRESETS: RangePresetPlugin[] = [
50
- * { key: 'FISCAL_Q1', resolve: ... },
51
- * { key: 'FISCAL_Q2', resolve: ... }
52
- * ];
53
- *
54
- * // In app
55
- * FISCAL_PRESETS.forEach(p => registry.register(p));
56
- * ```
57
- */
58
- /**
59
- * Type guard to check if object is a valid RangePresetPlugin
60
- *
61
- * @param obj - Object to check
62
- * @returns true if object implements RangePresetPlugin interface
63
- */
64
- export function isRangePresetPlugin(obj) {
65
- return (obj &&
66
- typeof obj === 'object' &&
67
- typeof obj.key === 'string' &&
68
- typeof obj.resolve === 'function');
69
- }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtcHJlc2V0LnBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3JhbmdlLXByZXNldC5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0RHO0FBbUlIOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEdBQVE7SUFDMUMsT0FBTyxDQUNMLEdBQUc7UUFDSCxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLEdBQUcsS0FBSyxRQUFRO1FBQzNCLE9BQU8sR0FBRyxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQ2xDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYW5nZSBQcmVzZXQgUGx1Z2luIFN5c3RlbVxuICogXG4gKiBWZXJzaW9uOiAzLjYuMFxuICogXG4gKiBQbHVnaW4tYmFzZWQgYXJjaGl0ZWN0dXJlIGZvciBkYXRlIHJhbmdlIHByZXNldHMgZm9sbG93aW5nIE9wZW4vQ2xvc2VkIFByaW5jaXBsZS5cbiAqIFxuICogV0hZIFRISVMgRVhJU1RTOlxuICogLSBFbnRlcnByaXNlIGFwcHMgbmVlZCBpbmR1c3RyeS1zcGVjaWZpYyBwcmVzZXRzIChmaXNjYWwsIGhvdGVsLCBsb2dpc3RpY3MpXG4gKiAtIFByZXNldHMgc2hvdWxkIGJlIGRpc3RyaWJ1dGFibGUgYXMgZXh0ZXJuYWwgcGFja2FnZXNcbiAqIC0gQ29yZSBzaG91bGQgTk9UIGtub3cgYWJvdXQgYWxsIHBvc3NpYmxlIHByZXNldHNcbiAqIC0gVXNlcnMgc2hvdWxkIGV4dGVuZCBwcmVzZXRzIHdpdGhvdXQgbW9kaWZ5aW5nIGxpYnJhcnkgY29kZVxuICogXG4gKiBBUkNISVRFQ1RVUkU6XG4gKiBgYGBcbiAqIFJhbmdlUHJlc2V0UGx1Z2luIChpbnRlcmZhY2UpIC0gQ29udHJhY3QgZm9yIGFsbCBwcmVzZXRzXG4gKiAgICAg4oaTXG4gKiBQcmVzZXRSZWdpc3RyeSAoc2VydmljZSkgLSBNYW5hZ2VzIHBsdWdpbiByZWdpc3RyYXRpb25cbiAqICAgICDihpNcbiAqIFByZXNldEVuZ2luZSAocmVmYWN0b3JlZCkgLSBSZXNvbHZlcyBwcmVzZXRzIHZpYSByZWdpc3RyeVxuICogICAgIOKGk1xuICogRHVhbERhdGVSYW5nZVN0b3JlIC0gTm8gY2hhbmdlcywgYmFja3dhcmQgY29tcGF0aWJsZVxuICogYGBgXG4gKiBcbiAqIFVTQUdFOlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQnVpbHQtaW4gcHJlc2V0cyB3b3JrIGF1dG9tYXRpY2FsbHlcbiAqIHN0b3JlLmFwcGx5UHJlc2V0KCdMQVNUXzdfREFZUycpOyAvLyDinIUgV29ya3NcbiAqIFxuICogLy8gUmVnaXN0ZXIgY3VzdG9tIHByZXNldFxuICogY29uc3QgcmVnaXN0cnkgPSBpbmplY3QoUHJlc2V0UmVnaXN0cnkpO1xuICogcmVnaXN0cnkucmVnaXN0ZXIoe1xuICogICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3QgZmlzY2FsU3RhcnQgPSBhZGFwdGVyLnN0YXJ0T2ZNb250aChub3cpO1xuICogICAgIGNvbnN0IGZpc2NhbEVuZCA9IGFkYXB0ZXIuZW5kT2ZNb250aChub3cpO1xuICogICAgIHJldHVybiB7IHN0YXJ0OiBmaXNjYWxTdGFydCwgZW5kOiBmaXNjYWxFbmQgfTtcbiAqICAgfVxuICogfSk7XG4gKiBcbiAqIC8vIFVzZSBjdXN0b20gcHJlc2V0XG4gKiBzdG9yZS5hcHBseVByZXNldCgnVEhJU19GSVNDQUxfUVVBUlRFUicpOyAvLyDinIUgV29ya3NcbiAqIGBgYFxuICogXG4gKiBFWFRFUk5BTCBQQUNLQUdFUzpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEBhY21lL2Zpc2NhbC1wcmVzZXRzIHBhY2thZ2VcbiAqIGV4cG9ydCBjb25zdCBGSVNDQUxfUFJFU0VUUzogUmFuZ2VQcmVzZXRQbHVnaW5bXSA9IFtcbiAqICAgeyBrZXk6ICdGSVNDQUxfUTEnLCByZXNvbHZlOiAuLi4gfSxcbiAqICAgeyBrZXk6ICdGSVNDQUxfUTInLCByZXNvbHZlOiAuLi4gfVxuICogXTtcbiAqIFxuICogLy8gSW4gYXBwXG4gKiBGSVNDQUxfUFJFU0VUUy5mb3JFYWNoKHAgPT4gcmVnaXN0cnkucmVnaXN0ZXIocCkpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgRGF0ZUNsb2NrIH0gZnJvbSAnLi9kYXRlLWNsb2NrJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnLi9kYXRlLWFkYXB0ZXInO1xuXG4vKipcbiAqIERhdGUgcmFuZ2UgcmV0dXJuZWQgYnkgcHJlc2V0IHBsdWdpbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAvKipcbiAgICogU3RhcnQgZGF0ZSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSlcbiAgICovXG4gIHN0YXJ0OiBEYXRlO1xuXG4gIC8qKlxuICAgKiBFbmQgZGF0ZSBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSlcbiAgICovXG4gIGVuZDogRGF0ZTtcbn1cblxuLyoqXG4gKiBSYW5nZSBQcmVzZXQgUGx1Z2luIEludGVyZmFjZVxuICogXG4gKiBBbGwgZGF0ZSByYW5nZSBwcmVzZXRzIChidWlsdC1pbiBvciBleHRlcm5hbCkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLlxuICogXG4gKiBERVNJR04gUFJJTkNJUExFUzpcbiAqIC0gKipEZXRlcm1pbmlzdGljKio6IEdpdmVuIHRoZSBzYW1lIGNsb2NrLm5vdygpLCBhbHdheXMgcmV0dXJucyBzYW1lIHJhbmdlXG4gKiAtICoqVGltZXpvbmUtc2FmZSoqOiBVc2VzIERhdGVBZGFwdGVyIGZvciBhbGwgZGF0ZSBvcGVyYXRpb25zXG4gKiAtICoqU1NSLWNvbXBhdGlibGUqKjogVXNlcyBEYXRlQ2xvY2sgaW5qZWN0aW9uLCBubyBnbG9iYWwgRGF0ZSgpXG4gKiAtICoqVGVzdGFibGUqKjogUHVyZSBmdW5jdGlvbiwgbm8gc2lkZSBlZmZlY3RzXG4gKiBcbiAqIEVYQU1QTEUgLSBCdWlsdC1pbiBwcmVzZXQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0b2RheVByZXNldDogUmFuZ2VQcmVzZXRQbHVnaW4gPSB7XG4gKiAgIGtleTogJ1RPREFZJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGFkYXB0ZXIubm9ybWFsaXplKG5vdyk7XG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5vcm1hbGl6ZWQsIGVuZDogbm9ybWFsaXplZCB9O1xuICogICB9XG4gKiB9O1xuICogYGBgXG4gKiBcbiAqIEVYQU1QTEUgLSBDdXN0b20gZmlzY2FsIHByZXNldDpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZpc2NhbFF1YXJ0ZXJQcmVzZXQ6IFJhbmdlUHJlc2V0UGx1Z2luID0ge1xuICogICBrZXk6ICdUSElTX0ZJU0NBTF9RVUFSVEVSJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgY29uc3QgbW9udGggPSBhZGFwdGVyLmdldE1vbnRoKG5vdyk7IC8vIDAtMTFcbiAqICAgICBcbiAqICAgICAvLyBGaXNjYWwgeWVhciBzdGFydHMgaW4gQXByaWwgKG1vbnRoIDMpXG4gKiAgICAgY29uc3QgZmlzY2FsTW9udGggPSAobW9udGggKyA5KSAlIDEyOyAvLyBPZmZzZXQgdG8gZmlzY2FsIGNhbGVuZGFyXG4gKiAgICAgY29uc3QgcXVhcnRlclN0YXJ0TW9udGggPSBNYXRoLmZsb29yKGZpc2NhbE1vbnRoIC8gMykgKiAzO1xuICogICAgIGNvbnN0IGFkanVzdGVkTW9udGggPSAocXVhcnRlclN0YXJ0TW9udGggLSA5ICsgMTIpICUgMTI7XG4gKiAgICAgXG4gKiAgICAgY29uc3QgeWVhck9mZnNldCA9IG1vbnRoIDwgMyA/IC0xIDogMDtcbiAqICAgICBjb25zdCB5ZWFyID0gYWRhcHRlci5nZXRZZWFyKG5vdykgKyB5ZWFyT2Zmc2V0O1xuICogICAgIFxuICogICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciwgYWRqdXN0ZWRNb250aCwgMSk7XG4gKiAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoeWVhciwgYWRqdXN0ZWRNb250aCArIDMsIDApO1xuICogICAgIFxuICogICAgIHJldHVybiB7XG4gKiAgICAgICBzdGFydDogYWRhcHRlci5ub3JtYWxpemUoc3RhcnQpLFxuICogICAgICAgZW5kOiBhZGFwdGVyLm5vcm1hbGl6ZShlbmQpXG4gKiAgICAgfTtcbiAqICAgfVxuICogfTtcbiAqIGBgYFxuICogXG4gKiBFWEFNUExFIC0gSG90ZWwgaW5kdXN0cnkgcHJlc2V0OlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2hlY2tJbldlZWtQcmVzZXQ6IFJhbmdlUHJlc2V0UGx1Z2luID0ge1xuICogICBrZXk6ICdDSEVDS19JTl9XRUVLJyxcbiAqICAgcmVzb2x2ZTogKGNsb2NrLCBhZGFwdGVyKSA9PiB7XG4gKiAgICAgY29uc3Qgbm93ID0gY2xvY2subm93KCk7XG4gKiAgICAgLy8gSG90ZWwgY2hlY2staW5zIGFyZSBGcmlkYXkgdG8gRnJpZGF5XG4gKiAgICAgY29uc3QgZGF5T2ZXZWVrID0gYWRhcHRlci5nZXREYXlPZldlZWsobm93KTtcbiAqICAgICBjb25zdCBkYXlzVG9GcmlkYXkgPSBkYXlPZldlZWsgPD0gNSA/IDUgLSBkYXlPZldlZWsgOiA3IC0gZGF5T2ZXZWVrICsgNTtcbiAqICAgICBcbiAqICAgICBjb25zdCBuZXh0RnJpZGF5ID0gYWRhcHRlci5hZGREYXlzKG5vdywgZGF5c1RvRnJpZGF5KTtcbiAqICAgICBjb25zdCBmb2xsb3dpbmdGcmlkYXkgPSBhZGFwdGVyLmFkZERheXMobmV4dEZyaWRheSwgNyk7XG4gKiAgICAgXG4gKiAgICAgcmV0dXJuIHsgc3RhcnQ6IG5leHRGcmlkYXksIGVuZDogZm9sbG93aW5nRnJpZGF5IH07XG4gKiAgIH1cbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVByZXNldFBsdWdpbiB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHByZXNldFxuICAgKiBcbiAgICogQ29udmVudGlvbjogU0NSRUFNSU5HX1NOQUtFX0NBU0VcbiAgICogXG4gICAqIEV4YW1wbGVzOlxuICAgKiAtIEJ1aWx0LWluOiAnVE9EQVknLCAnTEFTVF83X0RBWVMnLCAnVEhJU19NT05USCdcbiAgICogLSBGaXNjYWw6ICdGSVNDQUxfUTEnLCAnRklTQ0FMX1lFQVJfVE9fREFURSdcbiAgICogLSBIb3RlbDogJ0NIRUNLX0lOX1dFRUsnLCAnTkVYVF8zMF9OSUdIVFMnXG4gICAqIC0gTG9naXN0aWNzOiAnU0hJUFBJTkdfV0VFSycsICdERUxJVkVSWV9XSU5ET1cnXG4gICAqL1xuICBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZGF0ZSByYW5nZSBmb3IgdGhpcyBwcmVzZXRcbiAgICogXG4gICAqIE1VU1QgdXNlOlxuICAgKiAtIGBjbG9jay5ub3coKWAgZm9yIGN1cnJlbnQgdGltZSAoU1NSLXNhZmUsIGRldGVybWluaXN0aWMpXG4gICAqIC0gYGFkYXB0ZXIuKmAgZm9yIGFsbCBkYXRlIG9wZXJhdGlvbnMgKHRpbWV6b25lLXNhZmUpXG4gICAqIFxuICAgKiBNVVNUIE5PVCB1c2U6XG4gICAqIC0gYG5ldyBEYXRlKClgIGRpcmVjdGx5IChicmVha3MgU1NSIGRldGVybWluaXNtKVxuICAgKiAtIGBkYXRlLnRvSVNPU3RyaW5nKClgICh0aW1lem9uZSBidWdzKVxuICAgKiAtIGBkYXRlLnNldERhdGUoKWAgKG11dGF0ZXMsIHVzZSBhZGFwdGVyLmFkZERheXMoKSBpbnN0ZWFkKVxuICAgKiBcbiAgICogQHBhcmFtIGNsb2NrIC0gSW5qZWN0ZWQgRGF0ZUNsb2NrIGZvciBTU1Itc2FmZSB0aW1lIGFjY2Vzc1xuICAgKiBAcGFyYW0gYWRhcHRlciAtIEluamVjdGVkIERhdGVBZGFwdGVyIGZvciB0aW1lem9uZS1zYWZlIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgRGF0ZSByYW5nZSB3aXRoIHN0YXJ0IGFuZCBlbmQgZGF0ZXMgKGJvdGggaW5jbHVzaXZlKVxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZXNvbHZlOiAoY2xvY2ssIGFkYXB0ZXIpID0+IHtcbiAgICogICBjb25zdCBub3cgPSBjbG9jay5ub3coKTtcbiAgICogICBjb25zdCBzdGFydCA9IGFkYXB0ZXIuYWRkRGF5cyhub3csIC03KTtcbiAgICogICBjb25zdCBlbmQgPSBhZGFwdGVyLm5vcm1hbGl6ZShub3cpO1xuICAgKiAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHJlc29sdmUoY2xvY2s6IERhdGVDbG9jaywgYWRhcHRlcjogRGF0ZUFkYXB0ZXIpOiBEYXRlUmFuZ2U7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBvYmplY3QgaXMgYSB2YWxpZCBSYW5nZVByZXNldFBsdWdpblxuICogXG4gKiBAcGFyYW0gb2JqIC0gT2JqZWN0IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIG9iamVjdCBpbXBsZW1lbnRzIFJhbmdlUHJlc2V0UGx1Z2luIGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSYW5nZVByZXNldFBsdWdpbihvYmo6IGFueSk6IG9iaiBpcyBSYW5nZVByZXNldFBsdWdpbiB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2Ygb2JqLmtleSA9PT0gJ3N0cmluZycgJiZcbiAgICB0eXBlb2Ygb2JqLnJlc29sdmUgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cbiJdfQ==