@fogpipe/forma-core 0.12.0 → 0.14.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/README.md +12 -12
- package/dist/{chunk-U2OXXFEH.js → chunk-BDICNCE2.js} +1 -1
- package/dist/chunk-BDICNCE2.js.map +1 -0
- package/dist/{chunk-ZSW7NIMY.js → chunk-NKA3L2LJ.js} +64 -15
- package/dist/chunk-NKA3L2LJ.js.map +1 -0
- package/dist/engine/calculate.d.ts.map +1 -1
- package/dist/engine/enabled.d.ts.map +1 -1
- package/dist/engine/index.cjs +62 -13
- package/dist/engine/index.cjs.map +1 -1
- package/dist/engine/index.d.ts +8 -8
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +2 -2
- package/dist/engine/readonly.d.ts.map +1 -1
- package/dist/engine/required.d.ts.map +1 -1
- package/dist/engine/validate.d.ts.map +1 -1
- package/dist/engine/visibility.d.ts.map +1 -1
- package/dist/feel/index.cjs.map +1 -1
- package/dist/feel/index.js +1 -1
- package/dist/index.cjs +62 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/feel.test.ts +67 -76
- package/src/__tests__/format.test.ts +19 -6
- package/src/__tests__/validate.test.ts +62 -20
- package/src/__tests__/visibility.test.ts +217 -85
- package/src/engine/calculate.ts +13 -10
- package/src/engine/enabled.ts +16 -6
- package/src/engine/index.ts +8 -28
- package/src/engine/readonly.ts +16 -6
- package/src/engine/required.ts +7 -5
- package/src/engine/validate.ts +43 -22
- package/src/engine/visibility.ts +40 -16
- package/src/feel/index.ts +12 -12
- package/src/format/index.ts +1 -1
- package/src/types.ts +46 -7
- package/dist/chunk-U2OXXFEH.js.map +0 -1
- package/dist/chunk-ZSW7NIMY.js.map +0 -1
|
@@ -22,7 +22,7 @@ function createTestSpec(options: {
|
|
|
22
22
|
acc[key] = fields[key] || { label: key };
|
|
23
23
|
return acc;
|
|
24
24
|
},
|
|
25
|
-
{} as Record<string, unknown
|
|
25
|
+
{} as Record<string, unknown>,
|
|
26
26
|
);
|
|
27
27
|
|
|
28
28
|
return {
|
|
@@ -70,7 +70,9 @@ describe("validate", () => {
|
|
|
70
70
|
expect(result.valid).toBe(false);
|
|
71
71
|
expect(result.errors).toHaveLength(1);
|
|
72
72
|
expect(result.errors[0].field).toBe("amount");
|
|
73
|
-
expect(result.errors[0].message).toBe(
|
|
73
|
+
expect(result.errors[0].message).toBe(
|
|
74
|
+
"Amount must be a multiple of 0.01",
|
|
75
|
+
);
|
|
74
76
|
});
|
|
75
77
|
|
|
76
78
|
it("should handle multipleOf for integers", () => {
|
|
@@ -256,7 +258,9 @@ describe("validate", () => {
|
|
|
256
258
|
|
|
257
259
|
const result = validate({ percentage: 101 }, spec);
|
|
258
260
|
expect(result.valid).toBe(false);
|
|
259
|
-
expect(result.errors[0].message).toBe(
|
|
261
|
+
expect(result.errors[0].message).toBe(
|
|
262
|
+
"Percentage must be no more than 100",
|
|
263
|
+
);
|
|
260
264
|
});
|
|
261
265
|
|
|
262
266
|
it("should validate string minLength", () => {
|
|
@@ -272,7 +276,9 @@ describe("validate", () => {
|
|
|
272
276
|
|
|
273
277
|
const result = validate({ name: "J" }, spec);
|
|
274
278
|
expect(result.valid).toBe(false);
|
|
275
|
-
expect(result.errors[0].message).toBe(
|
|
279
|
+
expect(result.errors[0].message).toBe(
|
|
280
|
+
"Name must be at least 2 characters",
|
|
281
|
+
);
|
|
276
282
|
});
|
|
277
283
|
});
|
|
278
284
|
|
|
@@ -310,7 +316,9 @@ describe("validate", () => {
|
|
|
310
316
|
const result = validate({ items: ["a"] }, spec);
|
|
311
317
|
expect(result.valid).toBe(false);
|
|
312
318
|
expect(result.errors[0].field).toBe("items");
|
|
313
|
-
expect(result.errors[0].message).toBe(
|
|
319
|
+
expect(result.errors[0].message).toBe(
|
|
320
|
+
"Items must have at least 2 items",
|
|
321
|
+
);
|
|
314
322
|
});
|
|
315
323
|
|
|
316
324
|
it("should validate maxItems from schema when fieldDef does not specify it", () => {
|
|
@@ -341,7 +349,9 @@ describe("validate", () => {
|
|
|
341
349
|
const result = validate({ tags: ["a", "b", "c", "d"] }, spec);
|
|
342
350
|
expect(result.valid).toBe(false);
|
|
343
351
|
expect(result.errors[0].field).toBe("tags");
|
|
344
|
-
expect(result.errors[0].message).toBe(
|
|
352
|
+
expect(result.errors[0].message).toBe(
|
|
353
|
+
"Tags must have no more than 3 items",
|
|
354
|
+
);
|
|
345
355
|
});
|
|
346
356
|
|
|
347
357
|
it("should allow fieldDef.minItems to override schema.minItems", () => {
|
|
@@ -409,7 +419,7 @@ describe("validate", () => {
|
|
|
409
419
|
{ name: "Bob", score: 87 },
|
|
410
420
|
],
|
|
411
421
|
},
|
|
412
|
-
spec
|
|
422
|
+
spec,
|
|
413
423
|
);
|
|
414
424
|
expect(validResult.valid).toBe(true);
|
|
415
425
|
|
|
@@ -421,7 +431,7 @@ describe("validate", () => {
|
|
|
421
431
|
{ name: "Bob", score: 87 },
|
|
422
432
|
],
|
|
423
433
|
},
|
|
424
|
-
spec
|
|
434
|
+
spec,
|
|
425
435
|
);
|
|
426
436
|
expect(maxResult.valid).toBe(false);
|
|
427
437
|
expect(maxResult.errors[0].field).toBe("scores[0].score");
|
|
@@ -435,7 +445,7 @@ describe("validate", () => {
|
|
|
435
445
|
{ name: "Bob", score: 87 },
|
|
436
446
|
],
|
|
437
447
|
},
|
|
438
|
-
spec
|
|
448
|
+
spec,
|
|
439
449
|
);
|
|
440
450
|
expect(minResult.valid).toBe(false);
|
|
441
451
|
expect(minResult.errors[0].field).toBe("scores[0].score");
|
|
@@ -470,7 +480,10 @@ describe("validate", () => {
|
|
|
470
480
|
|
|
471
481
|
// Valid - name is present (age is optional)
|
|
472
482
|
expect(
|
|
473
|
-
validate(
|
|
483
|
+
validate(
|
|
484
|
+
{ people: [{ name: "Alice" }, { name: "Bob", age: 30 }] },
|
|
485
|
+
spec,
|
|
486
|
+
).valid,
|
|
474
487
|
).toBe(true);
|
|
475
488
|
|
|
476
489
|
// Invalid - missing required name
|
|
@@ -508,19 +521,32 @@ describe("validate", () => {
|
|
|
508
521
|
|
|
509
522
|
// Valid
|
|
510
523
|
expect(
|
|
511
|
-
validate(
|
|
524
|
+
validate(
|
|
525
|
+
{ emails: [{ address: "test@example.com", label: "Work" }] },
|
|
526
|
+
spec,
|
|
527
|
+
).valid,
|
|
512
528
|
).toBe(true);
|
|
513
529
|
|
|
514
530
|
// Invalid email format
|
|
515
|
-
const emailResult = validate(
|
|
531
|
+
const emailResult = validate(
|
|
532
|
+
{ emails: [{ address: "not-an-email" }] },
|
|
533
|
+
spec,
|
|
534
|
+
);
|
|
516
535
|
expect(emailResult.valid).toBe(false);
|
|
517
536
|
expect(emailResult.errors[0].field).toBe("emails[0].address");
|
|
518
537
|
expect(emailResult.errors[0].message).toContain("valid email");
|
|
519
538
|
|
|
520
539
|
// Invalid label (too long)
|
|
521
540
|
const labelResult = validate(
|
|
522
|
-
{
|
|
523
|
-
|
|
541
|
+
{
|
|
542
|
+
emails: [
|
|
543
|
+
{
|
|
544
|
+
address: "test@example.com",
|
|
545
|
+
label: "This label is way too long for the constraint",
|
|
546
|
+
},
|
|
547
|
+
],
|
|
548
|
+
},
|
|
549
|
+
spec,
|
|
524
550
|
);
|
|
525
551
|
expect(labelResult.valid).toBe(false);
|
|
526
552
|
expect(labelResult.errors[0].field).toBe("emails[0].label");
|
|
@@ -552,7 +578,10 @@ describe("validate", () => {
|
|
|
552
578
|
};
|
|
553
579
|
|
|
554
580
|
// Valid - correct precision
|
|
555
|
-
expect(
|
|
581
|
+
expect(
|
|
582
|
+
validate({ prices: [{ amount: 10.99 }, { amount: 5.0 }] }, spec)
|
|
583
|
+
.valid,
|
|
584
|
+
).toBe(true);
|
|
556
585
|
|
|
557
586
|
// Invalid - wrong precision
|
|
558
587
|
const result = validate({ prices: [{ amount: 10.999 }] }, spec);
|
|
@@ -592,7 +621,10 @@ describe("validate", () => {
|
|
|
592
621
|
type: "number",
|
|
593
622
|
label: "Quantity",
|
|
594
623
|
validations: [
|
|
595
|
-
{
|
|
624
|
+
{
|
|
625
|
+
rule: "value <= 100",
|
|
626
|
+
message: "Cannot order more than 100 items",
|
|
627
|
+
},
|
|
596
628
|
],
|
|
597
629
|
},
|
|
598
630
|
},
|
|
@@ -602,17 +634,27 @@ describe("validate", () => {
|
|
|
602
634
|
};
|
|
603
635
|
|
|
604
636
|
// Valid
|
|
605
|
-
expect(
|
|
637
|
+
expect(
|
|
638
|
+
validate({ orders: [{ quantity: 5, price: 10.0 }] }, spec).valid,
|
|
639
|
+
).toBe(true);
|
|
606
640
|
|
|
607
641
|
// Invalid - schema minimum violated
|
|
608
|
-
const minResult = validate(
|
|
642
|
+
const minResult = validate(
|
|
643
|
+
{ orders: [{ quantity: 0, price: 10.0 }] },
|
|
644
|
+
spec,
|
|
645
|
+
);
|
|
609
646
|
expect(minResult.valid).toBe(false);
|
|
610
647
|
expect(minResult.errors[0].message).toContain("at least 1");
|
|
611
648
|
|
|
612
649
|
// Invalid - custom FEEL validation violated
|
|
613
|
-
const customResult = validate(
|
|
650
|
+
const customResult = validate(
|
|
651
|
+
{ orders: [{ quantity: 150, price: 10.0 }] },
|
|
652
|
+
spec,
|
|
653
|
+
);
|
|
614
654
|
expect(customResult.valid).toBe(false);
|
|
615
|
-
expect(
|
|
655
|
+
expect(
|
|
656
|
+
customResult.errors.some((e) => e.message.includes("more than 100")),
|
|
657
|
+
).toBe(true);
|
|
616
658
|
|
|
617
659
|
// Invalid - empty array (minItems from schema)
|
|
618
660
|
const emptyResult = validate({ orders: [] }, spec);
|