kor-lunar 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # kor-lunar
2
2
 
3
- 이 라이브러리는 학습용으로 제작되었으며, 한국천문연구원(KASI)의 음력·양력 데이터를 기반으로 한 자바스크립트 라이브러리입니다. 오프라인 환경에서도 사용할 수 있도록 구현되었습니다.
3
+ 이 라이브러리는 학습용으로 제작되었으며, 한국천문연구원(KASI)의 음력·양력 변환 데이터를 기반으로 한 자바스크립트 라이브러리입니다.
4
+ 네트워크 요청 없이 **오프라인에서도 동작**하고, 별도의 외부 의존성이 없습니다.
4
5
 
5
6
  > **⚠️ 주의:** 데이터는 **2025년 5월 20일 기준**으로 갱신되었습니다.
6
7
  > 이후의 중요한 변경 사항이 반영되지 않을 수 있으므로,
@@ -8,11 +9,13 @@
8
9
 
9
10
  ## 특징
10
11
 
11
- - **음력 ↔ 양력 변환** 지원
12
- - **윤달 처리** 가능 (`isLeapMonth` 옵션)
13
- - **음력 간지 출력**: 세차(`secha`), 월건(`wolgeon`), 일진(`iljin`) 포함
12
+ - **음력 ↔ 양력 변환** - `toLunar`, `toSolar`
13
+ - **윤달 처리** - `isLeapMonth` 옵션
14
+ - **음력 간지 출력** - 세차(`secha`), 월건(`wolgeon`), 일진(`iljin`)
14
15
  - 윤달인 경우 `wolgeon`은 빈 문자열로 반환됩니다
15
- - **오프라인** 환경에서도 사용 가능
16
+ - **TypeScript 지원** - 타입 정의 기본 제공
17
+ - **Zero Dependencies** - 외부 의존성 없음
18
+ - **CJS / ESM / UMD** — 다양한 환경에서 사용 가능
16
19
 
17
20
  - [예제 사이트](https://kahyou22.github.io/kor-lunar-js/)
18
21
 
@@ -29,6 +32,14 @@ _범위를 벗어난 날짜가 입력될 경우 `RangeError`가 발생하며,
29
32
  npm install kor-lunar
30
33
  ```
31
34
 
35
+ ### 브라우저 CDN
36
+
37
+ ```html
38
+ <script src="https://cdn.jsdelivr.net/npm/kor-lunar@1.4/dist/kor-lunar.min.js"></script>
39
+ ```
40
+
41
+ CDN 사용 시 전역 변수 `korLunar`로 접근할 수 있습니다.
42
+
32
43
  ## 사용법
33
44
 
34
45
  ### 모듈 불러오기
@@ -39,10 +50,10 @@ import korLunar from "kor-lunar";
39
50
  const korLunar = require("kor-lunar");
40
51
  ```
41
52
 
42
- ### 브라우저 CDN
53
+ Named export도 지원합니다:
43
54
 
44
- ```html
45
- <script src="https://cdn.jsdelivr.net/npm/kor-lunar@1.4/dist/kor-lunar.min.js"></script>
55
+ ```js
56
+ import { toLunar, toSolar } from "kor-lunar";
46
57
  ```
47
58
 
48
59
  ## 예제
@@ -66,6 +77,7 @@ console.log(korLunar.toLunar(2025, 6, 25));
66
77
  // dayOfWeek: 3
67
78
  // }
68
79
 
80
+ // 양력 → 음력 (윤달)
69
81
  console.log(korLunar.toLunar(2025, 7, 25));
70
82
  // {
71
83
  // year: 2025,
@@ -87,8 +99,8 @@ console.log(korLunar.toSolar(2025, 6, 1, true));
87
99
  // { year: 2025, month: 7, day: 25 }
88
100
  ```
89
101
 
90
- > 권장되진 않지만, `korLunar.LunarData`나 `korLunar.SolarData` 같은 내부 함수에 직접 접근할 수도 있습니다.
91
- > 이를 통해 단순 음력 변환을 넘어, 더 다양한 기능을 구현할 수 있습니다.
102
+ > 권장되진 않지만, `korLunar.LunarTable`과 `korLunar.SolarTable` 같은 내부 함수에 직접 접근할 수도 있습니다.
103
+ > 이를 통해 단순 음력 변환 뿐만 아니라, 더 다양한 기능을 구현할 수 있습니다.
92
104
  > [예제 사이트: 음력 달력](https://kahyou22.github.io/kor-lunar-js/#lunarCalendar)
93
105
 
94
106
  ## 라이선스
package/dist/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
- import { toLunar, toSolar, LunarData, SolarData, LunarDate, SolarDate } from "./kor-lunar";
1
+ import { toLunar, toSolar, LunarTable, SolarTable, LunarData, SolarData, LunarDate, SolarDate } from "./kor-lunar";
2
2
  declare const korLunar: {
3
3
  toLunar: (solYear: number, solMonth: number, solDay: number) => LunarDate;
4
4
  toSolar: (lunYear: number, lunMonth: number, lunDay: number, isLeapMonth: boolean) => SolarDate;
5
- LunarData: typeof LunarData;
6
- SolarData: typeof SolarData;
5
+ LunarTable: typeof LunarTable;
6
+ SolarTable: typeof SolarTable;
7
+ LunarData: typeof LunarTable;
8
+ SolarData: typeof SolarTable;
7
9
  };
8
10
  export default korLunar;
9
- export { toLunar, toSolar, LunarData, SolarData, LunarDate, SolarDate };
11
+ export { toLunar, toSolar, LunarTable, SolarTable, LunarData, SolarData, LunarDate, SolarDate };
@@ -1,3 +1,5 @@
1
+ import * as LunarTable from "./lunar-table";
2
+ import * as SolarTable from "./solar-table";
1
3
  export interface LunarDate {
2
4
  year: number;
3
5
  month: number;
@@ -33,5 +35,8 @@ export declare const toLunar: (solYear: number, solMonth: number, solDay: number
33
35
  * @returns 양력 날짜
34
36
  */
35
37
  export declare const toSolar: (lunYear: number, lunMonth: number, lunDay: number, isLeapMonth: boolean) => SolarDate;
36
- export * as LunarData from "./lunar-data";
37
- export * as SolarData from "./solar-data";
38
+ export { LunarTable, SolarTable };
39
+ /** @deprecated `LunarData`는 `LunarTable`로 이름이 변경되었습니다. */
40
+ export declare const LunarData: typeof LunarTable;
41
+ /** @deprecated `SolarData`는 `SolarTable`로 이름이 변경되었습니다. */
42
+ export declare const SolarData: typeof SolarTable;
@@ -228,8 +228,46 @@ var isValidDate$1 = function (year, month, day, isLeapMonth) {
228
228
  var endDay = isLeapMonth ? getLeapMonthDays(year, month) : getMonthDays$1(year, month);
229
229
  return day <= endDay;
230
230
  };
231
+ /**
232
+ * 해당 월의 0-based 연속적인 월 인덱스를 반환합니다.
233
+ * @param year 1890년 ~ 2050년
234
+ * @param month 1월 ~ 12월
235
+ * @param isLeapMonth 대상이 윤달이면 true
236
+ * @returns 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
237
+ */
238
+ var getMonthIndex = function (year, month, isLeapMonth) {
239
+ month = toInt(month);
240
+ var index = month;
241
+ if (hasLeapMonth(year)) {
242
+ var leapMonth = getLeapMonth(year);
243
+ if ((isLeapMonth && month === leapMonth) || month > leapMonth) {
244
+ index++;
245
+ }
246
+ }
247
+ return index - 1;
248
+ };
249
+ /**
250
+ * 0-based 연속적인 월 인덱스에 해당하는 월과 윤달 여부를 반환합니다.
251
+ * @param year 1890년 ~ 2050년
252
+ * @param monthIndex 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
253
+ * @returns month (1~12)와 isLeapMonth 여부
254
+ */
255
+ var getMonthFromIndex = function (year, monthIndex) {
256
+ var leapMonth = getLeapMonth(year);
257
+ var isLeapMonth = false;
258
+ var index = monthIndex;
259
+ if (leapMonth > 0) {
260
+ if (index === leapMonth) {
261
+ isLeapMonth = true;
262
+ }
263
+ if (index >= leapMonth) {
264
+ index--;
265
+ }
266
+ }
267
+ return { month: index + 1, isLeapMonth: isLeapMonth };
268
+ };
231
269
 
232
- var LunarData = /*#__PURE__*/Object.freeze({
270
+ var LunarTable = /*#__PURE__*/Object.freeze({
233
271
  __proto__: null,
234
272
  BASE_YEAR: BASE_YEAR$1,
235
273
  BASE_MONTH: BASE_MONTH$1,
@@ -253,7 +291,9 @@ var LunarData = /*#__PURE__*/Object.freeze({
253
291
  getIljinByJulianDay: getIljinByJulianDay,
254
292
  getIljin: getIljin,
255
293
  isDateInRange: isDateInRange$1,
256
- isValidDate: isValidDate$1
294
+ isValidDate: isValidDate$1,
295
+ getMonthIndex: getMonthIndex,
296
+ getMonthFromIndex: getMonthFromIndex
257
297
  });
258
298
 
259
299
  var MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -348,7 +388,7 @@ var isValidDate = function (year, month, day) {
348
388
  return day <= endDay;
349
389
  };
350
390
 
351
- var SolarData = /*#__PURE__*/Object.freeze({
391
+ var SolarTable = /*#__PURE__*/Object.freeze({
352
392
  __proto__: null,
353
393
  BASE_YEAR: BASE_YEAR,
354
394
  BASE_MONTH: BASE_MONTH,
@@ -458,8 +498,12 @@ var toSolar = function (lunYear, lunMonth, lunDay, isLeapMonth) {
458
498
  }
459
499
  return { year: year, month: month, day: day };
460
500
  };
501
+ /** @deprecated `LunarData`는 `LunarTable`로 이름이 변경되었습니다. */
502
+ var LunarData = LunarTable;
503
+ /** @deprecated `SolarData`는 `SolarTable`로 이름이 변경되었습니다. */
504
+ var SolarData = SolarTable;
461
505
 
462
- var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarData: LunarData, SolarData: SolarData };
506
+ var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarTable: LunarTable, SolarTable: SolarTable, LunarData: LunarData, SolarData: SolarData };
463
507
 
464
- export { LunarData, SolarData, korLunar as default, toLunar, toSolar };
508
+ export { LunarData, LunarTable, SolarData, SolarTable, korLunar as default, toLunar, toSolar };
465
509
  //# sourceMappingURL=kor-lunar.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"kor-lunar.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"kor-lunar.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/kor-lunar.js CHANGED
@@ -232,8 +232,46 @@ var isValidDate$1 = function (year, month, day, isLeapMonth) {
232
232
  var endDay = isLeapMonth ? getLeapMonthDays(year, month) : getMonthDays$1(year, month);
233
233
  return day <= endDay;
234
234
  };
235
+ /**
236
+ * 해당 월의 0-based 연속적인 월 인덱스를 반환합니다.
237
+ * @param year 1890년 ~ 2050년
238
+ * @param month 1월 ~ 12월
239
+ * @param isLeapMonth 대상이 윤달이면 true
240
+ * @returns 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
241
+ */
242
+ var getMonthIndex = function (year, month, isLeapMonth) {
243
+ month = toInt(month);
244
+ var index = month;
245
+ if (hasLeapMonth(year)) {
246
+ var leapMonth = getLeapMonth(year);
247
+ if ((isLeapMonth && month === leapMonth) || month > leapMonth) {
248
+ index++;
249
+ }
250
+ }
251
+ return index - 1;
252
+ };
253
+ /**
254
+ * 0-based 연속적인 월 인덱스에 해당하는 월과 윤달 여부를 반환합니다.
255
+ * @param year 1890년 ~ 2050년
256
+ * @param monthIndex 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
257
+ * @returns month (1~12)와 isLeapMonth 여부
258
+ */
259
+ var getMonthFromIndex = function (year, monthIndex) {
260
+ var leapMonth = getLeapMonth(year);
261
+ var isLeapMonth = false;
262
+ var index = monthIndex;
263
+ if (leapMonth > 0) {
264
+ if (index === leapMonth) {
265
+ isLeapMonth = true;
266
+ }
267
+ if (index >= leapMonth) {
268
+ index--;
269
+ }
270
+ }
271
+ return { month: index + 1, isLeapMonth: isLeapMonth };
272
+ };
235
273
 
236
- var LunarData = /*#__PURE__*/Object.freeze({
274
+ var LunarTable = /*#__PURE__*/Object.freeze({
237
275
  __proto__: null,
238
276
  BASE_YEAR: BASE_YEAR$1,
239
277
  BASE_MONTH: BASE_MONTH$1,
@@ -257,7 +295,9 @@ var LunarData = /*#__PURE__*/Object.freeze({
257
295
  getIljinByJulianDay: getIljinByJulianDay,
258
296
  getIljin: getIljin,
259
297
  isDateInRange: isDateInRange$1,
260
- isValidDate: isValidDate$1
298
+ isValidDate: isValidDate$1,
299
+ getMonthIndex: getMonthIndex,
300
+ getMonthFromIndex: getMonthFromIndex
261
301
  });
262
302
 
263
303
  var MONTH_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -352,7 +392,7 @@ var isValidDate = function (year, month, day) {
352
392
  return day <= endDay;
353
393
  };
354
394
 
355
- var SolarData = /*#__PURE__*/Object.freeze({
395
+ var SolarTable = /*#__PURE__*/Object.freeze({
356
396
  __proto__: null,
357
397
  BASE_YEAR: BASE_YEAR,
358
398
  BASE_MONTH: BASE_MONTH,
@@ -462,11 +502,17 @@ var toSolar = function (lunYear, lunMonth, lunDay, isLeapMonth) {
462
502
  }
463
503
  return { year: year, month: month, day: day };
464
504
  };
505
+ /** @deprecated `LunarData`는 `LunarTable`로 이름이 변경되었습니다. */
506
+ var LunarData = LunarTable;
507
+ /** @deprecated `SolarData`는 `SolarTable`로 이름이 변경되었습니다. */
508
+ var SolarData = SolarTable;
465
509
 
466
- var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarData: LunarData, SolarData: SolarData };
510
+ var korLunar = { toLunar: toLunar, toSolar: toSolar, LunarTable: LunarTable, SolarTable: SolarTable, LunarData: LunarData, SolarData: SolarData };
467
511
 
468
512
  exports.LunarData = LunarData;
513
+ exports.LunarTable = LunarTable;
469
514
  exports.SolarData = SolarData;
515
+ exports.SolarTable = SolarTable;
470
516
  exports["default"] = korLunar;
471
517
  exports.toLunar = toLunar;
472
518
  exports.toSolar = toSolar;
@@ -1 +1 @@
1
- {"version":3,"file":"kor-lunar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"kor-lunar.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,2 +1,2 @@
1
- var korLunar=function(n){"use strict";var t=function(n){return"string"==typeof n||"number"==typeof n?~~n:n},r=[50342582,46534058,50360036,46403236,46402890,50222421,46533271,46400854,50345309,46533333,50367442,46401362,46534309,50223914,46401099,46533275,50416294,46400874,46533465,50342826,46401362,50359717,46402341,46402123,50354523,46533293,46400874,50341301,46533545,50363858,46402962,46402853,50355501,46401878,46400181,50481885,46401236,46534057,50343626,46403218,50226854,46400807,46533207,50420054,46533338,46401236,50411345,46401353,50428691,46402195,46400811,50423067,46532973,46533482,50417060,46402468,46402377,50343243,46402197,50363051,46400813,46533293,50420394,46534066,46402980,50413217,46402890,50367893,46402198,46400854,50357621,46533333,46401234,50349909,46534309,46403146,50214478,46533275,50363094,46400874,46533465,50355122,46401362,46401317,50350891,46402123,50366891,46400173,46531947,50423209,46534057,46402962,50351509,46402853,50376269,46402134,46400182,50490093,46401236,46534057,50355922,46403218,46402854,50214190,46533207,50366902,46533466,46401236,50354025,46401353,46401171,50350743,46400811,46533211,50342574,46400362,50494933,46402468,46402377,50355539,46402197,46400813,50410797,46533293,50371498,46400978,46534053,50355882,46402890,46402197,50350749,46400854,46533301,50342614,46401234,50358117,46534309,46403146,50222678,46533787,46400858,50345325,46533481,50380626,46401362,46402341,50424587,46402123,46400683,50352827,46531949,46533481,50343338,46402962,50364069,46402853,46402125,50420301,46400182,46532021,79569],e=["갑","을","병","정","무","기","경","신","임","계"],a=["자","축","인","묘","진","사","오","미","신","유","술","해"],o=1890,u=18900101,i=2050,f=20501118,c={},l=function(n){return n=t(n),r[n-o]},g=function(n,r){return r=t(r),0===(l(n)>>r-1&1)?29:30},A=function(n){return l(n)>>12&15},_=function(n,r){return(r=t(r))===A(n)},D=function(n,t){return _(n,t)?0===(l(n)>>16&1)?29:30:0},s=function(n){return l(n)>>17&511};c[1890]=0;for(var h=1891;h<=i;h++)c[h]=c[h-1]+s(h-1);var M=function(n){return n=t(n),c[n]},y=function(n,r,e){r=t(r);for(var a=0,o=1;o<r;o++)a+=g(n,o),o===A(n)&&(a+=D(n,o));var u=A(n);return e&&u===r&&(a+=g(n,r)),a},E=function(n,r,e,a){return e=t(e),M(n)+y(n,r,a)+e},v=function(n){return n=t(n),e[(n+6)%e.length]+a[(n+8)%a.length]},L=function(n,r){return n=t(n),r=t(r),e[(2*n+r+3)%e.length]+a[(r+1)%a.length]},B=function(n){return n=t(n),e[(n-1)%e.length]+a[(n+1)%a.length]},S=function(n,r,e){var a=1e4*(n=t(n))+100*(r=t(r))+(e=t(e));return a>=u&&a<=f},Y=Object.freeze({__proto__:null,BASE_YEAR:o,BASE_MONTH:1,BASE_DAY:1,BASE_VALUE:u,MAX_YEAR:i,MAX_MONTH:11,MAX_DAY:18,MAX_VALUE:f,getMonthDays:g,getLeapMonth:A,hasLeapMonth:function(n){return 0!==A(n)},isLeapMonth:_,getLeapMonthDays:D,getYearDays:s,getTotalDaysBeforeYear:M,getTotalDaysBeforeMonth:y,getTotalDays:E,getSecha:v,getWolgeon:L,getIljinByJulianDay:B,getIljin:function(n,t,r,e){var a=E(n,t,r,e);return B(a-1)},isDateInRange:S,isValidDate:function(n,r,e,a){if(n=t(n),r=t(r),e=t(e),n<o||n>i)return!1;if(n===o){if(r<1)return!1;if(1===r&&e<1)return!1}if(n===i){if(r>11)return!1;if(11===r&&e>18)return!1}return!(r<1||r>12)&&(!(e<1)&&e<=(a?D(n,r):g(n,r)))}}),p=[31,28,31,30,31,30,31,31,30,31,30,31],T=1890,d=18900121,O=2050,R=20501231,X={},j=function(n){return(n=t(n))%4==0&&n%100!=0||n%400==0},V=function(n,r){return 2===(r=t(r))&&j(n)?29:p[r-1]},w=function(n){return j(n)?366:365};X[1890]=0;for(var b=1891;b<=O;b++)X[b]=X[b-1]+w(b-1);var m=function(n){return n=t(n),X[n]},H=function(n,t){for(var r=0,e=1;e<t;e++)r+=V(n,e);return r},I=function(n,t,r){return m(n)+H(n,t)+r},N=function(n,r,e){var a=1e4*(n=t(n))+100*(r=t(r))+(e=t(e));return a>=d&&a<=R},U=Object.freeze({__proto__:null,BASE_YEAR:T,BASE_MONTH:1,BASE_DAY:21,BASE_VALUE:d,MAX_YEAR:O,MAX_MONTH:12,MAX_DAY:31,MAX_VALUE:R,isLeapYear:j,getMonthDays:V,getYearDays:w,getTotalDaysBeforeYear:m,getTotalDaysBeforeMonth:H,getTotalDays:I,isDateInRange:N,isValidDate:function(n,r,e){if(n=t(n),r=t(r),e=t(e),n<T||n>O)return!1;if(n===T){if(r<1)return!1;if(1===r&&e<21)return!1}if(n===O){if(r>12)return!1;if(12===r&&e>31)return!1}return!(r<1||r>12)&&(!(e<1)&&e<=V(n,r))}}),k=function(n,r,e){if(n=t(n),r=t(r),e=t(e),!N(n,r,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(r,"-").concat(e));var a=Math.min(n,i),o=n>i?11:r,u=1,f=E(a,o,u,!0),c=I(n,r,e);u+=c-20-f;for(var l=c-20,_=2411389+l-1,s=(l+1)%7,h=o===A(a);u<1;)h?h=!1:(0===--o&&(o=12,a--),h=o===A(a)),u+=h?D(a,o):g(a,o);return{year:a,month:o,day:u,isLeapMonth:h,secha:v(a),wolgeon:h?"":L(a,o),iljin:B(_),julianDay:_,dayOfWeek:s}},z=function(n,r,e,a){if(n=t(n),r=t(r),e=t(e),!S(n,r,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(r,"-").concat(e));for(var o=n,u=r,i=e+(E(n,r,e,a)-(I(n,r,e)-20)),f=V(o,u);i>f;)i-=f,++u>12&&(u=1,o++),f=V(o,u);return{year:o,month:u,day:i}},W={toLunar:k,toSolar:z,LunarData:Y,SolarData:U};return n.LunarData=Y,n.SolarData=U,n.default=W,n.toLunar=k,n.toSolar=z,Object.defineProperty(n,"__esModule",{value:!0}),n}({});
1
+ var korLunar=function(n){"use strict";var t=function(n){return"string"==typeof n||"number"==typeof n?~~n:n},r=[50342582,46534058,50360036,46403236,46402890,50222421,46533271,46400854,50345309,46533333,50367442,46401362,46534309,50223914,46401099,46533275,50416294,46400874,46533465,50342826,46401362,50359717,46402341,46402123,50354523,46533293,46400874,50341301,46533545,50363858,46402962,46402853,50355501,46401878,46400181,50481885,46401236,46534057,50343626,46403218,50226854,46400807,46533207,50420054,46533338,46401236,50411345,46401353,50428691,46402195,46400811,50423067,46532973,46533482,50417060,46402468,46402377,50343243,46402197,50363051,46400813,46533293,50420394,46534066,46402980,50413217,46402890,50367893,46402198,46400854,50357621,46533333,46401234,50349909,46534309,46403146,50214478,46533275,50363094,46400874,46533465,50355122,46401362,46401317,50350891,46402123,50366891,46400173,46531947,50423209,46534057,46402962,50351509,46402853,50376269,46402134,46400182,50490093,46401236,46534057,50355922,46403218,46402854,50214190,46533207,50366902,46533466,46401236,50354025,46401353,46401171,50350743,46400811,46533211,50342574,46400362,50494933,46402468,46402377,50355539,46402197,46400813,50410797,46533293,50371498,46400978,46534053,50355882,46402890,46402197,50350749,46400854,46533301,50342614,46401234,50358117,46534309,46403146,50222678,46533787,46400858,50345325,46533481,50380626,46401362,46402341,50424587,46402123,46400683,50352827,46531949,46533481,50343338,46402962,50364069,46402853,46402125,50420301,46400182,46532021,79569],e=["갑","을","병","정","무","기","경","신","임","계"],a=["자","축","인","묘","진","사","오","미","신","유","술","해"],o=1890,u=18900101,i=2050,f=20501118,c={},l=function(n){return n=t(n),r[n-o]},g=function(n,r){return r=t(r),0===(l(n)>>r-1&1)?29:30},A=function(n){return l(n)>>12&15},h=function(n){return 0!==A(n)},M=function(n,r){return(r=t(r))===A(n)},_=function(n,t){return M(n,t)?0===(l(n)>>16&1)?29:30:0},s=function(n){return l(n)>>17&511};c[1890]=0;for(var D=1891;D<=i;D++)c[D]=c[D-1]+s(D-1);var y=function(n){return n=t(n),c[n]},v=function(n,r,e){r=t(r);for(var a=0,o=1;o<r;o++)a+=g(n,o),o===A(n)&&(a+=_(n,o));var u=A(n);return e&&u===r&&(a+=g(n,r)),a},E=function(n,r,e,a){return e=t(e),y(n)+v(n,r,a)+e},L=function(n){return n=t(n),e[(n+6)%e.length]+a[(n+8)%a.length]},S=function(n,r){return n=t(n),r=t(r),e[(2*n+r+3)%e.length]+a[(r+1)%a.length]},T=function(n){return n=t(n),e[(n-1)%e.length]+a[(n+1)%a.length]},B=function(n,r,e){var a=1e4*(n=t(n))+100*(r=t(r))+(e=t(e));return a>=u&&a<=f},Y=Object.freeze({__proto__:null,BASE_YEAR:o,BASE_MONTH:1,BASE_DAY:1,BASE_VALUE:u,MAX_YEAR:i,MAX_MONTH:11,MAX_DAY:18,MAX_VALUE:f,getMonthDays:g,getLeapMonth:A,hasLeapMonth:h,isLeapMonth:M,getLeapMonthDays:_,getYearDays:s,getTotalDaysBeforeYear:y,getTotalDaysBeforeMonth:v,getTotalDays:E,getSecha:L,getWolgeon:S,getIljinByJulianDay:T,getIljin:function(n,t,r,e){var a=E(n,t,r,e);return T(a-1)},isDateInRange:B,isValidDate:function(n,r,e,a){if(n=t(n),r=t(r),e=t(e),n<o||n>i)return!1;if(n===o){if(r<1)return!1;if(1===r&&e<1)return!1}if(n===i){if(r>11)return!1;if(11===r&&e>18)return!1}return!(r<1||r>12)&&(!(e<1)&&e<=(a?_(n,r):g(n,r)))},getMonthIndex:function(n,r,e){var a=r=t(r);if(h(n)){var o=A(n);(e&&r===o||r>o)&&a++}return a-1},getMonthFromIndex:function(n,t){var r=A(n),e=!1,a=t;return r>0&&(a===r&&(e=!0),a>=r&&a--),{month:a+1,isLeapMonth:e}}}),p=[31,28,31,30,31,30,31,31,30,31,30,31],d=1890,b=18900121,O=2050,R=20501231,X={},j=function(n){return(n=t(n))%4==0&&n%100!=0||n%400==0},m=function(n,r){return 2===(r=t(r))&&j(n)?29:p[r-1]},I=function(n){return j(n)?366:365};X[1890]=0;for(var V=1891;V<=O;V++)X[V]=X[V-1]+I(V-1);var w=function(n){return n=t(n),X[n]},H=function(n,t){for(var r=0,e=1;e<t;e++)r+=m(n,e);return r},N=function(n,t,r){return w(n)+H(n,t)+r},U=function(n,r,e){var a=1e4*(n=t(n))+100*(r=t(r))+(e=t(e));return a>=b&&a<=R},k=Object.freeze({__proto__:null,BASE_YEAR:d,BASE_MONTH:1,BASE_DAY:21,BASE_VALUE:b,MAX_YEAR:O,MAX_MONTH:12,MAX_DAY:31,MAX_VALUE:R,isLeapYear:j,getMonthDays:m,getYearDays:I,getTotalDaysBeforeYear:w,getTotalDaysBeforeMonth:H,getTotalDays:N,isDateInRange:U,isValidDate:function(n,r,e){if(n=t(n),r=t(r),e=t(e),n<d||n>O)return!1;if(n===d){if(r<1)return!1;if(1===r&&e<21)return!1}if(n===O){if(r>12)return!1;if(12===r&&e>31)return!1}return!(r<1||r>12)&&(!(e<1)&&e<=m(n,r))}}),x=function(n,r,e){if(n=t(n),r=t(r),e=t(e),!U(n,r,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(r,"-").concat(e));var a=Math.min(n,i),o=n>i?11:r,u=1,f=E(a,o,u,!0),c=N(n,r,e);u+=c-20-f;for(var l=c-20,h=2411389+l-1,M=(l+1)%7,s=o===A(a);u<1;)s?s=!1:(0===--o&&(o=12,a--),s=o===A(a)),u+=s?_(a,o):g(a,o);return{year:a,month:o,day:u,isLeapMonth:s,secha:L(a),wolgeon:s?"":S(a,o),iljin:T(h),julianDay:h,dayOfWeek:M}},z=function(n,r,e,a){if(n=t(n),r=t(r),e=t(e),!B(n,r,e))throw new RangeError("지원되지 않는 날짜입니다. 입력한 날짜: ".concat(n,"-").concat(r,"-").concat(e));for(var o=n,u=r,i=e+(E(n,r,e,a)-(N(n,r,e)-20)),f=m(o,u);i>f;)i-=f,++u>12&&(u=1,o++),f=m(o,u);return{year:o,month:u,day:i}},W=Y,F=k,J={toLunar:x,toSolar:z,LunarTable:Y,SolarTable:k,LunarData:W,SolarData:F};return n.LunarData=W,n.LunarTable=Y,n.SolarData=F,n.SolarTable=k,n.default=J,n.toLunar=x,n.toSolar=z,Object.defineProperty(n,"__esModule",{value:!0}),n}({});
2
2
  //# sourceMappingURL=kor-lunar.min.js.map
@@ -83,3 +83,21 @@ export declare const isDateInRange: (year: number, month: number, day: number) =
83
83
  * @returns 유효한 날짜이면 true
84
84
  */
85
85
  export declare const isValidDate: (year: number, month: number, day: number, isLeapMonth: boolean) => boolean;
86
+ /**
87
+ * 해당 월의 0-based 연속적인 월 인덱스를 반환합니다.
88
+ * @param year 1890년 ~ 2050년
89
+ * @param month 1월 ~ 12월
90
+ * @param isLeapMonth 대상이 윤달이면 true
91
+ * @returns 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
92
+ */
93
+ export declare const getMonthIndex: (year: number, month: number, isLeapMonth: boolean) => number;
94
+ /**
95
+ * 0-based 연속적인 월 인덱스에 해당하는 월과 윤달 여부를 반환합니다.
96
+ * @param year 1890년 ~ 2050년
97
+ * @param monthIndex 윤달이 있는 해는 0~12 (13개월), 없는 해는 0~11 (12개월)
98
+ * @returns month (1~12)와 isLeapMonth 여부
99
+ */
100
+ export declare const getMonthFromIndex: (year: number, monthIndex: number) => {
101
+ month: number;
102
+ isLeapMonth: boolean;
103
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kor-lunar",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "한국 음력 변환 유틸 / Korean lunar calendar converter",
5
5
  "main": "dist/kor-lunar.js",
6
6
  "module": "dist/kor-lunar.esm.js",
File without changes