@eventvisor/sdk 0.0.2

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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/attributesManager.d.ts +36 -0
  4. package/dist/bucketer.d.ts +30 -0
  5. package/dist/compareVersions.d.ts +4 -0
  6. package/dist/conditions.d.ts +20 -0
  7. package/dist/datafileReader.d.ts +29 -0
  8. package/dist/effectsManager.d.ts +33 -0
  9. package/dist/emitter.d.ts +11 -0
  10. package/dist/index.d.ts +12 -0
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/index.mjs +2 -0
  14. package/dist/index.mjs.gz +0 -0
  15. package/dist/index.mjs.map +1 -0
  16. package/dist/instance.d.ts +67 -0
  17. package/dist/logger.d.ts +26 -0
  18. package/dist/modulesManager.d.ts +67 -0
  19. package/dist/murmurhash.d.ts +1 -0
  20. package/dist/persister.d.ts +40 -0
  21. package/dist/sourceResolver.d.ts +31 -0
  22. package/dist/transformer.d.ts +21 -0
  23. package/dist/validator.d.ts +28 -0
  24. package/jest.config.js +6 -0
  25. package/lib/attributesManager.d.ts +36 -0
  26. package/lib/bucketer.d.ts +30 -0
  27. package/lib/compareVersions.d.ts +4 -0
  28. package/lib/conditions.d.ts +20 -0
  29. package/lib/datafileReader.d.ts +29 -0
  30. package/lib/effectsManager.d.ts +33 -0
  31. package/lib/emitter.d.ts +11 -0
  32. package/lib/index.d.ts +12 -0
  33. package/lib/instance.d.ts +67 -0
  34. package/lib/logger.d.ts +26 -0
  35. package/lib/modulesManager.d.ts +67 -0
  36. package/lib/murmurhash.d.ts +1 -0
  37. package/lib/persister.d.ts +40 -0
  38. package/lib/sourceResolver.d.ts +31 -0
  39. package/lib/transformer.d.ts +21 -0
  40. package/lib/validator.d.ts +28 -0
  41. package/package.json +45 -0
  42. package/src/attributesManager.ts +181 -0
  43. package/src/bucketer.spec.ts +156 -0
  44. package/src/bucketer.ts +152 -0
  45. package/src/compareVersions.ts +93 -0
  46. package/src/conditions.ts +224 -0
  47. package/src/datafileReader.ts +133 -0
  48. package/src/effectsManager.ts +214 -0
  49. package/src/emitter.ts +64 -0
  50. package/src/index.spec.ts +5 -0
  51. package/src/index.ts +14 -0
  52. package/src/instance.spec.ts +184 -0
  53. package/src/instance.ts +608 -0
  54. package/src/logger.ts +90 -0
  55. package/src/modulesManager.ts +276 -0
  56. package/src/murmurhash.ts +71 -0
  57. package/src/persister.ts +162 -0
  58. package/src/sourceResolver.spec.ts +253 -0
  59. package/src/sourceResolver.ts +213 -0
  60. package/src/transformer.ts +316 -0
  61. package/src/transformer_static.spec.ts +377 -0
  62. package/src/transformer_types.spec.ts +820 -0
  63. package/src/validator.spec.ts +579 -0
  64. package/src/validator.ts +366 -0
  65. package/tsconfig.cjs.json +8 -0
  66. package/tsconfig.esm.json +8 -0
  67. package/webpack.config.js +80 -0
@@ -0,0 +1,820 @@
1
+ import { Transformer } from "./transformer";
2
+ import { emptyDatafile, DatafileReader } from "./datafileReader";
3
+ import { createLogger } from "./logger";
4
+ import { ModulesManager } from "./modulesManager";
5
+ import { EffectsManager } from "./effectsManager";
6
+ import { AttributesManager } from "./attributesManager";
7
+ import { SourceResolver } from "./sourceResolver";
8
+ import { ConditionsChecker } from "./conditions";
9
+ import { Emitter } from "./emitter";
10
+ import { Validator } from "./validator";
11
+
12
+ describe("Transformer types", () => {
13
+ // initialize the dependencies
14
+ const emitter = new Emitter();
15
+
16
+ const logger = createLogger({ level: "fatal" });
17
+
18
+ const datafileReader = new DatafileReader({
19
+ datafile: {
20
+ ...emptyDatafile,
21
+ attributes: {
22
+ ...emptyDatafile.attributes,
23
+ browserName: {
24
+ type: "string",
25
+ },
26
+ browserVersion: {
27
+ type: "string",
28
+ },
29
+ },
30
+ },
31
+ logger,
32
+ });
33
+
34
+ const modulesManager = new ModulesManager({
35
+ logger,
36
+ getDatafileReader: () => datafileReader,
37
+ getSourceResolver: () => sourceResolver,
38
+ });
39
+
40
+ const validator = new Validator({
41
+ logger,
42
+ getSourceResolver: () => sourceResolver,
43
+ });
44
+
45
+ const attributesManager = new AttributesManager({
46
+ logger,
47
+ emitter,
48
+ validator,
49
+ getDatafileReader: () => datafileReader,
50
+ getTransformer: () => transformer,
51
+ getConditionsChecker: () => conditionsChecker,
52
+ modulesManager,
53
+ });
54
+
55
+ const effectsManager = new EffectsManager({
56
+ logger,
57
+ getDatafileReader: () => datafileReader,
58
+ getTransformer: () => transformer,
59
+ getConditionsChecker: () => conditionsChecker,
60
+ modulesManager: modulesManager,
61
+ });
62
+
63
+ const sourceResolver = new SourceResolver({
64
+ logger,
65
+ modulesManager,
66
+ attributesManager,
67
+ effectsManager,
68
+ });
69
+
70
+ const conditionsChecker = new ConditionsChecker({
71
+ logger,
72
+ getRegex: (regexString, regexFlags) => new RegExp(regexString, regexFlags),
73
+ sourceResolver,
74
+ });
75
+
76
+ const transformer = new Transformer({
77
+ logger,
78
+ conditionsChecker,
79
+ sourceResolver,
80
+ });
81
+
82
+ /**
83
+ * Increment
84
+ */
85
+ describe("increment", () => {
86
+ it("increment without payload", async () => {
87
+ expect(
88
+ await transformer.applyAll(
89
+ // value
90
+ {
91
+ count: 1,
92
+ },
93
+
94
+ // transforms
95
+ [
96
+ {
97
+ type: "increment",
98
+ target: "count",
99
+ },
100
+ ],
101
+ ),
102
+ ).toEqual({
103
+ count: 2,
104
+ });
105
+ });
106
+
107
+ it("increment without target", async () => {
108
+ expect(
109
+ await transformer.applyAll(
110
+ // value
111
+ 1,
112
+
113
+ // transforms
114
+ [
115
+ {
116
+ type: "increment",
117
+ },
118
+ ],
119
+ ),
120
+ ).toEqual(2);
121
+ });
122
+
123
+ it("increment by value", async () => {
124
+ expect(
125
+ await transformer.applyAll(
126
+ // value
127
+ 1,
128
+
129
+ // transforms
130
+ [
131
+ {
132
+ type: "increment",
133
+ value: 5,
134
+ },
135
+ ],
136
+ ),
137
+ ).toEqual(6);
138
+ });
139
+ });
140
+
141
+ /**
142
+ * Decrement
143
+ */
144
+ describe("decrement", () => {
145
+ it("increment without payload", async () => {
146
+ expect(
147
+ await transformer.applyAll(
148
+ // value
149
+ {
150
+ count: 1,
151
+ },
152
+
153
+ // transforms
154
+ [
155
+ {
156
+ type: "decrement",
157
+ target: "count",
158
+ },
159
+ ],
160
+ ),
161
+ ).toEqual({
162
+ count: 0,
163
+ });
164
+ });
165
+
166
+ it("decrement without target", async () => {
167
+ expect(
168
+ await transformer.applyAll(
169
+ // value
170
+ 1,
171
+
172
+ // transforms
173
+ [
174
+ {
175
+ type: "decrement",
176
+ },
177
+ ],
178
+ ),
179
+ ).toEqual(0);
180
+ });
181
+
182
+ it("decrement by value", async () => {
183
+ expect(
184
+ await transformer.applyAll(
185
+ // value
186
+ 1,
187
+
188
+ // transforms
189
+ [
190
+ {
191
+ type: "decrement",
192
+ value: 5,
193
+ },
194
+ ],
195
+ ),
196
+ ).toEqual(-4);
197
+ });
198
+ });
199
+
200
+ /**
201
+ * concat
202
+ */
203
+ describe("concat", () => {
204
+ it("concat with payload", async () => {
205
+ expect(
206
+ await transformer.applyAll(
207
+ // value
208
+ {
209
+ firstName: "Bilbo",
210
+ lastName: "Baggins",
211
+ },
212
+
213
+ // transforms
214
+ [
215
+ {
216
+ type: "concat",
217
+ payload: ["firstName", "lastName"],
218
+ target: "fullName",
219
+ separator: ";",
220
+ },
221
+ {
222
+ type: "remove",
223
+ target: "firstName",
224
+ },
225
+ {
226
+ type: "remove",
227
+ target: "lastName",
228
+ },
229
+ ],
230
+
231
+ // inputs
232
+ {
233
+ payload: {
234
+ firstName: "Bilbo",
235
+ lastName: "Baggins",
236
+ },
237
+ },
238
+ ),
239
+ ).toEqual({
240
+ fullName: "Bilbo;Baggins",
241
+ });
242
+ });
243
+ });
244
+
245
+ /**
246
+ * remove
247
+ */
248
+ describe("remove", () => {
249
+ it("remove properties", async () => {
250
+ expect(
251
+ await transformer.applyAll(
252
+ // value
253
+ {
254
+ firstName: "Bilbo",
255
+ lastName: "Baggins",
256
+ },
257
+
258
+ // transforms
259
+ [
260
+ {
261
+ type: "remove",
262
+ target: "firstName",
263
+ },
264
+ ],
265
+ ),
266
+ ).toEqual({
267
+ lastName: "Baggins",
268
+ });
269
+ });
270
+ });
271
+
272
+ /**
273
+ * rename
274
+ */
275
+ describe("rename", () => {
276
+ it("rename properties", async () => {
277
+ expect(
278
+ await transformer.applyAll(
279
+ // value
280
+ {
281
+ firstName: "Bilbo",
282
+ },
283
+
284
+ // transforms
285
+ [
286
+ {
287
+ type: "rename",
288
+ targetMap: {
289
+ firstName: "name",
290
+ },
291
+ },
292
+ ],
293
+ ),
294
+ ).toEqual({
295
+ name: "Bilbo",
296
+ });
297
+ });
298
+
299
+ it("rename nested properties", async () => {
300
+ expect(
301
+ await transformer.applyAll(
302
+ // value
303
+ {
304
+ name: {
305
+ firstName: "Bilbo",
306
+ lastName: "Baggins",
307
+ },
308
+ },
309
+
310
+ // transforms
311
+ [
312
+ {
313
+ type: "rename",
314
+ targetMap: {
315
+ "name.firstName": "name.first_name",
316
+ "name.lastName": "name.last_name",
317
+ },
318
+ },
319
+ ],
320
+ ),
321
+ ).toEqual({
322
+ name: {
323
+ first_name: "Bilbo",
324
+ last_name: "Baggins",
325
+ },
326
+ });
327
+ });
328
+ });
329
+
330
+ /**
331
+ * set
332
+ */
333
+ describe("set", () => {
334
+ it("with payload", async () => {
335
+ expect(
336
+ await transformer.applyAll(
337
+ // value
338
+ {
339
+ firstName: "Bilbo",
340
+ },
341
+
342
+ // transforms
343
+ [
344
+ {
345
+ type: "set",
346
+ target: "lastName",
347
+ value: "Baggins",
348
+ },
349
+ ],
350
+
351
+ // inputs
352
+ {
353
+ payload: {
354
+ firstName: "Bilbo",
355
+ },
356
+ },
357
+ ),
358
+ ).toEqual({
359
+ firstName: "Bilbo",
360
+ lastName: "Baggins",
361
+ });
362
+ });
363
+
364
+ it("without payload", async () => {
365
+ expect(
366
+ await transformer.applyAll(
367
+ // value
368
+ {
369
+ firstName: "Bilbo",
370
+ },
371
+
372
+ // transforms
373
+ [
374
+ {
375
+ type: "set",
376
+ target: "lastName",
377
+ value: "Baggins",
378
+ },
379
+ ],
380
+ ),
381
+ ).toEqual({
382
+ firstName: "Bilbo",
383
+ lastName: "Baggins",
384
+ });
385
+ });
386
+
387
+ it("without target", async () => {
388
+ expect(
389
+ await transformer.applyAll(
390
+ // value
391
+ {},
392
+
393
+ // transforms
394
+ [
395
+ {
396
+ type: "set",
397
+ value: {
398
+ firstName: "Bilbo",
399
+ lastName: "Baggins",
400
+ },
401
+ },
402
+ ],
403
+ ),
404
+ ).toEqual({
405
+ firstName: "Bilbo",
406
+ lastName: "Baggins",
407
+ });
408
+ });
409
+ });
410
+
411
+ /**
412
+ * trim
413
+ */
414
+ describe("trim", () => {
415
+ it("with payload", async () => {
416
+ expect(
417
+ await transformer.applyAll(
418
+ // value
419
+ {
420
+ firstName: " John ",
421
+ },
422
+
423
+ // transforms
424
+ [
425
+ {
426
+ type: "trim",
427
+ target: "firstName",
428
+ },
429
+ ],
430
+
431
+ // inputs
432
+ {
433
+ payload: {
434
+ firstName: " John ",
435
+ },
436
+ },
437
+ ),
438
+ ).toEqual({
439
+ firstName: "John",
440
+ });
441
+ });
442
+
443
+ it("without payload", async () => {
444
+ expect(
445
+ await transformer.applyAll(
446
+ // value
447
+ {
448
+ firstName: " John ",
449
+ },
450
+
451
+ // transforms
452
+ [
453
+ {
454
+ type: "trim",
455
+ target: "firstName",
456
+ },
457
+ ],
458
+ ),
459
+ ).toEqual({
460
+ firstName: "John",
461
+ });
462
+ });
463
+
464
+ it("against multiple targets", async () => {
465
+ expect(
466
+ await transformer.applyAll(
467
+ // value
468
+ {
469
+ firstName: " John ",
470
+ lastName: " Doe ",
471
+ },
472
+
473
+ // transforms
474
+ [
475
+ {
476
+ type: "trim",
477
+ target: "firstName",
478
+ },
479
+ {
480
+ type: "trim",
481
+ target: "lastName",
482
+ },
483
+ ],
484
+ ),
485
+ ).toEqual({
486
+ firstName: "John",
487
+ lastName: "Doe",
488
+ });
489
+ });
490
+ });
491
+
492
+ /**
493
+ * toInteger
494
+ */
495
+ describe("toInteger", () => {
496
+ it("with payload", async () => {
497
+ expect(
498
+ await transformer.applyAll(
499
+ // value
500
+ {
501
+ age: "25",
502
+ },
503
+
504
+ // transforms
505
+ [
506
+ {
507
+ type: "toInteger",
508
+ target: "age",
509
+ },
510
+ ],
511
+
512
+ // inputs
513
+ {
514
+ payload: {
515
+ age: "25",
516
+ },
517
+ },
518
+ ),
519
+ ).toEqual({
520
+ age: 25,
521
+ });
522
+ });
523
+
524
+ it("without payload", async () => {
525
+ expect(
526
+ await transformer.applyAll(
527
+ // value
528
+ {
529
+ age: "25",
530
+ },
531
+
532
+ // transforms
533
+ [
534
+ {
535
+ type: "toInteger",
536
+ target: "age",
537
+ },
538
+ ],
539
+ ),
540
+ ).toEqual({
541
+ age: 25,
542
+ });
543
+ });
544
+ });
545
+
546
+ /**
547
+ * toDouble
548
+ */
549
+ describe("toDouble", () => {
550
+ it("with payload", async () => {
551
+ expect(
552
+ await transformer.applyAll(
553
+ // value
554
+ {
555
+ age: "25",
556
+ },
557
+
558
+ // transforms
559
+ [
560
+ {
561
+ type: "toDouble",
562
+ target: "age",
563
+ },
564
+ ],
565
+
566
+ // inputs
567
+ {
568
+ payload: {
569
+ age: "25",
570
+ },
571
+ },
572
+ ),
573
+ ).toEqual({
574
+ age: 25.0,
575
+ });
576
+ });
577
+
578
+ it("without payload", async () => {
579
+ expect(
580
+ await transformer.applyAll(
581
+ // value
582
+ {
583
+ age: "25",
584
+ },
585
+
586
+ // transforms
587
+ [
588
+ {
589
+ type: "toDouble",
590
+ target: "age",
591
+ },
592
+ ],
593
+ ),
594
+ ).toEqual({
595
+ age: 25.0,
596
+ });
597
+ });
598
+ });
599
+
600
+ /**
601
+ * toString
602
+ */
603
+ describe("toString", () => {
604
+ it("with payload", async () => {
605
+ expect(
606
+ await transformer.applyAll(
607
+ // value
608
+ {
609
+ age: 25,
610
+ },
611
+
612
+ // transforms
613
+ [
614
+ {
615
+ type: "toString",
616
+ target: "age",
617
+ },
618
+ ],
619
+ ),
620
+ ).toEqual({
621
+ age: "25",
622
+ });
623
+ });
624
+
625
+ it("without payload", async () => {
626
+ expect(
627
+ await transformer.applyAll(
628
+ // value
629
+ {
630
+ age: 25,
631
+ },
632
+
633
+ // transforms
634
+ [
635
+ {
636
+ type: "toString",
637
+ target: "age",
638
+ },
639
+ ],
640
+ ),
641
+ ).toEqual({
642
+ age: "25",
643
+ });
644
+ });
645
+ });
646
+
647
+ /**
648
+ * toBoolean
649
+ */
650
+ describe("toBoolean", () => {
651
+ it("without payload", async () => {
652
+ expect(
653
+ await transformer.applyAll(
654
+ // value
655
+ {
656
+ // true-ish
657
+ a: 1,
658
+ b: "true",
659
+ c: "yes",
660
+ d: "on",
661
+ e: "y",
662
+ f: "checked",
663
+ g: true,
664
+
665
+ // false-ish
666
+ h: 0,
667
+ i: "false",
668
+ j: "no",
669
+ k: "off",
670
+ l: "n",
671
+ m: "unchecked",
672
+ n: false,
673
+ o: "booyakasha!",
674
+ },
675
+
676
+ // transforms
677
+ [
678
+ {
679
+ type: "toBoolean",
680
+ target: "a",
681
+ },
682
+ {
683
+ type: "toBoolean",
684
+ target: "b",
685
+ },
686
+ {
687
+ type: "toBoolean",
688
+ target: "c",
689
+ },
690
+ {
691
+ type: "toBoolean",
692
+ target: "d",
693
+ },
694
+ {
695
+ type: "toBoolean",
696
+ target: "e",
697
+ },
698
+ {
699
+ type: "toBoolean",
700
+ target: "f",
701
+ },
702
+ {
703
+ type: "toBoolean",
704
+ target: "g",
705
+ },
706
+ {
707
+ type: "toBoolean",
708
+ target: "h",
709
+ },
710
+ {
711
+ type: "toBoolean",
712
+ target: "i",
713
+ },
714
+ {
715
+ type: "toBoolean",
716
+ target: "j",
717
+ },
718
+ {
719
+ type: "toBoolean",
720
+ target: "k",
721
+ },
722
+ {
723
+ type: "toBoolean",
724
+ target: "l",
725
+ },
726
+ {
727
+ type: "toBoolean",
728
+ target: "m",
729
+ },
730
+ {
731
+ type: "toBoolean",
732
+ target: "n",
733
+ },
734
+ {
735
+ type: "toBoolean",
736
+ target: "o",
737
+ },
738
+ ],
739
+ ),
740
+ ).toEqual({
741
+ // true-ish
742
+ a: true,
743
+ b: true,
744
+ c: true,
745
+ d: true,
746
+ e: true,
747
+ f: true,
748
+ g: true,
749
+
750
+ // false-ish
751
+ h: false,
752
+ i: false,
753
+ j: false,
754
+ k: false,
755
+ l: false,
756
+ m: false,
757
+ n: false,
758
+ o: false,
759
+ });
760
+ });
761
+ });
762
+
763
+ /**
764
+ * spread
765
+ */
766
+ describe("spread", () => {
767
+ it("with inputs", async () => {
768
+ await attributesManager.setAttribute("browserName", "Chrome");
769
+ await attributesManager.setAttribute("browserVersion", "100");
770
+
771
+ expect(
772
+ await transformer.applyAll(
773
+ // value
774
+ {
775
+ firstName: "Bilbo",
776
+ lastName: "Baggins",
777
+ },
778
+
779
+ // transforms
780
+ [
781
+ {
782
+ type: "set",
783
+ value: {},
784
+ },
785
+ {
786
+ source: "payload",
787
+ type: "spread",
788
+ },
789
+ {
790
+ source: "attributes",
791
+ type: "spread",
792
+ },
793
+ {
794
+ source: "eventName",
795
+ type: "set",
796
+ target: "event",
797
+ },
798
+ ],
799
+
800
+ // inputs
801
+ {
802
+ eventName: "person",
803
+ payload: {
804
+ firstName: "Bilbo",
805
+ lastName: "Baggins",
806
+ },
807
+ },
808
+ ),
809
+ ).toEqual({
810
+ event: "person",
811
+
812
+ firstName: "Bilbo",
813
+ lastName: "Baggins",
814
+
815
+ browserName: "Chrome",
816
+ browserVersion: "100",
817
+ });
818
+ });
819
+ });
820
+ });