@ng-forge/dynamic-forms 1.2.0-next.1 → 1.2.0-next.3

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 (18) hide show
  1. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-BVnXnaNw.mjs → ng-forge-dynamic-forms-array-field.component-B9OfjKPI.mjs} +2 -2
  2. package/fesm2022/{ng-forge-dynamic-forms-array-field.component-BVnXnaNw.mjs.map → ng-forge-dynamic-forms-array-field.component-B9OfjKPI.mjs.map} +1 -1
  3. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CkqvXXs_.mjs → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-VJBOH393.mjs} +2 -2
  4. package/fesm2022/{ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CkqvXXs_.mjs.map → ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-VJBOH393.mjs.map} +1 -1
  5. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-CM1pY9v5.mjs → ng-forge-dynamic-forms-container-field.component-o49q6akV.mjs} +2 -2
  6. package/fesm2022/{ng-forge-dynamic-forms-container-field.component-CM1pY9v5.mjs.map → ng-forge-dynamic-forms-container-field.component-o49q6akV.mjs.map} +1 -1
  7. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-D4JhDffB.mjs → ng-forge-dynamic-forms-group-field.component-DA-FW30T.mjs} +2 -2
  8. package/fesm2022/{ng-forge-dynamic-forms-group-field.component-D4JhDffB.mjs.map → ng-forge-dynamic-forms-group-field.component-DA-FW30T.mjs.map} +1 -1
  9. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  10. package/fesm2022/ng-forge-dynamic-forms-internal.mjs +23 -10
  11. package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
  12. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-ZiNaCWHl.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-CUihkwGC.mjs} +18 -17
  13. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CUihkwGC.mjs.map +1 -0
  14. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Wbz6S8iH.mjs → ng-forge-dynamic-forms-page-field.component-P9O4eNvS.mjs} +2 -2
  15. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Wbz6S8iH.mjs.map → ng-forge-dynamic-forms-page-field.component-P9O4eNvS.mjs.map} +1 -1
  16. package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
  17. package/package.json +2 -2
  18. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-ZiNaCWHl.mjs.map +0 -1
@@ -295,7 +295,11 @@ function hasTargetProperty(config) {
295
295
  }
296
296
 
297
297
  const FORM_VALUE_ACCESS_PATTERN = /\bformValue\s*(?:\.|\[)/;
298
- const FORM_VALUE_PATTERN = /\bformValue\s*(?:\.([\w.]+)|\[\s*'([\w.-]+)'\s*\]|\[\s*"([\w.-]+)"\s*\])/g;
298
+ const ID_START = String.raw `[\p{ID_Start}$_]`;
299
+ const ID_PART = String.raw `[\p{ID_Continue}$]`;
300
+ const DOTTED_PATH = String.raw `${ID_START}${ID_PART}*(?:\.${ID_START}${ID_PART}*)*`;
301
+ const BRACKET_KEY = String.raw `[\p{ID_Continue}$.\-]+`;
302
+ const FORM_VALUE_PATTERN = new RegExp(String.raw `\bformValue\s*(?:\.(${DOTTED_PATH})|\[\s*'(${BRACKET_KEY})'\s*\]|\[\s*"(${BRACKET_KEY})"\s*\])`, 'gu');
299
303
  function isCrossFieldExpression(expr, context) {
300
304
  if (expr === undefined || typeof expr === 'boolean' || isFormStateCondition(expr)) {
301
305
  return false;
@@ -576,6 +580,8 @@ class ExpressionParserError extends DynamicFormError {
576
580
  }
577
581
  }
578
582
 
583
+ const IDENTIFIER_START = /[\p{ID_Start}$_]/u;
584
+ const IDENTIFIER_PART = /[\p{ID_Continue}$]/u;
579
585
  class Tokenizer {
580
586
  position = 0;
581
587
  expression;
@@ -608,7 +614,7 @@ class Tokenizer {
608
614
  if (/[0-9]/.test(char)) {
609
615
  return this.readNumber();
610
616
  }
611
- if (/[a-zA-Z_$]/.test(char)) {
617
+ if (IDENTIFIER_START.test(this.codePointAt(this.position))) {
612
618
  return this.readIdentifierOrKeyword();
613
619
  }
614
620
  return this.readOperatorOrPunctuation();
@@ -667,12 +673,20 @@ class Tokenizer {
667
673
  readIdentifierOrKeyword() {
668
674
  const start = this.position;
669
675
  let value = '';
670
- while (this.position < this.expression.length && /[a-zA-Z0-9_$]/.test(this.expression[this.position])) {
671
- value += this.expression[this.position];
672
- this.position++;
676
+ while (this.position < this.expression.length) {
677
+ const char = this.codePointAt(this.position);
678
+ if (!IDENTIFIER_PART.test(char)) {
679
+ break;
680
+ }
681
+ value += char;
682
+ this.position += char.length;
673
683
  }
674
684
  const type = this.getKeywordType(value);
675
685
  return { type, value, position: start };
686
+ }
687
+ codePointAt(position) {
688
+ const codePoint = this.expression.codePointAt(position);
689
+ return codePoint === undefined ? '' : String.fromCodePoint(codePoint);
676
690
  }
677
691
  getKeywordType(value) {
678
692
  switch (value) {
@@ -3545,14 +3559,13 @@ function setupInitializationTracking(options) {
3545
3559
  }), shareReplay({ bufferSize: 1, refCount: false }));
3546
3560
  }
3547
3561
 
3562
+ const PLACEHOLDER_PATTERN = /\{\{([^{}]*)\}\}/g;
3548
3563
  function interpolateParams(message, error) {
3549
- let result = message;
3550
3564
  const params = extractErrorParams(error);
3551
- Object.entries(params).forEach(([key, value]) => {
3552
- const placeholder = new RegExp(`{{\\s*${key}\\s*}}`, 'g');
3553
- result = result.replace(placeholder, safeToString(value));
3565
+ return message.replace(PLACEHOLDER_PATTERN, (placeholder, rawKey) => {
3566
+ const key = rawKey.trim();
3567
+ return Object.hasOwn(params, key) ? safeToString(params[key]) : placeholder;
3554
3568
  });
3555
- return result;
3556
3569
  }
3557
3570
  function safeToString(value) {
3558
3571
  if (value === null || value === undefined) {