@oneluiz/dual-datepicker 3.3.0 → 3.5.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.
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Headless Date Range Store using Angular Signals
3
+ *
4
+ * Architecture:
5
+ * - State lives HERE, not in UI component
6
+ * - Deterministic: no hidden side effects
7
+ * - SSR-compatible: no window/document dependencies
8
+ * - Testable: pure signal-based state
9
+ * - Reusable: inject anywhere (services, components, guards)
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * // In component
14
+ * const rangeStore = inject(DualDateRangeStore);
15
+ * rangeStore.applyPreset('THIS_MONTH');
16
+ *
17
+ * // In service (headless!)
18
+ * const store = inject(DualDateRangeStore);
19
+ * const range = store.range();
20
+ * this.http.get(`/api/sales?start=${range.start}&end=${range.end}`);
21
+ * ```
22
+ */
23
+ import { Injectable, signal, computed } from '@angular/core';
24
+ import { validateRangeOrder, validateRangeBounds, isDateDisabled, applyBounds, parseISODate, formatISODate } from './range.validator';
25
+ import { presetEngine } from './preset.engine';
26
+ import * as i0 from "@angular/core";
27
+ export class DualDateRangeStore {
28
+ // Configuration
29
+ config = signal({
30
+ enableTimePicker: false,
31
+ defaultStartTime: '00:00',
32
+ defaultEndTime: '23:59'
33
+ });
34
+ // Core state - using signals
35
+ _startDate = signal(null);
36
+ _endDate = signal(null);
37
+ _leftMonth = signal(new Date());
38
+ _rightMonth = signal(this.getNextMonth(new Date()));
39
+ _selectingStart = signal(true);
40
+ // Time state
41
+ _startTime = signal('00:00');
42
+ _endTime = signal('23:59');
43
+ // Pending state for requireApply mode
44
+ _pendingStart = signal(null);
45
+ _pendingEnd = signal(null);
46
+ _hasPendingChanges = signal(false);
47
+ // Public read-only signals
48
+ startDate = this._startDate.asReadonly();
49
+ endDate = this._endDate.asReadonly();
50
+ leftMonth = this._leftMonth.asReadonly();
51
+ rightMonth = this._rightMonth.asReadonly();
52
+ selectingStart = this._selectingStart.asReadonly();
53
+ startTime = this._startTime.asReadonly();
54
+ endTime = this._endTime.asReadonly();
55
+ hasPendingChanges = this._hasPendingChanges.asReadonly();
56
+ // Computed: ISO range for API consumption
57
+ range = computed(() => {
58
+ const start = this._startDate();
59
+ const end = this._endDate();
60
+ const cfg = this.config();
61
+ const result = {
62
+ start: formatISODate(start),
63
+ end: formatISODate(end)
64
+ };
65
+ if (cfg.enableTimePicker) {
66
+ result.startTime = this._startTime();
67
+ result.endTime = this._endTime();
68
+ }
69
+ return result;
70
+ });
71
+ // Computed: validation state
72
+ isValid = computed(() => {
73
+ const start = this._startDate();
74
+ const end = this._endDate();
75
+ const cfg = this.config();
76
+ const orderValidation = validateRangeOrder(start, end);
77
+ if (!orderValidation.valid)
78
+ return false;
79
+ const boundsValidation = validateRangeBounds(start, end, cfg.minDate, cfg.maxDate);
80
+ return boundsValidation.valid;
81
+ });
82
+ // Computed: range text for display
83
+ rangeText = computed(() => {
84
+ const start = this._startDate();
85
+ const end = this._endDate();
86
+ if (!start && !end)
87
+ return '';
88
+ if (!start)
89
+ return `? - ${this.formatDateShort(end)}`;
90
+ if (!end)
91
+ return `${this.formatDateShort(start)}`;
92
+ return `${this.formatDateShort(start)} - ${this.formatDateShort(end)}`;
93
+ });
94
+ /**
95
+ * Configure the store
96
+ */
97
+ configure(config) {
98
+ this.config.update(current => ({ ...current, ...config }));
99
+ }
100
+ /**
101
+ * Set start date (with validation)
102
+ */
103
+ setStart(date) {
104
+ const parsedDate = this.parseDate(date);
105
+ if (parsedDate) {
106
+ const cfg = this.config();
107
+ // Apply bounds
108
+ const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
109
+ // Check if disabled
110
+ if (isDateDisabled(boundedDate, cfg.disabledDates)) {
111
+ console.warn('Cannot select disabled date');
112
+ return;
113
+ }
114
+ this._startDate.set(boundedDate);
115
+ this._selectingStart.set(false);
116
+ // Auto-adjust end if it becomes invalid
117
+ const end = this._endDate();
118
+ if (end && end < boundedDate) {
119
+ this._endDate.set(null);
120
+ }
121
+ }
122
+ else {
123
+ this._startDate.set(null);
124
+ }
125
+ }
126
+ /**
127
+ * Set end date (with validation)
128
+ */
129
+ setEnd(date) {
130
+ const parsedDate = this.parseDate(date);
131
+ if (parsedDate) {
132
+ const cfg = this.config();
133
+ // Apply bounds
134
+ const boundedDate = applyBounds(parsedDate, cfg.minDate, cfg.maxDate);
135
+ // Check if disabled
136
+ if (isDateDisabled(boundedDate, cfg.disabledDates)) {
137
+ console.warn('Cannot select disabled date');
138
+ return;
139
+ }
140
+ // Validate order
141
+ const start = this._startDate();
142
+ if (start && boundedDate < start) {
143
+ console.warn('End date cannot be before start date');
144
+ return;
145
+ }
146
+ this._endDate.set(boundedDate);
147
+ this._selectingStart.set(true); // Ready for next selection
148
+ }
149
+ else {
150
+ this._endDate.set(null);
151
+ }
152
+ }
153
+ /**
154
+ * Set complete range at once
155
+ */
156
+ setRange(start, end) {
157
+ this.setStart(start);
158
+ this.setEnd(end);
159
+ }
160
+ /**
161
+ * Set pending selection (for requireApply mode)
162
+ */
163
+ setPendingStart(date) {
164
+ const parsedDate = this.parseDate(date);
165
+ this._pendingStart.set(parsedDate);
166
+ this._hasPendingChanges.set(true);
167
+ }
168
+ setPendingEnd(date) {
169
+ const parsedDate = this.parseDate(date);
170
+ this._pendingEnd.set(parsedDate);
171
+ this._hasPendingChanges.set(true);
172
+ }
173
+ /**
174
+ * Apply pending changes
175
+ */
176
+ applyPending() {
177
+ const pendingStart = this._pendingStart();
178
+ const pendingEnd = this._pendingEnd();
179
+ if (pendingStart)
180
+ this.setStart(pendingStart);
181
+ if (pendingEnd)
182
+ this.setEnd(pendingEnd);
183
+ this.clearPending();
184
+ }
185
+ /**
186
+ * Cancel pending changes
187
+ */
188
+ cancelPending() {
189
+ this.clearPending();
190
+ }
191
+ clearPending() {
192
+ this._pendingStart.set(null);
193
+ this._pendingEnd.set(null);
194
+ this._hasPendingChanges.set(false);
195
+ }
196
+ /**
197
+ * Reset to empty state
198
+ */
199
+ reset() {
200
+ this._startDate.set(null);
201
+ this._endDate.set(null);
202
+ this._selectingStart.set(true);
203
+ this.clearPending();
204
+ }
205
+ /**
206
+ * Apply a preset by key
207
+ */
208
+ applyPreset(presetKey, now = new Date()) {
209
+ const range = presetEngine.resolve(presetKey, now);
210
+ if (range) {
211
+ this.setRange(range.start, range.end);
212
+ }
213
+ else {
214
+ console.warn(`Preset "${presetKey}" not found`);
215
+ }
216
+ }
217
+ /**
218
+ * Navigate left calendar month
219
+ */
220
+ setLeftMonth(date) {
221
+ this._leftMonth.set(date);
222
+ // Ensure right month is always after left
223
+ const right = this._rightMonth();
224
+ if (right <= date) {
225
+ this._rightMonth.set(this.getNextMonth(date));
226
+ }
227
+ }
228
+ /**
229
+ * Navigate right calendar month
230
+ */
231
+ setRightMonth(date) {
232
+ this._rightMonth.set(date);
233
+ // Ensure left month is always before right
234
+ const left = this._leftMonth();
235
+ if (left >= date) {
236
+ this._leftMonth.set(this.getPreviousMonth(date));
237
+ }
238
+ }
239
+ /**
240
+ * Set time values
241
+ */
242
+ setStartTime(time) {
243
+ this._startTime.set(time);
244
+ }
245
+ setEndTime(time) {
246
+ this._endTime.set(time);
247
+ }
248
+ /**
249
+ * Get current state as snapshot
250
+ */
251
+ getSnapshot() {
252
+ return this.range();
253
+ }
254
+ /**
255
+ * Load state from snapshot
256
+ */
257
+ loadSnapshot(snapshot) {
258
+ this.setRange(snapshot.start, snapshot.end);
259
+ if (snapshot.startTime) {
260
+ this.setStartTime(snapshot.startTime);
261
+ }
262
+ if (snapshot.endTime) {
263
+ this.setEndTime(snapshot.endTime);
264
+ }
265
+ }
266
+ // Helper methods
267
+ parseDate(date) {
268
+ if (!date)
269
+ return null;
270
+ if (date instanceof Date)
271
+ return date;
272
+ return parseISODate(date);
273
+ }
274
+ getNextMonth(date) {
275
+ return new Date(date.getFullYear(), date.getMonth() + 1, 1);
276
+ }
277
+ getPreviousMonth(date) {
278
+ return new Date(date.getFullYear(), date.getMonth() - 1, 1);
279
+ }
280
+ formatDateShort(date) {
281
+ const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
282
+ return `${date.getDate()} ${months[date.getMonth()]}`;
283
+ }
284
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
285
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, providedIn: 'root' });
286
+ }
287
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DualDateRangeStore, decorators: [{
288
+ type: Injectable,
289
+ args: [{
290
+ providedIn: 'root'
291
+ }]
292
+ }] });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVhbC1kYXRlLXJhbmdlLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvZHVhbC1kYXRlLXJhbmdlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxXQUFXLEVBQ1gsWUFBWSxFQUNaLGFBQWEsRUFDZCxNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFxQjVELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsZ0JBQWdCO0lBQ1IsTUFBTSxHQUFHLE1BQU0sQ0FBa0I7UUFDdkMsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QixnQkFBZ0IsRUFBRSxPQUFPO1FBQ3pCLGNBQWMsRUFBRSxPQUFPO0tBQ3hCLENBQUMsQ0FBQztJQUVILDZCQUE2QjtJQUNyQixVQUFVLEdBQUcsTUFBTSxDQUFjLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsR0FBRyxNQUFNLENBQWMsSUFBSSxDQUFDLENBQUM7SUFDckMsVUFBVSxHQUFHLE1BQU0sQ0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsV0FBVyxHQUFHLE1BQU0sQ0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFELGVBQWUsR0FBRyxNQUFNLENBQVUsSUFBSSxDQUFDLENBQUM7SUFFaEQsYUFBYTtJQUNMLFVBQVUsR0FBRyxNQUFNLENBQVMsT0FBTyxDQUFDLENBQUM7SUFDckMsUUFBUSxHQUFHLE1BQU0sQ0FBUyxPQUFPLENBQUMsQ0FBQztJQUUzQyxzQ0FBc0M7SUFDOUIsYUFB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LElBQTBCO1FBQzFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxJQUFJLFlBQVksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RDLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxZQUFZLENBQUMsSUFBVTtRQUM3QixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFVO1FBQ2pDLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFVO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hELENBQUM7d0dBOVNVLGtCQUFrQjs0R0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhlYWRsZXNzIERhdGUgUmFuZ2UgU3RvcmUgdXNpbmcgQW5ndWxhciBTaWduYWxzXG4gKiBcbiAqIEFyY2hpdGVjdHVyZTpcbiAqIC0gU3RhdGUgbGl2ZXMgSEVSRSwgbm90IGluIFVJIGNvbXBvbmVudFxuICogLSBEZXRlcm1pbmlzdGljOiBubyBoaWRkZW4gc2lkZSBlZmZlY3RzXG4gKiAtIFNTUi1jb21wYXRpYmxlOiBubyB3aW5kb3cvZG9jdW1lbnQgZGVwZW5kZW5jaWVzXG4gKiAtIFRlc3RhYmxlOiBwdXJlIHNpZ25hbC1iYXNlZCBzdGF0ZVxuICogLSBSZXVzYWJsZTogaW5qZWN0IGFueXdoZXJlIChzZXJ2aWNlcywgY29tcG9uZW50cywgZ3VhcmRzKVxuICogXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluIGNvbXBvbmVudFxuICogY29uc3QgcmFuZ2VTdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogcmFuZ2VTdG9yZS5hcHBseVByZXNldCgnVEhJU19NT05USCcpO1xuICogXG4gKiAvLyBJbiBzZXJ2aWNlIChoZWFkbGVzcyEpXG4gKiBjb25zdCBzdG9yZSA9IGluamVjdChEdWFsRGF0ZVJhbmdlU3RvcmUpO1xuICogY29uc3QgcmFuZ2UgPSBzdG9yZS5yYW5nZSgpO1xuICogdGhpcy5odHRwLmdldChgL2FwaS9zYWxlcz9zdGFydD0ke3JhbmdlLnN0YXJ0fSZlbmQ9JHtyYW5nZS5lbmR9YCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgXG4gIHZhbGlkYXRlUmFuZ2VPcmRlciwgXG4gIHZhbGlkYXRlUmFuZ2VCb3VuZHMsIFxuICBpc0RhdGVEaXNhYmxlZCxcbiAgYXBwbHlCb3VuZHMsXG4gIHBhcnNlSVNPRGF0ZSxcbiAgZm9ybWF0SVNPRGF0ZVxufSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBwcmVzZXRFbmdpbmUsIFByZXNldFJhbmdlIH0gZnJvbSAnLi9wcmVzZXQuZW5naW5lJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2VTdGF0ZSB7XG4gIHN0YXJ0OiBzdHJpbmc7IC8vIElTTyBkYXRlXG4gIGVuZDogc3RyaW5nOyAvLyBJU08gZGF0ZVxuICBzdGFydFRpbWU/OiBzdHJpbmc7IC8vIEhIOm1tXG4gIGVuZFRpbWU/OiBzdHJpbmc7IC8vIEhIOm1tXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVJhbmdlQ29uZmlnIHtcbiAgbWluRGF0ZT86IERhdGU7XG4gIG1heERhdGU/OiBEYXRlO1xuICBkaXNhYmxlZERhdGVzPzogRGF0ZVtdIHwgKChkYXRlOiBEYXRlKSA9PiBib29sZWFuKTtcbiAgZW5hYmxlVGltZVBpY2tlcj86IGJvb2xlYW47XG4gIGRlZmF1bHRTdGFydFRpbWU/OiBzdHJpbmc7XG4gIGRlZmF1bHRFbmRUaW1lPzogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEdWFsRGF0ZVJhbmdlU3RvcmUge1xuICAvLyBDb25maWd1cmF0aW9uXG4gIHByaXZhdGUgY29uZmlnID0gc2lnbmFsPERhdGVSYW5nZUNvbmZpZz4oe1xuICAgIGVuYWJsZVRpbWVQaWNrZXI6IGZhbHNlLFxuICAgIGRlZmF1bHRTdGFydFRpbWU6ICcwMDowMCcsXG4gICAgZGVmYXVsdEVuZFRpbWU6ICcyMzo1OSdcbiAgfSk7XG5cbiAgLy8gQ29yZSBzdGF0ZSAtIHVzaW5nIHNpZ25hbHNcbiAgcHJpdmF0ZSBfc3RhcnREYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfZW5kRGF0ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgX2xlZnRNb250aCA9IHNpZ25hbDxEYXRlPihuZXcgRGF0ZSgpKTtcbiAgcHJpdmF0ZSBfcmlnaHRNb250aCA9IHNpZ25hbDxEYXRlPih0aGlzLmdldE5leHRNb250aChuZXcgRGF0ZSgpKSk7XG4gIHByaXZhdGUgX3NlbGVjdGluZ1N0YXJ0ID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuXG4gIC8vIFRpbWUgc3RhdGVcbiAgcHJpdmF0ZSBfc3RhcnRUaW1lID0gc2lnbmFsPHN0cmluZz4oJzAwOjAwJyk7XG4gIHByaXZhdGUgX2VuZFRpbWUgPSBzaWduYWw8c3RyaW5nPignMjM6NTknKTtcblxuICAvLyBQZW5kaW5nIHN0YXRlIGZvciByZXF1aXJlQXBwbHkgbW9kZVxuICBwcml2YXRlIF9wZW5kaW5nU3RhcnQgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIF9wZW5kaW5nRW5kID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfaGFzUGVuZGluZ0NoYW5nZXMgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIFB1YmxpYyByZWFkLW9ubHkgc2lnbmFsc1xuICByZWFkb25seSBzdGFydERhdGUgPSB0aGlzLl9zdGFydERhdGUuYXNSZWFkb25seSgpO1xuICByZWFkb25seSBlbmREYXRlID0gdGhpcy5fZW5kRGF0ZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGxlZnRNb250aCA9IHRoaXMuX2xlZnRNb250aC5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IHJpZ2h0TW9udGggPSB0aGlzLl9yaWdodE1vbnRoLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW5nU3RhcnQgPSB0aGlzLl9zZWxlY3RpbmdTdGFydC5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IGVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgaGFzUGVuZGluZ0NoYW5nZXMgPSB0aGlzLl9oYXNQZW5kaW5nQ2hhbmdlcy5hc1JlYWRvbmx5KCk7XG5cbiAgLy8gQ29tcHV0ZWQ6IElTTyByYW5nZSBmb3IgQVBJIGNvbnN1bXB0aW9uXG4gIHJlYWRvbmx5IHJhbmdlID0gY29tcHV0ZWQ8RGF0ZVJhbmdlU3RhdGU+KCgpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBEYXRlUmFuZ2VTdGF0ZSA9IHtcbiAgICAgIHN0YXJ0OiBmb3JtYXRJU09EYXRlKHN0YXJ0KSxcbiAgICAgIGVuZDogZm9ybWF0SVNPRGF0ZShlbmQpXG4gICAgfTtcblxuICAgIGlmIChjZmcuZW5hYmxlVGltZVBpY2tlcikge1xuICAgICAgcmVzdWx0LnN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZSgpO1xuICAgICAgcmVzdWx0LmVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgLy8gQ29tcHV0ZWQ6IHZhbGlkYXRpb24gc3RhdGVcbiAgcmVhZG9ubHkgaXNWYWxpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3Qgb3JkZXJWYWxpZGF0aW9uID0gdmFsaWRhdGVSYW5nZU9yZGVyKHN0YXJ0LCBlbmQpO1xuICAgIGlmICghb3JkZXJWYWxpZGF0aW9uLnZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBib3VuZHNWYWxpZGF0aW9uID0gdmFsaWRhdGVSYW5nZUJvdW5kcyhcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kLFxuICAgICAgY2ZnLm1pbkRhdGUsXG4gICAgICBjZmcubWF4RGF0ZVxuICAgICk7XG4gICAgcmV0dXJuIGJvdW5kc1ZhbGlkYXRpb24udmFsaWQ7XG4gIH0pO1xuXG4gIC8vIENvbXB1dGVkOiByYW5nZSB0ZXh0IGZvciBkaXNwbGF5XG4gIHJlYWRvbmx5IHJhbmdlVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX2VuZERhdGUoKTtcblxuICAgIGlmICghc3RhcnQgJiYgIWVuZCkgcmV0dXJuICcnO1xuICAgIGlmICghc3RhcnQpIHJldHVybiBgPyAtICR7dGhpcy5mb3JtYXREYXRlU2hvcnQoZW5kISl9YDtcbiAgICBpZiAoIWVuZCkgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZVNob3J0KHN0YXJ0KX1gO1xuXG4gICAgcmV0dXJuIGAke3RoaXMuZm9ybWF0RGF0ZVNob3J0KHN0YXJ0KX0gLSAke3RoaXMuZm9ybWF0RGF0ZVNob3J0KGVuZCl9YDtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgc3RvcmVcbiAgICovXG4gIGNvbmZpZ3VyZShjb25maWc6IFBhcnRpYWw8RGF0ZVJhbmdlQ29uZmlnPik6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnLnVwZGF0ZShjdXJyZW50ID0+ICh7IC4uLmN1cnJlbnQsIC4uLmNvbmZpZyB9KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHN0YXJ0IGRhdGUgKHdpdGggdmFsaWRhdGlvbilcbiAgICovXG4gIHNldFN0YXJ0KGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgIFxuICAgIGlmIChwYXJzZWREYXRlKSB7XG4gICAgICBjb25zdCBjZmcgPSB0aGlzLmNvbmZpZygpO1xuICAgICAgXG4gICAgICAvLyBBcHBseSBib3VuZHNcbiAgICAgIGNvbnN0IGJvdW5kZWREYXRlID0gYXBwbHlCb3VuZHMocGFyc2VkRGF0ZSwgY2ZnLm1pbkRhdGUsIGNmZy5tYXhEYXRlKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZGlzYWJsZWRcbiAgICAgIGlmIChpc0RhdGVEaXNhYmxlZChib3VuZGVkRGF0ZSwgY2ZnLmRpc2FibGVkRGF0ZXMpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNlbGVjdCBkaXNhYmxlZCBkYXRlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3RhcnREYXRlLnNldChib3VuZGVkRGF0ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RpbmdTdGFydC5zZXQoZmFsc2UpO1xuXG4gICAgICAvLyBBdXRvLWFkanVzdCBlbmQgaWYgaXQgYmVjb21lcyBpbnZhbGlkXG4gICAgICBjb25zdCBlbmQgPSB0aGlzLl9lbmREYXRlKCk7XG4gICAgICBpZiAoZW5kICYmIGVuZCA8IGJvdW5kZWREYXRlKSB7XG4gICAgICAgIHRoaXMuX2VuZERhdGUuc2V0KG51bGwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydERhdGUuc2V0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZW5kIGRhdGUgKHdpdGggdmFsaWRhdGlvbilcbiAgICovXG4gIHNldEVuZChkYXRlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlKTtcbiAgICBcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xuICAgICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gQXBwbHkgYm91bmRzXG4gICAgICBjb25zdCBib3VuZGVkRGF0ZSA9IGFwcGx5Qm91bmRzKHBhcnNlZERhdGUsIGNmZy5taW5EYXRlLCBjZmcubWF4RGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGRpc2FibGVkXG4gICAgICBpZiAoaXNEYXRlRGlzYWJsZWQoYm91bmRlZERhdGUsIGNmZy5kaXNhYmxlZERhdGVzKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZWxlY3QgZGlzYWJsZWQgZGF0ZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG9yZGVyXG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N0YXJ0RGF0ZSgpO1xuICAgICAgaWYgKHN0YXJ0ICYmIGJvdW5kZWREYXRlIDwgc3RhcnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdFbmQgZGF0ZSBjYW5ub3QgYmUgYmVmb3JlIHN0YXJ0IGRhdGUnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbmREYXRlLnNldChib3VuZGVkRGF0ZSk7XG4gICAgICB0aGlzLl9zZWxlY3RpbmdTdGFydC5zZXQodHJ1ZSk7IC8vIFJlYWR5IGZvciBuZXh0IHNlbGVjdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9lbmREYXRlLnNldChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGNvbXBsZXRlIHJhbmdlIGF0IG9uY2VcbiAgICovXG4gIHNldFJhbmdlKHN0YXJ0OiBEYXRlIHwgc3RyaW5nIHwgbnVsbCwgZW5kOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3RhcnQoc3RhcnQpO1xuICAgIHRoaXMuc2V0RW5kKGVuZCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBlbmRpbmcgc2VsZWN0aW9uIChmb3IgcmVxdWlyZUFwcGx5IG1vZGUpXG4gICAqL1xuICBzZXRQZW5kaW5nU3RhcnQoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXJ0LnNldChwYXJzZWREYXRlKTtcbiAgICB0aGlzLl9oYXNQZW5kaW5nQ2hhbmdlcy5zZXQodHJ1ZSk7XG4gIH1cblxuICBzZXRQZW5kaW5nRW5kKGRhdGU6IERhdGUgfCBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgIHRoaXMuX3BlbmRpbmdFbmQuc2V0KHBhcnNlZERhdGUpO1xuICAgIHRoaXMuX2hhc1BlbmRpbmdDaGFuZ2VzLnNldCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBwZW5kaW5nIGNoYW5nZXNcbiAgICovXG4gIGFwcGx5UGVuZGluZygpOiB2b2lkIHtcbiAgICBjb25zdCBwZW5kaW5nU3RhcnQgPSB0aGlzLl9wZW5kaW5nU3RhcnQoKTtcbiAgICBjb25zdCBwZW5kaW5nRW5kID0gdGhpcy5fcGVuZGluZ0VuZCgpO1xuXG4gICAgaWYgKHBlbmRpbmdTdGFydCkgdGhpcy5zZXRTdGFydChwZW5kaW5nU3RhcnQpO1xuICAgIGlmIChwZW5kaW5nRW5kKSB0aGlzLnNldEVuZChwZW5kaW5nRW5kKTtcblxuICAgIHRoaXMuY2xlYXJQZW5kaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHBlbmRpbmcgY2hhbmdlc1xuICAgKi9cbiAgY2FuY2VsUGVuZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUGVuZGluZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclBlbmRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXJ0LnNldChudWxsKTtcbiAgICB0aGlzLl9wZW5kaW5nRW5kLnNldChudWxsKTtcbiAgICB0aGlzLl9oYXNQZW5kaW5nQ2hhbmdlcy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRvIGVtcHR5IHN0YXRlXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydERhdGUuc2V0KG51bGwpO1xuICAgIHRoaXMuX2VuZERhdGUuc2V0KG51bGwpO1xuICAgIHRoaXMuX3NlbGVjdGluZ1N0YXJ0LnNldCh0cnVlKTtcbiAgICB0aGlzLmNsZWFyUGVuZGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgcHJlc2V0IGJ5IGtleVxuICAgKi9cbiAgYXBwbHlQcmVzZXQocHJlc2V0S2V5OiBzdHJpbmcsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZSA9IHByZXNldEVuZ2luZS5yZXNvbHZlKHByZXNldEtleSwgbm93KTtcbiAgICBcbiAgICBpZiAocmFuZ2UpIHtcbiAgICAgIHRoaXMuc2V0UmFuZ2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2V0IFwiJHtwcmVzZXRLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIGxlZnQgY2FsZW5kYXIgbW9udGhcbiAgICovXG4gIHNldExlZnRNb250aChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5fbGVmdE1vbnRoLnNldChkYXRlKTtcbiAgICBcbiAgICAvLyBFbnN1cmUgcmlnaHQgbW9udGggaXMgYWx3YXlzIGFmdGVyIGxlZnRcbiAgICBjb25zdCByaWdodCA9IHRoaXMuX3JpZ2h0TW9udGgoKTtcbiAgICBpZiAocmlnaHQgPD0gZGF0ZSkge1xuICAgICAgdGhpcy5fcmlnaHRNb250aC5zZXQodGhpcy5nZXROZXh0TW9udGgoZGF0ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSByaWdodCBjYWxlbmRhciBtb250aFxuICAgKi9cbiAgc2V0UmlnaHRNb250aChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5fcmlnaHRNb250aC5zZXQoZGF0ZSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIGxlZnQgbW9udGggaXMgYWx3YXlzIGJlZm9yZSByaWdodFxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLl9sZWZ0TW9udGgoKTtcbiAgICBpZiAobGVmdCA+PSBkYXRlKSB7XG4gICAgICB0aGlzLl9sZWZ0TW9udGguc2V0KHRoaXMuZ2V0UHJldmlvdXNNb250aChkYXRlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aW1lIHZhbHVlc1xuICAgKi9cbiAgc2V0U3RhcnRUaW1lKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXJ0VGltZS5zZXQodGltZSk7XG4gIH1cblxuICBzZXRFbmRUaW1lKHRpbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2VuZFRpbWUuc2V0KHRpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHN0YXRlIGFzIHNuYXBzaG90XG4gICAqL1xuICBnZXRTbmFwc2hvdCgpOiBEYXRlUmFuZ2VTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHN0YXRlIGZyb20gc25hcHNob3RcbiAgICovXG4gIGxvYWRTbmFwc2hvdChzbmFwc2hvdDogRGF0ZVJhbmdlU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnNldFJhbmdlKHNuYXBzaG90LnN0YXJ0LCBzbmFwc2hvdC5lbmQpO1xuICAgIFxuICAgIGlmIChzbmFwc2hvdC5zdGFydFRpbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhcnRUaW1lKHNuYXBzaG90LnN0YXJ0VGltZSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChzbmFwc2hvdC5lbmRUaW1lKSB7XG4gICAgICB0aGlzLnNldEVuZFRpbWUoc25hcHNob3QuZW5kVGltZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIG1ldGhvZHNcbiAgcHJpdmF0ZSBwYXJzZURhdGUoZGF0ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBkYXRlO1xuICAgIHJldHVybiBwYXJzZUlTT0RhdGUoZGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldE5leHRNb250aChkYXRlOiBEYXRlKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgMSk7XG4gIH1cblxuICBwcml2YXRlIGdldFByZXZpb3VzTW9udGgoZGF0ZTogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlU2hvcnQoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICAgIHJldHVybiBgJHtkYXRlLmdldERhdGUoKX0gJHttb250aHNbZGF0ZS5nZXRNb250aCgpXX1gO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core headless date range logic
3
+ * Import from here for clean barrel exports
4
+ */
5
+ export * from './dual-date-range.store';
6
+ export * from './preset.engine';
7
+ export * from './range.validator';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29yZSBoZWFkbGVzcyBkYXRlIHJhbmdlIGxvZ2ljXG4gKiBJbXBvcnQgZnJvbSBoZXJlIGZvciBjbGVhbiBiYXJyZWwgZXhwb3J0c1xuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZHVhbC1kYXRlLXJhbmdlLnN0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJlc2V0LmVuZ2luZSc7XG5leHBvcnQgKiBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG4iXX0=
@@ -0,0 +1,209 @@
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
+ import { formatISODate } from './range.validator';
7
+ /**
8
+ * Registry of built-in presets
9
+ * Can be extended by consumers
10
+ */
11
+ export class PresetEngine {
12
+ presets = new Map();
13
+ constructor() {
14
+ this.registerBuiltInPresets();
15
+ }
16
+ /**
17
+ * Register a custom preset
18
+ */
19
+ register(key, preset) {
20
+ this.presets.set(key, preset);
21
+ }
22
+ /**
23
+ * Resolve a preset to date range
24
+ */
25
+ resolve(key, now = new Date()) {
26
+ const preset = this.presets.get(key);
27
+ if (!preset)
28
+ return null;
29
+ const { start, end } = preset.resolve(now);
30
+ return {
31
+ start: formatISODate(start),
32
+ end: formatISODate(end)
33
+ };
34
+ }
35
+ /**
36
+ * Get all available preset keys
37
+ */
38
+ getPresetKeys() {
39
+ return Array.from(this.presets.keys());
40
+ }
41
+ /**
42
+ * Register all built-in presets
43
+ */
44
+ registerBuiltInPresets() {
45
+ // Today
46
+ this.register('TODAY', {
47
+ resolve: (now) => ({ start: now, end: now })
48
+ });
49
+ // Yesterday
50
+ this.register('YESTERDAY', {
51
+ resolve: (now) => {
52
+ const date = new Date(now);
53
+ date.setDate(date.getDate() - 1);
54
+ return { start: date, end: date };
55
+ }
56
+ });
57
+ // Last N Days
58
+ this.register('LAST_7_DAYS', {
59
+ resolve: (now) => {
60
+ const end = new Date(now);
61
+ const start = new Date(now);
62
+ start.setDate(start.getDate() - 6);
63
+ return { start, end };
64
+ }
65
+ });
66
+ this.register('LAST_14_DAYS', {
67
+ resolve: (now) => {
68
+ const end = new Date(now);
69
+ const start = new Date(now);
70
+ start.setDate(start.getDate() - 13);
71
+ return { start, end };
72
+ }
73
+ });
74
+ this.register('LAST_30_DAYS', {
75
+ resolve: (now) => {
76
+ const end = new Date(now);
77
+ const start = new Date(now);
78
+ start.setDate(start.getDate() - 29);
79
+ return { start, end };
80
+ }
81
+ });
82
+ this.register('LAST_60_DAYS', {
83
+ resolve: (now) => {
84
+ const end = new Date(now);
85
+ const start = new Date(now);
86
+ start.setDate(start.getDate() - 59);
87
+ return { start, end };
88
+ }
89
+ });
90
+ this.register('LAST_90_DAYS', {
91
+ resolve: (now) => {
92
+ const end = new Date(now);
93
+ const start = new Date(now);
94
+ start.setDate(start.getDate() - 89);
95
+ return { start, end };
96
+ }
97
+ });
98
+ // This Week (Monday to Sunday)
99
+ this.register('THIS_WEEK', {
100
+ resolve: (now) => {
101
+ const dayOfWeek = now.getDay();
102
+ const start = new Date(now);
103
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
104
+ start.setDate(start.getDate() - daysToMonday);
105
+ const end = new Date(start);
106
+ end.setDate(end.getDate() + 6);
107
+ return { start, end };
108
+ }
109
+ });
110
+ // Last Week
111
+ this.register('LAST_WEEK', {
112
+ resolve: (now) => {
113
+ const dayOfWeek = now.getDay();
114
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
115
+ const lastMonday = new Date(now);
116
+ lastMonday.setDate(lastMonday.getDate() - daysToMonday - 7);
117
+ const lastSunday = new Date(lastMonday);
118
+ lastSunday.setDate(lastSunday.getDate() + 6);
119
+ return { start: lastMonday, end: lastSunday };
120
+ }
121
+ });
122
+ // This Month
123
+ this.register('THIS_MONTH', {
124
+ resolve: (now) => {
125
+ const start = new Date(now.getFullYear(), now.getMonth(), 1);
126
+ const end = new Date(now.getFullYear(), now.getMonth() + 1, 0);
127
+ return { start, end };
128
+ }
129
+ });
130
+ // Last Month
131
+ this.register('LAST_MONTH', {
132
+ resolve: (now) => {
133
+ const start = new Date(now.getFullYear(), now.getMonth() - 1, 1);
134
+ const end = new Date(now.getFullYear(), now.getMonth(), 0);
135
+ return { start, end };
136
+ }
137
+ });
138
+ // Month to Date
139
+ this.register('MONTH_TO_DATE', {
140
+ resolve: (now) => {
141
+ const start = new Date(now.getFullYear(), now.getMonth(), 1);
142
+ return { start, end: now };
143
+ }
144
+ });
145
+ // This Quarter
146
+ this.register('THIS_QUARTER', {
147
+ resolve: (now) => {
148
+ const currentMonth = now.getMonth();
149
+ const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
150
+ const start = new Date(now.getFullYear(), quarterStartMonth, 1);
151
+ const end = new Date(now.getFullYear(), quarterStartMonth + 3, 0);
152
+ return { start, end };
153
+ }
154
+ });
155
+ // Last Quarter
156
+ this.register('LAST_QUARTER', {
157
+ resolve: (now) => {
158
+ const currentMonth = now.getMonth();
159
+ const lastQuarterStartMonth = Math.floor(currentMonth / 3) * 3 - 3;
160
+ const start = new Date(now.getFullYear(), lastQuarterStartMonth, 1);
161
+ const end = new Date(now.getFullYear(), lastQuarterStartMonth + 3, 0);
162
+ return { start, end };
163
+ }
164
+ });
165
+ // Quarter to Date
166
+ this.register('QUARTER_TO_DATE', {
167
+ resolve: (now) => {
168
+ const currentMonth = now.getMonth();
169
+ const quarterStartMonth = Math.floor(currentMonth / 3) * 3;
170
+ const start = new Date(now.getFullYear(), quarterStartMonth, 1);
171
+ return { start, end: now };
172
+ }
173
+ });
174
+ // This Year
175
+ this.register('THIS_YEAR', {
176
+ resolve: (now) => {
177
+ const start = new Date(now.getFullYear(), 0, 1);
178
+ const end = new Date(now.getFullYear(), 11, 31);
179
+ return { start, end };
180
+ }
181
+ });
182
+ // Last Year
183
+ this.register('LAST_YEAR', {
184
+ resolve: (now) => {
185
+ const start = new Date(now.getFullYear() - 1, 0, 1);
186
+ const end = new Date(now.getFullYear() - 1, 11, 31);
187
+ return { start, end };
188
+ }
189
+ });
190
+ // Year to Date
191
+ this.register('YEAR_TO_DATE', {
192
+ resolve: (now) => {
193
+ const start = new Date(now.getFullYear(), 0, 1);
194
+ return { start, end: now };
195
+ }
196
+ });
197
+ }
198
+ }
199
+ /**
200
+ * Create a custom preset from a function
201
+ */
202
+ export function createPreset(resolver) {
203
+ return { resolve: resolver };
204
+ }
205
+ /**
206
+ * Singleton preset engine instance
207
+ */
208
+ export const presetEngine = new PresetEngine();
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LmVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb3JlL3ByZXNldC5lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWVsRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztJQUVqRDtRQUNFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxHQUFXLEVBQUUsTUFBbUI7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FBQyxHQUFXLEVBQUUsTUFBWSxJQUFJLElBQUksRUFBRTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXpCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDM0IsR0FBRyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUM7U0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUM1QixRQUFRO1FBQ1IsSUFB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Q0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsUUFBbUQ7SUFFbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGVhZGxlc3MgUHJlc2V0IEVuZ2luZVxuICogUHVyZSBmdW5jdGlvbnMgdGhhdCByZXNvbHZlIGRhdGUgcmFuZ2VzIFdJVEhPVVQgcmVuZGVyIGRlcGVuZGVuY3lcbiAqIFBlcmZlY3QgZm9yIFNTUiwgZ2xvYmFsIHN0YXRlLCBkYXNoYm9hcmQgZmlsdGVyc1xuICovXG5cbmltcG9ydCB7IGZvcm1hdElTT0RhdGUgfSBmcm9tICcuL3JhbmdlLnZhbGlkYXRvcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VQcmVzZXQge1xuICAvKipcbiAgICogUmVzb2x2ZSBwcmVzZXQgdG8gYWN0dWFsIGRhdGUgcmFuZ2VcbiAgICogQHBhcmFtIG5vdyAtIEN1cnJlbnQgZGF0ZSBmb3IgZGV0ZXJtaW5pc3RpYyBjYWxjdWxhdGlvblxuICAgKi9cbiAgcmVzb2x2ZShub3c6IERhdGUpOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRSYW5nZSB7XG4gIHN0YXJ0OiBzdHJpbmc7IC8vIElTTyBmb3JtYXRcbiAgZW5kOiBzdHJpbmc7IC8vIElTTyBmb3JtYXRcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSBvZiBidWlsdC1pbiBwcmVzZXRzXG4gKiBDYW4gYmUgZXh0ZW5kZWQgYnkgY29uc3VtZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVzZXRFbmdpbmUge1xuICBwcml2YXRlIHByZXNldHMgPSBuZXcgTWFwPHN0cmluZywgUmFuZ2VQcmVzZXQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RlckJ1aWx0SW5QcmVzZXRzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjdXN0b20gcHJlc2V0XG4gICAqL1xuICByZWdpc3RlcihrZXk6IHN0cmluZywgcHJlc2V0OiBSYW5nZVByZXNldCk6IHZvaWQge1xuICAgIHRoaXMucHJlc2V0cy5zZXQoa2V5LCBwcmVzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBwcmVzZXQgdG8gZGF0ZSByYW5nZVxuICAgKi9cbiAgcmVzb2x2ZShrZXk6IHN0cmluZywgbm93OiBEYXRlID0gbmV3IERhdGUoKSk6IFByZXNldFJhbmdlIHwgbnVsbCB7XG4gICAgY29uc3QgcHJlc2V0ID0gdGhpcy5wcmVzZXRzLmdldChrZXkpO1xuICAgIGlmICghcHJlc2V0KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gcHJlc2V0LnJlc29sdmUobm93KTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IGZvcm1hdElTT0RhdGUoc3RhcnQpLFxuICAgICAgZW5kOiBmb3JtYXRJU09EYXRlKGVuZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgYXZhaWxhYmxlIHByZXNldCBrZXlzXG4gICAqL1xuICBnZXRQcmVzZXRLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByZXNldHMua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbGwgYnVpbHQtaW4gcHJlc2V0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckJ1aWx0SW5QcmVzZXRzKCk6IHZvaWQge1xuICAgIC8vIFRvZGF5XG4gICAgdGhpcy5yZWdpc3RlcignVE9EQVknLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiAoeyBzdGFydDogbm93LCBlbmQ6IG5vdyB9KVxuICAgIH0pO1xuXG4gICAgLy8gWWVzdGVyZGF5XG4gICAgdGhpcy5yZWdpc3RlcignWUVTVEVSREFZJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGRhdGUgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgTiBEYXlzXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF83X0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgLSA2KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF8xNF9EQVlTJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gMTMpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUXzMwX0RBWVMnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShzdGFydC5nZXREYXRlKCkgLSAyOSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfNjBfREFZUycsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgICBzdGFydC5zZXREYXRlKHN0YXJ0LmdldERhdGUoKSAtIDU5KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcignTEFTVF85MF9EQVlTJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cpO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gODkpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUaGlzIFdlZWsgKE1vbmRheSB0byBTdW5kYXkpXG4gICAgdGhpcy5yZWdpc3RlcignVEhJU19XRUVLJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBkYXlPZldlZWsgPSBub3cuZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93KTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpIC0gZGF5c1RvTW9uZGF5KTtcblxuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShzdGFydCk7XG4gICAgICAgIGVuZC5zZXREYXRlKGVuZC5nZXREYXRlKCkgKyA2KTtcblxuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMYXN0IFdlZWtcbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUX1dFRUsnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9IG5vdy5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgZGF5c1RvTW9uZGF5ID0gZGF5T2ZXZWVrID09PSAwID8gNiA6IGRheU9mV2VlayAtIDE7XG5cbiAgICAgICAgY29uc3QgbGFzdE1vbmRheSA9IG5ldyBEYXRlKG5vdyk7XG4gICAgICAgIGxhc3RNb25kYXkuc2V0RGF0ZShsYXN0TW9uZGF5LmdldERhdGUoKSAtIGRheXNUb01vbmRheSAtIDcpO1xuXG4gICAgICAgIGNvbnN0IGxhc3RTdW5kYXkgPSBuZXcgRGF0ZShsYXN0TW9uZGF5KTtcbiAgICAgICAgbGFzdFN1bmRheS5zZXREYXRlKGxhc3RTdW5kYXkuZ2V0RGF0ZSgpICsgNik7XG5cbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGxhc3RNb25kYXksIGVuZDogbGFzdFN1bmRheSB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBNb250aFxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfTU9OVEgnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIG5vdy5nZXRNb250aCgpICsgMSwgMCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgTW9udGhcbiAgICB0aGlzLnJlZ2lzdGVyKCdMQVNUX01PTlRIJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBub3cuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIDApO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBNb250aCB0byBEYXRlXG4gICAgdGhpcy5yZWdpc3RlcignTU9OVEhfVE9fREFURScsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbm93LmdldE1vbnRoKCksIDEpO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kOiBub3cgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRoaXMgUXVhcnRlclxuICAgIHRoaXMucmVnaXN0ZXIoJ1RISVNfUVVBUlRFUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IHF1YXJ0ZXJTdGFydE1vbnRoID0gTWF0aC5mbG9vcihjdXJyZW50TW9udGggLyAzKSAqIDM7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIHF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIHF1YXJ0ZXJTdGFydE1vbnRoICsgMywgMCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgUXVhcnRlclxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfUVVBUlRFUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICAgIGNvbnN0IGxhc3RRdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzIC0gMztcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgbGFzdFF1YXJ0ZXJTdGFydE1vbnRoLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIGxhc3RRdWFydGVyU3RhcnRNb250aCArIDMsIDApO1xuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBRdWFydGVyIHRvIERhdGVcbiAgICB0aGlzLnJlZ2lzdGVyKCdRVUFSVEVSX1RPX0RBVEUnLCB7XG4gICAgICByZXNvbHZlOiAobm93KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IG5vdy5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCBxdWFydGVyU3RhcnRNb250aCA9IE1hdGguZmxvb3IoY3VycmVudE1vbnRoIC8gMykgKiAzO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCBxdWFydGVyU3RhcnRNb250aCwgMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQ6IG5vdyB9O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBZZWFyXG4gICAgdGhpcy5yZWdpc3RlcignVEhJU19ZRUFSJywge1xuICAgICAgcmVzb2x2ZTogKG5vdykgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKG5vdy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUobm93LmdldEZ1bGxZZWFyKCksIDExLCAzMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExhc3QgWWVhclxuICAgIHRoaXMucmVnaXN0ZXIoJ0xBU1RfWUVBUicsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSAtIDEsIDExLCAzMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFllYXIgdG8gRGF0ZVxuICAgIHRoaXMucmVnaXN0ZXIoJ1lFQVJfVE9fREFURScsIHtcbiAgICAgIHJlc29sdmU6IChub3cpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShub3cuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQ6IG5vdyB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY3VzdG9tIHByZXNldCBmcm9tIGEgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByZXNldChcbiAgcmVzb2x2ZXI6IChub3c6IERhdGUpID0+IHsgc3RhcnQ6IERhdGU7IGVuZDogRGF0ZSB9XG4pOiBSYW5nZVByZXNldCB7XG4gIHJldHVybiB7IHJlc29sdmU6IHJlc29sdmVyIH07XG59XG5cbi8qKlxuICogU2luZ2xldG9uIHByZXNldCBlbmdpbmUgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IHByZXNldEVuZ2luZSA9IG5ldyBQcmVzZXRFbmdpbmUoKTtcbiJdfQ==