@catlabtech/mycal-mcp-server 0.1.0 → 0.1.2

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 (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/index.js +2306 -54
  4. package/package.json +10 -5
package/dist/index.js CHANGED
@@ -4,9 +4,2249 @@
4
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
6
  import { z } from "zod";
7
- import { readFileSync } from "fs";
8
- import { resolve, dirname } from "path";
9
- import { fileURLToPath } from "url";
7
+
8
+ // ../../data/states.json
9
+ var states_default = [
10
+ {
11
+ code: "johor",
12
+ aliases: ["jhr", "JHR", "jb", "JB", "johor-bahru"],
13
+ name: { ms: "Johor", en: "Johor" },
14
+ type: "state",
15
+ weekendHistory: [
16
+ { from: "2025-01-01", to: null, weekendDays: [0, 6], group: "B" },
17
+ { from: "2014-01-01", to: "2024-12-31", weekendDays: [5, 6], group: "A" },
18
+ { from: "1900-01-01", to: "2013-12-31", weekendDays: [0, 6], group: "B" }
19
+ ],
20
+ group: "B"
21
+ },
22
+ {
23
+ code: "kedah",
24
+ aliases: ["kd", "KDH", "kdh", "alor-setar"],
25
+ name: { ms: "Kedah", en: "Kedah" },
26
+ type: "state",
27
+ weekendHistory: [
28
+ { from: "1900-01-01", to: null, weekendDays: [5, 6], group: "A" }
29
+ ],
30
+ group: "A"
31
+ },
32
+ {
33
+ code: "kelantan",
34
+ aliases: ["kel", "KEL", "kb", "KB", "kota-bharu"],
35
+ name: { ms: "Kelantan", en: "Kelantan" },
36
+ type: "state",
37
+ weekendHistory: [
38
+ { from: "1900-01-01", to: null, weekendDays: [5, 6], group: "A" }
39
+ ],
40
+ group: "A"
41
+ },
42
+ {
43
+ code: "terengganu",
44
+ aliases: ["trg", "TRG", "kt", "KT", "kuala-terengganu"],
45
+ name: { ms: "Terengganu", en: "Terengganu" },
46
+ type: "state",
47
+ weekendHistory: [
48
+ { from: "1900-01-01", to: null, weekendDays: [5, 6], group: "A" }
49
+ ],
50
+ group: "A"
51
+ },
52
+ {
53
+ code: "perak",
54
+ aliases: ["prk", "PRK", "ipoh"],
55
+ name: { ms: "Perak", en: "Perak" },
56
+ type: "state",
57
+ weekendHistory: [
58
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
59
+ ],
60
+ group: "B"
61
+ },
62
+ {
63
+ code: "pulau-pinang",
64
+ aliases: ["penang", "pg", "PG", "png", "pinang", "georgetown"],
65
+ name: { ms: "Pulau Pinang", en: "Penang" },
66
+ type: "state",
67
+ weekendHistory: [
68
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
69
+ ],
70
+ group: "B"
71
+ },
72
+ {
73
+ code: "selangor",
74
+ aliases: ["sel", "SEL", "sgr", "SGR"],
75
+ name: { ms: "Selangor", en: "Selangor" },
76
+ type: "state",
77
+ weekendHistory: [
78
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
79
+ ],
80
+ group: "B"
81
+ },
82
+ {
83
+ code: "negeri-sembilan",
84
+ aliases: ["ns", "NS", "n9", "N9", "n.sembilan", "seremban"],
85
+ name: { ms: "Negeri Sembilan", en: "Negeri Sembilan" },
86
+ type: "state",
87
+ weekendHistory: [
88
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
89
+ ],
90
+ group: "B"
91
+ },
92
+ {
93
+ code: "melaka",
94
+ aliases: ["mlk", "MLK", "malacca", "melacca"],
95
+ name: { ms: "Melaka", en: "Malacca" },
96
+ type: "state",
97
+ weekendHistory: [
98
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
99
+ ],
100
+ group: "B"
101
+ },
102
+ {
103
+ code: "pahang",
104
+ aliases: ["phg", "PHG", "kuantan"],
105
+ name: { ms: "Pahang", en: "Pahang" },
106
+ type: "state",
107
+ weekendHistory: [
108
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
109
+ ],
110
+ group: "B"
111
+ },
112
+ {
113
+ code: "perlis",
114
+ aliases: ["pls", "PLS", "kangar"],
115
+ name: { ms: "Perlis", en: "Perlis" },
116
+ type: "state",
117
+ weekendHistory: [
118
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
119
+ ],
120
+ group: "B"
121
+ },
122
+ {
123
+ code: "sabah",
124
+ aliases: ["sbh", "SBH", "kk", "KK", "kota-kinabalu"],
125
+ name: { ms: "Sabah", en: "Sabah" },
126
+ type: "state",
127
+ weekendHistory: [
128
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
129
+ ],
130
+ group: "B"
131
+ },
132
+ {
133
+ code: "sarawak",
134
+ aliases: ["swk", "SWK", "kuching"],
135
+ name: { ms: "Sarawak", en: "Sarawak" },
136
+ type: "state",
137
+ weekendHistory: [
138
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
139
+ ],
140
+ group: "B"
141
+ },
142
+ {
143
+ code: "kuala-lumpur",
144
+ aliases: ["kl", "KL", "kualalumpur", "wp-kl", "wpkl"],
145
+ name: { ms: "Wilayah Persekutuan Kuala Lumpur", en: "Federal Territory of Kuala Lumpur" },
146
+ type: "federal_territory",
147
+ weekendHistory: [
148
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
149
+ ],
150
+ group: "B"
151
+ },
152
+ {
153
+ code: "wp-putrajaya",
154
+ aliases: ["putrajaya", "pjy", "PJY"],
155
+ name: { ms: "Wilayah Persekutuan Putrajaya", en: "Federal Territory of Putrajaya" },
156
+ type: "federal_territory",
157
+ weekendHistory: [
158
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
159
+ ],
160
+ group: "B"
161
+ },
162
+ {
163
+ code: "wp-labuan",
164
+ aliases: ["labuan", "lbn", "LBN"],
165
+ name: { ms: "Wilayah Persekutuan Labuan", en: "Federal Territory of Labuan" },
166
+ type: "federal_territory",
167
+ weekendHistory: [
168
+ { from: "1900-01-01", to: null, weekendDays: [0, 6], group: "B" }
169
+ ],
170
+ group: "B"
171
+ }
172
+ ];
173
+
174
+ // ../../data/holidays/2024.json
175
+ var __default = [
176
+ {
177
+ id: "2024-tahun-baharu",
178
+ date: "2024-01-01",
179
+ name: { ms: "Tahun Baharu", en: "New Year's Day", zh: "\u5143\u65E6" },
180
+ type: "state",
181
+ status: "confirmed",
182
+ states: ["perak", "pulau-pinang", "selangor", "negeri-sembilan", "melaka", "pahang", "sabah", "sarawak", "kuala-lumpur", "wp-putrajaya", "wp-labuan", "perlis"],
183
+ isPublicHoliday: true,
184
+ gazetteLevel: "N",
185
+ source: "jpm",
186
+ createdAt: "2023-08-01T00:00:00+08:00",
187
+ updatedAt: "2023-08-01T00:00:00+08:00"
188
+ },
189
+ {
190
+ id: "2024-keputeraan-ydb-ns",
191
+ date: "2024-01-14",
192
+ name: { ms: "Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan", en: "Birthday of Yang di-Pertuan Besar of Negeri Sembilan" },
193
+ type: "state",
194
+ status: "confirmed",
195
+ states: ["negeri-sembilan"],
196
+ isPublicHoliday: true,
197
+ gazetteLevel: "N",
198
+ source: "jpm",
199
+ createdAt: "2023-08-01T00:00:00+08:00",
200
+ updatedAt: "2023-08-01T00:00:00+08:00"
201
+ },
202
+ {
203
+ id: "2024-thaipusam",
204
+ date: "2024-01-25",
205
+ name: { ms: "Hari Thaipusam", en: "Thaipusam", zh: "\u5927\u5B9D\u68EE\u8282" },
206
+ type: "federal",
207
+ status: "confirmed",
208
+ states: ["*"],
209
+ isPublicHoliday: true,
210
+ gazetteLevel: "P",
211
+ source: "jpm",
212
+ createdAt: "2023-08-01T00:00:00+08:00",
213
+ updatedAt: "2023-08-01T00:00:00+08:00"
214
+ },
215
+ {
216
+ id: "2024-hari-wilayah",
217
+ date: "2024-02-01",
218
+ name: { ms: "Hari Wilayah Persekutuan", en: "Federal Territory Day", zh: "\u8054\u90A6\u76F4\u8F96\u533A\u65E5" },
219
+ type: "state",
220
+ status: "confirmed",
221
+ states: ["kuala-lumpur", "wp-putrajaya", "wp-labuan"],
222
+ isPublicHoliday: true,
223
+ gazetteLevel: "N",
224
+ source: "jpm",
225
+ createdAt: "2023-08-01T00:00:00+08:00",
226
+ updatedAt: "2023-08-01T00:00:00+08:00"
227
+ },
228
+ {
229
+ id: "2024-israk-mikraj",
230
+ date: "2024-02-08",
231
+ name: { ms: "Israk dan Mikraj", en: "Isra' Mi'raj", zh: "\u591C\u884C\u767B\u9704" },
232
+ type: "islamic",
233
+ status: "confirmed",
234
+ states: ["*"],
235
+ isPublicHoliday: true,
236
+ gazetteLevel: "P",
237
+ hijriDate: "27 Rejab 1445",
238
+ source: "jpm",
239
+ createdAt: "2023-08-01T00:00:00+08:00",
240
+ updatedAt: "2023-08-01T00:00:00+08:00"
241
+ },
242
+ {
243
+ id: "2024-tahun-baharu-cina-1",
244
+ date: "2024-02-10",
245
+ name: { ms: "Tahun Baharu Cina", en: "Chinese New Year", zh: "\u519C\u5386\u65B0\u5E74" },
246
+ type: "federal",
247
+ status: "confirmed",
248
+ states: ["*"],
249
+ isPublicHoliday: true,
250
+ gazetteLevel: "P",
251
+ source: "jpm",
252
+ createdAt: "2023-08-01T00:00:00+08:00",
253
+ updatedAt: "2023-08-01T00:00:00+08:00"
254
+ },
255
+ {
256
+ id: "2024-tahun-baharu-cina-2",
257
+ date: "2024-02-11",
258
+ name: { ms: "Tahun Baharu Cina (Hari Kedua)", en: "Chinese New Year (2nd Day)", zh: "\u519C\u5386\u65B0\u5E74\uFF08\u7B2C\u4E8C\u5929\uFF09" },
259
+ type: "federal",
260
+ status: "confirmed",
261
+ states: ["*"],
262
+ isPublicHoliday: true,
263
+ gazetteLevel: "P",
264
+ source: "jpm",
265
+ createdAt: "2023-08-01T00:00:00+08:00",
266
+ updatedAt: "2023-08-01T00:00:00+08:00"
267
+ },
268
+ {
269
+ id: "2024-pertabalan-sultan-terengganu",
270
+ date: "2024-03-04",
271
+ name: { ms: "Hari Ulang Tahun Pertabalan Sultan Terengganu", en: "Anniversary of Sultan of Terengganu's Installation" },
272
+ type: "state",
273
+ status: "confirmed",
274
+ states: ["terengganu"],
275
+ isPublicHoliday: true,
276
+ gazetteLevel: "N",
277
+ source: "jpm",
278
+ createdAt: "2023-08-01T00:00:00+08:00",
279
+ updatedAt: "2023-08-01T00:00:00+08:00"
280
+ },
281
+ {
282
+ id: "2024-awal-ramadan",
283
+ date: "2024-03-12",
284
+ name: { ms: "Awal Ramadan", en: "Beginning of Ramadan", zh: "\u658B\u6212\u6708\u9996\u65E5" },
285
+ type: "islamic_state",
286
+ status: "confirmed",
287
+ states: ["johor", "kedah", "kelantan", "terengganu", "melaka", "perlis"],
288
+ isPublicHoliday: true,
289
+ gazetteLevel: "N",
290
+ hijriDate: "1 Ramadan 1445",
291
+ source: "jpm",
292
+ createdAt: "2023-08-01T00:00:00+08:00",
293
+ updatedAt: "2023-08-01T00:00:00+08:00"
294
+ },
295
+ {
296
+ id: "2024-keputeraan-sultan-johor",
297
+ date: "2024-03-23",
298
+ name: { ms: "Hari Keputeraan Sultan Johor", en: "Birthday of Sultan of Johor" },
299
+ type: "state",
300
+ status: "confirmed",
301
+ states: ["johor"],
302
+ isPublicHoliday: true,
303
+ gazetteLevel: "N",
304
+ source: "jpm",
305
+ createdAt: "2023-08-01T00:00:00+08:00",
306
+ updatedAt: "2023-08-01T00:00:00+08:00"
307
+ },
308
+ {
309
+ id: "2024-nuzul-quran",
310
+ date: "2024-03-28",
311
+ name: { ms: "Hari Nuzul Al-Quran", en: "Revelation of the Quran", zh: "\u53EF\u5170\u7ECF\u964D\u4E16" },
312
+ type: "islamic",
313
+ status: "confirmed",
314
+ states: ["*"],
315
+ isPublicHoliday: true,
316
+ gazetteLevel: "P",
317
+ hijriDate: "17 Ramadan 1445",
318
+ source: "jpm",
319
+ createdAt: "2023-08-01T00:00:00+08:00",
320
+ updatedAt: "2023-08-01T00:00:00+08:00"
321
+ },
322
+ {
323
+ id: "2024-good-friday",
324
+ date: "2024-03-29",
325
+ name: { ms: "Good Friday", en: "Good Friday", zh: "\u8036\u7A23\u53D7\u96BE\u65E5" },
326
+ type: "state",
327
+ status: "confirmed",
328
+ states: ["sabah", "sarawak"],
329
+ isPublicHoliday: true,
330
+ gazetteLevel: "N",
331
+ source: "jpm",
332
+ createdAt: "2023-08-01T00:00:00+08:00",
333
+ updatedAt: "2023-08-01T00:00:00+08:00"
334
+ },
335
+ {
336
+ id: "2024-hari-raya-aidilfitri-1",
337
+ date: "2024-04-10",
338
+ name: { ms: "Hari Raya Aidilfitri", en: "Eid al-Fitr", zh: "\u5F00\u658B\u8282" },
339
+ type: "islamic",
340
+ status: "confirmed",
341
+ states: ["*"],
342
+ isPublicHoliday: true,
343
+ gazetteLevel: "P",
344
+ hijriDate: "1 Syawal 1445",
345
+ source: "jpm",
346
+ createdAt: "2023-08-01T00:00:00+08:00",
347
+ updatedAt: "2023-08-01T00:00:00+08:00"
348
+ },
349
+ {
350
+ id: "2024-hari-raya-aidilfitri-2",
351
+ date: "2024-04-11",
352
+ name: { ms: "Hari Raya Aidilfitri (Hari Kedua)", en: "Eid al-Fitr (2nd Day)", zh: "\u5F00\u658B\u8282\uFF08\u7B2C\u4E8C\u5929\uFF09" },
353
+ type: "islamic",
354
+ status: "confirmed",
355
+ states: ["*"],
356
+ isPublicHoliday: true,
357
+ gazetteLevel: "P",
358
+ hijriDate: "2 Syawal 1445",
359
+ source: "jpm",
360
+ createdAt: "2023-08-01T00:00:00+08:00",
361
+ updatedAt: "2023-08-01T00:00:00+08:00"
362
+ },
363
+ {
364
+ id: "2024-keputeraan-sultan-terengganu",
365
+ date: "2024-04-26",
366
+ name: { ms: "Hari Keputeraan Sultan Terengganu", en: "Birthday of Sultan of Terengganu" },
367
+ type: "state",
368
+ status: "confirmed",
369
+ states: ["terengganu"],
370
+ isPublicHoliday: true,
371
+ gazetteLevel: "N",
372
+ source: "jpm",
373
+ createdAt: "2023-08-01T00:00:00+08:00",
374
+ updatedAt: "2023-08-01T00:00:00+08:00"
375
+ },
376
+ {
377
+ id: "2024-hari-pekerja",
378
+ date: "2024-05-01",
379
+ name: { ms: "Hari Pekerja", en: "Labour Day", zh: "\u52B3\u52A8\u8282" },
380
+ type: "federal",
381
+ status: "confirmed",
382
+ states: ["*"],
383
+ isPublicHoliday: true,
384
+ gazetteLevel: "P",
385
+ source: "jpm",
386
+ createdAt: "2023-08-01T00:00:00+08:00",
387
+ updatedAt: "2023-08-01T00:00:00+08:00"
388
+ },
389
+ {
390
+ id: "2024-keputeraan-raja-perlis",
391
+ date: "2024-05-17",
392
+ name: { ms: "Hari Ulang Tahun Keputeraan Raja Perlis", en: "Birthday of Raja of Perlis" },
393
+ type: "state",
394
+ status: "confirmed",
395
+ states: ["perlis"],
396
+ isPublicHoliday: true,
397
+ gazetteLevel: "N",
398
+ source: "jpm",
399
+ createdAt: "2023-08-01T00:00:00+08:00",
400
+ updatedAt: "2023-08-01T00:00:00+08:00"
401
+ },
402
+ {
403
+ id: "2024-hari-hol-pahang",
404
+ date: "2024-05-22",
405
+ name: { ms: "Hari Hol Pahang", en: "Pahang Hol Day" },
406
+ type: "state",
407
+ status: "confirmed",
408
+ states: ["pahang"],
409
+ isPublicHoliday: true,
410
+ gazetteLevel: "N",
411
+ source: "jpm",
412
+ createdAt: "2023-08-01T00:00:00+08:00",
413
+ updatedAt: "2023-08-01T00:00:00+08:00"
414
+ },
415
+ {
416
+ id: "2024-hari-wesak",
417
+ date: "2024-05-22",
418
+ name: { ms: "Hari Wesak", en: "Vesak Day", zh: "\u536B\u585E\u8282" },
419
+ type: "federal",
420
+ status: "confirmed",
421
+ states: ["*"],
422
+ isPublicHoliday: true,
423
+ gazetteLevel: "P",
424
+ source: "jpm",
425
+ createdAt: "2023-08-01T00:00:00+08:00",
426
+ updatedAt: "2023-08-01T00:00:00+08:00"
427
+ },
428
+ {
429
+ id: "2024-pesta-kaamatan-1",
430
+ date: "2024-05-30",
431
+ name: { ms: "Pesta Kaamatan (Pesta Menuai)", en: "Harvest Festival (Kaamatan)" },
432
+ type: "state",
433
+ status: "confirmed",
434
+ states: ["sabah", "wp-labuan"],
435
+ isPublicHoliday: true,
436
+ gazetteLevel: "N",
437
+ source: "jpm",
438
+ createdAt: "2023-08-01T00:00:00+08:00",
439
+ updatedAt: "2023-08-01T00:00:00+08:00"
440
+ },
441
+ {
442
+ id: "2024-pesta-kaamatan-2",
443
+ date: "2024-05-31",
444
+ name: { ms: "Pesta Kaamatan (Pesta Menuai) Hari Kedua", en: "Harvest Festival (Kaamatan) 2nd Day" },
445
+ type: "state",
446
+ status: "confirmed",
447
+ states: ["sabah", "wp-labuan"],
448
+ isPublicHoliday: true,
449
+ gazetteLevel: "N",
450
+ source: "jpm",
451
+ createdAt: "2023-08-01T00:00:00+08:00",
452
+ updatedAt: "2023-08-01T00:00:00+08:00"
453
+ },
454
+ {
455
+ id: "2024-gawai-dayak-1",
456
+ date: "2024-06-01",
457
+ name: { ms: "Perayaan Hari Gawai Dayak", en: "Gawai Dayak Festival" },
458
+ type: "state",
459
+ status: "confirmed",
460
+ states: ["sarawak"],
461
+ isPublicHoliday: true,
462
+ gazetteLevel: "N",
463
+ source: "jpm",
464
+ createdAt: "2023-08-01T00:00:00+08:00",
465
+ updatedAt: "2023-08-01T00:00:00+08:00"
466
+ },
467
+ {
468
+ id: "2024-gawai-dayak-2",
469
+ date: "2024-06-02",
470
+ name: { ms: "Perayaan Hari Gawai Dayak (Hari Kedua)", en: "Gawai Dayak Festival (2nd Day)" },
471
+ type: "state",
472
+ status: "confirmed",
473
+ states: ["sarawak"],
474
+ isPublicHoliday: true,
475
+ gazetteLevel: "N",
476
+ source: "jpm",
477
+ createdAt: "2023-08-01T00:00:00+08:00",
478
+ updatedAt: "2023-08-01T00:00:00+08:00"
479
+ },
480
+ {
481
+ id: "2024-keputeraan-agong",
482
+ date: "2024-06-03",
483
+ name: { ms: "Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong", en: "Official Birthday of the Yang di-Pertuan Agong", zh: "\u6700\u9AD8\u5143\u9996\u8BDE\u8FB0" },
484
+ type: "federal",
485
+ status: "confirmed",
486
+ states: ["*"],
487
+ isPublicHoliday: true,
488
+ gazetteLevel: "P",
489
+ source: "jpm",
490
+ createdAt: "2023-08-01T00:00:00+08:00",
491
+ updatedAt: "2023-08-01T00:00:00+08:00"
492
+ },
493
+ {
494
+ id: "2024-hari-raya-haji-1",
495
+ date: "2024-06-17",
496
+ name: { ms: "Hari Raya Qurban", en: "Eid al-Adha", zh: "\u54C8\u829D\u8282" },
497
+ type: "islamic",
498
+ status: "confirmed",
499
+ states: ["*"],
500
+ isPublicHoliday: true,
501
+ gazetteLevel: "P",
502
+ hijriDate: "10 Zulhijjah 1445",
503
+ source: "jpm",
504
+ createdAt: "2023-08-01T00:00:00+08:00",
505
+ updatedAt: "2023-08-01T00:00:00+08:00"
506
+ },
507
+ {
508
+ id: "2024-hari-raya-haji-2",
509
+ date: "2024-06-18",
510
+ name: { ms: "Hari Raya Qurban (Hari Kedua)", en: "Eid al-Adha (2nd Day)", zh: "\u54C8\u829D\u8282\uFF08\u7B2C\u4E8C\u5929\uFF09" },
511
+ type: "islamic",
512
+ status: "confirmed",
513
+ states: ["*"],
514
+ isPublicHoliday: true,
515
+ gazetteLevel: "P",
516
+ hijriDate: "11 Zulhijjah 1445",
517
+ source: "jpm",
518
+ createdAt: "2023-08-01T00:00:00+08:00",
519
+ updatedAt: "2023-08-01T00:00:00+08:00"
520
+ },
521
+ {
522
+ id: "2024-awal-muharam",
523
+ date: "2024-07-08",
524
+ name: { ms: "Awal Muharam (Maal Hijrah)", en: "Islamic New Year", zh: "\u56DE\u5386\u65B0\u5E74" },
525
+ type: "islamic",
526
+ status: "confirmed",
527
+ states: ["*"],
528
+ isPublicHoliday: true,
529
+ gazetteLevel: "P",
530
+ hijriDate: "1 Muharam 1446",
531
+ source: "jpm",
532
+ createdAt: "2023-08-01T00:00:00+08:00",
533
+ updatedAt: "2023-08-01T00:00:00+08:00"
534
+ },
535
+ {
536
+ id: "2024-tapak-warisan-dunia",
537
+ date: "2024-07-07",
538
+ name: { ms: "Hari Ulang Tahun Perisytiharan Tapak Warisan Dunia", en: "World Heritage Site Declaration Anniversary" },
539
+ type: "state",
540
+ status: "confirmed",
541
+ states: ["melaka"],
542
+ isPublicHoliday: true,
543
+ gazetteLevel: "N",
544
+ source: "jpm",
545
+ createdAt: "2023-08-01T00:00:00+08:00",
546
+ updatedAt: "2023-08-01T00:00:00+08:00"
547
+ },
548
+ {
549
+ id: "2024-hari-hol-johor",
550
+ date: "2024-07-21",
551
+ name: { ms: "Hari Hol Almarhum Sultan Iskandar", en: "Johor Hol Day" },
552
+ type: "state",
553
+ status: "confirmed",
554
+ states: ["johor"],
555
+ isPublicHoliday: true,
556
+ gazetteLevel: "N",
557
+ source: "jpm",
558
+ createdAt: "2023-08-01T00:00:00+08:00",
559
+ updatedAt: "2023-08-01T00:00:00+08:00"
560
+ },
561
+ {
562
+ id: "2024-hari-kemerdekaan-sarawak",
563
+ date: "2024-07-22",
564
+ name: { ms: "Hari Kemerdekaan Sarawak", en: "Sarawak Independence Day" },
565
+ type: "state",
566
+ status: "confirmed",
567
+ states: ["sarawak"],
568
+ isPublicHoliday: true,
569
+ gazetteLevel: "N",
570
+ source: "jpm",
571
+ createdAt: "2023-08-01T00:00:00+08:00",
572
+ updatedAt: "2023-08-01T00:00:00+08:00"
573
+ },
574
+ {
575
+ id: "2024-keputeraan-sultan-pahang",
576
+ date: "2024-07-30",
577
+ name: { ms: "Hari Keputeraan Sultan Pahang", en: "Birthday of Sultan of Pahang" },
578
+ type: "state",
579
+ status: "confirmed",
580
+ states: ["pahang"],
581
+ isPublicHoliday: true,
582
+ gazetteLevel: "N",
583
+ source: "jpm",
584
+ createdAt: "2023-08-01T00:00:00+08:00",
585
+ updatedAt: "2023-08-01T00:00:00+08:00"
586
+ },
587
+ {
588
+ id: "2024-hari-kebangsaan",
589
+ date: "2024-08-31",
590
+ name: { ms: "Hari Kebangsaan", en: "National Day", zh: "\u56FD\u5E86\u65E5" },
591
+ type: "federal",
592
+ status: "confirmed",
593
+ states: ["*"],
594
+ isPublicHoliday: true,
595
+ gazetteLevel: "P",
596
+ source: "jpm",
597
+ createdAt: "2023-08-01T00:00:00+08:00",
598
+ updatedAt: "2023-08-01T00:00:00+08:00"
599
+ },
600
+ {
601
+ id: "2024-hari-malaysia",
602
+ date: "2024-09-16",
603
+ name: { ms: "Hari Malaysia", en: "Malaysia Day", zh: "\u9A6C\u6765\u897F\u4E9A\u65E5" },
604
+ type: "federal",
605
+ status: "confirmed",
606
+ states: ["*"],
607
+ isPublicHoliday: true,
608
+ gazetteLevel: "P",
609
+ source: "jpm",
610
+ createdAt: "2023-08-01T00:00:00+08:00",
611
+ updatedAt: "2023-08-01T00:00:00+08:00"
612
+ },
613
+ {
614
+ id: "2024-maulidur-rasul",
615
+ date: "2024-09-27",
616
+ name: { ms: "Hari Keputeraan Nabi Muhammad S.A.W. (Maulidur Rasul)", en: "Prophet Muhammad's Birthday", zh: "\u5148\u77E5\u7A46\u7F55\u9ED8\u5FB7\u8BDE\u8FB0" },
617
+ type: "islamic",
618
+ status: "confirmed",
619
+ states: ["*"],
620
+ isPublicHoliday: true,
621
+ gazetteLevel: "P",
622
+ hijriDate: "12 Rabiulawal 1446",
623
+ source: "jpm",
624
+ createdAt: "2023-08-01T00:00:00+08:00",
625
+ updatedAt: "2023-08-01T00:00:00+08:00"
626
+ },
627
+ {
628
+ id: "2024-keputeraan-sultan-kelantan-1",
629
+ date: "2024-09-29",
630
+ name: { ms: "Hari Keputeraan Sultan Kelantan", en: "Birthday of Sultan of Kelantan (Day 1)" },
631
+ type: "state",
632
+ status: "confirmed",
633
+ states: ["kelantan"],
634
+ isPublicHoliday: true,
635
+ gazetteLevel: "N",
636
+ source: "jpm",
637
+ createdAt: "2023-08-01T00:00:00+08:00",
638
+ updatedAt: "2023-08-01T00:00:00+08:00"
639
+ },
640
+ {
641
+ id: "2024-keputeraan-sultan-kelantan-2",
642
+ date: "2024-09-30",
643
+ name: { ms: "Hari Keputeraan Sultan Kelantan (Hari Kedua)", en: "Birthday of Sultan of Kelantan (Day 2)" },
644
+ type: "state",
645
+ status: "confirmed",
646
+ states: ["kelantan"],
647
+ isPublicHoliday: true,
648
+ gazetteLevel: "N",
649
+ source: "jpm",
650
+ createdAt: "2023-08-01T00:00:00+08:00",
651
+ updatedAt: "2023-08-01T00:00:00+08:00"
652
+ },
653
+ {
654
+ id: "2024-deepavali",
655
+ date: "2024-11-01",
656
+ name: { ms: "Hari Deepavali", en: "Deepavali", zh: "\u5C60\u5996\u8282" },
657
+ type: "federal",
658
+ status: "confirmed",
659
+ states: ["*"],
660
+ isPublicHoliday: true,
661
+ gazetteLevel: "P",
662
+ source: "jpm",
663
+ createdAt: "2023-08-01T00:00:00+08:00",
664
+ updatedAt: "2023-08-01T00:00:00+08:00"
665
+ },
666
+ {
667
+ id: "2024-keputeraan-sultan-perak",
668
+ date: "2024-11-01",
669
+ name: { ms: "Hari Keputeraan Sultan Perak", en: "Birthday of Sultan of Perak" },
670
+ type: "state",
671
+ status: "confirmed",
672
+ states: ["perak"],
673
+ isPublicHoliday: true,
674
+ gazetteLevel: "N",
675
+ source: "jpm",
676
+ createdAt: "2023-08-01T00:00:00+08:00",
677
+ updatedAt: "2023-08-01T00:00:00+08:00"
678
+ },
679
+ {
680
+ id: "2024-keputeraan-sultan-selangor",
681
+ date: "2024-12-11",
682
+ name: { ms: "Hari Keputeraan Sultan Selangor", en: "Birthday of Sultan of Selangor" },
683
+ type: "state",
684
+ status: "confirmed",
685
+ states: ["selangor"],
686
+ isPublicHoliday: true,
687
+ gazetteLevel: "N",
688
+ source: "jpm",
689
+ createdAt: "2023-08-01T00:00:00+08:00",
690
+ updatedAt: "2023-08-01T00:00:00+08:00"
691
+ },
692
+ {
693
+ id: "2024-christmas-eve",
694
+ date: "2024-12-24",
695
+ name: { ms: "Christmas Eve", en: "Christmas Eve", zh: "\u5723\u8BDE\u591C" },
696
+ type: "state",
697
+ status: "confirmed",
698
+ states: ["sabah"],
699
+ isPublicHoliday: true,
700
+ gazetteLevel: "N",
701
+ source: "jpm",
702
+ createdAt: "2023-08-01T00:00:00+08:00",
703
+ updatedAt: "2023-08-01T00:00:00+08:00"
704
+ },
705
+ {
706
+ id: "2024-hari-krismas",
707
+ date: "2024-12-25",
708
+ name: { ms: "Hari Krismas", en: "Christmas Day", zh: "\u5723\u8BDE\u8282" },
709
+ type: "federal",
710
+ status: "confirmed",
711
+ states: ["*"],
712
+ isPublicHoliday: true,
713
+ gazetteLevel: "P",
714
+ source: "jpm",
715
+ createdAt: "2023-08-01T00:00:00+08:00",
716
+ updatedAt: "2023-08-01T00:00:00+08:00"
717
+ }
718
+ ];
719
+
720
+ // ../../data/holidays/2025.json
721
+ var __default2 = [
722
+ {
723
+ id: "2025-tahun-baharu",
724
+ date: "2025-01-01",
725
+ name: { ms: "Tahun Baharu", en: "New Year's Day", zh: "\u5143\u65E6" },
726
+ type: "state",
727
+ status: "confirmed",
728
+ states: ["perak", "pulau-pinang", "selangor", "negeri-sembilan", "melaka", "pahang", "sabah", "sarawak", "kuala-lumpur", "wp-putrajaya", "wp-labuan", "perlis"],
729
+ isPublicHoliday: true,
730
+ gazetteLevel: "N",
731
+ source: "jpm",
732
+ createdAt: "2024-08-01T00:00:00+08:00",
733
+ updatedAt: "2024-08-01T00:00:00+08:00"
734
+ },
735
+ {
736
+ id: "2025-keputeraan-ydb-ns",
737
+ date: "2025-01-14",
738
+ name: { ms: "Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan", en: "Birthday of Yang di-Pertuan Besar of Negeri Sembilan" },
739
+ type: "state",
740
+ status: "confirmed",
741
+ states: ["negeri-sembilan"],
742
+ isPublicHoliday: true,
743
+ gazetteLevel: "N",
744
+ source: "jpm",
745
+ createdAt: "2024-08-01T00:00:00+08:00",
746
+ updatedAt: "2024-08-01T00:00:00+08:00"
747
+ },
748
+ {
749
+ id: "2025-israk-mikraj",
750
+ date: "2025-01-27",
751
+ name: { ms: "Israk dan Mikraj", en: "Isra' Mi'raj", zh: "\u591C\u884C\u767B\u9704" },
752
+ type: "islamic",
753
+ status: "confirmed",
754
+ states: ["*"],
755
+ isPublicHoliday: true,
756
+ gazetteLevel: "P",
757
+ hijriDate: "27 Rejab 1446",
758
+ source: "jpm",
759
+ createdAt: "2024-08-01T00:00:00+08:00",
760
+ updatedAt: "2024-08-01T00:00:00+08:00"
761
+ },
762
+ {
763
+ id: "2025-tahun-baharu-cina-1",
764
+ date: "2025-01-29",
765
+ name: { ms: "Tahun Baharu Cina", en: "Chinese New Year", zh: "\u519C\u5386\u65B0\u5E74" },
766
+ type: "federal",
767
+ status: "confirmed",
768
+ states: ["*"],
769
+ isPublicHoliday: true,
770
+ gazetteLevel: "P",
771
+ source: "jpm",
772
+ createdAt: "2024-08-01T00:00:00+08:00",
773
+ updatedAt: "2024-08-01T00:00:00+08:00"
774
+ },
775
+ {
776
+ id: "2025-tahun-baharu-cina-2",
777
+ date: "2025-01-30",
778
+ name: { ms: "Tahun Baharu Cina (Hari Kedua)", en: "Chinese New Year (2nd Day)", zh: "\u519C\u5386\u65B0\u5E74\uFF08\u7B2C\u4E8C\u5929\uFF09" },
779
+ type: "federal",
780
+ status: "confirmed",
781
+ states: ["*"],
782
+ isPublicHoliday: true,
783
+ gazetteLevel: "P",
784
+ source: "jpm",
785
+ createdAt: "2024-08-01T00:00:00+08:00",
786
+ updatedAt: "2024-08-01T00:00:00+08:00"
787
+ },
788
+ {
789
+ id: "2025-hari-wilayah",
790
+ date: "2025-02-01",
791
+ name: { ms: "Hari Wilayah Persekutuan", en: "Federal Territory Day", zh: "\u8054\u90A6\u76F4\u8F96\u533A\u65E5" },
792
+ type: "state",
793
+ status: "confirmed",
794
+ states: ["kuala-lumpur", "wp-putrajaya", "wp-labuan"],
795
+ isPublicHoliday: true,
796
+ gazetteLevel: "N",
797
+ source: "jpm",
798
+ createdAt: "2024-08-01T00:00:00+08:00",
799
+ updatedAt: "2024-08-01T00:00:00+08:00"
800
+ },
801
+ {
802
+ id: "2025-thaipusam",
803
+ date: "2025-02-11",
804
+ name: { ms: "Hari Thaipusam", en: "Thaipusam", zh: "\u5927\u5B9D\u68EE\u8282" },
805
+ type: "federal",
806
+ status: "confirmed",
807
+ states: ["*"],
808
+ isPublicHoliday: true,
809
+ gazetteLevel: "P",
810
+ source: "jpm",
811
+ createdAt: "2024-08-01T00:00:00+08:00",
812
+ updatedAt: "2024-08-01T00:00:00+08:00"
813
+ },
814
+ {
815
+ id: "2025-awal-ramadan",
816
+ date: "2025-03-01",
817
+ name: { ms: "Awal Ramadan", en: "Beginning of Ramadan", zh: "\u658B\u6212\u6708\u9996\u65E5" },
818
+ type: "islamic_state",
819
+ status: "confirmed",
820
+ states: ["johor", "kedah", "kelantan", "terengganu", "melaka", "perlis"],
821
+ isPublicHoliday: true,
822
+ gazetteLevel: "N",
823
+ hijriDate: "1 Ramadan 1446",
824
+ source: "jpm",
825
+ createdAt: "2024-08-01T00:00:00+08:00",
826
+ updatedAt: "2024-08-01T00:00:00+08:00"
827
+ },
828
+ {
829
+ id: "2025-nuzul-quran",
830
+ date: "2025-03-17",
831
+ name: { ms: "Hari Nuzul Al-Quran", en: "Revelation of the Quran", zh: "\u53EF\u5170\u7ECF\u964D\u4E16" },
832
+ type: "islamic",
833
+ status: "confirmed",
834
+ states: ["*"],
835
+ isPublicHoliday: true,
836
+ gazetteLevel: "P",
837
+ hijriDate: "17 Ramadan 1446",
838
+ source: "jpm",
839
+ createdAt: "2024-08-01T00:00:00+08:00",
840
+ updatedAt: "2024-08-01T00:00:00+08:00"
841
+ },
842
+ {
843
+ id: "2025-hari-raya-aidilfitri-1",
844
+ date: "2025-03-31",
845
+ name: { ms: "Hari Raya Aidilfitri", en: "Eid al-Fitr", zh: "\u5F00\u658B\u8282" },
846
+ type: "islamic",
847
+ status: "confirmed",
848
+ states: ["*"],
849
+ isPublicHoliday: true,
850
+ gazetteLevel: "P",
851
+ hijriDate: "1 Syawal 1446",
852
+ source: "jpm",
853
+ createdAt: "2024-08-01T00:00:00+08:00",
854
+ updatedAt: "2024-08-01T00:00:00+08:00"
855
+ },
856
+ {
857
+ id: "2025-hari-raya-aidilfitri-2",
858
+ date: "2025-04-01",
859
+ name: { ms: "Hari Raya Aidilfitri (Hari Kedua)", en: "Eid al-Fitr (2nd Day)", zh: "\u5F00\u658B\u8282\uFF08\u7B2C\u4E8C\u5929\uFF09" },
860
+ type: "islamic",
861
+ status: "confirmed",
862
+ states: ["*"],
863
+ isPublicHoliday: true,
864
+ gazetteLevel: "P",
865
+ hijriDate: "2 Syawal 1446",
866
+ source: "jpm",
867
+ createdAt: "2024-08-01T00:00:00+08:00",
868
+ updatedAt: "2024-08-01T00:00:00+08:00"
869
+ },
870
+ {
871
+ id: "2025-hari-pekerja",
872
+ date: "2025-05-01",
873
+ name: { ms: "Hari Pekerja", en: "Labour Day", zh: "\u52B3\u52A8\u8282" },
874
+ type: "federal",
875
+ status: "confirmed",
876
+ states: ["*"],
877
+ isPublicHoliday: true,
878
+ gazetteLevel: "P",
879
+ source: "jpm",
880
+ createdAt: "2024-08-01T00:00:00+08:00",
881
+ updatedAt: "2024-08-01T00:00:00+08:00"
882
+ },
883
+ {
884
+ id: "2025-hari-wesak",
885
+ date: "2025-05-12",
886
+ name: { ms: "Hari Wesak", en: "Vesak Day", zh: "\u536B\u585E\u8282" },
887
+ type: "federal",
888
+ status: "confirmed",
889
+ states: ["*"],
890
+ isPublicHoliday: true,
891
+ gazetteLevel: "P",
892
+ source: "jpm",
893
+ createdAt: "2024-08-01T00:00:00+08:00",
894
+ updatedAt: "2024-08-01T00:00:00+08:00"
895
+ },
896
+ {
897
+ id: "2025-pesta-kaamatan-1",
898
+ date: "2025-05-30",
899
+ name: { ms: "Pesta Kaamatan (Pesta Menuai)", en: "Harvest Festival (Kaamatan)" },
900
+ type: "state",
901
+ status: "confirmed",
902
+ states: ["sabah", "wp-labuan"],
903
+ isPublicHoliday: true,
904
+ gazetteLevel: "N",
905
+ source: "jpm",
906
+ createdAt: "2024-08-01T00:00:00+08:00",
907
+ updatedAt: "2024-08-01T00:00:00+08:00"
908
+ },
909
+ {
910
+ id: "2025-pesta-kaamatan-2",
911
+ date: "2025-05-31",
912
+ name: { ms: "Pesta Kaamatan (Pesta Menuai) Hari Kedua", en: "Harvest Festival (Kaamatan) 2nd Day" },
913
+ type: "state",
914
+ status: "confirmed",
915
+ states: ["sabah", "wp-labuan"],
916
+ isPublicHoliday: true,
917
+ gazetteLevel: "N",
918
+ source: "jpm",
919
+ createdAt: "2024-08-01T00:00:00+08:00",
920
+ updatedAt: "2024-08-01T00:00:00+08:00"
921
+ },
922
+ {
923
+ id: "2025-gawai-dayak-1",
924
+ date: "2025-06-01",
925
+ name: { ms: "Perayaan Hari Gawai Dayak", en: "Gawai Dayak Festival" },
926
+ type: "state",
927
+ status: "confirmed",
928
+ states: ["sarawak"],
929
+ isPublicHoliday: true,
930
+ gazetteLevel: "N",
931
+ source: "jpm",
932
+ createdAt: "2024-08-01T00:00:00+08:00",
933
+ updatedAt: "2024-08-01T00:00:00+08:00"
934
+ },
935
+ {
936
+ id: "2025-gawai-dayak-2",
937
+ date: "2025-06-02",
938
+ name: { ms: "Perayaan Hari Gawai Dayak (Hari Kedua)", en: "Gawai Dayak Festival (2nd Day)" },
939
+ type: "state",
940
+ status: "confirmed",
941
+ states: ["sarawak"],
942
+ isPublicHoliday: true,
943
+ gazetteLevel: "N",
944
+ source: "jpm",
945
+ createdAt: "2024-08-01T00:00:00+08:00",
946
+ updatedAt: "2024-08-01T00:00:00+08:00"
947
+ },
948
+ {
949
+ id: "2025-keputeraan-agong",
950
+ date: "2025-06-02",
951
+ name: { ms: "Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong", en: "Official Birthday of the Yang di-Pertuan Agong", zh: "\u6700\u9AD8\u5143\u9996\u8BDE\u8FB0" },
952
+ type: "federal",
953
+ status: "confirmed",
954
+ states: ["*"],
955
+ isPublicHoliday: true,
956
+ gazetteLevel: "P",
957
+ source: "jpm",
958
+ createdAt: "2024-08-01T00:00:00+08:00",
959
+ updatedAt: "2024-08-01T00:00:00+08:00"
960
+ },
961
+ {
962
+ id: "2025-hari-raya-haji-1",
963
+ date: "2025-06-07",
964
+ name: { ms: "Hari Raya Qurban", en: "Eid al-Adha", zh: "\u54C8\u829D\u8282" },
965
+ type: "islamic",
966
+ status: "confirmed",
967
+ states: ["*"],
968
+ isPublicHoliday: true,
969
+ gazetteLevel: "P",
970
+ hijriDate: "10 Zulhijjah 1446",
971
+ source: "jpm",
972
+ createdAt: "2024-08-01T00:00:00+08:00",
973
+ updatedAt: "2024-08-01T00:00:00+08:00"
974
+ },
975
+ {
976
+ id: "2025-hari-raya-haji-2",
977
+ date: "2025-06-08",
978
+ name: { ms: "Hari Raya Qurban (Hari Kedua)", en: "Eid al-Adha (2nd Day)", zh: "\u54C8\u829D\u8282\uFF08\u7B2C\u4E8C\u5929\uFF09" },
979
+ type: "islamic",
980
+ status: "confirmed",
981
+ states: ["*"],
982
+ isPublicHoliday: true,
983
+ gazetteLevel: "P",
984
+ hijriDate: "11 Zulhijjah 1446",
985
+ source: "jpm",
986
+ createdAt: "2024-08-01T00:00:00+08:00",
987
+ updatedAt: "2024-08-01T00:00:00+08:00"
988
+ },
989
+ {
990
+ id: "2025-awal-muharam",
991
+ date: "2025-06-27",
992
+ name: { ms: "Awal Muharam (Maal Hijrah)", en: "Islamic New Year", zh: "\u56DE\u5386\u65B0\u5E74" },
993
+ type: "islamic",
994
+ status: "confirmed",
995
+ states: ["*"],
996
+ isPublicHoliday: true,
997
+ gazetteLevel: "P",
998
+ hijriDate: "1 Muharam 1447",
999
+ source: "jpm",
1000
+ createdAt: "2024-08-01T00:00:00+08:00",
1001
+ updatedAt: "2024-08-01T00:00:00+08:00"
1002
+ },
1003
+ {
1004
+ id: "2025-hari-kebangsaan",
1005
+ date: "2025-08-31",
1006
+ name: { ms: "Hari Kebangsaan", en: "National Day", zh: "\u56FD\u5E86\u65E5" },
1007
+ type: "federal",
1008
+ status: "confirmed",
1009
+ states: ["*"],
1010
+ isPublicHoliday: true,
1011
+ gazetteLevel: "P",
1012
+ source: "jpm",
1013
+ createdAt: "2024-08-01T00:00:00+08:00",
1014
+ updatedAt: "2024-08-01T00:00:00+08:00"
1015
+ },
1016
+ {
1017
+ id: "2025-maulidur-rasul",
1018
+ date: "2025-09-05",
1019
+ name: { ms: "Hari Keputeraan Nabi Muhammad S.A.W. (Maulidur Rasul)", en: "Prophet Muhammad's Birthday", zh: "\u5148\u77E5\u7A46\u7F55\u9ED8\u5FB7\u8BDE\u8FB0" },
1020
+ type: "islamic",
1021
+ status: "confirmed",
1022
+ states: ["*"],
1023
+ isPublicHoliday: true,
1024
+ gazetteLevel: "P",
1025
+ hijriDate: "12 Rabiulawal 1447",
1026
+ source: "jpm",
1027
+ createdAt: "2024-08-01T00:00:00+08:00",
1028
+ updatedAt: "2024-08-01T00:00:00+08:00"
1029
+ },
1030
+ {
1031
+ id: "2025-hari-malaysia",
1032
+ date: "2025-09-16",
1033
+ name: { ms: "Hari Malaysia", en: "Malaysia Day", zh: "\u9A6C\u6765\u897F\u4E9A\u65E5" },
1034
+ type: "federal",
1035
+ status: "confirmed",
1036
+ states: ["*"],
1037
+ isPublicHoliday: true,
1038
+ gazetteLevel: "P",
1039
+ source: "jpm",
1040
+ createdAt: "2024-08-01T00:00:00+08:00",
1041
+ updatedAt: "2024-08-01T00:00:00+08:00"
1042
+ },
1043
+ {
1044
+ id: "2025-deepavali",
1045
+ date: "2025-10-20",
1046
+ name: { ms: "Hari Deepavali", en: "Deepavali", zh: "\u5C60\u5996\u8282" },
1047
+ type: "federal",
1048
+ status: "confirmed",
1049
+ states: ["*"],
1050
+ isPublicHoliday: true,
1051
+ gazetteLevel: "P",
1052
+ source: "jpm",
1053
+ createdAt: "2024-08-01T00:00:00+08:00",
1054
+ updatedAt: "2024-08-01T00:00:00+08:00"
1055
+ },
1056
+ {
1057
+ id: "2025-pertabalan-sultan-terengganu",
1058
+ date: "2025-03-04",
1059
+ name: { ms: "Hari Ulang Tahun Pertabalan Sultan Terengganu", en: "Anniversary of Sultan of Terengganu's Installation" },
1060
+ type: "state",
1061
+ status: "confirmed",
1062
+ states: ["terengganu"],
1063
+ isPublicHoliday: true,
1064
+ gazetteLevel: "N",
1065
+ source: "jpm",
1066
+ createdAt: "2024-08-01T00:00:00+08:00",
1067
+ updatedAt: "2024-08-01T00:00:00+08:00"
1068
+ },
1069
+ {
1070
+ id: "2025-keputeraan-sultan-johor",
1071
+ date: "2025-03-23",
1072
+ name: { ms: "Hari Keputeraan Sultan Johor", en: "Birthday of Sultan of Johor" },
1073
+ type: "state",
1074
+ status: "confirmed",
1075
+ states: ["johor"],
1076
+ isPublicHoliday: true,
1077
+ gazetteLevel: "N",
1078
+ source: "jpm",
1079
+ createdAt: "2024-08-01T00:00:00+08:00",
1080
+ updatedAt: "2024-08-01T00:00:00+08:00"
1081
+ },
1082
+ {
1083
+ id: "2025-good-friday",
1084
+ date: "2025-04-18",
1085
+ name: { ms: "Good Friday", en: "Good Friday", zh: "\u8036\u7A23\u53D7\u96BE\u65E5" },
1086
+ type: "state",
1087
+ status: "confirmed",
1088
+ states: ["sabah", "sarawak"],
1089
+ isPublicHoliday: true,
1090
+ gazetteLevel: "N",
1091
+ source: "jpm",
1092
+ createdAt: "2024-08-01T00:00:00+08:00",
1093
+ updatedAt: "2024-08-01T00:00:00+08:00"
1094
+ },
1095
+ {
1096
+ id: "2025-keputeraan-sultan-terengganu",
1097
+ date: "2025-04-26",
1098
+ name: { ms: "Hari Keputeraan Sultan Terengganu", en: "Birthday of Sultan of Terengganu" },
1099
+ type: "state",
1100
+ status: "confirmed",
1101
+ states: ["terengganu"],
1102
+ isPublicHoliday: true,
1103
+ gazetteLevel: "N",
1104
+ source: "jpm",
1105
+ createdAt: "2024-08-01T00:00:00+08:00",
1106
+ updatedAt: "2024-08-01T00:00:00+08:00"
1107
+ },
1108
+ {
1109
+ id: "2025-keputeraan-raja-perlis",
1110
+ date: "2025-05-17",
1111
+ name: { ms: "Hari Ulang Tahun Keputeraan Raja Perlis", en: "Birthday of Raja of Perlis" },
1112
+ type: "state",
1113
+ status: "confirmed",
1114
+ states: ["perlis"],
1115
+ isPublicHoliday: true,
1116
+ gazetteLevel: "N",
1117
+ source: "jpm",
1118
+ createdAt: "2024-08-01T00:00:00+08:00",
1119
+ updatedAt: "2024-08-01T00:00:00+08:00"
1120
+ },
1121
+ {
1122
+ id: "2025-hari-hol-pahang",
1123
+ date: "2025-05-22",
1124
+ name: { ms: "Hari Hol Pahang", en: "Pahang Hol Day" },
1125
+ type: "state",
1126
+ status: "confirmed",
1127
+ states: ["pahang"],
1128
+ isPublicHoliday: true,
1129
+ gazetteLevel: "N",
1130
+ source: "jpm",
1131
+ createdAt: "2024-08-01T00:00:00+08:00",
1132
+ updatedAt: "2024-08-01T00:00:00+08:00"
1133
+ },
1134
+ {
1135
+ id: "2025-hari-arafah",
1136
+ date: "2025-06-06",
1137
+ name: { ms: "Hari Arafah", en: "Day of Arafah" },
1138
+ type: "islamic_state",
1139
+ status: "confirmed",
1140
+ states: ["kelantan", "terengganu", "kedah", "perlis"],
1141
+ isPublicHoliday: true,
1142
+ gazetteLevel: "N",
1143
+ hijriDate: "9 Zulhijjah 1446",
1144
+ source: "jpm",
1145
+ createdAt: "2024-08-01T00:00:00+08:00",
1146
+ updatedAt: "2024-08-01T00:00:00+08:00"
1147
+ },
1148
+ {
1149
+ id: "2025-tapak-warisan-dunia",
1150
+ date: "2025-07-07",
1151
+ name: { ms: "Hari Ulang Tahun Perisytiharan Tapak Warisan Dunia", en: "World Heritage Site Declaration Anniversary" },
1152
+ type: "state",
1153
+ status: "confirmed",
1154
+ states: ["melaka"],
1155
+ isPublicHoliday: true,
1156
+ gazetteLevel: "N",
1157
+ source: "jpm",
1158
+ createdAt: "2024-08-01T00:00:00+08:00",
1159
+ updatedAt: "2024-08-01T00:00:00+08:00"
1160
+ },
1161
+ {
1162
+ id: "2025-hari-hol-johor",
1163
+ date: "2025-07-21",
1164
+ name: { ms: "Hari Hol Almarhum Sultan Iskandar", en: "Johor Hol Day" },
1165
+ type: "state",
1166
+ status: "confirmed",
1167
+ states: ["johor"],
1168
+ isPublicHoliday: true,
1169
+ gazetteLevel: "N",
1170
+ source: "jpm",
1171
+ createdAt: "2024-08-01T00:00:00+08:00",
1172
+ updatedAt: "2024-08-01T00:00:00+08:00"
1173
+ },
1174
+ {
1175
+ id: "2025-hari-kemerdekaan-sarawak",
1176
+ date: "2025-07-22",
1177
+ name: { ms: "Hari Kemerdekaan Sarawak", en: "Sarawak Independence Day" },
1178
+ type: "state",
1179
+ status: "confirmed",
1180
+ states: ["sarawak"],
1181
+ isPublicHoliday: true,
1182
+ gazetteLevel: "N",
1183
+ source: "jpm",
1184
+ createdAt: "2024-08-01T00:00:00+08:00",
1185
+ updatedAt: "2024-08-01T00:00:00+08:00"
1186
+ },
1187
+ {
1188
+ id: "2025-keputeraan-sultan-pahang",
1189
+ date: "2025-07-30",
1190
+ name: { ms: "Hari Keputeraan Sultan Pahang", en: "Birthday of Sultan of Pahang" },
1191
+ type: "state",
1192
+ status: "confirmed",
1193
+ states: ["pahang"],
1194
+ isPublicHoliday: true,
1195
+ gazetteLevel: "N",
1196
+ source: "jpm",
1197
+ createdAt: "2024-08-01T00:00:00+08:00",
1198
+ updatedAt: "2024-08-01T00:00:00+08:00"
1199
+ },
1200
+ {
1201
+ id: "2025-keputeraan-sultan-kelantan-1",
1202
+ date: "2025-09-29",
1203
+ name: { ms: "Hari Keputeraan Sultan Kelantan", en: "Birthday of Sultan of Kelantan (Day 1)" },
1204
+ type: "state",
1205
+ status: "confirmed",
1206
+ states: ["kelantan"],
1207
+ isPublicHoliday: true,
1208
+ gazetteLevel: "N",
1209
+ source: "jpm",
1210
+ createdAt: "2024-08-01T00:00:00+08:00",
1211
+ updatedAt: "2024-08-01T00:00:00+08:00"
1212
+ },
1213
+ {
1214
+ id: "2025-keputeraan-sultan-kelantan-2",
1215
+ date: "2025-09-30",
1216
+ name: { ms: "Hari Keputeraan Sultan Kelantan (Hari Kedua)", en: "Birthday of Sultan of Kelantan (Day 2)" },
1217
+ type: "state",
1218
+ status: "confirmed",
1219
+ states: ["kelantan"],
1220
+ isPublicHoliday: true,
1221
+ gazetteLevel: "N",
1222
+ source: "jpm",
1223
+ createdAt: "2024-08-01T00:00:00+08:00",
1224
+ updatedAt: "2024-08-01T00:00:00+08:00"
1225
+ },
1226
+ {
1227
+ id: "2025-keputeraan-sultan-selangor",
1228
+ date: "2025-12-11",
1229
+ name: { ms: "Hari Keputeraan Sultan Selangor", en: "Birthday of Sultan of Selangor" },
1230
+ type: "state",
1231
+ status: "confirmed",
1232
+ states: ["selangor"],
1233
+ isPublicHoliday: true,
1234
+ gazetteLevel: "N",
1235
+ source: "jpm",
1236
+ createdAt: "2024-08-01T00:00:00+08:00",
1237
+ updatedAt: "2024-08-01T00:00:00+08:00"
1238
+ },
1239
+ {
1240
+ id: "2025-christmas-eve",
1241
+ date: "2025-12-24",
1242
+ name: { ms: "Christmas Eve", en: "Christmas Eve", zh: "\u5723\u8BDE\u591C" },
1243
+ type: "state",
1244
+ status: "confirmed",
1245
+ states: ["sabah"],
1246
+ isPublicHoliday: true,
1247
+ gazetteLevel: "N",
1248
+ source: "jpm",
1249
+ createdAt: "2024-08-01T00:00:00+08:00",
1250
+ updatedAt: "2024-08-01T00:00:00+08:00"
1251
+ },
1252
+ {
1253
+ id: "2025-hari-krismas",
1254
+ date: "2025-12-25",
1255
+ name: { ms: "Hari Krismas", en: "Christmas Day", zh: "\u5723\u8BDE\u8282" },
1256
+ type: "federal",
1257
+ status: "confirmed",
1258
+ states: ["*"],
1259
+ isPublicHoliday: true,
1260
+ gazetteLevel: "P",
1261
+ source: "jpm",
1262
+ createdAt: "2024-08-01T00:00:00+08:00",
1263
+ updatedAt: "2024-08-01T00:00:00+08:00"
1264
+ }
1265
+ ];
1266
+
1267
+ // ../../data/holidays/2026.json
1268
+ var __default3 = [
1269
+ {
1270
+ id: "2026-tahun-baharu",
1271
+ date: "2026-01-01",
1272
+ name: { ms: "Tahun Baharu", en: "New Year's Day", zh: "\u5143\u65E6" },
1273
+ type: "state",
1274
+ status: "confirmed",
1275
+ states: ["perak", "pulau-pinang", "selangor", "negeri-sembilan", "melaka", "pahang", "sabah", "sarawak", "kuala-lumpur", "wp-putrajaya", "wp-labuan", "perlis"],
1276
+ isPublicHoliday: true,
1277
+ gazetteLevel: "N",
1278
+ source: "jpm",
1279
+ gazetteRef: "GN-33500",
1280
+ createdAt: "2025-08-28T00:00:00+08:00",
1281
+ updatedAt: "2025-08-28T00:00:00+08:00"
1282
+ },
1283
+ {
1284
+ id: "2026-keputeraan-ydb-ns",
1285
+ date: "2026-01-14",
1286
+ name: { ms: "Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan", en: "Birthday of Yang di-Pertuan Besar of Negeri Sembilan" },
1287
+ type: "state",
1288
+ status: "confirmed",
1289
+ states: ["negeri-sembilan"],
1290
+ isPublicHoliday: true,
1291
+ gazetteLevel: "N",
1292
+ source: "jpm",
1293
+ gazetteRef: "GN-33500",
1294
+ createdAt: "2025-08-28T00:00:00+08:00",
1295
+ updatedAt: "2025-08-28T00:00:00+08:00"
1296
+ },
1297
+ {
1298
+ id: "2026-israk-mikraj",
1299
+ date: "2026-01-17",
1300
+ name: { ms: "Israk dan Mikraj", en: "Isra' Mi'raj", zh: "\u591C\u884C\u767B\u9704" },
1301
+ type: "islamic_state",
1302
+ status: "confirmed",
1303
+ states: ["kedah", "kelantan", "terengganu", "perlis", "negeri-sembilan", "pahang"],
1304
+ isPublicHoliday: true,
1305
+ gazetteLevel: "N",
1306
+ hijriDate: "27 Rejab 1447",
1307
+ source: "jpm",
1308
+ gazetteRef: "GN-33500",
1309
+ createdAt: "2025-08-28T00:00:00+08:00",
1310
+ updatedAt: "2025-08-28T00:00:00+08:00"
1311
+ },
1312
+ {
1313
+ id: "2026-hari-wilayah",
1314
+ date: "2026-02-01",
1315
+ name: { ms: "Hari Wilayah Persekutuan", en: "Federal Territory Day", zh: "\u8054\u90A6\u76F4\u8F96\u533A\u65E5" },
1316
+ type: "state",
1317
+ status: "confirmed",
1318
+ states: ["kuala-lumpur", "wp-putrajaya", "wp-labuan"],
1319
+ isPublicHoliday: true,
1320
+ gazetteLevel: "N",
1321
+ source: "jpm",
1322
+ gazetteRef: "GN-33501",
1323
+ createdAt: "2025-08-28T00:00:00+08:00",
1324
+ updatedAt: "2025-08-28T00:00:00+08:00"
1325
+ },
1326
+ {
1327
+ id: "2026-thaipusam",
1328
+ date: "2026-02-01",
1329
+ name: { ms: "Hari Thaipusam", en: "Thaipusam", zh: "\u5927\u5B9D\u68EE\u8282" },
1330
+ type: "state",
1331
+ status: "confirmed",
1332
+ states: ["perak", "pulau-pinang", "selangor", "negeri-sembilan", "kuala-lumpur", "wp-putrajaya", "wp-labuan", "johor", "melaka", "pahang", "perlis"],
1333
+ isPublicHoliday: true,
1334
+ gazetteLevel: "N",
1335
+ source: "jpm",
1336
+ gazetteRef: "GN-33501",
1337
+ createdAt: "2025-08-28T00:00:00+08:00",
1338
+ updatedAt: "2025-08-28T00:00:00+08:00"
1339
+ },
1340
+ {
1341
+ id: "2026-tahun-baharu-cina-1",
1342
+ date: "2026-02-17",
1343
+ name: { ms: "Tahun Baharu Cina", en: "Chinese New Year", zh: "\u519C\u5386\u65B0\u5E74" },
1344
+ type: "federal",
1345
+ status: "confirmed",
1346
+ states: ["*"],
1347
+ isPublicHoliday: true,
1348
+ gazetteLevel: "P",
1349
+ source: "jpm",
1350
+ gazetteRef: "GN-33499",
1351
+ createdAt: "2025-08-28T00:00:00+08:00",
1352
+ updatedAt: "2025-08-28T00:00:00+08:00"
1353
+ },
1354
+ {
1355
+ id: "2026-tahun-baharu-cina-2",
1356
+ date: "2026-02-18",
1357
+ name: { ms: "Tahun Baharu Cina (Hari Kedua)", en: "Chinese New Year (2nd Day)", zh: "\u519C\u5386\u65B0\u5E74\uFF08\u7B2C\u4E8C\u5929\uFF09" },
1358
+ type: "federal",
1359
+ status: "confirmed",
1360
+ states: ["*"],
1361
+ isPublicHoliday: true,
1362
+ gazetteLevel: "P",
1363
+ source: "jpm",
1364
+ gazetteRef: "GN-33499",
1365
+ createdAt: "2025-08-28T00:00:00+08:00",
1366
+ updatedAt: "2025-08-28T00:00:00+08:00"
1367
+ },
1368
+ {
1369
+ id: "2026-awal-ramadan",
1370
+ date: "2026-02-19",
1371
+ name: { ms: "Awal Ramadan", en: "Beginning of Ramadan", zh: "\u658B\u6212\u6708\u9996\u65E5" },
1372
+ type: "islamic_state",
1373
+ status: "tentative",
1374
+ states: ["johor", "kedah", "kelantan", "terengganu", "melaka", "perlis"],
1375
+ isPublicHoliday: true,
1376
+ gazetteLevel: "N",
1377
+ hijriDate: "1 Ramadan 1447",
1378
+ source: "jpm",
1379
+ gazetteRef: "GN-33500",
1380
+ createdAt: "2025-08-28T00:00:00+08:00",
1381
+ updatedAt: "2025-08-28T00:00:00+08:00"
1382
+ },
1383
+ {
1384
+ id: "2026-pengisytiharan-kemerdekaan",
1385
+ date: "2026-02-20",
1386
+ name: { ms: "Hari Pengisytiharan Tarikh Kemerdekaan", en: "Declaration of Independence Day" },
1387
+ type: "state",
1388
+ status: "confirmed",
1389
+ states: ["melaka"],
1390
+ isPublicHoliday: true,
1391
+ gazetteLevel: "N",
1392
+ source: "jpm",
1393
+ gazetteRef: "GN-33500",
1394
+ createdAt: "2025-08-28T00:00:00+08:00",
1395
+ updatedAt: "2025-08-28T00:00:00+08:00"
1396
+ },
1397
+ {
1398
+ id: "2026-pertabalan-sultan-terengganu",
1399
+ date: "2026-03-04",
1400
+ name: { ms: "Hari Ulang Tahun Pertabalan Sultan Terengganu", en: "Anniversary of Sultan of Terengganu's Installation" },
1401
+ type: "state",
1402
+ status: "confirmed",
1403
+ states: ["terengganu"],
1404
+ isPublicHoliday: true,
1405
+ gazetteLevel: "N",
1406
+ source: "jpm",
1407
+ gazetteRef: "GN-33500",
1408
+ createdAt: "2025-08-28T00:00:00+08:00",
1409
+ updatedAt: "2025-08-28T00:00:00+08:00"
1410
+ },
1411
+ {
1412
+ id: "2026-nuzul-quran",
1413
+ date: "2026-03-07",
1414
+ name: { ms: "Hari Nuzul Al-Quran", en: "Revelation of the Quran", zh: "\u53EF\u5170\u7ECF\u964D\u4E16" },
1415
+ type: "islamic",
1416
+ status: "tentative",
1417
+ states: ["*"],
1418
+ isPublicHoliday: true,
1419
+ gazetteLevel: "P",
1420
+ hijriDate: "17 Ramadan 1447",
1421
+ source: "jpm",
1422
+ gazetteRef: "GN-33499",
1423
+ createdAt: "2025-08-28T00:00:00+08:00",
1424
+ updatedAt: "2025-08-28T00:00:00+08:00"
1425
+ },
1426
+ {
1427
+ id: "2026-hari-raya-aidilfitri-1",
1428
+ date: "2026-03-21",
1429
+ name: { ms: "Hari Raya Aidilfitri", en: "Eid al-Fitr", zh: "\u5F00\u658B\u8282" },
1430
+ type: "islamic",
1431
+ status: "tentative",
1432
+ states: ["*"],
1433
+ isPublicHoliday: true,
1434
+ gazetteLevel: "P",
1435
+ hijriDate: "1 Syawal 1447",
1436
+ source: "jpm",
1437
+ gazetteRef: "GN-33499",
1438
+ createdAt: "2025-08-28T00:00:00+08:00",
1439
+ updatedAt: "2025-08-28T00:00:00+08:00"
1440
+ },
1441
+ {
1442
+ id: "2026-hari-raya-aidilfitri-2",
1443
+ date: "2026-03-22",
1444
+ name: { ms: "Hari Raya Aidilfitri (Hari Kedua)", en: "Eid al-Fitr (2nd Day)", zh: "\u5F00\u658B\u8282\uFF08\u7B2C\u4E8C\u5929\uFF09" },
1445
+ type: "islamic",
1446
+ status: "tentative",
1447
+ states: ["*"],
1448
+ isPublicHoliday: true,
1449
+ gazetteLevel: "P",
1450
+ hijriDate: "2 Syawal 1447",
1451
+ source: "jpm",
1452
+ gazetteRef: "GN-33499",
1453
+ createdAt: "2025-08-28T00:00:00+08:00",
1454
+ updatedAt: "2025-08-28T00:00:00+08:00"
1455
+ },
1456
+ {
1457
+ id: "2026-keputeraan-sultan-johor",
1458
+ date: "2026-03-23",
1459
+ name: { ms: "Hari Keputeraan Sultan Johor", en: "Birthday of Sultan of Johor" },
1460
+ type: "state",
1461
+ status: "confirmed",
1462
+ states: ["johor"],
1463
+ isPublicHoliday: true,
1464
+ gazetteLevel: "N",
1465
+ source: "jpm",
1466
+ gazetteRef: "GN-33500",
1467
+ createdAt: "2025-08-28T00:00:00+08:00",
1468
+ updatedAt: "2025-08-28T00:00:00+08:00"
1469
+ },
1470
+ {
1471
+ id: "2026-hari-raya-aidilfitri-3",
1472
+ date: "2026-03-23",
1473
+ name: { ms: "Hari Raya Puasa (Hari Ketiga)", en: "Eid al-Fitr (3rd Day)" },
1474
+ type: "islamic_state",
1475
+ status: "tentative",
1476
+ states: ["kelantan", "terengganu", "kedah", "johor", "perlis"],
1477
+ isPublicHoliday: true,
1478
+ gazetteLevel: "N",
1479
+ hijriDate: "3 Syawal 1447",
1480
+ source: "jpm",
1481
+ gazetteRef: "GN-33500",
1482
+ createdAt: "2025-08-28T00:00:00+08:00",
1483
+ updatedAt: "2025-08-28T00:00:00+08:00"
1484
+ },
1485
+ {
1486
+ id: "2026-hari-jadi-tyt-sabah",
1487
+ date: "2026-03-30",
1488
+ name: { ms: "Hari Jadi Yang di-Pertua Negeri Sabah", en: "Birthday of Governor of Sabah" },
1489
+ type: "state",
1490
+ status: "confirmed",
1491
+ states: ["sabah"],
1492
+ isPublicHoliday: true,
1493
+ gazetteLevel: "N",
1494
+ source: "jpm",
1495
+ gazetteRef: "GN-33500",
1496
+ createdAt: "2025-08-28T00:00:00+08:00",
1497
+ updatedAt: "2025-08-28T00:00:00+08:00"
1498
+ },
1499
+ {
1500
+ id: "2026-good-friday",
1501
+ date: "2026-04-03",
1502
+ name: { ms: "Good Friday", en: "Good Friday", zh: "\u8036\u7A23\u53D7\u96BE\u65E5" },
1503
+ type: "state",
1504
+ status: "confirmed",
1505
+ states: ["sabah", "sarawak"],
1506
+ isPublicHoliday: true,
1507
+ gazetteLevel: "N",
1508
+ source: "jpm",
1509
+ gazetteRef: "GN-33500",
1510
+ createdAt: "2025-08-28T00:00:00+08:00",
1511
+ updatedAt: "2025-08-28T00:00:00+08:00"
1512
+ },
1513
+ {
1514
+ id: "2026-keputeraan-sultan-terengganu",
1515
+ date: "2026-04-26",
1516
+ name: { ms: "Hari Keputeraan Sultan Terengganu", en: "Birthday of Sultan of Terengganu" },
1517
+ type: "state",
1518
+ status: "confirmed",
1519
+ states: ["terengganu"],
1520
+ isPublicHoliday: true,
1521
+ gazetteLevel: "N",
1522
+ source: "jpm",
1523
+ gazetteRef: "GN-33500",
1524
+ createdAt: "2025-08-28T00:00:00+08:00",
1525
+ updatedAt: "2025-08-28T00:00:00+08:00"
1526
+ },
1527
+ {
1528
+ id: "2026-hari-pekerja",
1529
+ date: "2026-05-01",
1530
+ name: { ms: "Hari Pekerja", en: "Labour Day", zh: "\u52B3\u52A8\u8282" },
1531
+ type: "federal",
1532
+ status: "confirmed",
1533
+ states: ["*"],
1534
+ isPublicHoliday: true,
1535
+ gazetteLevel: "P",
1536
+ source: "jpm",
1537
+ gazetteRef: "GN-33499",
1538
+ createdAt: "2025-08-28T00:00:00+08:00",
1539
+ updatedAt: "2025-08-28T00:00:00+08:00"
1540
+ },
1541
+ {
1542
+ id: "2026-keputeraan-raja-perlis",
1543
+ date: "2026-05-17",
1544
+ name: { ms: "Hari Ulang Tahun Keputeraan Raja Perlis", en: "Birthday of Raja of Perlis" },
1545
+ type: "state",
1546
+ status: "confirmed",
1547
+ states: ["perlis"],
1548
+ isPublicHoliday: true,
1549
+ gazetteLevel: "N",
1550
+ source: "jpm",
1551
+ gazetteRef: "GN-33500",
1552
+ createdAt: "2025-08-28T00:00:00+08:00",
1553
+ updatedAt: "2025-08-28T00:00:00+08:00"
1554
+ },
1555
+ {
1556
+ id: "2026-hari-hol-pahang",
1557
+ date: "2026-05-22",
1558
+ name: { ms: "Hari Hol Almarhum Sultan Ahmad Shah Al-Musta'in Billah ibni Almarhum Sultan Abu Bakar", en: "Pahang Hol Day" },
1559
+ type: "state",
1560
+ status: "confirmed",
1561
+ states: ["pahang"],
1562
+ isPublicHoliday: true,
1563
+ gazetteLevel: "N",
1564
+ source: "jpm",
1565
+ gazetteRef: "GN-33500",
1566
+ createdAt: "2025-08-28T00:00:00+08:00",
1567
+ updatedAt: "2025-08-28T00:00:00+08:00"
1568
+ },
1569
+ {
1570
+ id: "2026-hari-arafah",
1571
+ date: "2026-05-26",
1572
+ name: { ms: "Hari Arafah", en: "Day of Arafah" },
1573
+ type: "islamic_state",
1574
+ status: "tentative",
1575
+ states: ["kelantan", "terengganu", "kedah", "perlis"],
1576
+ isPublicHoliday: true,
1577
+ gazetteLevel: "N",
1578
+ hijriDate: "9 Zulhijjah 1447",
1579
+ source: "jpm",
1580
+ gazetteRef: "GN-33500",
1581
+ createdAt: "2025-08-28T00:00:00+08:00",
1582
+ updatedAt: "2025-08-28T00:00:00+08:00"
1583
+ },
1584
+ {
1585
+ id: "2026-hari-raya-haji-1",
1586
+ date: "2026-05-27",
1587
+ name: { ms: "Hari Raya Qurban", en: "Eid al-Adha", zh: "\u54C8\u829D\u8282" },
1588
+ type: "islamic",
1589
+ status: "tentative",
1590
+ states: ["*"],
1591
+ isPublicHoliday: true,
1592
+ gazetteLevel: "P",
1593
+ hijriDate: "10 Zulhijjah 1447",
1594
+ source: "jpm",
1595
+ gazetteRef: "GN-33499",
1596
+ createdAt: "2025-08-28T00:00:00+08:00",
1597
+ updatedAt: "2025-08-28T00:00:00+08:00"
1598
+ },
1599
+ {
1600
+ id: "2026-hari-raya-haji-2",
1601
+ date: "2026-05-28",
1602
+ name: { ms: "Hari Raya Qurban (Hari Kedua)", en: "Eid al-Adha (2nd Day)", zh: "\u54C8\u829D\u8282\uFF08\u7B2C\u4E8C\u5929\uFF09" },
1603
+ type: "islamic",
1604
+ status: "tentative",
1605
+ states: ["*"],
1606
+ isPublicHoliday: true,
1607
+ gazetteLevel: "P",
1608
+ hijriDate: "11 Zulhijjah 1447",
1609
+ source: "jpm",
1610
+ gazetteRef: "GN-33499",
1611
+ createdAt: "2025-08-28T00:00:00+08:00",
1612
+ updatedAt: "2025-08-28T00:00:00+08:00"
1613
+ },
1614
+ {
1615
+ id: "2026-pesta-kaamatan-1",
1616
+ date: "2026-05-30",
1617
+ name: { ms: "Pesta Kaamatan (Pesta Menuai)", en: "Harvest Festival (Kaamatan)" },
1618
+ type: "state",
1619
+ status: "confirmed",
1620
+ states: ["sabah", "wp-labuan"],
1621
+ isPublicHoliday: true,
1622
+ gazetteLevel: "N",
1623
+ source: "jpm",
1624
+ gazetteRef: "GN-33500",
1625
+ createdAt: "2025-08-28T00:00:00+08:00",
1626
+ updatedAt: "2025-08-28T00:00:00+08:00"
1627
+ },
1628
+ {
1629
+ id: "2026-pesta-kaamatan-2",
1630
+ date: "2026-05-31",
1631
+ name: { ms: "Pesta Kaamatan (Pesta Menuai) Hari Kedua", en: "Harvest Festival (Kaamatan) 2nd Day" },
1632
+ type: "state",
1633
+ status: "confirmed",
1634
+ states: ["sabah", "wp-labuan"],
1635
+ isPublicHoliday: true,
1636
+ gazetteLevel: "N",
1637
+ source: "jpm",
1638
+ gazetteRef: "GN-33500",
1639
+ createdAt: "2025-08-28T00:00:00+08:00",
1640
+ updatedAt: "2025-08-28T00:00:00+08:00"
1641
+ },
1642
+ {
1643
+ id: "2026-hari-wesak",
1644
+ date: "2026-05-31",
1645
+ name: { ms: "Hari Wesak", en: "Vesak Day", zh: "\u536B\u585E\u8282" },
1646
+ type: "federal",
1647
+ status: "confirmed",
1648
+ states: ["*"],
1649
+ isPublicHoliday: true,
1650
+ gazetteLevel: "P",
1651
+ source: "jpm",
1652
+ gazetteRef: "GN-33499",
1653
+ createdAt: "2025-08-28T00:00:00+08:00",
1654
+ updatedAt: "2025-08-28T00:00:00+08:00"
1655
+ },
1656
+ {
1657
+ id: "2026-keputeraan-agong",
1658
+ date: "2026-06-01",
1659
+ name: { ms: "Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong", en: "Official Birthday of the Yang di-Pertuan Agong", zh: "\u6700\u9AD8\u5143\u9996\u8BDE\u8FB0" },
1660
+ type: "federal",
1661
+ status: "confirmed",
1662
+ states: ["*"],
1663
+ isPublicHoliday: true,
1664
+ gazetteLevel: "P",
1665
+ source: "jpm",
1666
+ gazetteRef: "GN-33499",
1667
+ createdAt: "2025-08-28T00:00:00+08:00",
1668
+ updatedAt: "2025-08-28T00:00:00+08:00"
1669
+ },
1670
+ {
1671
+ id: "2026-gawai-dayak-1",
1672
+ date: "2026-06-01",
1673
+ name: { ms: "Perayaan Hari Gawai Dayak", en: "Gawai Dayak Festival" },
1674
+ type: "state",
1675
+ status: "confirmed",
1676
+ states: ["sarawak"],
1677
+ isPublicHoliday: true,
1678
+ gazetteLevel: "N",
1679
+ source: "jpm",
1680
+ gazetteRef: "GN-33500",
1681
+ createdAt: "2025-08-28T00:00:00+08:00",
1682
+ updatedAt: "2025-08-28T00:00:00+08:00"
1683
+ },
1684
+ {
1685
+ id: "2026-gawai-dayak-2",
1686
+ date: "2026-06-02",
1687
+ name: { ms: "Perayaan Hari Gawai Dayak (Hari Kedua)", en: "Gawai Dayak Festival (2nd Day)" },
1688
+ type: "state",
1689
+ status: "confirmed",
1690
+ states: ["sarawak"],
1691
+ isPublicHoliday: true,
1692
+ gazetteLevel: "N",
1693
+ source: "jpm",
1694
+ gazetteRef: "GN-33500",
1695
+ createdAt: "2025-08-28T00:00:00+08:00",
1696
+ updatedAt: "2025-08-28T00:00:00+08:00"
1697
+ },
1698
+ {
1699
+ id: "2026-awal-muharam",
1700
+ date: "2026-06-17",
1701
+ name: { ms: "Awal Muharam (Maal Hijrah)", en: "Islamic New Year", zh: "\u56DE\u5386\u65B0\u5E74" },
1702
+ type: "islamic",
1703
+ status: "tentative",
1704
+ states: ["*"],
1705
+ isPublicHoliday: true,
1706
+ gazetteLevel: "P",
1707
+ hijriDate: "1 Muharam 1448",
1708
+ source: "jpm",
1709
+ gazetteRef: "GN-33499",
1710
+ createdAt: "2025-08-28T00:00:00+08:00",
1711
+ updatedAt: "2025-08-28T00:00:00+08:00"
1712
+ },
1713
+ {
1714
+ id: "2026-keputeraan-sultan-kedah",
1715
+ date: "2026-06-21",
1716
+ name: { ms: "Hari Keputeraan Sultan Kedah", en: "Birthday of Sultan of Kedah" },
1717
+ type: "state",
1718
+ status: "confirmed",
1719
+ states: ["kedah"],
1720
+ isPublicHoliday: true,
1721
+ gazetteLevel: "N",
1722
+ source: "jpm",
1723
+ gazetteRef: "GN-33500",
1724
+ createdAt: "2025-08-28T00:00:00+08:00",
1725
+ updatedAt: "2025-08-28T00:00:00+08:00"
1726
+ },
1727
+ {
1728
+ id: "2026-tapak-warisan-dunia",
1729
+ date: "2026-07-07",
1730
+ name: { ms: "Hari Ulang Tahun Perisytiharan Tapak Warisan Dunia", en: "World Heritage Site Declaration Anniversary" },
1731
+ type: "state",
1732
+ status: "confirmed",
1733
+ states: ["melaka"],
1734
+ isPublicHoliday: true,
1735
+ gazetteLevel: "N",
1736
+ source: "jpm",
1737
+ gazetteRef: "GN-33500",
1738
+ createdAt: "2025-08-28T00:00:00+08:00",
1739
+ updatedAt: "2025-08-28T00:00:00+08:00"
1740
+ },
1741
+ {
1742
+ id: "2026-hari-jadi-tyt-penang",
1743
+ date: "2026-07-11",
1744
+ name: { ms: "Hari Jadi Yang di-Pertua Negeri Pulau Pinang", en: "Birthday of Governor of Penang" },
1745
+ type: "state",
1746
+ status: "confirmed",
1747
+ states: ["pulau-pinang"],
1748
+ isPublicHoliday: true,
1749
+ gazetteLevel: "N",
1750
+ source: "jpm",
1751
+ gazetteRef: "GN-33500",
1752
+ createdAt: "2025-08-28T00:00:00+08:00",
1753
+ updatedAt: "2025-08-28T00:00:00+08:00"
1754
+ },
1755
+ {
1756
+ id: "2026-hari-hol-johor",
1757
+ date: "2026-07-21",
1758
+ name: { ms: "Hari Hol Almarhum Sultan Iskandar", en: "Johor Hol Day" },
1759
+ type: "state",
1760
+ status: "confirmed",
1761
+ states: ["johor"],
1762
+ isPublicHoliday: true,
1763
+ gazetteLevel: "N",
1764
+ source: "jpm",
1765
+ gazetteRef: "GN-33500",
1766
+ createdAt: "2025-08-28T00:00:00+08:00",
1767
+ updatedAt: "2025-08-28T00:00:00+08:00"
1768
+ },
1769
+ {
1770
+ id: "2026-hari-kemerdekaan-sarawak",
1771
+ date: "2026-07-22",
1772
+ name: { ms: "Hari Kemerdekaan Sarawak", en: "Sarawak Independence Day" },
1773
+ type: "state",
1774
+ status: "confirmed",
1775
+ states: ["sarawak"],
1776
+ isPublicHoliday: true,
1777
+ gazetteLevel: "N",
1778
+ source: "jpm",
1779
+ gazetteRef: "GN-33500",
1780
+ createdAt: "2025-08-28T00:00:00+08:00",
1781
+ updatedAt: "2025-08-28T00:00:00+08:00"
1782
+ },
1783
+ {
1784
+ id: "2026-keputeraan-sultan-pahang",
1785
+ date: "2026-07-31",
1786
+ name: { ms: "Hari Keputeraan Sultan Pahang", en: "Birthday of Sultan of Pahang" },
1787
+ type: "state",
1788
+ status: "confirmed",
1789
+ states: ["pahang"],
1790
+ isPublicHoliday: true,
1791
+ gazetteLevel: "N",
1792
+ source: "jpm",
1793
+ gazetteRef: "GN-33500",
1794
+ createdAt: "2025-08-28T00:00:00+08:00",
1795
+ updatedAt: "2025-08-28T00:00:00+08:00"
1796
+ },
1797
+ {
1798
+ id: "2026-hari-jadi-tyt-melaka",
1799
+ date: "2026-08-24",
1800
+ name: { ms: "Hari Jadi Yang di-Pertua Negeri Melaka", en: "Birthday of Governor of Malacca" },
1801
+ type: "state",
1802
+ status: "confirmed",
1803
+ states: ["melaka"],
1804
+ isPublicHoliday: true,
1805
+ gazetteLevel: "N",
1806
+ source: "jpm",
1807
+ gazetteRef: "GN-33500",
1808
+ createdAt: "2025-08-28T00:00:00+08:00",
1809
+ updatedAt: "2025-08-28T00:00:00+08:00"
1810
+ },
1811
+ {
1812
+ id: "2026-maulidur-rasul",
1813
+ date: "2026-08-25",
1814
+ name: { ms: "Hari Keputeraan Nabi Muhammad S.A.W. (Maulidur Rasul)", en: "Prophet Muhammad's Birthday", zh: "\u5148\u77E5\u7A46\u7F55\u9ED8\u5FB7\u8BDE\u8FB0" },
1815
+ type: "islamic",
1816
+ status: "tentative",
1817
+ states: ["*"],
1818
+ isPublicHoliday: true,
1819
+ gazetteLevel: "P",
1820
+ hijriDate: "12 Rabiulawal 1448",
1821
+ source: "jpm",
1822
+ gazetteRef: "GN-33499",
1823
+ createdAt: "2025-08-28T00:00:00+08:00",
1824
+ updatedAt: "2025-08-28T00:00:00+08:00"
1825
+ },
1826
+ {
1827
+ id: "2026-hari-kebangsaan",
1828
+ date: "2026-08-31",
1829
+ name: { ms: "Hari Kebangsaan", en: "National Day", zh: "\u56FD\u5E86\u65E5" },
1830
+ type: "federal",
1831
+ status: "confirmed",
1832
+ states: ["*"],
1833
+ isPublicHoliday: true,
1834
+ gazetteLevel: "P",
1835
+ source: "jpm",
1836
+ gazetteRef: "GN-33499",
1837
+ createdAt: "2025-08-28T00:00:00+08:00",
1838
+ updatedAt: "2025-08-28T00:00:00+08:00"
1839
+ },
1840
+ {
1841
+ id: "2026-hari-malaysia",
1842
+ date: "2026-09-16",
1843
+ name: { ms: "Hari Malaysia", en: "Malaysia Day", zh: "\u9A6C\u6765\u897F\u4E9A\u65E5" },
1844
+ type: "federal",
1845
+ status: "confirmed",
1846
+ states: ["*"],
1847
+ isPublicHoliday: true,
1848
+ gazetteLevel: "P",
1849
+ source: "jpm",
1850
+ gazetteRef: "GN-33499",
1851
+ createdAt: "2025-08-28T00:00:00+08:00",
1852
+ updatedAt: "2025-08-28T00:00:00+08:00"
1853
+ },
1854
+ {
1855
+ id: "2026-keputeraan-sultan-kelantan-1",
1856
+ date: "2026-09-29",
1857
+ name: { ms: "Hari Keputeraan Sultan Kelantan", en: "Birthday of Sultan of Kelantan (Day 1)" },
1858
+ type: "state",
1859
+ status: "confirmed",
1860
+ states: ["kelantan"],
1861
+ isPublicHoliday: true,
1862
+ gazetteLevel: "N",
1863
+ source: "jpm",
1864
+ gazetteRef: "GN-33500",
1865
+ createdAt: "2025-08-28T00:00:00+08:00",
1866
+ updatedAt: "2025-08-28T00:00:00+08:00"
1867
+ },
1868
+ {
1869
+ id: "2026-keputeraan-sultan-kelantan-2",
1870
+ date: "2026-09-30",
1871
+ name: { ms: "Hari Keputeraan Sultan Kelantan (Hari Kedua)", en: "Birthday of Sultan of Kelantan (Day 2)" },
1872
+ type: "state",
1873
+ status: "confirmed",
1874
+ states: ["kelantan"],
1875
+ isPublicHoliday: true,
1876
+ gazetteLevel: "N",
1877
+ source: "jpm",
1878
+ gazetteRef: "GN-33500",
1879
+ createdAt: "2025-08-28T00:00:00+08:00",
1880
+ updatedAt: "2025-08-28T00:00:00+08:00"
1881
+ },
1882
+ {
1883
+ id: "2026-hari-jadi-tyt-sarawak",
1884
+ date: "2026-10-10",
1885
+ name: { ms: "Hari Jadi Yang di-Pertua Negeri Sarawak", en: "Birthday of Governor of Sarawak" },
1886
+ type: "state",
1887
+ status: "confirmed",
1888
+ states: ["sarawak"],
1889
+ isPublicHoliday: true,
1890
+ gazetteLevel: "N",
1891
+ source: "jpm",
1892
+ gazetteRef: "GN-33500",
1893
+ createdAt: "2025-08-28T00:00:00+08:00",
1894
+ updatedAt: "2025-08-28T00:00:00+08:00"
1895
+ },
1896
+ {
1897
+ id: "2026-keputeraan-sultan-perak",
1898
+ date: "2026-11-06",
1899
+ name: { ms: "Hari Keputeraan Sultan Perak", en: "Birthday of Sultan of Perak" },
1900
+ type: "state",
1901
+ status: "confirmed",
1902
+ states: ["perak"],
1903
+ isPublicHoliday: true,
1904
+ gazetteLevel: "N",
1905
+ source: "jpm",
1906
+ gazetteRef: "GN-33500",
1907
+ createdAt: "2025-08-28T00:00:00+08:00",
1908
+ updatedAt: "2025-08-28T00:00:00+08:00"
1909
+ },
1910
+ {
1911
+ id: "2026-deepavali",
1912
+ date: "2026-11-08",
1913
+ name: { ms: "Hari Deepavali", en: "Deepavali", zh: "\u5C60\u5996\u8282" },
1914
+ type: "federal",
1915
+ status: "confirmed",
1916
+ states: ["*"],
1917
+ isPublicHoliday: true,
1918
+ gazetteLevel: "P",
1919
+ source: "jpm",
1920
+ gazetteRef: "GN-33499",
1921
+ createdAt: "2025-08-28T00:00:00+08:00",
1922
+ updatedAt: "2025-08-28T00:00:00+08:00"
1923
+ },
1924
+ {
1925
+ id: "2026-keputeraan-sultan-selangor",
1926
+ date: "2026-12-11",
1927
+ name: { ms: "Hari Keputeraan Sultan Selangor", en: "Birthday of Sultan of Selangor" },
1928
+ type: "state",
1929
+ status: "confirmed",
1930
+ states: ["selangor"],
1931
+ isPublicHoliday: true,
1932
+ gazetteLevel: "N",
1933
+ source: "jpm",
1934
+ gazetteRef: "GN-33500",
1935
+ createdAt: "2025-08-28T00:00:00+08:00",
1936
+ updatedAt: "2025-08-28T00:00:00+08:00"
1937
+ },
1938
+ {
1939
+ id: "2026-christmas-eve",
1940
+ date: "2026-12-24",
1941
+ name: { ms: "Christmas Eve", en: "Christmas Eve", zh: "\u5723\u8BDE\u591C" },
1942
+ type: "state",
1943
+ status: "confirmed",
1944
+ states: ["sabah"],
1945
+ isPublicHoliday: true,
1946
+ gazetteLevel: "N",
1947
+ source: "jpm",
1948
+ gazetteRef: "GN-33500",
1949
+ createdAt: "2025-08-28T00:00:00+08:00",
1950
+ updatedAt: "2025-08-28T00:00:00+08:00"
1951
+ },
1952
+ {
1953
+ id: "2026-hari-krismas",
1954
+ date: "2026-12-25",
1955
+ name: { ms: "Hari Krismas", en: "Christmas Day", zh: "\u5723\u8BDE\u8282" },
1956
+ type: "federal",
1957
+ status: "confirmed",
1958
+ states: ["*"],
1959
+ isPublicHoliday: true,
1960
+ gazetteLevel: "P",
1961
+ source: "jpm",
1962
+ gazetteRef: "GN-33499",
1963
+ createdAt: "2025-08-28T00:00:00+08:00",
1964
+ updatedAt: "2025-08-28T00:00:00+08:00"
1965
+ }
1966
+ ];
1967
+
1968
+ // ../../data/school/terms-2026.json
1969
+ var terms_2026_default = [
1970
+ {
1971
+ id: "2026-penggal-1-kumpulan-a",
1972
+ year: 2026,
1973
+ term: 1,
1974
+ group: "A",
1975
+ segments: [
1976
+ { startDate: "2026-01-11", endDate: "2026-01-31", schoolDays: 15 },
1977
+ { startDate: "2026-02-01", endDate: "2026-02-28", schoolDays: 15 },
1978
+ { startDate: "2026-03-01", endDate: "2026-03-19", schoolDays: 14 }
1979
+ ],
1980
+ totalSchoolDays: 44,
1981
+ startDate: "2026-01-11",
1982
+ endDate: "2026-03-19"
1983
+ },
1984
+ {
1985
+ id: "2026-penggal-1-kumpulan-b",
1986
+ year: 2026,
1987
+ term: 1,
1988
+ group: "B",
1989
+ segments: [
1990
+ { startDate: "2026-01-12", endDate: "2026-01-31", schoolDays: 15 },
1991
+ { startDate: "2026-02-01", endDate: "2026-02-28", schoolDays: 15 },
1992
+ { startDate: "2026-03-01", endDate: "2026-03-20", schoolDays: 13 }
1993
+ ],
1994
+ totalSchoolDays: 43,
1995
+ startDate: "2026-01-12",
1996
+ endDate: "2026-03-20"
1997
+ },
1998
+ {
1999
+ id: "2026-penggal-2-kumpulan-a",
2000
+ year: 2026,
2001
+ term: 2,
2002
+ group: "A",
2003
+ segments: [
2004
+ { startDate: "2026-03-29", endDate: "2026-03-31", schoolDays: 3 },
2005
+ { startDate: "2026-04-01", endDate: "2026-04-30", schoolDays: 22 },
2006
+ { startDate: "2026-05-01", endDate: "2026-05-21", schoolDays: 15 }
2007
+ ],
2008
+ totalSchoolDays: 40,
2009
+ startDate: "2026-03-29",
2010
+ endDate: "2026-05-21"
2011
+ },
2012
+ {
2013
+ id: "2026-penggal-2-kumpulan-b",
2014
+ year: 2026,
2015
+ term: 2,
2016
+ group: "B",
2017
+ segments: [
2018
+ { startDate: "2026-03-30", endDate: "2026-03-31", schoolDays: 2 },
2019
+ { startDate: "2026-04-01", endDate: "2026-04-30", schoolDays: 22 },
2020
+ { startDate: "2026-05-01", endDate: "2026-05-22", schoolDays: 15 }
2021
+ ],
2022
+ totalSchoolDays: 39,
2023
+ startDate: "2026-03-30",
2024
+ endDate: "2026-05-22"
2025
+ }
2026
+ ];
2027
+
2028
+ // ../../data/school/holidays-2026.json
2029
+ var holidays_2026_default = [
2030
+ {
2031
+ id: "2026-cuti-penggal-1-kumpulan-a",
2032
+ year: 2026,
2033
+ group: "A",
2034
+ type: "cuti_penggal_1",
2035
+ name: { ms: "Cuti Penggal 1", en: "Term 1 Break" },
2036
+ startDate: "2026-03-20",
2037
+ endDate: "2026-03-28",
2038
+ days: 9
2039
+ },
2040
+ {
2041
+ id: "2026-cuti-penggal-1-kumpulan-b",
2042
+ year: 2026,
2043
+ group: "B",
2044
+ type: "cuti_penggal_1",
2045
+ name: { ms: "Cuti Penggal 1", en: "Term 1 Break" },
2046
+ startDate: "2026-03-21",
2047
+ endDate: "2026-03-29",
2048
+ days: 9
2049
+ },
2050
+ {
2051
+ id: "2026-cuti-pertengahan-kumpulan-a",
2052
+ year: 2026,
2053
+ group: "A",
2054
+ type: "cuti_pertengahan",
2055
+ name: { ms: "Cuti Pertengahan Tahun", en: "Mid-Year Holiday" },
2056
+ startDate: "2026-05-22",
2057
+ endDate: "2026-06-06",
2058
+ days: 16
2059
+ },
2060
+ {
2061
+ id: "2026-cuti-pertengahan-kumpulan-b",
2062
+ year: 2026,
2063
+ group: "B",
2064
+ type: "cuti_pertengahan",
2065
+ name: { ms: "Cuti Pertengahan Tahun", en: "Mid-Year Holiday" },
2066
+ startDate: "2026-05-23",
2067
+ endDate: "2026-06-07",
2068
+ days: 16
2069
+ },
2070
+ {
2071
+ id: "2026-cuti-penggal-2-kumpulan-a",
2072
+ year: 2026,
2073
+ group: "A",
2074
+ type: "cuti_penggal_2",
2075
+ name: { ms: "Cuti Penggal 2", en: "Term 2 Break" },
2076
+ startDate: "2026-08-28",
2077
+ endDate: "2026-09-05",
2078
+ days: 9
2079
+ },
2080
+ {
2081
+ id: "2026-cuti-penggal-2-kumpulan-b",
2082
+ year: 2026,
2083
+ group: "B",
2084
+ type: "cuti_penggal_2",
2085
+ name: { ms: "Cuti Penggal 2", en: "Term 2 Break" },
2086
+ startDate: "2026-08-29",
2087
+ endDate: "2026-09-06",
2088
+ days: 9
2089
+ },
2090
+ {
2091
+ id: "2026-cuti-akhir-kumpulan-a",
2092
+ year: 2026,
2093
+ group: "A",
2094
+ type: "cuti_akhir",
2095
+ name: { ms: "Cuti Akhir Persekolahan", en: "Year-End Holiday" },
2096
+ startDate: "2026-12-04",
2097
+ endDate: "2026-12-31",
2098
+ days: 28
2099
+ },
2100
+ {
2101
+ id: "2026-cuti-akhir-kumpulan-b",
2102
+ year: 2026,
2103
+ group: "B",
2104
+ type: "cuti_akhir",
2105
+ name: { ms: "Cuti Akhir Persekolahan", en: "Year-End Holiday" },
2106
+ startDate: "2026-12-05",
2107
+ endDate: "2026-12-31",
2108
+ days: 27
2109
+ },
2110
+ {
2111
+ id: "2026-cuti-cny-kumpulan-a",
2112
+ year: 2026,
2113
+ group: "A",
2114
+ type: "cuti_perayaan_kpm",
2115
+ name: { ms: "Cuti Perayaan Tahun Baharu Cina (KPM)", en: "Chinese New Year KPM Bonus Holiday" },
2116
+ startDate: "2026-02-15",
2117
+ endDate: "2026-02-19",
2118
+ days: 3,
2119
+ remarks: "Tambahan KPM: 15, 16, 19 Feb"
2120
+ },
2121
+ {
2122
+ id: "2026-cuti-cny-kumpulan-b",
2123
+ year: 2026,
2124
+ group: "B",
2125
+ type: "cuti_perayaan_kpm",
2126
+ name: { ms: "Cuti Perayaan Tahun Baharu Cina (KPM)", en: "Chinese New Year KPM Bonus Holiday" },
2127
+ startDate: "2026-02-16",
2128
+ endDate: "2026-02-20",
2129
+ days: 3,
2130
+ remarks: "Tambahan KPM: 16, 19, 20 Feb"
2131
+ },
2132
+ {
2133
+ id: "2026-cuti-raya-kumpulan-a",
2134
+ year: 2026,
2135
+ group: "A",
2136
+ type: "cuti_perayaan_kpm",
2137
+ name: { ms: "Cuti Perayaan Hari Raya Aidilfitri (KPM)", en: "Hari Raya KPM Bonus Holiday" },
2138
+ startDate: "2026-03-19",
2139
+ endDate: "2026-03-19",
2140
+ days: 1,
2141
+ remarks: "Tambahan KPM: 19 Mac"
2142
+ },
2143
+ {
2144
+ id: "2026-cuti-raya-kumpulan-b",
2145
+ year: 2026,
2146
+ group: "B",
2147
+ type: "cuti_perayaan_kpm",
2148
+ name: { ms: "Cuti Perayaan Hari Raya Aidilfitri (KPM)", en: "Hari Raya KPM Bonus Holiday" },
2149
+ startDate: "2026-03-19",
2150
+ endDate: "2026-03-20",
2151
+ days: 2,
2152
+ remarks: "Tambahan KPM: 19, 20 Mac"
2153
+ },
2154
+ {
2155
+ id: "2026-cuti-deepavali-kumpulan-a",
2156
+ year: 2026,
2157
+ group: "A",
2158
+ type: "cuti_perayaan_kpm",
2159
+ name: { ms: "Cuti Perayaan Deepavali (KPM)", en: "Deepavali KPM Bonus Holiday" },
2160
+ startDate: "2026-11-09",
2161
+ endDate: "2026-11-09",
2162
+ days: 1,
2163
+ remarks: "Tambahan KPM: 9 Nov"
2164
+ },
2165
+ {
2166
+ id: "2026-cuti-deepavali-kumpulan-b",
2167
+ year: 2026,
2168
+ group: "B",
2169
+ type: "cuti_perayaan_kpm",
2170
+ name: { ms: "Cuti Perayaan Deepavali (KPM)", en: "Deepavali KPM Bonus Holiday" },
2171
+ startDate: "2026-11-10",
2172
+ endDate: "2026-11-10",
2173
+ days: 1,
2174
+ excludeStates: ["sarawak"],
2175
+ remarks: "Tambahan KPM: 10 Nov (semua negeri Kumpulan B kecuali Sarawak)"
2176
+ },
2177
+ {
2178
+ id: "2026-cuti-deepavali-sarawak",
2179
+ year: 2026,
2180
+ group: "B",
2181
+ type: "cuti_perayaan_kpm",
2182
+ name: { ms: "Cuti Perayaan Deepavali (KPM) - Sarawak", en: "Deepavali KPM Bonus Holiday - Sarawak" },
2183
+ startDate: "2026-11-09",
2184
+ endDate: "2026-11-09",
2185
+ days: 1,
2186
+ states: ["sarawak"],
2187
+ remarks: "Sarawak sahaja: 9 Nov"
2188
+ }
2189
+ ];
2190
+
2191
+ // ../../data/school/exams-2026.json
2192
+ var exams_2026_default = [
2193
+ {
2194
+ id: "2026-stpm-sem1",
2195
+ year: 2026,
2196
+ name: "STPM Semester 1",
2197
+ fullName: { ms: "Sijil Tinggi Persekolahan Malaysia (Semester 1)", en: "Malaysian Higher School Certificate (Semester 1)" },
2198
+ type: "stpm",
2199
+ startDate: "2026-01-21",
2200
+ endDate: "2026-01-28",
2201
+ status: "confirmed",
2202
+ source: "mpm"
2203
+ },
2204
+ {
2205
+ id: "2026-spm-2025-results",
2206
+ year: 2026,
2207
+ name: "Keputusan SPM 2025",
2208
+ fullName: { ms: "Pengumuman Keputusan SPM 2025", en: "SPM 2025 Results Announcement" },
2209
+ type: "spm",
2210
+ startDate: "2026-03-31",
2211
+ status: "tentative",
2212
+ source: "kpm"
2213
+ },
2214
+ {
2215
+ id: "2026-stpm-sem2",
2216
+ year: 2026,
2217
+ name: "STPM Semester 2",
2218
+ fullName: { ms: "Sijil Tinggi Persekolahan Malaysia (Semester 2)", en: "Malaysian Higher School Certificate (Semester 2)" },
2219
+ type: "stpm",
2220
+ startDate: "2026-06-29",
2221
+ endDate: "2026-07-05",
2222
+ status: "confirmed",
2223
+ source: "mpm"
2224
+ },
2225
+ {
2226
+ id: "2026-spm",
2227
+ year: 2026,
2228
+ name: "SPM 2026",
2229
+ fullName: { ms: "Sijil Pelajaran Malaysia", en: "Malaysian Certificate of Education" },
2230
+ type: "spm",
2231
+ startDate: "2026-11-01",
2232
+ endDate: "2026-12-15",
2233
+ status: "tentative",
2234
+ source: "kpm"
2235
+ },
2236
+ {
2237
+ id: "2026-stpm-sem3",
2238
+ year: 2026,
2239
+ name: "STPM Semester 3",
2240
+ fullName: { ms: "Sijil Tinggi Persekolahan Malaysia (Semester 3)", en: "Malaysian Higher School Certificate (Semester 3)" },
2241
+ type: "stpm",
2242
+ startDate: "2026-11-01",
2243
+ endDate: "2026-11-30",
2244
+ status: "tentative",
2245
+ source: "mpm"
2246
+ }
2247
+ ];
2248
+
2249
+ // src/index.ts
10
2250
  import {
11
2251
  filterHolidays,
12
2252
  findHolidaysByDate,
@@ -16,34 +2256,47 @@ import {
16
2256
  getDayOfWeekName,
17
2257
  getWeekendDayNames,
18
2258
  countBusinessDays,
2259
+ findLongWeekends,
2260
+ optimizeLeave,
19
2261
  findSchoolTermByDate,
20
2262
  findSchoolHolidayByDate,
21
2263
  isSchoolDay as checkSchoolDay
22
2264
  } from "@catlabtech/mycal-core";
23
- var __dirname2 = dirname(fileURLToPath(import.meta.url));
24
- var DATA_DIR = resolve(__dirname2, "../../../data");
25
- var states = JSON.parse(readFileSync(resolve(DATA_DIR, "states.json"), "utf-8"));
26
- function loadYear(dir, year) {
27
- try {
28
- return JSON.parse(readFileSync(resolve(DATA_DIR, dir, `${year}.json`), "utf-8"));
29
- } catch {
30
- return [];
31
- }
2265
+ var states = states_default;
2266
+ var holidaysByYear = {
2267
+ 2024: __default,
2268
+ 2025: __default2,
2269
+ 2026: __default3
2270
+ };
2271
+ var schoolTermsByYear = {
2272
+ 2026: terms_2026_default
2273
+ };
2274
+ var schoolHolidaysByYear = {
2275
+ 2026: holidays_2026_default
2276
+ };
2277
+ var examsByYear = {
2278
+ 2026: exams_2026_default
2279
+ };
2280
+ var DEFAULT_STATE_CODE = "kuala-lumpur";
2281
+ function defaultState() {
2282
+ const s = states.find((x) => x.code === DEFAULT_STATE_CODE);
2283
+ if (!s) throw new Error(`Default state "${DEFAULT_STATE_CODE}" missing from states.json`);
2284
+ return s;
2285
+ }
2286
+ function loadYear(_dir, year) {
2287
+ return holidaysByYear[year] ?? [];
32
2288
  }
33
2289
  function loadSchool(file, year) {
34
- try {
35
- return JSON.parse(readFileSync(resolve(DATA_DIR, "school", `${file}-${year}.json`), "utf-8"));
36
- } catch {
37
- return [];
38
- }
2290
+ const map = file === "terms" ? schoolTermsByYear : file === "holidays" ? schoolHolidaysByYear : examsByYear;
2291
+ return map[year] ?? [];
39
2292
  }
40
2293
  var server = new McpServer({
41
2294
  name: "Malaysia Calendar API",
42
- version: "0.1.0"
2295
+ version: "0.1.1"
43
2296
  });
44
2297
  server.tool(
45
2298
  "get_malaysia_holidays",
46
- "Get Malaysia public holidays. Covers all 16 states + 3 FTs including Islamic holidays with tentative/confirmed status.",
2299
+ "Get Malaysia public holidays. Covers all 16 regions (13 states + 3 federal territories) including Islamic holidays with tentative/confirmed status.",
47
2300
  {
48
2301
  year: z.number().int().describe("Year (e.g. 2026)"),
49
2302
  state: z.string().optional().describe("State code or alias (e.g. 'selangor', 'KL', 'penang')"),
@@ -70,7 +2323,7 @@ server.tool(
70
2323
  state: z.string().optional().describe("State code or alias")
71
2324
  },
72
2325
  async ({ date, state: stateQuery }) => {
73
- const stateObj = stateQuery ? resolveStateCode(stateQuery, states) : states.find((s) => s.code === "kuala-lumpur");
2326
+ const stateObj = stateQuery ? resolveStateCode(stateQuery, states) : defaultState();
74
2327
  if (!stateObj) return { content: [{ type: "text", text: `Unknown state: ${stateQuery}` }] };
75
2328
  const year = parseInt(date.slice(0, 4));
76
2329
  const holidays = loadYear("holidays", year);
@@ -136,46 +2389,45 @@ server.tool(
136
2389
  state: z.string().optional().describe("State code or alias (default: kuala-lumpur)")
137
2390
  },
138
2391
  async ({ year, state }) => {
139
- const stateObj = state ? resolveStateCode(state, states) : states.find((s) => s.code === "kuala-lumpur");
140
- if (!stateObj) return { content: [{ type: "text", text: `Unknown state` }] };
2392
+ const stateObj = state ? resolveStateCode(state, states) : defaultState();
2393
+ if (!stateObj) return { content: [{ type: "text", text: `Unknown state: ${state}` }] };
141
2394
  const holidays = loadYear("holidays", year);
142
- const stateHolidays = filterHolidays(holidays, { state: stateObj.code, year });
143
- const holidayDates = new Set(stateHolidays.map((h) => h.date));
144
- const longWeekends = [];
145
- let current = `${year}-01-01`;
146
- const yearEnd = `${year}-12-31`;
147
- while (current <= yearEnd) {
148
- if (!isWeekend(current, stateObj) && !holidayDates.has(current)) {
149
- const d = /* @__PURE__ */ new Date(current + "T12:00:00Z");
150
- d.setUTCDate(d.getUTCDate() + 1);
151
- current = d.toISOString().slice(0, 10);
152
- continue;
153
- }
154
- const start = current;
155
- const hols = [];
156
- let count = 0;
157
- while (current <= yearEnd && (isWeekend(current, stateObj) || holidayDates.has(current))) {
158
- if (holidayDates.has(current)) {
159
- const h = stateHolidays.find((h2) => h2.date === current);
160
- if (h) hols.push(h.name.en);
161
- }
162
- count++;
163
- const d = /* @__PURE__ */ new Date(current + "T12:00:00Z");
164
- d.setUTCDate(d.getUTCDate() + 1);
165
- current = d.toISOString().slice(0, 10);
166
- }
167
- if (count >= 3) {
168
- const d = /* @__PURE__ */ new Date(current + "T12:00:00Z");
169
- d.setUTCDate(d.getUTCDate() - 1);
170
- longWeekends.push({ start, end: d.toISOString().slice(0, 10), days: count, holidays: hols });
171
- }
172
- }
2395
+ const longWeekends = findLongWeekends(year, stateObj, holidays).map((w) => ({
2396
+ start: w.startDate,
2397
+ end: w.endDate,
2398
+ days: w.totalDays,
2399
+ holidays: w.holidays.map((h) => h.name.en)
2400
+ }));
173
2401
  return { content: [{ type: "text", text: JSON.stringify({ total: longWeekends.length, longWeekends }, null, 2) }] };
174
2402
  }
175
2403
  );
2404
+ server.tool(
2405
+ "malaysia_leave_optimizer",
2406
+ "Find the most efficient annual-leave days to take to maximise consecutive days off in Malaysia (e.g. 'take 2 days \u2192 get 5 off'). Ideal for planning trips around public holidays and weekends, per state.",
2407
+ {
2408
+ year: z.number().int().describe("Year"),
2409
+ state: z.string().optional().describe("State code or alias (default: kuala-lumpur)"),
2410
+ maxLeave: z.number().int().min(1).max(10).optional().describe("Max annual-leave days to spend per break (default 3)")
2411
+ },
2412
+ async ({ year, state, maxLeave }) => {
2413
+ const stateObj = state ? resolveStateCode(state, states) : defaultState();
2414
+ if (!stateObj) return { content: [{ type: "text", text: `Unknown state: ${state}` }] };
2415
+ const holidays = loadYear("holidays", year);
2416
+ const suggestions = optimizeLeave(year, stateObj, holidays, maxLeave ?? 3).slice(0, 10).map((s) => ({
2417
+ takeLeaveOn: s.leaveDates,
2418
+ leaveDays: s.leaveCost,
2419
+ from: s.startDate,
2420
+ to: s.endDate,
2421
+ totalDaysOff: s.totalDays,
2422
+ efficiency: s.efficiency,
2423
+ holidays: s.holidays.map((h) => h.name.en)
2424
+ }));
2425
+ return { content: [{ type: "text", text: JSON.stringify({ total: suggestions.length, suggestions }, null, 2) }] };
2426
+ }
2427
+ );
176
2428
  server.tool(
177
2429
  "list_malaysia_states",
178
- "List all 16 Malaysian states + 3 Federal Territories with weekend configurations and group assignments.",
2430
+ "List all 16 Malaysian regions (13 states + 3 federal territories) with weekend configurations and group assignments.",
179
2431
  {},
180
2432
  async () => {
181
2433
  const summary = states.map((s) => ({