ngx-mask 22.0.1 → 22.0.2

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.
@@ -550,7 +550,7 @@ const percentHandler = function (state, params) {
550
550
  }
551
551
  processedValue = `${base}${processedValue.substring(processedValue.indexOf(decimalMarker), processedValue.length)}`;
552
552
  }
553
- let value = '';
553
+ let value;
554
554
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
555
555
  this.allowNegativeNumbers && processedValue.slice(cursor, cursor + 1) === MaskExpression.MINUS
556
556
  ? (value = `${MaskExpression.MINUS}${processedValue.slice(cursor + 1, cursor + processedValue.length)}`)
@@ -580,7 +580,8 @@ const percentHandler = function (state, params) {
580
580
  */
581
581
  const separatorHandler = function (state, params) {
582
582
  const { backspaced, justPasted, startsWithPrefix, prefixAlreadyRemovedByCaller, cb, inputValue, } = params;
583
- let { processedValue, processedPosition, result, backspaceShift, shift, stepBack } = state;
583
+ let { processedValue, processedPosition, backspaceShift, shift, stepBack } = state;
584
+ let result;
584
585
  if (processedValue.match('[wа-яА-Я]') ||
585
586
  processedValue.match('[ЁёА-я]') ||
586
587
  processedValue.match('[a-z]|[A-Z]') ||
@@ -942,7 +943,7 @@ class NgxMaskApplierService {
942
943
  }
943
944
  let cursor = 0;
944
945
  let result = '';
945
- let multi = false;
946
+ const multi = false;
946
947
  let backspaceShift = false;
947
948
  let shift = 1;
948
949
  let stepBack = false;
@@ -1011,7 +1012,6 @@ class NgxMaskApplierService {
1011
1012
  processedPosition = resolved.processedPosition;
1012
1013
  cursor = resolved.cursor;
1013
1014
  result = resolved.result;
1014
- multi = resolved.multi;
1015
1015
  backspaceShift = resolved.backspaceShift;
1016
1016
  shift = resolved.shift;
1017
1017
  stepBack = resolved.stepBack;
@@ -1091,8 +1091,8 @@ class NgxMaskApplierService {
1091
1091
  false);
1092
1092
  }
1093
1093
  _formatWithSeparators = (str, thousandSeparatorChar, decimalChars, precision) => {
1094
- let x = [];
1095
- let decimalChar = '';
1094
+ let x;
1095
+ let decimalChar;
1096
1096
  if (Array.isArray(decimalChars)) {
1097
1097
  const regExp = new RegExp(decimalChars.map((v) => ('[\\^$.|?*+()'.indexOf(v) >= 0 ? `\\${v}` : v)).join('|'));
1098
1098
  x = str.split(regExp);
@@ -1302,10 +1302,10 @@ class NgxMaskApplierService {
1302
1302
  nonZeroIndex,
1303
1303
  };
1304
1304
  }
1305
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskApplierService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1306
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskApplierService });
1305
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskApplierService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1306
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskApplierService });
1307
1307
  }
1308
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskApplierService, decorators: [{
1308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskApplierService, decorators: [{
1309
1309
  type: Injectable
1310
1310
  }] });
1311
1311
 
@@ -1488,10 +1488,6 @@ class NgxMaskService extends NgxMaskApplierService {
1488
1488
  actualResult = [];
1489
1489
  }
1490
1490
  }
1491
- // Remove mask if showMaskTyped is true and hiddenInput is false
1492
- if (this.showMaskTyped && !this.hiddenInput) {
1493
- newInputValue = this.removeMask(inputValue);
1494
- }
1495
1491
  // Handle actual value length
1496
1492
  if (this.actualValue.length) {
1497
1493
  if (actualResult.length < inputValue.length) {
@@ -2190,10 +2186,10 @@ class NgxMaskService extends NgxMaskApplierService {
2190
2186
  currentLocaleDecimalMarker() {
2191
2187
  return MaskExpression.DOT;
2192
2188
  }
2193
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
2194
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskService });
2189
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
2190
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskService });
2195
2191
  }
2196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskService, decorators: [{
2192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskService, decorators: [{
2197
2193
  type: Injectable
2198
2194
  }] });
2199
2195
 
@@ -2574,7 +2570,7 @@ class NgxMaskDirective {
2574
2570
  this._hasPendingInitialValue = false;
2575
2571
  const pendingValue = this._pendingInitialValue;
2576
2572
  this._pendingInitialValue = null;
2577
- void this.writeValue(pendingValue);
2573
+ this.writeValue(pendingValue);
2578
2574
  }
2579
2575
  }
2580
2576
  }
@@ -3144,7 +3140,11 @@ class NgxMaskDirective {
3144
3140
  MaskExpression.NUMBER_ZERO.repeat(precision) +
3145
3141
  suffix;
3146
3142
  this._maskService.actualValue = el.value;
3147
- this.onChange(this._maskService.actualValue);
3143
+ // #1634: propagate through the regular formControlResult pipeline (not a
3144
+ // raw onChange) so outputTransformFn runs on this blur-time reformat, same
3145
+ // as every typing-time emission. A raw onChange here sent the masked display
3146
+ // string straight to the model, bypassing outputTransformFn entirely.
3147
+ this._maskService.formControlResult(this._maskService.actualValue);
3148
3148
  }
3149
3149
  }
3150
3150
  this._maskService.clearIfNotMatchFn();
@@ -3356,7 +3356,7 @@ class NgxMaskDirective {
3356
3356
  }
3357
3357
  }
3358
3358
  /** It writes the value in the input */
3359
- async writeValue(controlValue) {
3359
+ writeValue(controlValue) {
3360
3360
  if (!this._configApplied && this.mask()) {
3361
3361
  // Called before the first ngOnChanges pass configured the mask service (happens with
3362
3362
  // Signal Forms' [formField], whose control-sync instruction runs before sibling
@@ -3570,8 +3570,23 @@ class NgxMaskDirective {
3570
3570
  el.selectionStart = Math.min(Math.max(prefixLength, el.selectionStart), inputValueLength - suffixLength);
3571
3571
  el.selectionEnd = Math.min(Math.max(prefixLength, el.selectionEnd), inputValueLength - suffixLength);
3572
3572
  }
3573
- /** It disables the input element */
3573
+ /**
3574
+ * It disables the input element.
3575
+ *
3576
+ * Mirrors `_writeElementValueSync` (#1305): the service's `formElementProperty` setter
3577
+ * defers ALL DOM writes via `queueMicrotask` to dodge ExpressionChangedAfterItHasBeenChecked
3578
+ * and keep FIFO ordering with config-driven re-renders. For `disabled` specifically, that
3579
+ * deferral leaves `nativeElement.disabled` stale for at least one microtask after Angular
3580
+ * Forms' `setUpControl` calls this method synchronously during init — long enough for a
3581
+ * consumer reading the DOM property in the same synchronous phase (or another deferred write
3582
+ * racing in FIFO order) to observe the wrong value, e.g. an initially-disabled FormControl
3583
+ * whose native input briefly (or, depending on interleaving, persistently) reports
3584
+ * `disabled === false` (#1633). Writing synchronously here closes that gap; the deferred
3585
+ * write below still runs afterwards and re-applies the same final value, preserving the
3586
+ * existing ordering guarantees other call sites rely on.
3587
+ */
3574
3588
  setDisabledState(isDisabled) {
3589
+ this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);
3575
3590
  this._maskService.formElementProperty = ['disabled', isDisabled];
3576
3591
  }
3577
3592
  _applyMask() {
@@ -3784,8 +3799,8 @@ class NgxMaskDirective {
3784
3799
  return uniqueCharacters.size === 1;
3785
3800
  });
3786
3801
  }
3787
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3788
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.5", type: NgxMaskDirective, isStandalone: true, selector: "input[mask], textarea[mask]", inputs: { mask: { classPropertyName: "mask", publicName: "mask", isSignal: true, isRequired: false, transformFunction: null }, specialCharacters: { classPropertyName: "specialCharacters", publicName: "specialCharacters", isSignal: true, isRequired: false, transformFunction: null }, patterns: { classPropertyName: "patterns", publicName: "patterns", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, decimalMarker: { classPropertyName: "decimalMarker", publicName: "decimalMarker", isSignal: true, isRequired: false, transformFunction: null }, dropSpecialCharacters: { classPropertyName: "dropSpecialCharacters", publicName: "dropSpecialCharacters", isSignal: true, isRequired: false, transformFunction: null }, hiddenInput: { classPropertyName: "hiddenInput", publicName: "hiddenInput", isSignal: true, isRequired: false, transformFunction: null }, showMaskTyped: { classPropertyName: "showMaskTyped", publicName: "showMaskTyped", isSignal: true, isRequired: false, transformFunction: null }, placeHolderCharacter: { classPropertyName: "placeHolderCharacter", publicName: "placeHolderCharacter", isSignal: true, isRequired: false, transformFunction: null }, shownMaskExpression: { classPropertyName: "shownMaskExpression", publicName: "shownMaskExpression", isSignal: true, isRequired: false, transformFunction: null }, clearIfNotMatch: { classPropertyName: "clearIfNotMatch", publicName: "clearIfNotMatch", isSignal: true, isRequired: false, transformFunction: null }, validation: { classPropertyName: "validation", publicName: "validation", isSignal: true, isRequired: false, transformFunction: null }, separatorLimit: { classPropertyName: "separatorLimit", publicName: "separatorLimit", isSignal: true, isRequired: false, transformFunction: null }, typeFromDecimals: { classPropertyName: "typeFromDecimals", publicName: "typeFromDecimals", isSignal: true, isRequired: false, transformFunction: null }, allowNegativeNumbers: { classPropertyName: "allowNegativeNumbers", publicName: "allowNegativeNumbers", isSignal: true, isRequired: false, transformFunction: null }, leadZeroDateTime: { classPropertyName: "leadZeroDateTime", publicName: "leadZeroDateTime", isSignal: true, isRequired: false, transformFunction: null }, leadZero: { classPropertyName: "leadZero", publicName: "leadZero", isSignal: true, isRequired: false, transformFunction: null }, triggerOnMaskChange: { classPropertyName: "triggerOnMaskChange", publicName: "triggerOnMaskChange", isSignal: true, isRequired: false, transformFunction: null }, apm: { classPropertyName: "apm", publicName: "apm", isSignal: true, isRequired: false, transformFunction: null }, inputTransformFn: { classPropertyName: "inputTransformFn", publicName: "inputTransformFn", isSignal: true, isRequired: false, transformFunction: null }, outputTransformFn: { classPropertyName: "outputTransformFn", publicName: "outputTransformFn", isSignal: true, isRequired: false, transformFunction: null }, keepCharacterPositions: { classPropertyName: "keepCharacterPositions", publicName: "keepCharacterPositions", isSignal: true, isRequired: false, transformFunction: null }, instantPrefix: { classPropertyName: "instantPrefix", publicName: "instantPrefix", isSignal: true, isRequired: false, transformFunction: null }, defaultValueOnBlur: { classPropertyName: "defaultValueOnBlur", publicName: "defaultValueOnBlur", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", maskFilled: "maskFilled" }, host: { listeners: { "paste": "onPaste()", "focus": "onFocus()", "ngModelChange": "onModelChange($event)", "input": "onInput($event)", "compositionstart": "onCompositionStart()", "compositionend": "onCompositionEnd($event)", "blur": "onBlur($event)", "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, providers: [
3802
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
3803
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: NgxMaskDirective, isStandalone: true, selector: "input[mask], textarea[mask]", inputs: { mask: { classPropertyName: "mask", publicName: "mask", isSignal: true, isRequired: false, transformFunction: null }, specialCharacters: { classPropertyName: "specialCharacters", publicName: "specialCharacters", isSignal: true, isRequired: false, transformFunction: null }, patterns: { classPropertyName: "patterns", publicName: "patterns", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, decimalMarker: { classPropertyName: "decimalMarker", publicName: "decimalMarker", isSignal: true, isRequired: false, transformFunction: null }, dropSpecialCharacters: { classPropertyName: "dropSpecialCharacters", publicName: "dropSpecialCharacters", isSignal: true, isRequired: false, transformFunction: null }, hiddenInput: { classPropertyName: "hiddenInput", publicName: "hiddenInput", isSignal: true, isRequired: false, transformFunction: null }, showMaskTyped: { classPropertyName: "showMaskTyped", publicName: "showMaskTyped", isSignal: true, isRequired: false, transformFunction: null }, placeHolderCharacter: { classPropertyName: "placeHolderCharacter", publicName: "placeHolderCharacter", isSignal: true, isRequired: false, transformFunction: null }, shownMaskExpression: { classPropertyName: "shownMaskExpression", publicName: "shownMaskExpression", isSignal: true, isRequired: false, transformFunction: null }, clearIfNotMatch: { classPropertyName: "clearIfNotMatch", publicName: "clearIfNotMatch", isSignal: true, isRequired: false, transformFunction: null }, validation: { classPropertyName: "validation", publicName: "validation", isSignal: true, isRequired: false, transformFunction: null }, separatorLimit: { classPropertyName: "separatorLimit", publicName: "separatorLimit", isSignal: true, isRequired: false, transformFunction: null }, typeFromDecimals: { classPropertyName: "typeFromDecimals", publicName: "typeFromDecimals", isSignal: true, isRequired: false, transformFunction: null }, allowNegativeNumbers: { classPropertyName: "allowNegativeNumbers", publicName: "allowNegativeNumbers", isSignal: true, isRequired: false, transformFunction: null }, leadZeroDateTime: { classPropertyName: "leadZeroDateTime", publicName: "leadZeroDateTime", isSignal: true, isRequired: false, transformFunction: null }, leadZero: { classPropertyName: "leadZero", publicName: "leadZero", isSignal: true, isRequired: false, transformFunction: null }, triggerOnMaskChange: { classPropertyName: "triggerOnMaskChange", publicName: "triggerOnMaskChange", isSignal: true, isRequired: false, transformFunction: null }, apm: { classPropertyName: "apm", publicName: "apm", isSignal: true, isRequired: false, transformFunction: null }, inputTransformFn: { classPropertyName: "inputTransformFn", publicName: "inputTransformFn", isSignal: true, isRequired: false, transformFunction: null }, outputTransformFn: { classPropertyName: "outputTransformFn", publicName: "outputTransformFn", isSignal: true, isRequired: false, transformFunction: null }, keepCharacterPositions: { classPropertyName: "keepCharacterPositions", publicName: "keepCharacterPositions", isSignal: true, isRequired: false, transformFunction: null }, instantPrefix: { classPropertyName: "instantPrefix", publicName: "instantPrefix", isSignal: true, isRequired: false, transformFunction: null }, defaultValueOnBlur: { classPropertyName: "defaultValueOnBlur", publicName: "defaultValueOnBlur", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", maskFilled: "maskFilled" }, host: { listeners: { "paste": "onPaste()", "focus": "onFocus()", "ngModelChange": "onModelChange($event)", "input": "onInput($event)", "compositionstart": "onCompositionStart()", "compositionend": "onCompositionEnd($event)", "blur": "onBlur($event)", "click": "onClick($event)", "keydown": "onKeyDown($event)" } }, providers: [
3789
3804
  {
3790
3805
  provide: NG_VALUE_ACCESSOR,
3791
3806
  useExisting: NgxMaskDirective,
@@ -3799,7 +3814,7 @@ class NgxMaskDirective {
3799
3814
  NgxMaskService,
3800
3815
  ], exportAs: ["mask", "ngxMask"], usesOnChanges: true, ngImport: i0 });
3801
3816
  }
3802
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskDirective, decorators: [{
3817
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskDirective, decorators: [{
3803
3818
  type: Directive,
3804
3819
  args: [{
3805
3820
  selector: 'input[mask], textarea[mask]',
@@ -3937,10 +3952,10 @@ class NgxMaskPipe {
3937
3952
  });
3938
3953
  }
3939
3954
  }
3940
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3941
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskPipe, isStandalone: true, name: "mask" });
3955
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
3956
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskPipe, isStandalone: true, name: "mask" });
3942
3957
  }
3943
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NgxMaskPipe, decorators: [{
3958
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: NgxMaskPipe, decorators: [{
3944
3959
  type: Pipe,
3945
3960
  args: [{
3946
3961
  name: 'mask',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-mask",
3
- "version": "22.0.1",
3
+ "version": "22.0.2",
4
4
  "description": "Input masking for modern Angular — Reactive, template-driven and Signal Forms, zoneless and SSR ready. Dates, numbers, separators, custom patterns.",
5
5
  "keywords": [
6
6
  "ng2-mask",
@@ -120,7 +120,7 @@ declare class NgxMaskApplierService {
120
120
  writingValue: boolean;
121
121
  ipError?: boolean;
122
122
  cpfCnpjError?: boolean;
123
- applyMask(inputValue: string | object | boolean | null | undefined, maskExpression: string, position?: number, justPasted?: boolean, backspaced?: boolean, cb?: (...args: any[]) => any): string;
123
+ applyMask(inputValue: string | object | boolean | null | undefined, maskExpression: string, position?: number, justPasted?: boolean, backspaced?: boolean, cb?: (actualShift: number, backspaceShift: boolean) => void): string;
124
124
  _findDropSpecialChar(inputSymbol: string): undefined | string;
125
125
  _findSpecialChar(inputSymbol: string): undefined | string;
126
126
  _checkSymbolMask(inputSymbol: string, maskSymbol: string): boolean;
@@ -177,7 +177,7 @@ declare class NgxMaskService extends NgxMaskApplierService {
177
177
  private _emitValue;
178
178
  private _start;
179
179
  private _end;
180
- onChange: (_: any) => void;
180
+ onChange: (_: unknown) => void;
181
181
  readonly _elementRef: ElementRef<any> | null;
182
182
  private readonly document;
183
183
  protected _config: NgxMaskConfig;
@@ -192,9 +192,9 @@ declare class NgxMaskService extends NgxMaskApplierService {
192
192
  * @param cb Callback function.
193
193
  * @returns The masked value.
194
194
  */
195
- applyMask(inputValue: string, maskExpression: string, position?: number, justPasted?: boolean, backspaced?: boolean, cb?: (...args: any[]) => any): string;
195
+ applyMask(inputValue: string, maskExpression: string, position?: number, justPasted?: boolean, backspaced?: boolean, cb?: (actualShift: number, backspaceShift: boolean) => void): string;
196
196
  private _numberSkipedSymbols;
197
- applyValueChanges(position: number, justPasted: boolean, backspaced: boolean, cb?: (...args: any[]) => any): void;
197
+ applyValueChanges(position: number, justPasted: boolean, backspaced: boolean, cb?: (actualShift: number, backspaceShift: boolean) => void): void;
198
198
  hideInput(inputValue: string, maskExpression: string): string;
199
199
  getActualValue(res: string): string;
200
200
  shiftTypedSymbols(inputValue: string): string;
@@ -231,7 +231,7 @@ declare class NgxMaskService extends NgxMaskApplierService {
231
231
  * model value too. Therefore, we don't trigger onChange in this scenario.
232
232
  * @param inputValue the current form input value
233
233
  */
234
- private formControlResult;
234
+ formControlResult(inputValue: string): void;
235
235
  private _toNumber;
236
236
  private _removeMask;
237
237
  private _removePrefix;
@@ -380,7 +380,7 @@ declare class NgxMaskDirective implements ControlValueAccessor, OnChanges, Valid
380
380
  private readonly _injector;
381
381
  private _ngControl;
382
382
  private _resolveNgControl;
383
- onChange: (_: any) => void;
383
+ onChange: (_: unknown) => void;
384
384
  onTouch: () => void;
385
385
  constructor();
386
386
  ngOnChanges(changes: SimpleChanges): void;
@@ -424,7 +424,7 @@ declare class NgxMaskDirective implements ControlValueAccessor, OnChanges, Valid
424
424
  */
425
425
  private _restoreControlStateAfterWrite;
426
426
  /** It writes the value in the input */
427
- writeValue(controlValue: unknown): Promise<void>;
427
+ writeValue(controlValue: unknown): void;
428
428
  /**
429
429
  * Mirrors a writeValue-driven render into the DOM synchronously, in the same
430
430
  * change-detection pass (#1305). The service's `formElementProperty` setter defers all
@@ -460,7 +460,21 @@ declare class NgxMaskDirective implements ControlValueAccessor, OnChanges, Valid
460
460
  focus(): void;
461
461
  private _getActiveElement;
462
462
  checkSelectionOnDeletion(el: HTMLInputElement): void;
463
- /** It disables the input element */
463
+ /**
464
+ * It disables the input element.
465
+ *
466
+ * Mirrors `_writeElementValueSync` (#1305): the service's `formElementProperty` setter
467
+ * defers ALL DOM writes via `queueMicrotask` to dodge ExpressionChangedAfterItHasBeenChecked
468
+ * and keep FIFO ordering with config-driven re-renders. For `disabled` specifically, that
469
+ * deferral leaves `nativeElement.disabled` stale for at least one microtask after Angular
470
+ * Forms' `setUpControl` calls this method synchronously during init — long enough for a
471
+ * consumer reading the DOM property in the same synchronous phase (or another deferred write
472
+ * racing in FIFO order) to observe the wrong value, e.g. an initially-disabled FormControl
473
+ * whose native input briefly (or, depending on interleaving, persistently) reports
474
+ * `disabled === false` (#1633). Writing synchronously here closes that gap; the deferred
475
+ * write below still runs afterwards and re-applies the same final value, preserving the
476
+ * existing ordering guarantees other call sites rely on.
477
+ */
464
478
  setDisabledState(isDisabled: boolean): void;
465
479
  private _applyMask;
466
480
  /**