@oneluiz/dual-datepicker 3.9.2 → 4.0.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/dual-datepicker.component.d.ts +4 -4
- package/esm2022/core/internal.mjs +92 -0
- package/esm2022/core/public.mjs +94 -0
- package/esm2022/core/testing/date.helpers.mjs +49 -0
- package/esm2022/core/testing/fixed-clock.mjs +30 -0
- package/esm2022/core/testing/index.mjs +8 -0
- package/esm2022/dual-datepicker.component.mjs +34 -32
- package/esm2022/public-api.mjs +39 -9
- package/fesm2022/oneluiz-dual-datepicker.mjs +629 -975
- package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
- package/package.json +11 -1
- package/public-api.d.ts +39 -4
- package/core/built-in-presets.d.ts +0 -98
- package/core/calendar-grid/cache.config.d.ts +0 -34
- package/core/calendar-grid/calendar-grid.cache.d.ts +0 -39
- package/core/calendar-grid/calendar-grid.factory.d.ts +0 -26
- package/core/calendar-grid/calendar-grid.types.d.ts +0 -57
- package/core/calendar-grid/index.d.ts +0 -56
- package/core/calendar-grid/range-highlighter.cache.d.ts +0 -106
- package/core/calendar-grid/range-highlighter.d.ts +0 -85
- package/core/calendar-grid/range-highlighter.types.d.ts +0 -182
- package/core/calendar-grid/virtual-weeks.logic.d.ts +0 -116
- package/core/calendar-grid/virtual-weeks.types.d.ts +0 -71
- package/core/date-adapter.d.ts +0 -298
- package/core/date-clock.d.ts +0 -82
- package/core/dual-date-range.store.d.ts +0 -113
- package/core/index.d.ts +0 -33
- package/core/native-date-adapter.d.ts +0 -152
- package/core/preset-providers.d.ts +0 -176
- package/core/preset-registry.d.ts +0 -181
- package/core/preset.engine.d.ts +0 -124
- package/core/range-preset.plugin.d.ts +0 -188
- package/core/range.validator.d.ts +0 -37
- package/core/system-clock.d.ts +0 -13
- package/date-adapter.d.ts +0 -116
- package/esm2022/core/calendar-grid/index.mjs +0 -57
- package/esm2022/core/index.mjs +0 -37
- package/esm2022/date-adapter.mjs +0 -12
- package/esm2022/native-date-adapter.mjs +0 -117
- package/esm2022/preset-utils.mjs +0 -276
- package/native-date-adapter.d.ts +0 -26
- package/preset-utils.d.ts +0 -91
- package/src/themes/bootstrap.scss +0 -202
- package/src/themes/bulma.scss +0 -209
- package/src/themes/custom.scss +0 -236
- package/src/themes/foundation.scss +0 -201
- package/src/themes/tailwind.scss +0 -109
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter, OnInit, OnChanges, SimpleChanges, ElementRef } from '@angular/core';
|
|
2
2
|
import { ControlValueAccessor } from '@angular/forms';
|
|
3
|
-
import { DualDateRangeStore } from './core/
|
|
4
|
-
import { VirtualWeeksConfig } from './core/
|
|
3
|
+
import { DualDateRangeStore } from './core/public';
|
|
4
|
+
import { VirtualWeeksConfig } from './core/internal';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export interface DateRange {
|
|
7
7
|
startDate: string;
|
|
@@ -88,8 +88,8 @@ export declare class DualDatepickerComponent implements OnInit, OnChanges, Contr
|
|
|
88
88
|
private highlighterCache;
|
|
89
89
|
protected readonly rangeStore: DualDateRangeStore;
|
|
90
90
|
showDatePicker: import("@angular/core").WritableSignal<boolean>;
|
|
91
|
-
currentMonth: import("@angular/core").WritableSignal<
|
|
92
|
-
previousMonth: import("@angular/core").WritableSignal<
|
|
91
|
+
currentMonth: import("@angular/core").WritableSignal<Date>;
|
|
92
|
+
previousMonth: import("@angular/core").WritableSignal<Date>;
|
|
93
93
|
currentMonthDays: import("@angular/core").WritableSignal<any[]>;
|
|
94
94
|
previousMonthDays: import("@angular/core").WritableSignal<any[]>;
|
|
95
95
|
isDisabled: import("@angular/core").WritableSignal<boolean>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* INTERNAL API for @oneluiz/dual-datepicker
|
|
3
|
+
*
|
|
4
|
+
* This file exports implementation details required by the component itself.
|
|
5
|
+
* These exports are NOT part of the public API and may change without notice.
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ DO NOT import from this file in your application code.
|
|
8
|
+
* ⚠️ Use the public API from '@oneluiz/dual-datepicker/core' instead.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
* @since v4.0.0
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* CalendarGridFactory - Deterministic grid generation
|
|
16
|
+
*
|
|
17
|
+
* Creates normalized 42-cell grids (6 weeks × 7 days).
|
|
18
|
+
* Pure function approach with no side effects.
|
|
19
|
+
*
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export { CalendarGridFactory } from './calendar-grid/calendar-grid.factory';
|
|
23
|
+
/**
|
|
24
|
+
* CalendarGridCache - LRU cache for grid structures
|
|
25
|
+
*
|
|
26
|
+
* Memoizes calendar grids by month/weekStart/locale.
|
|
27
|
+
* Prevents redundant grid generation on re-renders.
|
|
28
|
+
*
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export { CalendarGridCache } from './calendar-grid/calendar-grid.cache';
|
|
32
|
+
/**
|
|
33
|
+
* RangeHighlighter - Pure decoration logic
|
|
34
|
+
*
|
|
35
|
+
* Applies range highlighting to calendar grids.
|
|
36
|
+
* Handles start/end/hover/disabled states.
|
|
37
|
+
*
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
export { RangeHighlighter } from './calendar-grid/range-highlighter';
|
|
41
|
+
/**
|
|
42
|
+
* RangeHighlighterCache - LRU cache for decorated grids
|
|
43
|
+
*
|
|
44
|
+
* Memoizes decorated grids by range parameters.
|
|
45
|
+
* Eliminates redundant decoration computations.
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export { RangeHighlighterCache } from './calendar-grid/range-highlighter.cache';
|
|
50
|
+
/**
|
|
51
|
+
* Virtual Weeks Logic
|
|
52
|
+
*
|
|
53
|
+
* Functions for calculating visible week windows.
|
|
54
|
+
* Enables progressive rendering and infinite scroll.
|
|
55
|
+
*
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
export { getVisibleWeeks, navigateWeekWindow, isVirtualWeeksEnabled } from './calendar-grid/virtual-weeks.logic';
|
|
59
|
+
// ============================================================================
|
|
60
|
+
// CACHE CONFIGURATION (v3.9.2+)
|
|
61
|
+
// ============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* Cache Configuration
|
|
64
|
+
*
|
|
65
|
+
* Shared cache size limits for memory safety.
|
|
66
|
+
* MAX_CACHE_ENTRIES = 48 (4 years of navigation)
|
|
67
|
+
*
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
export { MAX_CACHE_ENTRIES } from './calendar-grid/cache.config';
|
|
71
|
+
/**
|
|
72
|
+
* SystemClock - Default implementation
|
|
73
|
+
*
|
|
74
|
+
* Uses native Date.now() and new Date().
|
|
75
|
+
* Default time source for production.
|
|
76
|
+
*
|
|
77
|
+
* @internal
|
|
78
|
+
*/
|
|
79
|
+
export { SystemClock } from './system-clock';
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// TESTING UTILITIES
|
|
82
|
+
// ============================================================================
|
|
83
|
+
/**
|
|
84
|
+
* Testing Helpers
|
|
85
|
+
*
|
|
86
|
+
* Utilities for writing deterministic tests.
|
|
87
|
+
* FixedClock, makeDate, etc.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
export * from './testing';
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9pbnRlcm5hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFvQkg7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQXFCeEU7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXJFOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQW1CaEY7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFDTCxlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUN0QixNQUFNLHFDQUFxQyxDQUFDO0FBRTdDLCtFQUErRTtBQUMvRSxnQ0FBZ0M7QUFDaEMsK0VBQStFO0FBRS9FOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQWdCakU7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QywrRUFBK0U7QUFDL0Usb0JBQW9CO0FBQ3BCLCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBQ0gsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElOVEVSTkFMIEFQSSBmb3IgQG9uZWx1aXovZHVhbC1kYXRlcGlja2VyXG4gKiBcbiAqIFRoaXMgZmlsZSBleHBvcnRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMgcmVxdWlyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYuXG4gKiBUaGVzZSBleHBvcnRzIGFyZSBOT1QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS5cbiAqIFxuICog4pqg77iPIERPIE5PVCBpbXBvcnQgZnJvbSB0aGlzIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiBjb2RlLlxuICog4pqg77iPIFVzZSB0aGUgcHVibGljIEFQSSBmcm9tICdAb25lbHVpei9kdWFsLWRhdGVwaWNrZXIvY29yZScgaW5zdGVhZC5cbiAqIFxuICogQGludGVybmFsXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIEBzaW5jZSB2NC4wLjBcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDQUxFTkRBUiBHUklEIFNZU1RFTSAodjMuNy4wKylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYWxlbmRhciBHcmlkIFR5cGVzXG4gKiBcbiAqIENvcmUgdHlwZXMgZm9yIDQyLWNlbGwgY2FsZW5kYXIgZ3JpZCBzdHJ1Y3R1cmUuXG4gKiBVc2VkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBtb250aCB2aWV3cy5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgQ2FsZW5kYXJHcmlkLFxuICBDYWxlbmRhckNlbGwsXG4gIENhbGVuZGFyR3JpZENhY2hlS2V5XG59IGZyb20gJy4vY2FsZW5kYXItZ3JpZC9jYWxlbmRhci1ncmlkLnR5cGVzJztcblxuLyoqXG4gKiBDYWxlbmRhckdyaWRGYWN0b3J5IC0gRGV0ZXJtaW5pc3RpYyBncmlkIGdlbmVyYXRpb25cbiAqIFxuICogQ3JlYXRlcyBub3JtYWxpemVkIDQyLWNlbGwgZ3JpZHMgKDYgd2Vla3Mgw5cgNyBkYXlzKS5cbiAqIFB1cmUgZnVuY3Rpb24gYXBwcm9hY2ggd2l0aCBubyBzaWRlIGVmZmVjdHMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBDYWxlbmRhckdyaWRGYWN0b3J5IH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL2NhbGVuZGFyLWdyaWQuZmFjdG9yeSc7XG5cbi8qKlxuICogQ2FsZW5kYXJHcmlkQ2FjaGUgLSBMUlUgY2FjaGUgZm9yIGdyaWQgc3RydWN0dXJlc1xuICogXG4gKiBNZW1vaXplcyBjYWxlbmRhciBncmlkcyBieSBtb250aC93ZWVrU3RhcnQvbG9jYWxlLlxuICogUHJldmVudHMgcmVkdW5kYW50IGdyaWQgZ2VuZXJhdGlvbiBvbiByZS1yZW5kZXJzLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgQ2FsZW5kYXJHcmlkQ2FjaGUgfSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvY2FsZW5kYXItZ3JpZC5jYWNoZSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJBTkdFIEhJR0hMSUdIVElORyBTWVNURU0gKHYzLjguMCspXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmFuZ2UgSGlnaGxpZ2h0ZXIgVHlwZXNcbiAqIFxuICogVHlwZXMgZm9yIGRlY29yYXRlZCBncmlkcyB3aXRoIHJhbmdlIGhpZ2hsaWdodGluZy5cbiAqIFVzZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdmlzdWFsIGRlY29yYXRpb25zLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUge1xuICBEZWNvcmF0ZWRHcmlkLFxuICBEZWNvcmF0ZWRDZWxsLFxuICBSYW5nZURlY29yYXRpb25QYXJhbXMsXG4gIERlY29yYXRlZEdyaWRDYWNoZUtleVxufSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvcmFuZ2UtaGlnaGxpZ2h0ZXIudHlwZXMnO1xuXG4vKipcbiAqIFJhbmdlSGlnaGxpZ2h0ZXIgLSBQdXJlIGRlY29yYXRpb24gbG9naWNcbiAqIFxuICogQXBwbGllcyByYW5nZSBoaWdobGlnaHRpbmcgdG8gY2FsZW5kYXIgZ3JpZHMuXG4gKiBIYW5kbGVzIHN0YXJ0L2VuZC9ob3Zlci9kaXNhYmxlZCBzdGF0ZXMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBSYW5nZUhpZ2hsaWdodGVyIH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL3JhbmdlLWhpZ2hsaWdodGVyJztcblxuLyoqXG4gKiBSYW5nZUhpZ2hsaWdodGVyQ2FjaGUgLSBMUlUgY2FjaGUgZm9yIGRlY29yYXRlZCBncmlkc1xuICogXG4gKiBNZW1vaXplcyBkZWNvcmF0ZWQgZ3JpZHMgYnkgcmFuZ2UgcGFyYW1ldGVycy5cbiAqIEVsaW1pbmF0ZXMgcmVkdW5kYW50IGRlY29yYXRpb24gY29tcHV0YXRpb25zLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHsgUmFuZ2VIaWdobGlnaHRlckNhY2hlIH0gZnJvbSAnLi9jYWxlbmRhci1ncmlkL3JhbmdlLWhpZ2hsaWdodGVyLmNhY2hlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVklSVFVBTCBXRUVLUyBTWVNURU0gKHYzLjkuMCspXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVmlydHVhbCBXZWVrcyBUeXBlc1xuICogXG4gKiBUeXBlcyBmb3Igd2luZG93ZWQgcmVuZGVyaW5nIG9mIGNhbGVuZGFyIHdlZWtzLlxuICogUmVkdWNlcyBET00gY29tcGxleGl0eSBmb3IgbGFyZ2UgY2FsZW5kYXJzLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUge1xuICBWaXJ0dWFsV2Vla3NDb25maWcsXG4gIFZpcnR1YWxXZWVrV2luZG93XG59IGZyb20gJy4vY2FsZW5kYXItZ3JpZC92aXJ0dWFsLXdlZWtzLnR5cGVzJztcblxuLyoqXG4gKiBWaXJ0dWFsIFdlZWtzIExvZ2ljXG4gKiBcbiAqIEZ1bmN0aW9ucyBmb3IgY2FsY3VsYXRpbmcgdmlzaWJsZSB3ZWVrIHdpbmRvd3MuXG4gKiBFbmFibGVzIHByb2dyZXNzaXZlIHJlbmRlcmluZyBhbmQgaW5maW5pdGUgc2Nyb2xsLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHtcbiAgZ2V0VmlzaWJsZVdlZWtzLFxuICBuYXZpZ2F0ZVdlZWtXaW5kb3csXG4gIGlzVmlydHVhbFdlZWtzRW5hYmxlZFxufSBmcm9tICcuL2NhbGVuZGFyLWdyaWQvdmlydHVhbC13ZWVrcy5sb2dpYyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENBQ0hFIENPTkZJR1VSQVRJT04gKHYzLjkuMispXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2FjaGUgQ29uZmlndXJhdGlvblxuICogXG4gKiBTaGFyZWQgY2FjaGUgc2l6ZSBsaW1pdHMgZm9yIG1lbW9yeSBzYWZldHkuXG4gKiBNQVhfQ0FDSEVfRU5UUklFUyA9IDQ4ICg0IHllYXJzIG9mIG5hdmlnYXRpb24pXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgeyBNQVhfQ0FDSEVfRU5UUklFUyB9IGZyb20gJy4vY2FsZW5kYXItZ3JpZC9jYWNoZS5jb25maWcnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEQVRFIENMT0NLIFNZU1RFTVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERhdGVDbG9jayAtIEFic3RyYWN0IHRpbWUgc291cmNlXG4gKiBcbiAqIEludGVyZmFjZSBmb3IgaW5qZWN0aW5nIGN1c3RvbSB0aW1lIHNvdXJjZXMuXG4gKiBFbmFibGVzIGRldGVybWluaXN0aWMgdGVzdGluZyBhbmQgU1NSLlxuICogXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IHR5cGUgeyBEYXRlQ2xvY2sgfSBmcm9tICcuL2RhdGUtY2xvY2snO1xuXG4vKipcbiAqIFN5c3RlbUNsb2NrIC0gRGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICogXG4gKiBVc2VzIG5hdGl2ZSBEYXRlLm5vdygpIGFuZCBuZXcgRGF0ZSgpLlxuICogRGVmYXVsdCB0aW1lIHNvdXJjZSBmb3IgcHJvZHVjdGlvbi5cbiAqIFxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCB7IFN5c3RlbUNsb2NrIH0gZnJvbSAnLi9zeXN0ZW0tY2xvY2snO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBURVNUSU5HIFVUSUxJVElFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFRlc3RpbmcgSGVscGVyc1xuICogXG4gKiBVdGlsaXRpZXMgZm9yIHdyaXRpbmcgZGV0ZXJtaW5pc3RpYyB0ZXN0cy5cbiAqIEZpeGVkQ2xvY2ssIG1ha2VEYXRlLCBldGMuXG4gKiBcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgKiBmcm9tICcuL3Rlc3RpbmcnO1xuIl19
|
|
@@ -0,0 +1,94 @@
|
|
|
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
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date Test Helpers
|
|
3
|
+
*
|
|
4
|
+
* Utilities for creating deterministic dates in tests.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a Date in local timezone
|
|
8
|
+
*
|
|
9
|
+
* @param year - Full year (e.g., 2026)
|
|
10
|
+
* @param month - Month 1-12 (natural notation)
|
|
11
|
+
* @param day - Day of month 1-31
|
|
12
|
+
* @returns Date at 00:00:00.000 local time
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* makeDate(2026, 2, 21) // Feb 21, 2026 00:00:00.000
|
|
16
|
+
*/
|
|
17
|
+
export function makeDate(year, month, day) {
|
|
18
|
+
return new Date(year, month - 1, day); // month-1 because Date uses 0-indexed months
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create ISO date string (YYYY-MM-DD)
|
|
22
|
+
*
|
|
23
|
+
* @param year - Full year (e.g., 2026)
|
|
24
|
+
* @param month - Month 1-12 (natural notation)
|
|
25
|
+
* @param day - Day of month 1-31
|
|
26
|
+
* @returns ISO date string
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* iso(2026, 2, 21) // '2026-02-21'
|
|
30
|
+
*/
|
|
31
|
+
export function iso(year, month, day) {
|
|
32
|
+
const y = String(year).padStart(4, '0');
|
|
33
|
+
const m = String(month).padStart(2, '0');
|
|
34
|
+
const d = String(day).padStart(2, '0');
|
|
35
|
+
return `${y}-${m}-${d}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Compare two dates for equality (ignoring time)
|
|
39
|
+
*
|
|
40
|
+
* @param a - First date
|
|
41
|
+
* @param b - Second date
|
|
42
|
+
* @returns true if same calendar day
|
|
43
|
+
*/
|
|
44
|
+
export function isSameCalendarDay(a, b) {
|
|
45
|
+
return (a.getFullYear() === b.getFullYear() &&
|
|
46
|
+
a.getMonth() === b.getMonth() &&
|
|
47
|
+
a.getDate() === b.getDate());
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvcmUvdGVzdGluZy9kYXRlLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQVksRUFBRSxLQUFhLEVBQUUsR0FBVztJQUMvRCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsNkNBQTZDO0FBQ3RGLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBYSxFQUFFLEdBQVc7SUFDMUQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxDQUFPLEVBQUUsQ0FBTztJQUNoRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUU7UUFDbkMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUU7UUFDN0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FDNUIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGUgVGVzdCBIZWxwZXJzXG4gKiBcbiAqIFV0aWxpdGllcyBmb3IgY3JlYXRpbmcgZGV0ZXJtaW5pc3RpYyBkYXRlcyBpbiB0ZXN0cy5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIERhdGUgaW4gbG9jYWwgdGltZXpvbmVcbiAqIFxuICogQHBhcmFtIHllYXIgLSBGdWxsIHllYXIgKGUuZy4sIDIwMjYpXG4gKiBAcGFyYW0gbW9udGggLSBNb250aCAxLTEyIChuYXR1cmFsIG5vdGF0aW9uKVxuICogQHBhcmFtIGRheSAtIERheSBvZiBtb250aCAxLTMxXG4gKiBAcmV0dXJucyBEYXRlIGF0IDAwOjAwOjAwLjAwMCBsb2NhbCB0aW1lXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBtYWtlRGF0ZSgyMDI2LCAyLCAyMSkgLy8gRmViIDIxLCAyMDI2IDAwOjAwOjAwLjAwMFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZURhdGUoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyLCBkYXk6IG51bWJlcik6IERhdGUge1xuICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXkpOyAvLyBtb250aC0xIGJlY2F1c2UgRGF0ZSB1c2VzIDAtaW5kZXhlZCBtb250aHNcbn1cblxuLyoqXG4gKiBDcmVhdGUgSVNPIGRhdGUgc3RyaW5nIChZWVlZLU1NLUREKVxuICogXG4gKiBAcGFyYW0geWVhciAtIEZ1bGwgeWVhciAoZS5nLiwgMjAyNilcbiAqIEBwYXJhbSBtb250aCAtIE1vbnRoIDEtMTIgKG5hdHVyYWwgbm90YXRpb24pXG4gKiBAcGFyYW0gZGF5IC0gRGF5IG9mIG1vbnRoIDEtMzFcbiAqIEByZXR1cm5zIElTTyBkYXRlIHN0cmluZ1xuICogXG4gKiBAZXhhbXBsZVxuICogaXNvKDIwMjYsIDIsIDIxKSAvLyAnMjAyNi0wMi0yMSdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzbyh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIsIGRheTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgeSA9IFN0cmluZyh5ZWFyKS5wYWRTdGFydCg0LCAnMCcpO1xuICBjb25zdCBtID0gU3RyaW5nKG1vbnRoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBkID0gU3RyaW5nKGRheSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgcmV0dXJuIGAke3l9LSR7bX0tJHtkfWA7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gZGF0ZXMgZm9yIGVxdWFsaXR5IChpZ25vcmluZyB0aW1lKVxuICogXG4gKiBAcGFyYW0gYSAtIEZpcnN0IGRhdGVcbiAqIEBwYXJhbSBiIC0gU2Vjb25kIGRhdGVcbiAqIEByZXR1cm5zIHRydWUgaWYgc2FtZSBjYWxlbmRhciBkYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZUNhbGVuZGFyRGF5KGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhLmdldEZ1bGxZZWFyKCkgPT09IGIuZ2V0RnVsbFllYXIoKSAmJlxuICAgIGEuZ2V0TW9udGgoKSA9PT0gYi5nZXRNb250aCgpICYmXG4gICAgYS5nZXREYXRlKCkgPT09IGIuZ2V0RGF0ZSgpXG4gICk7XG59XG4iXX0=
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed Clock for Deterministic Testing
|
|
3
|
+
*
|
|
4
|
+
* Implements DateClock interface with a fixed date.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const clock = new FixedClock(new Date(2026, 1, 21)); // Feb 21, 2026
|
|
9
|
+
* const now = clock.now(); // Always returns Feb 21, 2026 (cloned)
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* Why clone?
|
|
13
|
+
* - Prevents test pollution if consumer mutates the returned date
|
|
14
|
+
* - Each call to now() returns a fresh Date instance
|
|
15
|
+
*/
|
|
16
|
+
export class FixedClock {
|
|
17
|
+
fixedDate;
|
|
18
|
+
constructor(fixedDate) {
|
|
19
|
+
this.fixedDate = fixedDate;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Returns a cloned copy of the fixed date
|
|
23
|
+
*
|
|
24
|
+
* Cloning prevents test pollution from mutations
|
|
25
|
+
*/
|
|
26
|
+
now() {
|
|
27
|
+
return new Date(this.fixedDate);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4ZWQtY2xvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS90ZXN0aW5nL2ZpeGVkLWNsb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBSUgsTUFBTSxPQUFPLFVBQVU7SUFDUTtJQUE3QixZQUE2QixTQUFlO1FBQWYsY0FBUyxHQUFULFNBQVMsQ0FBTTtJQUFHLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNILEdBQUc7UUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpeGVkIENsb2NrIGZvciBEZXRlcm1pbmlzdGljIFRlc3RpbmdcbiAqIFxuICogSW1wbGVtZW50cyBEYXRlQ2xvY2sgaW50ZXJmYWNlIHdpdGggYSBmaXhlZCBkYXRlLlxuICogXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNsb2NrID0gbmV3IEZpeGVkQ2xvY2sobmV3IERhdGUoMjAyNiwgMSwgMjEpKTsgLy8gRmViIDIxLCAyMDI2XG4gKiBjb25zdCBub3cgPSBjbG9jay5ub3coKTsgLy8gQWx3YXlzIHJldHVybnMgRmViIDIxLCAyMDI2IChjbG9uZWQpXG4gKiBgYGBcbiAqIFxuICogV2h5IGNsb25lP1xuICogLSBQcmV2ZW50cyB0ZXN0IHBvbGx1dGlvbiBpZiBjb25zdW1lciBtdXRhdGVzIHRoZSByZXR1cm5lZCBkYXRlXG4gKiAtIEVhY2ggY2FsbCB0byBub3coKSByZXR1cm5zIGEgZnJlc2ggRGF0ZSBpbnN0YW5jZVxuICovXG5cbmltcG9ydCB7IERhdGVDbG9jayB9IGZyb20gJy4uL2RhdGUtY2xvY2snO1xuXG5leHBvcnQgY2xhc3MgRml4ZWRDbG9jayBpbXBsZW1lbnRzIERhdGVDbG9jayB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZml4ZWREYXRlOiBEYXRlKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2xvbmVkIGNvcHkgb2YgdGhlIGZpeGVkIGRhdGVcbiAgICogXG4gICAqIENsb25pbmcgcHJldmVudHMgdGVzdCBwb2xsdXRpb24gZnJvbSBtdXRhdGlvbnNcbiAgICovXG4gIG5vdygpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5maXhlZERhdGUpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Helpers for deterministic date range testing.
|
|
5
|
+
*/
|
|
6
|
+
export { FixedClock } from './fixed-clock';
|
|
7
|
+
export { makeDate, iso, isSameCalendarDay } from './date.helpers';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS90ZXN0aW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlc3RpbmcgVXRpbGl0aWVzXG4gKiBcbiAqIEhlbHBlcnMgZm9yIGRldGVybWluaXN0aWMgZGF0ZSByYW5nZSB0ZXN0aW5nLlxuICovXG5cbmV4cG9ydCB7IEZpeGVkQ2xvY2sgfSBmcm9tICcuL2ZpeGVkLWNsb2NrJztcbmV4cG9ydCB7IG1ha2VEYXRlLCBpc28sIGlzU2FtZUNhbGVuZGFyRGF5IH0gZnJvbSAnLi9kYXRlLmhlbHBlcnMnO1xuIl19
|