nepali-date-library 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,132 @@
1
+ export const NEPALI_DATE_MAP: {year:number, days: Array<number>, totalDays: number, daysTillNow:number}[] = [
2
+ { year: 2000, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
3
+ { year: 2001, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
4
+ { year: 2002, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
5
+ { year: 2003, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
6
+ { year: 2004, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
7
+ { year: 2005, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
8
+ { year: 2006, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
9
+ { year: 2007, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
10
+ { year: 2008, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31], totalDays: 0, daysTillNow: 0 },
11
+ { year: 2009, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
12
+ { year: 2010, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
13
+ { year: 2011, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
14
+ { year: 2012, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
15
+ { year: 2013, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
16
+ { year: 2014, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
17
+ { year: 2015, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
18
+ { year: 2016, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
19
+ { year: 2017, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
20
+ { year: 2018, days: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
21
+ { year: 2019, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
22
+ { year: 2020, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
23
+ { year: 2021, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
24
+ { year: 2022, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
25
+ { year: 2023, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
26
+ { year: 2024, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
27
+ { year: 2025, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
28
+ { year: 2026, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
29
+ { year: 2027, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
30
+ { year: 2028, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
31
+ { year: 2029, days: [31, 31, 32, 31, 32, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
32
+ { year: 2030, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
33
+ { year: 2031, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
34
+ { year: 2032, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
35
+ { year: 2033, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
36
+ { year: 2034, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
37
+ { year: 2035, days: [30, 32, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31], totalDays: 0, daysTillNow: 0 },
38
+ { year: 2036, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
39
+ { year: 2037, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
40
+ { year: 2038, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
41
+ { year: 2039, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
42
+ { year: 2040, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
43
+ { year: 2041, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
44
+ { year: 2042, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
45
+ { year: 2043, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
46
+ { year: 2044, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
47
+ { year: 2045, days: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
48
+ { year: 2046, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
49
+ { year: 2047, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
50
+ { year: 2048, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
51
+ { year: 2049, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
52
+ { year: 2050, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
53
+ { year: 2051, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
54
+ { year: 2052, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
55
+ { year: 2053, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
56
+ { year: 2054, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
57
+ { year: 2055, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
58
+ { year: 2056, days: [31, 31, 32, 31, 32, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
59
+ { year: 2057, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
60
+ { year: 2058, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
61
+ { year: 2059, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
62
+ { year: 2060, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
63
+ { year: 2061, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
64
+ { year: 2062, days: [30, 32, 31, 32, 31, 31, 29, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
65
+ { year: 2063, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
66
+ { year: 2064, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
67
+ { year: 2065, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
68
+ { year: 2066, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31], totalDays: 0, daysTillNow: 0 },
69
+ { year: 2067, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
70
+ { year: 2068, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
71
+ { year: 2069, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
72
+ { year: 2070, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
73
+ { year: 2071, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
74
+ { year: 2072, days: [31, 32, 31, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
75
+ { year: 2073, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
76
+ { year: 2074, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
77
+ { year: 2075, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
78
+ { year: 2076, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
79
+ { year: 2077, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
80
+ { year: 2078, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
81
+ { year: 2079, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
82
+ { year: 2080, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
83
+ { year: 2081, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
84
+ { year: 2082, days: [31, 31, 31, 32, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
85
+ { year: 2083, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
86
+ { year: 2084, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
87
+ { year: 2085, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
88
+ { year: 2086, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
89
+ { year: 2087, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
90
+ { year: 2088, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
91
+ { year: 2089, days: [30, 32, 31, 32, 31, 30, 30, 30, 29, 30, 29, 31], totalDays: 0, daysTillNow: 0 },
92
+ { year: 2090, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
93
+ { year: 2091, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
94
+ { year: 2092, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
95
+ { year: 2093, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 29, 31], totalDays: 0, daysTillNow: 0 },
96
+ { year: 2094, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
97
+ { year: 2095, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
98
+ { year: 2096, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 },
99
+ { year: 2097, days: [31, 31, 31, 32, 31, 31, 29, 30, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
100
+ { year: 2098, days: [31, 31, 32, 31, 31, 31, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
101
+ { year: 2099, days: [31, 31, 32, 32, 31, 30, 30, 29, 30, 29, 30, 30], totalDays: 0, daysTillNow: 0 },
102
+ { year: 2100, days: [31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 31], totalDays: 0, daysTillNow: 0 }
103
+ ];
104
+
105
+ let totalDays = 0;
106
+ NEPALI_DATE_MAP.forEach((entry) => {
107
+ entry.totalDays = entry.days.reduce((sum, daysInMonth) => sum + daysInMonth, 0);
108
+
109
+ totalDays += entry.totalDays;
110
+ entry.daysTillNow = totalDays;
111
+ });
112
+
113
+ export const EPOCH: number = new Date(1943, 3, 14).getTime();
114
+
115
+ //WEEK
116
+ export const WEEK_EN = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
117
+ export const WEEK_SHORT_EN = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
118
+ export const WEEK_NP = ['आइतबार', 'सोमबार', 'मंगलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'];
119
+ export const WEEK_SHORT_NP = ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'];
120
+
121
+ //Month
122
+ export const MONTH_EN = ["Baisakh", "Jestha", "Asar", "Shrawan", "Bhadra", "Aswin", "Kartik", "Mangsir", "Poush", "Magh", "Falgun", "Chaitra",];
123
+ export const MONTH_SHORT_EN = ['Bai', 'Jes', 'Asa', 'Shr', 'Bhd', 'Asw', 'Kar', 'Man', 'Pou', 'Mag', 'Fal', 'Cha'];
124
+ export const MONTH_NP = ['बैशाख', 'जेठ', 'असार', 'श्रावण', 'भाद्र', 'आश्विन', 'कार्तिक', 'मंसिर', 'पौष', 'माघ', 'फाल्गुण', 'चैत्र'];
125
+ export const MONTH_SHORT_NP = ['बै', 'जे', 'अ', 'श्रा', 'भा', 'आ', 'का', 'मं', 'पौ', 'मा', 'फा', 'चै'];
126
+
127
+ //Number
128
+ export const NUMBER_NP = ['०', '१', '२', '३', '४', '५', '६', '७', '८', '९'];
129
+
130
+
131
+
132
+
@@ -0,0 +1,47 @@
1
+ import { NepaliDate } from "../NepaliDate";
2
+
3
+ /**
4
+ * Converts a Anno Domini (AD) date to an Bikram Sambat(BS) Date.
5
+ * @param {string} adDate - The Anno Domini (AD) date in "YYYY-MM-DD" format.
6
+ * @returns {string} - The corresponding Bikram Sambat(BS) date in "YYYY-MM-DD" format.
7
+ */
8
+ export const ADtoBS = (adDate: string): string => {
9
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(adDate)) {
10
+ throw new Error('Invalid date format. Expected format: YYYY-MM-DD');
11
+ }
12
+
13
+ const ad = new Date(adDate);
14
+
15
+ if (Number.isNaN(ad.getTime())) {
16
+ throw new Error(`Invalid date input '${adDate}'`);
17
+ }
18
+
19
+ try {
20
+ const nepaliDate = new NepaliDate(ad);
21
+ return nepaliDate.format('YYYY-MM-DD');
22
+ } catch (err) {
23
+ console.error('Error During Date Conversion : ', err)
24
+ throw new Error('Failed to convert AD to BS');
25
+ }
26
+ };
27
+
28
+ /**
29
+ * Converts a Bikram Sambat(BS) to an Anno Domini (AD) Date.
30
+ * @param bsDate - The Bikram Sambat(BS) date in "YYYY-MM-DD" format.
31
+ * @returns {string} - The corresponding Anno Domini (AD) date in "YYYY-MM-DD" format.
32
+ */
33
+ export function BStoAD(bsDate: string): string {
34
+ try {
35
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(bsDate)) {
36
+ throw new Error('Invalid date format. Expected format: YYYY-MM-DD');
37
+ }
38
+ const nepaliDateInstance = bsDate ? new NepaliDate(bsDate) : new NepaliDate();
39
+ const pad = (n: number) => (n < 10 ? `0${n}` : `${n}`);
40
+ const date = nepaliDateInstance.getEnglishDate();
41
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
42
+ } catch (err) {
43
+ console.error('Error During Date Conversion : ', err)
44
+ throw new Error('Failed to convert BS to AD');
45
+ }
46
+ }
47
+
@@ -0,0 +1,170 @@
1
+ import { NepaliDate } from '../NepaliDate';
2
+ import { MONTH_EN, MONTH_SHORT_EN, MONTH_NP, MONTH_SHORT_NP, NUMBER_NP, WEEK_EN, WEEK_SHORT_EN, WEEK_NP, WEEK_SHORT_NP, NEPALI_DATE_MAP } from './Constants';
3
+
4
+ function pad(n: number): string {
5
+ return n < 10 ? `0${n}` : `${n}`;
6
+ }
7
+
8
+ function npDigit(str: string): string {
9
+ let res = '';
10
+ for (let i = 0; i < str.length; i += 1) {
11
+ res += NUMBER_NP[str.charCodeAt(i) - 48];
12
+ }
13
+ return res;
14
+ }
15
+
16
+ type DateFormatter = (date: NepaliDate) => string;
17
+
18
+ function yearEn(size: number): DateFormatter {
19
+ return (date: NepaliDate): string => {
20
+ if (size <= 2) {
21
+ return String(date.getYear()).substring(2);
22
+ }
23
+ if (size === 3) {
24
+ return String(date.getYear()).substring(1);
25
+ }
26
+ return String(date.getYear());
27
+ };
28
+ }
29
+
30
+ function yearNp(size: number): DateFormatter {
31
+ return (date: NepaliDate): string => {
32
+ if (size <= 2) {
33
+ return npDigit(String(date.getYear()).substring(2));
34
+ }
35
+ if (size === 3) {
36
+ return npDigit(String(date.getYear()).substring(1));
37
+ }
38
+ return npDigit(String(date.getYear()));
39
+ };
40
+ }
41
+
42
+ function monthEn(size: number): DateFormatter {
43
+ return (date: NepaliDate): string => {
44
+ if (size === 1) {
45
+ return String(date.getMonth() + 1);
46
+ }
47
+ if (size === 2) {
48
+ return pad(date.getMonth() + 1);
49
+ }
50
+ if (size === 3) {
51
+ return MONTH_SHORT_EN[date.getMonth()];
52
+ }
53
+ return MONTH_EN[date.getMonth()];
54
+ };
55
+ }
56
+
57
+ function monthNp(size: number): DateFormatter {
58
+ return (date: NepaliDate): string => {
59
+ if (size === 1) {
60
+ return npDigit(String(date.getMonth() + 1));
61
+ }
62
+ if (size === 2) {
63
+ return npDigit(pad(date.getMonth() + 1));
64
+ }
65
+ if (size === 3) {
66
+ return MONTH_SHORT_NP[date.getMonth()];
67
+ }
68
+ return MONTH_NP[date.getMonth()];
69
+ };
70
+ }
71
+
72
+ function dateEn(size: number): DateFormatter {
73
+ return (date: NepaliDate): string => {
74
+ if (size === 1) {
75
+ return String(date.getDate());
76
+ }
77
+ if (size === 2) {
78
+ return pad(date.getDate());
79
+ }
80
+ if (size === 3) {
81
+ return WEEK_SHORT_EN[date.getDay()];
82
+ }
83
+ return WEEK_EN[date.getDay()];
84
+ };
85
+ }
86
+
87
+ function dateNp(size: number): DateFormatter {
88
+ return (date: NepaliDate): string => {
89
+ if (size === 1) {
90
+ return npDigit(String(date.getDate()));
91
+ }
92
+ if (size === 2) {
93
+ return npDigit(pad(date.getDate()));
94
+ }
95
+ if (size === 3) {
96
+ return WEEK_SHORT_NP[date.getDay()];
97
+ }
98
+ return WEEK_NP[date.getDay()];
99
+ };
100
+ }
101
+
102
+ function pass(seq: string): DateFormatter {
103
+ return (): string => seq;
104
+ }
105
+
106
+ const fn: Record<string, (size: number) => DateFormatter> = {
107
+ Y: yearEn,
108
+ y: yearNp,
109
+ M: monthEn,
110
+ m: monthNp,
111
+ D: dateEn,
112
+ d: dateNp
113
+ };
114
+
115
+ function isSpecial(ch: string): boolean {
116
+ return ch in fn;
117
+ }
118
+
119
+ function tokenize(formatStr: string): DateFormatter[] {
120
+ let inQuote = false;
121
+ let seq = '';
122
+ let special = '';
123
+ let specialSize = 0;
124
+
125
+ const tokens: DateFormatter[] = [];
126
+
127
+ for (let i = 0; i < formatStr.length; i += 1) {
128
+ const ch = formatStr[i];
129
+ if (ch === special) {
130
+ specialSize += 1;
131
+ continue;
132
+ }
133
+
134
+ if (special !== '') {
135
+ tokens.push(fn[special](specialSize));
136
+ special = '';
137
+ specialSize = 0;
138
+ }
139
+
140
+ if (ch === '"') {
141
+ inQuote = !inQuote;
142
+ continue;
143
+ }
144
+
145
+ if (!isSpecial(ch) || inQuote) {
146
+ seq += ch;
147
+ } else {
148
+ if (seq) {
149
+ tokens.push(pass(seq));
150
+ seq = '';
151
+ }
152
+
153
+ special = ch;
154
+ specialSize = 1;
155
+ }
156
+ }
157
+
158
+ if (seq) {
159
+ tokens.push(pass(seq));
160
+ } else if (special) {
161
+ tokens.push(fn[special](specialSize));
162
+ }
163
+
164
+ return tokens;
165
+ }
166
+
167
+ export default function format(nepaliDate: NepaliDate, formatStr: string): string {
168
+ return tokenize(formatStr).map(f => f(nepaliDate)).join('');
169
+ }
170
+