@roeehrl/tinode-sdk 0.25.1-sqlite.1

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.
@@ -0,0 +1,456 @@
1
+ import {
2
+ isUrlRelative,
3
+ rfc3339DateString,
4
+ mergeObj,
5
+ simplify,
6
+ normalizeArray,
7
+ normalizeRanges,
8
+ listToRanges,
9
+ clipInRange,
10
+ clipOutRange
11
+ } from "./utils";
12
+ import {
13
+ DEL_CHAR
14
+ } from './config.js';
15
+
16
+ test('isUrlRelative', () => {
17
+ expect(isUrlRelative('example.html')).toBe(true);
18
+ expect(isUrlRelative('https:example.com')).toBe(false);
19
+ expect(isUrlRelative('http:/example.com')).toBe(false);
20
+ expect(isUrlRelative(' \n https://example.com')).toBe(false);
21
+ });
22
+
23
+ test('rfc3339DateString', () => {
24
+ expect(rfc3339DateString(new Date(Date.UTC(2020, 1, 2, 3, 4, 5, 6)))).toBe('2020-02-02T03:04:05.006Z');
25
+ expect(rfc3339DateString(new Date(Date.UTC(2020, 1, 2, 3, 4, 5)))).toBe('2020-02-02T03:04:05Z');
26
+ expect(rfc3339DateString(new Date(0))).toBe(undefined);
27
+ expect(rfc3339DateString(new Date(''))).toBe(undefined);
28
+ });
29
+
30
+ // Recursively merge src's own properties to dst.
31
+ // Ignore properties where ignore[property] is true.
32
+ // Array and Date objects are shallow-copied.
33
+ test('mergeObj', () => {
34
+ expect(mergeObj({
35
+ a: 1,
36
+ b: 2
37
+ }, {
38
+ b: 3,
39
+ c: 4
40
+ })).toEqual({
41
+ a: 1,
42
+ b: 3,
43
+ c: 4
44
+ });
45
+ expect(mergeObj(undefined, {
46
+ b: 3,
47
+ c: 4
48
+ })).toEqual({
49
+ b: 3,
50
+ c: 4
51
+ });
52
+ expect(mergeObj({
53
+ a: 1,
54
+ b: 2
55
+ }, undefined)).toEqual({
56
+ a: 1,
57
+ b: 2
58
+ });
59
+ expect(mergeObj({
60
+ a: 1,
61
+ b: 2
62
+ }, null)).toEqual({
63
+ a: 1,
64
+ b: 2
65
+ });
66
+ expect(mergeObj({
67
+ a: 1,
68
+ b: 2
69
+ }, {
70
+ b: DEL_CHAR,
71
+ c: 4
72
+ })).toEqual({
73
+ a: 1,
74
+ c: 4
75
+ });
76
+ expect(mergeObj({
77
+ a: 1,
78
+ b: 2,
79
+ d: {
80
+ e: 5,
81
+ f: 6
82
+ }
83
+ }, {
84
+ b: 3,
85
+ d: {
86
+ f: 7,
87
+ g: 'hello'
88
+ }
89
+ })).toEqual({
90
+ a: 1,
91
+ b: 3,
92
+ d: {
93
+ e: 5,
94
+ f: 7,
95
+ g: 'hello'
96
+ }
97
+ });
98
+ expect(mergeObj({
99
+ a: 1,
100
+ b: 2
101
+ }, DEL_CHAR)).toEqual(undefined);
102
+ expect(mergeObj({
103
+ a: 1,
104
+ b: 2
105
+ }, undefined)).toEqual({
106
+ a: 1,
107
+ b: 2
108
+ });
109
+ expect(mergeObj({
110
+ a: 1,
111
+ b: 2
112
+ }, 1)).toEqual(1);
113
+ });
114
+
115
+ // Strips all values from an object of they evaluate to false or if their name starts with '_'.
116
+ // Used on all outgoing object before serialization to string.
117
+ test('simplify', () => {
118
+ const obj = {
119
+ a: 1,
120
+ b: 0,
121
+ c: '',
122
+ d: null,
123
+ e: undefined,
124
+ f: false,
125
+ g: true,
126
+ h: {},
127
+ i: {
128
+ j: 1
129
+ },
130
+ k: [],
131
+ l: [1],
132
+ m: new Date(0),
133
+ n: new Date(),
134
+ o: new Date(''),
135
+ p: new Date('2020-02-02T03:04:05.006Z'),
136
+ _q: 1,
137
+ _r: 0,
138
+ _s: '',
139
+ _t: null,
140
+ _u: undefined,
141
+ _v: false,
142
+ _w: true,
143
+ _x: {},
144
+ _y: {
145
+ j: 1
146
+ },
147
+ _z: [],
148
+ _1: [1],
149
+ _2: new Date(0),
150
+ _3: new Date(),
151
+ _4: new Date(''),
152
+ _5: new Date('2020-02-02T03:04:05.006Z')
153
+ };
154
+ expect(simplify(obj)).toEqual({
155
+ a: 1,
156
+ g: true,
157
+ i: {
158
+ j: 1
159
+ },
160
+ l: [1],
161
+ n: obj.n,
162
+ p: obj.p
163
+ });
164
+ });
165
+
166
+ // Trim whitespace, convert to lowercase, strip empty, short, and duplicate elements elements.
167
+ // If the result is an empty array, add a single element "\u2421" (Unicode Del character).
168
+ test('normalizeArray', () => {
169
+ expect(normalizeArray(null)).toEqual([DEL_CHAR]);
170
+ expect(normalizeArray([])).toEqual([DEL_CHAR]);
171
+ expect(normalizeArray([''])).toEqual([DEL_CHAR]);
172
+ expect(normalizeArray(['', ''])).toEqual([DEL_CHAR]);
173
+ expect(normalizeArray(['', ' ', ''])).toEqual([DEL_CHAR]);
174
+ expect(normalizeArray(['a', 'aa'])).toEqual(['aa']);
175
+ expect(normalizeArray(['aA'])).toEqual(['aa']);
176
+ expect(normalizeArray(['aa', 'bb'])).toEqual(['aa', 'bb']);
177
+ expect(normalizeArray(['aa', 'bb', 'aa'])).toEqual(['aa', 'bb']);
178
+ expect(normalizeArray(['aa', 'bb', 'aa', 'bb'])).toEqual(['aa', 'bb']);
179
+ expect(normalizeArray(['aa ', 'bb', 'Aa', 'bb', 'Cc'])).toEqual(['aa', 'bb', 'cc']);
180
+ });
181
+
182
+ test('normalizeRanges', () => {
183
+ expect(normalizeRanges('hello', 100)).toEqual([]);
184
+ expect(normalizeRanges(null, 100)).toEqual([]);
185
+ expect(normalizeRanges({
186
+ a: 1
187
+ }, 100)).toEqual([]);
188
+ expect(normalizeRanges([{
189
+ a: 1
190
+ }, {
191
+ b: 2
192
+ }], 100)).toEqual([]);
193
+ expect(normalizeRanges([], 100)).toEqual([]);
194
+ expect(normalizeRanges([{}], 100)).toEqual([]);
195
+ expect(normalizeRanges([{
196
+ low: 1
197
+ }], 100)).toEqual([{
198
+ low: 1
199
+ }]);
200
+ expect(normalizeRanges([{
201
+ low: 1,
202
+ hi: 2
203
+ }], 100)).toEqual([{
204
+ low: 1,
205
+ hi: 2
206
+ }]);
207
+ expect(normalizeRanges([{
208
+ low: 1,
209
+ hi: 101
210
+ }], 90)).toEqual([{
211
+ low: 1,
212
+ hi: 101
213
+ }]);
214
+ expect(normalizeRanges([{
215
+ low: 1,
216
+ hi: 101
217
+ }, {
218
+ low: 2,
219
+ hi: 102
220
+ }], 100)).toEqual([{
221
+ low: 1,
222
+ hi: 102
223
+ }]);
224
+ expect(normalizeRanges([{
225
+ low: 2,
226
+ hi: 102
227
+ }, {
228
+ low: 1,
229
+ hi: 101
230
+ }], 100)).toEqual([{
231
+ low: 1,
232
+ hi: 102
233
+ }]);
234
+ expect(normalizeRanges([{
235
+ low: 1,
236
+ hi: 101
237
+ }, {
238
+ low: 2,
239
+ hi: 102
240
+ }, {
241
+ low: 102,
242
+ hi: 110
243
+ }], 100)).toEqual([{
244
+ low: 1,
245
+ hi: 110
246
+ }]);
247
+ expect(normalizeRanges([{
248
+ low: 102,
249
+ hi: 110
250
+ }, {
251
+ low: 2,
252
+ hi: 102
253
+ }, {
254
+ low: 1,
255
+ hi: 101
256
+ }], 100)).toEqual([{
257
+ low: 1,
258
+ hi: 110
259
+ }]);
260
+ expect(normalizeRanges([{
261
+ low: 1,
262
+ hi: 101
263
+ }, {
264
+ low: 22,
265
+ hi: 120
266
+ }, {
267
+ low: 122,
268
+ hi: 125
269
+ }], 100)).toEqual([{
270
+ low: 1,
271
+ hi: 120
272
+ }, {
273
+ low: 122,
274
+ hi: 125
275
+ }]);
276
+ });
277
+
278
+ // Convert array of IDs to array of ranges.
279
+ test('listToRanges', () => {
280
+ expect(listToRanges([])).toEqual([]);
281
+ expect(listToRanges([1])).toEqual([{
282
+ low: 1
283
+ }]);
284
+ expect(listToRanges([1, 2])).toEqual([{
285
+ low: 1,
286
+ hi: 3
287
+ }]);
288
+ expect(listToRanges([1, 2, 3])).toEqual([{
289
+ low: 1,
290
+ hi: 4
291
+ }]);
292
+ expect(listToRanges([1, 2, 3, 5])).toEqual([{
293
+ low: 1,
294
+ hi: 4
295
+ }, {
296
+ low: 5
297
+ }]);
298
+ expect(listToRanges([5, 3, 2, 1])).toEqual([{
299
+ low: 1,
300
+ hi: 4
301
+ }, {
302
+ low: 5
303
+ }]);
304
+ expect(listToRanges([1, 2, 3, 5, 6, 7])).toEqual([{
305
+ low: 1,
306
+ hi: 4
307
+ }, {
308
+ low: 5,
309
+ hi: 8
310
+ }]);
311
+ });
312
+
313
+ // Cuts 'clip' range out of the 'src' range.
314
+ // Returns an array with 0, 1 or 2 elements.
315
+ test('clipOutRange', () => {
316
+ expect(clipOutRange({
317
+ low: 10,
318
+ hi: 20
319
+ }, {
320
+ low: 10,
321
+ hi: 20
322
+ })).toEqual([]);
323
+ expect(clipOutRange({
324
+ low: 10,
325
+ hi: 20
326
+ }, {
327
+ low: 5,
328
+ hi: 30
329
+ })).toEqual([]);
330
+ expect(clipOutRange({
331
+ low: 10,
332
+ hi: 20
333
+ }, {
334
+ low: 30,
335
+ hi: 40
336
+ })).toEqual([{
337
+ low: 10,
338
+ hi: 20
339
+ }]);
340
+ expect(clipOutRange({
341
+ low: 10,
342
+ hi: 20
343
+ }, {
344
+ low: 1,
345
+ hi: 5
346
+ })).toEqual([{
347
+ low: 10,
348
+ hi: 20
349
+ }]);
350
+ expect(clipOutRange({
351
+ low: 10,
352
+ hi: 20
353
+ }, {
354
+ low: 1,
355
+ hi: 15
356
+ })).toEqual([{
357
+ low: 15,
358
+ hi: 20
359
+ }]);
360
+ expect(clipOutRange({
361
+ low: 10,
362
+ hi: 20
363
+ }, {
364
+ low: 15,
365
+ hi: 30
366
+ })).toEqual([{
367
+ low: 10,
368
+ hi: 15
369
+ }]);
370
+ expect(clipOutRange({
371
+ low: 10,
372
+ hi: 20
373
+ }, {
374
+ low: 12,
375
+ hi: 17
376
+ })).toEqual([{
377
+ low: 10,
378
+ hi: 12
379
+ }, {
380
+ low: 17,
381
+ hi: 20
382
+ }]);
383
+ });
384
+
385
+ // Cuts 'src' range to be completely within 'clip' range.
386
+ // Returns clipped range or null if 'src' is outside of 'clip'.
387
+ test('clipInRange', () => {
388
+ expect(clipInRange({
389
+ low: 10,
390
+ hi: 20
391
+ }, {
392
+ low: 21,
393
+ hi: 30
394
+ })).toBeNull();
395
+ expect(clipInRange({
396
+ low: 10,
397
+ hi: 20
398
+ }, {
399
+ low: 10,
400
+ hi: 20
401
+ })).toEqual({
402
+ low: 10,
403
+ hi: 20
404
+ });
405
+ expect(clipInRange({
406
+ low: 10,
407
+ hi: 20
408
+ }, {
409
+ low: 5,
410
+ hi: 30
411
+ })).toEqual({
412
+ low: 10,
413
+ hi: 20
414
+ });
415
+ expect(clipInRange({
416
+ low: 10,
417
+ hi: 20
418
+ }, {
419
+ low: 1,
420
+ hi: 15
421
+ })).toEqual({
422
+ low: 10,
423
+ hi: 15
424
+ });
425
+ expect(clipInRange({
426
+ low: 10,
427
+ hi: 20
428
+ }, {
429
+ low: 1,
430
+ hi: 5
431
+ })).toBeNull();
432
+ expect(clipInRange({
433
+ low: 10,
434
+ hi: 20
435
+ }, {
436
+ low: 1,
437
+ hi: 10
438
+ })).toBeNull();
439
+ expect(clipInRange({
440
+ low: 10,
441
+ hi: 20
442
+ }, {
443
+ low: 20,
444
+ hi: 30
445
+ })).toBeNull();
446
+ expect(clipInRange({
447
+ low: 10,
448
+ hi: 20
449
+ }, {
450
+ low: 15,
451
+ hi: 30
452
+ })).toEqual({
453
+ low: 15,
454
+ hi: 20
455
+ });
456
+ });