@kalyx/core 0.2.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/LICENSE +21 -0
- package/README.md +17 -0
- package/dist/adapters/date-fns.d.ts +16 -0
- package/dist/adapters/date-fns.d.ts.map +1 -0
- package/dist/adapters/date-fns.js +148 -0
- package/dist/adapters/date-fns.js.map +1 -0
- package/dist/index.cjs +455 -0
- package/dist/index.d.cts +256 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +106 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/calendar.d.ts +35 -0
- package/dist/utils/calendar.d.ts.map +1 -0
- package/dist/utils/calendar.js +141 -0
- package/dist/utils/calendar.js.map +1 -0
- package/dist/utils/date.d.ts +22 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +66 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/locale.d.ts +33 -0
- package/dist/utils/locale.d.ts.map +1 -0
- package/dist/utils/locale.js +70 -0
- package/dist/utils/locale.js.map +1 -0
- package/dist/utils/time.d.ts +58 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +127 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +34 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jihoon Lee (jiji-hoon96)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @kalyx/core
|
|
2
|
+
|
|
3
|
+
> Platform-agnostic date logic for Kalyx. Types, adapters, and utilities.
|
|
4
|
+
|
|
5
|
+
This package is used internally by `@kalyx/react`. Most users should install `@kalyx/react` directly.
|
|
6
|
+
|
|
7
|
+
## What's inside
|
|
8
|
+
|
|
9
|
+
- **Types** — `ISODateString`, `DateRange`, `DateAdapter`, `CalendarDay`, `TimeValue`, etc.
|
|
10
|
+
- **DateFnsAdapter** — UTC-based date-fns adapter implementing `DateAdapter` interface
|
|
11
|
+
- **Calendar utils** — `getCalendarDays`, `isDateDisabled`
|
|
12
|
+
- **Time utils** — `setTime`, `getTime`, `parseTimeString`, `to12Hour`, `to24Hour`, `generateHours`, `generateMinutes`
|
|
13
|
+
- **Date utils** — `normalizeISO`, `parseInputValue`
|
|
14
|
+
|
|
15
|
+
## License
|
|
16
|
+
|
|
17
|
+
MIT
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DateAdapter } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* date-fns 기반 DateAdapter 구현체.
|
|
4
|
+
* 모든 연산은 UTC 기준으로 동작하여 timezone 간섭을 방지한다.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { DateFnsAdapter } from '@kalyx/core';
|
|
9
|
+
*
|
|
10
|
+
* DateFnsAdapter.format('2026-01-15T00:00:00.000Z', 'yyyy-MM-dd'); // "2026-01-15"
|
|
11
|
+
* DateFnsAdapter.addDays('2026-01-15T00:00:00.000Z', 7); // "2026-01-22T..."
|
|
12
|
+
* DateFnsAdapter.isSameDay('2026-01-15T00:00:00.000Z', '2026-01-15T23:59:59.000Z'); // true
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare const DateFnsAdapter: DateAdapter;
|
|
16
|
+
//# sourceMappingURL=date-fns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-fns.d.ts","sourceRoot":"","sources":["../../src/adapters/date-fns.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmD/C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,EAAE,WAsH5B,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { parseISO, addDays as dfAddDays, addMonths as dfAddMonths, addYears as dfAddYears, isBefore as dfIsBefore, isAfter as dfIsAfter, isValid as dfIsValid, } from 'date-fns';
|
|
2
|
+
function toDate(iso) {
|
|
3
|
+
return parseISO(iso);
|
|
4
|
+
}
|
|
5
|
+
function toISO(date) {
|
|
6
|
+
return date.toISOString();
|
|
7
|
+
}
|
|
8
|
+
/** ISO 날짜 문자열 정규화: "YYYY-MM-DD" → "YYYY-MM-DDTHH:mm:ss.sssZ" */
|
|
9
|
+
function normalize(value) {
|
|
10
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
|
|
11
|
+
return `${value}T00:00:00.000Z`;
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
/** UTC 기준으로 날짜의 자정을 반환한다 */
|
|
16
|
+
function utcStartOfDay(d) {
|
|
17
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
|
|
18
|
+
}
|
|
19
|
+
/** UTC 기준으로 월의 첫 날 자정을 반환한다 */
|
|
20
|
+
function utcStartOfMonth(d) {
|
|
21
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1));
|
|
22
|
+
}
|
|
23
|
+
/** UTC 기준으로 월의 마지막 날 23:59:59.999를 반환한다 */
|
|
24
|
+
function utcEndOfMonth(d) {
|
|
25
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 0, 23, 59, 59, 999));
|
|
26
|
+
}
|
|
27
|
+
/** UTC 기준 주의 시작일 */
|
|
28
|
+
function utcStartOfWeek(d, weekStartsOn) {
|
|
29
|
+
const day = d.getUTCDay();
|
|
30
|
+
const diff = (day - weekStartsOn + 7) % 7;
|
|
31
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() - diff));
|
|
32
|
+
}
|
|
33
|
+
/** UTC 기준 주의 마지막 날 */
|
|
34
|
+
function utcEndOfWeek(d, weekStartsOn) {
|
|
35
|
+
const start = utcStartOfWeek(d, weekStartsOn);
|
|
36
|
+
return new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate() + 6, 23, 59, 59, 999));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* date-fns 기반 DateAdapter 구현체.
|
|
40
|
+
* 모든 연산은 UTC 기준으로 동작하여 timezone 간섭을 방지한다.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* import { DateFnsAdapter } from '@kalyx/core';
|
|
45
|
+
*
|
|
46
|
+
* DateFnsAdapter.format('2026-01-15T00:00:00.000Z', 'yyyy-MM-dd'); // "2026-01-15"
|
|
47
|
+
* DateFnsAdapter.addDays('2026-01-15T00:00:00.000Z', 7); // "2026-01-22T..."
|
|
48
|
+
* DateFnsAdapter.isSameDay('2026-01-15T00:00:00.000Z', '2026-01-15T23:59:59.000Z'); // true
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export const DateFnsAdapter = {
|
|
52
|
+
parse(value) {
|
|
53
|
+
if (!value)
|
|
54
|
+
return '';
|
|
55
|
+
return normalize(value);
|
|
56
|
+
},
|
|
57
|
+
format(iso, formatStr) {
|
|
58
|
+
const d = toDate(iso);
|
|
59
|
+
// UTC 기반 포맷팅 (로컬 timezone 간섭 방지)
|
|
60
|
+
const tokens = {
|
|
61
|
+
yyyy: String(d.getUTCFullYear()),
|
|
62
|
+
MM: String(d.getUTCMonth() + 1).padStart(2, '0'),
|
|
63
|
+
dd: String(d.getUTCDate()).padStart(2, '0'),
|
|
64
|
+
HH: String(d.getUTCHours()).padStart(2, '0'),
|
|
65
|
+
mm: String(d.getUTCMinutes()).padStart(2, '0'),
|
|
66
|
+
ss: String(d.getUTCSeconds()).padStart(2, '0'),
|
|
67
|
+
M: String(d.getUTCMonth() + 1),
|
|
68
|
+
d: String(d.getUTCDate()),
|
|
69
|
+
};
|
|
70
|
+
let result = formatStr;
|
|
71
|
+
// 긴 토큰부터 치환해서 부분 매칭 방지
|
|
72
|
+
for (const [token, value] of Object.entries(tokens).sort((a, b) => b[0].length - a[0].length)) {
|
|
73
|
+
result = result.split(token).join(value);
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
},
|
|
77
|
+
addDays(iso, n) {
|
|
78
|
+
return toISO(dfAddDays(toDate(iso), n));
|
|
79
|
+
},
|
|
80
|
+
addMonths(iso, n) {
|
|
81
|
+
return toISO(dfAddMonths(toDate(iso), n));
|
|
82
|
+
},
|
|
83
|
+
addYears(iso, n) {
|
|
84
|
+
return toISO(dfAddYears(toDate(iso), n));
|
|
85
|
+
},
|
|
86
|
+
isBefore(a, b) {
|
|
87
|
+
return dfIsBefore(toDate(a), toDate(b));
|
|
88
|
+
},
|
|
89
|
+
isAfter(a, b) {
|
|
90
|
+
return dfIsAfter(toDate(a), toDate(b));
|
|
91
|
+
},
|
|
92
|
+
isSameDay(a, b) {
|
|
93
|
+
if (!a || !b)
|
|
94
|
+
return false;
|
|
95
|
+
const da = toDate(a);
|
|
96
|
+
const db = toDate(b);
|
|
97
|
+
return (da.getUTCFullYear() === db.getUTCFullYear() &&
|
|
98
|
+
da.getUTCMonth() === db.getUTCMonth() &&
|
|
99
|
+
da.getUTCDate() === db.getUTCDate());
|
|
100
|
+
},
|
|
101
|
+
isSameMonth(a, b) {
|
|
102
|
+
const da = toDate(a);
|
|
103
|
+
const db = toDate(b);
|
|
104
|
+
return (da.getUTCFullYear() === db.getUTCFullYear() &&
|
|
105
|
+
da.getUTCMonth() === db.getUTCMonth());
|
|
106
|
+
},
|
|
107
|
+
startOfDay(iso) {
|
|
108
|
+
return toISO(utcStartOfDay(toDate(iso)));
|
|
109
|
+
},
|
|
110
|
+
startOfMonth(iso) {
|
|
111
|
+
return toISO(utcStartOfMonth(toDate(iso)));
|
|
112
|
+
},
|
|
113
|
+
endOfMonth(iso) {
|
|
114
|
+
return toISO(utcEndOfMonth(toDate(iso)));
|
|
115
|
+
},
|
|
116
|
+
startOfWeek(iso, weekStartsOn = 0) {
|
|
117
|
+
return toISO(utcStartOfWeek(toDate(iso), weekStartsOn));
|
|
118
|
+
},
|
|
119
|
+
endOfWeek(iso, weekStartsOn = 0) {
|
|
120
|
+
return toISO(utcEndOfWeek(toDate(iso), weekStartsOn));
|
|
121
|
+
},
|
|
122
|
+
now() {
|
|
123
|
+
return new Date().toISOString();
|
|
124
|
+
},
|
|
125
|
+
today() {
|
|
126
|
+
return toISO(utcStartOfDay(new Date()));
|
|
127
|
+
},
|
|
128
|
+
isValid(value) {
|
|
129
|
+
if (!value)
|
|
130
|
+
return false;
|
|
131
|
+
const normalized = normalize(value);
|
|
132
|
+
const date = parseISO(normalized);
|
|
133
|
+
return dfIsValid(date);
|
|
134
|
+
},
|
|
135
|
+
getYear(iso) {
|
|
136
|
+
return toDate(iso).getUTCFullYear();
|
|
137
|
+
},
|
|
138
|
+
getMonth(iso) {
|
|
139
|
+
return toDate(iso).getUTCMonth();
|
|
140
|
+
},
|
|
141
|
+
getDate(iso) {
|
|
142
|
+
return toDate(iso).getUTCDate();
|
|
143
|
+
},
|
|
144
|
+
getDay(iso) {
|
|
145
|
+
return toDate(iso).getUTCDay();
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=date-fns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-fns.js","sourceRoot":"","sources":["../../src/adapters/date-fns.ts"],"names":[],"mappings":"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"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
DateFnsAdapter: () => DateFnsAdapter,
|
|
24
|
+
formatFullDate: () => formatFullDate,
|
|
25
|
+
formatMonthYear: () => formatMonthYear,
|
|
26
|
+
formatTimeFromISO: () => formatTimeFromISO,
|
|
27
|
+
formatTimeString: () => formatTimeString,
|
|
28
|
+
generateHours: () => generateHours,
|
|
29
|
+
generateMinutes: () => generateMinutes,
|
|
30
|
+
getCalendarDays: () => getCalendarDays,
|
|
31
|
+
getMonthName: () => getMonthName,
|
|
32
|
+
getTime: () => getTime,
|
|
33
|
+
getWeekdayNames: () => getWeekdayNames,
|
|
34
|
+
isDateDisabled: () => isDateDisabled,
|
|
35
|
+
isSameTime: () => isSameTime,
|
|
36
|
+
maxDate: () => maxDate,
|
|
37
|
+
minDate: () => minDate,
|
|
38
|
+
normalizeISO: () => normalizeISO,
|
|
39
|
+
parseInputValue: () => parseInputValue,
|
|
40
|
+
parseTimeString: () => parseTimeString,
|
|
41
|
+
setTime: () => setTime,
|
|
42
|
+
to12Hour: () => to12Hour,
|
|
43
|
+
to24Hour: () => to24Hour
|
|
44
|
+
});
|
|
45
|
+
module.exports = __toCommonJS(index_exports);
|
|
46
|
+
|
|
47
|
+
// src/adapters/date-fns.ts
|
|
48
|
+
var import_date_fns = require("date-fns");
|
|
49
|
+
function toDate(iso) {
|
|
50
|
+
return (0, import_date_fns.parseISO)(iso);
|
|
51
|
+
}
|
|
52
|
+
function toISO(date) {
|
|
53
|
+
return date.toISOString();
|
|
54
|
+
}
|
|
55
|
+
function normalize(value) {
|
|
56
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
|
|
57
|
+
return `${value}T00:00:00.000Z`;
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function utcStartOfDay(d) {
|
|
62
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));
|
|
63
|
+
}
|
|
64
|
+
function utcStartOfMonth(d) {
|
|
65
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1));
|
|
66
|
+
}
|
|
67
|
+
function utcEndOfMonth(d) {
|
|
68
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth() + 1, 0, 23, 59, 59, 999));
|
|
69
|
+
}
|
|
70
|
+
function utcStartOfWeek(d, weekStartsOn) {
|
|
71
|
+
const day = d.getUTCDay();
|
|
72
|
+
const diff = (day - weekStartsOn + 7) % 7;
|
|
73
|
+
return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate() - diff));
|
|
74
|
+
}
|
|
75
|
+
function utcEndOfWeek(d, weekStartsOn) {
|
|
76
|
+
const start = utcStartOfWeek(d, weekStartsOn);
|
|
77
|
+
return new Date(Date.UTC(
|
|
78
|
+
start.getUTCFullYear(),
|
|
79
|
+
start.getUTCMonth(),
|
|
80
|
+
start.getUTCDate() + 6,
|
|
81
|
+
23,
|
|
82
|
+
59,
|
|
83
|
+
59,
|
|
84
|
+
999
|
|
85
|
+
));
|
|
86
|
+
}
|
|
87
|
+
var DateFnsAdapter = {
|
|
88
|
+
parse(value) {
|
|
89
|
+
if (!value) return "";
|
|
90
|
+
return normalize(value);
|
|
91
|
+
},
|
|
92
|
+
format(iso, formatStr) {
|
|
93
|
+
const d = toDate(iso);
|
|
94
|
+
const tokens = {
|
|
95
|
+
yyyy: String(d.getUTCFullYear()),
|
|
96
|
+
MM: String(d.getUTCMonth() + 1).padStart(2, "0"),
|
|
97
|
+
dd: String(d.getUTCDate()).padStart(2, "0"),
|
|
98
|
+
HH: String(d.getUTCHours()).padStart(2, "0"),
|
|
99
|
+
mm: String(d.getUTCMinutes()).padStart(2, "0"),
|
|
100
|
+
ss: String(d.getUTCSeconds()).padStart(2, "0"),
|
|
101
|
+
M: String(d.getUTCMonth() + 1),
|
|
102
|
+
d: String(d.getUTCDate())
|
|
103
|
+
};
|
|
104
|
+
let result = formatStr;
|
|
105
|
+
for (const [token, value] of Object.entries(tokens).sort((a, b) => b[0].length - a[0].length)) {
|
|
106
|
+
result = result.split(token).join(value);
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
},
|
|
110
|
+
addDays(iso, n) {
|
|
111
|
+
return toISO((0, import_date_fns.addDays)(toDate(iso), n));
|
|
112
|
+
},
|
|
113
|
+
addMonths(iso, n) {
|
|
114
|
+
return toISO((0, import_date_fns.addMonths)(toDate(iso), n));
|
|
115
|
+
},
|
|
116
|
+
addYears(iso, n) {
|
|
117
|
+
return toISO((0, import_date_fns.addYears)(toDate(iso), n));
|
|
118
|
+
},
|
|
119
|
+
isBefore(a, b) {
|
|
120
|
+
return (0, import_date_fns.isBefore)(toDate(a), toDate(b));
|
|
121
|
+
},
|
|
122
|
+
isAfter(a, b) {
|
|
123
|
+
return (0, import_date_fns.isAfter)(toDate(a), toDate(b));
|
|
124
|
+
},
|
|
125
|
+
isSameDay(a, b) {
|
|
126
|
+
if (!a || !b) return false;
|
|
127
|
+
const da = toDate(a);
|
|
128
|
+
const db = toDate(b);
|
|
129
|
+
return da.getUTCFullYear() === db.getUTCFullYear() && da.getUTCMonth() === db.getUTCMonth() && da.getUTCDate() === db.getUTCDate();
|
|
130
|
+
},
|
|
131
|
+
isSameMonth(a, b) {
|
|
132
|
+
const da = toDate(a);
|
|
133
|
+
const db = toDate(b);
|
|
134
|
+
return da.getUTCFullYear() === db.getUTCFullYear() && da.getUTCMonth() === db.getUTCMonth();
|
|
135
|
+
},
|
|
136
|
+
startOfDay(iso) {
|
|
137
|
+
return toISO(utcStartOfDay(toDate(iso)));
|
|
138
|
+
},
|
|
139
|
+
startOfMonth(iso) {
|
|
140
|
+
return toISO(utcStartOfMonth(toDate(iso)));
|
|
141
|
+
},
|
|
142
|
+
endOfMonth(iso) {
|
|
143
|
+
return toISO(utcEndOfMonth(toDate(iso)));
|
|
144
|
+
},
|
|
145
|
+
startOfWeek(iso, weekStartsOn = 0) {
|
|
146
|
+
return toISO(utcStartOfWeek(toDate(iso), weekStartsOn));
|
|
147
|
+
},
|
|
148
|
+
endOfWeek(iso, weekStartsOn = 0) {
|
|
149
|
+
return toISO(utcEndOfWeek(toDate(iso), weekStartsOn));
|
|
150
|
+
},
|
|
151
|
+
now() {
|
|
152
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
153
|
+
},
|
|
154
|
+
today() {
|
|
155
|
+
return toISO(utcStartOfDay(/* @__PURE__ */ new Date()));
|
|
156
|
+
},
|
|
157
|
+
isValid(value) {
|
|
158
|
+
if (!value) return false;
|
|
159
|
+
const normalized = normalize(value);
|
|
160
|
+
const date = (0, import_date_fns.parseISO)(normalized);
|
|
161
|
+
return (0, import_date_fns.isValid)(date);
|
|
162
|
+
},
|
|
163
|
+
getYear(iso) {
|
|
164
|
+
return toDate(iso).getUTCFullYear();
|
|
165
|
+
},
|
|
166
|
+
getMonth(iso) {
|
|
167
|
+
return toDate(iso).getUTCMonth();
|
|
168
|
+
},
|
|
169
|
+
getDate(iso) {
|
|
170
|
+
return toDate(iso).getUTCDate();
|
|
171
|
+
},
|
|
172
|
+
getDay(iso) {
|
|
173
|
+
return toDate(iso).getUTCDay();
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// src/utils/calendar.ts
|
|
178
|
+
function getCalendarDays(monthISO, adapter, options = {}) {
|
|
179
|
+
const {
|
|
180
|
+
weekStartsOn = 0,
|
|
181
|
+
today,
|
|
182
|
+
selected,
|
|
183
|
+
focusedDate,
|
|
184
|
+
disabled = [],
|
|
185
|
+
range,
|
|
186
|
+
rangeHover
|
|
187
|
+
} = options;
|
|
188
|
+
const todayISO = today ?? adapter.today();
|
|
189
|
+
const monthStart = adapter.startOfMonth(monthISO);
|
|
190
|
+
const gridStart = adapter.startOfWeek(monthStart, weekStartsOn);
|
|
191
|
+
const normalizedRange = normalizeRangeForDisplay(range, rangeHover, adapter);
|
|
192
|
+
const weeks = [];
|
|
193
|
+
let current = gridStart;
|
|
194
|
+
for (let week = 0; week < 6; week++) {
|
|
195
|
+
const days = [];
|
|
196
|
+
for (let day = 0; day < 7; day++) {
|
|
197
|
+
const isCurrentMonth = adapter.isSameMonth(current, monthISO);
|
|
198
|
+
const isTodayDate = adapter.isSameDay(current, todayISO);
|
|
199
|
+
const isSelected_ = selected ? adapter.isSameDay(current, selected) : false;
|
|
200
|
+
const isFocused_ = focusedDate ? adapter.isSameDay(current, focusedDate) : false;
|
|
201
|
+
const isDisabled_ = isDateDisabled(current, disabled, adapter);
|
|
202
|
+
const rangeFlags = computeRangeFlags(current, normalizedRange, adapter);
|
|
203
|
+
days.push({
|
|
204
|
+
isoString: current,
|
|
205
|
+
dayNumber: adapter.getDate(current),
|
|
206
|
+
isCurrentMonth,
|
|
207
|
+
isToday: isTodayDate,
|
|
208
|
+
isSelected: isSelected_,
|
|
209
|
+
isDisabled: isDisabled_,
|
|
210
|
+
isFocused: isFocused_,
|
|
211
|
+
...rangeFlags
|
|
212
|
+
});
|
|
213
|
+
current = adapter.addDays(current, 1);
|
|
214
|
+
}
|
|
215
|
+
weeks.push(days);
|
|
216
|
+
if (!adapter.isSameMonth(current, monthISO) && week >= 3) {
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return weeks;
|
|
221
|
+
}
|
|
222
|
+
function normalizeRangeForDisplay(range, hover, adapter) {
|
|
223
|
+
if (!range) return { start: null, end: null };
|
|
224
|
+
const { start, end } = range;
|
|
225
|
+
if (start && end) {
|
|
226
|
+
if (adapter.isAfter(start, end)) {
|
|
227
|
+
return { start: end, end: start };
|
|
228
|
+
}
|
|
229
|
+
return { start, end };
|
|
230
|
+
}
|
|
231
|
+
if (start && !end && hover) {
|
|
232
|
+
if (adapter.isAfter(start, hover)) {
|
|
233
|
+
return { start: hover, end: start };
|
|
234
|
+
}
|
|
235
|
+
return { start, end: hover };
|
|
236
|
+
}
|
|
237
|
+
if (start && !end) {
|
|
238
|
+
return { start, end: null };
|
|
239
|
+
}
|
|
240
|
+
return { start: null, end: null };
|
|
241
|
+
}
|
|
242
|
+
function computeRangeFlags(iso, range, adapter) {
|
|
243
|
+
const { start, end } = range;
|
|
244
|
+
if (!start) {
|
|
245
|
+
return { isRangeStart: false, isRangeEnd: false, isInRange: false };
|
|
246
|
+
}
|
|
247
|
+
const isRangeStart = adapter.isSameDay(iso, start);
|
|
248
|
+
if (!end) {
|
|
249
|
+
return { isRangeStart, isRangeEnd: false, isInRange: false };
|
|
250
|
+
}
|
|
251
|
+
const isRangeEnd = adapter.isSameDay(iso, end);
|
|
252
|
+
const isInRange = !isRangeStart && !isRangeEnd && adapter.isAfter(iso, start) && adapter.isBefore(iso, end);
|
|
253
|
+
return { isRangeStart, isRangeEnd, isInRange };
|
|
254
|
+
}
|
|
255
|
+
function isDateDisabled(iso, rules, adapter) {
|
|
256
|
+
for (const rule of rules) {
|
|
257
|
+
if ("date" in rule) {
|
|
258
|
+
if (adapter.isSameDay(iso, rule.date)) return true;
|
|
259
|
+
} else if ("before" in rule) {
|
|
260
|
+
if (adapter.isBefore(iso, rule.before)) return true;
|
|
261
|
+
} else if ("after" in rule) {
|
|
262
|
+
if (adapter.isAfter(iso, rule.after)) return true;
|
|
263
|
+
} else if ("dayOfWeek" in rule) {
|
|
264
|
+
if (rule.dayOfWeek.includes(adapter.getDay(iso))) return true;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
function minDate(a, b, adapter) {
|
|
270
|
+
return adapter.isBefore(a, b) ? a : b;
|
|
271
|
+
}
|
|
272
|
+
function maxDate(a, b, adapter) {
|
|
273
|
+
return adapter.isAfter(a, b) ? a : b;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// src/utils/date.ts
|
|
277
|
+
var ISO_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
278
|
+
var ISO_DATETIME_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/;
|
|
279
|
+
function normalizeISO(value) {
|
|
280
|
+
if (!value) return "";
|
|
281
|
+
if (ISO_DATETIME_REGEX.test(value)) return value;
|
|
282
|
+
if (ISO_DATE_REGEX.test(value)) return `${value}T00:00:00.000Z`;
|
|
283
|
+
return value;
|
|
284
|
+
}
|
|
285
|
+
function parseInputValue(input, format, adapter) {
|
|
286
|
+
if (!input.trim()) return null;
|
|
287
|
+
const cleaned = input.replace(/\//g, "-").trim();
|
|
288
|
+
if (ISO_DATE_REGEX.test(cleaned)) {
|
|
289
|
+
const normalized = normalizeISO(cleaned);
|
|
290
|
+
if (adapter.isValid(normalized)) {
|
|
291
|
+
return normalized;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (/^\d{8}$/.test(cleaned)) {
|
|
295
|
+
const formatted = `${cleaned.slice(0, 4)}-${cleaned.slice(4, 6)}-${cleaned.slice(6, 8)}`;
|
|
296
|
+
const normalized = normalizeISO(formatted);
|
|
297
|
+
if (adapter.isValid(normalized)) {
|
|
298
|
+
return normalized;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// src/utils/time.ts
|
|
305
|
+
function setTime(iso, time) {
|
|
306
|
+
const date = new Date(iso);
|
|
307
|
+
if (time.hours !== void 0) date.setUTCHours(time.hours);
|
|
308
|
+
if (time.minutes !== void 0) date.setUTCMinutes(time.minutes);
|
|
309
|
+
if (time.seconds !== void 0) date.setUTCSeconds(time.seconds);
|
|
310
|
+
return date.toISOString();
|
|
311
|
+
}
|
|
312
|
+
function getTime(iso) {
|
|
313
|
+
const date = new Date(iso);
|
|
314
|
+
return {
|
|
315
|
+
hours: date.getUTCHours(),
|
|
316
|
+
minutes: date.getUTCMinutes(),
|
|
317
|
+
seconds: date.getUTCSeconds()
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
function parseTimeString(input) {
|
|
321
|
+
if (!input) return null;
|
|
322
|
+
const match = input.trim().match(/^(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?$/);
|
|
323
|
+
if (!match) return null;
|
|
324
|
+
const hours = parseInt(match[1], 10);
|
|
325
|
+
const minutes = parseInt(match[2], 10);
|
|
326
|
+
const seconds = match[3] ? parseInt(match[3], 10) : 0;
|
|
327
|
+
if (hours < 0 || hours > 23) return null;
|
|
328
|
+
if (minutes < 0 || minutes > 59) return null;
|
|
329
|
+
if (seconds < 0 || seconds > 59) return null;
|
|
330
|
+
return { hours, minutes, seconds };
|
|
331
|
+
}
|
|
332
|
+
function formatTimeString(time, withSeconds = false) {
|
|
333
|
+
const hh = String(time.hours).padStart(2, "0");
|
|
334
|
+
const mm = String(time.minutes).padStart(2, "0");
|
|
335
|
+
if (withSeconds) {
|
|
336
|
+
const ss = String(time.seconds).padStart(2, "0");
|
|
337
|
+
return `${hh}:${mm}:${ss}`;
|
|
338
|
+
}
|
|
339
|
+
return `${hh}:${mm}`;
|
|
340
|
+
}
|
|
341
|
+
function to12Hour(hours24) {
|
|
342
|
+
const period = hours24 >= 12 ? "PM" : "AM";
|
|
343
|
+
let hours12 = hours24 % 12;
|
|
344
|
+
if (hours12 === 0) hours12 = 12;
|
|
345
|
+
return { hours12, period };
|
|
346
|
+
}
|
|
347
|
+
function to24Hour(hours12, period) {
|
|
348
|
+
if (period === "AM") {
|
|
349
|
+
return hours12 === 12 ? 0 : hours12;
|
|
350
|
+
}
|
|
351
|
+
return hours12 === 12 ? 12 : hours12 + 12;
|
|
352
|
+
}
|
|
353
|
+
function generateHours(format = "24h") {
|
|
354
|
+
if (format === "12h") {
|
|
355
|
+
return Array.from({ length: 12 }, (_, i) => i + 1);
|
|
356
|
+
}
|
|
357
|
+
return Array.from({ length: 24 }, (_, i) => i);
|
|
358
|
+
}
|
|
359
|
+
function generateMinutes(step = 1) {
|
|
360
|
+
if (step < 1 || step > 60) {
|
|
361
|
+
throw new Error(`[generateMinutes] step must be between 1 and 60, got ${step}`);
|
|
362
|
+
}
|
|
363
|
+
const result = [];
|
|
364
|
+
for (let i = 0; i < 60; i += step) {
|
|
365
|
+
result.push(i);
|
|
366
|
+
}
|
|
367
|
+
return result;
|
|
368
|
+
}
|
|
369
|
+
function isSameTime(a, b) {
|
|
370
|
+
return a.hours === b.hours && a.minutes === b.minutes && a.seconds === b.seconds;
|
|
371
|
+
}
|
|
372
|
+
function formatTimeFromISO(iso, format, _adapter) {
|
|
373
|
+
const time = getTime(iso);
|
|
374
|
+
if (format === "h:mm a" || format === "h:mm:ss a") {
|
|
375
|
+
const { hours12, period } = to12Hour(time.hours);
|
|
376
|
+
const mm = String(time.minutes).padStart(2, "0");
|
|
377
|
+
if (format === "h:mm a") {
|
|
378
|
+
return `${hours12}:${mm} ${period}`;
|
|
379
|
+
}
|
|
380
|
+
const ss = String(time.seconds).padStart(2, "0");
|
|
381
|
+
return `${hours12}:${mm}:${ss} ${period}`;
|
|
382
|
+
}
|
|
383
|
+
return formatTimeString(time, format === "HH:mm:ss");
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// src/utils/locale.ts
|
|
387
|
+
function getMonthName(month, locale = "en-US") {
|
|
388
|
+
const date = new Date(Date.UTC(2026, month, 1));
|
|
389
|
+
return new Intl.DateTimeFormat(locale, { month: "long", timeZone: "UTC" }).format(date);
|
|
390
|
+
}
|
|
391
|
+
function formatMonthYear(year, month, locale = "en-US") {
|
|
392
|
+
const date = new Date(Date.UTC(year, month, 1));
|
|
393
|
+
return new Intl.DateTimeFormat(locale, {
|
|
394
|
+
year: "numeric",
|
|
395
|
+
month: "long",
|
|
396
|
+
timeZone: "UTC"
|
|
397
|
+
}).format(date);
|
|
398
|
+
}
|
|
399
|
+
function getWeekdayNames(locale = "en-US", weekStartsOn = 0) {
|
|
400
|
+
const shortFormatter = new Intl.DateTimeFormat(locale, {
|
|
401
|
+
weekday: "short",
|
|
402
|
+
timeZone: "UTC"
|
|
403
|
+
});
|
|
404
|
+
const fullFormatter = new Intl.DateTimeFormat(locale, {
|
|
405
|
+
weekday: "long",
|
|
406
|
+
timeZone: "UTC"
|
|
407
|
+
});
|
|
408
|
+
const days = [];
|
|
409
|
+
for (let i = 0; i < 7; i++) {
|
|
410
|
+
const date = new Date(Date.UTC(2026, 0, 4 + i));
|
|
411
|
+
days.push({
|
|
412
|
+
short: shortFormatter.format(date),
|
|
413
|
+
full: fullFormatter.format(date)
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
if (weekStartsOn === 1) {
|
|
417
|
+
const sunday = days.shift();
|
|
418
|
+
days.push(sunday);
|
|
419
|
+
}
|
|
420
|
+
return days;
|
|
421
|
+
}
|
|
422
|
+
function formatFullDate(iso, locale = "en-US") {
|
|
423
|
+
const date = new Date(iso);
|
|
424
|
+
return new Intl.DateTimeFormat(locale, {
|
|
425
|
+
year: "numeric",
|
|
426
|
+
month: "long",
|
|
427
|
+
day: "numeric",
|
|
428
|
+
weekday: "long",
|
|
429
|
+
timeZone: "UTC"
|
|
430
|
+
}).format(date);
|
|
431
|
+
}
|
|
432
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
433
|
+
0 && (module.exports = {
|
|
434
|
+
DateFnsAdapter,
|
|
435
|
+
formatFullDate,
|
|
436
|
+
formatMonthYear,
|
|
437
|
+
formatTimeFromISO,
|
|
438
|
+
formatTimeString,
|
|
439
|
+
generateHours,
|
|
440
|
+
generateMinutes,
|
|
441
|
+
getCalendarDays,
|
|
442
|
+
getMonthName,
|
|
443
|
+
getTime,
|
|
444
|
+
getWeekdayNames,
|
|
445
|
+
isDateDisabled,
|
|
446
|
+
isSameTime,
|
|
447
|
+
maxDate,
|
|
448
|
+
minDate,
|
|
449
|
+
normalizeISO,
|
|
450
|
+
parseInputValue,
|
|
451
|
+
parseTimeString,
|
|
452
|
+
setTime,
|
|
453
|
+
to12Hour,
|
|
454
|
+
to24Hour
|
|
455
|
+
});
|