@remoteoss/json-schema-form 0.4.4-dev.20230830125207 → 0.4.6-dev.20230911130751

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.
@@ -1,8 +1,8 @@
1
1
 
2
2
  /*!
3
3
  Copyright (c) 2023 Remote Technology, Inc.
4
- NPM Package: @remoteoss/json-schema-form@0.4.4-dev.20230830125207
5
- Generated: Wed, 30 Aug 2023 12:52:17 GMT
4
+ NPM Package: @remoteoss/json-schema-form@0.4.6-dev.20230911130751
5
+ Generated: Mon, 11 Sep 2023 13:08:22 GMT
6
6
 
7
7
  MIT License
8
8
 
@@ -6421,6 +6421,384 @@ var require_randexp = __commonJS({
6421
6421
  }
6422
6422
  });
6423
6423
 
6424
+ // node_modules/json-logic-js/logic.js
6425
+ var require_logic = __commonJS({
6426
+ "node_modules/json-logic-js/logic.js"(exports2, module2) {
6427
+ (function(root2, factory) {
6428
+ if (typeof define === "function" && define.amd) {
6429
+ define(factory);
6430
+ } else if (typeof exports2 === "object") {
6431
+ module2.exports = factory();
6432
+ } else {
6433
+ root2.jsonLogic = factory();
6434
+ }
6435
+ })(exports2, function() {
6436
+ "use strict";
6437
+ if (!Array.isArray) {
6438
+ Array.isArray = function(arg) {
6439
+ return Object.prototype.toString.call(arg) === "[object Array]";
6440
+ };
6441
+ }
6442
+ function arrayUnique(array2) {
6443
+ var a = [];
6444
+ for (var i = 0, l = array2.length; i < l; i++) {
6445
+ if (a.indexOf(array2[i]) === -1) {
6446
+ a.push(array2[i]);
6447
+ }
6448
+ }
6449
+ return a;
6450
+ }
6451
+ var jsonLogic2 = {};
6452
+ var operations = {
6453
+ "==": function(a, b) {
6454
+ return a == b;
6455
+ },
6456
+ "===": function(a, b) {
6457
+ return a === b;
6458
+ },
6459
+ "!=": function(a, b) {
6460
+ return a != b;
6461
+ },
6462
+ "!==": function(a, b) {
6463
+ return a !== b;
6464
+ },
6465
+ ">": function(a, b) {
6466
+ return a > b;
6467
+ },
6468
+ ">=": function(a, b) {
6469
+ return a >= b;
6470
+ },
6471
+ "<": function(a, b, c) {
6472
+ return c === void 0 ? a < b : a < b && b < c;
6473
+ },
6474
+ "<=": function(a, b, c) {
6475
+ return c === void 0 ? a <= b : a <= b && b <= c;
6476
+ },
6477
+ "!!": function(a) {
6478
+ return jsonLogic2.truthy(a);
6479
+ },
6480
+ "!": function(a) {
6481
+ return !jsonLogic2.truthy(a);
6482
+ },
6483
+ "%": function(a, b) {
6484
+ return a % b;
6485
+ },
6486
+ "log": function(a) {
6487
+ console.log(a);
6488
+ return a;
6489
+ },
6490
+ "in": function(a, b) {
6491
+ if (!b || typeof b.indexOf === "undefined")
6492
+ return false;
6493
+ return b.indexOf(a) !== -1;
6494
+ },
6495
+ "cat": function() {
6496
+ return Array.prototype.join.call(arguments, "");
6497
+ },
6498
+ "substr": function(source, start, end) {
6499
+ if (end < 0) {
6500
+ var temp = String(source).substr(start);
6501
+ return temp.substr(0, temp.length + end);
6502
+ }
6503
+ return String(source).substr(start, end);
6504
+ },
6505
+ "+": function() {
6506
+ return Array.prototype.reduce.call(arguments, function(a, b) {
6507
+ return parseFloat(a, 10) + parseFloat(b, 10);
6508
+ }, 0);
6509
+ },
6510
+ "*": function() {
6511
+ return Array.prototype.reduce.call(arguments, function(a, b) {
6512
+ return parseFloat(a, 10) * parseFloat(b, 10);
6513
+ });
6514
+ },
6515
+ "-": function(a, b) {
6516
+ if (b === void 0) {
6517
+ return -a;
6518
+ } else {
6519
+ return a - b;
6520
+ }
6521
+ },
6522
+ "/": function(a, b) {
6523
+ return a / b;
6524
+ },
6525
+ "min": function() {
6526
+ return Math.min.apply(this, arguments);
6527
+ },
6528
+ "max": function() {
6529
+ return Math.max.apply(this, arguments);
6530
+ },
6531
+ "merge": function() {
6532
+ return Array.prototype.reduce.call(arguments, function(a, b) {
6533
+ return a.concat(b);
6534
+ }, []);
6535
+ },
6536
+ "var": function(a, b) {
6537
+ var not_found = b === void 0 ? null : b;
6538
+ var data = this;
6539
+ if (typeof a === "undefined" || a === "" || a === null) {
6540
+ return data;
6541
+ }
6542
+ var sub_props = String(a).split(".");
6543
+ for (var i = 0; i < sub_props.length; i++) {
6544
+ if (data === null || data === void 0) {
6545
+ return not_found;
6546
+ }
6547
+ data = data[sub_props[i]];
6548
+ if (data === void 0) {
6549
+ return not_found;
6550
+ }
6551
+ }
6552
+ return data;
6553
+ },
6554
+ "missing": function() {
6555
+ var missing = [];
6556
+ var keys2 = Array.isArray(arguments[0]) ? arguments[0] : arguments;
6557
+ for (var i = 0; i < keys2.length; i++) {
6558
+ var key = keys2[i];
6559
+ var value = jsonLogic2.apply({ "var": key }, this);
6560
+ if (value === null || value === "") {
6561
+ missing.push(key);
6562
+ }
6563
+ }
6564
+ return missing;
6565
+ },
6566
+ "missing_some": function(need_count, options) {
6567
+ var are_missing = jsonLogic2.apply({ "missing": options }, this);
6568
+ if (options.length - are_missing.length >= need_count) {
6569
+ return [];
6570
+ } else {
6571
+ return are_missing;
6572
+ }
6573
+ }
6574
+ };
6575
+ jsonLogic2.is_logic = function(logic) {
6576
+ return typeof logic === "object" && // An object
6577
+ logic !== null && // but not null
6578
+ !Array.isArray(logic) && // and not an array
6579
+ Object.keys(logic).length === 1;
6580
+ };
6581
+ jsonLogic2.truthy = function(value) {
6582
+ if (Array.isArray(value) && value.length === 0) {
6583
+ return false;
6584
+ }
6585
+ return !!value;
6586
+ };
6587
+ jsonLogic2.get_operator = function(logic) {
6588
+ return Object.keys(logic)[0];
6589
+ };
6590
+ jsonLogic2.get_values = function(logic) {
6591
+ return logic[jsonLogic2.get_operator(logic)];
6592
+ };
6593
+ jsonLogic2.apply = function(logic, data) {
6594
+ if (Array.isArray(logic)) {
6595
+ return logic.map(function(l) {
6596
+ return jsonLogic2.apply(l, data);
6597
+ });
6598
+ }
6599
+ if (!jsonLogic2.is_logic(logic)) {
6600
+ return logic;
6601
+ }
6602
+ var op = jsonLogic2.get_operator(logic);
6603
+ var values2 = logic[op];
6604
+ var i;
6605
+ var current;
6606
+ var scopedLogic;
6607
+ var scopedData;
6608
+ var initial;
6609
+ if (!Array.isArray(values2)) {
6610
+ values2 = [values2];
6611
+ }
6612
+ if (op === "if" || op == "?:") {
6613
+ for (i = 0; i < values2.length - 1; i += 2) {
6614
+ if (jsonLogic2.truthy(jsonLogic2.apply(values2[i], data))) {
6615
+ return jsonLogic2.apply(values2[i + 1], data);
6616
+ }
6617
+ }
6618
+ if (values2.length === i + 1) {
6619
+ return jsonLogic2.apply(values2[i], data);
6620
+ }
6621
+ return null;
6622
+ } else if (op === "and") {
6623
+ for (i = 0; i < values2.length; i += 1) {
6624
+ current = jsonLogic2.apply(values2[i], data);
6625
+ if (!jsonLogic2.truthy(current)) {
6626
+ return current;
6627
+ }
6628
+ }
6629
+ return current;
6630
+ } else if (op === "or") {
6631
+ for (i = 0; i < values2.length; i += 1) {
6632
+ current = jsonLogic2.apply(values2[i], data);
6633
+ if (jsonLogic2.truthy(current)) {
6634
+ return current;
6635
+ }
6636
+ }
6637
+ return current;
6638
+ } else if (op === "filter") {
6639
+ scopedData = jsonLogic2.apply(values2[0], data);
6640
+ scopedLogic = values2[1];
6641
+ if (!Array.isArray(scopedData)) {
6642
+ return [];
6643
+ }
6644
+ return scopedData.filter(function(datum) {
6645
+ return jsonLogic2.truthy(jsonLogic2.apply(scopedLogic, datum));
6646
+ });
6647
+ } else if (op === "map") {
6648
+ scopedData = jsonLogic2.apply(values2[0], data);
6649
+ scopedLogic = values2[1];
6650
+ if (!Array.isArray(scopedData)) {
6651
+ return [];
6652
+ }
6653
+ return scopedData.map(function(datum) {
6654
+ return jsonLogic2.apply(scopedLogic, datum);
6655
+ });
6656
+ } else if (op === "reduce") {
6657
+ scopedData = jsonLogic2.apply(values2[0], data);
6658
+ scopedLogic = values2[1];
6659
+ initial = typeof values2[2] !== "undefined" ? values2[2] : null;
6660
+ if (!Array.isArray(scopedData)) {
6661
+ return initial;
6662
+ }
6663
+ return scopedData.reduce(
6664
+ function(accumulator, current2) {
6665
+ return jsonLogic2.apply(
6666
+ scopedLogic,
6667
+ { current: current2, accumulator }
6668
+ );
6669
+ },
6670
+ initial
6671
+ );
6672
+ } else if (op === "all") {
6673
+ scopedData = jsonLogic2.apply(values2[0], data);
6674
+ scopedLogic = values2[1];
6675
+ if (!Array.isArray(scopedData) || !scopedData.length) {
6676
+ return false;
6677
+ }
6678
+ for (i = 0; i < scopedData.length; i += 1) {
6679
+ if (!jsonLogic2.truthy(jsonLogic2.apply(scopedLogic, scopedData[i]))) {
6680
+ return false;
6681
+ }
6682
+ }
6683
+ return true;
6684
+ } else if (op === "none") {
6685
+ scopedData = jsonLogic2.apply(values2[0], data);
6686
+ scopedLogic = values2[1];
6687
+ if (!Array.isArray(scopedData) || !scopedData.length) {
6688
+ return true;
6689
+ }
6690
+ for (i = 0; i < scopedData.length; i += 1) {
6691
+ if (jsonLogic2.truthy(jsonLogic2.apply(scopedLogic, scopedData[i]))) {
6692
+ return false;
6693
+ }
6694
+ }
6695
+ return true;
6696
+ } else if (op === "some") {
6697
+ scopedData = jsonLogic2.apply(values2[0], data);
6698
+ scopedLogic = values2[1];
6699
+ if (!Array.isArray(scopedData) || !scopedData.length) {
6700
+ return false;
6701
+ }
6702
+ for (i = 0; i < scopedData.length; i += 1) {
6703
+ if (jsonLogic2.truthy(jsonLogic2.apply(scopedLogic, scopedData[i]))) {
6704
+ return true;
6705
+ }
6706
+ }
6707
+ return false;
6708
+ }
6709
+ values2 = values2.map(function(val) {
6710
+ return jsonLogic2.apply(val, data);
6711
+ });
6712
+ if (operations.hasOwnProperty(op) && typeof operations[op] === "function") {
6713
+ return operations[op].apply(data, values2);
6714
+ } else if (op.indexOf(".") > 0) {
6715
+ var sub_ops = String(op).split(".");
6716
+ var operation = operations;
6717
+ for (i = 0; i < sub_ops.length; i++) {
6718
+ if (!operation.hasOwnProperty(sub_ops[i])) {
6719
+ throw new Error("Unrecognized operation " + op + " (failed at " + sub_ops.slice(0, i + 1).join(".") + ")");
6720
+ }
6721
+ operation = operation[sub_ops[i]];
6722
+ }
6723
+ return operation.apply(data, values2);
6724
+ }
6725
+ throw new Error("Unrecognized operation " + op);
6726
+ };
6727
+ jsonLogic2.uses_data = function(logic) {
6728
+ var collection = [];
6729
+ if (jsonLogic2.is_logic(logic)) {
6730
+ var op = jsonLogic2.get_operator(logic);
6731
+ var values2 = logic[op];
6732
+ if (!Array.isArray(values2)) {
6733
+ values2 = [values2];
6734
+ }
6735
+ if (op === "var") {
6736
+ collection.push(values2[0]);
6737
+ } else {
6738
+ values2.forEach(function(val) {
6739
+ collection.push.apply(collection, jsonLogic2.uses_data(val));
6740
+ });
6741
+ }
6742
+ }
6743
+ return arrayUnique(collection);
6744
+ };
6745
+ jsonLogic2.add_operation = function(name, code) {
6746
+ operations[name] = code;
6747
+ };
6748
+ jsonLogic2.rm_operation = function(name) {
6749
+ delete operations[name];
6750
+ };
6751
+ jsonLogic2.rule_like = function(rule, pattern) {
6752
+ if (pattern === rule) {
6753
+ return true;
6754
+ }
6755
+ if (pattern === "@") {
6756
+ return true;
6757
+ }
6758
+ if (pattern === "number") {
6759
+ return typeof rule === "number";
6760
+ }
6761
+ if (pattern === "string") {
6762
+ return typeof rule === "string";
6763
+ }
6764
+ if (pattern === "array") {
6765
+ return Array.isArray(rule) && !jsonLogic2.is_logic(rule);
6766
+ }
6767
+ if (jsonLogic2.is_logic(pattern)) {
6768
+ if (jsonLogic2.is_logic(rule)) {
6769
+ var pattern_op = jsonLogic2.get_operator(pattern);
6770
+ var rule_op = jsonLogic2.get_operator(rule);
6771
+ if (pattern_op === "@" || pattern_op === rule_op) {
6772
+ return jsonLogic2.rule_like(
6773
+ jsonLogic2.get_values(rule, false),
6774
+ jsonLogic2.get_values(pattern, false)
6775
+ );
6776
+ }
6777
+ }
6778
+ return false;
6779
+ }
6780
+ if (Array.isArray(pattern)) {
6781
+ if (Array.isArray(rule)) {
6782
+ if (pattern.length !== rule.length) {
6783
+ return false;
6784
+ }
6785
+ for (var i = 0; i < pattern.length; i += 1) {
6786
+ if (!jsonLogic2.rule_like(rule[i], pattern[i])) {
6787
+ return false;
6788
+ }
6789
+ }
6790
+ return true;
6791
+ } else {
6792
+ return false;
6793
+ }
6794
+ }
6795
+ return false;
6796
+ };
6797
+ return jsonLogic2;
6798
+ });
6799
+ }
6800
+ });
6801
+
6424
6802
  // node_modules/lodash/_baseInRange.js
6425
6803
  var require_baseInRange = __commonJS({
6426
6804
  "node_modules/lodash/_baseInRange.js"(exports2, module2) {
@@ -11351,6 +11729,103 @@ function _composeFieldCustomClosure(defaultComposeFn) {
11351
11729
  var import_flow = __toESM(require_flow());
11352
11730
  var import_noop = __toESM(require_noop());
11353
11731
  var import_randexp = __toESM(require_randexp());
11732
+
11733
+ // src/jsonLogic.js
11734
+ var import_json_logic_js = __toESM(require_logic());
11735
+ function createValidationChecker(schema) {
11736
+ const scopes = /* @__PURE__ */ new Map();
11737
+ function createScopes(jsonSchema, key = "root") {
11738
+ scopes.set(key, createValidationsScope(jsonSchema));
11739
+ Object.entries(jsonSchema?.properties ?? {}).filter(([, property2]) => property2.type === "object" || property2.type === "array").forEach(([key2, property2]) => {
11740
+ if (property2.type === "array") {
11741
+ createScopes(property2.items, `${key2}[]`);
11742
+ } else {
11743
+ createScopes(property2, key2);
11744
+ }
11745
+ });
11746
+ }
11747
+ createScopes(schema);
11748
+ return {
11749
+ scopes,
11750
+ getScope(name = "root") {
11751
+ return scopes.get(name);
11752
+ }
11753
+ };
11754
+ }
11755
+ function createValidationsScope(schema) {
11756
+ const validationMap = /* @__PURE__ */ new Map();
11757
+ const computedValuesMap = /* @__PURE__ */ new Map();
11758
+ const logic = schema?.["x-jsf-logic"] ?? {
11759
+ validations: {},
11760
+ computedValues: {}
11761
+ };
11762
+ const validations = Object.entries(logic.validations ?? {});
11763
+ const computedValues = Object.entries(logic.computedValues ?? {});
11764
+ validations.forEach(([id, validation]) => {
11765
+ validationMap.set(id, validation);
11766
+ });
11767
+ computedValues.forEach(([id, computedValue]) => {
11768
+ computedValuesMap.set(id, computedValue);
11769
+ });
11770
+ function validate2(rule, values2) {
11771
+ return import_json_logic_js.default.apply(rule, replaceUndefinedValuesWithNulls(values2));
11772
+ }
11773
+ return {
11774
+ validationMap,
11775
+ computedValuesMap,
11776
+ validate: validate2,
11777
+ applyValidationRuleInCondition(id, values2) {
11778
+ const validation = validationMap.get(id);
11779
+ return validate2(validation.rule, values2);
11780
+ },
11781
+ applyComputedValueInField(id, values2) {
11782
+ const validation = computedValuesMap.get(id);
11783
+ return validate2(validation.rule, values2);
11784
+ },
11785
+ applyComputedValueRuleInCondition(id, values2) {
11786
+ const validation = computedValuesMap.get(id);
11787
+ return validate2(validation.rule, values2);
11788
+ }
11789
+ };
11790
+ }
11791
+ function replaceUndefinedValuesWithNulls(values2 = {}) {
11792
+ return Object.entries(values2).reduce((prev, [key, value]) => {
11793
+ return { ...prev, [key]: value === void 0 ? null : value };
11794
+ }, {});
11795
+ }
11796
+ function yupSchemaWithCustomJSONLogic({ field, logic, config, id }) {
11797
+ const { parentID = "root" } = config;
11798
+ const validation = logic.getScope(parentID).validationMap.get(id);
11799
+ return (yupSchema) => yupSchema.test(
11800
+ `${field.name}-validation-${id}`,
11801
+ validation?.errorMessage ?? "This field is invalid.",
11802
+ (value, { parent }) => {
11803
+ if (value === void 0 && !field.required)
11804
+ return true;
11805
+ return import_json_logic_js.default.apply(validation.rule, parent);
11806
+ }
11807
+ );
11808
+ }
11809
+ function calculateComputedAttributes(fieldParams, { parentID = "root" } = {}) {
11810
+ return ({ logic, formValues }) => {
11811
+ const { computedAttributes } = fieldParams;
11812
+ const attributes = Object.fromEntries(
11813
+ Object.entries(computedAttributes).map(handleComputedAttribute(logic, formValues, parentID)).filter(([, value]) => value !== null)
11814
+ );
11815
+ return attributes;
11816
+ };
11817
+ }
11818
+ function handleComputedAttribute(logic, formValues, parentID) {
11819
+ return ([key, value]) => {
11820
+ if (key === "const")
11821
+ return [key, logic.getScope(parentID).applyComputedValueInField(value, formValues)];
11822
+ if (typeof value === "string") {
11823
+ return [key, logic.getScope(parentID).applyComputedValueInField(value, formValues)];
11824
+ }
11825
+ };
11826
+ }
11827
+
11828
+ // src/yupSchema.js
11354
11829
  var DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
11355
11830
  var baseString = StringSchema().trim();
11356
11831
  var todayDateHint = (/* @__PURE__ */ new Date()).toISOString().substring(0, 10);
@@ -11473,7 +11948,7 @@ var getYupSchema = ({ inputType, ...field }) => {
11473
11948
  }
11474
11949
  return yupSchemas[inputType] || yupSchemasToJsonTypes[jsonType];
11475
11950
  };
11476
- function buildYupSchema(field, config) {
11951
+ function buildYupSchema(field, config, logic) {
11477
11952
  const { inputType, jsonType: jsonTypeValue, errorMessage = {}, ...propertyFields } = field;
11478
11953
  const isCheckboxBoolean = typeof propertyFields.checkboxValue === "boolean";
11479
11954
  let baseSchema;
@@ -11546,6 +12021,13 @@ function buildYupSchema(field, config) {
11546
12021
  }) : true
11547
12022
  );
11548
12023
  }
12024
+ function withConst(yupSchema) {
12025
+ return yupSchema.test(
12026
+ "isConst",
12027
+ errorMessage.const ?? errorMessageFromConfig.const ?? `The only accepted value is ${propertyFields.const}.`,
12028
+ (value) => propertyFields.required === false && value === void 0 || value === null || value === propertyFields.const
12029
+ );
12030
+ }
11549
12031
  function withBaseSchema() {
11550
12032
  const customErrorMsg = errorMessage.type || errorMessageFromConfig.type;
11551
12033
  if (customErrorMsg) {
@@ -11613,6 +12095,14 @@ function buildYupSchema(field, config) {
11613
12095
  if (propertyFields.accept) {
11614
12096
  validators.push(withFileFormat);
11615
12097
  }
12098
+ if (propertyFields.const) {
12099
+ validators.push(withConst);
12100
+ }
12101
+ if (propertyFields.requiredValidations) {
12102
+ propertyFields.requiredValidations.forEach(
12103
+ (id) => validators.push(yupSchemaWithCustomJSONLogic({ field, id, logic, config }))
12104
+ );
12105
+ }
11616
12106
  return (0, import_flow.default)(validators);
11617
12107
  }
11618
12108
  function getNoSortEdges(fields = []) {
@@ -11652,8 +12142,8 @@ function hasType(type, typeName) {
11652
12142
  function getField(fieldName, fields) {
11653
12143
  return fields.find(({ name }) => name === fieldName);
11654
12144
  }
11655
- function validateFieldSchema(field, value) {
11656
- const validator = buildYupSchema(field);
12145
+ function validateFieldSchema(field, value, logic) {
12146
+ const validator = buildYupSchema(field, {}, logic);
11657
12147
  return validator().isValidSync(value);
11658
12148
  }
11659
12149
  function compareFormValueWithSchemaValue(formValue, schemaValue) {
@@ -11727,7 +12217,7 @@ function getPrefillValues(fields, initialValues = {}) {
11727
12217
  });
11728
12218
  return initialValues;
11729
12219
  }
11730
- function updateField(field, requiredFields, node, formValues) {
12220
+ function updateField(field, requiredFields, node, formValues, logic, config) {
11731
12221
  if (!field) {
11732
12222
  return;
11733
12223
  }
@@ -11749,6 +12239,17 @@ function updateField(field, requiredFields, node, formValues) {
11749
12239
  }
11750
12240
  }
11751
12241
  });
12242
+ if (field.getComputedAttributes) {
12243
+ const computedFieldValues = field.getComputedAttributes({
12244
+ field,
12245
+ isRequired: fieldIsRequired,
12246
+ node,
12247
+ formValues,
12248
+ config,
12249
+ logic
12250
+ });
12251
+ updateValues(computedFieldValues);
12252
+ }
11752
12253
  if (field.calculateConditionalProperties) {
11753
12254
  const newFieldValues = field.calculateConditionalProperties(fieldIsRequired, node);
11754
12255
  updateValues(newFieldValues);
@@ -11762,33 +12263,46 @@ function updateField(field, requiredFields, node, formValues) {
11762
12263
  updateValues(newFieldValues);
11763
12264
  }
11764
12265
  }
11765
- function processNode(node, formValues, formFields, accRequired = /* @__PURE__ */ new Set()) {
12266
+ function processNode({
12267
+ node,
12268
+ formValues,
12269
+ formFields,
12270
+ accRequired = /* @__PURE__ */ new Set(),
12271
+ parentID = "root",
12272
+ logic
12273
+ }) {
11766
12274
  const requiredFields = new Set(accRequired);
11767
12275
  Object.keys(node.properties ?? []).forEach((fieldName) => {
11768
12276
  const field = getField(fieldName, formFields);
11769
- updateField(field, requiredFields, node, formValues);
12277
+ updateField(field, requiredFields, node, formValues, logic, { parentID });
11770
12278
  });
11771
12279
  node.required?.forEach((fieldName) => {
11772
12280
  requiredFields.add(fieldName);
11773
- updateField(getField(fieldName, formFields), requiredFields, node, formValues);
12281
+ updateField(getField(fieldName, formFields), requiredFields, node, formValues, logic, {
12282
+ parentID
12283
+ });
11774
12284
  });
11775
12285
  if (node.if) {
11776
- const matchesCondition = checkIfConditionMatches(node, formValues, formFields);
12286
+ const matchesCondition = checkIfConditionMatches(node, formValues, formFields, logic);
11777
12287
  if (matchesCondition && node.then) {
11778
- const { required: branchRequired } = processNode(
11779
- node.then,
12288
+ const { required: branchRequired } = processNode({
12289
+ node: node.then,
11780
12290
  formValues,
11781
12291
  formFields,
11782
- requiredFields
11783
- );
12292
+ accRequired: requiredFields,
12293
+ parentID,
12294
+ logic
12295
+ });
11784
12296
  branchRequired.forEach((field) => requiredFields.add(field));
11785
12297
  } else if (node.else) {
11786
- const { required: branchRequired } = processNode(
11787
- node.else,
12298
+ const { required: branchRequired } = processNode({
12299
+ node: node.else,
11788
12300
  formValues,
11789
12301
  formFields,
11790
- requiredFields
11791
- );
12302
+ accRequired: requiredFields,
12303
+ parentID,
12304
+ logic
12305
+ });
11792
12306
  branchRequired.forEach((field) => requiredFields.add(field));
11793
12307
  }
11794
12308
  }
@@ -11800,12 +12314,21 @@ function processNode(node, formValues, formFields, accRequired = /* @__PURE__ */
11800
12314
  node.anyOf.forEach(({ required: required2 = [] }) => {
11801
12315
  required2.forEach((fieldName) => {
11802
12316
  const field = getField(fieldName, formFields);
11803
- updateField(field, requiredFields, node, formValues);
12317
+ updateField(field, requiredFields, node, formValues, logic, { parentID });
11804
12318
  });
11805
12319
  });
11806
12320
  }
11807
12321
  if (node.allOf) {
11808
- node.allOf.map((allOfNode) => processNode(allOfNode, formValues, formFields, requiredFields)).forEach(({ required: allOfItemRequired }) => {
12322
+ node.allOf.map(
12323
+ (allOfNode) => processNode({
12324
+ node: allOfNode,
12325
+ formValues,
12326
+ formFields,
12327
+ accRequired: requiredFields,
12328
+ parentID,
12329
+ logic
12330
+ })
12331
+ ).forEach(({ required: allOfItemRequired }) => {
11809
12332
  allOfItemRequired.forEach(requiredFields.add, requiredFields);
11810
12333
  });
11811
12334
  }
@@ -11813,7 +12336,13 @@ function processNode(node, formValues, formFields, accRequired = /* @__PURE__ */
11813
12336
  Object.entries(node.properties).forEach(([name, nestedNode]) => {
11814
12337
  const inputType = getInputType(nestedNode);
11815
12338
  if (inputType === supportedTypes.FIELDSET) {
11816
- processNode(nestedNode, formValues[name] || {}, getField(name, formFields).fields);
12339
+ processNode({
12340
+ node: nestedNode,
12341
+ formValues: formValues[name] || {},
12342
+ formFields: getField(name, formFields).fields,
12343
+ parentID: name,
12344
+ logic
12345
+ });
11817
12346
  }
11818
12347
  });
11819
12348
  }
@@ -11831,11 +12360,11 @@ function clearValuesIfNotVisible(fields, formValues) {
11831
12360
  }
11832
12361
  });
11833
12362
  }
11834
- function updateFieldsProperties(fields, formValues, jsonSchema) {
12363
+ function updateFieldsProperties(fields, formValues, jsonSchema, logic) {
11835
12364
  if (!jsonSchema?.properties) {
11836
12365
  return;
11837
12366
  }
11838
- processNode(jsonSchema, formValues, fields);
12367
+ processNode({ node: jsonSchema, formValues, formFields: fields, logic });
11839
12368
  clearValuesIfNotVisible(fields, formValues);
11840
12369
  }
11841
12370
  var notNullOption = (opt) => opt.const !== null;
@@ -11878,11 +12407,16 @@ function extractParametersFromNode(schemaNode) {
11878
12407
  }
11879
12408
  const presentation = pickXKey(schemaNode, "presentation") ?? {};
11880
12409
  const errorMessage = pickXKey(schemaNode, "errorMessage") ?? {};
12410
+ const requiredValidations = schemaNode["x-jsf-logic-validations"];
12411
+ const computedAttributes = schemaNode["x-jsf-logic-computedAttrs"];
12412
+ const decoratedComputedAttributes = getDecoratedComputedAttributes(computedAttributes);
11881
12413
  const node = (0, import_omit.default)(schemaNode, ["x-jsf-presentation", "presentation"]);
11882
12414
  const description = presentation?.description || node.description;
11883
12415
  const statementDescription = containsHTML(presentation.statement?.description) ? wrapWithSpan(presentation.statement.description, { class: "jsf-statement" }) : presentation.statement?.description;
11884
12416
  return (0, import_omitBy.default)(
11885
12417
  {
12418
+ const: node.const,
12419
+ ...node.const && node.default ? { value: node.const } : {},
11886
12420
  label: node.title,
11887
12421
  readOnly: node.readOnly,
11888
12422
  ...node.deprecated && {
@@ -11917,6 +12451,8 @@ function extractParametersFromNode(schemaNode) {
11917
12451
  },
11918
12452
  // Handle [name].presentation
11919
12453
  ...presentation,
12454
+ requiredValidations,
12455
+ computedAttributes: decoratedComputedAttributes,
11920
12456
  description: containsHTML(description) ? wrapWithSpan(description, {
11921
12457
  class: "jsf-description"
11922
12458
  }) : description,
@@ -11953,8 +12489,8 @@ function yupToFormErrors(yupError) {
11953
12489
  }
11954
12490
  return errors;
11955
12491
  }
11956
- var handleValuesChange = (fields, jsonSchema, config) => (values2) => {
11957
- updateFieldsProperties(fields, values2, jsonSchema);
12492
+ var handleValuesChange = (fields, jsonSchema, config, logic) => (values2) => {
12493
+ updateFieldsProperties(fields, values2, jsonSchema, logic);
11958
12494
  const lazySchema = lazy(() => buildCompleteYupSchema(fields, config));
11959
12495
  let errors;
11960
12496
  try {
@@ -11973,6 +12509,12 @@ var handleValuesChange = (fields, jsonSchema, config) => (values2) => {
11973
12509
  formErrors: yupToFormErrors(errors)
11974
12510
  };
11975
12511
  };
12512
+ function getDecoratedComputedAttributes(computedAttributes) {
12513
+ return {
12514
+ ...computedAttributes ?? {},
12515
+ ...computedAttributes?.const && computedAttributes?.default ? { value: computedAttributes.const } : {}
12516
+ };
12517
+ }
11976
12518
 
11977
12519
  // src/calculateConditionalProperties.js
11978
12520
  function isFieldRequired(node, field) {
@@ -12174,6 +12716,9 @@ function applyFieldsDependencies(fieldsParameters, node) {
12174
12716
  applyFieldsDependencies(fieldsParameters, condition);
12175
12717
  });
12176
12718
  }
12719
+ if (node?.["x-jsf-logic"]) {
12720
+ applyFieldsDependencies(fieldsParameters, node["x-jsf-logic"]);
12721
+ }
12177
12722
  }
12178
12723
  function getCustomPropertiesForField(fieldParams, config) {
12179
12724
  return config?.customProperties?.[fieldParams.name];
@@ -12185,15 +12730,16 @@ function getComposeFunctionForField(fieldParams, hasCustomizations) {
12185
12730
  }
12186
12731
  return composeFn;
12187
12732
  }
12188
- function buildField(fieldParams, config, scopedJsonSchema) {
12733
+ function buildField(fieldParams, config, scopedJsonSchema, logic) {
12189
12734
  const customProperties = getCustomPropertiesForField(fieldParams, config);
12190
12735
  const composeFn = getComposeFunctionForField(fieldParams, !!customProperties);
12191
- const yupSchema = buildYupSchema(fieldParams, config);
12736
+ const yupSchema = buildYupSchema(fieldParams, config, logic);
12192
12737
  const calculateConditionalFieldsClosure = fieldParams.isDynamic && calculateConditionalProperties(fieldParams, customProperties);
12193
12738
  const calculateCustomValidationPropertiesClosure = calculateCustomValidationProperties(
12194
12739
  fieldParams,
12195
12740
  customProperties
12196
12741
  );
12742
+ const getComputedAttributes = Object.keys(fieldParams.computedAttributes).length > 0 && calculateComputedAttributes(fieldParams, config);
12197
12743
  const hasCustomValidations = !!customProperties && (0, import_size.default)((0, import_pick2.default)(customProperties, SUPPORTED_CUSTOM_VALIDATION_FIELD_PARAMS)) > 0;
12198
12744
  const finalFieldParams = {
12199
12745
  // invalid attribute cleanup
@@ -12206,6 +12752,7 @@ function buildField(fieldParams, config, scopedJsonSchema) {
12206
12752
  ...hasCustomValidations && {
12207
12753
  calculateCustomValidationProperties: calculateCustomValidationPropertiesClosure
12208
12754
  },
12755
+ ...getComputedAttributes && { getComputedAttributes },
12209
12756
  // field customization properties
12210
12757
  ...customProperties && { fieldCustomization: customProperties },
12211
12758
  // base schema
@@ -12214,7 +12761,7 @@ function buildField(fieldParams, config, scopedJsonSchema) {
12214
12761
  };
12215
12762
  return composeFn(finalFieldParams);
12216
12763
  }
12217
- function getFieldsFromJSONSchema(scopedJsonSchema, config) {
12764
+ function getFieldsFromJSONSchema(scopedJsonSchema, config, logic) {
12218
12765
  if (!scopedJsonSchema) {
12219
12766
  return [];
12220
12767
  }
@@ -12238,11 +12785,11 @@ function getFieldsFromJSONSchema(scopedJsonSchema, config) {
12238
12785
  fields: () => groupArrayFields,
12239
12786
  addFieldText: fieldParams.addFieldText
12240
12787
  };
12241
- buildField(fieldParams, config, scopedJsonSchema).forEach((groupField) => {
12788
+ buildField(fieldParams, config, scopedJsonSchema, logic).forEach((groupField) => {
12242
12789
  fields.push(groupField);
12243
12790
  });
12244
12791
  } else {
12245
- fields.push(buildField(fieldParams, config, scopedJsonSchema));
12792
+ fields.push(buildField(fieldParams, config, scopedJsonSchema, logic));
12246
12793
  }
12247
12794
  });
12248
12795
  return fields;
@@ -12253,9 +12800,15 @@ function createHeadlessForm(jsonSchema, customConfig = {}) {
12253
12800
  ...customConfig
12254
12801
  };
12255
12802
  try {
12256
- const fields = getFieldsFromJSONSchema(jsonSchema, config);
12257
- const handleValidation = handleValuesChange(fields, jsonSchema, config);
12258
- updateFieldsProperties(fields, getPrefillValues(fields, config.initialValues), jsonSchema);
12803
+ const logic = createValidationChecker(jsonSchema);
12804
+ const fields = getFieldsFromJSONSchema(jsonSchema, config, logic);
12805
+ const handleValidation = handleValuesChange(fields, jsonSchema, config, logic);
12806
+ updateFieldsProperties(
12807
+ fields,
12808
+ getPrefillValues(fields, config.initialValues),
12809
+ jsonSchema,
12810
+ logic
12811
+ );
12259
12812
  return {
12260
12813
  fields,
12261
12814
  handleValidation,