arabic-datetime 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,354 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
+ var _date, _year, _monthIndex, _day, _time, _hour, _minute, _second, _milliseconds;
9
+ const AR_NUMS = {
10
+ "0": "٠",
11
+ "1": "١",
12
+ "2": "٢",
13
+ "3": "٣",
14
+ "4": "٤",
15
+ "5": "٥",
16
+ "6": "٦",
17
+ "7": "٧",
18
+ "8": "٨",
19
+ "9": "٩"
20
+ };
21
+ const MONTH_GROUP_NAMES = [
22
+ "syriac",
23
+ "roman1",
24
+ "roman2",
25
+ "roman3",
26
+ "french"
27
+ ];
28
+ const COUNTRY_CODES = [
29
+ "IQ",
30
+ "JO",
31
+ "LB",
32
+ "PS",
33
+ "SO",
34
+ "SY",
35
+ "BH",
36
+ "KM",
37
+ "DJ",
38
+ "EG",
39
+ "KW",
40
+ "LY",
41
+ "OM",
42
+ "QA",
43
+ "SA",
44
+ "SD",
45
+ "AE",
46
+ "YE",
47
+ "MA",
48
+ "MR",
49
+ "DZ",
50
+ "TN"
51
+ ];
52
+ const isCountryCode = (value) => COUNTRY_CODES.includes(value);
53
+ const MONTH_GROUPS = {
54
+ syriac: {
55
+ eastNums: true,
56
+ months: [
57
+ "كانون الثاني",
58
+ "شباط",
59
+ "آذار",
60
+ "نيسان",
61
+ "أيار",
62
+ "حزيران",
63
+ "تموز",
64
+ "آب",
65
+ "أيلول",
66
+ "تشرين الأول",
67
+ "تشرين الثاني",
68
+ "كانون الأول"
69
+ ],
70
+ countries: ["IQ", "JO", "LB", "PS", "SY"]
71
+ },
72
+ roman1: {
73
+ eastNums: true,
74
+ months: [
75
+ "يناير",
76
+ "فبراير",
77
+ "مارس",
78
+ "أبريل",
79
+ "مايو",
80
+ "يونيو",
81
+ "يوليو",
82
+ "أغسطس",
83
+ "سبتمبر",
84
+ "أكتوبر",
85
+ "نوفمبر",
86
+ "ديسمبر"
87
+ ],
88
+ countries: ["BH", "KM", "DJ", "EG", "KW", "LY", "OM", "QA", "SA", "SO", "SD", "AE", "YE"]
89
+ },
90
+ roman2: {
91
+ eastNums: false,
92
+ months: [
93
+ "يناير",
94
+ "فبراير",
95
+ "مارس",
96
+ "أبريل",
97
+ "ماي",
98
+ "يونيو",
99
+ "يوليوز",
100
+ "غشت",
101
+ "شتنبر",
102
+ "أكتوبر",
103
+ "نونبر",
104
+ "دجنبر"
105
+ ],
106
+ countries: ["MA"]
107
+ },
108
+ roman3: {
109
+ eastNums: false,
110
+ months: [
111
+ "يناير",
112
+ "فبراير",
113
+ "مارس",
114
+ "إبريل",
115
+ "مايو",
116
+ "يونيو",
117
+ "يوليو",
118
+ "أغشت",
119
+ "شتمبر",
120
+ "أكتوبر",
121
+ "نوفمبر",
122
+ "ديسمبر"
123
+ ],
124
+ countries: ["MR"]
125
+ },
126
+ french: {
127
+ eastNums: false,
128
+ months: [
129
+ "جانفي",
130
+ "فيفري",
131
+ "مارس",
132
+ "أفريل",
133
+ "ماي",
134
+ "جوان",
135
+ "جويلية",
136
+ "أوت",
137
+ "سبتمبر",
138
+ "أكتوبر",
139
+ "نوفمبر",
140
+ "ديسمبر"
141
+ ],
142
+ countries: ["DZ", "TN"]
143
+ }
144
+ };
145
+ const WESTERN_DIGIT_PATTERN = /[0-9]/g;
146
+ const toArabicDigits = (value) => value.replace(WESTERN_DIGIT_PATTERN, (digit) => AR_NUMS[digit]);
147
+ const isValidDate = (value) => value instanceof Date && !Number.isNaN(value.valueOf());
148
+ class ArabicDate {
149
+ constructor(dateObject) {
150
+ __privateAdd(this, _date);
151
+ __privateAdd(this, _year);
152
+ __privateAdd(this, _monthIndex);
153
+ __privateAdd(this, _day);
154
+ this.setDate(dateObject);
155
+ }
156
+ get dateObject() {
157
+ return new Date(__privateGet(this, _date));
158
+ }
159
+ set dateObject(value) {
160
+ this.setDate(value);
161
+ }
162
+ syriacNames(eastNums = false) {
163
+ this.assertBoolean(eastNums, "syriacNames");
164
+ return this.composeGroupFormat("syriac", eastNums);
165
+ }
166
+ roman1Names(eastNums = false) {
167
+ this.assertBoolean(eastNums, "roman1Names");
168
+ return this.composeGroupFormat("roman1", eastNums);
169
+ }
170
+ roman2Names(eastNums = false) {
171
+ this.assertBoolean(eastNums, "roman2Names");
172
+ return this.composeGroupFormat("roman2", eastNums);
173
+ }
174
+ roman3Names(eastNums = false) {
175
+ this.assertBoolean(eastNums, "roman3Names");
176
+ return this.composeGroupFormat("roman3", eastNums);
177
+ }
178
+ frenchNames(eastNums = false) {
179
+ this.assertBoolean(eastNums, "frenchNames");
180
+ return this.composeGroupFormat("french", eastNums);
181
+ }
182
+ dualNames(first, second, eastNums = false) {
183
+ this.assertString(first, "first", "dualNames");
184
+ this.assertString(second, "second", "dualNames");
185
+ this.assertBoolean(eastNums, "dualNames");
186
+ const normalizedFirst = this.normalizeGroupName(first, "first", "dualNames");
187
+ const normalizedSecond = this.normalizeGroupName(second, "second", "dualNames");
188
+ if (normalizedFirst === normalizedSecond) {
189
+ throw new Error(
190
+ "ArabicDate class error: The first group name and the second group name should not be identical in the parameters passed to the method 'dualNames'."
191
+ );
192
+ }
193
+ const day = this.formatDay(eastNums);
194
+ const year = this.formatYear(eastNums);
195
+ const firstMonth = MONTH_GROUPS[normalizedFirst].months[__privateGet(this, _monthIndex)];
196
+ const secondMonth = MONTH_GROUPS[normalizedSecond].months[__privateGet(this, _monthIndex)];
197
+ return `${day} ${firstMonth} (${secondMonth}) ${year}`;
198
+ }
199
+ byCountryCode(countryCode, eastNums) {
200
+ this.assertString(countryCode, "country_code", "byCountryCode");
201
+ if (eastNums !== void 0) {
202
+ this.assertBoolean(eastNums, "byCountryCode");
203
+ }
204
+ const normalizedCode = countryCode.trim().toUpperCase();
205
+ if (!normalizedCode) {
206
+ throw new Error(
207
+ "ArabicDate class error: Unknown country code '' passed to the class method 'byCountryCode'."
208
+ );
209
+ }
210
+ if (!isCountryCode(normalizedCode)) {
211
+ throw new Error(
212
+ `ArabicDate class error: Unknown country code '${countryCode}' passed to the class method 'byCountryCode'.`
213
+ );
214
+ }
215
+ for (const groupName of MONTH_GROUP_NAMES) {
216
+ const group = MONTH_GROUPS[groupName];
217
+ if (group.countries.includes(normalizedCode)) {
218
+ const east = eastNums ?? group.eastNums;
219
+ return this.composeGroupFormat(groupName, east);
220
+ }
221
+ }
222
+ throw new Error(
223
+ `ArabicDate class error: Unknown country code '${countryCode}' passed to the class method 'byCountryCode'.`
224
+ );
225
+ }
226
+ easternNumericDate(separator = "/") {
227
+ this.assertString(separator, "separator", "easternNumericDate");
228
+ const month = (__privateGet(this, _monthIndex) + 1).toString();
229
+ return [__privateGet(this, _day), month, __privateGet(this, _year)].map(toArabicDigits).join(separator);
230
+ }
231
+ setDate(value) {
232
+ if (!isValidDate(value)) {
233
+ const message = value instanceof Date ? "ArabicDate class error: The parameter passed as dateObject is an invalid Date. Only valid Date objects are allowed." : "ArabicDate class error: The parameter passed as dateObject is not a Date. Only Date objects are allowed.";
234
+ throw new TypeError(message);
235
+ }
236
+ __privateSet(this, _date, new Date(value));
237
+ __privateSet(this, _year, __privateGet(this, _date).getFullYear().toString());
238
+ __privateSet(this, _monthIndex, __privateGet(this, _date).getMonth());
239
+ __privateSet(this, _day, __privateGet(this, _date).getDate().toString());
240
+ }
241
+ composeGroupFormat(groupName, eastNums) {
242
+ const day = this.formatDay(eastNums);
243
+ const month = MONTH_GROUPS[groupName].months[__privateGet(this, _monthIndex)];
244
+ const year = this.formatYear(eastNums);
245
+ return `${day} ${month} ${year}`;
246
+ }
247
+ formatDay(eastNums) {
248
+ return eastNums ? toArabicDigits(__privateGet(this, _day)) : __privateGet(this, _day);
249
+ }
250
+ formatYear(eastNums) {
251
+ return eastNums ? toArabicDigits(__privateGet(this, _year)) : __privateGet(this, _year);
252
+ }
253
+ assertBoolean(value, methodName) {
254
+ if (typeof value !== "boolean") {
255
+ throw new TypeError(
256
+ `ArabicDate class error: east_nums must be a boolean. '${String(value)}' is not a boolean and was passed to the class method '${methodName}'.`
257
+ );
258
+ }
259
+ }
260
+ assertString(value, parameterName, methodName) {
261
+ if (typeof value !== "string") {
262
+ throw new TypeError(
263
+ `ArabicDate class error: The '${parameterName}' parameter passed to the class method '${methodName}' is not a string.`
264
+ );
265
+ }
266
+ }
267
+ normalizeGroupName(value, descriptor, methodName) {
268
+ const normalized = value.trim().toLowerCase();
269
+ const match = MONTH_GROUP_NAMES.find((group) => group === normalized);
270
+ if (!match) {
271
+ throw new Error(
272
+ `ArabicDate class error: Unknown ${descriptor} group name '${value}' passed to the class method '${methodName}'.`
273
+ );
274
+ }
275
+ return match;
276
+ }
277
+ }
278
+ _date = new WeakMap();
279
+ _year = new WeakMap();
280
+ _monthIndex = new WeakMap();
281
+ _day = new WeakMap();
282
+ const VALID_FORMATS = /* @__PURE__ */ new Set(["H", "HM", "HMS", "HMSF"]);
283
+ const normalizeFormat = (format) => {
284
+ const value = format.toUpperCase();
285
+ if (!VALID_FORMATS.has(value)) {
286
+ throw new Error(
287
+ "ArabicTime class error: Invalid format string passed to the class method 'time'. Valid values are 'HMSF', 'HMS', 'HM' and 'H'."
288
+ );
289
+ }
290
+ return value;
291
+ };
292
+ class ArabicTime {
293
+ constructor(timeObject) {
294
+ __privateAdd(this, _time);
295
+ __privateAdd(this, _hour);
296
+ __privateAdd(this, _minute);
297
+ __privateAdd(this, _second);
298
+ __privateAdd(this, _milliseconds);
299
+ this.setTime(timeObject);
300
+ }
301
+ get timeObject() {
302
+ return new Date(__privateGet(this, _time));
303
+ }
304
+ set timeObject(value) {
305
+ this.setTime(value);
306
+ }
307
+ time(format = "HMS", separator = ":") {
308
+ this.assertString(format, "format", "time");
309
+ this.assertString(separator, "separator", "time");
310
+ const normalizedFormat = normalizeFormat(format);
311
+ const formattedParts = [];
312
+ if (normalizedFormat.includes("H")) {
313
+ formattedParts.push(toArabicDigits(__privateGet(this, _hour)));
314
+ }
315
+ if (normalizedFormat.includes("M")) {
316
+ formattedParts.push(toArabicDigits(__privateGet(this, _minute)));
317
+ }
318
+ if (normalizedFormat.includes("S")) {
319
+ formattedParts.push(toArabicDigits(__privateGet(this, _second)));
320
+ }
321
+ if (normalizedFormat.includes("F")) {
322
+ formattedParts.push(toArabicDigits(__privateGet(this, _milliseconds)));
323
+ }
324
+ return formattedParts.join(separator);
325
+ }
326
+ setTime(value) {
327
+ if (!isValidDate(value)) {
328
+ const message = value instanceof Date ? "ArabicTime class error: The parameter passed as timeObject is an invalid Date. Only valid Date objects are allowed." : "ArabicTime class error: The parameter passed as timeObject is not a Date. Only Date objects are allowed.";
329
+ throw new TypeError(message);
330
+ }
331
+ __privateSet(this, _time, new Date(value));
332
+ __privateSet(this, _hour, __privateGet(this, _time).getHours().toString());
333
+ __privateSet(this, _minute, __privateGet(this, _time).getMinutes().toString());
334
+ __privateSet(this, _second, __privateGet(this, _time).getSeconds().toString());
335
+ __privateSet(this, _milliseconds, __privateGet(this, _time).getMilliseconds().toString().padStart(3, "0"));
336
+ }
337
+ assertString(value, parameterName, methodName) {
338
+ if (typeof value !== "string") {
339
+ throw new TypeError(
340
+ `ArabicTime class error: The '${parameterName}' parameter passed to the class method '${methodName}' is not a string.`
341
+ );
342
+ }
343
+ }
344
+ }
345
+ _time = new WeakMap();
346
+ _hour = new WeakMap();
347
+ _minute = new WeakMap();
348
+ _second = new WeakMap();
349
+ _milliseconds = new WeakMap();
350
+ export {
351
+ ArabicDate,
352
+ ArabicTime
353
+ };
354
+ //# sourceMappingURL=arabic-datetime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabic-datetime.js","sources":["../src/constants.ts","../src/arabicNumerals.ts","../src/validators.ts","../src/arabicDate.ts","../src/arabicTime.ts"],"sourcesContent":["/** @internal */\nexport const AR_NUMS = {\n \"0\": \"٠\",\n \"1\": \"١\",\n \"2\": \"٢\",\n \"3\": \"٣\",\n \"4\": \"٤\",\n \"5\": \"٥\",\n \"6\": \"٦\",\n \"7\": \"٧\",\n \"8\": \"٨\",\n \"9\": \"٩\"\n} as const;\n\n/** @internal */\nexport type ArabicDigit = keyof typeof AR_NUMS;\n\n/** @internal */\nexport const MONTH_GROUP_NAMES = [\n \"syriac\",\n \"roman1\",\n \"roman2\",\n \"roman3\",\n \"french\"\n] as const;\n\n/** @internal */\nexport type MonthGroupName = (typeof MONTH_GROUP_NAMES)[number];\n\n/** @internal */\nexport const COUNTRY_CODES = [\n \"IQ\",\n \"JO\",\n \"LB\",\n \"PS\",\n \"SO\",\n \"SY\",\n \"BH\",\n \"KM\",\n \"DJ\",\n \"EG\",\n \"KW\",\n \"LY\",\n \"OM\",\n \"QA\",\n \"SA\",\n \"SD\",\n \"AE\",\n \"YE\",\n \"MA\",\n \"MR\",\n \"DZ\",\n \"TN\"\n] as const;\n\n/** @internal */\nexport type CountryCode = (typeof COUNTRY_CODES)[number];\n\n/** @internal */\nexport const isCountryCode = (value: string): value is CountryCode =>\n COUNTRY_CODES.includes(value as CountryCode);\n\n/** @internal */\nexport type MonthGroup = {\n readonly eastNums: boolean;\n readonly months: readonly [\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string,\n string\n ];\n readonly countries: readonly CountryCode[];\n};\n\n/** @internal */\nexport const MONTH_GROUPS: Record<MonthGroupName, MonthGroup> = {\n syriac: {\n eastNums: true,\n months: [\n \"كانون الثاني\",\n \"شباط\",\n \"آذار\",\n \"نيسان\",\n \"أيار\",\n \"حزيران\",\n \"تموز\",\n \"آب\",\n \"أيلول\",\n \"تشرين الأول\",\n \"تشرين الثاني\",\n \"كانون الأول\"\n ] as const,\n countries: [\"IQ\", \"JO\", \"LB\", \"PS\", \"SY\"] as const\n },\n roman1: {\n eastNums: true,\n months: [\n \"يناير\",\n \"فبراير\",\n \"مارس\",\n \"أبريل\",\n \"مايو\",\n \"يونيو\",\n \"يوليو\",\n \"أغسطس\",\n \"سبتمبر\",\n \"أكتوبر\",\n \"نوفمبر\",\n \"ديسمبر\"\n ] as const,\n countries: [\"BH\", \"KM\", \"DJ\", \"EG\", \"KW\", \"LY\", \"OM\", \"QA\", \"SA\", \"SO\", \"SD\", \"AE\", \"YE\"] as const\n },\n roman2: {\n eastNums: false,\n months: [\n \"يناير\",\n \"فبراير\",\n \"مارس\",\n \"أبريل\",\n \"ماي\",\n \"يونيو\",\n \"يوليوز\",\n \"غشت\",\n \"شتنبر\",\n \"أكتوبر\",\n \"نونبر\",\n \"دجنبر\"\n ] as const,\n countries: [\"MA\"] as const\n },\n roman3: {\n eastNums: false,\n months: [\n \"يناير\",\n \"فبراير\",\n \"مارس\",\n \"إبريل\",\n \"مايو\",\n \"يونيو\",\n \"يوليو\",\n \"أغشت\",\n \"شتمبر\",\n \"أكتوبر\",\n \"نوفمبر\",\n \"ديسمبر\"\n ] as const,\n countries: [\"MR\"] as const\n },\n french: {\n eastNums: false,\n months: [\n \"جانفي\",\n \"فيفري\",\n \"مارس\",\n \"أفريل\",\n \"ماي\",\n \"جوان\",\n \"جويلية\",\n \"أوت\",\n \"سبتمبر\",\n \"أكتوبر\",\n \"نوفمبر\",\n \"ديسمبر\"\n ] as const,\n countries: [\"DZ\", \"TN\"] as const\n }\n};\n","import { AR_NUMS, type ArabicDigit } from './constants';\n\n\nconst WESTERN_DIGIT_PATTERN = /[0-9]/g;\n\n/** @internal */\nexport const toArabicDigits = (value: string): string =>\n value.replace(WESTERN_DIGIT_PATTERN, (digit) => AR_NUMS[digit as ArabicDigit]);\n","/** @internal */\nexport const isValidDate = (value: unknown): value is Date =>\n value instanceof Date && !Number.isNaN(value.valueOf());\n","import { MONTH_GROUPS, MONTH_GROUP_NAMES, isCountryCode, type MonthGroupName } from './constants';\nimport { toArabicDigits } from './arabicNumerals';\nimport { isValidDate } from './validators';\n\nexport class ArabicDate {\n #date!: Date;\n #year!: string;\n #monthIndex!: number;\n #day!: string;\n\n constructor(dateObject: Date) {\n this.setDate(dateObject);\n }\n\n get dateObject(): Date {\n return new Date(this.#date);\n }\n\n set dateObject(value: Date) {\n this.setDate(value);\n }\n\n syriacNames(eastNums: boolean = false): string {\n this.assertBoolean(eastNums, 'syriacNames');\n return this.composeGroupFormat('syriac', eastNums);\n }\n\n roman1Names(eastNums: boolean = false): string {\n this.assertBoolean(eastNums, 'roman1Names');\n return this.composeGroupFormat('roman1', eastNums);\n }\n\n roman2Names(eastNums: boolean = false): string {\n this.assertBoolean(eastNums, 'roman2Names');\n return this.composeGroupFormat('roman2', eastNums);\n }\n\n roman3Names(eastNums: boolean = false): string {\n this.assertBoolean(eastNums, 'roman3Names');\n return this.composeGroupFormat('roman3', eastNums);\n }\n\n frenchNames(eastNums: boolean = false): string {\n this.assertBoolean(eastNums, 'frenchNames');\n return this.composeGroupFormat('french', eastNums);\n }\n\n dualNames(first: string, second: string, eastNums: boolean = false): string {\n this.assertString(first, 'first', 'dualNames');\n this.assertString(second, 'second', 'dualNames');\n this.assertBoolean(eastNums, 'dualNames');\n\n const normalizedFirst = this.normalizeGroupName(first, 'first', 'dualNames');\n const normalizedSecond = this.normalizeGroupName(second, 'second', 'dualNames');\n\n if (normalizedFirst === normalizedSecond) {\n throw new Error(\n \"ArabicDate class error: The first group name and the second group name should not be identical in the parameters passed to the method 'dualNames'.\"\n );\n }\n\n const day = this.formatDay(eastNums);\n const year = this.formatYear(eastNums);\n const firstMonth = MONTH_GROUPS[normalizedFirst].months[this.#monthIndex];\n const secondMonth = MONTH_GROUPS[normalizedSecond].months[this.#monthIndex];\n\n return `${day} ${firstMonth} (${secondMonth}) ${year}`;\n }\n\n byCountryCode(countryCode: string, eastNums?: boolean): string {\n this.assertString(countryCode, 'country_code', 'byCountryCode');\n\n if (eastNums !== undefined) {\n this.assertBoolean(eastNums, 'byCountryCode');\n }\n\n const normalizedCode = countryCode.trim().toUpperCase();\n if (!normalizedCode) {\n throw new Error(\n \"ArabicDate class error: Unknown country code '' passed to the class method 'byCountryCode'.\"\n );\n }\n\n if (!isCountryCode(normalizedCode)) {\n throw new Error(\n `ArabicDate class error: Unknown country code '${countryCode}' passed to the class method 'byCountryCode'.`\n );\n }\n\n for (const groupName of MONTH_GROUP_NAMES) {\n const group = MONTH_GROUPS[groupName];\n if (group.countries.includes(normalizedCode)) {\n const east = eastNums ?? group.eastNums;\n return this.composeGroupFormat(groupName, east);\n }\n }\n\n throw new Error(\n `ArabicDate class error: Unknown country code '${countryCode}' passed to the class method 'byCountryCode'.`\n );\n }\n\n easternNumericDate(separator: string = '/'): string {\n this.assertString(separator, 'separator', 'easternNumericDate');\n const month = (this.#monthIndex + 1).toString();\n return [this.#day, month, this.#year].map(toArabicDigits).join(separator);\n }\n\n private setDate(value: unknown): void {\n if (!isValidDate(value)) {\n const message = value instanceof Date\n ? \"ArabicDate class error: The parameter passed as dateObject is an invalid Date. Only valid Date objects are allowed.\"\n : \"ArabicDate class error: The parameter passed as dateObject is not a Date. Only Date objects are allowed.\";\n throw new TypeError(message);\n }\n\n this.#date = new Date(value);\n this.#year = this.#date.getFullYear().toString();\n this.#monthIndex = this.#date.getMonth();\n this.#day = this.#date.getDate().toString();\n }\n\n private composeGroupFormat(groupName: MonthGroupName, eastNums: boolean): string {\n const day = this.formatDay(eastNums);\n const month = MONTH_GROUPS[groupName].months[this.#monthIndex];\n const year = this.formatYear(eastNums);\n return `${day} ${month} ${year}`;\n }\n\n private formatDay(eastNums: boolean): string {\n return eastNums ? toArabicDigits(this.#day) : this.#day;\n }\n\n private formatYear(eastNums: boolean): string {\n return eastNums ? toArabicDigits(this.#year) : this.#year;\n }\n\n private assertBoolean(value: unknown, methodName: string): asserts value is boolean {\n if (typeof value !== 'boolean') {\n throw new TypeError(\n `ArabicDate class error: east_nums must be a boolean. '${String(value)}' is not a boolean and was passed to the class method '${methodName}'.`\n );\n }\n }\n\n private assertString(value: unknown, parameterName: string, methodName: string): asserts value is string {\n if (typeof value !== 'string') {\n throw new TypeError(\n `ArabicDate class error: The '${parameterName}' parameter passed to the class method '${methodName}' is not a string.`\n );\n }\n }\n\n private normalizeGroupName(value: string, descriptor: string, methodName: string): MonthGroupName {\n const normalized = value.trim().toLowerCase();\n const match = MONTH_GROUP_NAMES.find((group) => group === normalized);\n\n if (!match) {\n throw new Error(\n `ArabicDate class error: Unknown ${descriptor} group name '${value}' passed to the class method '${methodName}'.`\n );\n }\n\n return match;\n }\n}\n","import { toArabicDigits } from './arabicNumerals';\nimport { isValidDate } from './validators';\n\nconst VALID_FORMATS = new Set(['H', 'HM', 'HMS', 'HMSF']);\n\ntype AcceptedFormat = 'H' | 'HM' | 'HMS' | 'HMSF';\n\nconst normalizeFormat = (format: string): AcceptedFormat => {\n const value = format.toUpperCase();\n if (!VALID_FORMATS.has(value)) {\n throw new Error(\n \"ArabicTime class error: Invalid format string passed to the class method 'time'. Valid values are 'HMSF', 'HMS', 'HM' and 'H'.\"\n );\n }\n return value as AcceptedFormat;\n};\n\nexport class ArabicTime {\n #time!: Date;\n #hour!: string;\n #minute!: string;\n #second!: string;\n #milliseconds!: string;\n\n constructor(timeObject: Date) {\n this.setTime(timeObject);\n }\n\n get timeObject(): Date {\n return new Date(this.#time);\n }\n\n set timeObject(value: Date) {\n this.setTime(value);\n }\n\n time(format: string = 'HMS', separator: string = ':'): string {\n this.assertString(format, 'format', 'time');\n this.assertString(separator, 'separator', 'time');\n\n const normalizedFormat = normalizeFormat(format);\n const formattedParts: string[] = [];\n\n if (normalizedFormat.includes('H')) {\n formattedParts.push(toArabicDigits(this.#hour));\n }\n if (normalizedFormat.includes('M')) {\n formattedParts.push(toArabicDigits(this.#minute));\n }\n if (normalizedFormat.includes('S')) {\n formattedParts.push(toArabicDigits(this.#second));\n }\n if (normalizedFormat.includes('F')) {\n formattedParts.push(toArabicDigits(this.#milliseconds));\n }\n\n return formattedParts.join(separator);\n }\n\n private setTime(value: unknown): void {\n if (!isValidDate(value)) {\n const message = value instanceof Date\n ? \"ArabicTime class error: The parameter passed as timeObject is an invalid Date. Only valid Date objects are allowed.\"\n : \"ArabicTime class error: The parameter passed as timeObject is not a Date. Only Date objects are allowed.\";\n throw new TypeError(message);\n }\n\n this.#time = new Date(value);\n this.#hour = this.#time.getHours().toString();\n this.#minute = this.#time.getMinutes().toString();\n this.#second = this.#time.getSeconds().toString();\n this.#milliseconds = this.#time.getMilliseconds().toString().padStart(3, '0');\n }\n\n private assertString(value: unknown, parameterName: string, methodName: string): asserts value is string {\n if (typeof value !== 'string') {\n throw new TypeError(\n `ArabicTime class error: The '${parameterName}' parameter passed to the class method '${methodName}' is not a string.`\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare class ArabicDate {
2
+ #private;
3
+ constructor(dateObject: Date);
4
+ get dateObject(): Date;
5
+ set dateObject(value: Date);
6
+ syriacNames(eastNums?: boolean): string;
7
+ roman1Names(eastNums?: boolean): string;
8
+ roman2Names(eastNums?: boolean): string;
9
+ roman3Names(eastNums?: boolean): string;
10
+ frenchNames(eastNums?: boolean): string;
11
+ dualNames(first: string, second: string, eastNums?: boolean): string;
12
+ byCountryCode(countryCode: string, eastNums?: boolean): string;
13
+ easternNumericDate(separator?: string): string;
14
+ private setDate;
15
+ private composeGroupFormat;
16
+ private formatDay;
17
+ private formatYear;
18
+ private assertBoolean;
19
+ private assertString;
20
+ private normalizeGroupName;
21
+ }
22
+ //# sourceMappingURL=arabicDate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabicDate.d.ts","sourceRoot":"","sources":["../../src/arabicDate.ts"],"names":[],"mappings":"AAIA,qBAAa,UAAU;;gBAMT,UAAU,EAAE,IAAI;IAI5B,IAAI,UAAU,IAAI,IAAI,CAErB;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,EAEzB;IAED,WAAW,CAAC,QAAQ,GAAE,OAAe,GAAG,MAAM;IAK9C,WAAW,CAAC,QAAQ,GAAE,OAAe,GAAG,MAAM;IAK9C,WAAW,CAAC,QAAQ,GAAE,OAAe,GAAG,MAAM;IAK9C,WAAW,CAAC,QAAQ,GAAE,OAAe,GAAG,MAAM;IAK9C,WAAW,CAAC,QAAQ,GAAE,OAAe,GAAG,MAAM;IAK9C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAe,GAAG,MAAM;IAsB3E,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAiC9D,kBAAkB,CAAC,SAAS,GAAE,MAAY,GAAG,MAAM;IAMnD,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,kBAAkB;CAY3B"}
@@ -0,0 +1,10 @@
1
+ export declare class ArabicTime {
2
+ #private;
3
+ constructor(timeObject: Date);
4
+ get timeObject(): Date;
5
+ set timeObject(value: Date);
6
+ time(format?: string, separator?: string): string;
7
+ private setTime;
8
+ private assertString;
9
+ }
10
+ //# sourceMappingURL=arabicTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabicTime.d.ts","sourceRoot":"","sources":["../../src/arabicTime.ts"],"names":[],"mappings":"AAiBA,qBAAa,UAAU;;gBAOT,UAAU,EAAE,IAAI;IAI5B,IAAI,UAAU,IAAI,IAAI,CAErB;IAED,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,EAEzB;IAED,IAAI,CAAC,MAAM,GAAE,MAAc,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM;IAuB7D,OAAO,CAAC,OAAO;IAef,OAAO,CAAC,YAAY;CAOrB"}
@@ -0,0 +1,3 @@
1
+ export { ArabicDate } from './arabicDate';
2
+ export { ArabicTime } from './arabicTime';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "arabic-datetime",
3
+ "version": "1.0.0",
4
+ "description": "Arabic datetime formatter",
5
+ "type": "module",
6
+ "main": "./dist/arabic-datetime.cjs",
7
+ "module": "./dist/arabic-datetime.js",
8
+ "types": "./dist/types/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/types/index.d.ts",
12
+ "import": "./dist/arabic-datetime.js",
13
+ "require": "./dist/arabic-datetime.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "LICENSE.txt"
19
+ ],
20
+ "scripts": {
21
+ "dev": "vite dev",
22
+ "build": "vite build && npm run build:types",
23
+ "build:types": "tsc --emitDeclarationOnly --outDir dist/types && node scripts/prune-types.mjs",
24
+ "preview": "vite preview",
25
+ "lint": "eslint . --ext .ts",
26
+ "test": "vitest run",
27
+ "prepublishOnly": "npm run build"
28
+ },
29
+ "keywords": [
30
+ "arabic",
31
+ "datetime",
32
+ "formatting"
33
+ ],
34
+ "author": "Khaldevmedia",
35
+ "license": "GPL",
36
+ "devDependencies": {
37
+ "@types/node": "^25.4.0",
38
+ "@typescript-eslint/eslint-plugin": "^8.57.0",
39
+ "@typescript-eslint/parser": "^8.57.0",
40
+ "eslint": "^10.0.3",
41
+ "typescript": "^5.9.3",
42
+ "vite": "^6.0.5",
43
+ "vitest": "^4.0.18"
44
+ }
45
+ }