@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/CHANGELOG.md +22 -0
- package/lib/allocator.js +8 -11
- package/lib/allocator.js.map +1 -1
- package/lib/allocator.spec.js +25 -25
- package/lib/allocator.spec.js.map +1 -1
- package/lib/builder.js +7 -7
- package/lib/builder.js.map +1 -1
- package/lib/config.d.ts +4 -0
- package/lib/config.js +5 -1
- package/lib/config.js.map +1 -1
- package/lib/traffic.js +2 -5
- package/lib/traffic.js.map +1 -1
- package/lib/traffic.spec.js +39 -162
- package/lib/traffic.spec.js.map +1 -1
- package/package.json +5 -5
- package/src/allocator.spec.ts +31 -30
- package/src/allocator.ts +9 -11
- package/src/builder.ts +13 -7
- package/src/config.ts +8 -1
- package/src/traffic.spec.ts +39 -162
- package/src/traffic.ts +12 -7
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
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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(
|
|
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(
|
|
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
|
|
package/src/traffic.spec.ts
CHANGED
|
@@ -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 {
|
|
2
|
-
|
|
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 : [
|
|
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;
|