@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,88 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@nextera.one/tps-standard` are documented here.
4
+
5
+ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
6
+
7
+ ---
8
+
9
+ ## [0.5.35] — 2026-03-04
10
+
11
+ ### Added
12
+
13
+ - **`TPS.now(calendar?, opts?)`** — shorthand for `TPS.fromDate(new Date(), calendar, opts)`.
14
+ - **`TPS.diff(t1, t2)`** — returns elapsed time in milliseconds between two TPS strings (`t2 − t1`).
15
+ - **`TPS.add(tpsStr, duration)`** — returns a new TPS string shifted by a `{days, hours, minutes, seconds, milliseconds}` duration object. Preserves original calendar and time order.
16
+ - **Chinese Lunisolar calendar driver** (`chin`) — Huangdi year numbering (≈4722 = 2024 CE), Sexagenary ganzhi cycle, month formatting in romanized and Chinese character form (`zh` format).
17
+ - **`DriverManager` class** — dedicated driver registry. `TPS.driverManager` exposes `register()`, `get()`, `has()`, `list()`, and `unregister()`. The static `TPS.registerDriver()` / `TPS.getDriver()` methods are preserved as convenience shorthands.
18
+ - **`src/utils/timezone.ts`** — zero-dependency timezone utility using `Intl.DateTimeFormat`. Supports IANA names (`Asia/Tehran`), fixed offsets (`+03:30`), and common abbreviations (`IRST`, `JST`, `EST`, …).
19
+ - **Timezone-aware `TPS.toDate()`** — when a parsed TPS URI has a `;tz=` extension, the returned `Date` is automatically converted from local → UTC.
20
+ - **ESM dual-mode build** — `dist/esm/index.js` emitted via `tsconfig.esm.json`. `package.json` `"exports"` field routes `import` to ESM and `require` to CJS.
21
+ - **Browser IIFE bundle** — `dist/tps.min.js` (global `window.TPS`) built via Rollup (`npm run bundle`).
22
+
23
+ ### Changed
24
+
25
+ - Internal driver registry moved from a private `Map` in `TPS` to `DriverManager`.
26
+ - `package.json`: added `"module"`, `"browser"`, `"exports"` fields; build script now also emits ESM.
27
+
28
+ ---
29
+
30
+ ## [0.5.34] — 2026-03-04
31
+
32
+ ### Changed
33
+
34
+ - Version bump after authentication issue during 0.5.4 publish attempt.
35
+
36
+ ---
37
+
38
+ ## [0.5.33] — 2026-03-03
39
+
40
+ ### Added
41
+
42
+ - Full library modularization:
43
+ - `src/types.ts` — shared interfaces and enums.
44
+ - `src/uid.ts` — `TPSUID7RB` binary UID logic.
45
+ - `src/date.ts` — `TpsDate` wrapper with component caching.
46
+ - `src/utils/env.ts` — Node.js / Browser polyfill layer.
47
+ - `src/utils/calendar.ts` — centralized JDN math.
48
+ - `src/utils/tps-string.ts` — TPS string build / parse utilities (breaks circular deps).
49
+ - Calendar drivers: **Persian** (`per`), **Hijri** (`hij`), **Julian** (`jul`), **Holocene** (`holo`).
50
+ - `TPS.parseCalendarDate()`, `TPS.fromCalendarDate()`, `TPS.formatCalendarDate()` convenience helpers.
51
+ - `TPS.sanitizeTimeInput()` — normalizes casing, whitespace, legacy `/T:` separator, and detects ascending order.
52
+
53
+ ### Fixed
54
+
55
+ - Persian calendar JDN → month calculation typo (divisor 108 → 31).
56
+ - All circular dependencies between drivers and the main TPS class.
57
+
58
+ ---
59
+
60
+ ## [0.5.3] — 2026-03-02
61
+
62
+ ### Changed
63
+
64
+ - Minor internal refactoring and stability fixes.
65
+
66
+ ---
67
+
68
+ ## [0.5.2] — 2026-02-28
69
+
70
+ ### Added
71
+
72
+ - `TPSUID7RB` binary reversible IDs.
73
+ - Ascending (`TimeOrder.ASC`) time string support.
74
+ - Pre-`@` generic space anchors (`adm:`, `node:`, `net:ip4:`, `planet:`, …).
75
+ - Structural anchors (`bldg=`, `floor=`, `room=`, `zone=`).
76
+ - Geospatial cell anchors (`s2=`, `h3=`, `plus=`, `w3w=`).
77
+ - Actor anchor (`A:`), cryptographic signature (`!`).
78
+
79
+ ---
80
+
81
+ ## [0.5.0] — 2026-02-01
82
+
83
+ ### Added
84
+
85
+ - Initial public release.
86
+ - Core TPS URI parsing, validation, and serialization.
87
+ - Gregorian (`greg`) and Unix (`unix`) built-in calendar drivers.
88
+ - `TpsDate` — Date-like wrapper with TPS conversion helpers.
package/README.md CHANGED
@@ -21,14 +21,18 @@ import {
21
21
  TPSUID7RB,
22
22
  } from "@nextera.one/tps-standard";
23
23
 
24
- // 1) Date -> TPS time string
24
+ // Current time in Gregorian
25
+ const now = TPS.now();
26
+ // "T:greg.m3.c1.y26.m3.d4.h06.m30.s00.m0"
27
+
28
+ // Convert a Date to TPS
25
29
  const tpsTime = TPS.fromDate(
26
30
  new Date("2026-01-09T14:30:25Z"),
27
31
  DefaultCalendars.GREG,
28
32
  );
29
- // T:greg.m3.c1.y26.m1.d9.h14.m30.s25.m0
33
+ // "T:greg.m3.c1.y26.m1.d9.h14.m30.s25.m0"
30
34
 
31
- // 2) Build full TPS URI
35
+ // Build a full TPS URI with coordinates
32
36
  const uri = TPS.toURI({
33
37
  calendar: "greg",
34
38
  millennium: 3,
@@ -44,113 +48,186 @@ const uri = TPS.toURI({
44
48
  longitude: 35.91,
45
49
  altitude: 800,
46
50
  });
47
- // tps://L:31.95,35.91,800m@T:greg.m3.c1.y26.m1.d9.h14.m30.s25.m0
51
+ // "tps://L:31.95,35.91,800m@T:greg.m3.c1.y26.m1.d9.h14.m30.s25.m0"
48
52
 
49
- // 3) Parse back
53
+ // Parse back
50
54
  const parsed = TPS.parse(uri);
51
55
 
52
- // 4) Generate reversible TPS UID (binary base64url form)
56
+ // Generate reversible TPS UID (binary base64url)
53
57
  const uid = TPSUID7RB.encodeBinaryB64(uri);
54
58
  const decoded = TPSUID7RB.decodeBinaryB64(uid);
55
59
  ```
56
60
 
61
+ ---
62
+
63
+ ## Calendars
64
+
65
+ 8 built-in calendar drivers are registered automatically:
66
+
67
+ | Code | Calendar | Notes |
68
+ | ------ | ---------------------------- | ------------------------------------------------ |
69
+ | `tps` | TPS Native | Hierarchical millennium/century/year tokens |
70
+ | `greg` | Gregorian | ISO proleptic calendar |
71
+ | `unix` | Unix Epoch | seconds since 1970-01-01T00:00:00Z |
72
+ | `per` | Persian (Jalali/Solar Hijri) | Solar calendar, used in Iran & Afghanistan |
73
+ | `hij` | Hijri (Islamic Tabular) | Lunar calendar, 12 months × 29/30 days |
74
+ | `jul` | Julian | Historical proleptic; Gregorian is 13d ahead now |
75
+ | `holo` | Holocene (Human Era) | Gregorian + 10,000 |
76
+ | `chin` | Chinese Lunisolar | Huangdi year numbering + Ganzhi cycle |
77
+
78
+ ### Examples
79
+
80
+ ```ts
81
+ // Persian
82
+ TPS.fromDate(new Date(), "per"); // "T:per.y1404.m12.d14.h10.m0.s0"
83
+
84
+ // Hijri
85
+ TPS.fromDate(new Date(), "hij"); // "T:hij.y1447.m09.d04.h10.m0.s0"
86
+
87
+ // Chinese
88
+ TPS.fromDate(new Date(), "chin"); // "T:chin.m5.c5.y26.m1.d14.h10.m0.s0"
89
+ TPS.getDriver("chin")!.format(
90
+ { millennium: 5, century: 5, year: 26, month: 1, day: 14 },
91
+ "zh",
92
+ );
93
+ // "4726年正月14日"
94
+
95
+ // Julian
96
+ TPS.fromDate(new Date(), "jul"); // "T:jul.m3.c1.y26.m2.d19.h10.m0.s0"
97
+
98
+ // Holocene
99
+ TPS.fromDate(new Date(), "holo"); // "T:holo.m4.c3.y26.m3.d4.h10.m0.s0" (12026 HE)
100
+ ```
101
+
102
+ Custom drivers can be registered via:
103
+
104
+ ```ts
105
+ TPS.registerDriver(myDriver);
106
+ // or via the DriverManager:
107
+ TPS.driverManager.register(myDriver);
108
+ console.log(TPS.driverManager.list()); // ["tps","greg","unix","per","hij","jul","holo","chin",...]
109
+ ```
110
+
111
+ ---
112
+
57
113
  ## Time Format
58
114
 
59
- Canonical time token order is descending hierarchy:
115
+ Canonical token order is **descending hierarchy**:
60
116
 
61
- ```txt
117
+ ```
62
118
  T:greg.m3.c1.y26.m01.d13.h09.m30.s12.m0
63
119
  ```
64
120
 
65
- Where:
121
+ | Token | Meaning |
122
+ | ------------ | --------------- |
123
+ | `m` (rank 8) | millennium |
124
+ | `c` | century |
125
+ | `y` | year in century |
126
+ | `m` (rank 5) | month |
127
+ | `d` | day |
128
+ | `h` | hour |
129
+ | `m` (rank 2) | minute |
130
+ | `s` | second |
131
+ | `m` (rank 0) | millisecond |
66
132
 
67
- - `m` (rank 8) = millennium
68
- - `c` = century
69
- - `y` = year in century
70
- - `m` (rank 5) = month
71
- - `d` = day
72
- - `h` = hour
73
- - `m` (rank 2) = minute
74
- - `s` = second
75
- - `m` (rank 0) = millisecond
133
+ Ascending order is supported via `TimeOrder.ASC` and auto-detected during parsing.
76
134
 
77
- Ascending order is supported via `TimeOrder.ASC` and is auto-detected during parsing.
135
+ ---
78
136
 
79
137
  ## URI Format
80
138
 
81
- ```txt
82
- tps://[SPACE][ /A:actor ]@T:[calendar].[tokens][!signature][;extensions][?query][#fragment]
139
+ ```
140
+ tps://[SPACE][/A:actor]@T:[calendar].[tokens][!signature][;extensions][?query][#fragment]
83
141
  ```
84
142
 
85
- ### Supported space anchors
86
-
87
- - Privacy: `L:-`, `L:~`, `L:redacted`, `unknown`, `hidden`, `redacted`
88
- - Coordinates: `L:lat,lon[,alt]m`
89
- - Cells: `L:s2=...`, `L:h3=...`, `L:plus=...`, `L:w3w=...`
90
- - Structural: `L:bldg=...(.floor=...)(.room=...)(.zone=...)`
91
- - Generic pre-`@` anchors: `adm:...`, `node:...`, `net:ip4:...`, `net:ip6:...`, `planet:...`, `P:...`
143
+ ### Space Anchors
92
144
 
93
- ## Calendars
145
+ | Pattern | Meaning |
146
+ | -------------------------------------- | ------------------------------------- |
147
+ | `L:-`, `L:unknown` | Unknown / anonymous location |
148
+ | `L:~`, `L:hidden` | Hidden location |
149
+ | `L:redacted` | Redacted location |
150
+ | `L:lat,lon[,alt]m` | GPS coordinates |
151
+ | `L:s2=...` | S2 Cell |
152
+ | `L:h3=...` | H3 Cell |
153
+ | `L:plus=...` | Plus Code |
154
+ | `L:w3w=...` | What3Words |
155
+ | `L:bldg=...` | Structural (building/floor/room/zone) |
156
+ | `adm:`, `node:`, `net:ip4:`, `planet:` | Generic pre-`@` anchors |
94
157
 
95
- Built-in drivers:
158
+ ### Timezone Extension
96
159
 
97
- - `tps`
98
- - `greg`
99
- - `unix`
160
+ Add `;tz=` to have `TPS.toDate()` interpret the calendar components as local time:
100
161
 
101
- Additional calendars can be plugged in via `TPS.registerDriver(driver)`.
162
+ ```ts
163
+ // 14:30 in Tehran time → UTC 11:00
164
+ TPS.toDate("tps://unknown@T:greg.m3.c1.y26.m1.d9.h14.m30.s0.m0;tz=Asia/Tehran");
165
+ // or
166
+ TPS.toDate("T:greg.m3.c1.y26.m1.d9.h14.m30.s0.m0;tz=+03:30");
167
+ ```
102
168
 
103
- Calendar code width is enforced to **3–4 lowercase letters** when generating TPS time strings.
169
+ Supported: IANA names (`Asia/Tehran`), fixed offsets (`+03:30`, `-05:00`), and common abbreviations (`IRST`, `JST`, `EST`, …).
104
170
 
105
- ## TpsDate
171
+ ---
106
172
 
107
- `TpsDate` is a Date-like wrapper that works directly with TPS.
173
+ ## Convenience Methods
108
174
 
109
175
  ```ts
110
- import {
111
- TpsDate,
112
- DefaultCalendars,
113
- TimeOrder,
114
- } from "@nextera.one/tps-standard";
176
+ // Current time
177
+ TPS.now(); // Gregorian by default
178
+ TPS.now("hij"); // Current time in Hijri
179
+
180
+ // Time difference
181
+ const ms = TPS.diff(
182
+ "T:greg.m3.c1.y26.m1.d1.h0.m0.s0.m0",
183
+ "T:greg.m3.c1.y26.m1.d2.h0.m0.s0.m0",
184
+ ); // 86_400_000 (one day)
185
+
186
+ // Shift by duration
187
+ const t = "T:greg.m3.c1.y26.m1.d9.h14.m30.s25.m0";
188
+ TPS.add(t, { days: 7 }); // one week later
189
+ TPS.add(t, { hours: -2 }); // two hours earlier
190
+ TPS.add(t, { minutes: 90, seconds: 30 }); // +1h 30m 30s
191
+ ```
115
192
 
116
- const td = new TpsDate("tps://unknown@T:greg.m3.c1.y26.m01.d09.h14.m30.s25.m0");
193
+ ---
117
194
 
118
- // Native Gregorian Date clone
119
- const gregorian = td.toGregorianDate();
195
+ ## TpsDate
120
196
 
121
- // Alias (same value)
122
- const same = td.toDate();
197
+ ```ts
198
+ const td = new TpsDate("tps://unknown@T:greg.m3.c1.y26.m01.d09.h14.m30.s25.m0");
123
199
 
124
- // TPS time in desired calendar
200
+ const gregorian = td.toGregorianDate(); // native JS Date clone
125
201
  const asTps = td.toTPS(DefaultCalendars.TPS, { order: TimeOrder.DESC });
126
-
127
- // Full URI
128
202
  const uri = td.toTPSURI(DefaultCalendars.GREG, {
129
203
  latitude: 31.95,
130
204
  longitude: 35.91,
131
- altitude: 800,
132
205
  });
133
206
  ```
134
207
 
208
+ ---
209
+
135
210
  ## TPSUID7RB (Reversible Binary ID)
136
211
 
137
212
  ```ts
138
- import { TPSUID7RB } from "@nextera.one/tps-standard";
139
-
140
213
  const tps = "tps://node:api-1@T:greg.m3.c1.y26.m01.d09.h14.m30.s25.m0";
141
-
142
214
  const id = TPSUID7RB.encodeBinaryB64(tps, { compress: true });
143
215
  const out = TPSUID7RB.decodeBinaryB64(id);
144
216
  // out.tps === tps
145
217
  ```
146
218
 
219
+ ---
220
+
147
221
  ## Scripts
148
222
 
149
223
  ```bash
150
- npm run build
151
- npm run tests
224
+ npm run build # CJS + ESM TypeScript compilation
225
+ npm run bundle # Browser IIFE bundle (dist/tps.min.js)
226
+ npm run tests # Run all test suites
152
227
  ```
153
228
 
229
+ ---
230
+
154
231
  ## License
155
232
 
156
233
  Apache-2.0
package/dist/date.d.ts ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * TpsDate Date-like wrapper with native TPS conversion helpers.
3
+ */
4
+ import { TimeOrder } from "./types";
5
+ export declare class TpsDate {
6
+ private readonly internal;
7
+ private _cachedComponents;
8
+ private _cachedTps;
9
+ constructor();
10
+ constructor(value: string | number | Date | TpsDate);
11
+ constructor(year: number, monthIndex: number, day?: number, hours?: number, minutes?: number, seconds?: number, ms?: number);
12
+ private static looksLikeTPS;
13
+ private getTpsComponents;
14
+ private getTpsFullYear;
15
+ static now(): number;
16
+ static parse(input: string): number;
17
+ static UTC(year: number, monthIndex: number, day?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;
18
+ static fromTPS(tps: string): TpsDate;
19
+ toGregorianDate(): Date;
20
+ toDate(): Date;
21
+ toTPS(calendar?: string, opts?: {
22
+ order?: TimeOrder;
23
+ }): string;
24
+ toTPSURI(calendar?: string, opts?: {
25
+ order?: TimeOrder;
26
+ latitude?: number;
27
+ longitude?: number;
28
+ altitude?: number;
29
+ isUnknownLocation?: boolean;
30
+ isHiddenLocation?: boolean;
31
+ isRedactedLocation?: boolean;
32
+ }): string;
33
+ getTime(): number;
34
+ valueOf(): number;
35
+ toString(): string;
36
+ toISOString(): string;
37
+ toUTCString(): string;
38
+ toJSON(): string | null;
39
+ getFullYear(): number;
40
+ getUTCFullYear(): number;
41
+ getMonth(): number;
42
+ getUTCMonth(): number;
43
+ getDate(): number;
44
+ getUTCDate(): number;
45
+ getHours(): number;
46
+ getUTCHours(): number;
47
+ getMinutes(): number;
48
+ getUTCMinutes(): number;
49
+ getSeconds(): number;
50
+ getUTCSeconds(): number;
51
+ getMilliseconds(): number;
52
+ getUTCMilliseconds(): number;
53
+ [Symbol.toPrimitive](hint: string): string | number;
54
+ }
package/dist/date.js ADDED
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * TpsDate Date-like wrapper with native TPS conversion helpers.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TpsDate = void 0;
7
+ const types_1 = require("./types");
8
+ const index_1 = require("./index");
9
+ class TpsDate {
10
+ constructor(...args) {
11
+ this._cachedComponents = null;
12
+ this._cachedTps = null;
13
+ if (args.length === 0) {
14
+ this.internal = new Date();
15
+ return;
16
+ }
17
+ if (args.length === 1) {
18
+ const value = args[0];
19
+ if (value instanceof TpsDate) {
20
+ this.internal = new Date(value.getTime());
21
+ return;
22
+ }
23
+ if (value instanceof Date) {
24
+ this.internal = new Date(value.getTime());
25
+ return;
26
+ }
27
+ if (typeof value === "string" && TpsDate.looksLikeTPS(value)) {
28
+ const parsed = index_1.TPS.toDate(value);
29
+ if (!parsed) {
30
+ throw new RangeError(`Invalid TPS date string: ${value}`);
31
+ }
32
+ this.internal = parsed;
33
+ return;
34
+ }
35
+ this.internal = new Date(value);
36
+ return;
37
+ }
38
+ const [year, monthIndex, day, hours, minutes, seconds, ms] = args;
39
+ this.internal = new Date(year, monthIndex, day ?? 1, hours ?? 0, minutes ?? 0, seconds ?? 0, ms ?? 0);
40
+ }
41
+ static looksLikeTPS(input) {
42
+ const s = input.trim();
43
+ return s.startsWith("tps://") || s.startsWith("T:") || s.startsWith("t:");
44
+ }
45
+ getTpsComponents() {
46
+ const currentTps = this.toTPS(types_1.DefaultCalendars.TPS);
47
+ if (this._cachedTps === currentTps && this._cachedComponents) {
48
+ return this._cachedComponents;
49
+ }
50
+ const parsed = index_1.TPS.parse(currentTps);
51
+ if (!parsed) {
52
+ throw new Error("TpsDate: failed to derive TPS components");
53
+ }
54
+ this._cachedTps = currentTps;
55
+ this._cachedComponents = parsed;
56
+ return parsed;
57
+ }
58
+ getTpsFullYear() {
59
+ const comp = this.getTpsComponents();
60
+ return (comp.millennium - 1) * 1000 + (comp.century - 1) * 100 + comp.year;
61
+ }
62
+ static now() {
63
+ return Date.now();
64
+ }
65
+ static parse(input) {
66
+ if (this.looksLikeTPS(input)) {
67
+ const d = index_1.TPS.toDate(input);
68
+ return d ? d.getTime() : Number.NaN;
69
+ }
70
+ return Date.parse(input);
71
+ }
72
+ static UTC(year, monthIndex, day, hours, minutes, seconds, ms) {
73
+ return Date.UTC(year, monthIndex, day ?? 1, hours ?? 0, minutes ?? 0, seconds ?? 0, ms ?? 0);
74
+ }
75
+ static fromTPS(tps) {
76
+ return new TpsDate(tps);
77
+ }
78
+ toGregorianDate() {
79
+ return new Date(this.internal.getTime());
80
+ }
81
+ toDate() {
82
+ return this.toGregorianDate();
83
+ }
84
+ toTPS(calendar = types_1.DefaultCalendars.TPS, opts) {
85
+ return index_1.TPS.fromDate(this.internal, calendar, opts);
86
+ }
87
+ toTPSURI(calendar = types_1.DefaultCalendars.TPS, opts) {
88
+ const time = this.toTPS(calendar, { order: opts?.order });
89
+ const comp = index_1.TPS.parse(time);
90
+ if (opts?.latitude !== undefined && opts?.longitude !== undefined) {
91
+ comp.latitude = opts.latitude;
92
+ comp.longitude = opts.longitude;
93
+ if (opts.altitude !== undefined)
94
+ comp.altitude = opts.altitude;
95
+ }
96
+ else if (opts?.isHiddenLocation) {
97
+ comp.isHiddenLocation = true;
98
+ }
99
+ else if (opts?.isRedactedLocation) {
100
+ comp.isRedactedLocation = true;
101
+ }
102
+ else {
103
+ comp.isUnknownLocation = true;
104
+ }
105
+ return index_1.TPS.toURI(comp);
106
+ }
107
+ getTime() {
108
+ return this.internal.getTime();
109
+ }
110
+ valueOf() {
111
+ return this.internal.valueOf();
112
+ }
113
+ toString() {
114
+ return this.toTPS(types_1.DefaultCalendars.TPS);
115
+ }
116
+ toISOString() {
117
+ return this.internal.toISOString();
118
+ }
119
+ toUTCString() {
120
+ return this.internal.toUTCString();
121
+ }
122
+ toJSON() {
123
+ return this.internal.toJSON();
124
+ }
125
+ getFullYear() {
126
+ return this.getTpsFullYear();
127
+ }
128
+ getUTCFullYear() {
129
+ return this.getTpsFullYear();
130
+ }
131
+ getMonth() {
132
+ return this.getTpsComponents().month - 1;
133
+ }
134
+ getUTCMonth() {
135
+ return this.getTpsComponents().month - 1;
136
+ }
137
+ getDate() {
138
+ return this.getTpsComponents().day;
139
+ }
140
+ getUTCDate() {
141
+ return this.getTpsComponents().day;
142
+ }
143
+ getHours() {
144
+ return this.getTpsComponents().hour;
145
+ }
146
+ getUTCHours() {
147
+ return this.getTpsComponents().hour;
148
+ }
149
+ getMinutes() {
150
+ return this.getTpsComponents().minute;
151
+ }
152
+ getUTCMinutes() {
153
+ return this.getTpsComponents().minute;
154
+ }
155
+ getSeconds() {
156
+ return this.getTpsComponents().second;
157
+ }
158
+ getUTCSeconds() {
159
+ return this.getTpsComponents().second;
160
+ }
161
+ getMilliseconds() {
162
+ return this.getTpsComponents().millisecond;
163
+ }
164
+ getUTCMilliseconds() {
165
+ return this.getTpsComponents().millisecond;
166
+ }
167
+ [Symbol.toPrimitive](hint) {
168
+ if (hint === "number")
169
+ return this.valueOf();
170
+ return this.toString();
171
+ }
172
+ }
173
+ exports.TpsDate = TpsDate;
174
+ //# sourceMappingURL=date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.js","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * TPS DriverManager
3
+ * Manages the registry of calendar driver plugins.
4
+ */
5
+ import { CalendarDriver } from "./types";
6
+ /**
7
+ * A dedicated registry for TPS calendar driver plugins.
8
+ * The global `TPS` class exposes a shared singleton instance (`TPS.driverManager`).
9
+ */
10
+ export declare class DriverManager {
11
+ private readonly registry;
12
+ /**
13
+ * Registers a calendar driver.
14
+ * Overwrites any previously registered driver with the same code.
15
+ */
16
+ register(driver: CalendarDriver): void;
17
+ /**
18
+ * Returns the driver registered for the given calendar code, or `undefined`.
19
+ */
20
+ get(code: string): CalendarDriver | undefined;
21
+ /**
22
+ * Returns `true` if a driver with the given code has been registered.
23
+ */
24
+ has(code: string): boolean;
25
+ /**
26
+ * Returns an array of all registered calendar codes.
27
+ */
28
+ list(): string[];
29
+ /**
30
+ * Removes a driver from the registry.
31
+ * Returns `true` if the driver existed and was removed.
32
+ */
33
+ unregister(code: string): boolean;
34
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * TPS DriverManager
4
+ * Manages the registry of calendar driver plugins.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DriverManager = void 0;
8
+ /**
9
+ * A dedicated registry for TPS calendar driver plugins.
10
+ * The global `TPS` class exposes a shared singleton instance (`TPS.driverManager`).
11
+ */
12
+ class DriverManager {
13
+ constructor() {
14
+ this.registry = new Map();
15
+ }
16
+ /**
17
+ * Registers a calendar driver.
18
+ * Overwrites any previously registered driver with the same code.
19
+ */
20
+ register(driver) {
21
+ if (!driver || !driver.code) {
22
+ throw new Error("DriverManager: driver must have a valid `code` string.");
23
+ }
24
+ this.registry.set(driver.code, driver);
25
+ }
26
+ /**
27
+ * Returns the driver registered for the given calendar code, or `undefined`.
28
+ */
29
+ get(code) {
30
+ return this.registry.get(code);
31
+ }
32
+ /**
33
+ * Returns `true` if a driver with the given code has been registered.
34
+ */
35
+ has(code) {
36
+ return this.registry.has(code);
37
+ }
38
+ /**
39
+ * Returns an array of all registered calendar codes.
40
+ */
41
+ list() {
42
+ return Array.from(this.registry.keys());
43
+ }
44
+ /**
45
+ * Removes a driver from the registry.
46
+ * Returns `true` if the driver existed and was removed.
47
+ */
48
+ unregister(code) {
49
+ return this.registry.delete(code);
50
+ }
51
+ }
52
+ exports.DriverManager = DriverManager;
53
+ //# sourceMappingURL=driver-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-manager.js","sourceRoot":"","sources":["../src/driver-manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH;;;GAGG;AACH,MAAa,aAAa;IAA1B;QACmB,aAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAyChE,CAAC;IAvCC;;;OAGG;IACH,QAAQ,CAAC,MAAsB;QAC7B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;CACF;AA1CD,sCA0CC"}