Browse Source

feat: 完成

Yaavi 1 year ago
parent
commit
be45d1f77d

+ 3 - 0
.babelrc

@@ -0,0 +1,3 @@
+{
+  "presets": ["@babel/preset-env", "@babel/preset-typescript"]
+}

+ 1 - 1
index.html

@@ -7,6 +7,6 @@
   </head>
   <body>
     <!-- <script type="module" src="./solar_terms/index.ts"></script> -->
-    <script type="module" src="./scripts/generate.ts"></script>
+    <script type="module" src="./src/index.ts"></script>
   </body>
 </html>

+ 4 - 0
jest.config.ts

@@ -0,0 +1,4 @@
+module.exports = {
+  preset: "ts-jest",
+  testEnvironment: "node",
+};

File diff suppressed because it is too large
+ 742 - 350
package-lock.json


+ 7 - 3
package.json

@@ -3,12 +3,13 @@
   "version": "1.0.0",
   "description": "中国日期的TS库,含有节假日、调休日、24节气等。",
   "main": "./src/index.ts",
-  "type": "module",
+  "type": "commonjs",
   "scripts": {
     "dev": "vite",
-    "generate": "ts-node scripts/generate.ts",
+    "generate": "ts-node scripts/init.ts",
     "build": "tsc && vite build",
-    "preview": "vite preview"
+    "preview": "vite preview",
+    "test": "jest"
   },
   "keywords": [
     "中国日期",
@@ -22,7 +23,10 @@
     "dayjs": "^1.11.11"
   },
   "devDependencies": {
+    "@types/jest": "^29.5.12",
+    "jest": "^29.7.0",
     "serve": "^14.2.3",
+    "ts-jest": "^29.1.2",
     "ts-node": "^10.9.2",
     "typescript": "^5.4.5",
     "vite": "^5.2.11"

+ 1 - 9
scripts/generate.ts

@@ -1,6 +1,6 @@
 import Arrangement from "../src/holidays/arrangement.ts"
 
-const generate = () => {
+export default () => {
   const arrangement = new Arrangement()
   /**
    * 2024
@@ -471,17 +471,9 @@ const generate = () => {
   * 2001: https://zh.wikisource.org/zh-hans/国务院办公厅关于2001年春节、“五一”、“十一”放假安排的通知
   */
 
-  console.log({
-    holidays: arrangement.holidays,
-    workdays: arrangement.workdays,
-    inLieuDays: arrangement.inLieuDays,
-  })
-
   return {
     holidays: arrangement.holidays,
     workdays: arrangement.workdays,
     inLieuDays: arrangement.inLieuDays,
   }
 }
-
-generate()

+ 49 - 0
scripts/init.ts

@@ -0,0 +1,49 @@
+import fs from "fs";
+import generate from "./generate";
+import { Holiday } from '../src/holidays/arrangement';
+
+const data = generate();
+
+// 反向映射 Holiday 枚举
+const holidayMap: Record<string, keyof typeof Holiday> = Object.fromEntries(
+  Object.entries(Holiday).map(([key, value]) => [value, key as keyof typeof Holiday])
+);
+
+// 映射函数
+type RecordStringHoliday = Record<string, Holiday>;
+type RecordStringName = Record<string, { name: string }>;
+
+const mapToEnum = (obj: Record<string, string>): Record<string, any> => {
+  const result: Record<string, any> = {};
+  for (const [key, value] of Object.entries(obj)) {
+    if (holidayMap[value]) {
+      result[key] = `Holiday.${holidayMap[value]}`;
+    } else {
+      result[key] = `{ name: "${value}" }`;
+    }
+  }
+  return result;
+};
+
+// 转换数据
+const holidays = mapToEnum(data.holidays);
+const workdays = mapToEnum(data.workdays);
+const inLieuDays = mapToEnum(data.inLieuDays);
+
+const formatObjectString = (obj: Record<string, any>): string => {
+  const entries = Object.entries(obj).map(([key, value]) => `  "${key}": ${value}`);
+  return `{\n${entries.join(",\n")}\n}`;
+};
+
+const tsContent = `import { Holiday } from "./arrangement";
+
+export const holidays: Record<string, Holiday> = ${formatObjectString(holidays)};
+export const workdays: Record<string, Holiday> = ${formatObjectString(workdays)};
+export const inLieuDays: Record<string, Holiday> = ${formatObjectString(inLieuDays)};
+`;
+
+// 保存到 arrangement.ts 文件
+fs.writeFile('./src/holidays/constants.ts', tsContent, (err) => {
+  if (err) throw err;
+  console.log('The file has been saved!');
+});

+ 844 - 4
src/holidays/constants.ts

@@ -1,5 +1,845 @@
-import type { Holiday } from "./arrangement";
+import { Holiday } from "./arrangement";
 
-export const holidays: Record<string, Holiday> = {};
-export const workdays: Record<string, Holiday> = {};
-export const inLieuDays: Record<string, Holiday> = {};
+export const holidays: Record<string, Holiday> = {
+  "2024-01-01": Holiday.NewYearsDay,
+  "2024-02-10": Holiday.SpringFestival,
+  "2024-02-11": Holiday.SpringFestival,
+  "2024-02-12": Holiday.SpringFestival,
+  "2024-02-13": Holiday.SpringFestival,
+  "2024-02-14": Holiday.SpringFestival,
+  "2024-02-15": Holiday.SpringFestival,
+  "2024-02-16": Holiday.SpringFestival,
+  "2024-02-17": Holiday.SpringFestival,
+  "2024-04-04": Holiday.TombSweepingDay,
+  "2024-04-05": Holiday.TombSweepingDay,
+  "2024-04-06": Holiday.TombSweepingDay,
+  "2024-05-01": Holiday.LabourDay,
+  "2024-05-02": Holiday.LabourDay,
+  "2024-05-03": Holiday.LabourDay,
+  "2024-05-04": Holiday.LabourDay,
+  "2024-05-05": Holiday.LabourDay,
+  "2024-06-10": Holiday.DragonBoatFestival,
+  "2024-09-15": Holiday.MidAutumnFestival,
+  "2024-09-16": Holiday.MidAutumnFestival,
+  "2024-09-17": Holiday.MidAutumnFestival,
+  "2024-10-01": Holiday.NationalDay,
+  "2024-10-02": Holiday.NationalDay,
+  "2024-10-03": Holiday.NationalDay,
+  "2024-10-04": Holiday.NationalDay,
+  "2024-10-05": Holiday.NationalDay,
+  "2024-10-06": Holiday.NationalDay,
+  "2024-10-07": Holiday.NationalDay,
+  "2023-01-01": Holiday.NewYearsDay,
+  "2023-01-02": Holiday.NewYearsDay,
+  "2023-01-21": Holiday.SpringFestival,
+  "2023-01-22": Holiday.SpringFestival,
+  "2023-01-23": Holiday.SpringFestival,
+  "2023-01-24": Holiday.SpringFestival,
+  "2023-01-25": Holiday.SpringFestival,
+  "2023-01-26": Holiday.SpringFestival,
+  "2023-01-27": Holiday.SpringFestival,
+  "2023-04-05": Holiday.TombSweepingDay,
+  "2023-04-29": Holiday.LabourDay,
+  "2023-04-30": Holiday.LabourDay,
+  "2023-05-01": Holiday.LabourDay,
+  "2023-05-02": Holiday.LabourDay,
+  "2023-05-03": Holiday.LabourDay,
+  "2023-06-22": Holiday.DragonBoatFestival,
+  "2023-06-23": Holiday.DragonBoatFestival,
+  "2023-06-24": Holiday.DragonBoatFestival,
+  "2023-09-29": Holiday.MidAutumnFestival,
+  "2023-09-30": Holiday.NationalDay,
+  "2023-10-01": Holiday.NationalDay,
+  "2023-10-02": Holiday.NationalDay,
+  "2023-10-03": Holiday.NationalDay,
+  "2023-10-04": Holiday.NationalDay,
+  "2023-10-05": Holiday.NationalDay,
+  "2023-10-06": Holiday.NationalDay,
+  "2022-01-01": Holiday.NewYearsDay,
+  "2022-01-02": Holiday.NewYearsDay,
+  "2022-01-03": Holiday.NewYearsDay,
+  "2022-01-31": Holiday.SpringFestival,
+  "2022-02-01": Holiday.SpringFestival,
+  "2022-02-02": Holiday.SpringFestival,
+  "2022-02-03": Holiday.SpringFestival,
+  "2022-02-04": Holiday.SpringFestival,
+  "2022-02-05": Holiday.SpringFestival,
+  "2022-02-06": Holiday.SpringFestival,
+  "2022-04-03": Holiday.TombSweepingDay,
+  "2022-04-04": Holiday.TombSweepingDay,
+  "2022-04-05": Holiday.TombSweepingDay,
+  "2022-04-30": Holiday.LabourDay,
+  "2022-05-01": Holiday.LabourDay,
+  "2022-05-02": Holiday.LabourDay,
+  "2022-05-03": Holiday.LabourDay,
+  "2022-05-04": Holiday.LabourDay,
+  "2022-06-03": Holiday.DragonBoatFestival,
+  "2022-06-04": Holiday.DragonBoatFestival,
+  "2022-06-05": Holiday.DragonBoatFestival,
+  "2022-09-10": Holiday.MidAutumnFestival,
+  "2022-09-11": Holiday.MidAutumnFestival,
+  "2022-09-12": Holiday.MidAutumnFestival,
+  "2022-10-01": Holiday.NationalDay,
+  "2022-10-02": Holiday.NationalDay,
+  "2022-10-03": Holiday.NationalDay,
+  "2022-10-04": Holiday.NationalDay,
+  "2022-10-05": Holiday.NationalDay,
+  "2022-10-06": Holiday.NationalDay,
+  "2022-10-07": Holiday.NationalDay,
+  "2022-12-31": Holiday.NewYearsDay,
+  "2021-01-01": Holiday.NewYearsDay,
+  "2021-01-02": Holiday.NewYearsDay,
+  "2021-01-03": Holiday.NewYearsDay,
+  "2021-02-11": Holiday.SpringFestival,
+  "2021-02-12": Holiday.SpringFestival,
+  "2021-02-13": Holiday.SpringFestival,
+  "2021-02-14": Holiday.SpringFestival,
+  "2021-02-15": Holiday.SpringFestival,
+  "2021-02-16": Holiday.SpringFestival,
+  "2021-02-17": Holiday.SpringFestival,
+  "2021-04-03": Holiday.TombSweepingDay,
+  "2021-04-04": Holiday.TombSweepingDay,
+  "2021-04-05": Holiday.TombSweepingDay,
+  "2021-05-01": Holiday.LabourDay,
+  "2021-05-02": Holiday.LabourDay,
+  "2021-05-03": Holiday.LabourDay,
+  "2021-05-04": Holiday.LabourDay,
+  "2021-05-05": Holiday.LabourDay,
+  "2021-06-12": Holiday.DragonBoatFestival,
+  "2021-06-13": Holiday.DragonBoatFestival,
+  "2021-06-14": Holiday.DragonBoatFestival,
+  "2021-09-19": Holiday.MidAutumnFestival,
+  "2021-09-20": Holiday.MidAutumnFestival,
+  "2021-09-21": Holiday.MidAutumnFestival,
+  "2021-10-01": Holiday.NationalDay,
+  "2021-10-02": Holiday.NationalDay,
+  "2021-10-03": Holiday.NationalDay,
+  "2021-10-04": Holiday.NationalDay,
+  "2021-10-05": Holiday.NationalDay,
+  "2021-10-06": Holiday.NationalDay,
+  "2021-10-07": Holiday.NationalDay,
+  "2020-01-01": Holiday.NewYearsDay,
+  "2020-01-24": Holiday.SpringFestival,
+  "2020-01-25": Holiday.SpringFestival,
+  "2020-01-26": Holiday.SpringFestival,
+  "2020-01-27": Holiday.SpringFestival,
+  "2020-01-28": Holiday.SpringFestival,
+  "2020-01-29": Holiday.SpringFestival,
+  "2020-01-30": Holiday.SpringFestival,
+  "2020-01-31": Holiday.SpringFestival,
+  "2020-02-01": Holiday.SpringFestival,
+  "2020-02-02": Holiday.SpringFestival,
+  "2020-04-04": Holiday.TombSweepingDay,
+  "2020-04-05": Holiday.TombSweepingDay,
+  "2020-04-06": Holiday.TombSweepingDay,
+  "2020-05-01": Holiday.LabourDay,
+  "2020-05-02": Holiday.LabourDay,
+  "2020-05-03": Holiday.LabourDay,
+  "2020-05-04": Holiday.LabourDay,
+  "2020-05-05": Holiday.LabourDay,
+  "2020-06-25": Holiday.DragonBoatFestival,
+  "2020-06-26": Holiday.DragonBoatFestival,
+  "2020-06-27": Holiday.DragonBoatFestival,
+  "2020-10-01": Holiday.NationalDay,
+  "2020-10-02": Holiday.NationalDay,
+  "2020-10-03": Holiday.NationalDay,
+  "2020-10-04": Holiday.NationalDay,
+  "2020-10-05": Holiday.NationalDay,
+  "2020-10-06": Holiday.NationalDay,
+  "2020-10-07": Holiday.NationalDay,
+  "2020-10-08": Holiday.NationalDay,
+  "2019-01-01": Holiday.NewYearsDay,
+  "2019-02-04": Holiday.SpringFestival,
+  "2019-02-05": Holiday.SpringFestival,
+  "2019-02-06": Holiday.SpringFestival,
+  "2019-02-07": Holiday.SpringFestival,
+  "2019-02-08": Holiday.SpringFestival,
+  "2019-02-09": Holiday.SpringFestival,
+  "2019-02-10": Holiday.SpringFestival,
+  "2019-04-05": Holiday.TombSweepingDay,
+  "2019-04-06": Holiday.TombSweepingDay,
+  "2019-04-07": Holiday.TombSweepingDay,
+  "2019-05-01": Holiday.LabourDay,
+  "2019-05-02": Holiday.LabourDay,
+  "2019-05-03": Holiday.LabourDay,
+  "2019-05-04": Holiday.LabourDay,
+  "2019-06-07": Holiday.DragonBoatFestival,
+  "2019-06-08": Holiday.DragonBoatFestival,
+  "2019-06-09": Holiday.DragonBoatFestival,
+  "2019-09-13": Holiday.MidAutumnFestival,
+  "2019-09-14": Holiday.MidAutumnFestival,
+  "2019-09-15": Holiday.MidAutumnFestival,
+  "2019-10-01": Holiday.NationalDay,
+  "2019-10-02": Holiday.NationalDay,
+  "2019-10-03": Holiday.NationalDay,
+  "2019-10-04": Holiday.NationalDay,
+  "2019-10-05": Holiday.NationalDay,
+  "2019-10-06": Holiday.NationalDay,
+  "2019-10-07": Holiday.NationalDay,
+  "2018-01-01": Holiday.NewYearsDay,
+  "2018-02-15": Holiday.SpringFestival,
+  "2018-02-16": Holiday.SpringFestival,
+  "2018-02-17": Holiday.SpringFestival,
+  "2018-02-18": Holiday.SpringFestival,
+  "2018-02-19": Holiday.SpringFestival,
+  "2018-02-20": Holiday.SpringFestival,
+  "2018-02-21": Holiday.SpringFestival,
+  "2018-04-05": Holiday.TombSweepingDay,
+  "2018-04-06": Holiday.TombSweepingDay,
+  "2018-04-07": Holiday.TombSweepingDay,
+  "2018-04-29": Holiday.LabourDay,
+  "2018-04-30": Holiday.LabourDay,
+  "2018-05-01": Holiday.LabourDay,
+  "2018-06-18": Holiday.DragonBoatFestival,
+  "2018-10-01": Holiday.NationalDay,
+  "2018-10-02": Holiday.NationalDay,
+  "2018-10-03": Holiday.NationalDay,
+  "2018-10-04": Holiday.NationalDay,
+  "2018-10-05": Holiday.NationalDay,
+  "2018-10-06": Holiday.NationalDay,
+  "2018-10-07": Holiday.NationalDay,
+  "2018-09-24": Holiday.MidAutumnFestival,
+  "2018-12-30": Holiday.NewYearsDay,
+  "2018-12-31": Holiday.NewYearsDay,
+  "2017-01-01": Holiday.NewYearsDay,
+  "2017-01-02": Holiday.NewYearsDay,
+  "2017-01-27": Holiday.SpringFestival,
+  "2017-01-28": Holiday.SpringFestival,
+  "2017-01-29": Holiday.SpringFestival,
+  "2017-01-30": Holiday.SpringFestival,
+  "2017-01-31": Holiday.SpringFestival,
+  "2017-02-01": Holiday.SpringFestival,
+  "2017-02-02": Holiday.SpringFestival,
+  "2017-04-02": Holiday.TombSweepingDay,
+  "2017-04-03": Holiday.TombSweepingDay,
+  "2017-04-04": Holiday.TombSweepingDay,
+  "2017-05-01": Holiday.LabourDay,
+  "2017-05-28": Holiday.DragonBoatFestival,
+  "2017-05-29": Holiday.DragonBoatFestival,
+  "2017-05-30": Holiday.DragonBoatFestival,
+  "2017-10-01": Holiday.NationalDay,
+  "2017-10-02": Holiday.NationalDay,
+  "2017-10-03": Holiday.NationalDay,
+  "2017-10-04": Holiday.MidAutumnFestival,
+  "2017-10-05": Holiday.NationalDay,
+  "2017-10-06": Holiday.NationalDay,
+  "2017-10-07": Holiday.NationalDay,
+  "2017-10-08": Holiday.NationalDay,
+  "2016-01-01": Holiday.NewYearsDay,
+  "2016-02-07": Holiday.SpringFestival,
+  "2016-02-08": Holiday.SpringFestival,
+  "2016-02-09": Holiday.SpringFestival,
+  "2016-02-10": Holiday.SpringFestival,
+  "2016-02-11": Holiday.SpringFestival,
+  "2016-02-12": Holiday.SpringFestival,
+  "2016-02-13": Holiday.SpringFestival,
+  "2016-04-04": Holiday.TombSweepingDay,
+  "2016-05-01": Holiday.LabourDay,
+  "2016-05-02": Holiday.LabourDay,
+  "2016-06-09": Holiday.DragonBoatFestival,
+  "2016-06-10": Holiday.DragonBoatFestival,
+  "2016-06-11": Holiday.DragonBoatFestival,
+  "2016-09-15": Holiday.MidAutumnFestival,
+  "2016-09-16": Holiday.MidAutumnFestival,
+  "2016-09-17": Holiday.MidAutumnFestival,
+  "2016-10-01": Holiday.NationalDay,
+  "2016-10-02": Holiday.NationalDay,
+  "2016-10-03": Holiday.NationalDay,
+  "2016-10-04": Holiday.NationalDay,
+  "2016-10-05": Holiday.NationalDay,
+  "2016-10-06": Holiday.NationalDay,
+  "2016-10-07": Holiday.NationalDay,
+  "2015-01-01": Holiday.NewYearsDay,
+  "2015-01-02": Holiday.NewYearsDay,
+  "2015-01-03": Holiday.NewYearsDay,
+  "2015-02-18": Holiday.SpringFestival,
+  "2015-02-19": Holiday.SpringFestival,
+  "2015-02-20": Holiday.SpringFestival,
+  "2015-02-21": Holiday.SpringFestival,
+  "2015-02-22": Holiday.SpringFestival,
+  "2015-02-23": Holiday.SpringFestival,
+  "2015-02-24": Holiday.SpringFestival,
+  "2015-04-05": Holiday.TombSweepingDay,
+  "2015-04-06": Holiday.TombSweepingDay,
+  "2015-05-01": Holiday.LabourDay,
+  "2015-06-20": Holiday.DragonBoatFestival,
+  "2015-06-22": Holiday.DragonBoatFestival,
+  "2015-09-27": Holiday.MidAutumnFestival,
+  "2015-10-01": Holiday.NationalDay,
+  "2015-10-02": Holiday.NationalDay,
+  "2015-10-03": Holiday.NationalDay,
+  "2015-10-04": Holiday.NationalDay,
+  "2015-10-05": Holiday.NationalDay,
+  "2015-10-06": Holiday.NationalDay,
+  "2015-10-07": Holiday.NationalDay,
+  "2015-09-03": Holiday.AntiFascist70thDay,
+  "2015-09-04": Holiday.AntiFascist70thDay,
+  "2014-01-01": Holiday.NewYearsDay,
+  "2014-01-31": Holiday.SpringFestival,
+  "2014-02-01": Holiday.SpringFestival,
+  "2014-02-02": Holiday.SpringFestival,
+  "2014-02-03": Holiday.SpringFestival,
+  "2014-02-04": Holiday.SpringFestival,
+  "2014-02-05": Holiday.SpringFestival,
+  "2014-02-06": Holiday.SpringFestival,
+  "2014-04-05": Holiday.TombSweepingDay,
+  "2014-04-06": Holiday.TombSweepingDay,
+  "2014-04-07": Holiday.TombSweepingDay,
+  "2014-05-01": Holiday.LabourDay,
+  "2014-05-02": Holiday.LabourDay,
+  "2014-05-03": Holiday.LabourDay,
+  "2014-06-02": Holiday.DragonBoatFestival,
+  "2014-09-08": Holiday.MidAutumnFestival,
+  "2014-10-01": Holiday.NationalDay,
+  "2014-10-02": Holiday.NationalDay,
+  "2014-10-03": Holiday.NationalDay,
+  "2014-10-04": Holiday.NationalDay,
+  "2014-10-05": Holiday.NationalDay,
+  "2014-10-06": Holiday.NationalDay,
+  "2014-10-07": Holiday.NationalDay,
+  "2013-01-01": Holiday.NewYearsDay,
+  "2013-01-02": Holiday.NewYearsDay,
+  "2013-01-03": Holiday.NewYearsDay,
+  "2013-02-09": Holiday.SpringFestival,
+  "2013-02-10": Holiday.SpringFestival,
+  "2013-02-11": Holiday.SpringFestival,
+  "2013-02-12": Holiday.SpringFestival,
+  "2013-02-13": Holiday.SpringFestival,
+  "2013-02-14": Holiday.SpringFestival,
+  "2013-02-15": Holiday.SpringFestival,
+  "2013-04-04": Holiday.TombSweepingDay,
+  "2013-04-05": Holiday.TombSweepingDay,
+  "2013-04-06": Holiday.TombSweepingDay,
+  "2013-04-29": Holiday.LabourDay,
+  "2013-04-30": Holiday.LabourDay,
+  "2013-05-01": Holiday.LabourDay,
+  "2013-06-10": Holiday.DragonBoatFestival,
+  "2013-06-11": Holiday.DragonBoatFestival,
+  "2013-06-12": Holiday.DragonBoatFestival,
+  "2013-09-19": Holiday.MidAutumnFestival,
+  "2013-09-20": Holiday.MidAutumnFestival,
+  "2013-09-21": Holiday.MidAutumnFestival,
+  "2013-10-01": Holiday.NationalDay,
+  "2013-10-02": Holiday.NationalDay,
+  "2013-10-03": Holiday.NationalDay,
+  "2013-10-04": Holiday.NationalDay,
+  "2013-10-05": Holiday.NationalDay,
+  "2013-10-06": Holiday.NationalDay,
+  "2013-10-07": Holiday.NationalDay,
+  "2012-01-01": Holiday.NewYearsDay,
+  "2012-01-02": Holiday.NewYearsDay,
+  "2012-01-03": Holiday.NewYearsDay,
+  "2012-01-22": Holiday.SpringFestival,
+  "2012-01-23": Holiday.SpringFestival,
+  "2012-01-24": Holiday.SpringFestival,
+  "2012-01-25": Holiday.SpringFestival,
+  "2012-01-26": Holiday.SpringFestival,
+  "2012-01-27": Holiday.SpringFestival,
+  "2012-01-28": Holiday.SpringFestival,
+  "2012-04-02": Holiday.TombSweepingDay,
+  "2012-04-03": Holiday.TombSweepingDay,
+  "2012-04-04": Holiday.TombSweepingDay,
+  "2012-04-29": Holiday.LabourDay,
+  "2012-04-30": Holiday.LabourDay,
+  "2012-05-01": Holiday.LabourDay,
+  "2012-06-22": Holiday.DragonBoatFestival,
+  "2012-06-24": Holiday.DragonBoatFestival,
+  "2012-09-30": Holiday.MidAutumnFestival,
+  "2012-10-01": Holiday.NationalDay,
+  "2012-10-02": Holiday.NationalDay,
+  "2012-10-03": Holiday.NationalDay,
+  "2012-10-04": Holiday.NationalDay,
+  "2012-10-05": Holiday.NationalDay,
+  "2012-10-06": Holiday.NationalDay,
+  "2012-10-07": Holiday.NationalDay,
+  "2011-01-01": Holiday.NewYearsDay,
+  "2011-01-02": Holiday.NewYearsDay,
+  "2011-01-03": Holiday.NewYearsDay,
+  "2011-02-02": Holiday.SpringFestival,
+  "2011-02-03": Holiday.SpringFestival,
+  "2011-02-04": Holiday.SpringFestival,
+  "2011-02-05": Holiday.SpringFestival,
+  "2011-02-06": Holiday.SpringFestival,
+  "2011-02-07": Holiday.SpringFestival,
+  "2011-02-08": Holiday.SpringFestival,
+  "2011-04-03": Holiday.TombSweepingDay,
+  "2011-04-04": Holiday.TombSweepingDay,
+  "2011-04-05": Holiday.TombSweepingDay,
+  "2011-04-30": Holiday.LabourDay,
+  "2011-05-01": Holiday.LabourDay,
+  "2011-05-02": Holiday.LabourDay,
+  "2011-06-04": Holiday.DragonBoatFestival,
+  "2011-06-06": Holiday.DragonBoatFestival,
+  "2011-09-10": Holiday.MidAutumnFestival,
+  "2011-09-11": Holiday.MidAutumnFestival,
+  "2011-09-12": Holiday.MidAutumnFestival,
+  "2011-10-01": Holiday.NationalDay,
+  "2011-10-02": Holiday.NationalDay,
+  "2011-10-03": Holiday.NationalDay,
+  "2011-10-04": Holiday.NationalDay,
+  "2011-10-05": Holiday.NationalDay,
+  "2011-10-06": Holiday.NationalDay,
+  "2011-10-07": Holiday.NationalDay,
+  "2010-01-01": Holiday.NewYearsDay,
+  "2010-01-02": Holiday.NewYearsDay,
+  "2010-01-03": Holiday.NewYearsDay,
+  "2010-02-13": Holiday.SpringFestival,
+  "2010-02-14": Holiday.SpringFestival,
+  "2010-02-15": Holiday.SpringFestival,
+  "2010-02-16": Holiday.SpringFestival,
+  "2010-02-17": Holiday.SpringFestival,
+  "2010-02-18": Holiday.SpringFestival,
+  "2010-02-19": Holiday.SpringFestival,
+  "2010-04-03": Holiday.TombSweepingDay,
+  "2010-04-04": Holiday.TombSweepingDay,
+  "2010-04-05": Holiday.TombSweepingDay,
+  "2010-05-01": Holiday.LabourDay,
+  "2010-05-02": Holiday.LabourDay,
+  "2010-05-03": Holiday.LabourDay,
+  "2010-06-14": Holiday.DragonBoatFestival,
+  "2010-06-15": Holiday.DragonBoatFestival,
+  "2010-06-16": Holiday.DragonBoatFestival,
+  "2010-09-22": Holiday.MidAutumnFestival,
+  "2010-09-23": Holiday.MidAutumnFestival,
+  "2010-09-24": Holiday.MidAutumnFestival,
+  "2010-10-01": Holiday.NationalDay,
+  "2010-10-02": Holiday.NationalDay,
+  "2010-10-03": Holiday.NationalDay,
+  "2010-10-04": Holiday.NationalDay,
+  "2010-10-05": Holiday.NationalDay,
+  "2010-10-06": Holiday.NationalDay,
+  "2010-10-07": Holiday.NationalDay,
+  "2009-01-01": Holiday.NewYearsDay,
+  "2009-01-02": Holiday.NewYearsDay,
+  "2009-01-03": Holiday.NewYearsDay,
+  "2009-01-25": Holiday.SpringFestival,
+  "2009-01-26": Holiday.SpringFestival,
+  "2009-01-27": Holiday.SpringFestival,
+  "2009-01-28": Holiday.SpringFestival,
+  "2009-01-29": Holiday.SpringFestival,
+  "2009-01-30": Holiday.SpringFestival,
+  "2009-01-31": Holiday.SpringFestival,
+  "2009-04-04": Holiday.TombSweepingDay,
+  "2009-04-05": Holiday.TombSweepingDay,
+  "2009-04-06": Holiday.TombSweepingDay,
+  "2009-05-01": Holiday.LabourDay,
+  "2009-05-02": Holiday.LabourDay,
+  "2009-05-03": Holiday.LabourDay,
+  "2009-05-28": Holiday.DragonBoatFestival,
+  "2009-05-29": Holiday.DragonBoatFestival,
+  "2009-05-30": Holiday.DragonBoatFestival,
+  "2009-10-01": Holiday.NationalDay,
+  "2009-10-02": Holiday.NationalDay,
+  "2009-10-03": Holiday.MidAutumnFestival,
+  "2009-10-04": Holiday.NationalDay,
+  "2009-10-05": Holiday.NationalDay,
+  "2009-10-06": Holiday.NationalDay,
+  "2009-10-07": Holiday.NationalDay,
+  "2009-10-08": Holiday.NationalDay,
+  "2008-01-01": Holiday.NewYearsDay,
+  "2008-02-06": Holiday.SpringFestival,
+  "2008-02-07": Holiday.SpringFestival,
+  "2008-02-08": Holiday.SpringFestival,
+  "2008-02-09": Holiday.SpringFestival,
+  "2008-02-10": Holiday.SpringFestival,
+  "2008-02-11": Holiday.SpringFestival,
+  "2008-02-12": Holiday.SpringFestival,
+  "2008-04-04": Holiday.TombSweepingDay,
+  "2008-04-05": Holiday.TombSweepingDay,
+  "2008-04-06": Holiday.TombSweepingDay,
+  "2008-05-01": Holiday.LabourDay,
+  "2008-05-02": Holiday.LabourDay,
+  "2008-05-03": Holiday.LabourDay,
+  "2008-06-07": Holiday.DragonBoatFestival,
+  "2008-06-08": Holiday.DragonBoatFestival,
+  "2008-06-09": Holiday.DragonBoatFestival,
+  "2008-09-13": Holiday.MidAutumnFestival,
+  "2008-09-14": Holiday.MidAutumnFestival,
+  "2008-09-15": Holiday.MidAutumnFestival,
+  "2008-09-29": Holiday.NationalDay,
+  "2008-09-30": Holiday.NationalDay,
+  "2008-10-01": Holiday.NationalDay,
+  "2008-10-02": Holiday.NationalDay,
+  "2008-10-03": Holiday.NationalDay,
+  "2008-10-04": Holiday.NationalDay,
+  "2008-10-05": Holiday.NationalDay,
+  "2007-01-01": Holiday.NewYearsDay,
+  "2007-01-02": Holiday.NewYearsDay,
+  "2007-01-03": Holiday.NewYearsDay,
+  "2007-02-18": Holiday.SpringFestival,
+  "2007-02-19": Holiday.SpringFestival,
+  "2007-02-20": Holiday.SpringFestival,
+  "2007-02-21": Holiday.SpringFestival,
+  "2007-02-22": Holiday.SpringFestival,
+  "2007-02-23": Holiday.SpringFestival,
+  "2007-02-24": Holiday.SpringFestival,
+  "2007-05-01": Holiday.LabourDay,
+  "2007-05-02": Holiday.LabourDay,
+  "2007-05-03": Holiday.LabourDay,
+  "2007-05-04": Holiday.LabourDay,
+  "2007-05-05": Holiday.LabourDay,
+  "2007-05-06": Holiday.LabourDay,
+  "2007-05-07": Holiday.LabourDay,
+  "2007-10-01": Holiday.NationalDay,
+  "2007-10-02": Holiday.NationalDay,
+  "2007-10-03": Holiday.NationalDay,
+  "2007-10-04": Holiday.NationalDay,
+  "2007-10-05": Holiday.NationalDay,
+  "2007-10-06": Holiday.NationalDay,
+  "2007-10-07": Holiday.NationalDay,
+  "2007-12-30": Holiday.NewYearsDay,
+  "2007-12-31": Holiday.NewYearsDay,
+  "2006-01-01": Holiday.NewYearsDay,
+  "2006-01-02": Holiday.NewYearsDay,
+  "2006-01-03": Holiday.NewYearsDay,
+  "2006-01-29": Holiday.SpringFestival,
+  "2006-01-30": Holiday.SpringFestival,
+  "2006-01-31": Holiday.SpringFestival,
+  "2006-02-01": Holiday.SpringFestival,
+  "2006-02-02": Holiday.SpringFestival,
+  "2006-02-03": Holiday.SpringFestival,
+  "2006-02-04": Holiday.SpringFestival,
+  "2006-05-01": Holiday.LabourDay,
+  "2006-05-02": Holiday.LabourDay,
+  "2006-05-03": Holiday.LabourDay,
+  "2006-05-04": Holiday.LabourDay,
+  "2006-05-05": Holiday.LabourDay,
+  "2006-05-06": Holiday.LabourDay,
+  "2006-05-07": Holiday.LabourDay,
+  "2006-10-01": Holiday.NationalDay,
+  "2006-10-02": Holiday.NationalDay,
+  "2006-10-03": Holiday.NationalDay,
+  "2006-10-04": Holiday.NationalDay,
+  "2006-10-05": Holiday.NationalDay,
+  "2006-10-06": Holiday.NationalDay,
+  "2006-10-07": Holiday.NationalDay,
+  "2005-01-01": Holiday.NewYearsDay,
+  "2005-01-02": Holiday.NewYearsDay,
+  "2005-01-03": Holiday.NewYearsDay,
+  "2005-02-09": Holiday.SpringFestival,
+  "2005-02-10": Holiday.SpringFestival,
+  "2005-02-11": Holiday.SpringFestival,
+  "2005-02-12": Holiday.SpringFestival,
+  "2005-02-13": Holiday.SpringFestival,
+  "2005-02-14": Holiday.SpringFestival,
+  "2005-02-15": Holiday.SpringFestival,
+  "2005-05-01": Holiday.LabourDay,
+  "2005-05-02": Holiday.LabourDay,
+  "2005-05-03": Holiday.LabourDay,
+  "2005-05-04": Holiday.LabourDay,
+  "2005-05-05": Holiday.LabourDay,
+  "2005-05-06": Holiday.LabourDay,
+  "2005-05-07": Holiday.LabourDay,
+  "2005-10-01": Holiday.NationalDay,
+  "2005-10-02": Holiday.NationalDay,
+  "2005-10-03": Holiday.NationalDay,
+  "2005-10-04": Holiday.NationalDay,
+  "2005-10-05": Holiday.NationalDay,
+  "2005-10-06": Holiday.NationalDay,
+  "2005-10-07": Holiday.NationalDay,
+  "2004-01-01": Holiday.NewYearsDay,
+  "2004-01-22": Holiday.SpringFestival,
+  "2004-01-23": Holiday.SpringFestival,
+  "2004-01-24": Holiday.SpringFestival,
+  "2004-01-25": Holiday.SpringFestival,
+  "2004-01-26": Holiday.SpringFestival,
+  "2004-01-27": Holiday.SpringFestival,
+  "2004-01-28": Holiday.SpringFestival,
+  "2004-05-01": Holiday.LabourDay,
+  "2004-05-02": Holiday.LabourDay,
+  "2004-05-03": Holiday.LabourDay,
+  "2004-05-04": Holiday.LabourDay,
+  "2004-05-05": Holiday.LabourDay,
+  "2004-05-06": Holiday.LabourDay,
+  "2004-05-07": Holiday.LabourDay,
+  "2004-10-01": Holiday.NationalDay,
+  "2004-10-02": Holiday.NationalDay,
+  "2004-10-03": Holiday.NationalDay,
+  "2004-10-04": Holiday.NationalDay,
+  "2004-10-05": Holiday.NationalDay,
+  "2004-10-06": Holiday.NationalDay,
+  "2004-10-07": Holiday.NationalDay
+};
+export const workdays: Record<string, Holiday> = {
+  "2024-02-04": Holiday.SpringFestival,
+  "2024-02-18": Holiday.SpringFestival,
+  "2024-04-07": Holiday.TombSweepingDay,
+  "2024-04-28": Holiday.LabourDay,
+  "2024-05-11": Holiday.LabourDay,
+  "2024-09-14": Holiday.MidAutumnFestival,
+  "2024-09-29": Holiday.NationalDay,
+  "2024-10-12": Holiday.NationalDay,
+  "2023-01-28": Holiday.SpringFestival,
+  "2023-01-29": Holiday.SpringFestival,
+  "2023-04-23": Holiday.LabourDay,
+  "2023-05-06": Holiday.LabourDay,
+  "2023-06-25": Holiday.DragonBoatFestival,
+  "2023-10-07": Holiday.NationalDay,
+  "2023-10-08": Holiday.NationalDay,
+  "2022-01-29": Holiday.SpringFestival,
+  "2022-01-30": Holiday.SpringFestival,
+  "2022-04-02": Holiday.TombSweepingDay,
+  "2022-04-24": Holiday.LabourDay,
+  "2022-05-07": Holiday.LabourDay,
+  "2022-10-08": Holiday.NationalDay,
+  "2022-10-09": Holiday.NationalDay,
+  "2021-02-07": Holiday.SpringFestival,
+  "2021-02-20": Holiday.SpringFestival,
+  "2021-04-25": Holiday.LabourDay,
+  "2021-05-08": Holiday.LabourDay,
+  "2021-09-18": Holiday.MidAutumnFestival,
+  "2021-09-26": Holiday.NationalDay,
+  "2021-10-09": Holiday.NationalDay,
+  "2020-01-19": Holiday.SpringFestival,
+  "2020-04-26": Holiday.LabourDay,
+  "2020-05-09": Holiday.LabourDay,
+  "2020-06-28": Holiday.DragonBoatFestival,
+  "2020-09-27": Holiday.NationalDay,
+  "2020-10-10": Holiday.NationalDay,
+  "2019-02-02": Holiday.SpringFestival,
+  "2019-02-03": Holiday.SpringFestival,
+  "2019-04-28": Holiday.LabourDay,
+  "2019-05-05": Holiday.LabourDay,
+  "2019-09-29": Holiday.NationalDay,
+  "2019-10-12": Holiday.NationalDay,
+  "2018-02-11": Holiday.SpringFestival,
+  "2018-02-24": Holiday.SpringFestival,
+  "2018-04-08": Holiday.TombSweepingDay,
+  "2018-04-28": Holiday.LabourDay,
+  "2018-09-29": Holiday.NationalDay,
+  "2018-09-30": Holiday.NationalDay,
+  "2018-12-29": Holiday.NewYearsDay,
+  "2017-01-22": Holiday.SpringFestival,
+  "2017-02-04": Holiday.SpringFestival,
+  "2017-04-01": Holiday.TombSweepingDay,
+  "2017-05-27": Holiday.DragonBoatFestival,
+  "2017-09-30": Holiday.NationalDay,
+  "2016-02-06": Holiday.SpringFestival,
+  "2016-02-14": Holiday.SpringFestival,
+  "2016-06-12": Holiday.DragonBoatFestival,
+  "2016-09-18": Holiday.MidAutumnFestival,
+  "2016-10-08": Holiday.NationalDay,
+  "2016-10-09": Holiday.NationalDay,
+  "2015-01-04": Holiday.NewYearsDay,
+  "2015-02-15": Holiday.SpringFestival,
+  "2015-02-28": Holiday.SpringFestival,
+  "2015-10-10": Holiday.NationalDay,
+  "2015-09-06": Holiday.AntiFascist70thDay,
+  "2014-01-26": Holiday.SpringFestival,
+  "2014-02-08": Holiday.SpringFestival,
+  "2014-05-04": Holiday.LabourDay,
+  "2014-09-28": Holiday.NationalDay,
+  "2014-10-11": Holiday.NationalDay,
+  "2013-01-05": Holiday.NewYearsDay,
+  "2013-01-06": Holiday.NewYearsDay,
+  "2013-02-16": Holiday.SpringFestival,
+  "2013-02-17": Holiday.SpringFestival,
+  "2013-04-07": Holiday.TombSweepingDay,
+  "2013-04-27": Holiday.LabourDay,
+  "2013-04-28": Holiday.LabourDay,
+  "2013-06-08": Holiday.DragonBoatFestival,
+  "2013-06-09": Holiday.DragonBoatFestival,
+  "2013-09-22": Holiday.MidAutumnFestival,
+  "2013-09-29": Holiday.NationalDay,
+  "2013-10-12": Holiday.NationalDay,
+  "2012-01-21": Holiday.SpringFestival,
+  "2012-01-29": Holiday.SpringFestival,
+  "2012-03-31": Holiday.TombSweepingDay,
+  "2012-04-01": Holiday.TombSweepingDay,
+  "2012-04-28": Holiday.LabourDay,
+  "2012-09-29": Holiday.NationalDay,
+  "2011-01-30": Holiday.SpringFestival,
+  "2011-02-12": Holiday.SpringFestival,
+  "2011-04-02": Holiday.TombSweepingDay,
+  "2011-10-08": Holiday.NationalDay,
+  "2011-10-09": Holiday.NationalDay,
+  "2011-12-31": Holiday.NewYearsDay,
+  "2010-02-20": Holiday.SpringFestival,
+  "2010-02-21": Holiday.SpringFestival,
+  "2010-06-12": Holiday.DragonBoatFestival,
+  "2010-06-13": Holiday.DragonBoatFestival,
+  "2010-09-19": Holiday.MidAutumnFestival,
+  "2010-09-25": Holiday.MidAutumnFestival,
+  "2010-09-26": Holiday.NationalDay,
+  "2010-10-09": Holiday.NationalDay,
+  "2009-01-04": Holiday.NewYearsDay,
+  "2009-01-24": Holiday.SpringFestival,
+  "2009-02-01": Holiday.SpringFestival,
+  "2009-05-31": Holiday.DragonBoatFestival,
+  "2009-09-27": Holiday.NationalDay,
+  "2009-10-10": Holiday.NationalDay,
+  "2008-02-02": Holiday.SpringFestival,
+  "2008-02-03": Holiday.SpringFestival,
+  "2008-05-04": Holiday.LabourDay,
+  "2008-09-27": Holiday.NationalDay,
+  "2008-09-28": Holiday.NationalDay,
+  "2007-02-17": Holiday.SpringFestival,
+  "2007-02-25": Holiday.SpringFestival,
+  "2007-04-28": Holiday.LabourDay,
+  "2007-04-29": Holiday.LabourDay,
+  "2007-09-29": Holiday.NationalDay,
+  "2007-09-30": Holiday.NationalDay,
+  "2007-12-29": Holiday.NewYearsDay,
+  "2006-01-28": Holiday.SpringFestival,
+  "2006-02-05": Holiday.SpringFestival,
+  "2006-04-29": Holiday.LabourDay,
+  "2006-04-30": Holiday.LabourDay,
+  "2006-09-30": Holiday.NationalDay,
+  "2006-10-08": Holiday.NationalDay,
+  "2006-12-30": Holiday.NewYearsDay,
+  "2006-12-31": Holiday.NewYearsDay,
+  "2005-02-05": Holiday.SpringFestival,
+  "2005-02-06": Holiday.SpringFestival,
+  "2005-04-30": Holiday.LabourDay,
+  "2005-05-08": Holiday.LabourDay,
+  "2005-10-08": Holiday.NationalDay,
+  "2005-10-09": Holiday.NationalDay,
+  "2004-01-17": Holiday.SpringFestival,
+  "2004-01-18": Holiday.SpringFestival,
+  "2004-05-08": Holiday.LabourDay,
+  "2004-05-09": Holiday.LabourDay,
+  "2004-10-09": Holiday.NationalDay,
+  "2004-10-10": Holiday.NationalDay
+};
+export const inLieuDays: Record<string, Holiday> = {
+  "2024-02-15": Holiday.SpringFestival,
+  "2024-02-16": Holiday.SpringFestival,
+  "2024-04-05": Holiday.TombSweepingDay,
+  "2024-05-02": Holiday.LabourDay,
+  "2024-05-03": Holiday.LabourDay,
+  "2024-09-16": Holiday.MidAutumnFestival,
+  "2024-10-04": Holiday.NationalDay,
+  "2024-10-07": Holiday.NationalDay,
+  "2023-01-26": Holiday.SpringFestival,
+  "2023-01-27": Holiday.SpringFestival,
+  "2023-05-02": Holiday.LabourDay,
+  "2023-05-03": Holiday.LabourDay,
+  "2023-06-23": Holiday.DragonBoatFestival,
+  "2023-10-05": Holiday.NationalDay,
+  "2023-10-06": Holiday.NationalDay,
+  "2022-02-03": Holiday.SpringFestival,
+  "2022-02-04": Holiday.SpringFestival,
+  "2022-04-04": Holiday.TombSweepingDay,
+  "2022-05-03": Holiday.LabourDay,
+  "2022-05-04": Holiday.LabourDay,
+  "2022-10-06": Holiday.NationalDay,
+  "2022-10-07": Holiday.NationalDay,
+  "2021-02-16": Holiday.SpringFestival,
+  "2021-02-17": Holiday.SpringFestival,
+  "2021-05-04": Holiday.LabourDay,
+  "2021-05-05": Holiday.LabourDay,
+  "2021-09-20": Holiday.MidAutumnFestival,
+  "2021-10-06": Holiday.NationalDay,
+  "2021-10-07": Holiday.NationalDay,
+  "2020-01-29": Holiday.SpringFestival,
+  "2020-05-04": Holiday.LabourDay,
+  "2020-05-05": Holiday.LabourDay,
+  "2020-06-26": Holiday.DragonBoatFestival,
+  "2020-10-07": Holiday.NationalDay,
+  "2020-10-08": Holiday.NationalDay,
+  "2019-02-04": Holiday.SpringFestival,
+  "2019-02-08": Holiday.SpringFestival,
+  "2019-05-02": Holiday.LabourDay,
+  "2019-05-03": Holiday.LabourDay,
+  "2019-10-04": Holiday.NationalDay,
+  "2019-10-07": Holiday.NationalDay,
+  "2018-02-19": Holiday.SpringFestival,
+  "2018-02-20": Holiday.SpringFestival,
+  "2018-02-21": Holiday.SpringFestival,
+  "2018-04-06": Holiday.TombSweepingDay,
+  "2018-04-30": Holiday.LabourDay,
+  "2018-10-04": Holiday.NationalDay,
+  "2018-10-05": Holiday.NationalDay,
+  "2018-12-31": Holiday.NewYearsDay,
+  "2017-02-01": Holiday.SpringFestival,
+  "2017-02-02": Holiday.SpringFestival,
+  "2017-04-03": Holiday.TombSweepingDay,
+  "2017-05-29": Holiday.DragonBoatFestival,
+  "2017-10-06": Holiday.NationalDay,
+  "2016-02-11": Holiday.SpringFestival,
+  "2016-02-12": Holiday.SpringFestival,
+  "2016-06-10": Holiday.DragonBoatFestival,
+  "2016-09-16": Holiday.MidAutumnFestival,
+  "2016-10-06": Holiday.NationalDay,
+  "2016-10-07": Holiday.NationalDay,
+  "2015-01-02": Holiday.NewYearsDay,
+  "2015-02-23": Holiday.SpringFestival,
+  "2015-02-24": Holiday.SpringFestival,
+  "2015-10-07": Holiday.NationalDay,
+  "2015-09-04": Holiday.AntiFascist70thDay,
+  "2014-02-05": Holiday.SpringFestival,
+  "2014-02-06": Holiday.SpringFestival,
+  "2014-05-02": Holiday.LabourDay,
+  "2014-10-06": Holiday.NationalDay,
+  "2014-10-07": Holiday.NationalDay,
+  "2013-01-02": Holiday.NewYearsDay,
+  "2013-01-03": Holiday.NewYearsDay,
+  "2013-02-14": Holiday.SpringFestival,
+  "2013-02-15": Holiday.SpringFestival,
+  "2013-04-05": Holiday.TombSweepingDay,
+  "2013-04-29": Holiday.LabourDay,
+  "2013-04-30": Holiday.LabourDay,
+  "2013-06-10": Holiday.DragonBoatFestival,
+  "2013-06-11": Holiday.DragonBoatFestival,
+  "2013-09-20": Holiday.MidAutumnFestival,
+  "2013-10-04": Holiday.NationalDay,
+  "2013-10-07": Holiday.NationalDay,
+  "2012-01-03": Holiday.NewYearsDay,
+  "2012-01-26": Holiday.SpringFestival,
+  "2012-01-27": Holiday.SpringFestival,
+  "2012-04-02": Holiday.TombSweepingDay,
+  "2012-04-03": Holiday.TombSweepingDay,
+  "2012-04-30": Holiday.LabourDay,
+  "2012-10-05": Holiday.NationalDay,
+  "2011-02-07": Holiday.SpringFestival,
+  "2011-02-08": Holiday.SpringFestival,
+  "2011-04-04": Holiday.TombSweepingDay,
+  "2011-10-06": Holiday.NationalDay,
+  "2011-10-07": Holiday.NationalDay,
+  "2010-02-18": Holiday.SpringFestival,
+  "2010-02-19": Holiday.SpringFestival,
+  "2010-06-14": Holiday.DragonBoatFestival,
+  "2010-06-15": Holiday.DragonBoatFestival,
+  "2010-09-23": Holiday.MidAutumnFestival,
+  "2010-09-24": Holiday.MidAutumnFestival,
+  "2010-10-06": Holiday.NationalDay,
+  "2010-10-07": Holiday.NationalDay,
+  "2009-01-02": Holiday.NewYearsDay,
+  "2009-01-29": Holiday.SpringFestival,
+  "2009-01-30": Holiday.SpringFestival,
+  "2009-05-29": Holiday.DragonBoatFestival,
+  "2009-10-07": Holiday.NationalDay,
+  "2009-10-08": Holiday.NationalDay,
+  "2008-02-11": Holiday.SpringFestival,
+  "2008-02-12": Holiday.SpringFestival,
+  "2008-05-02": Holiday.LabourDay,
+  "2008-09-29": Holiday.NationalDay,
+  "2008-09-30": Holiday.NationalDay,
+  "2007-01-02": Holiday.NewYearsDay,
+  "2007-01-03": Holiday.NewYearsDay,
+  "2007-02-22": Holiday.SpringFestival,
+  "2007-02-23": Holiday.SpringFestival,
+  "2007-05-04": Holiday.LabourDay,
+  "2007-05-07": Holiday.LabourDay,
+  "2007-10-04": Holiday.NationalDay,
+  "2007-10-05": Holiday.NationalDay,
+  "2007-12-31": Holiday.NewYearsDay,
+  "2006-02-02": Holiday.SpringFestival,
+  "2006-02-03": Holiday.SpringFestival,
+  "2006-05-04": Holiday.LabourDay,
+  "2006-05-05": Holiday.LabourDay,
+  "2006-10-05": Holiday.NationalDay,
+  "2006-10-06": Holiday.NationalDay,
+  "2005-02-14": Holiday.SpringFestival,
+  "2005-02-15": Holiday.SpringFestival,
+  "2005-05-05": Holiday.LabourDay,
+  "2005-05-06": Holiday.LabourDay,
+  "2005-10-06": Holiday.NationalDay,
+  "2005-10-07": Holiday.NationalDay,
+  "2004-01-27": Holiday.SpringFestival,
+  "2004-01-28": Holiday.SpringFestival,
+  "2004-05-06": Holiday.LabourDay,
+  "2004-05-07": Holiday.LabourDay,
+  "2004-10-06": Holiday.NationalDay,
+  "2004-10-07": Holiday.NationalDay
+};

+ 4 - 1
src/holidays/index.ts

@@ -1,6 +1,7 @@
 import dayjs, { Dayjs } from 'dayjs';
 import { wrapDate } from '../utils'
 import { holidays, workdays, inLieuDays } from './constants';
+import Arrangement, { Holiday } from './arrangement';
 
 const _validateDate = (...dates: dayjs.ConfigType[]): Dayjs | Dayjs[] => {
   if (dates.length !== 1) {
@@ -112,7 +113,9 @@ const findWorkday = (deltaDays: number = 0, date: dayjs.ConfigType = dayjs()): D
   return date;
 }
 
-export default {
+export {
+  Holiday,
+  Arrangement,
   isHoliday,
   isWorkday,
   isInLieu,

+ 17 - 1
src/index.ts

@@ -1 +1,17 @@
-export default {}
+import * as Utils from "./utils";
+import * as HolidayUtils from "./holidays";
+import * as SolarTermUtils from "./solar_terms";
+
+// 单独导出这些方法和类型
+export * from "./utils";
+export * from "./holidays";
+export * from "./solar_terms";
+
+// 默认导出所有
+const chinaDays = {
+  ...Utils,
+  ...HolidayUtils,
+  ...SolarTermUtils,
+};
+
+export default chinaDays;

+ 3 - 3
src/solar_terms/index.ts

@@ -41,7 +41,7 @@ const getSolarTermDate = (
 };
 
 export interface SolarTerm {
-  date: Date;
+  date: string;
   term: SolarTermKey;
   name: string;
 };
@@ -71,7 +71,7 @@ const getSolarTerms = (
         (solarTermDate?.isAfter(current) || solarTermDate?.isSame(current))
       ) {
         result.push({
-          date: solarTermDate.toDate(),
+          date: solarTermDate.format("YYYY-MM-DD"),
           term,
           name: SOLAR_TERMS[term],
         });
@@ -87,7 +87,7 @@ const getSolarTerms = (
   return result;
 };
 
-export default {
+export {
   getSolarTermDate,
   getSolarTerms,
 }

+ 71 - 0
test/holidays/arrangement.test.ts

@@ -0,0 +1,71 @@
+import dayjs from 'dayjs';
+import { Arrangement, Holiday } from '../../src';
+
+describe('Arrangement class', () => {
+  let arrangement: Arrangement;
+
+  beforeEach(() => {
+    arrangement = new Arrangement();
+  });
+
+  it('should set year correctly', () => {
+    arrangement.yearAt(2024);
+    expect((arrangement as any).dayDetails.year).toBe(2024);
+  });
+
+  it('should mark holiday correctly', () => {
+    arrangement.nyd();
+    expect((arrangement as any).dayDetails.holiday).toBe(Holiday.NewYearsDay);
+  });
+
+  it('should save holiday correctly', () => {
+    arrangement.yearAt(2024).nyd().rest(1, 1);
+    const date = dayjs('2024-01-01').format('YYYY-MM-DD');
+    expect(arrangement.holidays[date]).toBe(Holiday.NewYearsDay);
+  });
+
+  it('should save workday correctly', () => {
+    arrangement.yearAt(2024).sf().work(2, 4);
+    const date = dayjs('2024-02-04').format('YYYY-MM-DD');
+    expect(arrangement.workdays[date]).toBe(Holiday.SpringFestival);
+  });
+
+  it('should save in-lieu day correctly', () => {
+    arrangement.yearAt(2024).maf().inLieu(9, 16);
+    const date = dayjs('2024-09-16').format('YYYY-MM-DD');
+    expect(arrangement.inLieuDays[date]).toBe(Holiday.MidAutumnFestival);
+  });
+
+  it('should save holiday range correctly', () => {
+    arrangement.yearAt(2024).sf().rest(2, 10).to(2, 12);
+    const dates = ['2024-02-10', '2024-02-11', '2024-02-12'].map(date =>
+      dayjs(date).format('YYYY-MM-DD')
+    );
+    dates.forEach(date => {
+      expect(arrangement.holidays[date]).toBe(Holiday.SpringFestival);
+    });
+  });
+
+  it('should throw error if year is not set before saving holiday', () => {
+    expect(() => arrangement.nyd().rest(1, 1)).toThrow(
+      'should set year before saving holiday'
+    );
+  });
+
+  it('should throw error if holiday is not set before saving holiday', () => {
+    expect(() => arrangement.yearAt(2024).rest(1, 1)).toThrow(
+      'should set holiday before saving holiday'
+    );
+  });
+
+  it('should throw error if end date is before start date in holiday range', () => {
+    arrangement.yearAt(2024).sf().rest(2, 10);
+    expect(() => arrangement.to(2, 9)).toThrow('end date should be after start date');
+  });
+
+  it('should throw error if year/month/day is not set before saving holiday range', () => {
+    expect(() => arrangement.to(2, 10)).toThrow(
+      'should set year/month/day before saving holiday range'
+    );
+  });
+});

+ 72 - 0
test/solar_terms/index.test.ts

@@ -0,0 +1,72 @@
+import dayjs from "dayjs";
+import {
+  getSolarTermDate,
+  getSolarTerms,
+  type SolarTerm,
+} from "../../src/solar_terms";
+
+import type { SolarTermKey } from "../../src/solar_terms/constants";
+
+describe("Solar Terms", () => {
+  describe("getSolarTermDate", () => {
+    it("should correctly calculate the solar term date for 'lesser_cold' in 2024", () => {
+      const term: SolarTermKey = "lesser_cold";
+      const date = getSolarTermDate(2024, 1, term);
+      expect(date.format("YYYY-MM-DD")).toBe("2024-01-06");
+    });
+
+    it("should correctly calculate the solar term date for 'rain_water' in 2026 with delta adjustment", () => {
+      const term: SolarTermKey = "rain_water";
+      const date = getSolarTermDate(2026, 2, term);
+      expect(date.format("YYYY-MM-DD")).toBe("2026-02-18");
+    });
+
+    it("should handle the case where there is no delta adjustment", () => {
+      const term: SolarTermKey = "the_beginning_of_spring";
+      const date = getSolarTermDate(2024, 2, term);
+      expect(date.format("YYYY-MM-DD")).toBe("2024-02-04");
+    });
+  });
+
+  describe("getSolarTerms", () => {
+    it("should return the solar terms within the date range in 2024", () => {
+      const start = dayjs("2024-01-01");
+      const end = dayjs("2024-02-29");
+      const terms = getSolarTerms(start, end);
+      const expected: SolarTerm[] = [
+        { date: "2024-01-06", term: "lesser_cold", name: "小寒" },
+        { date: "2024-01-20", term: "greater_cold", name: "大寒" },
+        { date: "2024-02-04", term: "the_beginning_of_spring", name: "立春" },
+        { date: "2024-02-19", term: "rain_water", name: "雨水" },
+      ];
+      expect(terms).toEqual(expected);
+    });
+
+    it("should return an empty array if no solar terms fall within the date range", () => {
+      const start = dayjs("2024-03-01");
+      const end = dayjs("2024-03-31");
+      const terms = getSolarTerms(start, end);
+      expect(terms).toEqual([
+        {
+          date: "2024-03-05",
+          name: "惊蛰",
+          term: "the_waking_of_insects",
+        },
+        {
+          date: "2024-03-20",
+          name: "春分",
+          term: "the_spring_equinox",
+        },
+      ]);
+    });
+
+    it("should handle a single day range", () => {
+      const date = dayjs("2024-01-06");
+      const terms = getSolarTerms(date, date);
+      const expected: SolarTerm[] = [
+        { date: "2024-01-06", term: "lesser_cold", name: "小寒" },
+      ];
+      expect(terms).toEqual(expected);
+    });
+  });
+});

+ 9 - 2
tsconfig.json

@@ -8,6 +8,7 @@
     "strict": true,
     "noImplicitReturns": true,
     "allowSyntheticDefaultImports": true,
+    "allowImportingTsExtensions": true,
     "esModuleInterop": true,
     "baseUrl": "./",
     "declaration": true,
@@ -22,5 +23,11 @@
     "isolatedModules": true
   },
   "include": ["src/**/*"],
-  "exclude": ["node_modules"]
-}
+  "exclude": ["node_modules"],
+
+  "ts-node": {
+    "compilerOptions": {
+      "module": "Commonjs"
+    },
+  }
+}

+ 9 - 2
vite.config.ts

@@ -1,4 +1,11 @@
-import { defineConfig } from 'vite'
+import { defineConfig } from "vite";
 
 // https://vitejs.dev/config/
-export default defineConfig({})
+export default defineConfig(() => {
+  return {
+    build: {
+      outDir: "dist",
+      sourcemap: true,
+    },
+  };
+});

Some files were not shown because too many files changed in this diff