@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextera.one/tps-standard",
3
- "version": "0.5.33",
3
+ "version": "0.6.0",
4
4
  "description": "The Universal Protocol for Space-Time Coordinates. A standard URI scheme (tps://) combining WGS84 spatial data with hierarchical, multi-calendar temporal coordinates. Includes TPS-UID: time-first, reversible event identifiers.",
5
5
  "keywords": [
6
6
  "tps",
@@ -19,6 +19,7 @@
19
19
  "holocene",
20
20
  "human-era",
21
21
  "unix",
22
+ "chinese",
22
23
  "geolocation"
23
24
  ],
24
25
  "homepage": "https://tps-standard.org",
@@ -33,18 +34,32 @@
33
34
  "author": "Mohammed Ayesh",
34
35
  "types": "dist/index.d.ts",
35
36
  "main": "dist/index.js",
37
+ "module": "dist/esm/index.js",
38
+ "browser": "dist/tps.min.js",
39
+ "exports": {
40
+ ".": {
41
+ "import": "./dist/esm/index.js",
42
+ "require": "./dist/index.js",
43
+ "types": "./dist/index.d.ts"
44
+ }
45
+ },
36
46
  "scripts": {
37
- "build": "tsc",
47
+ "build": "tsc && tsc -p tsconfig.esm.json",
48
+ "bundle": "rollup -c rollup.config.js",
38
49
  "prepublishOnly": "npm run build",
39
50
  "tests": "for f in test/*.ts; do npx ts-node \"$f\"; done"
40
51
  },
41
52
  "files": [
42
53
  "dist",
43
- "src"
54
+ "src",
55
+ "CHANGELOG.md"
44
56
  ],
45
57
  "devDependencies": {
46
- "typescript": "^5.3.3",
58
+ "@rollup/plugin-node-resolve": "^15.3.1",
59
+ "@rollup/plugin-typescript": "^11.1.6",
47
60
  "@types/node": "^20.10.6",
48
- "ts-node": "^10.9.2"
61
+ "rollup": "^4.59.0",
62
+ "ts-node": "^10.9.2",
63
+ "typescript": "^5.3.3"
49
64
  }
50
65
  }
package/src/date.ts ADDED
@@ -0,0 +1,243 @@
1
+ /**
2
+ * TpsDate Date-like wrapper with native TPS conversion helpers.
3
+ */
4
+
5
+ import { TPSComponents, DefaultCalendars, TimeOrder } from "./types";
6
+ import { TPS } from "./index";
7
+
8
+ export class TpsDate {
9
+ private readonly internal: Date;
10
+ private _cachedComponents: TPSComponents | null = null;
11
+ private _cachedTps: string | null = null;
12
+
13
+ constructor();
14
+ constructor(value: string | number | Date | TpsDate);
15
+ constructor(
16
+ year: number,
17
+ monthIndex: number,
18
+ day?: number,
19
+ hours?: number,
20
+ minutes?: number,
21
+ seconds?: number,
22
+ ms?: number,
23
+ );
24
+ constructor(
25
+ ...args:
26
+ | []
27
+ | [string | number | Date | TpsDate]
28
+ | [number, number, number?, number?, number?, number?, number?]
29
+ ) {
30
+ if (args.length === 0) {
31
+ this.internal = new Date();
32
+ return;
33
+ }
34
+
35
+ if (args.length === 1) {
36
+ const value = args[0];
37
+ if (value instanceof TpsDate) {
38
+ this.internal = new Date(value.getTime());
39
+ return;
40
+ }
41
+ if (value instanceof Date) {
42
+ this.internal = new Date(value.getTime());
43
+ return;
44
+ }
45
+ if (typeof value === "string" && TpsDate.looksLikeTPS(value)) {
46
+ const parsed = TPS.toDate(value);
47
+ if (!parsed) {
48
+ throw new RangeError(`Invalid TPS date string: ${value}`);
49
+ }
50
+ this.internal = parsed;
51
+ return;
52
+ }
53
+
54
+ this.internal = new Date(value);
55
+ return;
56
+ }
57
+
58
+ const [year, monthIndex, day, hours, minutes, seconds, ms] = args;
59
+ this.internal = new Date(
60
+ year,
61
+ monthIndex,
62
+ day ?? 1,
63
+ hours ?? 0,
64
+ minutes ?? 0,
65
+ seconds ?? 0,
66
+ ms ?? 0,
67
+ );
68
+ }
69
+
70
+ private static looksLikeTPS(input: string): boolean {
71
+ const s = input.trim();
72
+ return s.startsWith("tps://") || s.startsWith("T:") || s.startsWith("t:");
73
+ }
74
+
75
+ private getTpsComponents(): TPSComponents {
76
+ const currentTps = this.toTPS(DefaultCalendars.TPS);
77
+ if (this._cachedTps === currentTps && this._cachedComponents) {
78
+ return this._cachedComponents;
79
+ }
80
+
81
+ const parsed = TPS.parse(currentTps);
82
+ if (!parsed) {
83
+ throw new Error("TpsDate: failed to derive TPS components");
84
+ }
85
+
86
+ this._cachedTps = currentTps;
87
+ this._cachedComponents = parsed;
88
+ return parsed;
89
+ }
90
+
91
+ private getTpsFullYear(): number {
92
+ const comp = this.getTpsComponents();
93
+ return (comp.millennium - 1) * 1000 + (comp.century - 1) * 100 + comp.year;
94
+ }
95
+
96
+ static now(): number {
97
+ return Date.now();
98
+ }
99
+
100
+ static parse(input: string): number {
101
+ if (this.looksLikeTPS(input)) {
102
+ const d = TPS.toDate(input);
103
+ return d ? d.getTime() : Number.NaN;
104
+ }
105
+ return Date.parse(input);
106
+ }
107
+
108
+ static UTC(
109
+ year: number,
110
+ monthIndex: number,
111
+ day?: number,
112
+ hours?: number,
113
+ minutes?: number,
114
+ seconds?: number,
115
+ ms?: number,
116
+ ): number {
117
+ return Date.UTC(
118
+ year,
119
+ monthIndex,
120
+ day ?? 1,
121
+ hours ?? 0,
122
+ minutes ?? 0,
123
+ seconds ?? 0,
124
+ ms ?? 0,
125
+ );
126
+ }
127
+
128
+ static fromTPS(tps: string): TpsDate {
129
+ return new TpsDate(tps);
130
+ }
131
+
132
+ toGregorianDate(): Date {
133
+ return new Date(this.internal.getTime());
134
+ }
135
+
136
+ toDate(): Date {
137
+ return this.toGregorianDate();
138
+ }
139
+
140
+ toTPS(
141
+ calendar: string = DefaultCalendars.TPS,
142
+ opts?: { order?: TimeOrder },
143
+ ): string {
144
+ return TPS.fromDate(this.internal, calendar, opts);
145
+ }
146
+
147
+ toTPSURI(
148
+ calendar: string = DefaultCalendars.TPS,
149
+ opts?: {
150
+ order?: TimeOrder;
151
+ latitude?: number;
152
+ longitude?: number;
153
+ altitude?: number;
154
+ isUnknownLocation?: boolean;
155
+ isHiddenLocation?: boolean;
156
+ isRedactedLocation?: boolean;
157
+ },
158
+ ): string {
159
+ const time = this.toTPS(calendar, { order: opts?.order });
160
+ const comp = TPS.parse(time) as TPSComponents;
161
+
162
+ if (opts?.latitude !== undefined && opts?.longitude !== undefined) {
163
+ comp.latitude = opts.latitude;
164
+ comp.longitude = opts.longitude;
165
+ if (opts.altitude !== undefined) comp.altitude = opts.altitude;
166
+ } else if (opts?.isHiddenLocation) {
167
+ comp.isHiddenLocation = true;
168
+ } else if (opts?.isRedactedLocation) {
169
+ comp.isRedactedLocation = true;
170
+ } else {
171
+ comp.isUnknownLocation = true;
172
+ }
173
+
174
+ return TPS.toURI(comp);
175
+ }
176
+
177
+ getTime(): number {
178
+ return this.internal.getTime();
179
+ }
180
+ valueOf(): number {
181
+ return this.internal.valueOf();
182
+ }
183
+ toString(): string {
184
+ return this.toTPS(DefaultCalendars.TPS);
185
+ }
186
+ toISOString(): string {
187
+ return this.internal.toISOString();
188
+ }
189
+ toUTCString(): string {
190
+ return this.internal.toUTCString();
191
+ }
192
+ toJSON(): string | null {
193
+ return this.internal.toJSON();
194
+ }
195
+
196
+ getFullYear(): number {
197
+ return this.getTpsFullYear();
198
+ }
199
+ getUTCFullYear(): number {
200
+ return this.getTpsFullYear();
201
+ }
202
+ getMonth(): number {
203
+ return this.getTpsComponents().month - 1;
204
+ }
205
+ getUTCMonth(): number {
206
+ return this.getTpsComponents().month - 1;
207
+ }
208
+ getDate(): number {
209
+ return this.getTpsComponents().day;
210
+ }
211
+ getUTCDate(): number {
212
+ return this.getTpsComponents().day;
213
+ }
214
+ getHours(): number {
215
+ return this.getTpsComponents().hour;
216
+ }
217
+ getUTCHours(): number {
218
+ return this.getTpsComponents().hour;
219
+ }
220
+ getMinutes(): number {
221
+ return this.getTpsComponents().minute;
222
+ }
223
+ getUTCMinutes(): number {
224
+ return this.getTpsComponents().minute;
225
+ }
226
+ getSeconds(): number {
227
+ return this.getTpsComponents().second;
228
+ }
229
+ getUTCSeconds(): number {
230
+ return this.getTpsComponents().second;
231
+ }
232
+ getMilliseconds(): number {
233
+ return this.getTpsComponents().millisecond;
234
+ }
235
+ getUTCMilliseconds(): number {
236
+ return this.getTpsComponents().millisecond;
237
+ }
238
+
239
+ [Symbol.toPrimitive](hint: string): string | number {
240
+ if (hint === "number") return this.valueOf();
241
+ return this.toString();
242
+ }
243
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * TPS DriverManager
3
+ * Manages the registry of calendar driver plugins.
4
+ */
5
+
6
+ import { CalendarDriver } from "./types";
7
+
8
+ /**
9
+ * A dedicated registry for TPS calendar driver plugins.
10
+ * The global `TPS` class exposes a shared singleton instance (`TPS.driverManager`).
11
+ */
12
+ export class DriverManager {
13
+ private readonly registry = new Map<string, CalendarDriver>();
14
+
15
+ /**
16
+ * Registers a calendar driver.
17
+ * Overwrites any previously registered driver with the same code.
18
+ */
19
+ register(driver: CalendarDriver): void {
20
+ if (!driver || !driver.code) {
21
+ throw new Error("DriverManager: driver must have a valid `code` string.");
22
+ }
23
+ this.registry.set(driver.code, driver);
24
+ }
25
+
26
+ /**
27
+ * Returns the driver registered for the given calendar code, or `undefined`.
28
+ */
29
+ get(code: string): CalendarDriver | undefined {
30
+ return this.registry.get(code);
31
+ }
32
+
33
+ /**
34
+ * Returns `true` if a driver with the given code has been registered.
35
+ */
36
+ has(code: string): boolean {
37
+ return this.registry.has(code);
38
+ }
39
+
40
+ /**
41
+ * Returns an array of all registered calendar codes.
42
+ */
43
+ list(): string[] {
44
+ return Array.from(this.registry.keys());
45
+ }
46
+
47
+ /**
48
+ * Removes a driver from the registry.
49
+ * Returns `true` if the driver existed and was removed.
50
+ */
51
+ unregister(code: string): boolean {
52
+ return this.registry.delete(code);
53
+ }
54
+ }