@featurevisor/sdk 1.35.3 → 2.0.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +2 -381
  3. package/coverage/clover.xml +707 -645
  4. package/coverage/coverage-final.json +11 -9
  5. package/coverage/lcov-report/{segments.ts.html → bucketer.ts.html} +155 -77
  6. package/coverage/lcov-report/child.ts.html +940 -0
  7. package/coverage/lcov-report/conditions.ts.html +107 -158
  8. package/coverage/lcov-report/datafileReader.ts.html +763 -103
  9. package/coverage/lcov-report/emitter.ts.html +77 -59
  10. package/coverage/lcov-report/evaluate.ts.html +689 -416
  11. package/coverage/lcov-report/events.ts.html +334 -0
  12. package/coverage/lcov-report/helpers.ts.html +184 -0
  13. package/coverage/lcov-report/{bucket.ts.html → hooks.ts.html} +86 -239
  14. package/coverage/lcov-report/index.html +119 -89
  15. package/coverage/lcov-report/instance.ts.html +341 -773
  16. package/coverage/lcov-report/logger.ts.html +64 -64
  17. package/coverage/lcov.info +1433 -1226
  18. package/dist/bucketer.d.ts +11 -0
  19. package/dist/child.d.ts +26 -0
  20. package/dist/compareVersions.d.ts +4 -0
  21. package/dist/conditions.d.ts +4 -4
  22. package/dist/datafileReader.d.ts +26 -6
  23. package/dist/emitter.d.ts +8 -9
  24. package/dist/evaluate.d.ts +31 -29
  25. package/dist/events.d.ts +5 -0
  26. package/dist/helpers.d.ts +5 -0
  27. package/dist/hooks.d.ts +45 -0
  28. package/dist/index.d.ts +3 -2
  29. package/dist/index.js +1 -1
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +1 -1
  32. package/dist/index.mjs.gz +0 -0
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/instance.d.ts +40 -72
  35. package/dist/logger.d.ts +6 -5
  36. package/dist/murmurhash.d.ts +1 -0
  37. package/jest.config.js +2 -0
  38. package/lib/bucketer.d.ts +11 -0
  39. package/lib/child.d.ts +26 -0
  40. package/lib/compareVersions.d.ts +4 -0
  41. package/lib/conditions.d.ts +4 -4
  42. package/lib/datafileReader.d.ts +26 -6
  43. package/lib/emitter.d.ts +8 -9
  44. package/lib/evaluate.d.ts +31 -29
  45. package/lib/events.d.ts +5 -0
  46. package/lib/helpers.d.ts +5 -0
  47. package/lib/hooks.d.ts +45 -0
  48. package/lib/index.d.ts +3 -2
  49. package/lib/instance.d.ts +40 -72
  50. package/lib/logger.d.ts +6 -5
  51. package/lib/murmurhash.d.ts +1 -0
  52. package/package.json +3 -5
  53. package/src/bucketer.spec.ts +165 -0
  54. package/src/bucketer.ts +84 -0
  55. package/src/child.spec.ts +267 -0
  56. package/src/child.ts +285 -0
  57. package/src/compareVersions.ts +93 -0
  58. package/src/conditions.spec.ts +563 -353
  59. package/src/conditions.ts +46 -63
  60. package/src/datafileReader.spec.ts +396 -84
  61. package/src/datafileReader.ts +280 -60
  62. package/src/emitter.spec.ts +27 -86
  63. package/src/emitter.ts +38 -32
  64. package/src/evaluate.ts +349 -258
  65. package/src/events.spec.ts +154 -0
  66. package/src/events.ts +83 -0
  67. package/src/helpers.ts +33 -0
  68. package/src/hooks.ts +88 -0
  69. package/src/index.ts +3 -2
  70. package/src/instance.spec.ts +305 -489
  71. package/src/instance.ts +247 -391
  72. package/src/logger.spec.ts +212 -134
  73. package/src/logger.ts +36 -36
  74. package/src/murmurhash.ts +71 -0
  75. package/coverage/lcov-report/feature.ts.html +0 -508
  76. package/dist/bucket.d.ts +0 -30
  77. package/dist/feature.d.ts +0 -16
  78. package/dist/segments.d.ts +0 -5
  79. package/lib/bucket.d.ts +0 -30
  80. package/lib/feature.d.ts +0 -16
  81. package/lib/segments.d.ts +0 -5
  82. package/src/bucket.spec.ts +0 -37
  83. package/src/bucket.ts +0 -139
  84. package/src/feature.ts +0 -141
  85. package/src/segments.spec.ts +0 -468
  86. package/src/segments.ts +0 -58
@@ -32,7 +32,7 @@
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>11/11</span>
35
+ <span class='fraction'>12/12</span>
36
36
  </div>
37
37
 
38
38
 
@@ -168,46 +168,45 @@
168
168
  <span class="cline-any cline-neutral">&nbsp;</span>
169
169
  <span class="cline-any cline-neutral">&nbsp;</span>
170
170
  <span class="cline-any cline-neutral">&nbsp;</span>
171
- <span class="cline-any cline-yes">4x</span>
171
+ <span class="cline-any cline-yes">7x</span>
172
172
  <span class="cline-any cline-neutral">&nbsp;</span>
173
- <span class="cline-any cline-yes">4x</span>
173
+ <span class="cline-any cline-yes">7x</span>
174
174
  <span class="cline-any cline-neutral">&nbsp;</span>
175
175
  <span class="cline-any cline-neutral">&nbsp;</span>
176
176
  <span class="cline-any cline-neutral">&nbsp;</span>
177
177
  <span class="cline-any cline-neutral">&nbsp;</span>
178
+ <span class="cline-any cline-yes">54x</span>
178
179
  <span class="cline-any cline-neutral">&nbsp;</span>
180
+ <span class="cline-any cline-yes">54x</span>
181
+ <span class="cline-any cline-yes">27x</span>
182
+ <span class="cline-any cline-yes">27x</span>
183
+ <span class="cline-any cline-yes">14x</span>
184
+ <span class="cline-any cline-yes">13x</span>
185
+ <span class="cline-any cline-yes">8x</span>
179
186
  <span class="cline-any cline-neutral">&nbsp;</span>
180
187
  <span class="cline-any cline-neutral">&nbsp;</span>
188
+ <span class="cline-any cline-yes">54x</span>
181
189
  <span class="cline-any cline-neutral">&nbsp;</span>
182
190
  <span class="cline-any cline-neutral">&nbsp;</span>
183
- <span class="cline-any cline-yes">4x</span>
191
+ <span class="cline-any cline-yes">7x</span>
192
+ <span class="cline-any cline-yes">7x</span>
184
193
  <span class="cline-any cline-neutral">&nbsp;</span>
185
194
  <span class="cline-any cline-neutral">&nbsp;</span>
186
195
  <span class="cline-any cline-neutral">&nbsp;</span>
187
196
  <span class="cline-any cline-neutral">&nbsp;</span>
188
- <span class="cline-any cline-yes">12x</span>
189
197
  <span class="cline-any cline-neutral">&nbsp;</span>
190
- <span class="cline-any cline-yes">1x</span>
191
- <span class="cline-any cline-yes">1x</span>
192
198
  <span class="cline-any cline-neutral">&nbsp;</span>
193
- <span class="cline-any cline-yes">1x</span>
194
- <span class="cline-any cline-yes">1x</span>
195
199
  <span class="cline-any cline-neutral">&nbsp;</span>
196
- <span class="cline-any cline-yes">9x</span>
197
- <span class="cline-any cline-yes">9x</span>
198
- <span class="cline-any cline-neutral">&nbsp;</span>
199
- <span class="cline-any cline-yes">1x</span>
200
- <span class="cline-any cline-yes">1x</span>
201
200
  <span class="cline-any cline-neutral">&nbsp;</span>
202
201
  <span class="cline-any cline-neutral">&nbsp;</span>
202
+ <span class="cline-any cline-yes">7x</span>
203
203
  <span class="cline-any cline-neutral">&nbsp;</span>
204
- <span class="cline-any cline-yes">4x</span>
205
204
  <span class="cline-any cline-neutral">&nbsp;</span>
206
205
  <span class="cline-any cline-neutral">&nbsp;</span>
207
206
  <span class="cline-any cline-neutral">&nbsp;</span>
208
207
  <span class="cline-any cline-neutral">&nbsp;</span>
209
- <span class="cline-any cline-yes">30x</span>
210
- <span class="cline-any cline-yes">30x</span>
208
+ <span class="cline-any cline-yes">46x</span>
209
+ <span class="cline-any cline-yes">46x</span>
211
210
  <span class="cline-any cline-neutral">&nbsp;</span>
212
211
  <span class="cline-any cline-neutral">&nbsp;</span>
213
212
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -215,35 +214,36 @@
215
214
  <span class="cline-any cline-neutral">&nbsp;</span>
216
215
  <span class="cline-any cline-neutral">&nbsp;</span>
217
216
  <span class="cline-any cline-neutral">&nbsp;</span>
218
- <span class="cline-any cline-yes">153x</span>
219
- <span class="cline-any cline-yes">25x</span>
217
+ <span class="cline-any cline-yes">247x</span>
220
218
  <span class="cline-any cline-neutral">&nbsp;</span>
219
+ <span class="cline-any cline-yes">247x</span>
220
+ <span class="cline-any cline-yes">194x</span>
221
221
  <span class="cline-any cline-neutral">&nbsp;</span>
222
222
  <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-yes">53x</span>
223
224
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-yes">128x</span>
225
225
  <span class="cline-any cline-neutral">&nbsp;</span>
226
226
  <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-yes">196x</span>
227
228
  <span class="cline-any cline-neutral">&nbsp;</span>
228
- <span class="cline-any cline-yes">6x</span>
229
229
  <span class="cline-any cline-neutral">&nbsp;</span>
230
230
  <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-yes">28x</span>
231
232
  <span class="cline-any cline-neutral">&nbsp;</span>
232
- <span class="cline-any cline-yes">14x</span>
233
233
  <span class="cline-any cline-neutral">&nbsp;</span>
234
234
  <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-yes">14x</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
237
  <span class="cline-any cline-neutral">&nbsp;</span>
236
- <span class="cline-any cline-yes">5x</span>
237
238
  <span class="cline-any cline-neutral">&nbsp;</span>
239
+ <span class="cline-any cline-yes">7x</span>
238
240
  <span class="cline-any cline-neutral">&nbsp;</span>
239
241
  <span class="cline-any cline-neutral">&nbsp;</span>
240
- <span class="cline-any cline-yes">4x</span>
241
- <span class="cline-any cline-yes">30x</span>
242
- <span class="cline-any cline-yes">30x</span>
243
242
  <span class="cline-any cline-neutral">&nbsp;</span>
244
- <span class="cline-any cline-yes">30x</span>
243
+ <span class="cline-any cline-yes">7x</span>
244
+ <span class="cline-any cline-yes">26x</span>
245
245
  <span class="cline-any cline-neutral">&nbsp;</span>
246
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export type LogLevel = "debug" | "info" | "warn" | "error";
246
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export type LogLevel = "fatal" | "error" | "warn" | "info" | "debug";
247
247
  &nbsp;
248
248
  export type LogMessage = string;
249
249
  &nbsp;
@@ -254,60 +254,63 @@ export interface LogDetails {
254
254
  export type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) =&gt; void;
255
255
  &nbsp;
256
256
  export interface CreateLoggerOptions {
257
- levels?: LogLevel[];
257
+ level?: LogLevel;
258
258
  handler?: LogHandler;
259
259
  }
260
260
  &nbsp;
261
261
  export const loggerPrefix = "[Featurevisor]";
262
262
  &nbsp;
263
- export const defaultLogLevels: LogLevel[] = [
264
- // supported, but not enabled by default
265
- // "debug",
266
- // "info",
267
- &nbsp;
268
- // enabled by default
269
- "warn",
270
- "error",
271
- ];
272
- &nbsp;
273
263
  export const defaultLogHandler: LogHandler = function defaultLogHandler(
274
264
  level,
275
265
  message,
276
266
  details = {},
277
267
  ) {
278
- switch (level) {
279
- case "debug":
280
- console.log(loggerPrefix, message, details);
281
- break;
282
- case "info":
283
- console.info(loggerPrefix, message, details);
284
- break;
285
- case "warn":
286
- console.warn(loggerPrefix, message, details);
287
- break;
288
- case "error":
289
- console.error(loggerPrefix, message, details);
290
- break;
268
+ let method = "log";
269
+ &nbsp;
270
+ if (level === "info") {
271
+ method = "info";
272
+ } else if (level === "warn") {
273
+ method = "warn";
274
+ } else if (level === "error") {
275
+ method = "error";
291
276
  }
277
+ &nbsp;
278
+ console[method](loggerPrefix, message, details);
292
279
  };
293
280
  &nbsp;
294
281
  export class Logger {
295
- private levels: LogLevel[];
282
+ static allLevels: LogLevel[] = [
283
+ "fatal",
284
+ "error",
285
+ "warn",
286
+ "info",
287
+ &nbsp;
288
+ // not enabled by default
289
+ "debug",
290
+ ];
291
+ &nbsp;
292
+ static defaultLevel: LogLevel = "info";
293
+ &nbsp;
294
+ private level: LogLevel;
296
295
  private handle: LogHandler;
297
296
  &nbsp;
298
297
  constructor(options: CreateLoggerOptions) {
299
- this.levels = options.levels as LogLevel[];
300
- this.handle = options.handler as LogHandler;
298
+ this.level = options.level || Logger.defaultLevel;
299
+ this.handle = options.handler || defaultLogHandler;
301
300
  }
302
301
  &nbsp;
303
- setLevels(levels: LogLevel[]) {
304
- this.levels = levels;
302
+ setLevel(level: LogLevel) {
303
+ this.level = level;
305
304
  }
306
305
  &nbsp;
307
306
  log(level: LogLevel, message: LogMessage, details?: LogDetails) {
308
- if (this.levels.indexOf(level) !== -1) {
309
- this.handle(level, message, details);
307
+ const shouldHandle = Logger.allLevels.indexOf(this.level) &gt;= Logger.allLevels.indexOf(level);
308
+ &nbsp;
309
+ if (!shouldHandle) {
310
+ return;
310
311
  }
312
+ &nbsp;
313
+ this.handle(level, message, details);
311
314
  }
312
315
  &nbsp;
313
316
  debug(message: LogMessage, details?: LogDetails) {
@@ -328,10 +331,7 @@ export class Logger {
328
331
  }
329
332
  &nbsp;
330
333
  export function createLogger(options: CreateLoggerOptions = {}): Logger {
331
- const levels = options.levels || defaultLogLevels;
332
- const logHandler = options.handler || defaultLogHandler;
333
- &nbsp;
334
- return new Logger({ levels, handler: logHandler });
334
+ return new Logger(options);
335
335
  }
336
336
  &nbsp;</pre></td></tr></table></pre>
337
337
 
@@ -340,7 +340,7 @@ export function createLogger(options: CreateLoggerOptions = {}): Logger {
340
340
  <div class='footer quiet pad2 space-top1 center small'>
341
341
  Code coverage generated by
342
342
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
343
- at 2025-04-12T20:34:55.662Z
343
+ at 2025-07-19T20:24:32.581Z
344
344
  </div>
345
345
  <script src="prettify.js"></script>
346
346
  <script>