@ng-forge/dynamic-forms 1.3.0-next.3 → 1.3.0-next.4

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 (21) hide show
  1. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-bnrwNw7Y.mjs +156 -0
  2. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-bnrwNw7Y.mjs.map +1 -0
  3. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-B6WH0Etk.mjs} +2 -2
  4. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs.map → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-B6WH0Etk.mjs.map} +1 -1
  5. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs → ng-forge-dynamic-forms-bootstrap-web-mcp-VjJn-JeD.mjs} +2 -2
  6. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs.map → ng-forge-dynamic-forms-bootstrap-web-mcp-VjJn-JeD.mjs.map} +1 -1
  7. package/fesm2022/{ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs → ng-forge-dynamic-forms-form-state-manager-BJKBX4FL.mjs} +26 -3
  8. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-BJKBX4FL.mjs.map +1 -0
  9. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +109 -14
  10. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  11. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs → ng-forge-dynamic-forms-page-field.component-Bsd8YpzL.mjs} +37 -5
  12. package/fesm2022/ng-forge-dynamic-forms-page-field.component-Bsd8YpzL.mjs.map +1 -0
  13. package/fesm2022/ng-forge-dynamic-forms.mjs +85 -26
  14. package/fesm2022/ng-forge-dynamic-forms.mjs.map +1 -1
  15. package/package.json +1 -1
  16. package/types/ng-forge-dynamic-forms-internal.d.ts +9 -0
  17. package/types/ng-forge-dynamic-forms.d.ts +63 -2
  18. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs +0 -12
  19. package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs.map +0 -1
  20. package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs.map +0 -1
  21. package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs.map +0 -1
@@ -490,18 +490,19 @@ var AsyncConditionFunctionCacheService = class {
490
490
  asyncConditionFunctionCache = /* @__PURE__ */ new Map();
491
491
  };
492
492
  function compareValues(actual, expected, operator) {
493
+ const empty = actual === null || actual === void 0 || actual === "";
493
494
  switch (operator) {
494
495
  case "equals": return actual === expected;
495
496
  case "notEquals": return actual !== expected;
496
- case "greater": return Number(actual) > Number(expected);
497
- case "less": return Number(actual) < Number(expected);
498
- case "greaterOrEqual": return Number(actual) >= Number(expected);
499
- case "lessOrEqual": return Number(actual) <= Number(expected);
500
- case "contains": return String(actual).includes(String(expected));
501
- case "startsWith": return String(actual).startsWith(String(expected));
502
- case "endsWith": return String(actual).endsWith(String(expected));
497
+ case "greater": return !empty && Number(actual) > Number(expected);
498
+ case "less": return !empty && Number(actual) < Number(expected);
499
+ case "greaterOrEqual": return !empty && Number(actual) >= Number(expected);
500
+ case "lessOrEqual": return !empty && Number(actual) <= Number(expected);
501
+ case "contains": return !empty && String(actual).includes(String(expected));
502
+ case "startsWith": return !empty && String(actual).startsWith(String(expected));
503
+ case "endsWith": return !empty && String(actual).endsWith(String(expected));
503
504
  case "matches": try {
504
- return toRegExp(String(expected)).test(String(actual));
505
+ return toRegExp(String(expected)).test(empty ? "" : String(actual));
505
506
  } catch {
506
507
  return false;
507
508
  }
@@ -549,6 +550,7 @@ var TokenType;
549
550
  TokenType["LESS_EQUAL"] = "LESS_EQUAL";
550
551
  TokenType["AND"] = "AND";
551
552
  TokenType["OR"] = "OR";
553
+ TokenType["NULLISH"] = "NULLISH";
552
554
  TokenType["NOT"] = "NOT";
553
555
  TokenType["DOT"] = "DOT";
554
556
  TokenType["COMMA"] = "COMMA";
@@ -764,6 +766,13 @@ var Tokenizer = class {
764
766
  value: "=>",
765
767
  position: start
766
768
  };
769
+ case "??":
770
+ this.position += 2;
771
+ return {
772
+ type: TokenType.NULLISH,
773
+ value: "??",
774
+ position: start
775
+ };
767
776
  case "?.":
768
777
  this.position += 2;
769
778
  return {
@@ -893,7 +902,7 @@ var Parser = class {
893
902
  return this.parseConditional();
894
903
  }
895
904
  parseConditional() {
896
- const test = this.parseLogicalOr();
905
+ const test = this.parseShortCircuit();
897
906
  if (!this.match(TokenType.QUESTION)) return test;
898
907
  const consequent = this.parseExpression();
899
908
  this.consume(TokenType.COLON, "Expected \":\" between ternary branches");
@@ -956,8 +965,28 @@ var Parser = class {
956
965
  if (index < 0 || index >= this.tokens.length) return false;
957
966
  return this.tokens[index].type === type;
958
967
  }
959
- parseLogicalOr() {
960
- let node = this.parseLogicalAnd();
968
+ parseShortCircuit() {
969
+ const first = this.parseEquality();
970
+ if (!this.check(TokenType.NULLISH)) {
971
+ const node = this.parseLogicalOr(first);
972
+ if (this.check(TokenType.NULLISH)) this.throwMixedNullish();
973
+ return node;
974
+ }
975
+ let node = first;
976
+ while (this.match(TokenType.NULLISH)) node = {
977
+ type: "BinaryOp",
978
+ operator: "??",
979
+ left: node,
980
+ right: this.parseEquality()
981
+ };
982
+ if (this.check(TokenType.AND) || this.check(TokenType.OR)) this.throwMixedNullish();
983
+ return node;
984
+ }
985
+ throwMixedNullish() {
986
+ throw new ExpressionParserError("Cannot mix \"??\" with \"&&\" or \"||\" without parentheses", this.peek().position, this.expression);
987
+ }
988
+ parseLogicalOr(first) {
989
+ let node = this.parseLogicalAnd(first);
961
990
  while (this.match(TokenType.OR)) {
962
991
  const operator = this.previous().value;
963
992
  const right = this.parseLogicalAnd();
@@ -970,8 +999,8 @@ var Parser = class {
970
999
  }
971
1000
  return node;
972
1001
  }
973
- parseLogicalAnd() {
974
- let node = this.parseEquality();
1002
+ parseLogicalAnd(first) {
1003
+ let node = first ?? this.parseEquality();
975
1004
  while (this.match(TokenType.AND)) {
976
1005
  const operator = this.previous().value;
977
1006
  const right = this.parseEquality();
@@ -1298,6 +1327,7 @@ const SAFE_METHODS = {
1298
1327
  "toUTCString"
1299
1328
  ])
1300
1329
  };
1330
+ const ALLOWED_METHOD_NAMES = new Set(Object.values(SAFE_METHODS).flatMap((methods) => [...methods]));
1301
1331
  const BLOCKED_PROPERTIES = /* @__PURE__ */ new Set([
1302
1332
  "constructor",
1303
1333
  "__proto__",
@@ -1357,6 +1387,7 @@ var Evaluator = class Evaluator {
1357
1387
  const left = this.evaluate(node.left);
1358
1388
  return left ? left : this.evaluate(node.right);
1359
1389
  }
1390
+ if (node.operator === "??") return this.evaluate(node.left) ?? this.evaluate(node.right);
1360
1391
  const left = this.evaluate(node.left);
1361
1392
  const right = this.evaluate(node.right);
1362
1393
  switch (node.operator) {
@@ -2412,6 +2443,70 @@ function createDebouncedLogicFunction(expression, debounceMs) {
2412
2443
  if (cacheable) cacheService.debouncedLogicFunctionCache.set(cacheKey, fn);
2413
2444
  return fn;
2414
2445
  }
2446
+ const CONDITION_SCOPE_VARIABLES = /* @__PURE__ */ new Set([
2447
+ "fieldValue",
2448
+ "formValue",
2449
+ "fieldPath",
2450
+ "customFunctions",
2451
+ "groupValue",
2452
+ "rootFormValue",
2453
+ "arrayIndex",
2454
+ "arrayPath",
2455
+ "externalData",
2456
+ "fieldState",
2457
+ "formFieldState"
2458
+ ]);
2459
+ function findStaticExpressionProblems(ast, scope) {
2460
+ const problems = /* @__PURE__ */ new Set();
2461
+ const visit = (node, locals) => {
2462
+ switch (node.type) {
2463
+ case "Identifier":
2464
+ if (!scope.has(node.name) && !locals.has(node.name)) problems.add(`'${node.name}' is not available in expressions`);
2465
+ return;
2466
+ case "MemberAccess":
2467
+ visit(node.object, locals);
2468
+ return;
2469
+ case "ComputedMemberAccess":
2470
+ visit(node.object, locals);
2471
+ visit(node.property, locals);
2472
+ return;
2473
+ case "CallExpression":
2474
+ if (node.callee.type === "MemberAccess") {
2475
+ if (!ALLOWED_METHOD_NAMES.has(node.callee.property)) problems.add(`method '${node.callee.property}' is not allowed`);
2476
+ } else problems.add(`'${describeCallee(node.callee)}(...)' is a direct function call; only allowed methods can be called`);
2477
+ visit(node.callee.type === "MemberAccess" ? node.callee.object : node.callee, locals);
2478
+ node.arguments.forEach((arg) => visit(arg, locals));
2479
+ return;
2480
+ case "BinaryOp":
2481
+ visit(node.left, locals);
2482
+ visit(node.right, locals);
2483
+ return;
2484
+ case "UnaryOp":
2485
+ visit(node.operand, locals);
2486
+ return;
2487
+ case "Conditional":
2488
+ visit(node.test, locals);
2489
+ visit(node.consequent, locals);
2490
+ visit(node.alternate, locals);
2491
+ return;
2492
+ case "ArrayLiteral":
2493
+ node.elements.forEach((element) => visit(element, locals));
2494
+ return;
2495
+ case "ObjectLiteral":
2496
+ node.properties.forEach((property) => visit(property.value, locals));
2497
+ return;
2498
+ case "ArrowFunction":
2499
+ visit(node.body, /* @__PURE__ */ new Set([...locals, ...node.params]));
2500
+ return;
2501
+ case "Literal": return;
2502
+ }
2503
+ };
2504
+ visit(ast, /* @__PURE__ */ new Set());
2505
+ return [...problems];
2506
+ }
2507
+ function describeCallee(node) {
2508
+ return node.type === "Identifier" ? node.name : "expression";
2509
+ }
2415
2510
  function getArrayLength(arrayFieldTree) {
2416
2511
  const value = arrayFieldTree().value();
2417
2512
  return Array.isArray(value) ? value.length : 0;
@@ -3667,6 +3762,6 @@ function provideFieldErrorDisplay(wrapper) {
3667
3762
  useExisting: forwardRef(wrapper)
3668
3763
  };
3669
3764
  }
3670
- export { ADDON_ACTION_HANDLERS, ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AsyncConditionFunctionCacheService, ComponentInitializedEvent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DEPRECATION_WARNING_TRACKER, DF_FIELD_TEMPLATES, DfAddonSlot, DynamicFormError, DynamicFormLogger, DynamicTextPipe, DynamicValueFunctionCacheService, EMIT_FORM_VALUE_ON_EVENTS, EXTERNAL_DATA, EventBus, ExpressionParser, ExpressionParserError, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_ID_PREFIX, FORM_OPTIONS, FieldContextRegistryService, FieldErrorsWrapperBase, FunctionRegistryService, GROUP_CONTEXT, HTTP_CONDITION_CACHE, HttpConditionCache, HttpConditionFunctionCacheService, INITIALIZATION_TIMEOUT_MS, LogicFunctionCacheService, NoopLogger, READONLY_FIELD_TREE_CACHE, RootFormRegistryService, TokenType, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_COMPONENT_CACHE, WRAPPER_COMPONENT_LOAD_CACHE, WRAPPER_REGISTRY, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, assertNever, baseFieldMapper, buildBaseInputs, buildClassName, compareValues, containerFieldMapper, createAddonActionRegistry, createDebouncedLogicFunction, createDefaultDerivationLogConfig, createDynamicValueFunction, createFieldValueProxy, createFormFieldStateMap, createFormStateLogicFunction, createInitializationTracker, createLogicFunction, createResolvedErrorsSignal, createWarningTracker, deepMergeDefaults, derivedFromDeferred, detectFormMode, dynamicTextToObservable, evaluateCondition, evaluateNonFieldDisabled, evaluateNonFieldHidden, extractExpressionDependencies, extractStringDependencies, getArrayLength, getChangedKeys, getChangedKeysWithin, getFieldValueHandling, getGridClassString, getNestedValue, groupFieldMapper, hasChildFields, hasCrossFieldWhenCondition, hasFormValue, hasNestedProperty, hasTargetProperty, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, injectNonFieldEvaluationContext, interpolateParams, isArrayField, isCheckedField, isContainerField, isCrossFieldBuiltInValidator, isCrossFieldExpression, isCrossFieldSchema, isCrossFieldStateLogic, isCrossFieldValidator, isDerivationLogicConfig, isDisplayOnlyField, isEqual, isFieldBoundContext, isFormStateCondition, isFunctionHttpValidator, isGenericContainerField, isGroupField, isHiddenField, isLeafField, isNonPagedForm, isPageField, isPagedForm, isResourceBasedValidator, isRowField, isSimplifiedArrayField, isStateLogicConfig, isValidNonPagedForm, isValidPagedForm, isValueBearingField, isValueField, isWrapperTypeDefinition, keyBy, mapValues, memoize, normalizeFieldsArray, omit, pageFieldMapper, provideFieldErrorDisplay, readFieldStateInfo, resolveDynamicValue, resolveHttpRequest, resolveNextButtonDisabled, resolveNonFieldDisabled, resolveNonFieldHidden, resolveSubmitButtonDisabled, resolveTokens, rowError, rowFieldMapper, runPresetAction, setupInitializationTracking, shouldLog, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, toReadonlyFieldTreeCached, validatePageNesting, withPreviousValue, writeToFieldValue };
3765
+ export { ADDON_ACTION_HANDLERS, ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AsyncConditionFunctionCacheService, CONDITION_SCOPE_VARIABLES, ComponentInitializedEvent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DEPRECATION_WARNING_TRACKER, DF_FIELD_TEMPLATES, DfAddonSlot, DynamicFormError, DynamicFormLogger, DynamicTextPipe, DynamicValueFunctionCacheService, EMIT_FORM_VALUE_ON_EVENTS, EXTERNAL_DATA, EventBus, ExpressionParser, ExpressionParserError, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_ID_PREFIX, FORM_OPTIONS, FieldContextRegistryService, FieldErrorsWrapperBase, FunctionRegistryService, GROUP_CONTEXT, HTTP_CONDITION_CACHE, HttpConditionCache, HttpConditionFunctionCacheService, INITIALIZATION_TIMEOUT_MS, LogicFunctionCacheService, NoopLogger, READONLY_FIELD_TREE_CACHE, RootFormRegistryService, TokenType, WRAPPER_AUTO_ASSOCIATIONS, WRAPPER_COMPONENT_CACHE, WRAPPER_COMPONENT_LOAD_CACHE, WRAPPER_REGISTRY, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, assertNever, baseFieldMapper, buildBaseInputs, buildClassName, compareValues, containerFieldMapper, createAddonActionRegistry, createDebouncedLogicFunction, createDefaultDerivationLogConfig, createDynamicValueFunction, createFieldValueProxy, createFormFieldStateMap, createFormStateLogicFunction, createInitializationTracker, createLogicFunction, createResolvedErrorsSignal, createWarningTracker, deepMergeDefaults, derivedFromDeferred, detectFormMode, dynamicTextToObservable, evaluateCondition, evaluateNonFieldDisabled, evaluateNonFieldHidden, extractExpressionDependencies, extractStringDependencies, findStaticExpressionProblems, getArrayLength, getChangedKeys, getChangedKeysWithin, getFieldValueHandling, getGridClassString, getNestedValue, groupFieldMapper, hasChildFields, hasCrossFieldWhenCondition, hasFormValue, hasNestedProperty, hasTargetProperty, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, injectNonFieldEvaluationContext, interpolateParams, isArrayField, isCheckedField, isContainerField, isCrossFieldBuiltInValidator, isCrossFieldExpression, isCrossFieldSchema, isCrossFieldStateLogic, isCrossFieldValidator, isDerivationLogicConfig, isDisplayOnlyField, isEqual, isFieldBoundContext, isFormStateCondition, isFunctionHttpValidator, isGenericContainerField, isGroupField, isHiddenField, isLeafField, isNonPagedForm, isPageField, isPagedForm, isResourceBasedValidator, isRowField, isSimplifiedArrayField, isStateLogicConfig, isValidNonPagedForm, isValidPagedForm, isValueBearingField, isValueField, isWrapperTypeDefinition, keyBy, mapValues, memoize, normalizeFieldsArray, omit, pageFieldMapper, provideFieldErrorDisplay, readFieldStateInfo, resolveDynamicValue, resolveHttpRequest, resolveNextButtonDisabled, resolveNonFieldDisabled, resolveNonFieldHidden, resolveSubmitButtonDisabled, resolveTokens, rowError, rowFieldMapper, runPresetAction, setupInitializationTracking, shouldLog, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, toReadonlyFieldTreeCached, validatePageNesting, withPreviousValue, writeToFieldValue };
3671
3766
 
3672
3767
  //# sourceMappingURL=ng-forge-dynamic-forms-internal.mjs.map