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