@nextera.one/tps-standard 0.5.34 → 0.7.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.
Files changed (60) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +133 -56
  3. package/dist/driver-manager.d.ts +34 -0
  4. package/dist/driver-manager.js +53 -0
  5. package/dist/driver-manager.js.map +1 -0
  6. package/dist/drivers/chinese.d.ts +25 -0
  7. package/dist/drivers/chinese.js +485 -0
  8. package/dist/drivers/chinese.js.map +1 -0
  9. package/dist/esm/date.js +170 -0
  10. package/dist/esm/date.js.map +1 -0
  11. package/dist/esm/driver-manager.js +49 -0
  12. package/dist/esm/driver-manager.js.map +1 -0
  13. package/dist/esm/drivers/chinese.js +481 -0
  14. package/dist/esm/drivers/chinese.js.map +1 -0
  15. package/dist/esm/drivers/gregorian.js +160 -0
  16. package/dist/esm/drivers/gregorian.js.map +1 -0
  17. package/dist/esm/drivers/hijri.js +184 -0
  18. package/dist/esm/drivers/hijri.js.map +1 -0
  19. package/dist/esm/drivers/holocene.js +115 -0
  20. package/dist/esm/drivers/holocene.js.map +1 -0
  21. package/dist/esm/drivers/julian.js +161 -0
  22. package/dist/esm/drivers/julian.js.map +1 -0
  23. package/dist/esm/drivers/persian.js +190 -0
  24. package/dist/esm/drivers/persian.js.map +1 -0
  25. package/dist/esm/drivers/tps.js +181 -0
  26. package/dist/esm/drivers/tps.js.map +1 -0
  27. package/dist/esm/drivers/unix.js +50 -0
  28. package/dist/esm/drivers/unix.js.map +1 -0
  29. package/dist/esm/index.js +873 -0
  30. package/dist/esm/index.js.map +1 -0
  31. package/dist/esm/types.js +28 -0
  32. package/dist/esm/types.js.map +1 -0
  33. package/dist/esm/uid.js +221 -0
  34. package/dist/esm/uid.js.map +1 -0
  35. package/dist/esm/utils/calendar.js +126 -0
  36. package/dist/esm/utils/calendar.js.map +1 -0
  37. package/dist/esm/utils/env.js +76 -0
  38. package/dist/esm/utils/env.js.map +1 -0
  39. package/dist/esm/utils/timezone.js +168 -0
  40. package/dist/esm/utils/timezone.js.map +1 -0
  41. package/dist/esm/utils/tps-string.js +160 -0
  42. package/dist/esm/utils/tps-string.js.map +1 -0
  43. package/dist/index.d.ts +91 -2
  44. package/dist/index.js +412 -132
  45. package/dist/index.js.map +1 -1
  46. package/dist/types.d.ts +19 -1
  47. package/dist/types.js +1 -0
  48. package/dist/types.js.map +1 -1
  49. package/dist/uid.js +1 -1
  50. package/dist/uid.js.map +1 -1
  51. package/dist/utils/timezone.d.ts +32 -0
  52. package/dist/utils/timezone.js +173 -0
  53. package/dist/utils/timezone.js.map +1 -0
  54. package/package.json +20 -5
  55. package/src/driver-manager.ts +54 -0
  56. package/src/drivers/chinese.ts +542 -0
  57. package/src/index.ts +379 -123
  58. package/src/types.ts +26 -2
  59. package/src/uid.ts +2 -2
  60. package/src/utils/timezone.ts +182 -0
@@ -0,0 +1,160 @@
1
+ import { buildTimePart } from "../utils/tps-string";
2
+ /**
3
+ * Gregorian calendar driver.
4
+ * Supports robust validation and canonical Date conversions.
5
+ */
6
+ export class GregorianDriver {
7
+ constructor() {
8
+ this.code = "greg";
9
+ }
10
+ getComponentsFromDate(date) {
11
+ const fullYear = date.getUTCFullYear();
12
+ return {
13
+ calendar: this.code,
14
+ millennium: Math.floor(fullYear / 1000) + 1,
15
+ century: Math.floor((fullYear % 1000) / 100) + 1,
16
+ year: fullYear % 100,
17
+ month: date.getUTCMonth() + 1,
18
+ day: date.getUTCDate(),
19
+ hour: date.getUTCHours(),
20
+ minute: date.getUTCMinutes(),
21
+ second: date.getUTCSeconds(),
22
+ millisecond: date.getUTCMilliseconds(),
23
+ };
24
+ }
25
+ getDateFromComponents(components) {
26
+ const m = components.millennium ?? 0;
27
+ const c = components.century ?? 1;
28
+ const y = components.year ?? 0;
29
+ const fullYear = (m - 1) * 1000 + (c - 1) * 100 + y;
30
+ return new Date(Date.UTC(fullYear, (components.month || 1) - 1, components.day || 1, components.hour || 0, components.minute || 0, Math.floor(components.second || 0), components.millisecond ??
31
+ Math.round(((components.second || 0) % 1) * 1000)));
32
+ }
33
+ getFromDate(date) {
34
+ const comp = this.getComponentsFromDate(date);
35
+ return buildTimePart(comp);
36
+ }
37
+ // --- optional helpers --------------------------------------------------
38
+ parseDate(input, format) {
39
+ const s = input.trim();
40
+ const m = s.match(/^(\d{4})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?)?$/);
41
+ if (!m) {
42
+ throw new Error(`GregorianDriver.parseDate: unsupported format "${input}"`);
43
+ }
44
+ const year = parseInt(m[1], 10);
45
+ const month = parseInt(m[2], 10);
46
+ const day = parseInt(m[3], 10);
47
+ const hour = m[4] !== undefined ? parseInt(m[4], 10) : undefined;
48
+ const minute = m[5] !== undefined ? parseInt(m[5], 10) : undefined;
49
+ const second = m[6] !== undefined ? parseInt(m[6], 10) : undefined;
50
+ const millisecond = m[7] !== undefined ? parseInt((m[7] + "000").slice(0, 3), 10) : undefined;
51
+ const comp = {
52
+ calendar: this.code,
53
+ year,
54
+ month,
55
+ day,
56
+ };
57
+ if (hour !== undefined)
58
+ comp.hour = hour;
59
+ if (minute !== undefined)
60
+ comp.minute = minute;
61
+ if (second !== undefined)
62
+ comp.second = second;
63
+ if (millisecond !== undefined)
64
+ comp.millisecond = millisecond;
65
+ return comp;
66
+ }
67
+ format(components, format) {
68
+ const y = components.year !== undefined
69
+ ? String(components.year).padStart(4, "0")
70
+ : "0000";
71
+ const mo = components.month !== undefined
72
+ ? String(components.month).padStart(2, "0")
73
+ : "01";
74
+ const d = components.day !== undefined
75
+ ? String(components.day).padStart(2, "0")
76
+ : "01";
77
+ let out = `${y}-${mo}-${d}`;
78
+ if (components.hour !== undefined ||
79
+ components.minute !== undefined ||
80
+ components.second !== undefined ||
81
+ components.millisecond !== undefined) {
82
+ const h = components.hour !== undefined
83
+ ? String(components.hour).padStart(2, "0")
84
+ : "00";
85
+ const mi = components.minute !== undefined
86
+ ? String(components.minute).padStart(2, "0")
87
+ : "00";
88
+ const s = components.second !== undefined
89
+ ? String(Math.floor(components.second)).padStart(2, "0")
90
+ : "00";
91
+ const ms = components.millisecond !== undefined
92
+ ? String(components.millisecond).padStart(3, "0")
93
+ : "000";
94
+ out += `T${h}:${mi}:${s}.${ms}`;
95
+ }
96
+ return out;
97
+ }
98
+ isLeap(y) {
99
+ return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
100
+ }
101
+ validate(input) {
102
+ if (typeof input === "string") {
103
+ return /^\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)?$/.test(input.trim());
104
+ }
105
+ if (typeof input === "object") {
106
+ const y = input.year ?? 0;
107
+ const m = input.month ?? 1;
108
+ const d = input.day ?? 1;
109
+ if (y < 0 || m < 1 || m > 12 || d < 1)
110
+ return false;
111
+ const daysInMonth = [
112
+ 31,
113
+ this.isLeap(y) ? 29 : 28,
114
+ 31,
115
+ 30,
116
+ 31,
117
+ 30,
118
+ 31,
119
+ 31,
120
+ 30,
121
+ 31,
122
+ 30,
123
+ 31,
124
+ ];
125
+ return d <= daysInMonth[m - 1];
126
+ }
127
+ return false;
128
+ }
129
+ getMetadata() {
130
+ return {
131
+ name: "Gregorian",
132
+ monthNames: [
133
+ "January",
134
+ "February",
135
+ "March",
136
+ "April",
137
+ "May",
138
+ "June",
139
+ "July",
140
+ "August",
141
+ "September",
142
+ "October",
143
+ "November",
144
+ "December",
145
+ ],
146
+ dayNames: [
147
+ "Sunday",
148
+ "Monday",
149
+ "Tuesday",
150
+ "Wednesday",
151
+ "Thursday",
152
+ "Friday",
153
+ "Saturday",
154
+ ],
155
+ monthsPerYear: 12,
156
+ epochYear: 1,
157
+ };
158
+ }
159
+ }
160
+ //# sourceMappingURL=gregorian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gregorian.js","sourceRoot":"","sources":["../../../src/drivers/gregorian.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ import { buildTimePart } from "../utils/tps-string";
2
+ import { gregorianToHijri, hijriToGregorian } from "../utils/calendar";
3
+ export class HijriDriver {
4
+ constructor() {
5
+ this.code = "hij";
6
+ this.name = "Hijri (Islamic Calendar)";
7
+ this.MONTH_NAMES = [
8
+ "Muharram",
9
+ "Safar",
10
+ "Rabi' al-Awwal",
11
+ "Rabi' al-Thani",
12
+ "Jumada al-Ula",
13
+ "Jumada al-Thani",
14
+ "Rajab",
15
+ "Sha'ban",
16
+ "Ramadan",
17
+ "Shawwal",
18
+ "Dhu al-Qi'dah",
19
+ "Dhu al-Hijjah",
20
+ ];
21
+ this.MONTH_NAMES_SHORT = [
22
+ "Muh",
23
+ "Saf",
24
+ "Rab I",
25
+ "Rab II",
26
+ "Jum I",
27
+ "Jum II",
28
+ "Raj",
29
+ "Sha",
30
+ "Ram",
31
+ "Shaw",
32
+ "Dhu Q",
33
+ "Dhu H",
34
+ ];
35
+ this.DAY_NAMES = [
36
+ "al-Ahad",
37
+ "al-Ithnayn",
38
+ "ath-Thulatha",
39
+ "al-Arbi'a",
40
+ "al-Khamis",
41
+ "al-Jumu'ah",
42
+ "as-Sabt",
43
+ ];
44
+ }
45
+ getComponentsFromDate(date) {
46
+ const { hy, hm, hd } = gregorianToHijri(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());
47
+ return {
48
+ calendar: this.code,
49
+ millennium: Math.floor(hy / 1000) + 1,
50
+ century: Math.floor((hy % 1000) / 100) + 1,
51
+ year: hy % 100,
52
+ month: hm,
53
+ day: hd,
54
+ hour: date.getUTCHours(),
55
+ minute: date.getUTCMinutes(),
56
+ second: date.getUTCSeconds(),
57
+ millisecond: date.getUTCMilliseconds(),
58
+ };
59
+ }
60
+ getDateFromComponents(components) {
61
+ let hy;
62
+ if (components.millennium !== undefined) {
63
+ const m = components.millennium ?? 0;
64
+ const c = components.century ?? 1;
65
+ const y = components.year ?? 0;
66
+ hy = (m - 1) * 1000 + (c - 1) * 100 + y;
67
+ }
68
+ else {
69
+ hy = components.year ?? 1;
70
+ }
71
+ const hm = components.month ?? 1;
72
+ const hd = components.day ?? 1;
73
+ const { gy, gm, gd } = hijriToGregorian(hy, hm, hd);
74
+ return new Date(Date.UTC(gy, gm - 1, gd, components.hour ?? 0, components.minute ?? 0, Math.floor(components.second ?? 0), components.millisecond ?? 0));
75
+ }
76
+ getFromDate(date) {
77
+ const comp = this.getComponentsFromDate(date);
78
+ return buildTimePart(comp);
79
+ }
80
+ parseDate(input, format) {
81
+ const trimmed = input.trim();
82
+ if (format === "short" ||
83
+ (trimmed.includes("/") && trimmed.split("/")[0].length <= 2)) {
84
+ const [day, month, year] = trimmed.split("/").map(Number);
85
+ return {
86
+ calendar: this.code,
87
+ millennium: Math.floor(year / 1000) + 1,
88
+ century: Math.floor((year % 1000) / 100) + 1,
89
+ year: year % 100,
90
+ month,
91
+ day,
92
+ };
93
+ }
94
+ const segments = trimmed.split(/[\s,T]+/);
95
+ const [fullYear, month, day] = segments[0].split("-").map(Number);
96
+ const result = {
97
+ calendar: this.code,
98
+ millennium: Math.floor(fullYear / 1000) + 1,
99
+ century: Math.floor((fullYear % 1000) / 100) + 1,
100
+ year: fullYear % 100,
101
+ month,
102
+ day,
103
+ };
104
+ if (segments[1]) {
105
+ const [h, m, s] = segments[1].split(":").map(Number);
106
+ result.hour = h ?? 0;
107
+ result.minute = m ?? 0;
108
+ result.second = s ?? 0;
109
+ }
110
+ return result;
111
+ }
112
+ format(components, format) {
113
+ const pad = (n) => String(n ?? 0).padStart(2, "0");
114
+ let fullYear;
115
+ if (components.millennium !== undefined) {
116
+ const m = components.millennium ?? 0;
117
+ const c = components.century ?? 1;
118
+ const y = components.year ?? 0;
119
+ fullYear = (m - 1) * 1000 + (c - 1) * 100 + y;
120
+ }
121
+ else {
122
+ fullYear = components.year ?? 0;
123
+ }
124
+ if (format === "short")
125
+ return `${components.day}/${pad(components.month)}/${fullYear}`;
126
+ if (format === "long") {
127
+ const mn = this.MONTH_NAMES[(components.month ?? 1) - 1];
128
+ return `${components.day} ${mn} ${fullYear}`;
129
+ }
130
+ let out = `${fullYear}-${pad(components.month)}-${pad(components.day)}`;
131
+ if (components.hour !== undefined) {
132
+ out += ` ${pad(components.hour)}:${pad(components.minute)}:${pad(Math.floor(components.second ?? 0))}`;
133
+ }
134
+ return out;
135
+ }
136
+ validate(input) {
137
+ let comp;
138
+ if (typeof input === "string") {
139
+ try {
140
+ comp = this.parseDate(input);
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ else {
147
+ comp = input;
148
+ }
149
+ const { year, month, day } = comp;
150
+ let fullYear;
151
+ if (comp.millennium !== undefined) {
152
+ fullYear =
153
+ ((comp.millennium ?? 0) - 1) * 1000 +
154
+ ((comp.century ?? 1) - 1) * 100 +
155
+ (year ?? 0);
156
+ }
157
+ else {
158
+ fullYear = year ?? 0;
159
+ }
160
+ if (fullYear < 1)
161
+ return false;
162
+ if (!month || month < 1 || month > 12)
163
+ return false;
164
+ if (!day || day < 1)
165
+ return false;
166
+ // leap check (cycle of 30 years)
167
+ const isLeap = new Set([2, 5, 7, 10, 13, 16, 18, 21, 24, 26, 29]).has(((fullYear - 1) % 30) + 1);
168
+ const maxDays = month === 12 && isLeap ? 30 : month % 2 === 1 ? 30 : 29;
169
+ return day <= maxDays;
170
+ }
171
+ getMetadata() {
172
+ return {
173
+ name: "Hijri (Islamic Calendar)",
174
+ monthNames: this.MONTH_NAMES,
175
+ monthNamesShort: this.MONTH_NAMES_SHORT,
176
+ dayNames: this.DAY_NAMES,
177
+ dayNamesShort: this.DAY_NAMES.map((d) => d.slice(0, 3)),
178
+ isLunar: true,
179
+ monthsPerYear: 12,
180
+ epochYear: 1,
181
+ };
182
+ }
183
+ }
184
+ //# sourceMappingURL=hijri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hijri.js","sourceRoot":"","sources":["../../../src/drivers/hijri.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { buildTimePart } from "../utils/tps-string";
2
+ import { GregorianDriver } from "./gregorian";
3
+ /**
4
+ * Holocene (Human Era) Calendar Driver
5
+ */
6
+ export class HoloceneDriver {
7
+ constructor() {
8
+ this.code = "holo";
9
+ this.name = "Holocene (Human Era)";
10
+ this.gregorian = new GregorianDriver();
11
+ this.YEAR_OFFSET = 10000;
12
+ }
13
+ getComponentsFromDate(date) {
14
+ const greg = this.gregorian.getComponentsFromDate(date);
15
+ const fullYear = date.getUTCFullYear() + this.YEAR_OFFSET;
16
+ return {
17
+ ...greg,
18
+ calendar: this.code,
19
+ millennium: Math.floor(fullYear / 1000) + 1,
20
+ century: Math.floor((fullYear % 1000) / 100) + 1,
21
+ year: fullYear % 100,
22
+ };
23
+ }
24
+ getDateFromComponents(components) {
25
+ const m = components.millennium ?? 0;
26
+ const c = components.century ?? 1;
27
+ const y = components.year ?? 0;
28
+ const holoYear = (m - 1) * 1000 + (c - 1) * 100 + y;
29
+ const gregYear = holoYear - this.YEAR_OFFSET;
30
+ return new Date(Date.UTC(gregYear, (components.month ?? 1) - 1, components.day ?? 1, components.hour ?? 0, components.minute ?? 0, Math.floor(components.second ?? 0), components.millisecond ??
31
+ Math.round(((components.second ?? 0) % 1) * 1000)));
32
+ }
33
+ getFromDate(date) {
34
+ const comp = this.getComponentsFromDate(date);
35
+ return buildTimePart(comp);
36
+ }
37
+ parseDate(input, _format) {
38
+ const m = input
39
+ .trim()
40
+ .match(/^(\d{4,5})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?)?$/);
41
+ if (!m)
42
+ throw new Error(`HoloceneDriver.parseDate: unsupported format "${input}"`);
43
+ const result = {
44
+ calendar: this.code,
45
+ year: parseInt(m[1], 10),
46
+ month: parseInt(m[2], 10),
47
+ day: parseInt(m[3], 10),
48
+ };
49
+ if (m[4] !== undefined)
50
+ result.hour = parseInt(m[4], 10);
51
+ if (m[5] !== undefined)
52
+ result.minute = parseInt(m[5], 10);
53
+ if (m[6] !== undefined)
54
+ result.second = parseInt(m[6], 10);
55
+ if (m[7] !== undefined)
56
+ result.millisecond = parseInt((m[7] + "000").slice(0, 3), 10);
57
+ return result;
58
+ }
59
+ format(components, _format) {
60
+ const pad = (n, w = 2) => String(n ?? 0).padStart(w, "0");
61
+ let holoYear;
62
+ if (components.millennium !== undefined) {
63
+ const m = components.millennium ?? 0;
64
+ const c = components.century ?? 1;
65
+ const y = components.year ?? 0;
66
+ holoYear = (m - 1) * 1000 + (c - 1) * 100 + y;
67
+ }
68
+ else {
69
+ holoYear = components.year ?? 0;
70
+ }
71
+ let out = `${String(holoYear).padStart(5, "0")}-${pad(components.month)}-${pad(components.day)}`;
72
+ if (components.hour !== undefined ||
73
+ components.minute !== undefined ||
74
+ components.second !== undefined) {
75
+ out += `T${pad(components.hour)}:${pad(components.minute)}:${pad(Math.floor(components.second ?? 0))}`;
76
+ }
77
+ return out;
78
+ }
79
+ validate(input) {
80
+ if (typeof input === "string") {
81
+ return /^\d{4,5}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)?$/.test(input.trim());
82
+ }
83
+ if (typeof input === "object") {
84
+ return this.gregorian.validate({
85
+ year: input.year,
86
+ month: input.month,
87
+ day: input.day,
88
+ });
89
+ }
90
+ return false;
91
+ }
92
+ getMetadata() {
93
+ return {
94
+ name: "Holocene (Human Era)",
95
+ monthNames: [
96
+ "January",
97
+ "February",
98
+ "March",
99
+ "April",
100
+ "May",
101
+ "June",
102
+ "July",
103
+ "August",
104
+ "September",
105
+ "October",
106
+ "November",
107
+ "December",
108
+ ],
109
+ isLunar: false,
110
+ monthsPerYear: 12,
111
+ epochYear: -10000,
112
+ };
113
+ }
114
+ }
115
+ //# sourceMappingURL=holocene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"holocene.js","sourceRoot":"","sources":["../../../src/drivers/holocene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ import { buildTimePart } from "../utils/tps-string";
2
+ import { gregorianToJdn, jdnToGregorian, julianToJdn, jdnToJulian, } from "../utils/calendar";
3
+ export class JulianDriver {
4
+ constructor() {
5
+ this.code = "jul";
6
+ this.name = "Julian Calendar";
7
+ this.MONTH_NAMES = [
8
+ "Januarius",
9
+ "Februarius",
10
+ "Martius",
11
+ "Aprilis",
12
+ "Maius",
13
+ "Junius",
14
+ "Julius",
15
+ "Augustus",
16
+ "September",
17
+ "October",
18
+ "November",
19
+ "December",
20
+ ];
21
+ this.MONTH_NAMES_SHORT = [
22
+ "Jan",
23
+ "Feb",
24
+ "Mar",
25
+ "Apr",
26
+ "May",
27
+ "Jun",
28
+ "Jul",
29
+ "Aug",
30
+ "Sep",
31
+ "Oct",
32
+ "Nov",
33
+ "Dec",
34
+ ];
35
+ this.DAYS_IN_MONTH = [
36
+ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,
37
+ ];
38
+ }
39
+ getComponentsFromDate(date) {
40
+ const jdn = gregorianToJdn(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());
41
+ const { jy, jm, jd } = jdnToJulian(jdn);
42
+ return {
43
+ calendar: this.code,
44
+ millennium: Math.floor(jy / 1000) + 1,
45
+ century: Math.floor((jy % 1000) / 100) + 1,
46
+ year: jy % 100,
47
+ month: jm,
48
+ day: jd,
49
+ hour: date.getUTCHours(),
50
+ minute: date.getUTCMinutes(),
51
+ second: date.getUTCSeconds(),
52
+ millisecond: date.getUTCMilliseconds(),
53
+ };
54
+ }
55
+ getDateFromComponents(components) {
56
+ let fullYear;
57
+ if (components.millennium !== undefined) {
58
+ const m = components.millennium ?? 0;
59
+ const c = components.century ?? 1;
60
+ const y = components.year ?? 0;
61
+ fullYear = (m - 1) * 1000 + (c - 1) * 100 + y;
62
+ }
63
+ else {
64
+ fullYear = components.year ?? 1;
65
+ }
66
+ const jm = components.month ?? 1;
67
+ const jd = components.day ?? 1;
68
+ const jdn = julianToJdn(fullYear, jm, jd);
69
+ const { gy, gm, gd } = jdnToGregorian(jdn);
70
+ return new Date(Date.UTC(gy, gm - 1, gd, components.hour ?? 0, components.minute ?? 0, Math.floor(components.second ?? 0), components.millisecond ?? 0));
71
+ }
72
+ getFromDate(date) {
73
+ const comp = this.getComponentsFromDate(date);
74
+ return buildTimePart(comp);
75
+ }
76
+ parseDate(input, _format) {
77
+ const trimmed = input.trim();
78
+ const m = trimmed.match(/^(\d{4})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?)?$/);
79
+ if (!m)
80
+ throw new Error(`JulianDriver.parseDate: unsupported format "${input}"`);
81
+ const fullYear = parseInt(m[1], 10);
82
+ const result = {
83
+ calendar: this.code,
84
+ millennium: Math.floor(fullYear / 1000) + 1,
85
+ century: Math.floor((fullYear % 1000) / 100) + 1,
86
+ year: fullYear % 100,
87
+ month: parseInt(m[2], 10),
88
+ day: parseInt(m[3], 10),
89
+ };
90
+ if (m[4] !== undefined)
91
+ result.hour = parseInt(m[4], 10);
92
+ if (m[5] !== undefined)
93
+ result.minute = parseInt(m[5], 10);
94
+ if (m[6] !== undefined)
95
+ result.second = parseInt(m[6], 10);
96
+ if (m[7] !== undefined)
97
+ result.millisecond = parseInt((m[7] + "000").slice(0, 3), 10);
98
+ return result;
99
+ }
100
+ format(components, _format) {
101
+ const pad = (n, w = 2) => String(n ?? 0).padStart(w, "0");
102
+ let fullYear;
103
+ if (components.millennium !== undefined) {
104
+ const m = components.millennium ?? 0;
105
+ const c = components.century ?? 1;
106
+ const y = components.year ?? 0;
107
+ fullYear = (m - 1) * 1000 + (c - 1) * 100 + y;
108
+ }
109
+ else {
110
+ fullYear = components.year ?? 0;
111
+ }
112
+ let out = `${pad(fullYear, 4)}-${pad(components.month)}-${pad(components.day)}`;
113
+ if (components.hour !== undefined ||
114
+ components.minute !== undefined ||
115
+ components.second !== undefined ||
116
+ components.millisecond !== undefined) {
117
+ out += `T${pad(components.hour)}:${pad(components.minute)}:${pad(Math.floor(components.second ?? 0))}`;
118
+ if (components.millisecond !== undefined)
119
+ out += `.${pad(components.millisecond, 3)}`;
120
+ }
121
+ return out;
122
+ }
123
+ validate(input) {
124
+ if (typeof input === "string") {
125
+ return /^\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)?$/.test(input.trim());
126
+ }
127
+ if (typeof input === "object") {
128
+ let fullYear;
129
+ if (input.millennium !== undefined) {
130
+ fullYear =
131
+ ((input.millennium ?? 0) - 1) * 1000 +
132
+ ((input.century ?? 1) - 1) * 100 +
133
+ (input.year ?? 0);
134
+ }
135
+ else {
136
+ fullYear = input.year ?? 0;
137
+ }
138
+ const { month, day } = input;
139
+ if (month === undefined || day === undefined)
140
+ return false;
141
+ if (month < 1 || month > 12 || day < 1)
142
+ return false;
143
+ let maxDay = this.DAYS_IN_MONTH[month - 1];
144
+ if (month === 2 && fullYear % 4 === 0)
145
+ maxDay = 29;
146
+ return day <= maxDay;
147
+ }
148
+ return false;
149
+ }
150
+ getMetadata() {
151
+ return {
152
+ name: "Julian Calendar",
153
+ monthNames: this.MONTH_NAMES,
154
+ monthNamesShort: this.MONTH_NAMES_SHORT,
155
+ isLunar: false,
156
+ monthsPerYear: 12,
157
+ epochYear: 1,
158
+ };
159
+ }
160
+ }
161
+ //# sourceMappingURL=julian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"julian.js","sourceRoot":"","sources":["../../../src/drivers/julian.ts"],"names":[],"mappings":"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"}