@oneluiz/dual-datepicker 3.9.3 → 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.
Files changed (47) hide show
  1. package/dual-datepicker.component.d.ts +4 -4
  2. package/esm2022/core/internal.mjs +92 -0
  3. package/esm2022/core/public.mjs +94 -0
  4. package/esm2022/core/testing/date.helpers.mjs +49 -0
  5. package/esm2022/core/testing/fixed-clock.mjs +30 -0
  6. package/esm2022/core/testing/index.mjs +8 -0
  7. package/esm2022/dual-datepicker.component.mjs +34 -32
  8. package/esm2022/public-api.mjs +39 -9
  9. package/fesm2022/oneluiz-dual-datepicker.mjs +629 -975
  10. package/fesm2022/oneluiz-dual-datepicker.mjs.map +1 -1
  11. package/package.json +11 -1
  12. package/public-api.d.ts +39 -4
  13. package/core/built-in-presets.d.ts +0 -98
  14. package/core/calendar-grid/cache.config.d.ts +0 -34
  15. package/core/calendar-grid/calendar-grid.cache.d.ts +0 -39
  16. package/core/calendar-grid/calendar-grid.factory.d.ts +0 -26
  17. package/core/calendar-grid/calendar-grid.types.d.ts +0 -57
  18. package/core/calendar-grid/index.d.ts +0 -56
  19. package/core/calendar-grid/range-highlighter.cache.d.ts +0 -106
  20. package/core/calendar-grid/range-highlighter.d.ts +0 -85
  21. package/core/calendar-grid/range-highlighter.types.d.ts +0 -182
  22. package/core/calendar-grid/virtual-weeks.logic.d.ts +0 -116
  23. package/core/calendar-grid/virtual-weeks.types.d.ts +0 -71
  24. package/core/date-adapter.d.ts +0 -298
  25. package/core/date-clock.d.ts +0 -82
  26. package/core/dual-date-range.store.d.ts +0 -113
  27. package/core/index.d.ts +0 -33
  28. package/core/native-date-adapter.d.ts +0 -152
  29. package/core/preset-providers.d.ts +0 -176
  30. package/core/preset-registry.d.ts +0 -181
  31. package/core/preset.engine.d.ts +0 -124
  32. package/core/range-preset.plugin.d.ts +0 -188
  33. package/core/range.validator.d.ts +0 -37
  34. package/core/system-clock.d.ts +0 -13
  35. package/date-adapter.d.ts +0 -116
  36. package/esm2022/core/calendar-grid/index.mjs +0 -57
  37. package/esm2022/core/index.mjs +0 -37
  38. package/esm2022/date-adapter.mjs +0 -12
  39. package/esm2022/native-date-adapter.mjs +0 -117
  40. package/esm2022/preset-utils.mjs +0 -276
  41. package/native-date-adapter.d.ts +0 -26
  42. package/preset-utils.d.ts +0 -91
  43. package/src/themes/bootstrap.scss +0 -202
  44. package/src/themes/bulma.scss +0 -209
  45. package/src/themes/custom.scss +0 -236
  46. package/src/themes/foundation.scss +0 -201
  47. 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/dual-date-range.store';
4
- import { VirtualWeeksConfig } from './core/calendar-grid';
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<any>;
92
- previousMonth: import("@angular/core").WritableSignal<any>;
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