@oneluiz/dual-datepicker 4.0.0 → 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 (35) hide show
  1. package/README.md +26 -2
  2. package/fesm2022/oneluiz-dual-datepicker.mjs +71 -69
  3. package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
  4. package/package.json +6 -8
  5. package/dual-datepicker.component.d.ts +0 -243
  6. package/esm2022/core/built-in-presets.mjs +0 -289
  7. package/esm2022/core/calendar-grid/cache.config.mjs +0 -35
  8. package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +0 -98
  9. package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +0 -97
  10. package/esm2022/core/calendar-grid/calendar-grid.types.mjs +0 -8
  11. package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +0 -200
  12. package/esm2022/core/calendar-grid/range-highlighter.mjs +0 -185
  13. package/esm2022/core/calendar-grid/range-highlighter.types.mjs +0 -11
  14. package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +0 -149
  15. package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +0 -11
  16. package/esm2022/core/date-adapter.mjs +0 -77
  17. package/esm2022/core/date-clock.mjs +0 -65
  18. package/esm2022/core/dual-date-range.store.mjs +0 -329
  19. package/esm2022/core/internal.mjs +0 -92
  20. package/esm2022/core/native-date-adapter.mjs +0 -286
  21. package/esm2022/core/preset-providers.mjs +0 -243
  22. package/esm2022/core/preset-registry.mjs +0 -277
  23. package/esm2022/core/preset.engine.mjs +0 -179
  24. package/esm2022/core/public.mjs +0 -94
  25. package/esm2022/core/range-preset.plugin.mjs +0 -70
  26. package/esm2022/core/range.validator.mjs +0 -105
  27. package/esm2022/core/system-clock.mjs +0 -34
  28. package/esm2022/core/testing/date.helpers.mjs +0 -49
  29. package/esm2022/core/testing/fixed-clock.mjs +0 -30
  30. package/esm2022/core/testing/index.mjs +0 -8
  31. package/esm2022/dual-datepicker.component.mjs +0 -1314
  32. package/esm2022/oneluiz-dual-datepicker.mjs +0 -5
  33. package/esm2022/public-api.mjs +0 -43
  34. package/index.d.ts +0 -5
  35. package/public-api.d.ts +0 -44
@@ -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,94 +0,0 @@
1
- /**
2
- * PUBLIC API for @oneluiz/dual-datepicker
3
- *
4
- * This file defines the stable public API contract.
5
- * Exports from this barrel are guaranteed to follow semantic versioning.
6
- *
7
- * @public
8
- * @packageDocumentation
9
- * @module @oneluiz/dual-datepicker/core
10
- * @since v4.0.0
11
- */
12
- // ============================================================================
13
- // HEADLESS STORE
14
- // ============================================================================
15
- /**
16
- * DualDateRangeStore - Signal-based headless date range store
17
- *
18
- * Core reactive store for managing date range state without UI dependencies.
19
- * Perfect for SSR, global state, and custom UI implementations.
20
- *
21
- * @public
22
- * @since v3.5.0
23
- */
24
- export { DualDateRangeStore } from './dual-date-range.store';
25
- export { DATE_ADAPTER } from './date-adapter';
26
- /**
27
- * NativeDateAdapter - Built-in implementation using native Date
28
- *
29
- * Default adapter that uses JavaScript's native Date object.
30
- * Provides timezone-safe operations without external dependencies.
31
- *
32
- * @public
33
- * @since v1.0.0
34
- */
35
- export { NativeDateAdapter } from './native-date-adapter';
36
- /**
37
- * PresetRegistry - Plugin management and lifecycle
38
- *
39
- * Injectable service that manages preset plugins.
40
- * Handles registration, resolution, and validation.
41
- *
42
- * @public
43
- * @since v3.6.0
44
- */
45
- export { PresetRegistry } from './preset-registry';
46
- /**
47
- * Built-in Presets - Standard date range presets as plugins
48
- *
49
- * Pre-configured plugins for common use cases:
50
- * - TODAY, YESTERDAY
51
- * - LAST_7_DAYS, LAST_30_DAYS
52
- * - THIS_WEEK, LAST_WEEK
53
- * - THIS_MONTH, LAST_MONTH
54
- * - THIS_YEAR, LAST_YEAR
55
- *
56
- * @public
57
- * @since v3.6.0
58
- */
59
- export { BUILT_IN_PRESETS, TODAY_PRESET, YESTERDAY_PRESET, LAST_7_DAYS_PRESET, LAST_30_DAYS_PRESET, THIS_WEEK_PRESET, LAST_WEEK_PRESET, THIS_MONTH_PRESET, LAST_MONTH_PRESET, THIS_YEAR_PRESET, LAST_YEAR_PRESET } from './built-in-presets';
60
- /**
61
- * Provider Functions - Dependency injection helpers
62
- *
63
- * Functions for configuring the library via Angular DI:
64
- * - provideCustomPresets() - Custom preset plugins
65
- * - providePresetPackage() - Preset packages
66
- *
67
- * @public
68
- * @since v3.6.0
69
- */
70
- export { provideCustomPresets, providePresetPackage } from './preset-providers';
71
- // ============================================================================
72
- // VALIDATION & UTILITIES
73
- // ============================================================================
74
- /**
75
- * Range Validation Utilities
76
- *
77
- * Pure functions for date range validation logic.
78
- * Used internally but exposed for custom implementations.
79
- *
80
- * @public
81
- * @since v3.5.0
82
- */
83
- export { validateRangeOrder, applyBounds, isDateDisabled } from './range.validator';
84
- /**
85
- * Preset Engine - Preset resolution and management
86
- *
87
- * Core engine that handles preset plugin execution.
88
- * Used internally but exposed for advanced use cases.
89
- *
90
- * @public
91
- * @since v3.6.0
92
- */
93
- export { PresetEngine } from './preset.engine';
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvcHVibGljLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCwrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUUvRTs7Ozs7Ozs7R0FRRztBQUNILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBZ0I3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUM7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQW1CMUQ7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDakIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLCtFQUErRTtBQUMvRSx5QkFBeUI7QUFDekIsK0VBQStFO0FBRS9FOzs7Ozs7OztHQVFHO0FBQ0gsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gsY0FBYyxFQUVmLE1BQU0sbUJBQW1CLENBQUM7QUFFM0I7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBVQkxJQyBBUEkgZm9yIEBvbmVsdWl6L2R1YWwtZGF0ZXBpY2tlclxuICogXG4gKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3RhYmxlIHB1YmxpYyBBUEkgY29udHJhY3QuXG4gKiBFeHBvcnRzIGZyb20gdGhpcyBiYXJyZWwgYXJlIGd1YXJhbnRlZWQgdG8gZm9sbG93IHNlbWFudGljIHZlcnNpb25pbmcuXG4gKiBcbiAqIEBwdWJsaWNcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBAb25lbHVpei9kdWFsLWRhdGVwaWNrZXIvY29yZVxuICogQHNpbmNlIHY0LjAuMFxuICovXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhFQURMRVNTIFNUT1JFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogRHVhbERhdGVSYW5nZVN0b3JlIC0gU2lnbmFsLWJhc2VkIGhlYWRsZXNzIGRhdGUgcmFuZ2Ugc3RvcmVcbiAqIFxuICogQ29yZSByZWFjdGl2ZSBzdG9yZSBmb3IgbWFuYWdpbmcgZGF0ZSByYW5nZSBzdGF0ZSB3aXRob3V0IFVJIGRlcGVuZGVuY2llcy5cbiAqIFBlcmZlY3QgZm9yIFNTUiwgZ2xvYmFsIHN0YXRlLCBhbmQgY3VzdG9tIFVJIGltcGxlbWVudGF0aW9ucy5cbiAqIFxuICogQHB1YmxpY1xuICogQHNpbmNlIHYzLjUuMFxuICovXG5leHBvcnQgeyBEdWFsRGF0ZVJhbmdlU3RvcmUgfSBmcm9tICcuL2R1YWwtZGF0ZS1yYW5nZS5zdG9yZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERBVEUgQURBUFRFUiBTWVNURU1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBEYXRlQWRhcHRlciAtIEFic3RyYWN0IGRhdGUgbWFuaXB1bGF0aW9uIGludGVyZmFjZVxuICogXG4gKiBQcm92aWRlcyB0aW1lem9uZS1zYWZlIGRhdGUgb3BlcmF0aW9ucy5cbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSBmb3IgY3VzdG9tIGRhdGUgbGlicmFyaWVzIChMdXhvbiwgZGF0ZS1mbnMsIGV0Yy4pXG4gKiBcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSB2MS4wLjBcbiAqL1xuZXhwb3J0IHR5cGUgeyBEYXRlQWRhcHRlciB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcbmV4cG9ydCB7IERBVEVfQURBUFRFUiB9IGZyb20gJy4vZGF0ZS1hZGFwdGVyJztcblxuLyoqXG4gKiBOYXRpdmVEYXRlQWRhcHRlciAtIEJ1aWx0LWluIGltcGxlbWVudGF0aW9uIHVzaW5nIG5hdGl2ZSBEYXRlXG4gKiBcbiAqIERlZmF1bHQgYWRhcHRlciB0aGF0IHVzZXMgSmF2YVNjcmlwdCdzIG5hdGl2ZSBEYXRlIG9iamVjdC5cbiAqIFByb3ZpZGVzIHRpbWV6b25lLXNhZmUgb3BlcmF0aW9ucyB3aXRob3V0IGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqIFxuICogQHB1YmxpY1xuICogQHNpbmNlIHYxLjAuMFxuICovXG5leHBvcnQgeyBOYXRpdmVEYXRlQWRhcHRlciB9IGZyb20gJy4vbmF0aXZlLWRhdGUtYWRhcHRlcic7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBSRVNFVCBQTFVHSU4gU1lTVEVNICh2My42LjArKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJhbmdlUHJlc2V0UGx1Z2luIC0gSW50ZXJmYWNlIGZvciBleHRlbnNpYmxlIGRhdGUgcmFuZ2UgcHJlc2V0c1xuICogXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gY3JlYXRlIGN1c3RvbSBwcmVzZXQgcGx1Z2lucy5cbiAqIFN1cHBvcnRzIGR5bmFtaWMgcmFuZ2VzLCB2YWxpZGF0aW9uLCBhbmQgY3VzdG9tIGxvZ2ljLlxuICogXG4gKiBAcHVibGljXG4gKiBAc2luY2UgdjMuNi4wXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgUmFuZ2VQcmVzZXRQbHVnaW5cbn0gZnJvbSAnLi9yYW5nZS1wcmVzZXQucGx1Z2luJztcblxuLyoqXG4gKiBQcmVzZXRSZWdpc3RyeSAtIFBsdWdpbiBtYW5hZ2VtZW50IGFuZCBsaWZlY3ljbGVcbiAqIFxuICogSW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgbWFuYWdlcyBwcmVzZXQgcGx1Z2lucy5cbiAqIEhhbmRsZXMgcmVnaXN0cmF0aW9uLCByZXNvbHV0aW9uLCBhbmQgdmFsaWRhdGlvbi5cbiAqIFxuICogQHB1YmxpY1xuICogQHNpbmNlIHYzLjYuMFxuICovXG5leHBvcnQgeyBQcmVzZXRSZWdpc3RyeSB9IGZyb20gJy4vcHJlc2V0LXJlZ2lzdHJ5JztcblxuLyoqXG4gKiBCdWlsdC1pbiBQcmVzZXRzIC0gU3RhbmRhcmQgZGF0ZSByYW5nZSBwcmVzZXRzIGFzIHBsdWdpbnNcbiAqIFxuICogUHJlLWNvbmZpZ3VyZWQgcGx1Z2lucyBmb3IgY29tbW9uIHVzZSBjYXNlczpcbiAqIC0gVE9EQVksIFlFU1RFUkRBWVxuICogLSBMQVNUXzdfREFZUywgTEFTVF8zMF9EQVlTXG4gKiAtIFRISVNfV0VFSywgTEFTVF9XRUVLXG4gKiAtIFRISVNfTU9OVEgsIExBU1RfTU9OVEhcbiAqIC0gVEhJU19ZRUFSLCBMQVNUX1lFQVJcbiAqIFxuICogQHB1YmxpY1xuICogQHNpbmNlIHYzLjYuMFxuICovXG5leHBvcnQge1xuICBCVUlMVF9JTl9QUkVTRVRTLFxuICBUT0RBWV9QUkVTRVQsXG4gIFlFU1RFUkRBWV9QUkVTRVQsXG4gIExBU1RfN19EQVlTX1BSRVNFVCxcbiAgTEFTVF8zMF9EQVlTX1BSRVNFVCxcbiAgVEhJU19XRUVLX1BSRVNFVCxcbiAgTEFTVF9XRUVLX1BSRVNFVCxcbiAgVEhJU19NT05USF9QUkVTRVQsXG4gIExBU1RfTU9OVEhfUFJFU0VULFxuICBUSElTX1lFQVJfUFJFU0VULFxuICBMQVNUX1lFQVJfUFJFU0VUXG59IGZyb20gJy4vYnVpbHQtaW4tcHJlc2V0cyc7XG5cbi8qKlxuICogUHJvdmlkZXIgRnVuY3Rpb25zIC0gRGVwZW5kZW5jeSBpbmplY3Rpb24gaGVscGVyc1xuICogXG4gKiBGdW5jdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBsaWJyYXJ5IHZpYSBBbmd1bGFyIERJOlxuICogLSBwcm92aWRlQ3VzdG9tUHJlc2V0cygpIC0gQ3VzdG9tIHByZXNldCBwbHVnaW5zXG4gKiAtIHByb3ZpZGVQcmVzZXRQYWNrYWdlKCkgLSBQcmVzZXQgcGFja2FnZXNcbiAqIFxuICogQHB1YmxpY1xuICogQHNpbmNlIHYzLjYuMFxuICovXG5leHBvcnQge1xuICBwcm92aWRlQ3VzdG9tUHJlc2V0cyxcbiAgcHJvdmlkZVByZXNldFBhY2thZ2Vcbn0gZnJvbSAnLi9wcmVzZXQtcHJvdmlkZXJzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVkFMSURBVElPTiAmIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJhbmdlIFZhbGlkYXRpb24gVXRpbGl0aWVzXG4gKiBcbiAqIFB1cmUgZnVuY3Rpb25zIGZvciBkYXRlIHJhbmdlIHZhbGlkYXRpb24gbG9naWMuXG4gKiBVc2VkIGludGVybmFsbHkgYnV0IGV4cG9zZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMuXG4gKiBcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSB2My41LjBcbiAqL1xuZXhwb3J0IHtcbiAgdmFsaWRhdGVSYW5nZU9yZGVyLFxuICBhcHBseUJvdW5kcyxcbiAgaXNEYXRlRGlzYWJsZWQsXG4gIHR5cGUgVmFsaWRhdGlvblJlc3VsdFxufSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5cbi8qKlxuICogUHJlc2V0IEVuZ2luZSAtIFByZXNldCByZXNvbHV0aW9uIGFuZCBtYW5hZ2VtZW50XG4gKiBcbiAqIENvcmUgZW5naW5lIHRoYXQgaGFuZGxlcyBwcmVzZXQgcGx1Z2luIGV4ZWN1dGlvbi5cbiAqIFVzZWQgaW50ZXJuYWxseSBidXQgZXhwb3NlZCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzLlxuICogXG4gKiBAcHVibGljXG4gKiBAc2luY2UgdjMuNi4wXG4gKi9cbmV4cG9ydCB7IFByZXNldEVuZ2luZSB9IGZyb20gJy4vcHJlc2V0LmVuZ2luZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEUgRVhQT1JUUyAoZm9yIFR5cGVTY3JpcHQgdXNlcnMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmUtZXhwb3J0IHR5cGVzIGZvciBjb252ZW5pZW5jZVxuICogXG4gKiBUaGVzZSB0eXBlcyBhcmUgYWxyZWFkeSBleHBvcnRlZCBieSB0aGVpciByZXNwZWN0aXZlIG1vZHVsZXMsXG4gKiBidXQgd2UgcmUtZXhwb3J0IHRoZW0gaGVyZSBmb3IgZWFzaWVyIGltcG9ydHMuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgLy8gRnJvbSByYW5nZS52YWxpZGF0b3JcbiAgVmFsaWRhdGlvblJlc3VsdCBhcyBSYW5nZVZhbGlkYXRpb25SZXN1bHRcbn0gZnJvbSAnLi9yYW5nZS52YWxpZGF0b3InO1xuIl19