@synnaxlabs/x 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 (164) hide show
  1. package/.eslintrc.cjs +18 -0
  2. package/.turbo/turbo-build.log +16 -0
  3. package/.vscode/settings.json +3 -0
  4. package/LICENSE +4 -0
  5. package/README.md +44 -0
  6. package/dist/binary/encoder.d.ts +59 -0
  7. package/dist/binary/encoder.spec.d.ts +1 -0
  8. package/dist/binary/index.d.ts +1 -0
  9. package/dist/case.d.ts +5 -0
  10. package/dist/change/change.d.ts +32 -0
  11. package/dist/change/index.d.ts +1 -0
  12. package/dist/clamp.d.ts +1 -0
  13. package/dist/compare/compare.d.ts +39 -0
  14. package/dist/compare/index.d.ts +1 -0
  15. package/dist/debounce.d.ts +2 -0
  16. package/dist/deep/copy.d.ts +1 -0
  17. package/dist/deep/delete.d.ts +2 -0
  18. package/dist/deep/delete.spec.d.ts +1 -0
  19. package/dist/deep/equal.d.ts +8 -0
  20. package/dist/deep/equal.spec.d.ts +1 -0
  21. package/dist/deep/external.d.ts +7 -0
  22. package/dist/deep/index.d.ts +1 -0
  23. package/dist/deep/key.d.ts +30 -0
  24. package/dist/deep/memo.d.ts +1 -0
  25. package/dist/deep/merge.d.ts +2 -0
  26. package/dist/deep/merge.spec.d.ts +1 -0
  27. package/dist/deep/partial.d.ts +3 -0
  28. package/dist/destructor.d.ts +1 -0
  29. package/dist/identity.d.ts +1 -0
  30. package/dist/index.d.ts +25 -0
  31. package/dist/join.d.ts +1 -0
  32. package/dist/kv/index.d.ts +1 -0
  33. package/dist/kv/types.d.ts +32 -0
  34. package/dist/mock/MockGLBufferController.d.ts +20 -0
  35. package/dist/mock/index.d.ts +1 -0
  36. package/dist/observe/index.d.ts +1 -0
  37. package/dist/observe/observe.d.ts +11 -0
  38. package/dist/optional.d.ts +1 -0
  39. package/dist/primitive.d.ts +8 -0
  40. package/dist/record.d.ts +14 -0
  41. package/dist/renderable.d.ts +4 -0
  42. package/dist/runtime/detect.d.ts +9 -0
  43. package/dist/runtime/external.d.ts +2 -0
  44. package/dist/runtime/index.d.ts +1 -0
  45. package/dist/runtime/os.d.ts +9 -0
  46. package/dist/search.d.ts +15 -0
  47. package/dist/spatial/base.d.ts +102 -0
  48. package/dist/spatial/bounds.d.ts +31 -0
  49. package/dist/spatial/bounds.spec.d.ts +1 -0
  50. package/dist/spatial/box.d.ts +265 -0
  51. package/dist/spatial/box.spec.d.ts +1 -0
  52. package/dist/spatial/dimensions.d.ts +59 -0
  53. package/dist/spatial/dimensions.spec.d.ts +1 -0
  54. package/dist/spatial/direction.d.ts +10 -0
  55. package/dist/spatial/direction.spec.d.ts +1 -0
  56. package/dist/spatial/external.d.ts +8 -0
  57. package/dist/spatial/index.d.ts +1 -0
  58. package/dist/spatial/location.d.ts +52 -0
  59. package/dist/spatial/location.spec.d.ts +1 -0
  60. package/dist/spatial/position.d.ts +2 -0
  61. package/dist/spatial/scale.d.ts +241 -0
  62. package/dist/spatial/scale.spec.d.ts +1 -0
  63. package/dist/spatial/spatial.d.ts +1 -0
  64. package/dist/spatial/xy.d.ts +116 -0
  65. package/dist/spatial/xy.spec.d.ts +1 -0
  66. package/dist/telem/encode.d.ts +1 -0
  67. package/dist/telem/generate.d.ts +2 -0
  68. package/dist/telem/gl.d.ts +11 -0
  69. package/dist/telem/index.d.ts +3 -0
  70. package/dist/telem/series.d.ts +104 -0
  71. package/dist/telem/series.spec.d.ts +1 -0
  72. package/dist/telem/telem.d.ts +633 -0
  73. package/dist/telem/telem.spec.d.ts +1 -0
  74. package/dist/toArray.d.ts +1 -0
  75. package/dist/transform.d.ts +1 -0
  76. package/dist/unique.d.ts +1 -0
  77. package/dist/url/index.d.ts +1 -0
  78. package/dist/url/url.d.ts +46 -0
  79. package/dist/url/url.spec.d.ts +1 -0
  80. package/dist/worker/worker.d.ts +32 -0
  81. package/dist/worker/worker.spec.d.ts +1 -0
  82. package/dist/x.cjs.js +9046 -0
  83. package/dist/x.cjs.js.map +1 -0
  84. package/dist/x.es.js +9047 -0
  85. package/dist/x.es.js.map +1 -0
  86. package/package.json +42 -0
  87. package/src/binary/encoder.spec.ts +31 -0
  88. package/src/binary/encoder.ts +118 -0
  89. package/src/binary/index.ts +10 -0
  90. package/src/case.ts +31 -0
  91. package/src/change/change.ts +31 -0
  92. package/src/change/index.ts +10 -0
  93. package/src/clamp.ts +14 -0
  94. package/src/compare/compare.ts +116 -0
  95. package/src/compare/index.ts +10 -0
  96. package/src/debounce.ts +45 -0
  97. package/src/deep/copy.ts +13 -0
  98. package/src/deep/delete.spec.ts +36 -0
  99. package/src/deep/delete.ts +27 -0
  100. package/src/deep/equal.spec.ts +82 -0
  101. package/src/deep/equal.ts +65 -0
  102. package/src/deep/external.ts +15 -0
  103. package/src/deep/index.ts +10 -0
  104. package/src/deep/key.ts +46 -0
  105. package/src/deep/merge.spec.ts +63 -0
  106. package/src/deep/merge.ts +41 -0
  107. package/src/deep/partial.ts +14 -0
  108. package/src/destructor.ts +10 -0
  109. package/src/identity.ts +14 -0
  110. package/src/index.ts +34 -0
  111. package/src/join.ts +14 -0
  112. package/src/kv/index.ts +10 -0
  113. package/src/kv/types.ts +52 -0
  114. package/src/mock/MockGLBufferController.ts +70 -0
  115. package/src/mock/index.ts +10 -0
  116. package/src/observe/index.ts +10 -0
  117. package/src/observe/observe.ts +33 -0
  118. package/src/optional.ts +10 -0
  119. package/src/primitive.ts +46 -0
  120. package/src/record.ts +45 -0
  121. package/src/renderable.ts +20 -0
  122. package/src/runtime/detect.ts +34 -0
  123. package/src/runtime/external.ts +11 -0
  124. package/src/runtime/index.ts +10 -0
  125. package/src/runtime/os.ts +38 -0
  126. package/src/search.ts +40 -0
  127. package/src/spatial/base.ts +80 -0
  128. package/src/spatial/bounds.spec.ts +99 -0
  129. package/src/spatial/bounds.ts +80 -0
  130. package/src/spatial/box.spec.ts +137 -0
  131. package/src/spatial/box.ts +326 -0
  132. package/src/spatial/dimensions.spec.ts +47 -0
  133. package/src/spatial/dimensions.ts +64 -0
  134. package/src/spatial/direction.spec.ts +25 -0
  135. package/src/spatial/direction.ts +47 -0
  136. package/src/spatial/external.ts +17 -0
  137. package/src/spatial/index.ts +10 -0
  138. package/src/spatial/location.spec.ts +24 -0
  139. package/src/spatial/location.ts +124 -0
  140. package/src/spatial/position.ts +26 -0
  141. package/src/spatial/scale.spec.ts +74 -0
  142. package/src/spatial/scale.ts +351 -0
  143. package/src/spatial/spatial.ts +17 -0
  144. package/src/spatial/xy.spec.ts +68 -0
  145. package/src/spatial/xy.ts +164 -0
  146. package/src/telem/encode.ts +22 -0
  147. package/src/telem/generate.ts +19 -0
  148. package/src/telem/gl.ts +22 -0
  149. package/src/telem/index.ts +12 -0
  150. package/src/telem/series.spec.ts +289 -0
  151. package/src/telem/series.ts +449 -0
  152. package/src/telem/telem.spec.ts +302 -0
  153. package/src/telem/telem.ts +1237 -0
  154. package/src/toArray.ts +11 -0
  155. package/src/transform.ts +10 -0
  156. package/src/unique.ts +10 -0
  157. package/src/url/index.ts +10 -0
  158. package/src/url/url.spec.ts +47 -0
  159. package/src/url/url.ts +113 -0
  160. package/src/worker/worker.spec.ts +41 -0
  161. package/src/worker/worker.ts +86 -0
  162. package/tsconfig.json +7 -0
  163. package/tsconfig.vite.json +4 -0
  164. package/vite.config.ts +23 -0
@@ -0,0 +1,302 @@
1
+ // Copyright 2023 Synnax Labs, Inc.
2
+ //
3
+ // Use of this software is governed by the Business Source License included in the file
4
+ // licenses/BSL.txt.
5
+ //
6
+ // As of the Change Date specified in that file, in accordance with the Business Source
7
+ // License, use of this software will be governed by the Apache License, Version 2.0,
8
+ // included in the file licenses/APL.txt.
9
+
10
+ import { describe, expect, test } from "vitest";
11
+
12
+ import { DataType, Density, Rate, Size, TimeRange, TimeSpan, TimeStamp } from "@/telem";
13
+
14
+ describe("TimeStamp", () => {
15
+ test("construct", () => {
16
+ const ts = new TimeStamp(1000);
17
+ expect(ts.equals(TimeSpan.MICROSECOND)).toBeTruthy();
18
+ });
19
+
20
+ test("construct from TimeStamp", () => {
21
+ const ts = new TimeStamp(TimeSpan.microseconds(10));
22
+ expect(ts.equals(TimeSpan.microseconds(10))).toBeTruthy();
23
+ });
24
+
25
+ test("construct from local TimeZone", () => {
26
+ const ts = new TimeStamp(TimeSpan.microseconds(10), "local");
27
+ expect(ts.equals(TimeSpan.microseconds(10).add(TimeStamp.utcOffset))).toBeTruthy();
28
+ });
29
+
30
+ test("construct from time string", () => {
31
+ const ts = new TimeStamp("12:30", "UTC");
32
+ expect(ts.date().getUTCHours()).toEqual(12);
33
+ expect(ts.equals(TimeSpan.hours(12).add(TimeSpan.minutes(30)))).toBeTruthy();
34
+ const ts2 = new TimeStamp("12:30:00.22");
35
+ expect(
36
+ ts2.equals(
37
+ TimeSpan.hours(12).add(TimeSpan.minutes(30).add(TimeSpan.milliseconds(22)))
38
+ )
39
+ ).toBeTruthy();
40
+ const ts3 = new TimeStamp("12:30:00.22", "local");
41
+ expect(
42
+ ts3.equals(
43
+ TimeSpan.hours(12)
44
+ .add(TimeSpan.minutes(30).add(TimeSpan.milliseconds(22)))
45
+ .add(TimeStamp.utcOffset)
46
+ )
47
+ ).toBeTruthy();
48
+ });
49
+
50
+ test("construct from date", () => {
51
+ const ts = new TimeStamp([2021, 1, 1], "UTC");
52
+ expect(ts.date().getUTCFullYear()).toEqual(2021);
53
+ expect(ts.date().getUTCMonth()).toEqual(0);
54
+ expect(ts.date().getUTCDate()).toEqual(1);
55
+ expect([0, 1]).toContain(ts.date().getUTCHours());
56
+ expect(ts.date().getUTCMinutes()).toEqual(0);
57
+ });
58
+
59
+ test("construct from date time string", () => {
60
+ const ts = new TimeStamp("2021-01-01T00:00:00.000Z", "UTC");
61
+ expect(ts.date().getUTCFullYear()).toEqual(2021);
62
+ expect(ts.date().getUTCHours()).toEqual(0);
63
+ const ts2 = new TimeStamp("2021-01-01", "local");
64
+ expect(ts2.date().getUTCFullYear()).toEqual(2021);
65
+ expect(ts2.date().getUTCHours()).toEqual(
66
+ TimeStamp.utcOffset.valueOf() / TimeStamp.HOUR.valueOf()
67
+ );
68
+ expect(ts2.date().getUTCMinutes()).toEqual(0);
69
+ });
70
+
71
+ test("span", () => {
72
+ const ts = new TimeStamp(0);
73
+ expect(ts.span(new TimeStamp(1000)).equals(TimeSpan.microseconds())).toBeTruthy();
74
+ });
75
+
76
+ test("range", () => {
77
+ const ts = new TimeStamp(0);
78
+ expect(
79
+ ts.range(new TimeStamp(1000)).equals(new TimeRange(ts, TimeSpan.microseconds()))
80
+ ).toBeTruthy();
81
+ });
82
+
83
+ test("spanRange", () => {
84
+ const ts = new TimeStamp(0);
85
+ expect(
86
+ ts
87
+ .spanRange(TimeSpan.microseconds())
88
+ .equals(new TimeRange(ts, ts.add(TimeSpan.microseconds())))
89
+ ).toBeTruthy();
90
+ });
91
+
92
+ test("isZero", () => {
93
+ const ts = new TimeStamp(0);
94
+ expect(ts.isZero).toBeTruthy();
95
+ });
96
+
97
+ test("after", () => {
98
+ const ts = new TimeStamp(0);
99
+ expect(ts.after(new TimeStamp(-1))).toBeTruthy();
100
+ const ts2 = new TimeStamp(1);
101
+ expect(ts2.after(new TimeStamp(1))).toBeFalsy();
102
+ });
103
+
104
+ test("before", () => {
105
+ const ts = new TimeStamp(0);
106
+ expect(ts.before(new TimeStamp(1))).toBeTruthy();
107
+ const ts2 = new TimeStamp(1);
108
+ expect(ts2.before(new TimeStamp(1))).toBeFalsy();
109
+ });
110
+
111
+ test("beforeEq", () => {
112
+ const ts = new TimeStamp(0);
113
+ expect(ts.beforeEq(new TimeStamp(1))).toBeTruthy();
114
+ const ts2 = new TimeStamp(1);
115
+ expect(ts2.beforeEq(new TimeStamp(1))).toBeTruthy();
116
+ const ts3 = new TimeStamp(2);
117
+ expect(ts3.beforeEq(new TimeStamp(1))).toBeFalsy();
118
+ });
119
+
120
+ test("afterEq", () => {
121
+ const ts = new TimeStamp(0);
122
+ expect(ts.afterEq(new TimeStamp(-1))).toBeTruthy();
123
+ const ts2 = new TimeStamp(1);
124
+ expect(ts2.afterEq(new TimeStamp(1))).toBeTruthy();
125
+ const ts3 = new TimeStamp(0);
126
+ expect(ts3.afterEq(new TimeStamp(1))).toBeFalsy();
127
+ });
128
+
129
+ test("add", () => {
130
+ const ts = new TimeStamp(0);
131
+ expect(
132
+ ts.add(TimeSpan.microseconds()).equals(new TimeStamp(TimeSpan.microseconds(1)))
133
+ ).toBeTruthy();
134
+ });
135
+
136
+ test("sub", () => {
137
+ const ts = new TimeStamp(TimeSpan.microseconds());
138
+ expect(ts.sub(TimeSpan.microseconds()).equals(new TimeStamp(0))).toBeTruthy();
139
+ });
140
+
141
+ test("stringification", () => {
142
+ const ts = new TimeStamp([2022, 12, 15], "UTC")
143
+ .add(TimeSpan.hours(12))
144
+ .add(TimeSpan.minutes(20))
145
+ .add(TimeSpan.milliseconds(12));
146
+ expect(ts.fString("ISO", "UTC")).toEqual("2022-12-15T12:20:00.012Z");
147
+ expect(ts.fString("time", "UTC")).toEqual("12:20:00");
148
+ expect(ts.fString("date", "UTC")).toEqual("Dec 15");
149
+ if (!TimeStamp.utcOffset.equals(0)) {
150
+ expect(ts.fString("ISO", "local")).not.toEqual("2022-12-15T12:20:00.012Z");
151
+ expect(ts.fString("time", "local")).not.toEqual("12:20:00");
152
+ }
153
+ });
154
+ describe("remainder", () => {
155
+ test("day", () => {
156
+ const expectedRemainder = TimeStamp.hours(12)
157
+ .add(TimeSpan.minutes(20))
158
+ .add(TimeSpan.milliseconds(12));
159
+ const ts = new TimeStamp([2022, 12, 15])
160
+ .add(TimeStamp.hours(12))
161
+ .add(TimeSpan.minutes(20))
162
+ .add(TimeSpan.milliseconds(12));
163
+ const remainder = ts.remainder(TimeStamp.DAY);
164
+ expect(
165
+ remainder.equals(expectedRemainder),
166
+ `expected ${new TimeSpan(expectedRemainder).toString()} got ${new TimeSpan(
167
+ remainder
168
+ ).toString()}`
169
+ ).toBeTruthy();
170
+ });
171
+ test("second", () => {
172
+ const expectedRemainder = TimeSpan.milliseconds(12);
173
+ const ts = new TimeStamp([2022, 12, 15])
174
+ .add(TimeStamp.hours(12))
175
+ .add(TimeSpan.minutes(20))
176
+ .add(TimeSpan.milliseconds(12));
177
+ const remainder = ts.remainder(TimeSpan.seconds());
178
+ expect(remainder.equals(expectedRemainder)).toBeTruthy();
179
+ });
180
+ });
181
+ });
182
+
183
+ describe("TimeSpan", () => {
184
+ test("construct from static", () => {
185
+ expect(TimeSpan.nanoseconds(1).equals(1)).toBeTruthy();
186
+ expect(TimeSpan.microseconds(1).equals(1000)).toBeTruthy();
187
+ expect(TimeSpan.milliseconds(1).equals(1000000)).toBeTruthy();
188
+ expect(TimeSpan.seconds(1).equals(1e9)).toBeTruthy();
189
+ expect(TimeSpan.minutes(1).equals(6e10)).toBeTruthy();
190
+ expect(TimeSpan.hours(1).equals(36e11)).toBeTruthy();
191
+ });
192
+
193
+ test("seconds", () => {
194
+ expect(TimeSpan.seconds(1).seconds).toEqual(1);
195
+ });
196
+
197
+ test("isZero", () => {
198
+ expect(TimeSpan.ZERO.isZero).toBeTruthy();
199
+ expect(TimeSpan.seconds(1).isZero).toBeFalsy();
200
+ });
201
+
202
+ test("add", () => {
203
+ expect(TimeSpan.seconds(1).add(TimeSpan.SECOND).equals(2e9)).toBeTruthy();
204
+ });
205
+
206
+ test("sub", () => {
207
+ expect(TimeSpan.seconds(1).sub(TimeSpan.SECOND).isZero).toBeTruthy();
208
+ });
209
+ });
210
+
211
+ describe("Rate", () => {
212
+ test("construct", () => expect(new Rate(1).equals(1)).toBeTruthy());
213
+
214
+ test("period", () => expect(new Rate(1).period.equals(TimeSpan.SECOND)).toBeTruthy());
215
+
216
+ test("period", () =>
217
+ expect(new Rate(2).period.equals(TimeSpan.milliseconds(500))).toBeTruthy());
218
+
219
+ test("sampleCount", () =>
220
+ expect(new Rate(1).sampleCount(TimeSpan.SECOND)).toEqual(1));
221
+
222
+ test("byteCount", () =>
223
+ expect(new Rate(1).byteCount(TimeSpan.SECOND, Density.BIT64)).toEqual(8));
224
+
225
+ test("span", () =>
226
+ expect(new Rate(1).span(4).equals(TimeSpan.seconds(4))).toBeTruthy());
227
+
228
+ test("byteSpan", () =>
229
+ expect(
230
+ new Rate(1).byteSpan(new Size(32), Density.BIT64).equals(TimeSpan.seconds(4))
231
+ ).toBeTruthy());
232
+
233
+ test("Hz", () => expect(Rate.hz(1).equals(1)).toBeTruthy());
234
+ test("KHz", () => expect(Rate.khz(1).equals(1e3)).toBeTruthy());
235
+ });
236
+
237
+ describe("TimeRange", () => {
238
+ test("construct", () => {
239
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
240
+ expect(tr.start.equals(new TimeStamp(0))).toBeTruthy();
241
+ expect(tr.end.equals(new TimeStamp(1000))).toBeTruthy();
242
+ });
243
+
244
+ test("span", () => {
245
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
246
+ expect(tr.span.equals(TimeSpan.MICROSECOND)).toBeTruthy();
247
+ });
248
+
249
+ test("isValid", () => {
250
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
251
+ expect(tr.isValid).toBeTruthy();
252
+ const tr2 = new TimeRange(new TimeStamp(1000), new TimeStamp(0));
253
+ expect(tr2.isValid).toBeFalsy();
254
+ });
255
+
256
+ test("isZero", () => {
257
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(0));
258
+ expect(tr.isZero).toBeTruthy();
259
+ const tr2 = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
260
+ expect(tr2.isZero).toBeFalsy();
261
+ });
262
+
263
+ test("swap", () => {
264
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
265
+ expect(
266
+ tr.swap().equals(new TimeRange(new TimeStamp(1000), new TimeStamp(0)))
267
+ ).toBeTruthy();
268
+ });
269
+ describe("contains", () => {
270
+ test("TimeStamp", () => {
271
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
272
+ expect(tr.contains(new TimeStamp(500))).toBeTruthy();
273
+ expect(tr.contains(new TimeStamp(1001))).toBeFalsy();
274
+ });
275
+ test("TimeRange", () => {
276
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
277
+ expect(
278
+ tr.contains(new TimeRange(new TimeStamp(500), new TimeStamp(600)))
279
+ ).toBeTruthy();
280
+ expect(
281
+ tr.contains(new TimeRange(new TimeStamp(500), new TimeStamp(1001)))
282
+ ).toBeFalsy();
283
+ });
284
+ });
285
+ test("overlapsWith", () => {
286
+ const tr = new TimeRange(new TimeStamp(0), new TimeStamp(1000));
287
+ const one = new TimeRange(new TimeStamp(500), new TimeStamp(600));
288
+ expect(tr.overlapsWith(one)).toBeTruthy();
289
+ expect(one.overlapsWith(tr)).toBeTruthy();
290
+ const two = new TimeRange(new TimeStamp(1001), new TimeStamp(2000));
291
+ expect(tr.overlapsWith(two)).toBeFalsy();
292
+ expect(two.overlapsWith(tr)).toBeFalsy();
293
+ });
294
+ });
295
+
296
+ describe("DataType", () => {
297
+ test("json serialization", () => {
298
+ const dt = DataType.INT32;
299
+ const v = JSON.parse(JSON.stringify({ dt }));
300
+ expect(v.dt === "int32").toBeTruthy();
301
+ });
302
+ });