@simplysm/core-common 13.0.99 → 14.0.1

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 (181) hide show
  1. package/dist/common.types.d.ts +14 -14
  2. package/dist/common.types.js +2 -1
  3. package/dist/common.types.js.map +1 -6
  4. package/dist/env.d.ts +5 -0
  5. package/dist/env.d.ts.map +1 -1
  6. package/dist/env.js +12 -8
  7. package/dist/env.js.map +1 -6
  8. package/dist/errors/argument-error.d.ts +10 -10
  9. package/dist/errors/argument-error.d.ts.map +1 -1
  10. package/dist/errors/argument-error.js +31 -14
  11. package/dist/errors/argument-error.js.map +1 -6
  12. package/dist/errors/not-implemented-error.d.ts +8 -8
  13. package/dist/errors/not-implemented-error.js +30 -12
  14. package/dist/errors/not-implemented-error.js.map +1 -6
  15. package/dist/errors/sd-error.d.ts +10 -10
  16. package/dist/errors/sd-error.d.ts.map +1 -1
  17. package/dist/errors/sd-error.js +45 -24
  18. package/dist/errors/sd-error.js.map +1 -6
  19. package/dist/errors/timeout-error.d.ts +10 -10
  20. package/dist/errors/timeout-error.js +34 -15
  21. package/dist/errors/timeout-error.js.map +1 -6
  22. package/dist/extensions/arr-ext.d.ts +2 -2
  23. package/dist/extensions/arr-ext.helpers.d.ts +10 -10
  24. package/dist/extensions/arr-ext.helpers.js +112 -89
  25. package/dist/extensions/arr-ext.helpers.js.map +1 -6
  26. package/dist/extensions/arr-ext.js +458 -422
  27. package/dist/extensions/arr-ext.js.map +1 -6
  28. package/dist/extensions/arr-ext.types.d.ts +57 -57
  29. package/dist/extensions/arr-ext.types.d.ts.map +1 -1
  30. package/dist/extensions/arr-ext.types.js +6 -1
  31. package/dist/extensions/arr-ext.types.js.map +1 -6
  32. package/dist/extensions/map-ext.d.ts +16 -16
  33. package/dist/extensions/map-ext.js +27 -22
  34. package/dist/extensions/map-ext.js.map +1 -6
  35. package/dist/extensions/set-ext.d.ts +11 -11
  36. package/dist/extensions/set-ext.js +32 -25
  37. package/dist/extensions/set-ext.js.map +1 -6
  38. package/dist/features/debounce-queue.d.ts +17 -17
  39. package/dist/features/debounce-queue.js +98 -70
  40. package/dist/features/debounce-queue.js.map +1 -6
  41. package/dist/features/event-emitter.d.ts +20 -20
  42. package/dist/features/event-emitter.js +101 -78
  43. package/dist/features/event-emitter.js.map +1 -6
  44. package/dist/features/serial-queue.d.ts +11 -11
  45. package/dist/features/serial-queue.js +78 -57
  46. package/dist/features/serial-queue.js.map +1 -6
  47. package/dist/globals.d.ts +4 -4
  48. package/dist/globals.js +9 -1
  49. package/dist/globals.js.map +1 -6
  50. package/dist/index.js +28 -27
  51. package/dist/index.js.map +1 -6
  52. package/dist/types/date-only.d.ts +64 -64
  53. package/dist/types/date-only.d.ts.map +1 -1
  54. package/dist/types/date-only.js +263 -252
  55. package/dist/types/date-only.js.map +1 -6
  56. package/dist/types/date-time.d.ts +36 -36
  57. package/dist/types/date-time.d.ts.map +1 -1
  58. package/dist/types/date-time.js +196 -288
  59. package/dist/types/date-time.js.map +1 -6
  60. package/dist/types/lazy-gc-map.d.ts +26 -26
  61. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  62. package/dist/types/lazy-gc-map.js +202 -159
  63. package/dist/types/lazy-gc-map.js.map +1 -6
  64. package/dist/types/time.d.ts +23 -23
  65. package/dist/types/time.d.ts.map +1 -1
  66. package/dist/types/time.js +169 -158
  67. package/dist/types/time.js.map +1 -6
  68. package/dist/types/uuid.d.ts +11 -11
  69. package/dist/types/uuid.d.ts.map +1 -1
  70. package/dist/types/uuid.js +95 -70
  71. package/dist/types/uuid.js.map +1 -6
  72. package/dist/utils/bytes.d.ts +17 -17
  73. package/dist/utils/bytes.js +137 -81
  74. package/dist/utils/bytes.js.map +1 -6
  75. package/dist/utils/date-format.d.ts +40 -40
  76. package/dist/utils/date-format.js +187 -101
  77. package/dist/utils/date-format.js.map +1 -6
  78. package/dist/utils/error.d.ts +4 -4
  79. package/dist/utils/error.js +11 -6
  80. package/dist/utils/error.js.map +1 -6
  81. package/dist/utils/json.d.ts +19 -19
  82. package/dist/utils/json.js +187 -135
  83. package/dist/utils/json.js.map +1 -6
  84. package/dist/utils/num.d.ts +20 -20
  85. package/dist/utils/num.js +76 -34
  86. package/dist/utils/num.js.map +1 -6
  87. package/dist/utils/obj.d.ts +111 -111
  88. package/dist/utils/obj.d.ts.map +1 -1
  89. package/dist/utils/obj.js +706 -496
  90. package/dist/utils/obj.js.map +1 -6
  91. package/dist/utils/path.d.ts +10 -10
  92. package/dist/utils/path.js +35 -18
  93. package/dist/utils/path.js.map +1 -6
  94. package/dist/utils/primitive.d.ts +5 -5
  95. package/dist/utils/primitive.js +34 -14
  96. package/dist/utils/primitive.js.map +1 -6
  97. package/dist/utils/str.d.ts +38 -38
  98. package/dist/utils/str.js +217 -113
  99. package/dist/utils/str.js.map +1 -6
  100. package/dist/utils/template-strings.d.ts +26 -26
  101. package/dist/utils/template-strings.js +113 -40
  102. package/dist/utils/template-strings.js.map +1 -6
  103. package/dist/utils/transferable.d.ts +18 -18
  104. package/dist/utils/transferable.js +218 -151
  105. package/dist/utils/transferable.js.map +1 -6
  106. package/dist/utils/wait.d.ts +9 -9
  107. package/dist/utils/wait.js +30 -15
  108. package/dist/utils/wait.js.map +1 -6
  109. package/dist/utils/xml.d.ts +13 -13
  110. package/dist/utils/xml.js +84 -46
  111. package/dist/utils/xml.js.map +1 -6
  112. package/dist/utils/zip.d.ts +22 -22
  113. package/dist/utils/zip.js +172 -148
  114. package/dist/utils/zip.js.map +1 -6
  115. package/package.json +5 -7
  116. package/src/common.types.ts +14 -14
  117. package/src/env.ts +9 -1
  118. package/src/errors/argument-error.ts +15 -15
  119. package/src/errors/not-implemented-error.ts +9 -9
  120. package/src/errors/sd-error.ts +12 -12
  121. package/src/errors/timeout-error.ts +12 -12
  122. package/src/extensions/arr-ext.helpers.ts +16 -16
  123. package/src/extensions/arr-ext.ts +35 -35
  124. package/src/extensions/arr-ext.types.ts +57 -57
  125. package/src/extensions/map-ext.ts +16 -16
  126. package/src/extensions/set-ext.ts +11 -11
  127. package/src/features/debounce-queue.ts +23 -23
  128. package/src/features/event-emitter.ts +25 -25
  129. package/src/features/serial-queue.ts +13 -13
  130. package/src/globals.ts +4 -4
  131. package/src/index.ts +5 -5
  132. package/src/types/date-only.ts +84 -83
  133. package/src/types/date-time.ts +43 -42
  134. package/src/types/lazy-gc-map.ts +44 -44
  135. package/src/types/time.ts +29 -29
  136. package/src/types/uuid.ts +15 -15
  137. package/src/utils/bytes.ts +35 -35
  138. package/src/utils/date-format.ts +59 -59
  139. package/src/utils/error.ts +4 -4
  140. package/src/utils/json.ts +41 -41
  141. package/src/utils/num.ts +20 -20
  142. package/src/utils/obj.ts +138 -138
  143. package/src/utils/path.ts +10 -10
  144. package/src/utils/primitive.ts +6 -6
  145. package/src/utils/str.ts +48 -48
  146. package/src/utils/template-strings.ts +29 -29
  147. package/src/utils/transferable.ts +38 -38
  148. package/src/utils/wait.ts +10 -10
  149. package/src/utils/xml.ts +19 -19
  150. package/src/utils/zip.ts +25 -25
  151. package/README.md +0 -160
  152. package/docs/errors.md +0 -119
  153. package/docs/extensions.md +0 -387
  154. package/docs/features.md +0 -143
  155. package/docs/types.md +0 -287
  156. package/docs/utils.md +0 -757
  157. package/tests/errors/errors.spec.ts +0 -80
  158. package/tests/extensions/array-extension.spec.ts +0 -654
  159. package/tests/extensions/map-extension.spec.ts +0 -117
  160. package/tests/extensions/set-extension.spec.ts +0 -67
  161. package/tests/types/date-only.spec.ts +0 -533
  162. package/tests/types/date-time.spec.ts +0 -246
  163. package/tests/types/lazy-gc-map.spec.ts +0 -606
  164. package/tests/types/time.spec.ts +0 -428
  165. package/tests/types/uuid.spec.ts +0 -74
  166. package/tests/utils/bytes-utils.spec.ts +0 -197
  167. package/tests/utils/date-format.spec.ts +0 -350
  168. package/tests/utils/debounce-queue.spec.ts +0 -226
  169. package/tests/utils/json.spec.ts +0 -400
  170. package/tests/utils/number.spec.ts +0 -136
  171. package/tests/utils/object.spec.ts +0 -810
  172. package/tests/utils/path.spec.ts +0 -70
  173. package/tests/utils/primitive.spec.ts +0 -43
  174. package/tests/utils/sd-event-emitter.spec.ts +0 -189
  175. package/tests/utils/serial-queue.spec.ts +0 -305
  176. package/tests/utils/string.spec.ts +0 -265
  177. package/tests/utils/template-strings.spec.ts +0 -48
  178. package/tests/utils/transferable.spec.ts +0 -639
  179. package/tests/utils/wait.spec.ts +0 -123
  180. package/tests/utils/xml.spec.ts +0 -146
  181. package/tests/utils/zip.spec.ts +0 -221
@@ -1,261 +1,272 @@
1
1
  import { ArgumentError } from "../errors/argument-error.js";
2
2
  import { format, normalizeMonth } from "../utils/date-format.js";
3
- class DateOnly {
4
- static MS_PER_DAY = 24 * 60 * 60 * 1e3;
5
- date;
6
- constructor(arg1, arg2, arg3) {
7
- if (arg1 === void 0) {
8
- const tick = Date.now();
9
- const date = new Date(tick);
10
- this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
11
- } else if (arg2 !== void 0 && arg3 !== void 0) {
12
- this.date = new Date(arg1, arg2 - 1, arg3);
13
- } else if (arg1 instanceof Date) {
14
- const date = arg1;
15
- this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
16
- } else {
17
- const date = new Date(arg1);
18
- this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
3
+ /**
4
+ * 날짜 클래스 (시간 제외: yyyy-MM-dd, 불변)
5
+ *
6
+ * 시간 정보 없이 날짜만 저장하는 불변 클래스.
7
+ * 로컬 타임존 기준으로 동작함.
8
+ *
9
+ * @example
10
+ * const today = new DateOnly();
11
+ * const specific = new DateOnly(2025, 1, 15);
12
+ * const parsed = DateOnly.parse("2025-01-15");
13
+ */
14
+ export class DateOnly {
15
+ static MS_PER_DAY = 24 * 60 * 60 * 1000;
16
+ date;
17
+ constructor(arg1, arg2, arg3) {
18
+ if (arg1 === undefined) {
19
+ const tick = Date.now();
20
+ const date = new Date(tick);
21
+ this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
22
+ }
23
+ else if (arg2 !== undefined && arg3 !== undefined) {
24
+ this.date = new Date(arg1, arg2 - 1, arg3);
25
+ }
26
+ else if (arg1 instanceof Date) {
27
+ const date = arg1;
28
+ this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
29
+ }
30
+ else {
31
+ const date = new Date(arg1);
32
+ this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
33
+ }
19
34
  }
20
- }
21
- /**
22
- * Parse a string into DateOnly
23
- * @param str Date string
24
- * @returns DateOnly instance
25
- *
26
- * Supported formats:
27
- * - `yyyy-MM-dd` (e.g., '2024-01-15') - Extracted directly from string, timezone-independent
28
- * - `yyyyMMdd` (e.g., '20240115') - Extracted directly from string, timezone-independent
29
- * - ISO 8601 (e.g., '2024-01-15T00:00:00Z') - Interpreted as UTC, then converted to local timezone
30
- *
31
- * @note For different server/client timezones, `yyyy-MM-dd` format is recommended
32
- * @note For DST regions when parsing ISO 8601 format, the offset of the parsing target date is used.
33
- */
34
- static parse(str) {
35
- const matchYMD = /^(\d{4})-(\d{2})-(\d{2})$/.exec(str);
36
- if (matchYMD != null) {
37
- return new DateOnly(Number(matchYMD[1]), Number(matchYMD[2]), Number(matchYMD[3]));
35
+ /**
36
+ * 문자열을 DateOnly로 파싱
37
+ * @param str 날짜 문자열
38
+ * @returns DateOnly 인스턴스
39
+ *
40
+ * 지원 형식:
41
+ * - `yyyy-MM-dd` (예: '2024-01-15') - 문자열에서 직접 추출, 타임존 무관
42
+ * - `yyyyMMdd` (예: '20240115') - 문자열에서 직접 추출, 타임존 무관
43
+ * - ISO 8601 (예: '2024-01-15T00:00:00Z') - UTC로 해석 로컬 타임존으로 변환
44
+ *
45
+ * @note 서버/클라이언트 타임존이 다른 경우 `yyyy-MM-dd` 형식 권장
46
+ * @note DST 지역에서 ISO 8601 형식 파싱 파싱 대상 날짜의 오프셋이 사용됨.
47
+ */
48
+ static parse(str) {
49
+ // yyyy-MM-dd 형식 (타임존 무관)
50
+ const matchYMD = /^(\d{4})-(\d{2})-(\d{2})$/.exec(str);
51
+ if (matchYMD != null) {
52
+ return new DateOnly(Number(matchYMD[1]), Number(matchYMD[2]), Number(matchYMD[3]));
53
+ }
54
+ // yyyyMMdd 형식 (타임존 무관)
55
+ const matchCompact = /^(\d{4})(\d{2})(\d{2})$/.exec(str);
56
+ if (matchCompact != null) {
57
+ return new DateOnly(Number(matchCompact[1]), Number(matchCompact[2]), Number(matchCompact[3]));
58
+ }
59
+ // ISO 8601 및 기타 형식 (Date.parse 사용, 타임존 변환 적용)
60
+ // Date.parse()는 'Z' 접미사가 있는 ISO 8601에 대해 UTC tick을 반환
61
+ // getTimezoneOffset()은 "로컬에서 UTC로 변환할 때 더해야 하는 분"을 반환 (KST는 -540 = UTC+9)
62
+ // 여기서는 "UTC → 로컬" 변환이므로 반대 부호 적용 (빼기)
63
+ // DST 지역에서 정확한 변환을 위해 파싱 대상 날짜의 오프셋 사용
64
+ const utcTick = Date.parse(str);
65
+ if (!Number.isNaN(utcTick)) {
66
+ const tempDate = new Date(utcTick);
67
+ const offsetMinutes = tempDate.getTimezoneOffset();
68
+ const localTick = utcTick - offsetMinutes * 60 * 1000;
69
+ return new DateOnly(localTick);
70
+ }
71
+ throw new ArgumentError(`날짜 형식 파싱 실패. 지원 형식: 'yyyy-MM-dd', 'yyyyMMdd', ISO 8601 date`, {
72
+ input: str,
73
+ });
38
74
  }
39
- const matchCompact = /^(\d{4})(\d{2})(\d{2})$/.exec(str);
40
- if (matchCompact != null) {
41
- return new DateOnly(
42
- Number(matchCompact[1]),
43
- Number(matchCompact[2]),
44
- Number(matchCompact[3])
45
- );
75
+ //#region 주차 계산
76
+ /**
77
+ * 주차 정보 기반으로 기준 연도와 월 반환
78
+ * @param weekStartDay 주 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
79
+ * @param minDaysInFirstWeek 첫 번째 주로 간주되기 위한 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
80
+ * @returns 이 날짜가 포함된 주의 기준 연도와 월
81
+ *
82
+ * @example
83
+ * // ISO 8601 표준 (월요일 시작, 첫 주 최소 4일)
84
+ * new DateOnly(2024, 1, 1).getBaseYearMonthSeqForWeekSeq(1, 4)
85
+ * // 미국식 (일요일 시작, 첫 주 최소 1일)
86
+ * new DateOnly(2024, 1, 1).getBaseYearMonthSeqForWeekSeq(0, 1)
87
+ */
88
+ getBaseYearMonthSeqForWeekSeq(weekStartDay = 1, minDaysInFirstWeek = 4) {
89
+ // 주 시작 요일 기준 요일 인덱스 계산 (0 = 주 시작 요일)
90
+ const dayOfWeek = (this.dayOfWeek + 7 - weekStartDay) % 7;
91
+ // 현재 주의 남은 일수 (현재 날짜 포함)
92
+ const daysInWeek = 7 - dayOfWeek;
93
+ // 현재 주의 남은 일수가 최소 일수보다 적으면 이전 주로 간주
94
+ if (daysInWeek < minDaysInFirstWeek) {
95
+ const prevWeek = this.addDays(-7);
96
+ return { year: prevWeek.year, monthSeq: prevWeek.month };
97
+ }
98
+ else {
99
+ // 월 경계를 고려한 실제 남은 일수 계산
100
+ const nextMonthDate = this.addMonths(1).setDay(1);
101
+ const remainedDays = (nextMonthDate.tick - this.tick) / DateOnly.MS_PER_DAY;
102
+ // 월 경계까지의 실제 일수와 주 남은 일수 중 작은 값 사용
103
+ const realDaysInWeek = Math.min(daysInWeek, remainedDays);
104
+ // 월 경계를 고려했을 때도 최소 일수보다 적으면 다음 주로 간주
105
+ if (realDaysInWeek < minDaysInFirstWeek) {
106
+ const nextWeek = this.addDays(7);
107
+ return { year: nextWeek.year, monthSeq: nextWeek.month };
108
+ }
109
+ else {
110
+ return { year: this.year, monthSeq: this.month };
111
+ }
112
+ }
46
113
  }
47
- const utcTick = Date.parse(str);
48
- if (!Number.isNaN(utcTick)) {
49
- const tempDate = new Date(utcTick);
50
- const offsetMinutes = tempDate.getTimezoneOffset();
51
- const localTick = utcTick - offsetMinutes * 60 * 1e3;
52
- return new DateOnly(localTick);
114
+ /**
115
+ * 주차 정보 기반으로 해당 주의 시작 날짜 계산
116
+ * @param weekStartDay 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
117
+ * @param minDaysInFirstWeek 첫 번째 주로 간주되기 위한 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
118
+ * @returns 날짜가 포함된 주의 시작 날짜
119
+ */
120
+ getWeekSeqStartDate(weekStartDay = 1, minDaysInFirstWeek = 4) {
121
+ const dayOfWeek = (this.dayOfWeek + 7 - weekStartDay) % 7;
122
+ const daysInFirstWeek = 7 - dayOfWeek;
123
+ if (daysInFirstWeek < minDaysInFirstWeek) {
124
+ return this.addDays(-dayOfWeek + 7);
125
+ }
126
+ else {
127
+ return this.addDays(-dayOfWeek);
128
+ }
53
129
  }
54
- throw new ArgumentError(
55
- `Failed to parse date format. Supported formats: 'yyyy-MM-dd', 'yyyyMMdd', ISO 8601 date`,
56
- {
57
- input: str
58
- }
59
- );
60
- }
61
- //#region Week calculation
62
- /**
63
- * Return the base year and month based on week information
64
- * @param weekStartDay Week start day (0=Sunday, 1=Monday, ..., 6=Saturday). Default: 1(Monday)
65
- * @param minDaysInFirstWeek Minimum days to be considered the first week (1~7). Default: 4 (ISO 8601 standard)
66
- * @returns Base year and month of the week containing this date
67
- *
68
- * @example
69
- * // ISO 8601 standard (Monday start, first week minimum 4 days)
70
- * new DateOnly(2024, 1, 1).getBaseYearMonthSeqForWeekSeq(1, 4)
71
- * // US style (Sunday start, first week minimum 1 day)
72
- * new DateOnly(2024, 1, 1).getBaseYearMonthSeqForWeekSeq(0, 1)
73
- */
74
- getBaseYearMonthSeqForWeekSeq(weekStartDay = 1, minDaysInFirstWeek = 4) {
75
- const dayOfWeek = (this.dayOfWeek + 7 - weekStartDay) % 7;
76
- const daysInWeek = 7 - dayOfWeek;
77
- if (daysInWeek < minDaysInFirstWeek) {
78
- const prevWeek = this.addDays(-7);
79
- return { year: prevWeek.year, monthSeq: prevWeek.month };
80
- } else {
81
- const nextMonthDate = this.addMonths(1).setDay(1);
82
- const remainedDays = (nextMonthDate.tick - this.tick) / DateOnly.MS_PER_DAY;
83
- const realDaysInWeek = Math.min(daysInWeek, remainedDays);
84
- if (realDaysInWeek < minDaysInFirstWeek) {
85
- const nextWeek = this.addDays(7);
86
- return { year: nextWeek.year, monthSeq: nextWeek.month };
87
- } else {
88
- return { year: this.year, monthSeq: this.month };
89
- }
130
+ /**
131
+ * 연도와 주차 정보 반환
132
+ * @param weekStartDay 주 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
133
+ * @param minDaysInFirstWeek 첫 번째 주로 간주되기 위한 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
134
+ * @returns 해당 연도와 그 연도 내의 주차 번호
135
+ *
136
+ * @example
137
+ * // ISO 8601 표준 (월요일 시작, 첫 주 최소 4일)
138
+ * new DateOnly(2025, 1, 6).getWeekSeqOfYear(); // { year: 2025, weekSeq: 2 }
139
+ *
140
+ * // 미국식 (일요일 시작, 최소 1)
141
+ * new DateOnly(2025, 1, 1).getWeekSeqOfYear(0, 1); // { year: 2025, weekSeq: 1 }
142
+ */
143
+ getWeekSeqOfYear(weekStartDay = 1, minDaysInFirstWeek = 4) {
144
+ const base = this.getBaseYearMonthSeqForWeekSeq(weekStartDay, minDaysInFirstWeek);
145
+ const firstWeekStart = new DateOnly(base.year, 1, 1).getWeekSeqStartDate(weekStartDay, minDaysInFirstWeek);
146
+ const diffDays = (this.tick - firstWeekStart.tick) / DateOnly.MS_PER_DAY;
147
+ return {
148
+ year: base.year,
149
+ weekSeq: Math.floor(diffDays / 7) + 1,
150
+ };
90
151
  }
91
- }
92
- /**
93
- * Calculate the start date of the week based on week information
94
- * @param weekStartDay Week start day (0=Sunday, 1=Monday, ..., 6=Saturday). Default: 1(Monday)
95
- * @param minDaysInFirstWeek Minimum days to be considered the first week (1~7). Default: 4 (ISO 8601 standard)
96
- * @returns Start date of the week containing this date
97
- */
98
- getWeekSeqStartDate(weekStartDay = 1, minDaysInFirstWeek = 4) {
99
- const dayOfWeek = (this.dayOfWeek + 7 - weekStartDay) % 7;
100
- const daysInFirstWeek = 7 - dayOfWeek;
101
- if (daysInFirstWeek < minDaysInFirstWeek) {
102
- return this.addDays(-dayOfWeek + 7);
103
- } else {
104
- return this.addDays(-dayOfWeek);
152
+ /**
153
+ * 해당 날짜의 연도, 월, 주차 정보 반환
154
+ * @param weekStartDay 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
155
+ * @param minDaysInFirstWeek 번째 주로 간주되기 위한 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
156
+ * @returns 연도, 월, 해당 내의 주차 번호
157
+ *
158
+ * @example
159
+ * // ISO 8601 표준 (월요일 시작, 최소 4)
160
+ * new DateOnly(2025, 1, 15).getWeekSeqOfMonth(); // { year: 2025, monthSeq: 1, weekSeq: 3 }
161
+ *
162
+ * // 미국식 (일요일 시작, 첫 주 최소 1일)
163
+ * new DateOnly(2025, 1, 15).getWeekSeqOfMonth(0, 1); // { year: 2025, monthSeq: 1, weekSeq: 3 }
164
+ */
165
+ getWeekSeqOfMonth(weekStartDay = 1, minDaysInFirstWeek = 4) {
166
+ const base = this.getBaseYearMonthSeqForWeekSeq(weekStartDay, minDaysInFirstWeek);
167
+ const firstWeekStart = new DateOnly(base.year, base.monthSeq, 1).getWeekSeqStartDate(weekStartDay, minDaysInFirstWeek);
168
+ const diffDays = (this.tick - firstWeekStart.tick) / DateOnly.MS_PER_DAY;
169
+ return {
170
+ year: base.year,
171
+ monthSeq: base.monthSeq,
172
+ weekSeq: Math.floor(diffDays / 7) + 1,
173
+ };
174
+ }
175
+ /**
176
+ * 주차 정보 기반으로 해당 주의 시작 날짜 반환
177
+ * @param arg 연도, 선택적 월, 주차 번호
178
+ * @param weekStartDay 주 시작 요일 (0=일요일, 1=월요일, ..., 6=토요일). 기본값: 1(월요일)
179
+ * @param minDaysInFirstWeek 첫 번째 주로 간주되기 위한 최소 일수 (1~7). 기본값: 4 (ISO 8601 표준)
180
+ * @returns 지정된 주의 시작 날짜
181
+ *
182
+ * @example
183
+ * // 2025년 2주차 시작 날짜 (ISO 8601 표준)
184
+ * DateOnly.getDateByYearWeekSeq({ year: 2025, weekSeq: 2 }); // 2025-01-06 (월요일)
185
+ *
186
+ * // 2025년 1월 3주차 시작 날짜
187
+ * DateOnly.getDateByYearWeekSeq({ year: 2025, month: 1, weekSeq: 3 }); // 2025-01-13 (월요일)
188
+ */
189
+ static getDateByYearWeekSeq(arg, weekStartDay = 1, minDaysInFirstWeek = 4) {
190
+ return new DateOnly(arg.year, arg.month ?? 1, (arg.weekSeq - 1) * 7 + 1).getWeekSeqStartDate(weekStartDay, minDaysInFirstWeek);
191
+ }
192
+ //#endregion
193
+ //#region Getters (읽기 전용)
194
+ /** 날짜가 올바르게 설정되었는지 여부 */
195
+ get isValid() {
196
+ return this.date instanceof Date && !Number.isNaN(this.date.getTime());
197
+ }
198
+ get year() {
199
+ return this.date.getFullYear();
200
+ }
201
+ get month() {
202
+ return this.date.getMonth() + 1;
203
+ }
204
+ get day() {
205
+ return this.date.getDate();
206
+ }
207
+ get tick() {
208
+ return this.date.getTime();
209
+ }
210
+ /** 요일 (일요일~토요일: 0~6) */
211
+ get dayOfWeek() {
212
+ return this.date.getDay();
213
+ }
214
+ //#endregion
215
+ //#region 불변 변환 메서드 (새 인스턴스 반환)
216
+ /** 지정된 연도로 새 인스턴스 반환 */
217
+ setYear(year) {
218
+ const lastDay = new Date(year, this.month, 0).getDate();
219
+ return new DateOnly(year, this.month, Math.min(this.day, lastDay));
220
+ }
221
+ /**
222
+ * 지정된 월로 새 DateOnly 인스턴스 반환
223
+ * @param month 설정할 월 (1-12, 범위 밖의 값은 연도에서 조정됨)
224
+ * @note 현재 일이 대상 월의 일수보다 크면 해당 월의 마지막 일로 조정됨
225
+ * (예: 1월 31일에서 setMonth(2) → 2월 28일 또는 29일)
226
+ */
227
+ setMonth(month) {
228
+ const normalized = normalizeMonth(this.year, month, this.day);
229
+ return new DateOnly(normalized.year, normalized.month, normalized.day);
230
+ }
231
+ /**
232
+ * 지정된 일로 새 DateOnly 인스턴스 반환
233
+ * @param day 설정할 일
234
+ * @note 유효한 월 범위를 벗어나는 일은 JavaScript Date 동작에 따라 자동으로 다음/이전 월로 조정됨
235
+ * (예: 1월에 day=32 → 2월 1일)
236
+ */
237
+ setDay(day) {
238
+ return new DateOnly(this.year, this.month, day);
239
+ }
240
+ //#endregion
241
+ //#region 산술 메서드 (새 인스턴스 반환)
242
+ /** 지정된 연수를 더한 새 인스턴스 반환 */
243
+ addYears(years) {
244
+ return this.setYear(this.year + years);
245
+ }
246
+ /** 지정된 월수를 더한 새 인스턴스 반환 */
247
+ addMonths(months) {
248
+ return this.setMonth(this.month + months);
249
+ }
250
+ /** 지정된 일수를 더한 새 인스턴스 반환 */
251
+ addDays(days) {
252
+ return new DateOnly(this.tick + days * DateOnly.MS_PER_DAY);
253
+ }
254
+ //#endregion
255
+ //#region Formatting
256
+ /**
257
+ * 지정된 형식으로 문자열 변환
258
+ * @param format 형식 문자열
259
+ * @see dtFormat 지원되는 형식 문자열 참조
260
+ */
261
+ toFormatString(formatStr) {
262
+ return format(formatStr, {
263
+ year: this.year,
264
+ month: this.month,
265
+ day: this.day,
266
+ });
267
+ }
268
+ toString() {
269
+ return this.toFormatString("yyyy-MM-dd");
105
270
  }
106
- }
107
- /**
108
- * Return year and week sequence information
109
- * @param weekStartDay Week start day (0=Sunday, 1=Monday, ..., 6=Saturday). Default: 1(Monday)
110
- * @param minDaysInFirstWeek Minimum days to be considered the first week (1~7). Default: 4 (ISO 8601 standard)
111
- * @returns Year and week number within that year
112
- *
113
- * @example
114
- * // ISO 8601 standard (Monday start, first week minimum 4 days)
115
- * new DateOnly(2025, 1, 6).getWeekSeqOfYear(); // { year: 2025, weekSeq: 2 }
116
- *
117
- * // US style (Sunday start, first week minimum 1 day)
118
- * new DateOnly(2025, 1, 1).getWeekSeqOfYear(0, 1); // { year: 2025, weekSeq: 1 }
119
- */
120
- getWeekSeqOfYear(weekStartDay = 1, minDaysInFirstWeek = 4) {
121
- const base = this.getBaseYearMonthSeqForWeekSeq(weekStartDay, minDaysInFirstWeek);
122
- const firstWeekStart = new DateOnly(base.year, 1, 1).getWeekSeqStartDate(
123
- weekStartDay,
124
- minDaysInFirstWeek
125
- );
126
- const diffDays = (this.tick - firstWeekStart.tick) / DateOnly.MS_PER_DAY;
127
- return {
128
- year: base.year,
129
- weekSeq: Math.floor(diffDays / 7) + 1
130
- };
131
- }
132
- /**
133
- * Return year, month and week sequence information for the given date
134
- * @param weekStartDay Week start day (0=Sunday, 1=Monday, ..., 6=Saturday). Default: 1(Monday)
135
- * @param minDaysInFirstWeek Minimum days to be considered the first week (1~7). Default: 4 (ISO 8601 standard)
136
- * @returns Year, month and week number within that month
137
- *
138
- * @example
139
- * // ISO 8601 standard (Monday start, first week minimum 4 days)
140
- * new DateOnly(2025, 1, 15).getWeekSeqOfMonth(); // { year: 2025, monthSeq: 1, weekSeq: 3 }
141
- *
142
- * // US style (Sunday start, first week minimum 1 day)
143
- * new DateOnly(2025, 1, 15).getWeekSeqOfMonth(0, 1); // { year: 2025, monthSeq: 1, weekSeq: 3 }
144
- */
145
- getWeekSeqOfMonth(weekStartDay = 1, minDaysInFirstWeek = 4) {
146
- const base = this.getBaseYearMonthSeqForWeekSeq(weekStartDay, minDaysInFirstWeek);
147
- const firstWeekStart = new DateOnly(base.year, base.monthSeq, 1).getWeekSeqStartDate(
148
- weekStartDay,
149
- minDaysInFirstWeek
150
- );
151
- const diffDays = (this.tick - firstWeekStart.tick) / DateOnly.MS_PER_DAY;
152
- return {
153
- year: base.year,
154
- monthSeq: base.monthSeq,
155
- weekSeq: Math.floor(diffDays / 7) + 1
156
- };
157
- }
158
- /**
159
- * Get the start date of a week based on week information
160
- * @param arg Year, optional month, and week number
161
- * @param weekStartDay Week start day (0=Sunday, 1=Monday, ..., 6=Saturday). Default: 1(Monday)
162
- * @param minDaysInFirstWeek Minimum days to be considered the first week (1~7). Default: 4 (ISO 8601 standard)
163
- * @returns Start date of the specified week
164
- *
165
- * @example
166
- * // Start date of week 2 in 2025 (ISO 8601 standard)
167
- * DateOnly.getDateByYearWeekSeq({ year: 2025, weekSeq: 2 }); // 2025-01-06 (Monday)
168
- *
169
- * // Start date of week 3 in January 2025
170
- * DateOnly.getDateByYearWeekSeq({ year: 2025, month: 1, weekSeq: 3 }); // 2025-01-13 (Monday)
171
- */
172
- static getDateByYearWeekSeq(arg, weekStartDay = 1, minDaysInFirstWeek = 4) {
173
- return new DateOnly(arg.year, arg.month ?? 1, (arg.weekSeq - 1) * 7 + 1).getWeekSeqStartDate(
174
- weekStartDay,
175
- minDaysInFirstWeek
176
- );
177
- }
178
- //#endregion
179
- //#region Getters (read-only)
180
- /** Whether the date is set correctly */
181
- get isValid() {
182
- return this.date instanceof Date && !Number.isNaN(this.date.getTime());
183
- }
184
- get year() {
185
- return this.date.getFullYear();
186
- }
187
- get month() {
188
- return this.date.getMonth() + 1;
189
- }
190
- get day() {
191
- return this.date.getDate();
192
- }
193
- get tick() {
194
- return this.date.getTime();
195
- }
196
- /** Day of week (Sunday~Saturday: 0~6) */
197
- get dayOfWeek() {
198
- return this.date.getDay();
199
- }
200
- //#endregion
201
- //#region Immutable transformation methods (returns new instance)
202
- /** Return new instance with specified year */
203
- setYear(year) {
204
- return new DateOnly(year, this.month, this.day);
205
- }
206
- /**
207
- * Return new DateOnly instance with specified month
208
- * @param month Month to set (1-12, out-of-range values are adjusted in year)
209
- * @note If current day is greater than target month's day count, it will be adjusted to last day of month
210
- * (e.g., setMonth(2) on Jan 31 → Feb 28 or 29)
211
- */
212
- setMonth(month) {
213
- const normalized = normalizeMonth(this.year, month, this.day);
214
- return new DateOnly(normalized.year, normalized.month, normalized.day);
215
- }
216
- /**
217
- * Return new DateOnly instance with specified day
218
- * @param day Day to set
219
- * @note Days outside valid month range are automatically adjusted to next/previous month per JavaScript Date behavior
220
- * (e.g., day=32 in January → February 1)
221
- */
222
- setDay(day) {
223
- return new DateOnly(this.year, this.month, day);
224
- }
225
- //#endregion
226
- //#region Arithmetic methods (returns new instance)
227
- /** Return new instance with specified years added */
228
- addYears(years) {
229
- return this.setYear(this.year + years);
230
- }
231
- /** Return new instance with specified months added */
232
- addMonths(months) {
233
- return this.setMonth(this.month + months);
234
- }
235
- /** Return new instance with specified days added */
236
- addDays(days) {
237
- return new DateOnly(this.tick + days * DateOnly.MS_PER_DAY);
238
- }
239
- //#endregion
240
- //#region Formatting
241
- /**
242
- * Convert to string with specified format
243
- * @param format Format string
244
- * @see dtFormat for supported format strings
245
- */
246
- toFormatString(formatStr) {
247
- return format(formatStr, {
248
- year: this.year,
249
- month: this.month,
250
- day: this.day
251
- });
252
- }
253
- toString() {
254
- return this.toFormatString("yyyy-MM-dd");
255
- }
256
- //#endregion
257
271
  }
258
- export {
259
- DateOnly
260
- };
261
- //# sourceMappingURL=date-only.js.map
272
+ //# sourceMappingURL=date-only.js.map
@@ -1,6 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/types/date-only.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }
1
+ {"version":3,"file":"date-only.js","sourceRoot":"","sources":["../../src/types/date-only.ts"],"names":[],"mappings":"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"}