@featurevisor/core 2.24.0 → 2.26.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/coverage/clover.xml +1499 -1476
  3. package/coverage/coverage-final.json +18 -17
  4. package/coverage/lcov-report/builder/allocator.ts.html +1 -1
  5. package/coverage/lcov-report/builder/buildDatafile.ts.html +1 -1
  6. package/coverage/lcov-report/builder/buildScopedConditions.ts.html +1 -1
  7. package/coverage/lcov-report/builder/buildScopedDatafile.ts.html +1 -1
  8. package/coverage/lcov-report/builder/buildScopedSegments.ts.html +1 -1
  9. package/coverage/lcov-report/builder/convertToV1.ts.html +1 -1
  10. package/coverage/lcov-report/builder/getFeatureRanges.ts.html +1 -1
  11. package/coverage/lcov-report/builder/hashes.ts.html +1 -1
  12. package/coverage/lcov-report/builder/index.html +1 -1
  13. package/coverage/lcov-report/builder/mutateVariables.ts.html +1 -1
  14. package/coverage/lcov-report/builder/mutator.ts.html +52 -52
  15. package/coverage/lcov-report/builder/revision.ts.html +1 -1
  16. package/coverage/lcov-report/builder/traffic.ts.html +1 -1
  17. package/coverage/lcov-report/config/index.html +1 -1
  18. package/coverage/lcov-report/config/index.ts.html +1 -1
  19. package/coverage/lcov-report/config/projectConfig.ts.html +15 -15
  20. package/coverage/lcov-report/datasource/adapter.ts.html +1 -1
  21. package/coverage/lcov-report/datasource/datasource.ts.html +18 -18
  22. package/coverage/lcov-report/datasource/filesystemAdapter.ts.html +43 -43
  23. package/coverage/lcov-report/datasource/index.html +1 -1
  24. package/coverage/lcov-report/datasource/index.ts.html +1 -1
  25. package/coverage/lcov-report/generate-code/index.html +1 -1
  26. package/coverage/lcov-report/generate-code/typescript.ts.html +1 -1
  27. package/coverage/lcov-report/index.html +18 -18
  28. package/coverage/lcov-report/linter/attributeSchema.ts.html +130 -130
  29. package/coverage/lcov-report/linter/checkCircularDependency.ts.html +11 -11
  30. package/coverage/lcov-report/linter/checkPercentageExceedingSlot.ts.html +15 -15
  31. package/coverage/lcov-report/linter/conditionSchema.ts.html +150 -150
  32. package/coverage/lcov-report/linter/featureSchema.ts.html +458 -443
  33. package/coverage/lcov-report/linter/groupSchema.ts.html +24 -27
  34. package/coverage/lcov-report/linter/index.html +83 -68
  35. package/coverage/lcov-report/linter/lintProject.ts.html +158 -158
  36. package/coverage/lcov-report/linter/mutationNotation.ts.html +104 -104
  37. package/coverage/lcov-report/linter/printError.ts.html +79 -28
  38. package/coverage/lcov-report/linter/schema.ts.html +129 -135
  39. package/coverage/lcov-report/linter/segmentSchema.ts.html +15 -9
  40. package/coverage/lcov-report/linter/testSchema.ts.html +67 -94
  41. package/coverage/lcov-report/linter/zodHelpers.ts.html +133 -0
  42. package/coverage/lcov-report/list/index.html +1 -1
  43. package/coverage/lcov-report/list/matrix.ts.html +1 -1
  44. package/coverage/lcov-report/tester/cliFormat.ts.html +6 -6
  45. package/coverage/lcov-report/tester/helpers.ts.html +1 -1
  46. package/coverage/lcov-report/tester/index.html +1 -1
  47. package/coverage/lcov-report/utils/extractKeys.ts.html +1 -1
  48. package/coverage/lcov-report/utils/git.ts.html +1 -1
  49. package/coverage/lcov-report/utils/index.html +1 -1
  50. package/coverage/lcov-report/utils/index.ts.html +1 -1
  51. package/coverage/lcov-report/utils/pretty.ts.html +1 -1
  52. package/coverage/lcov.info +3031 -2984
  53. package/lib/linter/attributeSchema.d.ts +19 -352
  54. package/lib/linter/attributeSchema.spec.js.map +1 -1
  55. package/lib/linter/conditionSchema.d.ts +1 -1
  56. package/lib/linter/conditionSchema.js +2 -3
  57. package/lib/linter/conditionSchema.js.map +1 -1
  58. package/lib/linter/conditionSchema.spec.js.map +1 -1
  59. package/lib/linter/featureSchema.d.ts +75 -964
  60. package/lib/linter/featureSchema.js +64 -53
  61. package/lib/linter/featureSchema.js.map +1 -1
  62. package/lib/linter/featureSchema.spec.js +28 -0
  63. package/lib/linter/featureSchema.spec.js.map +1 -1
  64. package/lib/linter/groupSchema.d.ts +4 -28
  65. package/lib/linter/groupSchema.js +3 -5
  66. package/lib/linter/groupSchema.js.map +1 -1
  67. package/lib/linter/lintProject.spec.js +101 -13
  68. package/lib/linter/lintProject.spec.js.map +1 -1
  69. package/lib/linter/printError.js +21 -7
  70. package/lib/linter/printError.js.map +1 -1
  71. package/lib/linter/schema.d.ts +9 -2
  72. package/lib/linter/schema.js +2 -6
  73. package/lib/linter/schema.js.map +1 -1
  74. package/lib/linter/schema.spec.js +3 -2
  75. package/lib/linter/schema.spec.js.map +1 -1
  76. package/lib/linter/segmentSchema.d.ts +1 -9
  77. package/lib/linter/segmentSchema.js +3 -1
  78. package/lib/linter/segmentSchema.js.map +1 -1
  79. package/lib/linter/segmentSchema.spec.js.map +1 -1
  80. package/lib/linter/testSchema.d.ts +16 -222
  81. package/lib/linter/testSchema.js +23 -38
  82. package/lib/linter/testSchema.js.map +1 -1
  83. package/lib/linter/testSchema.spec.d.ts +1 -0
  84. package/lib/linter/testSchema.spec.js +162 -0
  85. package/lib/linter/testSchema.spec.js.map +1 -0
  86. package/lib/linter/zodHelpers.d.ts +2 -0
  87. package/lib/linter/zodHelpers.js +15 -0
  88. package/lib/linter/zodHelpers.js.map +1 -0
  89. package/package.json +4 -3
  90. package/src/linter/attributeSchema.spec.ts +3 -3
  91. package/src/linter/conditionSchema.spec.ts +3 -3
  92. package/src/linter/conditionSchema.ts +4 -4
  93. package/src/linter/featureSchema.spec.ts +39 -4
  94. package/src/linter/featureSchema.ts +82 -77
  95. package/src/linter/groupSchema.ts +11 -12
  96. package/src/linter/lintProject.spec.ts +121 -13
  97. package/src/linter/printError.ts +27 -10
  98. package/src/linter/schema.spec.ts +12 -11
  99. package/src/linter/schema.ts +7 -9
  100. package/src/linter/segmentSchema.spec.ts +5 -5
  101. package/src/linter/segmentSchema.ts +3 -1
  102. package/src/linter/testSchema.spec.ts +193 -0
  103. package/src/linter/testSchema.ts +36 -45
  104. package/src/linter/zodHelpers.ts +16 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">59.09% </span>
26
+ <span class="strong">82.6% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>13/22</span>
28
+ <span class='fraction'>19/23</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">75% </span>
33
+ <span class="strong">87.5% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>6/8</span>
35
+ <span class='fraction'>7/8</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">33.33% </span>
40
+ <span class="strong">66.66% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/12</span>
42
+ <span class='fraction'>8/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">61.9% </span>
47
+ <span class="strong">86.36% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>13/21</span>
49
+ <span class='fraction'>19/22</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line medium'></div>
64
+ <div class='status-line high'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -209,28 +209,19 @@
209
209
  <a name='L144'></a><a href='#L144'>144</a>
210
210
  <a name='L145'></a><a href='#L145'>145</a>
211
211
  <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
212
+ <a name='L147'></a><a href='#L147'>147</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
222
213
  <span class="cline-any cline-neutral">&nbsp;</span>
223
214
  <span class="cline-any cline-neutral">&nbsp;</span>
215
+ <span class="cline-any cline-yes">2x</span>
224
216
  <span class="cline-any cline-neutral">&nbsp;</span>
225
- <span class="cline-any cline-yes">1x</span>
226
- <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-yes">2x</span>
227
218
  <span class="cline-any cline-neutral">&nbsp;</span>
228
219
  <span class="cline-any cline-neutral">&nbsp;</span>
229
220
  <span class="cline-any cline-neutral">&nbsp;</span>
230
- <span class="cline-any cline-yes">6x</span>
231
221
  <span class="cline-any cline-neutral">&nbsp;</span>
232
- <span class="cline-any cline-yes">6x</span>
222
+ <span class="cline-any cline-yes">13x</span>
233
223
  <span class="cline-any cline-neutral">&nbsp;</span>
224
+ <span class="cline-any cline-yes">13x</span>
234
225
  <span class="cline-any cline-neutral">&nbsp;</span>
235
226
  <span class="cline-any cline-neutral">&nbsp;</span>
236
227
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -241,14 +232,14 @@
241
232
  <span class="cline-any cline-neutral">&nbsp;</span>
242
233
  <span class="cline-any cline-neutral">&nbsp;</span>
243
234
  <span class="cline-any cline-neutral">&nbsp;</span>
244
- <span class="cline-any cline-yes">6x</span>
245
235
  <span class="cline-any cline-neutral">&nbsp;</span>
246
236
  <span class="cline-any cline-neutral">&nbsp;</span>
247
- <span class="cline-any cline-yes">33x</span>
248
- <span class="cline-any cline-no">&nbsp;</span>
237
+ <span class="cline-any cline-yes">13x</span>
249
238
  <span class="cline-any cline-neutral">&nbsp;</span>
250
239
  <span class="cline-any cline-neutral">&nbsp;</span>
251
240
  <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-yes">45x</span>
242
+ <span class="cline-any cline-yes">1x</span>
252
243
  <span class="cline-any cline-neutral">&nbsp;</span>
253
244
  <span class="cline-any cline-neutral">&nbsp;</span>
254
245
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -262,13 +253,13 @@
262
253
  <span class="cline-any cline-neutral">&nbsp;</span>
263
254
  <span class="cline-any cline-neutral">&nbsp;</span>
264
255
  <span class="cline-any cline-neutral">&nbsp;</span>
265
- <span class="cline-any cline-yes">6x</span>
266
256
  <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-yes">13x</span>
267
258
  <span class="cline-any cline-neutral">&nbsp;</span>
268
- <span class="cline-any cline-yes">73x</span>
269
- <span class="cline-any cline-no">&nbsp;</span>
270
259
  <span class="cline-any cline-neutral">&nbsp;</span>
271
260
  <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-yes">102x</span>
262
+ <span class="cline-any cline-yes">1x</span>
272
263
  <span class="cline-any cline-neutral">&nbsp;</span>
273
264
  <span class="cline-any cline-neutral">&nbsp;</span>
274
265
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -284,38 +275,32 @@
284
275
  <span class="cline-any cline-neutral">&nbsp;</span>
285
276
  <span class="cline-any cline-neutral">&nbsp;</span>
286
277
  <span class="cline-any cline-neutral">&nbsp;</span>
287
- <span class="cline-any cline-yes">408x</span>
288
278
  <span class="cline-any cline-neutral">&nbsp;</span>
289
- <span class="cline-any cline-yes">3x</span>
279
+ <span class="cline-any cline-yes">549x</span>
290
280
  <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-yes">5x</span>
291
282
  <span class="cline-any cline-neutral">&nbsp;</span>
292
283
  <span class="cline-any cline-neutral">&nbsp;</span>
293
- <span class="cline-any cline-yes">405x</span>
294
284
  <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-yes">544x</span>
295
286
  <span class="cline-any cline-neutral">&nbsp;</span>
296
287
  <span class="cline-any cline-neutral">&nbsp;</span>
297
- <span class="cline-any cline-yes">405x</span>
298
288
  <span class="cline-any cline-neutral">&nbsp;</span>
289
+ <span class="cline-any cline-yes">542x</span>
299
290
  <span class="cline-any cline-neutral">&nbsp;</span>
300
- <span class="cline-any cline-no">&nbsp;</span>
301
291
  <span class="cline-any cline-neutral">&nbsp;</span>
302
- <span class="cline-any cline-no">&nbsp;</span>
292
+ <span class="cline-any cline-yes">2x</span>
303
293
  <span class="cline-any cline-neutral">&nbsp;</span>
294
+ <span class="cline-any cline-yes">2x</span>
304
295
  <span class="cline-any cline-neutral">&nbsp;</span>
305
296
  <span class="cline-any cline-neutral">&nbsp;</span>
306
297
  <span class="cline-any cline-neutral">&nbsp;</span>
307
298
  <span class="cline-any cline-neutral">&nbsp;</span>
308
- <span class="cline-any cline-neutral">&nbsp;</span>
309
- <span class="cline-any cline-neutral">&nbsp;</span>
310
- <span class="cline-any cline-no">&nbsp;</span>
299
+ <span class="cline-any cline-yes">1x</span>
311
300
  <span class="cline-any cline-no">&nbsp;</span>
312
301
  <span class="cline-any cline-neutral">&nbsp;</span>
313
302
  <span class="cline-any cline-neutral">&nbsp;</span>
314
303
  <span class="cline-any cline-neutral">&nbsp;</span>
315
- <span class="cline-any cline-neutral">&nbsp;</span>
316
- <span class="cline-any cline-neutral">&nbsp;</span>
317
- <span class="cline-any cline-neutral">&nbsp;</span>
318
- <span class="cline-any cline-neutral">&nbsp;</span>
319
304
  <span class="cline-any cline-no">&nbsp;</span>
320
305
  <span class="cline-any cline-no">&nbsp;</span>
321
306
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -368,23 +353,22 @@
368
353
  <span class="cline-any cline-neutral">&nbsp;</span>
369
354
  <span class="cline-any cline-neutral">&nbsp;</span>
370
355
  <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-neutral">&nbsp;</span>
372
- <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">6x</span>
356
+ <span class="cline-any cline-yes">13x</span>
375
357
  <span class="cline-any cline-neutral">&nbsp;</span>
376
358
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { z } from "zod";
377
359
  &nbsp;
378
360
  import { ProjectConfig } from "../config";
361
+ import { refineWithMessage } from "./zodHelpers";
379
362
  &nbsp;
380
363
  export function getTestsZodSchema(
381
364
  projectConfig: ProjectConfig,
382
365
  availableFeatureKeys: [string, ...string[]],
383
366
  availableSegmentKeys: [string, ...string[]],
384
367
  ) {
385
- const scopeNames = projectConfig.scopes ? projectConfig.scopes.map(<span class="fstat-no" title="function not covered" >(s</span>cope) =&gt; <span class="cstat-no" title="statement not covered" >scope.name)</span> : <span class="branch-1 cbranch-no" title="branch not covered" >[];</span>
368
+ const scopeNames = projectConfig.scopes ? projectConfig.scopes.map(<span class="fstat-no" title="function not covered" >(s</span>cope) =&gt; <span class="cstat-no" title="statement not covered" >scope.name)</span> : [];
386
369
  &nbsp;
387
370
  const matrixZodSchema = z.record(
371
+ z.string(),
388
372
  z.array(
389
373
  z.union([
390
374
  // allowed values in arrays
@@ -398,18 +382,17 @@ export function getTestsZodSchema(
398
382
  &nbsp;
399
383
  const segmentTestZodSchema = z
400
384
  .object({
401
- segment: z.string().refine(
385
+ segment: refineWithMessage(
386
+ z.string(),
402
387
  (value) =&gt; availableSegmentKeys.includes(value),
403
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
404
- message: `Unknown segment "${value}"`,
405
- }),
388
+ (value) =&gt; `Unknown segment "${value}"`,
406
389
  ),
407
390
  assertions: z.array(
408
391
  z
409
392
  .object({
410
393
  matrix: matrixZodSchema.optional(),
411
394
  description: z.string().optional(),
412
- context: z.record(z.unknown()),
395
+ context: z.record(z.string(), z.unknown()),
413
396
  expectedToMatch: z.boolean(),
414
397
  })
415
398
  .strict(),
@@ -419,11 +402,10 @@ export function getTestsZodSchema(
419
402
  &nbsp;
420
403
  const featureTestZodSchema = z
421
404
  .object({
422
- feature: z.string().refine(
405
+ feature: refineWithMessage(
406
+ z.string(),
423
407
  (value) =&gt; availableFeatureKeys.includes(value),
424
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
425
- message: `Unknown feature "${value}"`,
426
- }),
408
+ (value) =&gt; `Unknown feature "${value}"`,
427
409
  ),
428
410
  assertions: z.array(
429
411
  z
@@ -437,7 +419,8 @@ export function getTestsZodSchema(
437
419
  z.string(),
438
420
  ]),
439
421
  environment: Array.isArray(projectConfig.environments)
440
- ? z.string().refine(
422
+ ? refineWithMessage(
423
+ z.string(),
441
424
  (value) =&gt; {
442
425
  if (value.indexOf("${{") === 0) {
443
426
  // allow unknown strings for matrix
@@ -452,47 +435,37 @@ export function getTestsZodSchema(
452
435
  return true;
453
436
  }
454
437
  &nbsp;
455
- <span class="cstat-no" title="statement not covered" > return false;</span>
438
+ return false;
456
439
  },
457
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
458
- message: `Unknown environment "${value}"`,
459
- }),
440
+ (value) =&gt; `Unknown environment "${value}"`,
460
441
  )
461
442
  : <span class="branch-1 cbranch-no" title="branch not covered" >z.never().optional(),</span>
462
- tag: z
463
- .string()
464
- .refine(
465
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; <span class="cstat-no" title="statement not covered" >projectConfig.tags.includes(value),</span>
466
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
467
- message: `Unknown tag "${value}"`,
468
- }),
469
- )
470
- .optional(),
471
- scope: z
472
- .string()
473
- .refine(
474
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; <span class="cstat-no" title="statement not covered" >scopeNames.includes(value),</span>
475
- <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
476
- message: `Unknown scope "${value}"`,
477
- }),
478
- )
479
- .optional(),
443
+ tag: refineWithMessage(
444
+ z.string(),
445
+ (value) =&gt; projectConfig.tags.includes(value),
446
+ <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; <span class="cstat-no" title="statement not covered" >`Unknown tag "${value}"`,</span>
447
+ ).optional(),
448
+ scope: refineWithMessage(
449
+ z.string(),
450
+ <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; <span class="cstat-no" title="statement not covered" >scopeNames.includes(value),</span>
451
+ <span class="fstat-no" title="function not covered" > (v</span>alue) =&gt; <span class="cstat-no" title="statement not covered" >`Unknown scope "${value}"`,</span>
452
+ ).optional(),
480
453
  &nbsp;
481
454
  // parent
482
- sticky: z.record(z.record(z.any())).optional(),
483
- context: z.record(z.unknown()).optional(),
455
+ sticky: z.record(z.string(), z.record(z.string(), z.any())).optional(),
456
+ context: z.record(z.string(), z.unknown()).optional(),
484
457
  &nbsp;
485
458
  defaultVariationValue: z.string().optional(),
486
- defaultVariableValues: z.record(z.unknown()).optional(),
459
+ defaultVariableValues: z.record(z.string(), z.unknown()).optional(),
487
460
  &nbsp;
488
461
  expectedToBeEnabled: z.boolean().optional(),
489
462
  expectedVariation: z.string().nullable().optional(),
490
- expectedVariables: z.record(z.unknown()).optional(),
463
+ expectedVariables: z.record(z.string(), z.unknown()).optional(),
491
464
  expectedEvaluations: z
492
465
  .object({
493
- flag: z.record(z.any()).optional(),
494
- variation: z.record(z.any()).optional(),
495
- variables: z.record(z.record(z.any())).optional(),
466
+ flag: z.record(z.string(), z.any()).optional(),
467
+ variation: z.record(z.string(), z.any()).optional(),
468
+ variables: z.record(z.string(), z.record(z.string(), z.any())).optional(),
496
469
  })
497
470
  .optional(),
498
471
  &nbsp;
@@ -500,21 +473,21 @@ export function getTestsZodSchema(
500
473
  .array(
501
474
  z.object({
502
475
  // copied from parent
503
- sticky: z.record(z.record(z.any())).optional(),
504
- context: z.record(z.unknown()).optional(),
476
+ sticky: z.record(z.string(), z.record(z.string(), z.any())).optional(),
477
+ context: z.record(z.string(), z.unknown()).optional(),
505
478
  &nbsp;
506
479
  defaultVariationValue: z.string().optional(),
507
- defaultVariableValues: z.record(z.unknown()).optional(),
480
+ defaultVariableValues: z.record(z.string(), z.unknown()).optional(),
508
481
  &nbsp;
509
482
  expectedToBeEnabled: z.boolean().optional(),
510
483
  expectedVariation: z.string().nullable().optional(),
511
- expectedVariables: z.record(z.unknown()).optional(),
484
+ expectedVariables: z.record(z.string(), z.unknown()).optional(),
512
485
  &nbsp;
513
486
  expectedEvaluations: z
514
487
  .object({
515
- flag: z.record(z.any()).optional(),
516
- variation: z.record(z.any()).optional(),
517
- variables: z.record(z.record(z.any())).optional(),
488
+ flag: z.record(z.string(), z.any()).optional(),
489
+ variation: z.record(z.string(), z.any()).optional(),
490
+ variables: z.record(z.string(), z.record(z.string(), z.any())).optional(),
518
491
  })
519
492
  .optional(),
520
493
  }),
@@ -535,7 +508,7 @@ export function getTestsZodSchema(
535
508
  <div class='footer quiet pad2 space-top1 center small'>
536
509
  Code coverage generated by
537
510
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
538
- at 2026-04-16T19:04:15.682Z
511
+ at 2026-04-16T19:50:48.735Z
539
512
  </div>
540
513
  <script src="../prettify.js"></script>
541
514
  <script>
@@ -0,0 +1,133 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for linter/zodHelpers.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">linter</a> zodHelpers.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>5/5</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>1/1</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>2/2</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>5/5</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input oninput="onInput()" type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">7x</span>
83
+ <span class="cline-any cline-neutral">&nbsp;</span>
84
+ <span class="cline-any cline-yes">7x</span>
85
+ <span class="cline-any cline-neutral">&nbsp;</span>
86
+ <span class="cline-any cline-neutral">&nbsp;</span>
87
+ <span class="cline-any cline-neutral">&nbsp;</span>
88
+ <span class="cline-any cline-neutral">&nbsp;</span>
89
+ <span class="cline-any cline-yes">800x</span>
90
+ <span class="cline-any cline-yes">1958x</span>
91
+ <span class="cline-any cline-yes">15x</span>
92
+ <span class="cline-any cline-neutral">&nbsp;</span>
93
+ <span class="cline-any cline-neutral">&nbsp;</span>
94
+ <span class="cline-any cline-neutral">&nbsp;</span>
95
+ <span class="cline-any cline-neutral">&nbsp;</span>
96
+ <span class="cline-any cline-neutral">&nbsp;</span>
97
+ <span class="cline-any cline-neutral">&nbsp;</span>
98
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { z } from "zod";
99
+ &nbsp;
100
+ export function refineWithMessage&lt;T&gt;(
101
+ schema: z.ZodType&lt;T&gt;,
102
+ predicate: (value: T) =&gt; boolean,
103
+ getMessage: (value: T) =&gt; string,
104
+ ) {
105
+ return schema.superRefine((value, ctx) =&gt; {
106
+ if (!predicate(value)) {
107
+ ctx.addIssue({
108
+ code: z.ZodIssueCode.custom,
109
+ message: getMessage(value),
110
+ });
111
+ }
112
+ });
113
+ }
114
+ &nbsp;</pre></td></tr></table></pre>
115
+
116
+ <div class='push'></div><!-- for sticky footer -->
117
+ </div><!-- /wrapper -->
118
+ <div class='footer quiet pad2 space-top1 center small'>
119
+ Code coverage generated by
120
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
121
+ at 2026-04-16T19:50:48.735Z
122
+ </div>
123
+ <script src="../prettify.js"></script>
124
+ <script>
125
+ window.onload = function () {
126
+ prettyPrint();
127
+ };
128
+ </script>
129
+ <script src="../sorter.js"></script>
130
+ <script src="../block-navigation.js"></script>
131
+ </body>
132
+ </html>
133
+
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-04-16T19:04:15.682Z
104
+ at 2026-04-16T19:50:48.735Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -721,7 +721,7 @@ export function <span class="fstat-no" title="function not covered" >getSegmentA
721
721
  <div class='footer quiet pad2 space-top1 center small'>
722
722
  Code coverage generated by
723
723
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
724
- at 2026-04-16T19:04:15.682Z
724
+ at 2026-04-16T19:50:48.735Z
725
725
  </div>
726
726
  <script src="../prettify.js"></script>
727
727
  <script>
@@ -69,12 +69,12 @@
69
69
  <a name='L4'></a><a href='#L4'>4</a>
70
70
  <a name='L5'></a><a href='#L5'>5</a>
71
71
  <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
73
- <span class="cline-any cline-yes">1x</span>
72
+ <a name='L7'></a><a href='#L7'>7</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
73
+ <span class="cline-any cline-yes">2x</span>
74
74
  <span class="cline-any cline-neutral">&nbsp;</span>
75
- <span class="cline-any cline-yes">1x</span>
76
- <span class="cline-any cline-yes">1x</span>
77
- <span class="cline-any cline-yes">1x</span>
75
+ <span class="cline-any cline-yes">2x</span>
76
+ <span class="cline-any cline-yes">2x</span>
77
+ <span class="cline-any cline-yes">2x</span>
78
78
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export const CLI_FORMAT_RED = "\x1b[31m%s\x1b[0m";
79
79
  export const CLI_FORMAT_GREEN = "\x1b[32m%s\x1b[0m";
80
80
  &nbsp;
@@ -88,7 +88,7 @@ export const CLI_FORMAT_BOLD_UNDERLINE = "\x1b[1m\x1b[4m%s\x1b[0m";
88
88
  <div class='footer quiet pad2 space-top1 center small'>
89
89
  Code coverage generated by
90
90
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
91
- at 2026-04-16T19:04:15.682Z
91
+ at 2026-04-16T19:50:48.735Z
92
92
  </div>
93
93
  <script src="../prettify.js"></script>
94
94
  <script>
@@ -298,7 +298,7 @@ export function checkIfArraysAreEqual(arr1: any[], arr2: any[]): boolean {
298
298
  <div class='footer quiet pad2 space-top1 center small'>
299
299
  Code coverage generated by
300
300
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
301
- at 2026-04-16T19:04:15.682Z
301
+ at 2026-04-16T19:50:48.735Z
302
302
  </div>
303
303
  <script src="../prettify.js"></script>
304
304
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-04-16T19:04:15.682Z
119
+ at 2026-04-16T19:50:48.735Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -478,7 +478,7 @@ export function extractAttributeKeysFromConditions(
478
478
  <div class='footer quiet pad2 space-top1 center small'>
479
479
  Code coverage generated by
480
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
481
- at 2026-04-16T19:04:15.682Z
481
+ at 2026-04-16T19:50:48.735Z
482
482
  </div>
483
483
  <script src="../prettify.js"></script>
484
484
  <script>
@@ -568,7 +568,7 @@ export function <span class="fstat-no" title="function not covered" >getCommit(<
568
568
  <div class='footer quiet pad2 space-top1 center small'>
569
569
  Code coverage generated by
570
570
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
571
- at 2026-04-16T19:04:15.682Z
571
+ at 2026-04-16T19:50:48.735Z
572
572
  </div>
573
573
  <script src="../prettify.js"></script>
574
574
  <script>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-04-16T19:04:15.682Z
149
+ at 2026-04-16T19:50:48.735Z
150
150
  </div>
151
151
  <script src="../prettify.js"></script>
152
152
  <script>
@@ -79,7 +79,7 @@ export * from "./pretty";
79
79
  <div class='footer quiet pad2 space-top1 center small'>
80
80
  Code coverage generated by
81
81
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
82
- at 2026-04-16T19:04:15.682Z
82
+ at 2026-04-16T19:50:48.735Z
83
83
  </div>
84
84
  <script src="../prettify.js"></script>
85
85
  <script>
@@ -106,7 +106,7 @@ export function <span class="fstat-no" title="function not covered" >prettyPerce
106
106
  <div class='footer quiet pad2 space-top1 center small'>
107
107
  Code coverage generated by
108
108
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
109
- at 2026-04-16T19:04:15.682Z
109
+ at 2026-04-16T19:50:48.735Z
110
110
  </div>
111
111
  <script src="../prettify.js"></script>
112
112
  <script>