@featurevisor/core 0.23.0 → 0.25.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.
package/src/allocator.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Range, Percentage } from "@featurevisor/types";
2
+ import { getStartEndFromRange } from "@featurevisor/sdk";
2
3
 
3
4
  export function getAllocation(availableRanges: Range[], fill: Percentage): Range[] {
4
5
  const result: Range[] = [];
@@ -7,11 +8,10 @@ export function getAllocation(availableRanges: Range[], fill: Percentage): Range
7
8
  let i = 0;
8
9
  while (remaining > 0 && i < availableRanges.length) {
9
10
  const range = availableRanges[i];
10
- const rangeFill = Math.min(remaining, range.end - range.start);
11
- result.push({
12
- start: range.start,
13
- end: range.start + rangeFill,
14
- });
11
+ const [start, end] = getStartEndFromRange(range);
12
+
13
+ const rangeFill = Math.min(remaining, end - start);
14
+ result.push([start, start + rangeFill]);
15
15
  remaining -= rangeFill;
16
16
  i++;
17
17
  }
@@ -29,12 +29,10 @@ export function getUpdatedAvailableRangesAfterFilling(
29
29
  let i = 0;
30
30
  while (remaining > 0 && i < availableRanges.length) {
31
31
  const range = availableRanges[i];
32
- const rangeFill = Math.min(remaining, range.end - range.start);
33
- if (rangeFill < range.end - range.start) {
34
- result.push({
35
- start: range.start + rangeFill,
36
- end: range.end,
37
- });
32
+ const [start, end] = getStartEndFromRange(range);
33
+ const rangeFill = Math.min(remaining, end - start);
34
+ if (rangeFill < end - start) {
35
+ result.push([start + rangeFill, end]);
38
36
  }
39
37
  remaining -= rangeFill;
40
38
  i++;
package/src/builder.ts CHANGED
@@ -87,10 +87,7 @@ export function getFeatureRanges(projectConfig: ProjectConfig): Map<FeatureKey,
87
87
  const start = isFirstSlot ? accumulatedPercentage : accumulatedPercentage + 1;
88
88
  const end = accumulatedPercentage + slot.percentage * 1000;
89
89
 
90
- featureRangesForFeature.push({
91
- start,
92
- end,
93
- });
90
+ featureRangesForFeature.push([start, end]);
94
91
 
95
92
  featureRanges.set(slot.feature, featureRangesForFeature);
96
93
  }
@@ -218,7 +215,6 @@ export function buildDatafile(
218
215
 
219
216
  // update state in memory, so that next datafile build can use it (in case it contains the same feature)
220
217
  existingState.features[featureKey] = {
221
- revision: options.revision,
222
218
  variations: feature.variations.map((v: Variation) => {
223
219
  return {
224
220
  value: v.value,
@@ -364,7 +360,12 @@ export function buildProject(rootDirectoryPath, projectConfig: ProjectConfig) {
364
360
  mkdirp.sync(outputEnvironmentDirPath);
365
361
 
366
362
  const outputFilePath = getDatafilePath(projectConfig, environment, tag);
367
- fs.writeFileSync(outputFilePath, JSON.stringify(datafileContent));
363
+ fs.writeFileSync(
364
+ outputFilePath,
365
+ projectConfig.prettyDatafile
366
+ ? JSON.stringify(datafileContent, null, 2)
367
+ : JSON.stringify(datafileContent),
368
+ );
368
369
  console.log(` File generated: ${outputFilePath}`);
369
370
  }
370
371
 
@@ -372,6 +373,11 @@ export function buildProject(rootDirectoryPath, projectConfig: ProjectConfig) {
372
373
  if (!fs.existsSync(projectConfig.stateDirectoryPath)) {
373
374
  mkdirp.sync(projectConfig.stateDirectoryPath);
374
375
  }
375
- fs.writeFileSync(existingStateFilePath, JSON.stringify(existingState));
376
+ fs.writeFileSync(
377
+ existingStateFilePath,
378
+ projectConfig.prettyState
379
+ ? JSON.stringify(existingState, null, 2)
380
+ : JSON.stringify(existingState),
381
+ );
376
382
  }
377
383
  }
package/src/config.ts CHANGED
@@ -18,6 +18,9 @@ export const DEFAULT_ENVIRONMENTS = ["staging", "production"];
18
18
  export const DEFAULT_TAGS = ["all"];
19
19
  export const DEFAULT_BUCKET_BY_ATTRIBUTE = "userId";
20
20
 
21
+ export const DEFAULT_PRETTY_STATE = false;
22
+ export const DEFAULT_PRETTY_DATAFILE = false;
23
+
21
24
  export const SCHEMA_VERSION = "1";
22
25
 
23
26
  export interface ProjectConfig {
@@ -31,7 +34,8 @@ export interface ProjectConfig {
31
34
  environments: string[];
32
35
  tags: string[];
33
36
  defaultBucketBy: BucketBy;
34
-
37
+ prettyState: boolean;
38
+ prettyDatafile: boolean;
35
39
  siteExportDirectoryPath: string;
36
40
  }
37
41
 
@@ -51,6 +55,9 @@ export function getProjectConfig(rootDirectoryPath: string): ProjectConfig {
51
55
  tags: DEFAULT_TAGS,
52
56
  defaultBucketBy: "userId",
53
57
 
58
+ prettyState: DEFAULT_PRETTY_STATE,
59
+ prettyDatafile: DEFAULT_PRETTY_DATAFILE,
60
+
54
61
  siteExportDirectoryPath: path.join(rootDirectoryPath, SITE_EXPORT_DIRECTORY_NAME),
55
62
  };
56
63
 
@@ -41,10 +41,7 @@ describe("core: Traffic", function () {
41
41
  {
42
42
  variation: "on",
43
43
  percentage: 80000,
44
- range: {
45
- start: 0,
46
- end: 80000,
47
- },
44
+ range: [0, 80000],
48
45
  },
49
46
  ],
50
47
  },
@@ -87,18 +84,12 @@ describe("core: Traffic", function () {
87
84
  {
88
85
  variation: "on",
89
86
  percentage: 40000,
90
- range: {
91
- start: 0,
92
- end: 40000,
93
- },
87
+ range: [0, 40000],
94
88
  },
95
89
  {
96
90
  variation: "off",
97
91
  percentage: 40000,
98
- range: {
99
- start: 40000,
100
- end: 80000,
101
- },
92
+ range: [40000, 80000],
102
93
  },
103
94
  ],
104
95
  },
@@ -145,26 +136,17 @@ describe("core: Traffic", function () {
145
136
  {
146
137
  variation: "yes",
147
138
  percentage: 33330,
148
- range: {
149
- start: 0,
150
- end: 33330,
151
- },
139
+ range: [0, 33330],
152
140
  },
153
141
  {
154
142
  variation: "no",
155
143
  percentage: 33330,
156
- range: {
157
- start: 33330,
158
- end: 66660,
159
- },
144
+ range: [33330, 66660],
160
145
  },
161
146
  {
162
147
  variation: "maybe",
163
148
  percentage: 33340,
164
- range: {
165
- start: 66660,
166
- end: 100000,
167
- },
149
+ range: [66660, 100000],
168
150
  },
169
151
  ],
170
152
  },
@@ -196,7 +178,6 @@ describe("core: Traffic", function () {
196
178
 
197
179
  // existing feature from previous release
198
180
  {
199
- revision: "1",
200
181
  variations: [
201
182
  {
202
183
  value: "on",
@@ -215,18 +196,12 @@ describe("core: Traffic", function () {
215
196
  {
216
197
  variation: "on",
217
198
  percentage: 40000,
218
- range: {
219
- start: 0,
220
- end: 40000,
221
- },
199
+ range: [0, 40000],
222
200
  },
223
201
  {
224
202
  variation: "off",
225
203
  percentage: 40000,
226
- range: {
227
- start: 40000,
228
- end: 80000,
229
- },
204
+ range: [40000, 80000],
230
205
  },
231
206
  ],
232
207
  },
@@ -244,36 +219,24 @@ describe("core: Traffic", function () {
244
219
  {
245
220
  variation: "on",
246
221
  percentage: 40000,
247
- range: {
248
- start: 0,
249
- end: 40000,
250
- },
222
+ range: [0, 40000],
251
223
  },
252
224
  {
253
225
  variation: "off",
254
226
  percentage: 40000,
255
- range: {
256
- start: 40000,
257
- end: 80000,
258
- },
227
+ range: [40000, 80000],
259
228
  },
260
229
 
261
230
  // new
262
231
  {
263
232
  variation: "on",
264
233
  percentage: 5000,
265
- range: {
266
- start: 80000,
267
- end: 85000,
268
- },
234
+ range: [80000, 85000],
269
235
  },
270
236
  {
271
237
  variation: "off",
272
238
  percentage: 5000,
273
- range: {
274
- start: 85000,
275
- end: 90000,
276
- },
239
+ range: [85000, 90000],
277
240
  },
278
241
  ],
279
242
  },
@@ -305,7 +268,6 @@ describe("core: Traffic", function () {
305
268
 
306
269
  // existing feature from previous release
307
270
  {
308
- revision: "1",
309
271
  variations: [
310
272
  {
311
273
  value: "on",
@@ -324,18 +286,12 @@ describe("core: Traffic", function () {
324
286
  {
325
287
  variation: "on",
326
288
  percentage: 40000,
327
- range: {
328
- start: 0,
329
- end: 40000,
330
- },
289
+ range: [0, 40000],
331
290
  },
332
291
  {
333
292
  variation: "off",
334
293
  percentage: 40000,
335
- range: {
336
- start: 40000,
337
- end: 80000,
338
- },
294
+ range: [40000, 80000],
339
295
  },
340
296
  ],
341
297
  },
@@ -352,18 +308,12 @@ describe("core: Traffic", function () {
352
308
  {
353
309
  variation: "on",
354
310
  percentage: 35000,
355
- range: {
356
- start: 0,
357
- end: 35000,
358
- },
311
+ range: [0, 35000],
359
312
  },
360
313
  {
361
314
  variation: "off",
362
315
  percentage: 35000,
363
- range: {
364
- start: 35000,
365
- end: 70000,
366
- },
316
+ range: [35000, 70000],
367
317
  },
368
318
  ],
369
319
  },
@@ -399,7 +349,6 @@ describe("core: Traffic", function () {
399
349
 
400
350
  // existing feature from previous release
401
351
  {
402
- revision: "1",
403
352
  variations: [
404
353
  {
405
354
  value: "a",
@@ -418,18 +367,12 @@ describe("core: Traffic", function () {
418
367
  {
419
368
  variation: "a",
420
369
  percentage: 40000,
421
- range: {
422
- start: 0,
423
- end: 40000,
424
- },
370
+ range: [0, 40000],
425
371
  },
426
372
  {
427
373
  variation: "b",
428
374
  percentage: 40000,
429
- range: {
430
- start: 40000,
431
- end: 80000,
432
- },
375
+ range: [40000, 80000],
433
376
  },
434
377
  ],
435
378
  },
@@ -446,26 +389,17 @@ describe("core: Traffic", function () {
446
389
  {
447
390
  variation: "a",
448
391
  percentage: 29997,
449
- range: {
450
- start: 0,
451
- end: 29997,
452
- },
392
+ range: [0, 29997],
453
393
  },
454
394
  {
455
395
  variation: "b",
456
396
  percentage: 29997,
457
- range: {
458
- start: 29997,
459
- end: 59994,
460
- },
397
+ range: [29997, 59994],
461
398
  },
462
399
  {
463
400
  variation: "c",
464
401
  percentage: 30006,
465
- range: {
466
- start: 59994,
467
- end: 90000,
468
- },
402
+ range: [59994, 90000],
469
403
  },
470
404
  ],
471
405
  },
@@ -505,7 +439,6 @@ describe("core: Traffic", function () {
505
439
 
506
440
  // existing feature from previous release
507
441
  {
508
- revision: "1",
509
442
  variations: [
510
443
  {
511
444
  value: "a",
@@ -524,18 +457,12 @@ describe("core: Traffic", function () {
524
457
  {
525
458
  variation: "a",
526
459
  percentage: 40000,
527
- range: {
528
- start: 0,
529
- end: 40000,
530
- },
460
+ range: [0, 40000],
531
461
  },
532
462
  {
533
463
  variation: "b",
534
464
  percentage: 40000,
535
- range: {
536
- start: 40000,
537
- end: 80000,
538
- },
465
+ range: [40000, 80000],
539
466
  },
540
467
  ],
541
468
  },
@@ -552,34 +479,22 @@ describe("core: Traffic", function () {
552
479
  {
553
480
  variation: "a",
554
481
  percentage: 25000,
555
- range: {
556
- start: 0,
557
- end: 25000,
558
- },
482
+ range: [0, 25000],
559
483
  },
560
484
  {
561
485
  variation: "b",
562
486
  percentage: 25000,
563
- range: {
564
- start: 25000,
565
- end: 50000,
566
- },
487
+ range: [25000, 50000],
567
488
  },
568
489
  {
569
490
  variation: "c",
570
491
  percentage: 25000,
571
- range: {
572
- start: 50000,
573
- end: 75000,
574
- },
492
+ range: [50000, 75000],
575
493
  },
576
494
  {
577
495
  variation: "d",
578
496
  percentage: 25000,
579
- range: {
580
- start: 75000,
581
- end: 100000,
582
- },
497
+ range: [75000, 100000],
583
498
  },
584
499
  ],
585
500
  },
@@ -611,7 +526,6 @@ describe("core: Traffic", function () {
611
526
 
612
527
  // existing feature from previous release
613
528
  {
614
- revision: "1",
615
529
  variations: [
616
530
  {
617
531
  value: "a",
@@ -638,34 +552,22 @@ describe("core: Traffic", function () {
638
552
  {
639
553
  variation: "a",
640
554
  percentage: 25000,
641
- range: {
642
- start: 0,
643
- end: 25000,
644
- },
555
+ range: [0, 25000],
645
556
  },
646
557
  {
647
558
  variation: "b",
648
559
  percentage: 25000,
649
- range: {
650
- start: 25000,
651
- end: 50000,
652
- },
560
+ range: [25000, 50000],
653
561
  },
654
562
  {
655
563
  variation: "c",
656
564
  percentage: 25000,
657
- range: {
658
- start: 50000,
659
- end: 75000,
660
- },
565
+ range: [50000, 75000],
661
566
  },
662
567
  {
663
568
  variation: "d",
664
569
  percentage: 25000,
665
- range: {
666
- start: 75000,
667
- end: 100000,
668
- },
570
+ range: [75000, 100000],
669
571
  },
670
572
  ],
671
573
  },
@@ -682,18 +584,12 @@ describe("core: Traffic", function () {
682
584
  {
683
585
  variation: "a",
684
586
  percentage: 50000,
685
- range: {
686
- start: 0,
687
- end: 50000,
688
- },
587
+ range: [0, 50000],
689
588
  },
690
589
  {
691
590
  variation: "b",
692
591
  percentage: 50000,
693
- range: {
694
- start: 50000,
695
- end: 100000,
696
- },
592
+ range: [50000, 100000],
697
593
  },
698
594
  ],
699
595
  },
@@ -725,7 +621,6 @@ describe("core: Traffic", function () {
725
621
 
726
622
  // existing feature from previous release
727
623
  {
728
- revision: "1",
729
624
  variations: [
730
625
  {
731
626
  value: "a",
@@ -752,34 +647,22 @@ describe("core: Traffic", function () {
752
647
  {
753
648
  variation: "a",
754
649
  percentage: 25000,
755
- range: {
756
- start: 0,
757
- end: 25000,
758
- },
650
+ range: [0, 25000],
759
651
  },
760
652
  {
761
653
  variation: "b",
762
654
  percentage: 25000,
763
- range: {
764
- start: 25000,
765
- end: 50000,
766
- },
655
+ range: [25000, 50000],
767
656
  },
768
657
  {
769
658
  variation: "c",
770
659
  percentage: 25000,
771
- range: {
772
- start: 50000,
773
- end: 75000,
774
- },
660
+ range: [50000, 75000],
775
661
  },
776
662
  {
777
663
  variation: "d",
778
664
  percentage: 25000,
779
- range: {
780
- start: 75000,
781
- end: 100000,
782
- },
665
+ range: [75000, 100000],
783
666
  },
784
667
  ],
785
668
  },
@@ -796,18 +679,12 @@ describe("core: Traffic", function () {
796
679
  {
797
680
  variation: "a",
798
681
  percentage: 40000,
799
- range: {
800
- start: 0,
801
- end: 40000,
802
- },
682
+ range: [0, 40000],
803
683
  },
804
684
  {
805
685
  variation: "b",
806
686
  percentage: 40000,
807
- range: {
808
- start: 40000,
809
- end: 80000,
810
- },
687
+ range: [40000, 80000],
811
688
  },
812
689
  ],
813
690
  },
package/src/traffic.ts CHANGED
@@ -1,5 +1,13 @@
1
- import { Rule, ExistingFeature, Traffic, Variation, Range, Percentage } from "@featurevisor/types";
2
- import { MAX_BUCKETED_NUMBER } from "@featurevisor/sdk";
1
+ import {
2
+ Rule,
3
+ ExistingFeature,
4
+ Traffic,
5
+ Variation,
6
+ Range,
7
+ Percentage,
8
+ RangeTuple,
9
+ } from "@featurevisor/types";
10
+ import { MAX_BUCKETED_NUMBER, getStartEndFromRange } from "@featurevisor/sdk";
3
11
 
4
12
  import { getAllocation, getUpdatedAvailableRangesAfterFilling } from "./allocator";
5
13
 
@@ -62,7 +70,7 @@ export function getTraffic(
62
70
 
63
71
  // @TODO: may be pass from builder directly?
64
72
  const availableRanges =
65
- ranges && ranges.length > 0 ? ranges : [{ start: 0, end: MAX_BUCKETED_NUMBER }];
73
+ ranges && ranges.length > 0 ? ranges : ([[0, MAX_BUCKETED_NUMBER]] as RangeTuple[]);
66
74
 
67
75
  parsedRules.forEach(function (parsedRule) {
68
76
  const rulePercentage = parsedRule.percentage; // 0 - 100
@@ -113,10 +121,7 @@ export function getTraffic(
113
121
  const result = {
114
122
  variation,
115
123
  percentage, // @TODO remove it in next breaking semver
116
- range: range || {
117
- start: lastEnd,
118
- end: percentage,
119
- },
124
+ range: range ? getStartEndFromRange(range) : ([lastEnd, percentage] as RangeTuple),
120
125
  };
121
126
 
122
127
  existingSum += percentage || 0;