@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.
Files changed (40) hide show
  1. package/README.md +12 -12
  2. package/dist/{chunk-U2OXXFEH.js → chunk-BDICNCE2.js} +1 -1
  3. package/dist/chunk-BDICNCE2.js.map +1 -0
  4. package/dist/{chunk-ZSW7NIMY.js → chunk-NKA3L2LJ.js} +64 -15
  5. package/dist/chunk-NKA3L2LJ.js.map +1 -0
  6. package/dist/engine/calculate.d.ts.map +1 -1
  7. package/dist/engine/enabled.d.ts.map +1 -1
  8. package/dist/engine/index.cjs +62 -13
  9. package/dist/engine/index.cjs.map +1 -1
  10. package/dist/engine/index.d.ts +8 -8
  11. package/dist/engine/index.d.ts.map +1 -1
  12. package/dist/engine/index.js +2 -2
  13. package/dist/engine/readonly.d.ts.map +1 -1
  14. package/dist/engine/required.d.ts.map +1 -1
  15. package/dist/engine/validate.d.ts.map +1 -1
  16. package/dist/engine/visibility.d.ts.map +1 -1
  17. package/dist/feel/index.cjs.map +1 -1
  18. package/dist/feel/index.js +1 -1
  19. package/dist/index.cjs +62 -13
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.js +2 -2
  22. package/dist/types.d.ts +16 -0
  23. package/dist/types.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. package/src/__tests__/feel.test.ts +67 -76
  26. package/src/__tests__/format.test.ts +19 -6
  27. package/src/__tests__/validate.test.ts +62 -20
  28. package/src/__tests__/visibility.test.ts +217 -85
  29. package/src/engine/calculate.ts +13 -10
  30. package/src/engine/enabled.ts +16 -6
  31. package/src/engine/index.ts +8 -28
  32. package/src/engine/readonly.ts +16 -6
  33. package/src/engine/required.ts +7 -5
  34. package/src/engine/validate.ts +43 -22
  35. package/src/engine/visibility.ts +40 -16
  36. package/src/feel/index.ts +12 -12
  37. package/src/format/index.ts +1 -1
  38. package/src/types.ts +46 -7
  39. package/dist/chunk-U2OXXFEH.js.map +0 -1
  40. 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("Amount must be a multiple of 0.01");
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("Percentage must be no more than 100");
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("Name must be at least 2 characters");
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("Items must have at least 2 items");
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("Tags must have no more than 3 items");
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({ people: [{ name: "Alice" }, { name: "Bob", age: 30 }] }, spec).valid
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({ emails: [{ address: "test@example.com", label: "Work" }] }, spec).valid
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({ emails: [{ address: "not-an-email" }] }, spec);
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
- { emails: [{ address: "test@example.com", label: "This label is way too long for the constraint" }] },
523
- spec
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(validate({ prices: [{ amount: 10.99 }, { amount: 5.0 }] }, spec).valid).toBe(true);
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
- { rule: "value <= 100", message: "Cannot order more than 100 items" },
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(validate({ orders: [{ quantity: 5, price: 10.0 }] }, spec).valid).toBe(true);
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({ orders: [{ quantity: 0, price: 10.0 }] }, spec);
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({ orders: [{ quantity: 150, price: 10.0 }] }, spec);
650
+ const customResult = validate(
651
+ { orders: [{ quantity: 150, price: 10.0 }] },
652
+ spec,
653
+ );
614
654
  expect(customResult.valid).toBe(false);
615
- expect(customResult.errors.some((e) => e.message.includes("more than 100"))).toBe(true);
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);