@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.
- package/README.md +26 -2
- package/fesm2022/oneluiz-dual-datepicker.mjs +71 -69
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +6 -8
- package/dual-datepicker.component.d.ts +0 -243
- package/esm2022/core/built-in-presets.mjs +0 -289
- package/esm2022/core/calendar-grid/cache.config.mjs +0 -35
- package/esm2022/core/calendar-grid/calendar-grid.cache.mjs +0 -98
- package/esm2022/core/calendar-grid/calendar-grid.factory.mjs +0 -97
- package/esm2022/core/calendar-grid/calendar-grid.types.mjs +0 -8
- package/esm2022/core/calendar-grid/range-highlighter.cache.mjs +0 -200
- package/esm2022/core/calendar-grid/range-highlighter.mjs +0 -185
- package/esm2022/core/calendar-grid/range-highlighter.types.mjs +0 -11
- package/esm2022/core/calendar-grid/virtual-weeks.logic.mjs +0 -149
- package/esm2022/core/calendar-grid/virtual-weeks.types.mjs +0 -11
- package/esm2022/core/date-adapter.mjs +0 -77
- package/esm2022/core/date-clock.mjs +0 -65
- package/esm2022/core/dual-date-range.store.mjs +0 -329
- package/esm2022/core/internal.mjs +0 -92
- package/esm2022/core/native-date-adapter.mjs +0 -286
- package/esm2022/core/preset-providers.mjs +0 -243
- package/esm2022/core/preset-registry.mjs +0 -277
- package/esm2022/core/preset.engine.mjs +0 -179
- package/esm2022/core/public.mjs +0 -94
- package/esm2022/core/range-preset.plugin.mjs +0 -70
- package/esm2022/core/range.validator.mjs +0 -105
- package/esm2022/core/system-clock.mjs +0 -34
- package/esm2022/core/testing/date.helpers.mjs +0 -49
- package/esm2022/core/testing/fixed-clock.mjs +0 -30
- package/esm2022/core/testing/index.mjs +0 -8
- package/esm2022/dual-datepicker.component.mjs +0 -1314
- package/esm2022/oneluiz-dual-datepicker.mjs +0 -5
- package/esm2022/public-api.mjs +0 -43
- package/index.d.ts +0 -5
- 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==
|
package/esm2022/core/public.mjs
DELETED
|
@@ -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
|