@quanxiaoxiao/datav 0.1.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.
@@ -0,0 +1,742 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert';
3
+ import select from './index.mjs';
4
+
5
+ test('select > index', () => {
6
+ assert.throws(() => {
7
+ select('number');
8
+ });
9
+ assert.throws(() => {
10
+ select(['name']);
11
+ });
12
+ assert.throws(() => {
13
+ select(['name', []]);
14
+ });
15
+ assert.throws(() => {
16
+ select(['name', 'xxx']);
17
+ });
18
+ assert.equal(select({ type: 'number' })('1'), 1);
19
+ assert.equal(select({ type: 'number' })('1.1'), 1.1);
20
+ assert.equal(select({ type: 'number' })(1.1), 1.1);
21
+ assert.equal(select({ type: 'integer' })('1.1'), 1);
22
+ assert.equal(select({ type: 'boolean' })('true'), true);
23
+ assert.equal(select({ type: 'boolean' })('true1'), null);
24
+ });
25
+
26
+ test('select > index, pathname', () => {
27
+ assert.equal(select({
28
+ type: 'integer',
29
+ properties: ['age', { type: 'number' }],
30
+ })('333.3'), 333);
31
+ assert.equal(select(['age', { type: 'integer' }])({ age: '2.2' }), 2);
32
+ assert.equal(select(['ages', { type: 'integer' }])({ age: '2.2' }), null);
33
+ });
34
+
35
+ test('select > index, []', () => {
36
+ assert.equal(select(['age', { type: 'integer' }])({ age: '33.33' }), 33);
37
+ assert.equal(select(['obj.age', { type: 'integer' }])({ obj: { age: '33.33' } }), 33);
38
+ });
39
+
40
+ test('select > index, type with object', () => {
41
+ assert.throws(() => {
42
+ select({
43
+ type: 'object',
44
+ });
45
+ });
46
+ assert.throws(() => {
47
+ select({
48
+ type: 'object',
49
+ properties: [],
50
+ });
51
+ });
52
+ assert.throws(() => {
53
+ select(['obj', {
54
+ type: 'object',
55
+ }]);
56
+ });
57
+ assert.throws(() => {
58
+ select({
59
+ type: 'object',
60
+ properties: 'xxx',
61
+ });
62
+ });
63
+ assert.deepEqual(select({
64
+ type: 'object',
65
+ properties: {
66
+ name: {
67
+ type: 'string',
68
+ },
69
+ age: {
70
+ type: 'integer',
71
+ },
72
+ },
73
+ })({
74
+ name: 'quan',
75
+ age: '22.5',
76
+ obj: {
77
+ age: '33.3',
78
+ big: 'xxx',
79
+ },
80
+ }), { name: 'quan', age: 22 });
81
+ assert.deepEqual(select([
82
+ 'obj',
83
+ {
84
+ type: 'object',
85
+ properties: {
86
+ name: {
87
+ type: 'string',
88
+ },
89
+ age: {
90
+ type: 'integer',
91
+ },
92
+ },
93
+ },
94
+ ])({
95
+ name: 'quan',
96
+ age: '22.5',
97
+ obj: {
98
+ name: 'xxx',
99
+ age: '33.3',
100
+ big: 'foo',
101
+ },
102
+ }), { name: 'xxx', age: 33 });
103
+ assert.deepEqual(select([
104
+ 'obj',
105
+ {
106
+ type: 'object',
107
+ properties: {
108
+ },
109
+ },
110
+ ])({
111
+ name: 'quan',
112
+ age: '22.5',
113
+ obj: {
114
+ name: 'xxx',
115
+ age: '33.3',
116
+ big: 'foo',
117
+ },
118
+ }), {});
119
+ assert.deepEqual(select([
120
+ 'obj',
121
+ {
122
+ type: 'object',
123
+ properties: {
124
+ name: {
125
+ type: 'string',
126
+ },
127
+ },
128
+ },
129
+ ])({
130
+ name: 'quan',
131
+ age: '22.5',
132
+ obj: {
133
+ name: 'xxx',
134
+ age: '33.3',
135
+ big: 'foo',
136
+ },
137
+ }), { name: 'xxx' });
138
+ assert.deepEqual(select({
139
+ type: 'object',
140
+ properties: {
141
+ name: {
142
+ type: 'string',
143
+ },
144
+ age: {
145
+ type: 'number',
146
+ },
147
+ obj: {
148
+ type: 'object',
149
+ properties: {
150
+ name: {
151
+ type: 'string',
152
+ },
153
+ age: {
154
+ type: 'integer',
155
+ },
156
+ },
157
+ },
158
+ },
159
+ })({
160
+ name: 'quan',
161
+ age: '22.5',
162
+ obj: {
163
+ name: 'xxx',
164
+ age: '33.3',
165
+ big: 'foo',
166
+ },
167
+ }), {
168
+ name: 'quan',
169
+ age: 22.5,
170
+ obj: {
171
+ name: 'xxx',
172
+ age: 33,
173
+ },
174
+ });
175
+ assert.deepEqual(select({
176
+ type: 'object',
177
+ properties: {
178
+ name: {
179
+ type: 'string',
180
+ },
181
+ ding: ['age', {
182
+ type: 'integer',
183
+ }],
184
+ },
185
+ })({
186
+ name: 'quan',
187
+ age: '22.5',
188
+ }), {
189
+ name: 'quan',
190
+ ding: 22,
191
+ });
192
+ assert.deepEqual(select({
193
+ type: 'object',
194
+ properties: {
195
+ name: {
196
+ type: 'string',
197
+ },
198
+ age: {
199
+ type: 'number',
200
+ },
201
+ ding: ['obj.big', {
202
+ type: 'string',
203
+ }],
204
+ },
205
+ })({
206
+ name: 'quan',
207
+ age: '22.5',
208
+ obj: {
209
+ name: 'xxx',
210
+ age: '33.3',
211
+ big: 'foo',
212
+ },
213
+ }), {
214
+ name: 'quan',
215
+ age: 22.5,
216
+ ding: 'foo',
217
+ });
218
+ assert.deepEqual(select({
219
+ type: 'object',
220
+ properties: {
221
+ name: {
222
+ type: 'string',
223
+ },
224
+ age: {
225
+ type: 'number',
226
+ },
227
+ sub: ['obj', {
228
+ type: 'object',
229
+ properties: {
230
+ name: {
231
+ type: 'string',
232
+ },
233
+ age: {
234
+ type: 'integer',
235
+ },
236
+ cqq: ['big', { type: 'string' }],
237
+ },
238
+ }],
239
+ },
240
+ })({
241
+ name: 'quan',
242
+ age: '22.5',
243
+ obj: {
244
+ name: 'xxx',
245
+ age: '33.3',
246
+ big: 'foo',
247
+ },
248
+ }), {
249
+ name: 'quan',
250
+ age: 22.5,
251
+ sub: {
252
+ name: 'xxx',
253
+ age: 33,
254
+ cqq: 'foo',
255
+ },
256
+ });
257
+ assert.deepEqual(select(['obj', {
258
+ type: 'object',
259
+ properties: {
260
+ name: {
261
+ type: 'string',
262
+ },
263
+ age: {
264
+ type: 'integer',
265
+ },
266
+ },
267
+ }])({
268
+ name: 'quan',
269
+ age: '22.5',
270
+ obj: {
271
+ name: 'xxx',
272
+ age: '33.3',
273
+ big: 'foo',
274
+ },
275
+ }), {
276
+ name: 'xxx',
277
+ age: 33,
278
+ });
279
+ assert.deepEqual(select(['obj', {
280
+ type: 'object',
281
+ properties: {
282
+ name: {
283
+ type: 'string',
284
+ },
285
+ bb: ['age', { type: 'number' }],
286
+ age: {
287
+ type: 'integer',
288
+ },
289
+ },
290
+ }])({
291
+ name: 'quan',
292
+ age: '22.5',
293
+ obj: {
294
+ name: 'xxx',
295
+ age: '33.3',
296
+ big: 'foo',
297
+ },
298
+ }), {
299
+ bb: 33.3,
300
+ name: 'xxx',
301
+ age: 33,
302
+ });
303
+ assert.deepEqual(select({
304
+ type: 'object',
305
+ properties: {
306
+ obj: ['arr.0', {
307
+ type: 'object',
308
+ properties: {
309
+ name: {
310
+ type: 'string',
311
+ },
312
+ foo: ['age', { type: 'integer' }],
313
+ },
314
+ }],
315
+ },
316
+ })({
317
+ name: 'xxxx',
318
+ arr: [{
319
+ name: 'aaa',
320
+ age: '99.9',
321
+ }],
322
+ }), {
323
+ obj: {
324
+ name: 'aaa',
325
+ foo: 99,
326
+ },
327
+ });
328
+ assert.equal(select(['1', {
329
+ type: 'number',
330
+ }])(['44', '33.3']), 33.3);
331
+ assert.equal(select(['1.age', {
332
+ type: 'number',
333
+ }])(['44', '33.3']), null);
334
+ });
335
+
336
+ test('select > index array', () => {
337
+ assert.deepEqual(select({
338
+ type: 'array',
339
+ properties: ['.', {
340
+ type: 'integer',
341
+ }],
342
+ })(['33.3', '22.8']), [33, 22]);
343
+ assert.deepEqual(select({
344
+ type: 'array',
345
+ properties: {
346
+ age: {
347
+ type: 'integer',
348
+ },
349
+ },
350
+ })([{ age: '33.3' }]), [{ age: 33 }]);
351
+ assert.deepEqual(select({
352
+ type: 'array',
353
+ properties: {
354
+ age: {
355
+ type: 'integer',
356
+ },
357
+ },
358
+ })({ age: '33.3' }), [{ age: 33 }]);
359
+ assert.deepEqual(select({
360
+ type: 'array',
361
+ properties: ['.', { type: 'integer' }],
362
+ })(['1.1', '3', '4']), [1, 3, 4]);
363
+ assert.deepEqual(select({
364
+ type: 'array',
365
+ properties: ['age', { type: 'integer' }],
366
+ })([
367
+ {
368
+ age: '1.1',
369
+ },
370
+ {
371
+ age: '3',
372
+ },
373
+ {
374
+ age: '4',
375
+ },
376
+ ]), [1, 3, 4]);
377
+ assert.deepEqual(
378
+ select({
379
+ type: 'array',
380
+ properties: ['$age', { type: 'integer' }],
381
+ })({ name: 'aa', age: '44.4' }),
382
+ [44],
383
+ );
384
+ assert.deepEqual(
385
+ select({
386
+ type: 'array',
387
+ properties: ['$ages', { type: 'integer' }],
388
+ })({ name: 'aa', age: '44.4' }),
389
+ [],
390
+ );
391
+ assert.deepEqual(
392
+ select({
393
+ type: 'array',
394
+ properties: ['age', { type: 'integer' }],
395
+ })({ name: 'aa', age: '44.4' }),
396
+ [],
397
+ );
398
+ assert.deepEqual(
399
+ select({
400
+ type: 'object',
401
+ properties: {
402
+ name: {
403
+ type: 'string',
404
+ },
405
+ arr: {
406
+ type: 'array',
407
+ properties: {
408
+ name: ['$foo.name', { type: 'string' }],
409
+ age: ['$big.age', { type: 'integer' }],
410
+ },
411
+ },
412
+ },
413
+ })({
414
+ name: 'aaa',
415
+ foo: {
416
+ name: 'bbb',
417
+ },
418
+ big: {
419
+ age: '99.99',
420
+ },
421
+ }),
422
+ {
423
+ name: 'aaa',
424
+ arr: [{
425
+ name: 'bbb',
426
+ age: 99,
427
+ }],
428
+ },
429
+ );
430
+ });
431
+
432
+ test('select > index, array to object', () => {
433
+ assert.deepEqual(
434
+ select(
435
+ ['0', {
436
+ type: 'object',
437
+ properties: {
438
+ name: {
439
+ type: 'string',
440
+ },
441
+ id: {
442
+ type: 'number',
443
+ },
444
+ _id: ['id', { type: 'string' }],
445
+ },
446
+ }],
447
+ )([{ name: 'quan', id: 11 }]),
448
+ { name: 'quan', id: 11, _id: '11' },
449
+ );
450
+ assert.deepEqual(
451
+ select(
452
+ ['0', {
453
+ type: 'object',
454
+ properties: {
455
+ name: {
456
+ type: 'string',
457
+ },
458
+ id: {
459
+ type: 'number',
460
+ },
461
+ _id: ['id', { type: 'string' }],
462
+ },
463
+ }],
464
+ )([]),
465
+ { name: null, id: null, _id: null },
466
+ );
467
+ });
468
+
469
+ test('select > index', () => {
470
+ assert.deepEqual(
471
+ select({
472
+ type: 'object',
473
+ properties: {
474
+ name: {
475
+ type: 'string',
476
+ },
477
+ quan: ['foo.big', {
478
+ type: 'object',
479
+ properties: {
480
+ name: {
481
+ type: 'string',
482
+ },
483
+ age: {
484
+ type: 'integer',
485
+ },
486
+ ding: ['$cqq', { type: 'number' }],
487
+ jj: ['$other.age', { type: 'integer' }],
488
+ },
489
+ }],
490
+ },
491
+ })({
492
+ name: 'aaa',
493
+ cqq: '44.44',
494
+ other: {
495
+ age: '66.6',
496
+ },
497
+ foo: {
498
+ name: 'bbb',
499
+ dd: 'ee',
500
+ big: {
501
+ name: 'cccc',
502
+ age: '33.3',
503
+ },
504
+ },
505
+ }),
506
+ {
507
+ name: 'aaa',
508
+ quan: {
509
+ name: 'cccc',
510
+ age: 33,
511
+ jj: 66,
512
+ ding: 44.44,
513
+ },
514
+ },
515
+ );
516
+
517
+ assert.deepEqual(
518
+ select({
519
+ type: 'array',
520
+ properties: {
521
+ name: {
522
+ type: 'string',
523
+ },
524
+ },
525
+ })({ names: 'quan' }),
526
+ [{ name: null }],
527
+ );
528
+
529
+ assert.deepEqual(
530
+ select({
531
+ type: 'array',
532
+ properties: {
533
+ name: {
534
+ type: 'string',
535
+ },
536
+ },
537
+ })({ name: 'quan' }),
538
+ [{ name: 'quan' }],
539
+ );
540
+
541
+ assert.deepEqual(
542
+ select({
543
+ type: 'array',
544
+ properties: {
545
+ },
546
+ })({ names: 'quan' }),
547
+ [],
548
+ );
549
+
550
+ assert.deepEqual(
551
+ select({
552
+ type: 'object',
553
+ properties: {
554
+ name: {
555
+ type: 'string',
556
+ },
557
+ arr: {
558
+ type: 'array',
559
+ properties: {
560
+ name: {
561
+ type: 'string',
562
+ },
563
+ age: ['_age', { type: 'integer' }],
564
+ test: ['empty', { type: 'string' }],
565
+ big: ['$obj.big', { type: 'number' }],
566
+ },
567
+ },
568
+ },
569
+ })({
570
+ name: 'root',
571
+ obj: {
572
+ big: '66.66',
573
+ },
574
+ arr: [
575
+ {
576
+ name: '11',
577
+ _age: '22.2',
578
+ },
579
+ {
580
+ name: '22',
581
+ _age: '23.3',
582
+ },
583
+ ],
584
+ }),
585
+ {
586
+ name: 'root',
587
+ arr: [
588
+ {
589
+ name: '11',
590
+ age: 22,
591
+ test: null,
592
+ big: 66.66,
593
+ },
594
+ {
595
+ name: '22',
596
+ age: 23,
597
+ test: null,
598
+ big: 66.66,
599
+ },
600
+ ],
601
+ },
602
+ );
603
+ });
604
+
605
+ test('select > index, resolve', () => {
606
+ assert.equal(
607
+ select({
608
+ type: 'integer',
609
+ resolve: (v) => v + 1,
610
+ })(88),
611
+ 89,
612
+ );
613
+ assert.equal(
614
+ select(['age', {
615
+ type: 'integer',
616
+ resolve: (v) => `${v + 1}`,
617
+ }])({ age: 88 }),
618
+ 89,
619
+ );
620
+ assert.deepEqual(
621
+ select({
622
+ type: 'object',
623
+ properties: {
624
+ name: {
625
+ type: 'string',
626
+ resolve: (a, b) => `${a}_${b.aa}`,
627
+ },
628
+ age: {
629
+ type: 'integer',
630
+ resolve: (a) => a + 1,
631
+ },
632
+ },
633
+ })({
634
+ name: 'quan',
635
+ aa: 'xx',
636
+ age: 33,
637
+ }),
638
+ {
639
+ name: 'quan_xx',
640
+ age: 34,
641
+ },
642
+ );
643
+ assert.deepEqual(
644
+ select({
645
+ type: 'object',
646
+ properties: {
647
+ name: {
648
+ type: 'string',
649
+ resolve: (a, b) => `${a}_${b.aa}`,
650
+ },
651
+ age: ['big', {
652
+ type: 'integer',
653
+ resolve: (a) => a + 1,
654
+ }],
655
+ },
656
+ })({
657
+ name: 'quan',
658
+ aa: 'xx',
659
+ big: 33,
660
+ }),
661
+ {
662
+ name: 'quan_xx',
663
+ age: 34,
664
+ },
665
+ );
666
+ assert.deepEqual(
667
+ select({
668
+ type: 'object',
669
+ properties: {
670
+ name: {
671
+ type: 'string',
672
+ resolve: (a, b) => `${a}_${b.aa}`,
673
+ },
674
+ obj: {
675
+ type: 'object',
676
+ properties: {
677
+ name: {
678
+ type: 'string',
679
+ },
680
+ age: ['big', {
681
+ type: 'integer',
682
+ resolve: (a) => a + 1,
683
+ }],
684
+ ding: {
685
+ type: 'string',
686
+ resolve: (a, b) => `${b.name}_${a}`,
687
+ },
688
+ },
689
+ },
690
+ },
691
+ })({
692
+ name: 'quan',
693
+ aa: 'xx',
694
+ obj: {
695
+ name: 'rice',
696
+ big: 33,
697
+ ding: 'aaa',
698
+ },
699
+ }),
700
+ {
701
+ name: 'quan_xx',
702
+ obj: {
703
+ name: 'rice',
704
+ age: 34,
705
+ ding: 'quan_aaa',
706
+ },
707
+ },
708
+ );
709
+ assert.deepEqual(
710
+ select(
711
+ {
712
+ type: 'object',
713
+ properties: {
714
+ name: {
715
+ type: 'string',
716
+ },
717
+ resolve: {
718
+ type: 'string',
719
+ },
720
+ },
721
+ },
722
+ )({ name: 'aaa', resolve: 'resolve' }),
723
+ { name: 'aaa', resolve: 'resolve' },
724
+ );
725
+ assert.deepEqual(
726
+ select(
727
+ {
728
+ type: 'object',
729
+ resolve: () => ({ name: 'xxx' }),
730
+ properties: {
731
+ name: {
732
+ type: 'string',
733
+ },
734
+ resolve: {
735
+ type: 'string',
736
+ },
737
+ },
738
+ },
739
+ )({ name: 'aaa', resolve: 'resolve' }),
740
+ { name: 'aaa', resolve: 'resolve' },
741
+ );
742
+ });