@nextera.one/tps-standard 0.5.33 → 0.6.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 (105) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +133 -56
  3. package/dist/date.d.ts +54 -0
  4. package/dist/date.js +174 -0
  5. package/dist/date.js.map +1 -0
  6. package/dist/driver-manager.d.ts +34 -0
  7. package/dist/driver-manager.js +53 -0
  8. package/dist/driver-manager.js.map +1 -0
  9. package/dist/drivers/chinese.d.ts +25 -0
  10. package/dist/drivers/chinese.js +485 -0
  11. package/dist/drivers/chinese.js.map +1 -0
  12. package/dist/drivers/gregorian.d.ts +3 -5
  13. package/dist/drivers/gregorian.js +26 -19
  14. package/dist/drivers/gregorian.js.map +1 -1
  15. package/dist/drivers/hijri.d.ts +1 -16
  16. package/dist/drivers/hijri.js +9 -102
  17. package/dist/drivers/hijri.js.map +1 -1
  18. package/dist/drivers/holocene.d.ts +6 -3
  19. package/dist/drivers/holocene.js +7 -20
  20. package/dist/drivers/holocene.js.map +1 -1
  21. package/dist/drivers/julian.d.ts +3 -10
  22. package/dist/drivers/julian.js +11 -71
  23. package/dist/drivers/julian.js.map +1 -1
  24. package/dist/drivers/persian.d.ts +1 -6
  25. package/dist/drivers/persian.js +17 -92
  26. package/dist/drivers/persian.js.map +1 -1
  27. package/dist/drivers/tps.d.ts +11 -28
  28. package/dist/drivers/tps.js +8 -58
  29. package/dist/drivers/tps.js.map +1 -1
  30. package/dist/drivers/unix.d.ts +5 -6
  31. package/dist/drivers/unix.js +10 -32
  32. package/dist/drivers/unix.js.map +1 -1
  33. package/dist/esm/date.js +170 -0
  34. package/dist/esm/date.js.map +1 -0
  35. package/dist/esm/driver-manager.js +49 -0
  36. package/dist/esm/driver-manager.js.map +1 -0
  37. package/dist/esm/drivers/chinese.js +481 -0
  38. package/dist/esm/drivers/chinese.js.map +1 -0
  39. package/dist/esm/drivers/gregorian.js +160 -0
  40. package/dist/esm/drivers/gregorian.js.map +1 -0
  41. package/dist/esm/drivers/hijri.js +184 -0
  42. package/dist/esm/drivers/hijri.js.map +1 -0
  43. package/dist/esm/drivers/holocene.js +115 -0
  44. package/dist/esm/drivers/holocene.js.map +1 -0
  45. package/dist/esm/drivers/julian.js +161 -0
  46. package/dist/esm/drivers/julian.js.map +1 -0
  47. package/dist/esm/drivers/persian.js +190 -0
  48. package/dist/esm/drivers/persian.js.map +1 -0
  49. package/dist/esm/drivers/tps.js +181 -0
  50. package/dist/esm/drivers/tps.js.map +1 -0
  51. package/dist/esm/drivers/unix.js +50 -0
  52. package/dist/esm/drivers/unix.js.map +1 -0
  53. package/dist/esm/index.js +873 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/esm/types.js +28 -0
  56. package/dist/esm/types.js.map +1 -0
  57. package/dist/esm/uid.js +221 -0
  58. package/dist/esm/uid.js.map +1 -0
  59. package/dist/esm/utils/calendar.js +126 -0
  60. package/dist/esm/utils/calendar.js.map +1 -0
  61. package/dist/esm/utils/env.js +76 -0
  62. package/dist/esm/utils/env.js.map +1 -0
  63. package/dist/esm/utils/timezone.js +168 -0
  64. package/dist/esm/utils/timezone.js.map +1 -0
  65. package/dist/esm/utils/tps-string.js +160 -0
  66. package/dist/esm/utils/tps-string.js.map +1 -0
  67. package/dist/index.d.ts +84 -466
  68. package/dist/index.js +430 -1095
  69. package/dist/index.js.map +1 -1
  70. package/dist/types.d.ts +103 -0
  71. package/dist/types.js +31 -0
  72. package/dist/types.js.map +1 -0
  73. package/dist/uid.d.ts +48 -0
  74. package/dist/uid.js +225 -0
  75. package/dist/uid.js.map +1 -0
  76. package/dist/utils/calendar.d.ts +55 -0
  77. package/dist/utils/calendar.js +136 -0
  78. package/dist/utils/calendar.js.map +1 -0
  79. package/dist/utils/env.d.ts +12 -0
  80. package/dist/utils/env.js +79 -0
  81. package/dist/utils/env.js.map +1 -0
  82. package/dist/utils/timezone.d.ts +32 -0
  83. package/dist/utils/timezone.js +173 -0
  84. package/dist/utils/timezone.js.map +1 -0
  85. package/dist/utils/tps-string.d.ts +12 -0
  86. package/dist/utils/tps-string.js +164 -0
  87. package/dist/utils/tps-string.js.map +1 -0
  88. package/package.json +20 -5
  89. package/src/date.ts +243 -0
  90. package/src/driver-manager.ts +54 -0
  91. package/src/drivers/chinese.ts +542 -0
  92. package/src/drivers/gregorian.ts +29 -27
  93. package/src/drivers/hijri.ts +13 -113
  94. package/src/drivers/holocene.ts +11 -12
  95. package/src/drivers/julian.ts +18 -72
  96. package/src/drivers/persian.ts +25 -92
  97. package/src/drivers/tps.ts +16 -55
  98. package/src/drivers/unix.ts +12 -33
  99. package/src/index.ts +384 -1556
  100. package/src/types.ts +131 -0
  101. package/src/uid.ts +308 -0
  102. package/src/utils/calendar.ts +161 -0
  103. package/src/utils/env.ts +88 -0
  104. package/src/utils/timezone.ts +182 -0
  105. package/src/utils/tps-string.ts +166 -0
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Shared Calendar Math Utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.gregorianToJdn = gregorianToJdn;
7
+ exports.jdnToGregorian = jdnToGregorian;
8
+ exports.julianToJdn = julianToJdn;
9
+ exports.jdnToJulian = jdnToJulian;
10
+ exports.persianToJdn = persianToJdn;
11
+ exports.jdnToPersian = jdnToPersian;
12
+ exports.gregorianToHijri = gregorianToHijri;
13
+ exports.hijriToGregorian = hijriToGregorian;
14
+ /**
15
+ * Gregorian -> Julian Day Number
16
+ */
17
+ function gregorianToJdn(gy, gm, gd) {
18
+ const a = Math.floor((14 - gm) / 12);
19
+ const y = gy + 4800 - a;
20
+ const m = gm + 12 * a - 3;
21
+ return (gd +
22
+ Math.floor((153 * m + 2) / 5) +
23
+ 365 * y +
24
+ Math.floor(y / 4) -
25
+ Math.floor(y / 100) +
26
+ Math.floor(y / 400) -
27
+ 32045);
28
+ }
29
+ /**
30
+ * Julian Day Number -> Gregorian
31
+ */
32
+ function jdnToGregorian(jdn) {
33
+ const a = jdn + 32044;
34
+ const b = Math.floor((4 * a + 3) / 146097);
35
+ const c = a - Math.floor((146097 * b) / 4);
36
+ const d = Math.floor((4 * c + 3) / 1461);
37
+ const e = c - Math.floor((1461 * d) / 4);
38
+ const m = Math.floor((5 * e + 2) / 153);
39
+ const gd = e - Math.floor((153 * m + 2) / 5) + 1;
40
+ const gm = m + 3 - 12 * Math.floor(m / 10);
41
+ const gy = 100 * b + d - 4800 + Math.floor(m / 10);
42
+ return { gy, gm, gd };
43
+ }
44
+ /**
45
+ * Julian -> Julian Day Number
46
+ */
47
+ function julianToJdn(jy, jm, jd) {
48
+ const a = Math.floor((14 - jm) / 12);
49
+ const y = jy + 4800 - a;
50
+ const m = jm + 12 * a - 3;
51
+ return (jd + Math.floor((153 * m + 2) / 5) + 365 * y + Math.floor(y / 4) - 32083);
52
+ }
53
+ /**
54
+ * Julian Day Number -> Julian
55
+ */
56
+ function jdnToJulian(jdn) {
57
+ const c = jdn + 32082;
58
+ const d = Math.floor((4 * c + 3) / 1461);
59
+ const e = c - Math.floor((1461 * d) / 4);
60
+ const m = Math.floor((5 * e + 2) / 153);
61
+ const jd = e - Math.floor((153 * m + 2) / 5) + 1;
62
+ const jm = m + 3 - 12 * Math.floor(m / 10);
63
+ const jy = d - 4800 + Math.floor(m / 10);
64
+ return { jy, jm, jd };
65
+ }
66
+ /**
67
+ * Persian -> Julian Day Number
68
+ */
69
+ function persianToJdn(jy, jm, jd) {
70
+ const EPOCH = 1948320;
71
+ const epbase = jy - (jy >= 0 ? 474 : 473);
72
+ const epyear = 474 + (epbase % 2820);
73
+ return (jd +
74
+ (jm <= 7 ? (jm - 1) * 31 : (jm - 1) * 30 + 6) +
75
+ Math.floor((epyear * 682 - 110) / 2816) +
76
+ (epyear - 1) * 365 +
77
+ Math.floor(epbase / 2820) * 1029983 +
78
+ EPOCH -
79
+ 1);
80
+ }
81
+ /**
82
+ * Julian Day Number -> Persian
83
+ */
84
+ function jdnToPersian(jdn) {
85
+ const depoch = jdn - persianToJdn(475, 1, 1);
86
+ const cycle = Math.floor(depoch / 1029983);
87
+ const cyear = depoch % 1029983;
88
+ let ycycle;
89
+ if (cyear === 1029982) {
90
+ ycycle = 2820;
91
+ }
92
+ else {
93
+ const aux1 = Math.floor(cyear / 366);
94
+ const aux2 = cyear % 366;
95
+ ycycle =
96
+ Math.floor((2134 * aux1 + 2816 * aux2 + 2815) / 1028522) + aux1 + 1;
97
+ }
98
+ const jy = ycycle + 2820 * cycle + 474;
99
+ const yday = jdn - persianToJdn(jy, 1, 1) + 1;
100
+ const jm = yday <= 186 ? Math.ceil(yday / 31) : Math.ceil((yday - 6) / 30);
101
+ const jd = jdn - persianToJdn(jy, jm, 1) + 1;
102
+ return { jy: jy <= 0 ? jy - 1 : jy, jm, jd };
103
+ }
104
+ /**
105
+ * Convert Gregorian to Hijri (Tabular Islamic Calendar).
106
+ */
107
+ function gregorianToHijri(gy, gm, gd) {
108
+ const jdn = gregorianToJdn(gy, gm, gd);
109
+ const L = jdn - 1948440 + 10632;
110
+ const N = Math.floor((L - 1) / 10631);
111
+ const L2 = L - 10631 * N + 354;
112
+ const J = Math.floor((10985 - L2) / 5316) * Math.floor((50 * L2) / 17719) +
113
+ Math.floor(L2 / 5670) * Math.floor((43 * L2) / 15238);
114
+ const L3 = L2 -
115
+ Math.floor((30 - J) / 15) * Math.floor((17719 * J) / 50) -
116
+ Math.floor(J / 16) * Math.floor((15238 * J) / 43) +
117
+ 29;
118
+ const hm = Math.floor((24 * L3) / 709);
119
+ const hd = L3 - Math.floor((709 * hm) / 24);
120
+ const hy = 30 * N + J - 30;
121
+ return { hy, hm, hd };
122
+ }
123
+ /**
124
+ * Convert Hijri to Gregorian.
125
+ */
126
+ function hijriToGregorian(hy, hm, hd) {
127
+ const jdn = Math.floor((11 * hy + 3) / 30) +
128
+ 354 * hy +
129
+ 30 * hm -
130
+ Math.floor((hm - 1) / 2) +
131
+ hd +
132
+ 1948440 -
133
+ 385;
134
+ return jdnToGregorian(jdn);
135
+ }
136
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/utils/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Environment & Compatibility Layer
3
+ * Abstracts Node.js vs Browser differences.
4
+ */
5
+ export declare const Env: {
6
+ isNode: boolean;
7
+ randomBytes(length: number): Uint8Array;
8
+ deflate(data: Uint8Array): Uint8Array;
9
+ inflate(data: Uint8Array): Uint8Array;
10
+ signEd25519(data: Uint8Array, privateKey: any): Uint8Array;
11
+ verifyEd25519(data: Uint8Array, signature: Uint8Array, publicKey: any): boolean;
12
+ };
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * Environment & Compatibility Layer
4
+ * Abstracts Node.js vs Browser differences.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.Env = void 0;
8
+ /* eslint-disable @typescript-eslint/no-require-imports */
9
+ const isNode = typeof require !== "undefined";
10
+ /**
11
+ * Node.js crypto module (conditional)
12
+ */
13
+ const crypto = isNode ? require("crypto") : null;
14
+ /**
15
+ * Node.js zlib module (conditional)
16
+ */
17
+ const zlib = isNode ? require("zlib") : null;
18
+ exports.Env = {
19
+ isNode,
20
+ randomBytes(length) {
21
+ if (isNode && crypto) {
22
+ return new Uint8Array(crypto.randomBytes(length));
23
+ }
24
+ if (typeof window !== "undefined" && window.crypto) {
25
+ return window.crypto.getRandomValues(new Uint8Array(length));
26
+ }
27
+ throw new Error("TPS: randomBytes not available in this environment");
28
+ },
29
+ deflate(data) {
30
+ if (isNode && zlib) {
31
+ return new Uint8Array(zlib.deflateRawSync(data));
32
+ }
33
+ throw new Error("TPS: deflate not available in this environment");
34
+ },
35
+ inflate(data) {
36
+ if (isNode && zlib) {
37
+ return new Uint8Array(zlib.inflateRawSync(data));
38
+ }
39
+ throw new Error("TPS: inflate not available in this environment");
40
+ },
41
+ signEd25519(data, privateKey) {
42
+ if (isNode && crypto) {
43
+ let key;
44
+ if (typeof privateKey === "string") {
45
+ if (privateKey.includes("PRIVATE KEY")) {
46
+ key = privateKey;
47
+ }
48
+ else {
49
+ key = crypto.createPrivateKey({
50
+ key: Buffer.from(privateKey, "hex"),
51
+ format: "der",
52
+ type: "pkcs8",
53
+ });
54
+ }
55
+ }
56
+ else if (typeof privateKey === "object" &&
57
+ privateKey !== null &&
58
+ "asymmetricKeyType" in privateKey) {
59
+ key = privateKey;
60
+ }
61
+ else {
62
+ key = crypto.createPrivateKey({
63
+ key: Buffer.from(privateKey),
64
+ format: "der",
65
+ type: "pkcs8",
66
+ });
67
+ }
68
+ return new Uint8Array(crypto.sign(null, data, key));
69
+ }
70
+ throw new Error("TPS: signEd25519 not available in this environment");
71
+ },
72
+ verifyEd25519(data, signature, publicKey) {
73
+ if (isNode && crypto) {
74
+ return crypto.verify(null, data, publicKey, signature);
75
+ }
76
+ throw new Error("TPS: verifyEd25519 not available in this environment");
77
+ },
78
+ };
79
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/utils/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Timezone Utilities
3
+ *
4
+ * Provides lightweight, zero-dependency helpers for converting between
5
+ * UTC timestamps and local timestamps in a given IANA timezone or
6
+ * fixed UTC offset.
7
+ *
8
+ * Used by `TPS.toDate()` when the parsed extensions include a `tz` key.
9
+ *
10
+ * Examples:
11
+ * tz=Asia/Tehran → IANA timezone name
12
+ * tz=+03:30 → fixed UTC offset
13
+ * tz=IRST → abbreviated names (best-effort, common ones mapped)
14
+ */
15
+ /**
16
+ * Given a UTC timestamp (ms), returns the equivalent *local* millisecond
17
+ * value for the given `tz` string.
18
+ *
19
+ * This is useful for display: `utcMs + offsetMs` gives local wall-clock time.
20
+ */
21
+ export declare function utcToLocal(utcMs: number, tz: string): number;
22
+ /**
23
+ * Given a *local* timestamp (ms) in `tz`, returns the equivalent UTC ms.
24
+ *
25
+ * Used when converting a calendar date expressed in local time back to UTC.
26
+ */
27
+ export declare function localToUtc(localMs: number, tz: string): number;
28
+ /**
29
+ * Returns the UTC offset string (e.g. "+03:30") for a given IANA timezone
30
+ * at the current moment. Useful for formatting and display.
31
+ */
32
+ export declare function getOffsetString(tz: string, atUtcMs?: number): string;
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ /**
3
+ * Timezone Utilities
4
+ *
5
+ * Provides lightweight, zero-dependency helpers for converting between
6
+ * UTC timestamps and local timestamps in a given IANA timezone or
7
+ * fixed UTC offset.
8
+ *
9
+ * Used by `TPS.toDate()` when the parsed extensions include a `tz` key.
10
+ *
11
+ * Examples:
12
+ * tz=Asia/Tehran → IANA timezone name
13
+ * tz=+03:30 → fixed UTC offset
14
+ * tz=IRST → abbreviated names (best-effort, common ones mapped)
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.utcToLocal = utcToLocal;
18
+ exports.localToUtc = localToUtc;
19
+ exports.getOffsetString = getOffsetString;
20
+ /** Map of common abbreviated timezone names to IANA names. */
21
+ const TZ_ABBR = {
22
+ // Middle East
23
+ IRST: "Asia/Tehran",
24
+ IRDT: "Asia/Tehran",
25
+ AST: "Asia/Riyadh",
26
+ AST3: "Asia/Riyadh",
27
+ // Europe
28
+ CET: "Europe/Paris",
29
+ CEST: "Europe/Paris",
30
+ EET: "Europe/Athens",
31
+ EEST: "Europe/Athens",
32
+ WET: "Europe/Lisbon",
33
+ WEST: "Europe/Lisbon",
34
+ // Americas
35
+ EST: "America/New_York",
36
+ EDT: "America/New_York",
37
+ CST: "America/Chicago",
38
+ CDT: "America/Chicago",
39
+ MST: "America/Denver",
40
+ MDT: "America/Denver",
41
+ PST: "America/Los_Angeles",
42
+ PDT: "America/Los_Angeles",
43
+ // Asia Pacific
44
+ JST: "Asia/Tokyo",
45
+ KST: "Asia/Seoul",
46
+ IST: "Asia/Kolkata",
47
+ CST8: "Asia/Shanghai",
48
+ AEST: "Australia/Sydney",
49
+ AEDT: "Australia/Sydney",
50
+ // UTC variants
51
+ UTC: "UTC",
52
+ GMT: "UTC",
53
+ Z: "UTC",
54
+ };
55
+ /**
56
+ * Parse a `tz` string into an IANA timezone name, or return null if unrecognized.
57
+ */
58
+ function resolveIANA(tz) {
59
+ if (!tz)
60
+ return null;
61
+ // Direct IANA name (e.g. "Asia/Tehran")
62
+ if (tz.includes("/"))
63
+ return tz;
64
+ // Common abbreviation lookup
65
+ const abbr = TZ_ABBR[tz.toUpperCase()];
66
+ if (abbr)
67
+ return abbr;
68
+ return null;
69
+ }
70
+ /**
71
+ * Parses a fixed offset string like "+03:30", "-05:00", "+0530" into ms.
72
+ * Returns NaN if the string is not a valid offset.
73
+ */
74
+ function parseFixedOffset(tz) {
75
+ const m = tz.match(/^([+-])(\d{1,2}):?(\d{2})$/);
76
+ if (!m)
77
+ return NaN;
78
+ const sign = m[1] === "+" ? 1 : -1;
79
+ const h = parseInt(m[2], 10);
80
+ const min = parseInt(m[3], 10);
81
+ return sign * (h * 60 + min) * 60000;
82
+ }
83
+ /**
84
+ * Returns the UTC offset in milliseconds for a given IANA timezone at a
85
+ * specific UTC moment. Uses `Intl.DateTimeFormat` for correctness.
86
+ *
87
+ * Returns 0 (UTC) if the timezone is unrecognised by the runtime.
88
+ */
89
+ function getIANAOffsetMs(ianaName, atUtcMs) {
90
+ try {
91
+ // Build a formatter that reports both UTC and local time parts
92
+ const fmt = new Intl.DateTimeFormat("en-US", {
93
+ timeZone: ianaName,
94
+ year: "numeric",
95
+ month: "2-digit",
96
+ day: "2-digit",
97
+ hour: "2-digit",
98
+ minute: "2-digit",
99
+ second: "2-digit",
100
+ hour12: false,
101
+ });
102
+ const parts = Object.fromEntries(fmt.formatToParts(new Date(atUtcMs)).map((p) => [p.type, p.value]));
103
+ // Reconstruct the local time as UTC
104
+ const localMs = Date.UTC(parseInt(parts.year), parseInt(parts.month) - 1, parseInt(parts.day), parseInt(parts.hour === "24" ? "0" : parts.hour), parseInt(parts.minute), parseInt(parts.second));
105
+ return localMs - atUtcMs;
106
+ }
107
+ catch {
108
+ return 0;
109
+ }
110
+ }
111
+ /**
112
+ * Given a UTC timestamp (ms), returns the equivalent *local* millisecond
113
+ * value for the given `tz` string.
114
+ *
115
+ * This is useful for display: `utcMs + offsetMs` gives local wall-clock time.
116
+ */
117
+ function utcToLocal(utcMs, tz) {
118
+ // Try fixed offset first (e.g. "+03:30")
119
+ const fixed = parseFixedOffset(tz);
120
+ if (!isNaN(fixed))
121
+ return utcMs + fixed;
122
+ const iana = resolveIANA(tz);
123
+ if (!iana)
124
+ return utcMs; // Unknown tz — return UTC unchanged
125
+ return utcMs + getIANAOffsetMs(iana, utcMs);
126
+ }
127
+ /**
128
+ * Given a *local* timestamp (ms) in `tz`, returns the equivalent UTC ms.
129
+ *
130
+ * Used when converting a calendar date expressed in local time back to UTC.
131
+ */
132
+ function localToUtc(localMs, tz) {
133
+ // Try fixed offset first
134
+ const fixed = parseFixedOffset(tz);
135
+ if (!isNaN(fixed))
136
+ return localMs - fixed;
137
+ const iana = resolveIANA(tz);
138
+ if (!iana)
139
+ return localMs;
140
+ // Approximation: compute the offset at the approximate UTC moment
141
+ // (offset iteration is overkill for a scheduling library)
142
+ const approxUtcMs = localMs - getIANAOffsetMs(iana, localMs);
143
+ // One correction pass for DST edge-cases
144
+ const correctedOffset = getIANAOffsetMs(iana, approxUtcMs);
145
+ return localMs - correctedOffset;
146
+ }
147
+ /**
148
+ * Returns the UTC offset string (e.g. "+03:30") for a given IANA timezone
149
+ * at the current moment. Useful for formatting and display.
150
+ */
151
+ function getOffsetString(tz, atUtcMs = Date.now()) {
152
+ // Fast-path for UTC/GMT/Z
153
+ const upper = tz.toUpperCase();
154
+ if (upper === "UTC" || upper === "GMT" || upper === "Z")
155
+ return "+00:00";
156
+ const fixed = parseFixedOffset(tz);
157
+ if (!isNaN(fixed))
158
+ return tz;
159
+ const iana = resolveIANA(tz);
160
+ if (!iana)
161
+ return "+00:00";
162
+ const offsetMs = getIANAOffsetMs(iana, atUtcMs);
163
+ const sign = offsetMs >= 0 ? "+" : "-";
164
+ const abs = Math.abs(offsetMs);
165
+ const h = Math.floor(abs / 3600000)
166
+ .toString()
167
+ .padStart(2, "0");
168
+ const m = Math.floor((abs % 3600000) / 60000)
169
+ .toString()
170
+ .padStart(2, "0");
171
+ return `${sign}${h}:${m}`;
172
+ }
173
+ //# sourceMappingURL=timezone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timezone.js","sourceRoot":"","sources":["../../src/utils/timezone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { TPSComponents, TimeOrder } from "../types";
2
+ /**
3
+ * Generate the canonical `T:` time string for a set of components.
4
+ */
5
+ export declare function buildTimePart(comp: TPSComponents): string;
6
+ /**
7
+ * Parse the time portion of a TPS string into components.
8
+ */
9
+ export declare function parseTimeString(input: string): {
10
+ components: Partial<TPSComponents>;
11
+ order: TimeOrder;
12
+ } | null;
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildTimePart = buildTimePart;
4
+ exports.parseTimeString = parseTimeString;
5
+ const types_1 = require("../types");
6
+ /**
7
+ * Generate the canonical `T:` time string for a set of components.
8
+ */
9
+ function buildTimePart(comp) {
10
+ const calendar = (comp.calendar || "").toLowerCase();
11
+ if (!/^[a-z]{3,4}$/.test(calendar)) {
12
+ throw new Error(`Invalid calendar code '${comp.calendar}'. Calendar code width must be 3–4 lowercase letters.`);
13
+ }
14
+ let time = `T:${calendar}`;
15
+ if (calendar === types_1.DefaultCalendars.UNIX) {
16
+ if (comp.unixSeconds !== undefined) {
17
+ time += `.s${comp.unixSeconds}`;
18
+ }
19
+ return time;
20
+ }
21
+ const tokens = [
22
+ ["m", comp.millennium, 8],
23
+ ["c", comp.century, 7],
24
+ ["y", comp.year, 6],
25
+ ["m", comp.month, 5],
26
+ ["d", comp.day, 4],
27
+ ["h", comp.hour, 3],
28
+ ["m", comp.minute, 2],
29
+ ["s", comp.second, 1],
30
+ ["m", comp.millisecond, 0],
31
+ ];
32
+ const order = comp.order || types_1.TimeOrder.DESC;
33
+ const activeTokens = order === types_1.TimeOrder.ASC ? [...tokens].reverse() : tokens;
34
+ for (const [pref, val] of activeTokens) {
35
+ if (val !== undefined) {
36
+ time += `.${pref}${val}`;
37
+ }
38
+ }
39
+ if (comp.signature) {
40
+ time += `!${comp.signature}`;
41
+ }
42
+ return time;
43
+ }
44
+ /**
45
+ * Parse the time portion of a TPS string into components.
46
+ */
47
+ function parseTimeString(input) {
48
+ let s = input.trim();
49
+ s = s.split(/[!;?#]/)[0];
50
+ if (s.startsWith("T:"))
51
+ s = s.slice(2);
52
+ const parts = s.split(".");
53
+ if (parts.length === 0)
54
+ return null;
55
+ const calendar = parts[0];
56
+ const comp = { calendar };
57
+ const fixedRankMap = {
58
+ c: 7,
59
+ y: 6,
60
+ d: 4,
61
+ h: 3,
62
+ s: 1,
63
+ };
64
+ let initialOrder = types_1.TimeOrder.DESC;
65
+ if (calendar !== types_1.DefaultCalendars.UNIX) {
66
+ const nonMRanks = [];
67
+ for (let i = 1; i < parts.length; i++) {
68
+ const pr = parts[i]?.charAt(0);
69
+ if (pr && pr in fixedRankMap)
70
+ nonMRanks.push(fixedRankMap[pr]);
71
+ }
72
+ if (nonMRanks.length >= 2) {
73
+ const isAsc = nonMRanks.every((v, i, a) => i === 0 || a[i - 1] <= v);
74
+ if (isAsc)
75
+ initialOrder = types_1.TimeOrder.ASC;
76
+ }
77
+ }
78
+ const assignMRank = (lastRank, ord) => {
79
+ if (ord === types_1.TimeOrder.DESC) {
80
+ if (lastRank === null)
81
+ return 8;
82
+ if (lastRank > 5)
83
+ return 5;
84
+ if (lastRank > 2)
85
+ return 2;
86
+ return 0;
87
+ }
88
+ else {
89
+ if (lastRank === null)
90
+ return 0;
91
+ if (lastRank < 2)
92
+ return 2;
93
+ if (lastRank < 5)
94
+ return 5;
95
+ return 8;
96
+ }
97
+ };
98
+ const ranks = [];
99
+ let lastAssignedRank = null;
100
+ for (let i = 1; i < parts.length; i++) {
101
+ const token = parts[i];
102
+ if (!token)
103
+ continue;
104
+ const prefix = token.charAt(0);
105
+ const value = token.slice(1);
106
+ if (calendar === types_1.DefaultCalendars.UNIX && prefix === "s") {
107
+ comp.unixSeconds = parseFloat(value);
108
+ ranks.push(9);
109
+ continue;
110
+ }
111
+ if (prefix === "m") {
112
+ const rank = assignMRank(lastAssignedRank, initialOrder);
113
+ switch (rank) {
114
+ case 8:
115
+ comp.millennium = parseInt(value, 10);
116
+ break;
117
+ case 5:
118
+ comp.month = parseInt(value, 10);
119
+ break;
120
+ case 2:
121
+ comp.minute = parseInt(value, 10);
122
+ break;
123
+ case 0:
124
+ comp.millisecond = parseInt(value, 10);
125
+ break;
126
+ }
127
+ ranks.push(rank);
128
+ lastAssignedRank = rank;
129
+ }
130
+ else {
131
+ const rank = fixedRankMap[prefix];
132
+ if (rank !== undefined) {
133
+ switch (prefix) {
134
+ case "c":
135
+ comp.century = parseInt(value, 10);
136
+ break;
137
+ case "y":
138
+ comp.year = parseInt(value, 10);
139
+ break;
140
+ case "d":
141
+ comp.day = parseInt(value, 10);
142
+ break;
143
+ case "h":
144
+ comp.hour = parseInt(value, 10);
145
+ break;
146
+ case "s":
147
+ comp.second = parseFloat(value);
148
+ break;
149
+ }
150
+ ranks.push(rank);
151
+ lastAssignedRank = rank;
152
+ }
153
+ }
154
+ }
155
+ let order = types_1.TimeOrder.DESC;
156
+ if (ranks.length > 1) {
157
+ const isAsc = ranks.every((v, i, a) => i === 0 || a[i - 1] <= v);
158
+ const isDesc = ranks.every((v, i, a) => i === 0 || a[i - 1] >= v);
159
+ if (isAsc && !isDesc)
160
+ order = types_1.TimeOrder.ASC;
161
+ }
162
+ return { components: comp, order };
163
+ }
164
+ //# sourceMappingURL=tps-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tps-string.js","sourceRoot":"","sources":["../../src/utils/tps-string.ts"],"names":[],"mappings":"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"}