ngx-mask 22.1.0 → 22.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-mask.mjs","sources":["../../../projects/ngx-mask-lib/src/lib/ngx-mask-expression.enum.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.config.ts","../../../projects/ngx-mask-lib/src/lib/mask-handlers/cpf-cnpj.handler.ts","../../../projects/ngx-mask-lib/src/lib/mask-handlers/generic-pattern.handler.ts","../../../projects/ngx-mask-lib/src/lib/mask-handlers/ip.handler.ts","../../../projects/ngx-mask-lib/src/lib/mask-handlers/percent.handler.ts","../../../projects/ngx-mask-lib/src/lib/mask-handlers/separator.handler.ts","../../../projects/ngx-mask-lib/src/lib/mask-handlers/mask-handlers.registry.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.providers.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.pipe.ts","../../../projects/ngx-mask-lib/src/ngx-mask.ts"],"sourcesContent":["export const enum MaskExpression {\n SEPARATOR = 'separator',\n PERCENT = 'percent',\n IP = 'IP',\n CPF_CNPJ = 'CPF_CNPJ',\n CPF_CNPJ_ALPHA = 'CPF_CNPJ_ALPHA',\n MONTH = 'M',\n MONTHS = 'M0',\n MINUTE = 'm',\n HOUR = 'h',\n HOURS = 'H',\n MINUTES = 'm0',\n HOURS_HOUR = 'Hh',\n SECONDS = 's0',\n HOURS_MINUTES_SECONDS = 'Hh:m0:s0',\n EMAIL_MASK = 'A*@A*.A*',\n HOURS_MINUTES = 'Hh:m0',\n MINUTES_SECONDS = 'm0:s0',\n DAYS_MONTHS_YEARS = 'd0/M0/0000',\n DAYS_MONTHS = 'd0/M0',\n DAYS = 'd0',\n DAY = 'd',\n SECOND = 's',\n LETTER_S = 'S',\n DOT = '.',\n NUMPAD_DECIMAL = 'Decimal',\n NUMPAD_DECIMAL_CODE = 'NumpadDecimal',\n COMMA = ',',\n CURLY_BRACKETS_LEFT = '{',\n CURLY_BRACKETS_RIGHT = '}',\n MINUS = '-',\n OR = '||',\n HASH = '#',\n EMPTY_STRING = '',\n SYMBOL_STAR = '*',\n SYMBOL_QUESTION = '?',\n SLASH = '/',\n WHITE_SPACE = ' ',\n NUMBER_ZERO = '0',\n NUMBER_NINE = '9',\n BACKSPACE = 'Backspace',\n DELETE = 'Delete',\n ARROW_LEFT = 'ArrowLeft',\n ARROW_UP = 'ArrowUp',\n DOUBLE_ZERO = '00',\n}\n","import { EventEmitter, InjectionToken } from '@angular/core';\nimport { MaskExpression } from './ngx-mask-expression.enum';\n\nexport type InputTransformFn = (value: unknown) => string | number;\n\nexport type OutputTransformFn = (value: string | number | undefined | null) => unknown;\n\n/** Single decimal marker character accepted when `decimalMarker` is given as an array. */\nexport type DecimalMarkerChar = '.' | ',';\n\nexport type NgxMaskConfig = {\n suffix: string;\n prefix: string;\n thousandSeparator: string;\n decimalMarker: DecimalMarkerChar | [DecimalMarkerChar, DecimalMarkerChar];\n clearIfNotMatch: boolean;\n showMaskTyped: boolean;\n placeHolderCharacter: string;\n shownMaskExpression: string;\n specialCharacters: string[] | readonly string[];\n dropSpecialCharacters: boolean | string[] | readonly string[];\n hiddenInput: boolean;\n validation: boolean;\n instantPrefix: boolean;\n separatorLimit: string;\n apm: boolean;\n allowNegativeNumbers: boolean;\n leadZeroDateTime: boolean;\n leadZero: boolean;\n /**\n * Opt-in \"banking\" typing mode for separator masks with a fixed precision\n * (`separator.N`, N > 0): typed digits fill the value from the decimal end,\n * ATM/calculator style (5 -> 0.05 -> 0.57 -> 5.73); backspace shifts digits\n * back to the right. Pasted and model-written values keep the regular\n * separator formatting. Config-only option (provideNgxMask / pipe config) —\n * it has no directive input.\n */\n typeFromDecimals: boolean;\n triggerOnMaskChange: boolean;\n keepCharacterPositions: boolean;\n inputTransformFn: InputTransformFn;\n outputTransformFn: OutputTransformFn;\n maskFilled: EventEmitter<void>;\n /**\n * User-defined named mask aliases resolved at the DI-config level (static per injector).\n * When the `mask` input (or pipe mask argument) exactly matches an alias key, the aliased\n * expression is substituted before any other mask processing (including `||` multi-masks).\n * Alias keys must not shadow built-in tokens (IP, CPF_CNPJ, CPF_CNPJ_ALPHA, ...) — such\n * aliases are ignored with a one-time console warning.\n */\n maskAliases: Record<string, string>;\n /**\n * When set, this raw value is written through the regular mask pipeline on blur\n * whenever the control's unmasked value is empty (covers '', a bare prefix/suffix and\n * the showMaskTyped skeleton): the display shows the masked default and the model\n * receives the usual output (dropSpecialCharacters/outputTransformFn applied). The\n * write keeps the control's pristine state. `null` (default) keeps current behavior.\n */\n defaultValueOnBlur: string | null;\n patterns: Record<\n string,\n {\n pattern: RegExp;\n optional?: boolean;\n symbol?: string;\n }\n >;\n};\n\nexport type NgxMaskOptions = Partial<NgxMaskConfig>;\nexport const NGX_MASK_CONFIG = new InjectionToken<NgxMaskConfig>('ngx-mask config');\nexport const NEW_CONFIG = new InjectionToken<NgxMaskConfig>('new ngx-mask config');\nexport const INITIAL_CONFIG = new InjectionToken<NgxMaskConfig>('initial ngx-mask config');\n\nexport const initialConfig: NgxMaskConfig = {\n suffix: '',\n prefix: '',\n thousandSeparator: ' ',\n decimalMarker: ['.', ','],\n clearIfNotMatch: false,\n showMaskTyped: false,\n instantPrefix: false,\n placeHolderCharacter: '_',\n dropSpecialCharacters: true,\n hiddenInput: false,\n shownMaskExpression: '',\n separatorLimit: '',\n allowNegativeNumbers: false,\n validation: true,\n specialCharacters: ['-', '/', '(', ')', '.', ':', ' ', '+', ',', '@', '[', ']', '\"', \"'\"],\n leadZeroDateTime: false,\n apm: false,\n leadZero: false,\n typeFromDecimals: false,\n keepCharacterPositions: false,\n triggerOnMaskChange: false,\n inputTransformFn: (value: unknown) => value as string | number,\n outputTransformFn: (value: string | number | undefined | null) => value,\n maskFilled: new EventEmitter<void>(),\n maskAliases: {},\n defaultValueOnBlur: null,\n patterns: {\n '0': {\n pattern: new RegExp('\\\\d'),\n },\n '9': {\n pattern: new RegExp('\\\\d'),\n optional: true,\n },\n X: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n A: {\n pattern: new RegExp('[a-zA-Z0-9]'),\n },\n S: {\n pattern: new RegExp('[a-zA-Z]'),\n },\n U: {\n pattern: new RegExp('[A-Z]'),\n },\n L: {\n pattern: new RegExp('[a-z]'),\n },\n d: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n m: {\n pattern: new RegExp('\\\\d'),\n },\n M: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n H: {\n pattern: new RegExp('\\\\d'),\n },\n h: {\n pattern: new RegExp('\\\\d'),\n },\n s: {\n pattern: new RegExp('\\\\d'),\n },\n },\n};\n\n/**\n * Built-in mask tokens dispatched by exact equality (IP, CPF_CNPJ, CPF_CNPJ_ALPHA, email)\n * or by a reserved prefix (separator, percent) inside the mask pipeline. User-defined\n * aliases must not shadow them — substituting e.g. 'IP' early would break the built-in\n * exact-equality dispatch deep in the applier.\n */\nconst RESERVED_MASK_TOKENS: ReadonlySet<string> = new Set([\n MaskExpression.IP,\n MaskExpression.CPF_CNPJ,\n MaskExpression.CPF_CNPJ_ALPHA,\n MaskExpression.EMAIL_MASK,\n MaskExpression.SEPARATOR,\n MaskExpression.PERCENT,\n]);\n\n/** Tracks alias keys already warned about, so the shadowing warning fires once per key. */\nconst warnedShadowedAliases = new Set<string>();\n\n/**\n * Resolves a user-defined mask alias to its mask expression. Returns the input expression\n * unchanged when no alias matches or when the alias key shadows a built-in token (in which\n * case a console warning is emitted once per key and the built-in wins).\n */\nexport function resolveMaskAlias(\n maskExpression: string | null | undefined,\n maskAliases: Record<string, string> | undefined\n): string {\n const expression = maskExpression ?? MaskExpression.EMPTY_STRING;\n if (!expression || !maskAliases) {\n return expression;\n }\n const aliased = maskAliases[expression];\n if (typeof aliased !== 'string') {\n return expression;\n }\n if (RESERVED_MASK_TOKENS.has(expression)) {\n if (!warnedShadowedAliases.has(expression)) {\n warnedShadowedAliases.add(expression);\n // eslint-disable-next-line no-console\n console.warn(\n `ngx-mask: mask alias \"${expression}\" shadows a built-in mask token and is ignored. Rename the alias.`\n );\n }\n return expression;\n }\n return aliased;\n}\n\nexport const timeMasks: string[] = [\n MaskExpression.HOURS_MINUTES_SECONDS,\n MaskExpression.HOURS_MINUTES,\n MaskExpression.MINUTES_SECONDS,\n];\n\nexport const withoutValidation: string[] = [\n MaskExpression.PERCENT,\n MaskExpression.HOURS_HOUR,\n MaskExpression.SECONDS,\n MaskExpression.MINUTES,\n MaskExpression.SEPARATOR,\n MaskExpression.DAYS_MONTHS_YEARS,\n MaskExpression.DAYS_MONTHS,\n MaskExpression.DAYS,\n MaskExpression.MONTHS,\n];\n","import { MaskExpression } from '../ngx-mask-expression.enum';\nimport type { MaskHandlerFn } from './mask-handler.types';\n\n/** CPF_CNPJ / CPF_CNPJ_ALPHA pre-processor (moved verbatim from applyMask). Sets\n * `this.cpfCnpjError`, rewrites the mask, then falls through to the generic loop.\n * Discriminated by exact equality BEFORE any startsWith handler — the 'H' of HOURS\n * would otherwise catch CPF_CNPJ_ALPHA by substring (CODEBASE_NOTES #3/#4). */\nexport const cpfCnpjHandler: MaskHandlerFn = function (state, params) {\n const isCpfCnpjAlpha = state.maskExpression === MaskExpression.CPF_CNPJ_ALPHA;\n this.cpfCnpjError = params.arr.length !== 11 && params.arr.length !== 14;\n const valueHasAnyLetter = /[a-zA-Z]/.test(state.processedValue);\n if (valueHasAnyLetter && isCpfCnpjAlpha) {\n state.maskExpression = 'AA.AAA.AAA/AAAA-00';\n } else if (params.arr.length > 11) {\n state.maskExpression = isCpfCnpjAlpha ? 'AA.AAA.AAA/AAAA-00' : '00.000.000/0000-00';\n } else {\n state.maskExpression = '000.000.000-00';\n }\n return state;\n};\n","import { MaskExpression } from '../ngx-mask-expression.enum';\nimport type { MaskHandlerFn } from './mask-handler.types';\n\n/**\n * Generic character-by-character pattern loop (moved verbatim from applyMask,\n * original lines 581-968). This is the default/fallback handler — always runs when\n * no exact/startsWith handler matched. IP and CPF_CNPJ pre-processors rewrite\n * `state.maskExpression` and then fall through into this loop.\n *\n * The inline HOURS/HOUR/MINUTE/SECOND/DAY/MONTH sub-branches (including the day-window\n * anchor flow-gating of #1611/#1513, CODEBASE_NOTES.md #20) are preserved unmodified —\n * they are explicitly out of scope for the phase-1 extraction boundary.\n *\n * Note: several branches read `this.maskExpression` (the instance field) rather than\n * the local `maskExpression` — this distinction is preserved exactly as in the\n * original source.\n */\nexport const genericPatternHandler: MaskHandlerFn = function (state, params) {\n const { inputArray } = params;\n const maskExpression = state.maskExpression;\n const processedValue = state.processedValue;\n let { cursor, result, multi, processedPosition, stepBack } = state;\n\n for (\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n let i = 0, inputSymbol: string = inputArray[0]!;\n i < inputArray.length;\n i++, inputSymbol = inputArray[i] ?? MaskExpression.EMPTY_STRING\n ) {\n if (cursor === maskExpression.length) {\n break;\n }\n\n const symbolStarInPattern: boolean = MaskExpression.SYMBOL_STAR in this.patterns;\n if (\n this._checkSymbolMask(\n inputSymbol,\n maskExpression[cursor] ?? MaskExpression.EMPTY_STRING\n ) &&\n maskExpression[cursor + 1] === MaskExpression.SYMBOL_QUESTION\n ) {\n result += inputSymbol;\n cursor += 2;\n } else if (\n maskExpression[cursor + 1] === MaskExpression.SYMBOL_STAR &&\n multi &&\n this._checkSymbolMask(\n inputSymbol,\n maskExpression[cursor + 2] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n result += inputSymbol;\n cursor += 3;\n multi = false;\n } else if (\n this._checkSymbolMask(\n inputSymbol,\n maskExpression[cursor] ?? MaskExpression.EMPTY_STRING\n ) &&\n maskExpression[cursor + 1] === MaskExpression.SYMBOL_STAR &&\n !symbolStarInPattern\n ) {\n result += inputSymbol;\n multi = true;\n } else if (\n maskExpression[cursor + 1] === MaskExpression.SYMBOL_QUESTION &&\n this._checkSymbolMask(\n inputSymbol,\n maskExpression[cursor + 2] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n result += inputSymbol;\n cursor += 3;\n } else if (\n this._checkSymbolMask(\n inputSymbol,\n maskExpression[cursor] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n if (maskExpression[cursor] === MaskExpression.HOURS) {\n if (this.apm ? Number(inputSymbol) > 9 : Number(inputSymbol) > 2) {\n processedPosition = !this.leadZeroDateTime\n ? processedPosition + 1\n : processedPosition;\n cursor += 1;\n this._shiftStep(cursor);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === MaskExpression.HOUR) {\n if (\n this.apm\n ? (result.length === 1 && Number(result) > 1) ||\n (result === '1' && Number(inputSymbol) > 2) ||\n (processedValue.slice(cursor - 1, cursor).length === 1 &&\n Number(processedValue.slice(cursor - 1, cursor)) > 2) ||\n (processedValue.slice(cursor - 1, cursor) === '1' &&\n Number(inputSymbol) > 2)\n : (result === '2' && Number(inputSymbol) > 3) ||\n ((result.slice(cursor - 2, cursor) === '2' ||\n result.slice(cursor - 3, cursor) === '2' ||\n result.slice(cursor - 4, cursor) === '2' ||\n result.slice(cursor - 1, cursor) === '2') &&\n Number(inputSymbol) > 3 &&\n cursor > 10)\n ) {\n processedPosition = processedPosition + 1;\n cursor += 1;\n i--;\n continue;\n }\n }\n if (\n maskExpression[cursor] === MaskExpression.MINUTE ||\n maskExpression[cursor] === MaskExpression.SECOND\n ) {\n if (Number(inputSymbol) > 5) {\n processedPosition = !this.leadZeroDateTime\n ? processedPosition + 1\n : processedPosition;\n cursor += 1;\n this._shiftStep(cursor);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n const daysCount = 31;\n const inputValueCursor = processedValue[cursor] as string;\n const inputValueCursorPlusOne = processedValue[cursor + 1] as string;\n const inputValueCursorPlusTwo = processedValue[cursor + 2] as string;\n const inputValueCursorMinusOne = processedValue[cursor - 1] as string;\n const inputValueCursorMinusTwo = processedValue[cursor - 2] as string;\n const inputValueSliceMinusThreeMinusOne = processedValue.slice(cursor - 3, cursor - 1);\n const inputValueSliceMinusOnePlusOne = processedValue.slice(cursor - 1, cursor + 1);\n const inputValueSliceCursorPlusTwo = processedValue.slice(cursor, cursor + 2);\n const inputValueSliceMinusTwoCursor = processedValue.slice(cursor - 2, cursor);\n // Issue #1523: when the date token directly abuts a plain digit\n // token (year-first masks without separators like 00M0d0 or\n // 0000M0d0), the backward-looking windows below read the previous\n // field's digits (year) as day/month digits and skip valid input.\n // Disable only those backward heuristics in that layout.\n const tokenAbutsDigitField = maskExpression[cursor - 1] === MaskExpression.NUMBER_ZERO;\n if (maskExpression[cursor] === MaskExpression.DAY) {\n const maskStartWithMonth = maskExpression.slice(0, 2) === MaskExpression.MONTHS;\n const startWithMonthInput: boolean =\n maskExpression.slice(0, 2) === MaskExpression.MONTHS &&\n this.specialCharacters.includes(inputValueCursorMinusTwo);\n // Issue #1611: `cursor` indexes the mask, `i` indexes the input.\n // On paste/writeValue of a bare digit string the cursor runs\n // ahead of the input by every emitted separator, so cursor-based\n // slices read year digits instead of the day — anchor the day\n // window on the input index in those flows. Keystroke flows keep\n // the historical cursor anchor (with showMaskTyped the value also\n // carries placeholder chars, where the input anchor misreads).\n const dayWindowStart = params.justPasted || this.writingValue ? i : cursor;\n const dayWindowSlice = processedValue.slice(dayWindowStart, dayWindowStart + 2);\n const dayWindowNext = processedValue[dayWindowStart + 1] as string;\n if (\n (Number(inputSymbol) > 3 && this.leadZeroDateTime) ||\n (!maskStartWithMonth &&\n (Number(inputValueSliceCursorPlusTwo) > daysCount ||\n (!tokenAbutsDigitField &&\n Number(inputValueSliceMinusOnePlusOne) > daysCount) ||\n this.specialCharacters.includes(inputValueCursorPlusOne))) ||\n (startWithMonthInput\n ? Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n (!this.specialCharacters.includes(inputValueCursor) &&\n this.specialCharacters.includes(inputValueCursorPlusTwo)) ||\n this.specialCharacters.includes(inputValueCursor)\n : Number(dayWindowSlice) > daysCount ||\n (this.specialCharacters.includes(dayWindowNext) && !params.backspaced))\n ) {\n processedPosition = !this.leadZeroDateTime\n ? processedPosition + 1\n : processedPosition;\n cursor += 1;\n this._shiftStep(cursor);\n i--;\n\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === MaskExpression.MONTH) {\n const monthsCount = 12;\n // Issue #1513: the backward-looking day/month windows below\n // assume the digits before the MONTH token belong to a DAY\n // field. In year-first masks with separators (e.g. 0000-M0-d0)\n // they read YEAR digits through the separator and shove a\n // spurious leading zero into the month. tokenAbutsDigitField\n // (#1523) only covers separator-less layouts, so derive field\n // ownership from the mask itself: locate the field (maximal\n // run of non-special tokens) immediately preceding this MONTH\n // token — a plain digit run of 3+ characters is a year, not a\n // day, and the day-based heuristics must not fire.\n let precedingFieldEnd = cursor - 1;\n while (\n precedingFieldEnd >= 0 &&\n this.specialCharacters.includes(maskExpression[precedingFieldEnd] as string)\n ) {\n precedingFieldEnd--;\n }\n let precedingFieldStart = precedingFieldEnd;\n while (\n precedingFieldStart >= 0 &&\n !this.specialCharacters.includes(maskExpression[precedingFieldStart] as string)\n ) {\n precedingFieldStart--;\n }\n const precedingField = maskExpression.slice(\n precedingFieldStart + 1,\n precedingFieldEnd + 1\n );\n const yearFieldPrecedesMonth =\n precedingField.length > 2 &&\n precedingField\n .split(MaskExpression.EMPTY_STRING)\n .every((token) => token === MaskExpression.NUMBER_ZERO);\n // mask without day\n const withoutDays: boolean =\n cursor === 0 &&\n (Number(inputSymbol) > 2 ||\n Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n (this.specialCharacters.includes(inputValueCursorPlusOne) &&\n !params.backspaced));\n // day<10 && month<12 for input\n const specialChart = maskExpression.slice(cursor + 2, cursor + 3);\n const day1monthInput: boolean =\n inputValueSliceMinusThreeMinusOne.includes(specialChart) &&\n maskExpression.includes('d0') &&\n ((this.specialCharacters.includes(inputValueCursorMinusTwo) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursor)) ||\n this.specialCharacters.includes(inputValueCursor));\n // month<12 && day<10 for input\n const day2monthInput: boolean =\n !tokenAbutsDigitField &&\n !yearFieldPrecedesMonth &&\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(inputValueSliceMinusThreeMinusOne as string) &&\n this.specialCharacters.includes(inputValueCursorMinusOne) &&\n (Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // cursor === 5 && without days\n const day2monthInputDot: boolean =\n (Number(inputValueSliceCursorPlusTwo) > monthsCount && cursor === 5) ||\n (this.specialCharacters.includes(inputValueCursorPlusOne) && cursor === 5);\n // // day<10 && month<12 for paste whole data\n const day1monthPaste: boolean =\n !tokenAbutsDigitField &&\n !yearFieldPrecedesMonth &&\n Number(inputValueSliceMinusThreeMinusOne) > daysCount &&\n !this.specialCharacters.includes(inputValueSliceMinusThreeMinusOne as string) &&\n !this.specialCharacters.includes(inputValueSliceMinusTwoCursor as string) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount &&\n maskExpression.includes('d0');\n // 10<day<31 && month<12 for paste whole data\n const day2monthPaste: boolean =\n !tokenAbutsDigitField &&\n !yearFieldPrecedesMonth &&\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(inputValueSliceMinusThreeMinusOne as string) &&\n !this.specialCharacters.includes(inputValueCursorMinusOne) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount;\n if (\n (Number(inputSymbol) > 1 && this.leadZeroDateTime) ||\n withoutDays ||\n day1monthInput ||\n day2monthPaste ||\n day1monthPaste ||\n day2monthInput ||\n (day2monthInputDot && !this.leadZeroDateTime)\n ) {\n processedPosition = !this.leadZeroDateTime\n ? processedPosition + 1\n : processedPosition;\n cursor += 1;\n this._shiftStep(cursor);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n result += inputSymbol;\n cursor++;\n } else if (\n this.specialCharacters.includes(inputSymbol) &&\n maskExpression[cursor] === inputSymbol\n ) {\n result += inputSymbol;\n cursor++;\n } else if (\n this.specialCharacters.indexOf(\n maskExpression[cursor] ?? MaskExpression.EMPTY_STRING\n ) !== -1\n ) {\n result += maskExpression[cursor];\n cursor++;\n this._shiftStep(cursor);\n i--;\n } else if (maskExpression[cursor] === MaskExpression.NUMBER_NINE && this.showMaskTyped) {\n this._shiftStep(cursor);\n } else if (\n this.patterns[maskExpression[cursor] ?? MaskExpression.EMPTY_STRING] &&\n this.patterns[maskExpression[cursor] ?? MaskExpression.EMPTY_STRING]?.optional\n ) {\n // If the input symbol is whitespace or doesn't match the pattern,\n // skip it without consuming the mask position\n if (inputSymbol.trim() === MaskExpression.EMPTY_STRING) {\n // Skip whitespace input, don't advance mask cursor\n continue;\n }\n if (\n !!inputArray[cursor] &&\n maskExpression !== '099.099.099.099' &&\n maskExpression !== '000.000.000-00' &&\n maskExpression !== '00.000.000/0000-00' &&\n !maskExpression.match(/^9+\\.0+$/) &&\n !this.patterns[maskExpression[cursor] ?? MaskExpression.EMPTY_STRING]?.optional\n ) {\n result += inputArray[cursor];\n }\n if (\n maskExpression.includes(MaskExpression.NUMBER_NINE + MaskExpression.SYMBOL_STAR) &&\n maskExpression.includes(MaskExpression.NUMBER_ZERO + MaskExpression.SYMBOL_STAR)\n ) {\n cursor++;\n }\n\n cursor++;\n i--;\n } else if (\n this.maskExpression[cursor + 1] === MaskExpression.SYMBOL_STAR &&\n // A typed char that exactly matches the mask's literal char at cursor+2\n // (e.g. the '@' in 'A*@A*.A*') always terminates the 'A*' run, regardless\n // of whether that literal is registered in `specialCharacters` — an\n // explicitly empty `specialCharacters` list must not make mask literals\n // unmatchable (#1512).\n (this._findSpecialChar(this.maskExpression[cursor + 2] ?? MaskExpression.EMPTY_STRING)\n ? this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2]\n : inputSymbol === this.maskExpression[cursor + 2]) &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.maskExpression[cursor + 1] === MaskExpression.SYMBOL_QUESTION &&\n (this._findSpecialChar(this.maskExpression[cursor + 2] ?? MaskExpression.EMPTY_STRING)\n ? this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2]\n : inputSymbol === this.maskExpression[cursor + 2]) &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.showMaskTyped &&\n this.specialCharacters.indexOf(inputSymbol) < 0 &&\n inputSymbol !== this.placeHolderCharacter &&\n this.placeHolderCharacter.length === 1\n ) {\n stepBack = true;\n }\n }\n\n state.cursor = cursor;\n state.result = result;\n state.multi = multi;\n state.processedPosition = processedPosition;\n state.stepBack = stepBack;\n return state;\n};\n","import { MaskExpression } from '../ngx-mask-expression.enum';\nimport type { MaskHandlerFn } from './mask-handler.types';\n\n/** IP pre-processor (moved verbatim from applyMask). Sets `this.ipError`, rewrites\n * the mask to `099.099.099.099`, then falls through to the generic loop. */\nexport const ipHandler: MaskHandlerFn = function (state) {\n const valuesIP = state.processedValue.split(MaskExpression.DOT);\n this.ipError = this._validIP(valuesIP);\n\n state.maskExpression = '099.099.099.099';\n return state;\n};\n","import { MaskExpression } from '../ngx-mask-expression.enum';\nimport type { MaskHandlerFn } from './mask-handler.types';\n\n/** PERCENT handler (moved verbatim from applyMask). startsWith(PERCENT); terminal —\n * produces the final `result`, no fallthrough. */\nexport const percentHandler: MaskHandlerFn = function (state, params) {\n const { backspaced } = params;\n const { cursor } = state;\n let processedValue = state.processedValue;\n if (\n processedValue.match('[a-z]|[A-Z]') ||\n // eslint-disable-next-line no-useless-escape\n (processedValue.match(/[-!$%^&*()_+|~=`{}\\[\\]:\";'<>?,\\/.]/) && !backspaced)\n ) {\n processedValue = this._stripToDecimal(processedValue);\n const precision: number = this.getPrecision(state.maskExpression);\n\n processedValue = this.checkInputPrecision(processedValue, precision);\n }\n const decimalMarker = this._activeDecimalMarker(processedValue);\n if (\n processedValue.indexOf(decimalMarker) > 0 &&\n !this.percentage(processedValue.substring(0, processedValue.indexOf(decimalMarker)))\n ) {\n let base: string = processedValue.substring(0, processedValue.indexOf(decimalMarker) - 1);\n if (\n this.allowNegativeNumbers &&\n processedValue.slice(cursor, cursor + 1) === MaskExpression.MINUS &&\n !backspaced\n ) {\n base = processedValue.substring(0, processedValue.indexOf(decimalMarker));\n }\n\n processedValue = `${base}${processedValue.substring(\n processedValue.indexOf(decimalMarker),\n processedValue.length\n )}`;\n }\n let value: string;\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.allowNegativeNumbers && processedValue.slice(cursor, cursor + 1) === MaskExpression.MINUS\n ? (value = `${MaskExpression.MINUS}${processedValue.slice(cursor + 1, cursor + processedValue.length)}`)\n : (value = processedValue);\n if (this.percentage(value)) {\n state.result = this._splitPercentZero(processedValue);\n } else {\n state.result = this._splitPercentZero(\n processedValue.substring(0, processedValue.length - 1)\n );\n }\n state.processedValue = processedValue;\n return state;\n};\n","import { MaskExpression } from '../ngx-mask-expression.enum';\nimport type { MaskHandlerFn } from './mask-handler.types';\n\n/**\n * SEPARATOR handler (moved verbatim from applyMask, original lines 219-580).\n * Discriminator: `maskExpression.startsWith(MaskExpression.SEPARATOR)`. Produces the\n * final `result` for this call.\n *\n * Two sequential zero-handling stages are preserved together, in original relative\n * order (CODEBASE_NOTES.md #13): the `if (backspaced)` guard block and the\n * precision-0 leading-zero stripper.\n *\n * The `typeFromDecimals` sub-case (#733/#1414/#1315) early-returns the final string\n * via `state.earlyReturn` after calling `cb()` — this must bypass the shared\n * post-processing in `applyMask` exactly, or the caret-pin `cb()` contract breaks.\n */\nexport const separatorHandler: MaskHandlerFn = function (state, params) {\n const {\n backspaced,\n justPasted,\n startsWithPrefix,\n prefixAlreadyRemovedByCaller,\n cb,\n inputValue,\n } = params;\n let { processedValue, processedPosition, backspaceShift, shift, stepBack } = state;\n let result: string;\n\n if (\n processedValue.match('[wа-яА-Я]') ||\n processedValue.match('[ЁёА-я]') ||\n processedValue.match('[a-z]|[A-Z]') ||\n processedValue.match(/[-@#!$%\\\\^&*()_£¬'+|~=`{}\\]:\";<>.?/]/) ||\n processedValue.match('[^A-Za-z0-9,]')\n ) {\n processedValue = this._stripToDecimal(processedValue);\n }\n\n const precision: number = this.getPrecision(state.maskExpression);\n let decimalMarker = this.decimalMarker;\n\n if (Array.isArray(this.decimalMarker)) {\n decimalMarker = this._activeDecimalMarker(this.actualValue);\n }\n\n // Issues #733/#1414/#1315: opt-in \"banking\" typing mode — typed digits fill\n // the value from the decimal end, ATM/calculator style (5 -> 0.05 -> 0.57\n // -> 5.73); backspace shifts digits back to the right. Only keystroke and\n // backspace flows are reinterpreted; paste and writeValue keep the regular\n // separator formatting. The early return leaves every existing separator\n // path byte-identical when the option is off.\n if (\n this.typeFromDecimals &&\n Number.isFinite(precision) &&\n precision > 0 &&\n !justPasted &&\n !this.writingValue\n ) {\n result = this._formatFromDecimals(processedValue, precision, decimalMarker as string);\n this._shift.clear();\n const res =\n result.includes(MaskExpression.MINUS) && this.prefix && this.allowNegativeNumbers\n ? `${MaskExpression.MINUS}${this.prefix}${result\n .split(MaskExpression.MINUS)\n .join(MaskExpression.EMPTY_STRING)}${this.suffix}`\n : result.length\n ? `${this.prefix}${result}${this.suffix}`\n : this.instantPrefix\n ? this.prefix\n : MaskExpression.EMPTY_STRING;\n // Pin the caret to the end of the value part: every keystroke reshapes\n // the whole string, so the in-place caret position is meaningless here.\n cb(res.length - this.suffix.length - processedPosition, true);\n state.earlyReturn = res;\n return state;\n }\n\n // Issue #1250: typing an additional decimal marker into a value that\n // already contains one must be a no-op — otherwise everything after the\n // new marker is re-parsed as a fresh decimal part and the value is\n // mangled (15.000,53 + ',' typed after the '1' -> 1,5). Remove the newly\n // typed marker (the char right before the caret) and step the caret back.\n // Paste keeps its own semantics (#1547 below: last marker wins), and\n // backspace/writeValue flows cannot introduce a new marker.\n if (!justPasted && !backspaced && !this.writingValue) {\n const isDecimalMarkerChar = (char: string | undefined): boolean =>\n !!char &&\n char !== this.thousandSeparator &&\n (Array.isArray(this.decimalMarker)\n ? this.decimalMarker.includes(char as MaskExpression.COMMA | MaskExpression.DOT)\n : char === this.decimalMarker);\n const prefixOffset =\n startsWithPrefix && !prefixAlreadyRemovedByCaller ? this.prefix.length : 0;\n const typedMarkerIndex = processedPosition - prefixOffset - 1;\n if (typedMarkerIndex >= 0 && isDecimalMarkerChar(processedValue[typedMarkerIndex])) {\n let markerCount = 0;\n for (const char of processedValue) {\n if (isDecimalMarkerChar(char)) {\n markerCount++;\n }\n }\n if (markerCount > 1) {\n processedValue =\n processedValue.slice(0, typedMarkerIndex) +\n processedValue.slice(typedMarkerIndex + 1);\n stepBack = true;\n }\n }\n }\n\n // Issue #1547: a pasted value may contain grouping separators that are\n // also configured decimal markers (default decimalMarker is ['.', ',']),\n // e.g. '1,234.56'. Only the last marker character can actually be the\n // decimal marker — treat the earlier ones as thousand separators and\n // strip them, otherwise formatting cuts the value off at the first one.\n if (justPasted && Array.isArray(this.decimalMarker)) {\n const markerPositions: number[] = [];\n for (let i = 0; i < processedValue.length; i++) {\n const char = processedValue[i] as string;\n if (\n char !== this.thousandSeparator &&\n this.decimalMarker.includes(char as MaskExpression.COMMA | MaskExpression.DOT)\n ) {\n markerPositions.push(i);\n }\n }\n if (markerPositions.length > 1) {\n const lastMarkerPosition = markerPositions[markerPositions.length - 1];\n processedValue = processedValue\n .split(MaskExpression.EMPTY_STRING)\n .filter(\n (_, index) => index === lastMarkerPosition || !markerPositions.includes(index)\n )\n .join(MaskExpression.EMPTY_STRING);\n }\n }\n\n if (backspaced) {\n const { decimalMarkerIndex, nonZeroIndex } = this._findFirstNonZeroAndDecimalIndex(\n processedValue,\n decimalMarker as '.' | ','\n );\n const zeroIndexMinus = processedValue[0] === MaskExpression.MINUS;\n const zeroIndexDecimalMarker = processedValue[0] === decimalMarker;\n const firstIndexDecimalMarker = processedValue[1] === decimalMarker;\n\n // Issues #1355/#1578: an all-zero remainder (e.g. '00' from '500', '00,000'\n // from '100,000') must keep its zeros, matching the ',000,000' case.\n // Only collapse when nothing but a bare decimal marker (or '-.') remains.\n if (\n (zeroIndexDecimalMarker && !nonZeroIndex) ||\n (zeroIndexMinus && firstIndexDecimalMarker && !nonZeroIndex)\n ) {\n processedValue = MaskExpression.NUMBER_ZERO;\n }\n\n if (decimalMarkerIndex && nonZeroIndex && zeroIndexMinus && processedPosition === 1) {\n if (decimalMarkerIndex < nonZeroIndex || decimalMarkerIndex > nonZeroIndex) {\n processedValue = MaskExpression.MINUS + processedValue.slice(nonZeroIndex);\n }\n }\n\n // Issue #1516: decimalMarkerIndex is 0 when the remainder starts with\n // the decimal marker (',34' after deleting the integer part) — a truthy\n // check would treat it as \"no decimal marker\" and slice the marker off.\n if (decimalMarkerIndex === null && nonZeroIndex && processedValue.length > nonZeroIndex) {\n processedValue = zeroIndexMinus\n ? MaskExpression.MINUS + processedValue.slice(nonZeroIndex)\n : processedValue.slice(nonZeroIndex);\n }\n\n if (decimalMarkerIndex && nonZeroIndex && processedPosition === 0) {\n if (decimalMarkerIndex < nonZeroIndex) {\n processedValue = processedValue.slice(decimalMarkerIndex - 1);\n }\n if (decimalMarkerIndex > nonZeroIndex) {\n processedValue = processedValue.slice(nonZeroIndex);\n }\n }\n }\n\n // Leading-zero stripping is a typing-time rule ('05' -> '5'). When backspaced,\n // leading zeros before a non-zero digit were already removed above, and an\n // all-zero remainder must keep its zeros (issues #1355/#1578).\n if (precision === 0 && !backspaced) {\n processedValue = this.allowNegativeNumbers\n ? processedValue.length > 2 &&\n processedValue[0] === MaskExpression.MINUS &&\n processedValue[1] === MaskExpression.NUMBER_ZERO &&\n processedValue[2] !== this.thousandSeparator &&\n processedValue[2] !== MaskExpression.COMMA &&\n processedValue[2] !== MaskExpression.DOT\n ? '-' + processedValue.slice(2, processedValue.length)\n : processedValue[0] === MaskExpression.NUMBER_ZERO &&\n processedValue.length > 1 &&\n processedValue[1] !== this.thousandSeparator &&\n processedValue[1] !== MaskExpression.COMMA &&\n processedValue[1] !== MaskExpression.DOT\n ? processedValue.slice(1, processedValue.length)\n : processedValue\n : processedValue.length > 1 &&\n processedValue[0] === MaskExpression.NUMBER_ZERO &&\n processedValue[1] !== this.thousandSeparator &&\n processedValue[1] !== MaskExpression.COMMA &&\n processedValue[1] !== MaskExpression.DOT\n ? processedValue.slice(1, processedValue.length)\n : processedValue;\n } else {\n if (processedValue[0] === decimalMarker && processedValue.length > 1 && !backspaced) {\n processedValue =\n MaskExpression.NUMBER_ZERO + processedValue.slice(0, processedValue.length + 1);\n this.plusOnePosition = true;\n }\n if (\n processedValue[0] === MaskExpression.NUMBER_ZERO &&\n processedValue[1] !== decimalMarker &&\n processedValue[1] !== this.thousandSeparator &&\n !backspaced\n ) {\n processedValue =\n processedValue.length > 1\n ? processedValue.slice(0, 1) +\n decimalMarker +\n processedValue.slice(1, processedValue.length + 1)\n : processedValue;\n this.plusOnePosition = true;\n }\n if (\n this.allowNegativeNumbers &&\n !backspaced &&\n processedValue[0] === MaskExpression.MINUS &&\n (processedValue[1] === decimalMarker ||\n processedValue[1] === MaskExpression.NUMBER_ZERO)\n ) {\n processedValue =\n processedValue[1] === decimalMarker && processedValue.length > 2\n ? processedValue.slice(0, 1) +\n MaskExpression.NUMBER_ZERO +\n processedValue.slice(1, processedValue.length)\n : processedValue[1] === MaskExpression.NUMBER_ZERO &&\n processedValue.length > 2 &&\n processedValue[2] !== decimalMarker\n ? processedValue.slice(0, 2) +\n decimalMarker +\n processedValue.slice(2, processedValue.length)\n : processedValue;\n this.plusOnePosition = true;\n }\n }\n\n // Historical note: pre-refactor code used different allowed-character regexes\n // per config (plain separator: no COMMA; dot thousand-sep: no SPACE, COMMA OK;\n // comma thousand-sep: no SPACE, COMMA OK). The unified regex below removes\n // exactly the active thousandSeparator + decimalMarker(s) from the invalid set,\n // so each config already accepts its own chars and rejects the others —\n // verified by the \"unified invalidChars regex\" cases in separator.spec.ts.\n const thousandSeparatorCharEscaped: string = this._charToRegExpExpression(\n this.thousandSeparator\n );\n let invalidChars: string = '@#!$%^&*()_+|~=`{}\\\\[\\\\]:\\\\s,\\\\.\";<>?\\\\/'.replace(\n thousandSeparatorCharEscaped,\n ''\n );\n //.replace(decimalMarkerEscaped, '');\n if (Array.isArray(this.decimalMarker)) {\n for (const marker of this.decimalMarker) {\n invalidChars = invalidChars.replace(\n this._charToRegExpExpression(marker),\n MaskExpression.EMPTY_STRING\n );\n }\n } else {\n invalidChars = invalidChars.replace(this._charToRegExpExpression(this.decimalMarker), '');\n }\n\n const invalidCharRegexp = new RegExp('[' + invalidChars + ']');\n if (processedValue.match(invalidCharRegexp)) {\n processedValue = processedValue.substring(0, processedValue.length - 1);\n }\n\n processedValue = this.checkInputPrecision(processedValue, precision);\n const strForSep: string = processedValue.replace(\n new RegExp(thousandSeparatorCharEscaped, 'g'),\n ''\n );\n\n result = this._formatWithSeparators(\n strForSep,\n this.thousandSeparator,\n this.decimalMarker,\n precision\n );\n\n const commaShift: number =\n result.indexOf(MaskExpression.COMMA) - processedValue.indexOf(MaskExpression.COMMA);\n const shiftStep: number = result.length - processedValue.length;\n const backspacedDecimalMarkerWithSeparatorLimit =\n backspaced && result.length < inputValue.length - this.suffix.length && this.separatorLimit;\n\n if (\n (result[processedPosition - 1] === this.thousandSeparator ||\n result[processedPosition - this.prefix.length]) &&\n this.prefix &&\n backspaced\n ) {\n processedPosition = processedPosition - 1;\n } else if (\n (shiftStep > 0 && result[processedPosition] !== this.thousandSeparator) ||\n backspacedDecimalMarkerWithSeparatorLimit\n ) {\n backspaceShift = true;\n let _shift = 0;\n do {\n this._shift.add(processedPosition + _shift);\n _shift++;\n } while (_shift < shiftStep);\n } else if (\n result[processedPosition - 1] === this.thousandSeparator ||\n shiftStep === -4 ||\n shiftStep === -3 ||\n result[processedPosition] === this.thousandSeparator\n ) {\n this._shift.clear();\n this._shift.add(processedPosition - 1);\n } else if (\n (commaShift !== 0 &&\n processedPosition > 0 &&\n !(\n result.indexOf(MaskExpression.COMMA) >= processedPosition && processedPosition > 3\n )) ||\n (!(result.indexOf(MaskExpression.DOT) >= processedPosition && processedPosition > 3) &&\n shiftStep <= 0)\n ) {\n this._shift.clear();\n backspaceShift = true;\n shift = shiftStep;\n\n processedPosition += shiftStep;\n this._shift.add(processedPosition);\n } else {\n this._shift.clear();\n }\n\n state.processedValue = processedValue;\n state.processedPosition = processedPosition;\n state.result = result;\n state.backspaceShift = backspaceShift;\n state.shift = shift;\n state.stepBack = stepBack;\n return state;\n};\n","import { MaskExpression } from '../ngx-mask-expression.enum';\nimport type { NgxMaskApplierService } from '../ngx-mask-applier.service';\nimport { cpfCnpjHandler } from './cpf-cnpj.handler';\nimport { genericPatternHandler } from './generic-pattern.handler';\nimport { ipHandler } from './ip.handler';\nimport type { MaskHandlerEntry, MaskHandlerParams, MaskHandlerState } from './mask-handler.types';\nimport { percentHandler } from './percent.handler';\nimport { separatorHandler } from './separator.handler';\n\n/** Ordered dispatch table. Exact-match entries (IP, CPF_CNPJ) MUST precede\n * startsWith entries (PERCENT, SEPARATOR) — mirrors the original `if/else if` order\n * and preserves the exact-before-substring guarantee (CODEBASE_NOTES #3/#4).\n * `terminal: false` = pre-processor (rewrites mask, falls through to generic loop);\n * `terminal: true` = resolves `result` and skips the generic loop. */\ntype RegistryEntry = MaskHandlerEntry & {\n readonly terminal: boolean;\n};\n\nconst MASK_HANDLERS: readonly RegistryEntry[] = [\n {\n id: 'ip',\n terminal: false,\n match: (maskExpression) => maskExpression === MaskExpression.IP,\n handle: ipHandler,\n },\n {\n id: 'cpf-cnpj',\n terminal: false,\n match: (maskExpression) =>\n maskExpression === MaskExpression.CPF_CNPJ ||\n maskExpression === MaskExpression.CPF_CNPJ_ALPHA,\n handle: cpfCnpjHandler,\n },\n {\n id: 'percent',\n terminal: true,\n match: (maskExpression) => maskExpression.startsWith(MaskExpression.PERCENT),\n handle: percentHandler,\n },\n {\n id: 'separator',\n terminal: true,\n match: (maskExpression) => maskExpression.startsWith(MaskExpression.SEPARATOR),\n handle: separatorHandler,\n },\n];\n\n/** Runs mask-type dispatch: first matching entry wins. IP/CPF_CNPJ pre-process then\n * fall through to the generic loop; PERCENT/SEPARATOR resolve terminally; no match →\n * generic loop directly (the original `else`). IP and CPF_CNPJ are mutually exclusive\n * exact matches, so scanning the ordered table is behavior-identical to the original\n * IP → CPF_CNPJ → PERCENT → SEPARATOR → else chain. */\nexport function dispatchMaskHandler(\n self: NgxMaskApplierService,\n state: MaskHandlerState,\n params: MaskHandlerParams\n): MaskHandlerState {\n for (const entry of MASK_HANDLERS) {\n if (entry.match(state.maskExpression)) {\n const next = entry.handle.call(self, state, params);\n return entry.terminal ? next : genericPatternHandler.call(self, next, params);\n }\n }\n return genericPatternHandler.call(self, state, params);\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { DecimalMarkerChar, NgxMaskConfig } from './ngx-mask.config';\nimport { NGX_MASK_CONFIG } from './ngx-mask.config';\nimport { MaskExpression } from './ngx-mask-expression.enum';\nimport { dispatchMaskHandler } from './mask-handlers/mask-handlers.registry';\nimport type { MaskHandlerState } from './mask-handlers/mask-handler.types';\n\n@Injectable()\nexport class NgxMaskApplierService {\n protected _config = inject<NgxMaskConfig>(NGX_MASK_CONFIG);\n\n public dropSpecialCharacters: NgxMaskConfig['dropSpecialCharacters'] =\n this._config.dropSpecialCharacters;\n\n public hiddenInput: NgxMaskConfig['hiddenInput'] = this._config.hiddenInput;\n\n public clearIfNotMatch: NgxMaskConfig['clearIfNotMatch'] = this._config.clearIfNotMatch;\n\n public specialCharacters: NgxMaskConfig['specialCharacters'] = this._config.specialCharacters;\n\n public patterns: NgxMaskConfig['patterns'] = this._config.patterns;\n\n public prefix: NgxMaskConfig['prefix'] = this._config.prefix;\n\n public suffix: NgxMaskConfig['suffix'] = this._config.suffix;\n\n public thousandSeparator: NgxMaskConfig['thousandSeparator'] = this._config.thousandSeparator;\n\n public decimalMarker: NgxMaskConfig['decimalMarker'] = this._config.decimalMarker;\n\n public customPattern!: NgxMaskConfig['patterns'];\n\n public showMaskTyped: NgxMaskConfig['showMaskTyped'] = this._config.showMaskTyped;\n\n public placeHolderCharacter: NgxMaskConfig['placeHolderCharacter'] =\n this._config.placeHolderCharacter;\n\n public validation: NgxMaskConfig['validation'] = this._config.validation;\n\n public separatorLimit: NgxMaskConfig['separatorLimit'] = this._config.separatorLimit;\n\n public allowNegativeNumbers: NgxMaskConfig['allowNegativeNumbers'] =\n this._config.allowNegativeNumbers;\n\n public leadZeroDateTime: NgxMaskConfig['leadZeroDateTime'] = this._config.leadZeroDateTime;\n\n public leadZero: NgxMaskConfig['leadZero'] = this._config.leadZero;\n\n public typeFromDecimals: NgxMaskConfig['typeFromDecimals'] = this._config.typeFromDecimals;\n\n public apm: NgxMaskConfig['apm'] = this._config.apm;\n\n public inputTransformFn: NgxMaskConfig['inputTransformFn'] | null =\n this._config.inputTransformFn;\n\n public outputTransformFn: NgxMaskConfig['outputTransformFn'] | null =\n this._config.outputTransformFn;\n\n public keepCharacterPositions: NgxMaskConfig['keepCharacterPositions'] =\n this._config.keepCharacterPositions;\n\n public instantPrefix: NgxMaskConfig['instantPrefix'] = this._config.instantPrefix;\n\n public triggerOnMaskChange: NgxMaskConfig['triggerOnMaskChange'] =\n this._config.triggerOnMaskChange;\n\n protected _shift = new Set<number>();\n\n public plusOnePosition = false;\n\n public maskExpression = '';\n\n public actualValue = '';\n\n public showKeepCharacterExp = '';\n\n public shownMaskExpression: NgxMaskConfig['shownMaskExpression'] =\n this._config.shownMaskExpression;\n\n public deletedSpecialCharacter = false;\n\n /**\n * Whether we are currently in writeValue function, in this case when applying the mask we don't want to trigger onChange function,\n * since writeValue should be a one way only process of writing the DOM value based on the Angular model value.\n */\n public writingValue = false;\n\n public ipError?: boolean;\n\n public cpfCnpjError?: boolean;\n\n public applyMask(\n inputValue: string | object | boolean | null | undefined,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n cb: (actualShift: number, backspaceShift: boolean) => void = () => {}\n ): string {\n if (!maskExpression || typeof inputValue !== 'string') {\n return MaskExpression.EMPTY_STRING;\n }\n let cursor = 0;\n let result = '';\n const multi = false;\n let backspaceShift = false;\n let shift = 1;\n let stepBack = false;\n let processedValue = inputValue;\n let processedPosition = position;\n\n const startsWithPrefix = processedValue.slice(0, this.prefix.length) === this.prefix;\n // On paste with showMaskTyped, NgxMaskService.applyMask has already removed the\n // prefix via removeMask() before delegating here (unless the value consisted of\n // the prefix alone, in which case the raw value falls through). Stripping again\n // would eat leading characters that merely look like the prefix (#1551).\n const prefixAlreadyRemovedByCaller =\n justPasted &&\n this.showMaskTyped &&\n this.placeHolderCharacter.length === 1 &&\n !this.leadZeroDateTime &&\n processedValue !== this.prefix;\n\n if (startsWithPrefix && !prefixAlreadyRemovedByCaller) {\n processedValue = processedValue.slice(this.prefix.length);\n }\n if (!!this.suffix && processedValue.length > 0) {\n processedValue = this.checkAndRemoveSuffix(processedValue);\n }\n if (processedValue === '(' && this.prefix) {\n processedValue = '';\n }\n const inputArray: string[] = processedValue.toString().split(MaskExpression.EMPTY_STRING);\n if (\n this.allowNegativeNumbers &&\n processedValue.slice(cursor, cursor + 1) === MaskExpression.MINUS\n ) {\n result += processedValue.slice(cursor, cursor + 1);\n }\n const arr: string[] = [];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < processedValue.length; i++) {\n if (processedValue[i]?.match('\\\\d')) {\n arr.push(processedValue[i] ?? MaskExpression.EMPTY_STRING);\n }\n }\n\n // Per-mask-type dispatch (IP/CPF_CNPJ pre-processors → generic loop; PERCENT and\n // SEPARATOR terminal handlers; generic pattern loop as fallback). See\n // ./mask-handlers/mask-handlers.registry.ts.\n const state: MaskHandlerState = {\n processedValue,\n processedPosition,\n cursor,\n result,\n multi,\n backspaceShift,\n shift,\n stepBack,\n maskExpression,\n };\n const resolved = dispatchMaskHandler(this, state, {\n inputValue,\n position,\n justPasted,\n backspaced,\n cb,\n inputArray,\n arr,\n startsWithPrefix,\n prefixAlreadyRemovedByCaller,\n });\n if (typeof resolved.earlyReturn === 'string') {\n return resolved.earlyReturn;\n }\n processedValue = resolved.processedValue;\n processedPosition = resolved.processedPosition;\n cursor = resolved.cursor;\n result = resolved.result;\n backspaceShift = resolved.backspaceShift;\n shift = resolved.shift;\n stepBack = resolved.stepBack;\n // eslint-disable-next-line no-param-reassign\n maskExpression = resolved.maskExpression;\n if (\n result[processedPosition - 1] &&\n result.length + 1 === maskExpression.length &&\n this.specialCharacters.indexOf(\n maskExpression[maskExpression.length - 1] ?? MaskExpression.EMPTY_STRING\n ) !== -1\n ) {\n result += maskExpression[maskExpression.length - 1];\n }\n let newPosition: number = processedPosition + 1;\n\n while (this._shift.has(newPosition)) {\n shift++;\n newPosition++;\n }\n\n let actualShift: number =\n justPasted && !maskExpression.startsWith(MaskExpression.SEPARATOR)\n ? cursor\n : this._shift.has(processedPosition)\n ? shift\n : 0;\n if (stepBack) {\n actualShift--;\n }\n\n cb(actualShift, backspaceShift);\n if (shift < 0) {\n this._shift.clear();\n }\n let onlySpecial = false;\n if (backspaced) {\n onlySpecial = inputArray.every((char) => this.specialCharacters.includes(char));\n }\n\n let res = `${this.prefix}${onlySpecial ? MaskExpression.EMPTY_STRING : result}${\n this.showMaskTyped ? '' : this.suffix\n }`;\n\n if (result.length === 0) {\n res = this.instantPrefix ? `${this.prefix}${result}` : `${result}`;\n }\n\n const isSpecialCharacterMaskFirstSymbol =\n processedValue.length === 1 &&\n this.specialCharacters.includes(maskExpression[0] as string) &&\n processedValue !== maskExpression[0];\n\n if (isSpecialCharacterMaskFirstSymbol) {\n // The mask may start with several literal special characters in a row\n // (e.g. '+(000) 000-0000'). A single typed character must be checked\n // against the first PATTERN position of the mask, not literally against\n // index 1 — otherwise a valid digit is rejected and the leading literals\n // are never auto-filled (#1498).\n let firstPatternIndex = 1;\n while (\n firstPatternIndex < maskExpression.length &&\n this.specialCharacters.includes(maskExpression[firstPatternIndex] as string)\n ) {\n firstPatternIndex++;\n }\n if (\n !this._checkSymbolMask(\n processedValue,\n maskExpression[firstPatternIndex] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n return '';\n }\n }\n\n if (result.includes(MaskExpression.MINUS) && this.prefix && this.allowNegativeNumbers) {\n if (backspaced && result === MaskExpression.MINUS) {\n return '';\n }\n res = `${MaskExpression.MINUS}${this.prefix}${result\n .split(MaskExpression.MINUS)\n .join(MaskExpression.EMPTY_STRING)}${this.suffix}`;\n }\n return res;\n }\n\n public _findDropSpecialChar(inputSymbol: string): undefined | string {\n if (Array.isArray(this.dropSpecialCharacters)) {\n return this.dropSpecialCharacters.find((val: string) => val === inputSymbol);\n }\n return this._findSpecialChar(inputSymbol);\n }\n\n public _findSpecialChar(inputSymbol: string): undefined | string {\n return this.specialCharacters.find((val: string) => val === inputSymbol);\n }\n\n public _checkSymbolMask(inputSymbol: string, maskSymbol: string): boolean {\n this.patterns = this.customPattern ? this.customPattern : this.patterns;\n return (\n (this.patterns[maskSymbol]?.pattern &&\n this.patterns[maskSymbol]?.pattern.test(inputSymbol)) ??\n false\n );\n }\n\n protected _formatWithSeparators = (\n str: string,\n thousandSeparatorChar: string,\n decimalChars: string | string[],\n precision: number\n ) => {\n let x: string[];\n let decimalChar: string;\n\n if (Array.isArray(decimalChars)) {\n const regExp = new RegExp(\n decimalChars.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|')\n );\n x = str.split(regExp);\n decimalChar = str.match(regExp)?.[0] ?? MaskExpression.EMPTY_STRING;\n } else {\n x = str.split(decimalChars);\n decimalChar = decimalChars;\n }\n const decimals: string =\n x.length > 1 ? `${decimalChar}${x[1]}` : MaskExpression.EMPTY_STRING;\n let res: string = x[0] ?? MaskExpression.EMPTY_STRING;\n const separatorLimit: string = this.separatorLimit.replace(\n /\\s/g,\n MaskExpression.EMPTY_STRING\n );\n if (separatorLimit && +separatorLimit) {\n if (res[0] === MaskExpression.MINUS) {\n res = `-${res.slice(1, res.length).slice(0, separatorLimit.length)}`;\n } else {\n res = res.slice(0, separatorLimit.length);\n }\n }\n res = this._applyThousandGrouping(res, thousandSeparatorChar);\n\n if (typeof precision === 'undefined') {\n return res + decimals;\n } else if (precision === 0) {\n return res;\n }\n return res + decimals.substring(0, precision + 1);\n };\n\n /**\n * Formats a value for the `typeFromDecimals` mode: every digit of the raw value is\n * read as one integer that is then split `precision` digits from the right\n * (ATM/calculator style). Non-digit characters are ignored, so plain typing,\n * mid-string edits and backspace all reduce to \"digits shifted through the\n * decimal marker\".\n */\n protected _formatFromDecimals(value: string, precision: number, decimalMarker: string): string {\n const negative = this.allowNegativeNumbers && value.startsWith(MaskExpression.MINUS);\n let digits = value.replace(/\\D+/g, MaskExpression.EMPTY_STRING).replace(/^0+/, '');\n if (!digits) {\n return negative ? MaskExpression.MINUS : MaskExpression.EMPTY_STRING;\n }\n const separatorLimit: string = this.separatorLimit.replace(\n /\\s/g,\n MaskExpression.EMPTY_STRING\n );\n if (separatorLimit && +separatorLimit) {\n // Dropping the overflow from the right rejects the most recently typed\n // digits once the integer part has reached the configured limit.\n digits = digits.slice(0, separatorLimit.length + precision);\n }\n digits = digits.padStart(precision + 1, MaskExpression.NUMBER_ZERO);\n const integerPart = this._applyThousandGrouping(\n digits.slice(0, digits.length - precision),\n this.thousandSeparator\n );\n const decimalPart = digits.slice(digits.length - precision);\n return `${negative ? MaskExpression.MINUS : MaskExpression.EMPTY_STRING}${integerPart}${decimalMarker}${decimalPart}`;\n }\n\n /** Inserts `separator` between every 3-digit group of an integer-digit string. */\n private _applyThousandGrouping(digits: string, separator: string): string {\n const rgx = /(\\d+)(\\d{3})/;\n let grouped = digits;\n while (separator && rgx.test(grouped)) {\n grouped = grouped.replace(rgx, '$1' + separator + '$2');\n }\n return grouped;\n }\n\n protected percentage = (str: string): boolean => {\n const sanitizedStr = str.replace(',', '.');\n const value = Number(\n this.allowNegativeNumbers && str.includes(MaskExpression.MINUS)\n ? sanitizedStr.slice(1, str.length)\n : sanitizedStr\n );\n\n return !isNaN(value) && value >= 0 && value <= 100;\n };\n\n public getPrecision = (maskExpression: string): number => {\n const x: string[] = maskExpression.split(MaskExpression.DOT);\n if (x.length > 1) {\n return Number(x[x.length - 1]);\n }\n\n return Infinity;\n };\n\n private checkAndRemoveSuffix = (inputValue: string): string => {\n for (let i = this.suffix?.length - 1; i >= 0; i--) {\n const substr = this.suffix.substring(i, this.suffix?.length);\n if (\n inputValue.endsWith(substr) &&\n i !== this.suffix?.length - 1 &&\n // A partial suffix tail (i > 0) that makes up the WHOLE value is a\n // leftover of the displayed suffix only when the previous rendered\n // value ended with the suffix AND the edit shrank the value to (or\n // below) the old value-part length, i.e. it was a deletion of the\n // suffix head. Otherwise it is fresh user input that merely collides\n // with the suffix text and must be kept (#1495).\n (i === 0 ||\n inputValue.length > substr.length ||\n (this.actualValue.endsWith(this.suffix) &&\n inputValue.length <= this.actualValue.length - this.suffix.length)) &&\n (i - 1 < 0 ||\n !inputValue.endsWith(this.suffix.substring(i - 1, this.suffix?.length)))\n ) {\n return inputValue.slice(0, inputValue.length - substr.length);\n }\n }\n return inputValue;\n };\n\n protected checkInputPrecision = (inputValue: string, precision: number): string => {\n let processedInputValue = inputValue;\n\n if (precision < Infinity) {\n const decimalMarker = this._activeDecimalMarker(inputValue);\n const precisionRegEx = new RegExp(\n this._charToRegExpExpression(decimalMarker) + `\\\\d{${precision}}.*$`\n );\n const precisionMatch: RegExpMatchArray | null =\n processedInputValue.match(precisionRegEx);\n const precisionMatchLength: number = (precisionMatch && precisionMatch[0]?.length) ?? 0;\n if (precisionMatchLength - 1 > precision) {\n const diff = precisionMatchLength - 1 - precision;\n\n processedInputValue = processedInputValue.substring(\n 0,\n processedInputValue.length - diff\n );\n }\n if (\n precision === 0 &&\n this._compareOrIncludes(\n processedInputValue[processedInputValue.length - 1],\n decimalMarker,\n this.thousandSeparator\n )\n ) {\n processedInputValue = processedInputValue.substring(\n 0,\n processedInputValue.length - 1\n );\n }\n }\n return processedInputValue;\n };\n\n protected _stripToDecimal(str: string): string {\n const isDecimalMarkerChar = (char: string): char is DecimalMarkerChar =>\n char === MaskExpression.DOT || char === MaskExpression.COMMA;\n\n return str\n .split(MaskExpression.EMPTY_STRING)\n .filter((i: string, idx: number) => {\n const isDecimalMarker =\n typeof this.decimalMarker === 'string'\n ? i === this.decimalMarker\n : isDecimalMarkerChar(i) && this.decimalMarker.includes(i);\n return (\n i.match('^-?\\\\d') ||\n i === this.thousandSeparator ||\n isDecimalMarker ||\n (i === MaskExpression.MINUS && idx === 0 && this.allowNegativeNumbers)\n );\n })\n .join(MaskExpression.EMPTY_STRING);\n }\n\n protected _charToRegExpExpression(char: string): string {\n // if (Array.isArray(char)) {\n // \treturn char.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|');\n // }\n if (char) {\n const charsToEscape = '[\\\\^$.|?*+()';\n return char === ' ' ? '\\\\s' : charsToEscape.indexOf(char) >= 0 ? `\\\\${char}` : char;\n }\n return char;\n }\n\n protected _shiftStep(cursor: number) {\n this._shift.add(cursor + this.prefix.length || 0);\n }\n\n protected _compareOrIncludes<T>(value: T, comparedValue: T | T[], excludedValue: T): boolean {\n return Array.isArray(comparedValue)\n ? comparedValue.filter((v) => v !== excludedValue).includes(value)\n : value === comparedValue;\n }\n\n protected _validIP(valuesIP: string[]): boolean {\n return !(\n valuesIP.length === 4 &&\n !valuesIP.some((value: string, index: number) => {\n if (valuesIP.length !== index + 1) {\n return value === MaskExpression.EMPTY_STRING || Number(value) > 255;\n }\n return value === MaskExpression.EMPTY_STRING || Number(value.substring(0, 3)) > 255;\n })\n );\n }\n\n /**\n * The single rule for \"which decimal marker is active\": the configured marker, or — for an\n * array — the first configured marker present in `value` that is not the thousandSeparator,\n * else the first configured marker that is not the thousandSeparator (#1653).\n */\n protected _activeDecimalMarker(value: string): DecimalMarkerChar {\n if (!Array.isArray(this.decimalMarker)) {\n return this.decimalMarker;\n }\n const candidates = this.decimalMarker.filter((dm) => dm !== this.thousandSeparator);\n return (\n candidates.find((dm) => value.includes(dm)) ?? candidates[0] ?? this.decimalMarker[0]\n );\n }\n\n protected _splitPercentZero(value: string): string {\n if (value === MaskExpression.MINUS && this.allowNegativeNumbers) {\n return value;\n }\n const decimal = this._activeDecimalMarker(value);\n const decimalIndex = value.indexOf(decimal);\n const emptyOrMinus =\n this.allowNegativeNumbers && value.includes(MaskExpression.MINUS) ? '-' : '';\n if (decimalIndex === -1) {\n const parsedValue = parseInt(emptyOrMinus ? value.slice(1, value.length) : value, 10);\n return isNaN(parsedValue)\n ? MaskExpression.EMPTY_STRING\n : `${emptyOrMinus}${parsedValue}`;\n } else {\n const integerPart = parseInt(value.replace('-', '').substring(0, decimalIndex), 10);\n const decimalPart = value.substring(decimalIndex + 1);\n const integerString = isNaN(integerPart) ? '' : integerPart.toString();\n\n return integerString === MaskExpression.EMPTY_STRING\n ? MaskExpression.EMPTY_STRING\n : `${emptyOrMinus}${integerString}${decimal}${decimalPart}`;\n }\n }\n\n protected _findFirstNonZeroAndDecimalIndex(inputString: string, decimalMarker: '.' | ',') {\n let decimalMarkerIndex: number | null = null;\n let nonZeroIndex: number | null = null;\n\n for (let i = 0; i < inputString.length; i++) {\n const char = inputString[i];\n\n if (char === decimalMarker && decimalMarkerIndex === null) {\n decimalMarkerIndex = i;\n }\n\n if (char && char >= '1' && char <= '9' && nonZeroIndex === null) {\n nonZeroIndex = i;\n }\n\n if (decimalMarkerIndex !== null && nonZeroIndex !== null) {\n break;\n }\n }\n\n return {\n decimalMarkerIndex,\n nonZeroIndex,\n };\n }\n}\n","import { ElementRef, inject, Injectable, Renderer2, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport type { NgxMaskConfig } from './ngx-mask.config';\nimport { NGX_MASK_CONFIG } from './ngx-mask.config';\nimport { NgxMaskApplierService } from './ngx-mask-applier.service';\nimport { MaskExpression } from './ngx-mask-expression.enum';\n\n@Injectable()\nexport class NgxMaskService extends NgxMaskApplierService {\n public isNumberValue = false;\n public maskIsShown = '';\n public selStart: number | null = null;\n public selEnd: number | null = null;\n public maskChanged = false;\n public maskExpressionArray: string[] = [];\n public previousValue = '';\n public currentValue = '';\n // `writingValue` is declared on NgxMaskApplierService: applyMask needs it to\n // distinguish the writeValue flow from keystroke flows (#1611).\n public isInitialized = false;\n /**\n * Set by the directive's keepCharacterPositions handling for the current edit:\n * true — the directive fully resolved the resulting display value into actualValue,\n * so applyMask must short-circuit and render actualValue as-is;\n * false — the edit must flow through regular masking (no short-circuit);\n * null — the directive was not involved in this applyMask call (legacy behavior).\n * Consumed and reset by applyMask. This lets keepCharacterPositions work without\n * showMaskTyped (#1545, #1543).\n */\n public keepCharacterPositionsHandled: boolean | null = null;\n\n public _isFocused = signal<boolean>(false);\n\n private _emitValue = false;\n private _start!: number;\n private _end!: number;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onChange = (_: unknown) => {};\n\n public readonly _elementRef = inject(ElementRef, { optional: true });\n\n private readonly document = inject(DOCUMENT);\n\n protected override _config = inject<NgxMaskConfig>(NGX_MASK_CONFIG);\n\n private readonly _renderer = inject(Renderer2, { optional: true });\n\n /**\n * Applies the mask to the input value.\n * @param inputValue The input value to be masked.\n * @param maskExpression The mask expression to apply.\n * @param position The position in the input value.\n * @param justPasted Whether the value was just pasted.\n * @param backspaced Whether the value was backspaced.\n * @param cb Callback function.\n * @returns The masked value.\n */\n public override applyMask(\n inputValue: string,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n cb: (actualShift: number, backspaceShift: boolean) => void = () => {}\n ): string {\n // Consume the directive's keepCharacterPositions verdict for this edit (see the\n // keepCharacterPositionsHandled doc). Reset immediately so it never leaks into\n // applyMask calls that do not originate from the directive's input handling.\n const kcpHandled = this.keepCharacterPositionsHandled;\n this.keepCharacterPositionsHandled = null;\n\n // If no mask expression, return the input value or the actual value\n if (!maskExpression) {\n // A RECONFIGURATION to an empty mask (mask was non-empty, now swapped to '') must\n // revert the display/model to the raw unmasked value, not the stale masked\n // `actualValue` from the mask that no longer applies (#1616: mask signal set to ''\n // on a populated control left the masked display/FormControl unchanged forever,\n // since this early return short-circuited before the `maskChanged`/emit logic\n // below ever ran). Only strip when a mask genuinely changed — a directive with no\n // mask ever configured must keep returning verbatim `actualValue`/`inputValue`.\n if (this.maskChanged) {\n const rawValue = this.removeMask(inputValue);\n this.previousValue = this.currentValue;\n this.currentValue = rawValue;\n this.actualValue = rawValue;\n this._emitValue = this.previousValue !== this.currentValue;\n if (this._emitValue && this.triggerOnMaskChange) {\n this.formControlResult(rawValue);\n }\n if (!this.triggerOnMaskChange) {\n this.maskChanged = false;\n }\n return rawValue;\n }\n return inputValue !== this.actualValue ? this.actualValue : inputValue;\n }\n\n // #1492: a numeric FormControl value like 0.0000007 or 1e21 stringifies to\n // exponential notation ('7e-7'); separator masking would strip the 'e'/'-' and\n // render garbage ('77'). Expand scientific notation to plain decimal form before\n // masking. Covers writeValue-driven flows and the pipe; a keystroke value can\n // never match, since separator masking never lets a letter through.\n if (\n maskExpression.startsWith(MaskExpression.SEPARATOR) &&\n inputValue &&\n /\\d[eE][+-]?\\d/.test(inputValue)\n ) {\n const expandedNumber = Number(this._replaceDecimalMarkerToDot(inputValue));\n if (!Number.isNaN(expandedNumber)) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._toPlainDecimalString(expandedNumber);\n if (\n this.decimalMarker === MaskExpression.COMMA ||\n (Array.isArray(this.decimalMarker) &&\n this.thousandSeparator === MaskExpression.DOT)\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.replace(MaskExpression.DOT, MaskExpression.COMMA);\n }\n }\n }\n\n // Show mask in input if required\n this.maskIsShown = this.showMaskTyped\n ? this.showMaskInInput()\n : MaskExpression.EMPTY_STRING;\n\n // Handle specific mask expressions\n if (this.maskExpression === MaskExpression.IP && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || MaskExpression.HASH);\n }\n const isCpfCnpjMask =\n this.maskExpression === MaskExpression.CPF_CNPJ ||\n this.maskExpression === MaskExpression.CPF_CNPJ_ALPHA;\n if (isCpfCnpjMask && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || MaskExpression.HASH);\n }\n\n // Handle empty input value with mask typed\n if (!inputValue && this.showMaskTyped) {\n // #1590: only a USER-driven clear may propagate back to the model. When this\n // skeleton render originates from writeValue() (writingValue), emitting '' here\n // would be a view->model write inside a model->view sync — with nested CVA\n // wrappers the real initial value arrives in a LATER microtask than the initial\n // null write, and this echo overwrote it before it ever reached the view.\n if (!this.writingValue) {\n this.formControlResult(this.prefix);\n }\n return `${this.prefix}${this.maskIsShown}${this.suffix}`;\n }\n\n const getSymbol: string =\n !!inputValue && typeof this.selStart === 'number'\n ? (inputValue[this.selStart] ?? MaskExpression.EMPTY_STRING)\n : MaskExpression.EMPTY_STRING;\n let newInputValue = '';\n let newPosition = position;\n\n // Handle hidden input or input with asterisk symbol\n if (\n (this.hiddenInput ||\n (inputValue && inputValue.indexOf(MaskExpression.SYMBOL_STAR) >= 0)) &&\n !this.writingValue\n ) {\n // Seed from the raw input only when the user typed the FIRST character (the\n // single char is the raw symbol, actualValue is empty/stale). On backspace a\n // length-1 value is the remaining masked display (e.g. '*'), so the hidden\n // characters must come from actualValue or the deletion destroys both (#1612).\n let actualResult: string[] =\n inputValue && inputValue.length === 1 && !backspaced\n ? inputValue.split(MaskExpression.EMPTY_STRING)\n : this.actualValue.split(MaskExpression.EMPTY_STRING);\n\n // Handle backspace\n if (backspaced) {\n actualResult = actualResult\n .slice(0, position)\n .concat(actualResult.slice(position + 1));\n }\n\n // Remove mask if showMaskTyped is true\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n actualResult = this.removeMask(actualResult.join('')).split(\n MaskExpression.EMPTY_STRING\n );\n }\n\n // Handle selection start and end\n if (typeof this.selStart === 'object' && typeof this.selEnd === 'object') {\n this.selStart = Number(this.selStart);\n this.selEnd = Number(this.selEnd);\n } else {\n if (inputValue !== MaskExpression.EMPTY_STRING && actualResult.length) {\n if (typeof this.selStart === 'number' && typeof this.selEnd === 'number') {\n if (inputValue.length > actualResult.length) {\n actualResult.splice(this.selStart, 0, getSymbol);\n } else if (inputValue.length < actualResult.length) {\n if (actualResult.length - inputValue.length === 1) {\n if (backspaced) {\n actualResult.splice(this.selStart - 1, 1);\n } else {\n actualResult.splice(inputValue.length - 1, 1);\n }\n } else {\n actualResult.splice(this.selStart, this.selEnd - this.selStart);\n }\n }\n }\n } else {\n actualResult = [];\n }\n }\n\n // Handle actual value length\n if (this.actualValue.length) {\n if (actualResult.length < inputValue.length) {\n newInputValue = this.shiftTypedSymbols(\n actualResult.join(MaskExpression.EMPTY_STRING)\n );\n } else if (actualResult.length === inputValue.length) {\n newInputValue = actualResult.join(MaskExpression.EMPTY_STRING);\n } else {\n newInputValue = inputValue;\n }\n } else {\n newInputValue = inputValue;\n }\n }\n\n // Handle just pasted input\n if (justPasted && (this.hiddenInput || !this.hiddenInput)) {\n newInputValue = inputValue;\n }\n\n // Handle backspace with special characters\n if (\n backspaced &&\n this.specialCharacters.indexOf(\n this.maskExpression[newPosition] ?? MaskExpression.EMPTY_STRING\n ) !== -1 &&\n this.showMaskTyped &&\n !this.prefix\n ) {\n newInputValue = this.currentValue;\n }\n\n // Handle deleted special character\n if (this.deletedSpecialCharacter && newPosition) {\n if (\n this.specialCharacters.includes(\n this.actualValue.slice(newPosition, newPosition + 1)\n )\n ) {\n newPosition = newPosition + 1;\n } else if (\n maskExpression.slice(newPosition - 1, newPosition + 1) !== MaskExpression.MONTHS\n ) {\n newPosition = newPosition - 2;\n }\n\n this.deletedSpecialCharacter = false;\n }\n\n // Remove mask if showMaskTyped is true and placeHolderCharacter length is 1\n if (\n this.showMaskTyped &&\n this.placeHolderCharacter.length === 1 &&\n !this.leadZeroDateTime\n ) {\n newInputValue = this.removeMask(newInputValue);\n }\n\n // Handle mask changed\n if (this.maskChanged) {\n newInputValue = inputValue;\n } else {\n newInputValue =\n Boolean(newInputValue) && newInputValue.length ? newInputValue : inputValue;\n }\n\n // Handle keepCharacterPositions: when the directive resolved the display for this\n // edit (kcpHandled === true), or legacily whenever showMaskTyped is on and the\n // directive gave no explicit verdict, render actualValue as-is.\n if (\n (kcpHandled ?? this.showMaskTyped) &&\n this.keepCharacterPositions &&\n this.actualValue &&\n !justPasted &&\n !this.writingValue\n ) {\n const value = this.dropSpecialCharacters\n ? this.removeMask(this.actualValue)\n : this.actualValue;\n this.formControlResult(value);\n return this.actualValue\n ? this.actualValue\n : `${this.prefix}${this.maskIsShown}${this.suffix}`;\n }\n\n // Apply the mask using the parent class method\n const result: string = super.applyMask(\n newInputValue,\n maskExpression,\n newPosition,\n justPasted,\n backspaced,\n cb\n );\n\n // #1615: a value the mask cannot process AT ALL (masking leaves nothing of it) is\n // rendered verbatim instead of being destroyed, and must not reach formControlResult\n // — the empty remnant would clobber the model that holds the sentinel (e.g.\n // setValue('ONGOING') on a digits mask). Values that PARTIALLY match keep regular\n // masking. Two cases reach this:\n // 1. this.writingValue: the originating writeValue() call itself.\n // 2. currentValue === inputValue (and the mask didn't just change): a LATER re-render\n // replaying the exact same already-verbatim value outside of writeValue (e.g.\n // ngOnChanges re-running applyMask via the directive's _applyMask() when an\n // UNRELATED input like `disabled` changes) — without this, that pass would fall\n // through to regular masking, emit the empty result via onChange, and clobber the\n // model even though the DOM would still show the sentinel correctly.\n if (\n (this.writingValue || (!this.maskChanged && inputValue === this.currentValue)) &&\n inputValue &&\n !result &&\n this.removeMask(inputValue)\n ) {\n this.actualValue = inputValue;\n this.previousValue = this.currentValue;\n this.currentValue = inputValue;\n return inputValue;\n }\n\n this.actualValue = this.getActualValue(result);\n\n // handle some separator implications:\n // a.) adjust decimalMarker default (. -> ,) if thousandSeparator is a dot\n if (\n this.thousandSeparator === MaskExpression.DOT &&\n this.decimalMarker === MaskExpression.DOT\n ) {\n this.decimalMarker = MaskExpression.COMMA;\n }\n // b) remove decimal marker from list of special characters to mask\n if (\n this.maskExpression.startsWith(MaskExpression.SEPARATOR) &&\n this.dropSpecialCharacters === true\n ) {\n this.specialCharacters = this.specialCharacters.filter(\n (item: string) =>\n !this._compareOrIncludes(item, this.decimalMarker, this.thousandSeparator) //item !== this.decimalMarker, // !\n );\n }\n\n // Update previous and current values\n if (result || result === '') {\n this.previousValue = this.currentValue;\n this.currentValue = result;\n\n this._emitValue =\n this.previousValue !== this.currentValue ||\n (this.previousValue === this.currentValue && justPasted);\n }\n\n // Propagate the input value back to the Angular model\n // Only emit if:\n // 1. _emitValue is true (value changed), AND\n // 2. Either mask didn't change, OR triggerOnMaskChange is true\n const shouldEmit = this._emitValue && (!this.maskChanged || this.triggerOnMaskChange);\n if (shouldEmit) {\n this.formControlResult(result);\n }\n // Reset maskChanged flag even if we didn't emit\n if (this.maskChanged && !this.triggerOnMaskChange) {\n this.maskChanged = false;\n }\n\n // Handle hidden input and showMaskTyped\n if (!this.showMaskTyped || (this.showMaskTyped && this.hiddenInput)) {\n if (this.hiddenInput) {\n return `${this.hideInput(result, this.maskExpression)}${this.maskIsShown.slice(result.length)}`;\n }\n return result;\n }\n\n const resLen: number = result.length;\n const prefNmask = `${this.prefix}${this.maskIsShown}${this.suffix}`;\n\n // Handle specific mask expressions\n // NOTE: IP/CPF_CNPJ/CPF_CNPJ_ALPHA are checked via exact equality BEFORE the HOURS\n // substring check below, because MaskExpression.HOURS is the single character 'H' and\n // 'CPF_CNPJ_ALPHA' contains 'H' (from \"ALPHA\"), which previously caused CPF_CNPJ_ALPHA\n // to be misrouted into the HOURS branch instead of its own branch.\n if (\n this.maskExpression === MaskExpression.IP ||\n this.maskExpression === MaskExpression.CPF_CNPJ ||\n this.maskExpression === MaskExpression.CPF_CNPJ_ALPHA\n ) {\n return `${result}${prefNmask}`;\n } else if (this.maskExpression.includes(MaskExpression.HOURS)) {\n const countSkipedSymbol = this._numberSkipedSymbols(result);\n return `${result}${prefNmask.slice(resLen + countSkipedSymbol)}`;\n }\n\n return `${result}${prefNmask.slice(resLen)}`;\n }\n\n // get the number of characters that were shifted\n private _numberSkipedSymbols(value: string): number {\n const regex = /(^|\\D)(\\d\\D)/g;\n let match = regex.exec(value);\n let countSkipedSymbol = 0;\n while (match != null) {\n countSkipedSymbol += 1;\n match = regex.exec(value);\n }\n return countSkipedSymbol;\n }\n\n public applyValueChanges(\n position: number,\n justPasted: boolean,\n backspaced: boolean,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n cb: (actualShift: number, backspaceShift: boolean) => void = () => {}\n ): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n\n formElement.value = this.applyMask(\n formElement.value,\n this.maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n if (formElement === this._getActiveElement()) {\n return;\n }\n this.clearIfNotMatchFn();\n }\n\n public hideInput(inputValue: string, maskExpression: string): string {\n return inputValue\n .split(MaskExpression.EMPTY_STRING)\n .map((curr: string, index: number) => {\n const maskChar = maskExpression[index] ?? MaskExpression.EMPTY_STRING;\n const pattern = this.patterns?.[maskChar];\n if (pattern?.symbol) {\n return pattern.symbol;\n }\n // #1574: a '0' immediately following a concealed DAY/MONTH token\n // is that field's second digit (d0/M0) — conceal it too so the\n // whole 2-digit field is hidden, not just its first character.\n // Display-only: does not touch maskExpression/processedValue, so\n // date validation/leadZero clamping in generic-pattern.handler.ts\n // is unaffected.\n const prevMaskChar = maskExpression[index - 1];\n const prevPattern = prevMaskChar ? this.patterns?.[prevMaskChar] : null;\n if (\n maskChar === MaskExpression.NUMBER_ZERO &&\n (prevMaskChar === MaskExpression.DAY ||\n prevMaskChar === MaskExpression.MONTH) &&\n prevPattern?.symbol\n ) {\n return prevPattern.symbol;\n }\n return curr;\n })\n .join(MaskExpression.EMPTY_STRING);\n }\n\n // this function is not necessary, it checks result against maskExpression\n public getActualValue(res: string): string {\n const compare: string[] = res\n .split(MaskExpression.EMPTY_STRING)\n .filter((symbol: string, i: number) => {\n const maskChar = this.maskExpression[i] ?? MaskExpression.EMPTY_STRING;\n return (\n this._checkSymbolMask(symbol, maskChar) ||\n (this.specialCharacters.includes(maskChar) && symbol === maskChar)\n );\n });\n if (compare.join(MaskExpression.EMPTY_STRING) === res) {\n return compare.join(MaskExpression.EMPTY_STRING);\n }\n return res;\n }\n\n public shiftTypedSymbols(inputValue: string): string {\n let symbolToReplace = '';\n const newInputValue: (string | undefined)[] =\n (inputValue &&\n inputValue\n .split(MaskExpression.EMPTY_STRING)\n .map((currSymbol: string, index: number) => {\n if (\n this.specialCharacters.includes(\n inputValue[index + 1] ?? MaskExpression.EMPTY_STRING\n ) &&\n inputValue[index + 1] !== this.maskExpression[index + 1]\n ) {\n symbolToReplace = currSymbol;\n return inputValue[index + 1];\n }\n if (symbolToReplace.length) {\n const replaceSymbol: string = symbolToReplace;\n symbolToReplace = MaskExpression.EMPTY_STRING;\n return replaceSymbol;\n }\n return currSymbol;\n })) ||\n [];\n return newInputValue.join(MaskExpression.EMPTY_STRING);\n }\n\n /**\n * Convert number value to string\n * 3.1415 -> '3.1415'\n * 1e-7 -> '0.0000001'\n */\n public numberToString(value: number | string): string {\n if (\n (!value && value !== 0) ||\n (this.maskExpression.startsWith(MaskExpression.SEPARATOR) &&\n (this.leadZero || !this.dropSpecialCharacters)) ||\n (this.maskExpression.startsWith(MaskExpression.SEPARATOR) &&\n this.separatorLimit.length > 14 &&\n String(value).length > 14)\n ) {\n return String(value);\n }\n // #1573: toLocaleString('fullwide', ...) is NOT locale-independent — 'fullwide' is\n // not a real locale tag, so Intl silently falls back to the runtime DEFAULT locale\n // (e.g. de-AT on Edge with Austrian regional format emits '0,5'). Expand exponential\n // notation with pure string math instead; the decimal marker is always '.'.\n return this._toPlainDecimalString(Number(value));\n }\n\n /**\n * Locale-independent replacement for toLocaleString('fullwide', { useGrouping: false,\n * maximumFractionDigits: 20 }) (#1573): expands exponential notation ('7e-7', '1e+21')\n * to plain decimal form using '.' as decimal marker, regardless of the runtime locale.\n */\n private _toPlainDecimalString(value: number): string {\n const stringValue = String(value);\n const match = /^(-?)(\\d+)(?:\\.(\\d+))?[eE]([+-]?\\d+)$/.exec(stringValue);\n if (!match) {\n return stringValue;\n }\n const [, sign, integerPart, fractionPart = '', exponentPart] = match;\n const exponent = Number(exponentPart);\n const digits = `${integerPart}${fractionPart}`;\n const pointIndex = (integerPart as string).length + exponent;\n if (pointIndex <= 0) {\n return `${sign}0.${'0'.repeat(-pointIndex)}${digits}`;\n }\n if (pointIndex >= digits.length) {\n return `${sign}${digits}${'0'.repeat(pointIndex - digits.length)}`;\n }\n return `${sign}${digits.slice(0, pointIndex)}.${digits.slice(pointIndex)}`;\n }\n\n public showMaskInInput(inputVal?: string): string {\n if (this.showMaskTyped && !!this.shownMaskExpression) {\n if (this.maskExpression.length !== this.shownMaskExpression.length) {\n throw new Error('Mask expression must match mask placeholder length');\n } else {\n return this.shownMaskExpression;\n }\n } else if (this.showMaskTyped) {\n if (inputVal) {\n if (this.maskExpression === MaskExpression.IP) {\n return this._checkForIp(inputVal);\n }\n if (\n this.maskExpression === MaskExpression.CPF_CNPJ ||\n this.maskExpression === MaskExpression.CPF_CNPJ_ALPHA\n ) {\n return this._checkForCpfCnpj(inputVal);\n }\n }\n if (this.placeHolderCharacter.length === this.maskExpression.length) {\n return this.placeHolderCharacter;\n }\n return this.maskExpression.replace(/\\w/g, this.placeHolderCharacter);\n }\n return '';\n }\n\n public clearIfNotMatchFn(): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n if (\n this.clearIfNotMatch &&\n this.prefix.length + this.maskExpression.length + this.suffix.length !==\n formElement.value.replace(this.placeHolderCharacter, MaskExpression.EMPTY_STRING)\n .length\n ) {\n this.formElementProperty = ['value', MaskExpression.EMPTY_STRING];\n this.applyMask('', this.maskExpression);\n }\n }\n\n public set formElementProperty([name, value]: [string, string | boolean]) {\n if (!this._renderer || !this._elementRef) {\n return;\n }\n // Use queueMicrotask to defer DOM updates to next microtask.\n // This prevents ExpressionChangedAfterItHasBeenCheckedError\n // and ensures proper timing with Angular's change detection.\n queueMicrotask(() => {\n this._renderer?.setProperty(this._elementRef?.nativeElement, name, value);\n });\n }\n\n public checkDropSpecialCharAmount(mask: string): number {\n const chars: string[] = mask\n .split(MaskExpression.EMPTY_STRING)\n .filter((item: string) => this._findDropSpecialChar(item));\n return chars.length;\n }\n\n public removeMask(inputValue: string): string {\n return this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.specialCharacters.concat('_').concat(this.placeHolderCharacter)\n );\n }\n\n private _checkForIp(inputVal: string): string {\n if (inputVal === MaskExpression.HASH) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n const arr: string[] = [];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? MaskExpression.EMPTY_STRING;\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 3 && arr.length <= 6) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 6 && arr.length <= 9) {\n return this.placeHolderCharacter;\n }\n if (arr.length > 9 && arr.length <= 12) {\n return '';\n }\n return '';\n }\n\n private _checkForCpfCnpj(inputVal: string): string {\n const cpf =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n const cnpj =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `/${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n\n if (inputVal === MaskExpression.HASH) {\n return cpf;\n }\n\n const isCpfCnpjAlpha = this.maskExpression === MaskExpression.CPF_CNPJ_ALPHA;\n const hasAnyLetter = /[a-zA-Z]/.test(inputVal);\n const arr = this._countCpfCnpjTypedChars(inputVal, isCpfCnpjAlpha);\n if (isCpfCnpjAlpha && hasAnyLetter) {\n // CNPJ_ALPHA shape is \"AA.AAA.AAA/AAAA-00\": separators fall after the 2nd, 5th,\n // 8th and 12th typed character, so the placeholder slice offset must account for\n // however many separators `result` has already passed through, mirroring the\n // numeric CPF/CNPJ bucketed offsets below.\n if (arr.length <= 2) {\n return cnpj.slice(arr.length, cnpj.length);\n }\n if (arr.length > 2 && arr.length <= 5) {\n return cnpj.slice(arr.length + 1, cnpj.length);\n }\n if (arr.length > 5 && arr.length <= 8) {\n return cnpj.slice(arr.length + 2, cnpj.length);\n }\n if (arr.length > 8 && arr.length <= 12) {\n return cnpj.slice(arr.length + 3, cnpj.length);\n }\n return cnpj.slice(arr.length + 4, cnpj.length);\n } else {\n if (arr.length <= 3) {\n return cpf.slice(arr.length, cpf.length);\n }\n if (arr.length > 3 && arr.length <= 6) {\n return cpf.slice(arr.length + 1, cpf.length);\n }\n if (arr.length > 6 && arr.length <= 9) {\n return cpf.slice(arr.length + 2, cpf.length);\n }\n if (arr.length > 9 && arr.length < 11) {\n return cpf.slice(arr.length + 3, cpf.length);\n }\n }\n if (arr.length === 11) {\n return '';\n }\n if (arr.length === 12) {\n if (inputVal.length === 17) {\n return cnpj.slice(16, cnpj.length);\n }\n return cnpj.slice(15, cnpj.length);\n }\n if (arr.length > 12 && arr.length <= 14) {\n return cnpj.slice(arr.length + 4, cnpj.length);\n }\n return '';\n }\n\n /** Collects the characters counted as \"typed\" for CPF/CNPJ progress tracking: digits only\n * for the numeric mask, alphanumerics for CPF_CNPJ_ALPHA. */\n private _countCpfCnpjTypedChars(inputVal: string, isCpfCnpjAlpha: boolean): string[] {\n const arr: string[] = [];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? MaskExpression.EMPTY_STRING;\n if (!value) {\n continue;\n }\n if (isCpfCnpjAlpha ? value.match('[a-zA-Z0-9]') : value.match('\\\\d')) {\n arr.push(value);\n }\n }\n return arr;\n }\n\n /**\n * Recursively determine the current active element by navigating the Shadow DOM until the Active Element is found.\n */\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n /**\n * Propogates the input value back to the Angular model by triggering the onChange function. It won't do this if writingValue\n * is true. If that is true it means we are currently in the writeValue function, which is supposed to only update the actual\n * DOM element based on the Angular model value. It should be a one way process, i.e. writeValue should not be modifying the Angular\n * model value too. Therefore, we don't trigger onChange in this scenario.\n * @param inputValue the current form input value\n */\n public formControlResult(inputValue: string): void {\n const outputTransformFn = this.outputTransformFn\n ? this.outputTransformFn\n : (v: unknown) => v;\n\n this.writingValue = false;\n this.maskChanged = false;\n\n if (!this.isInitialized && this._emitValue) {\n return;\n }\n\n // #1519: a non-special placeHolderCharacter (e.g. 'X') is never something the user\n // typed — it's the showMaskTyped fill character for unfilled slots — so it must never\n // reach the model, regardless of dropSpecialCharacters. The default '_' placeholder is\n // already covered by specialCharacters/removeMask; a custom single-char placeholder\n // that isn't a special character is not, since none of the branches below include it\n // in their removal set.\n if (\n this.showMaskTyped &&\n this.placeHolderCharacter.length === 1 &&\n this.specialCharacters.indexOf(this.placeHolderCharacter) === -1\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue\n .split(this.placeHolderCharacter)\n .join(MaskExpression.EMPTY_STRING);\n }\n\n if (Array.isArray(this.dropSpecialCharacters)) {\n this.onChange(\n outputTransformFn(\n this._toNumber(\n this._checkSymbols(\n this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.dropSpecialCharacters\n )\n )\n )\n )\n );\n } else if (\n this.dropSpecialCharacters ||\n (!this.dropSpecialCharacters && this.prefix === inputValue)\n ) {\n this.onChange(\n outputTransformFn(\n this._toNumber(\n this._checkSymbols(this._removeSuffix(this._removePrefix(inputValue)))\n )\n )\n );\n } else {\n this.onChange(outputTransformFn(this._toNumber(inputValue)));\n }\n }\n\n private _toNumber(value: string | number | undefined | null) {\n if (!this.isNumberValue || value === MaskExpression.EMPTY_STRING) {\n return value;\n }\n if (\n this.maskExpression.startsWith(MaskExpression.SEPARATOR) &&\n (this.leadZero || !this.dropSpecialCharacters)\n ) {\n return value;\n }\n\n if (String(value).length > 14 && this.maskExpression.startsWith(MaskExpression.SEPARATOR)) {\n return String(value);\n }\n\n const num = Number(value);\n if (this.maskExpression.startsWith(MaskExpression.SEPARATOR) && Number.isNaN(num)) {\n const val = String(value).replace(',', '.');\n return Number(val);\n }\n\n return Number.isNaN(num) ? value : num;\n }\n\n private _removeMask(value: string, specialCharactersForRemove: string[]): string {\n if (\n this.maskExpression.startsWith(MaskExpression.PERCENT) &&\n (value.includes(MaskExpression.DOT) ||\n (Array.isArray(this.decimalMarker) &&\n value.includes(MaskExpression.COMMA) &&\n this._activeDecimalMarker(value) === MaskExpression.COMMA))\n ) {\n return value;\n }\n\n return value\n ? value.replace(\n this._regExpForRemove(specialCharactersForRemove),\n MaskExpression.EMPTY_STRING\n )\n : value;\n }\n\n private _removePrefix(value: string): string {\n if (!this.prefix) {\n return value;\n }\n return value ? value.replace(this.prefix, MaskExpression.EMPTY_STRING) : value;\n }\n\n private _removeSuffix(value: string): string {\n if (!this.suffix) {\n return value;\n }\n return value ? value.replace(this.suffix, MaskExpression.EMPTY_STRING) : value;\n }\n\n private _retrieveSeparatorValue(result: string): string {\n let specialCharacters = Array.isArray(this.dropSpecialCharacters)\n ? this.specialCharacters.filter((v) => {\n return (this.dropSpecialCharacters as string[]).includes(v);\n })\n : this.specialCharacters;\n if (\n !this.deletedSpecialCharacter &&\n this._checkPatternForSpace() &&\n result.includes(MaskExpression.WHITE_SPACE) &&\n this.maskExpression.includes(MaskExpression.SYMBOL_STAR)\n ) {\n specialCharacters = specialCharacters.filter(\n (char) => char !== MaskExpression.WHITE_SPACE\n );\n }\n\n return this._removeMask(result, specialCharacters as string[]);\n }\n\n private _regExpForRemove(specialCharactersForRemove: string[]): RegExp {\n return new RegExp(\n specialCharactersForRemove\n .map((item: string) => {\n // Only escape characters that have special meaning in regex\n if (/[.*+?^${}()|[\\]\\\\/-]/.test(item)) {\n return `\\\\${item}`;\n }\n return item;\n })\n .join('|'),\n 'gi'\n );\n }\n\n private _replaceDecimalMarkerToDot(value: string): string {\n const markers = Array.isArray(this.decimalMarker)\n ? this.decimalMarker\n : [this.decimalMarker];\n\n return value.replace(this._regExpForRemove(markers), MaskExpression.DOT);\n }\n\n public _checkSymbols(result: string): string | number | undefined | null {\n let processedResult = result;\n\n if (processedResult === MaskExpression.EMPTY_STRING) {\n return processedResult;\n }\n\n if (\n this.maskExpression.startsWith(MaskExpression.PERCENT) &&\n this._activeDecimalMarker(processedResult) === MaskExpression.COMMA\n ) {\n processedResult = processedResult.replace(MaskExpression.COMMA, MaskExpression.DOT);\n }\n const separatorPrecision: number | null = this._retrieveSeparatorPrecision(\n this.maskExpression\n );\n\n const separatorValue: string =\n this.specialCharacters.length === 0\n ? this._retrieveSeparatorValue(processedResult)\n : this._replaceDecimalMarkerToDot(this._retrieveSeparatorValue(processedResult));\n\n if (!this.isNumberValue) {\n return separatorValue;\n }\n if (separatorPrecision) {\n if (processedResult === this.decimalMarker) {\n return null;\n }\n if (separatorValue.length > 14) {\n return String(separatorValue);\n }\n return this._checkPrecision(this.maskExpression, separatorValue);\n } else {\n return separatorValue;\n }\n }\n\n private _checkPatternForSpace(): boolean {\n for (const key in this.patterns) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.patterns[key] && this.patterns[key]?.hasOwnProperty('pattern')) {\n const patternString = this.patterns[key]?.pattern.toString();\n const pattern = this.patterns[key]?.pattern;\n if (\n (patternString?.includes(MaskExpression.WHITE_SPACE) as boolean) &&\n pattern?.test(this.maskExpression)\n ) {\n return true;\n }\n }\n }\n return false;\n }\n private _retrieveSeparatorPrecision(maskExpression: string): number | null {\n const matcher: RegExpMatchArray | null = maskExpression.match(\n new RegExp(`^separator\\\\.([^d]*)`)\n );\n return matcher ? Number(matcher[1]) : null;\n }\n\n public _checkPrecision(separatorExpression: string, separatorValue: string): number | string {\n const separatorPrecision = this.getPrecision(separatorExpression);\n let value = separatorValue;\n\n if (\n (separatorExpression.indexOf('2') > 0 && !this._isFocused()) ||\n (this.leadZero &&\n !this._isFocused() &&\n Number(separatorPrecision) > 0 &&\n Number.isFinite(separatorPrecision))\n ) {\n if (this.decimalMarker === MaskExpression.COMMA && this.leadZero) {\n value = value.replace(',', '.');\n }\n const precision = this.leadZero ? Number(separatorPrecision) : 2;\n // #1567: Number(value).toFixed() corrupts values with more significant digits\n // than an IEEE-754 double can hold (e.g. '999999999999999.99' becomes\n // '1000000000000000.00'). Round such values textually instead; safe-range\n // values keep the original toFixed() semantics.\n if (this._exceedsDoublePrecision(value)) {\n return this._stringToFixed(value, precision);\n }\n return Number(value).toFixed(precision);\n }\n return this.numberToString(value);\n }\n\n /**\n * True when the plain decimal string carries more significant digits than an IEEE-754\n * double can represent exactly (15 is the guaranteed round-trip digit count), meaning a\n * Number() round-trip would corrupt it (#1567).\n */\n private _exceedsDoublePrecision(value: string): boolean {\n if (!/^-?\\d+(\\.\\d+)?$/.test(value)) {\n return false;\n }\n const significantDigits = value.replace(/\\D/g, '').replace(/^0+/, '');\n return significantDigits.length > 15;\n }\n\n /**\n * Exact string-based equivalent of Number.prototype.toFixed (round half away from zero)\n * for plain decimal strings beyond double precision (#1567).\n */\n private _stringToFixed(value: string, precision: number): string {\n const isNegative = value.startsWith(MaskExpression.MINUS);\n const absValue = isNegative ? value.slice(1) : value;\n const [integerPart = '0', fractionPart = ''] = absValue.split(MaskExpression.DOT);\n const paddedFraction = fractionPart.padEnd(precision + 1, '0');\n const keptFraction = paddedFraction.slice(0, precision);\n const shouldRoundUp = (paddedFraction.charCodeAt(precision) || 0) >= 53; // '5'\n let scaled = BigInt(integerPart + keptFraction);\n if (shouldRoundUp) {\n scaled += 1n;\n }\n const digits = scaled.toString().padStart(precision + 1, '0');\n const sign = isNegative && scaled > 0n ? MaskExpression.MINUS : '';\n return precision > 0\n ? `${sign}${digits.slice(0, -precision)}.${digits.slice(-precision)}`\n : `${sign}${digits}`;\n }\n\n public _repeatPatternSymbols(maskExp: string): string {\n return (\n (maskExp.match(/{[0-9]+}/) &&\n maskExp\n .split(MaskExpression.EMPTY_STRING)\n .reduce((accum: string, currVal: string, index: number): string => {\n this._start =\n currVal === MaskExpression.CURLY_BRACKETS_LEFT ? index : this._start;\n if (currVal !== MaskExpression.CURLY_BRACKETS_RIGHT) {\n return this._findSpecialChar(currVal) ? accum + currVal : accum;\n }\n this._end = index;\n const repeatNumber = Number(maskExp.slice(this._start + 1, this._end));\n const replaceWith: string = new Array(repeatNumber + 1).join(\n maskExp[this._start - 1]\n );\n if (\n maskExp.slice(0, this._start).length > 1 &&\n maskExp.includes(MaskExpression.LETTER_S)\n ) {\n const symbols = maskExp.slice(0, this._start - 1);\n return symbols.includes(MaskExpression.CURLY_BRACKETS_LEFT)\n ? accum + replaceWith\n : symbols + accum + replaceWith;\n } else {\n return accum + replaceWith;\n }\n }, '')) ||\n maskExp\n );\n }\n\n /**\n * Decimal marker of the value being normalized in writeValue/pipe flows.\n *\n * #1573: this used to return the RUNTIME default locale's decimal marker\n * ((1.1).toLocaleString().substring(1, 2)), which made mask behavior depend on the\n * OS/browser regional format: under a comma-decimal locale (e.g. Edge + Austrian\n * regional settings) a preformatted value like '10,000' (thousandSeparator ',')\n * had its ',' replaced by the configured '.' decimalMarker, corrupting the value\n * 1000x. JS number stringification (String(n)) always uses '.', and string values\n * are expected to use the configured markers — the runtime locale is never the\n * right source, so this is always '.'.\n */\n public currentLocaleDecimalMarker(): string {\n return MaskExpression.DOT;\n }\n}\n","import type { EnvironmentProviders, Provider } from '@angular/core';\nimport { inject, makeEnvironmentProviders } from '@angular/core';\n\nimport type { NgxMaskOptions } from './ngx-mask.config';\nimport { NGX_MASK_CONFIG, INITIAL_CONFIG, initialConfig, NEW_CONFIG } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n/**\n * @internal\n */\nfunction _configFactory(): NgxMaskOptions {\n const initConfig = inject<NgxMaskOptions>(INITIAL_CONFIG);\n const configValue = inject<NgxMaskOptions | (() => NgxMaskOptions)>(NEW_CONFIG);\n\n return configValue instanceof Function\n ? { ...initConfig, ...configValue() }\n : { ...initConfig, ...configValue };\n}\n\nexport function provideNgxMask(configValue?: NgxMaskOptions | (() => NgxMaskOptions)): Provider[] {\n return [\n {\n provide: NEW_CONFIG,\n useValue: configValue,\n },\n {\n provide: INITIAL_CONFIG,\n useValue: initialConfig,\n },\n {\n provide: NGX_MASK_CONFIG,\n useFactory: _configFactory,\n },\n NgxMaskService,\n ];\n}\n\nexport function provideEnvironmentNgxMask(\n configValue?: NgxMaskOptions | (() => NgxMaskOptions)\n): EnvironmentProviders {\n return makeEnvironmentProviders(provideNgxMask(configValue));\n}\n","import { DOCUMENT } from '@angular/common';\nimport type { OnChanges, SimpleChanges } from '@angular/core';\nimport {\n Injector,\n signal,\n input,\n output,\n model,\n effect,\n Directive,\n HostListener,\n inject,\n untracked,\n booleanAttribute,\n ChangeDetectorRef,\n ElementRef,\n Renderer2,\n} from '@angular/core';\nimport type {\n ControlValueAccessor,\n FormControl,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\nimport { NgControl } from '@angular/forms';\nimport { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport type { FormValueControl } from '@angular/forms/signals';\n\nimport type { NgxMaskConfig } from './ngx-mask.config';\nimport { NGX_MASK_CONFIG, resolveMaskAlias, timeMasks, withoutValidation } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\nimport { MaskExpression } from './ngx-mask-expression.enum';\n\n// #1488: a date/time field located within `maskExpression` for the generalized\n// caret-shift-past-separator fix (see `_findDateTimeFieldAt`/`_isFieldOverflowing`).\ntype DateTimeField = {\n token: 'd' | 'M' | 'H' | 'h' | 'm' | 's';\n start: number; // index of the field's first char in maskExpression\n end: number; // index one past the field's digit run (start of separator/next field)\n};\n\n@Directive({\n selector: 'input[mask], textarea[mask]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n NgxMaskService,\n ],\n exportAs: 'mask,ngxMask',\n})\nexport class NgxMaskDirective\n implements\n ControlValueAccessor,\n OnChanges,\n Validator,\n FormValueControl<string | number | null | undefined>\n{\n // ===== Mask Configuration Inputs =====\n public mask = input<string | undefined | null>('');\n public specialCharacters = input<NgxMaskConfig['specialCharacters']>([]);\n public patterns = input<NgxMaskConfig['patterns']>({});\n public prefix = input<NgxMaskConfig['prefix']>('');\n public suffix = input<NgxMaskConfig['suffix']>('');\n public thousandSeparator = input<NgxMaskConfig['thousandSeparator']>(' ');\n public decimalMarker = input<NgxMaskConfig['decimalMarker']>('.');\n public dropSpecialCharacters = input<NgxMaskConfig['dropSpecialCharacters'] | null>(null);\n public hiddenInput = input<NgxMaskConfig['hiddenInput'] | null>(null);\n public showMaskTyped = input<NgxMaskConfig['showMaskTyped'] | null>(null);\n public placeHolderCharacter = input<NgxMaskConfig['placeHolderCharacter'] | null>(null);\n public shownMaskExpression = input<NgxMaskConfig['shownMaskExpression'] | null>(null);\n public clearIfNotMatch = input<NgxMaskConfig['clearIfNotMatch'] | null>(null);\n public validation = input<NgxMaskConfig['validation'] | null>(null);\n public separatorLimit = input<NgxMaskConfig['separatorLimit'] | null>('');\n public typeFromDecimals = input<NgxMaskConfig['typeFromDecimals'] | null>(null);\n public allowNegativeNumbers = input<NgxMaskConfig['allowNegativeNumbers'] | null>(null);\n public leadZeroDateTime = input<NgxMaskConfig['leadZeroDateTime'] | null>(null);\n public leadZero = input<NgxMaskConfig['leadZero'] | null>(null);\n public triggerOnMaskChange = input<NgxMaskConfig['triggerOnMaskChange'] | null>(null);\n public apm = input<NgxMaskConfig['apm'] | null>(null);\n public inputTransformFn = input<NgxMaskConfig['inputTransformFn'] | null>(null);\n public outputTransformFn = input<NgxMaskConfig['outputTransformFn'] | null>(null);\n public keepCharacterPositions = input<NgxMaskConfig['keepCharacterPositions'] | null>(null);\n public instantPrefix = input<NgxMaskConfig['instantPrefix'] | null>(null);\n // Read directly at blur time (signal is always current) and falls back to the DI\n // config, so no ngOnChanges mirroring into the service is needed (#1435).\n public defaultValueOnBlur = input<NgxMaskConfig['defaultValueOnBlur']>(null);\n\n /**\n * Signal Forms `FormValueControl` surface. At runtime `FormField` never drives this model\n * when the directive is bound (it prefers the `NG_VALUE_ACCESSOR` provided above, see\n * `_isCvaMode`), but the template type-checker treats any directive owning a `value` model\n * as the field's custom control and checks the bound field's value type against it (#1640).\n * The model therefore accepts exactly what `writeValue()` accepts — `string | number | null |\n * undefined` — so numeric and nullable fields (`signal({ amount: 0 })`,\n * `signal<number | null>(null)`, `signal<string | null>(null)`) compile under\n * `strictTemplates`. Values pushed back into the model are always the unmasked string (see\n * `_propagateToValueModel`), i.e. `value()` / `valueChange` are declared wider than what is\n * emitted.\n */\n public value = model<string | number | null | undefined>('');\n public disabled = input(false, { transform: booleanAttribute });\n public touched = model<boolean>(false);\n\n public maskFilled = output<void>();\n\n private _maskValue = signal<string>('');\n private _inputValue = signal<string>('');\n private _position = signal<number | null>(null);\n private _code = signal<string>('');\n private _maskExpressionArray = signal<string[]>([]);\n private _justPasted = signal<boolean>(false);\n private _isFocused = signal<boolean>(false);\n /** For IME composition event */\n private _isComposing = signal<boolean>(false);\n /**\n * True once Angular has driven this directive through the `ControlValueAccessor` contract\n * (`registerOnChange`). NOTE: Signal Forms' `FormField` ALSO takes this path — it prefers a\n * host-provided `NG_VALUE_ACCESSOR` over the custom-control `value` model binding (see\n * `FormField.ɵngControlCreate`), so it calls `registerOnChange`/`writeValue` too and this\n * flag is `true` in both modes. That is fine: with the flag set, the `value`-model effect\n * below is a no-op and all rendering goes through `writeValue()`. The `value` model is only\n * driven directly (flag stays `false`) when the directive is used standalone with a\n * `[(value)]` binding and no forms integration.\n */\n private _isCvaMode = signal<boolean>(false);\n /** Guards against the value effect echoing back a value we just propagated ourselves. */\n private _skipNextValueEffect = signal<boolean>(false);\n /**\n * The exact stringified value last pushed through `onChange` (view → model). Signal Forms'\n * `FormField` echoes every model update back through `writeValue()` — including updates that\n * originated from the view. Re-masking that unmasked echo is at best a redundant re-render\n * and at worst destructive for masks whose unmasked form is ambiguous (e.g. IP:\n * '192168178' cannot reconstruct the typed dots of '192.168.1.78'). `writeValue()` consumes\n * this marker to skip exactly that echo. `null` = no pending propagation.\n */\n private _lastPropagatedValue: string | null = null;\n /**\n * True once the first `ngOnChanges` pass has applied the mask configuration to the service.\n * Signal Forms' `FormField` syncs its field value through the template `ɵɵcontrol` update\n * instruction, which runs BEFORE the sibling directives' first `ngOnChanges` on the same\n * element — so the very first `writeValue()` would otherwise see an unconfigured service\n * (empty `maskExpression`, default `leadZero`/`thousandSeparator`/...) and render the raw\n * value. Until this flag is set, `writeValue()` stashes the incoming value and `ngOnChanges`\n * replays it once the configuration is in place.\n */\n private _configApplied = false;\n private _pendingInitialValue: unknown;\n private _hasPendingInitialValue = false;\n /**\n * True once the `disabled` input has ever delivered `true`. The disabled effect's very\n * first run fires with the input's default `false` even when nothing binds `[disabled]`.\n * Because effects run after Angular Forms' `setUpControl` (which calls\n * `setDisabledState(true)` for initially-disabled controls) and both DOM writes are\n * queueMicrotask-deferred in FIFO order, forwarding that default `false` would land last\n * and re-enable an initially-disabled control (#1607, #1614). An initial `false` write is\n * never needed — inputs are enabled by default — so `false` is only forwarded after the\n * input has explicitly driven the state to `true` at least once.\n */\n private _disabledEverSet = false;\n /** Ensures the multi-character placeHolderCharacter warning (#1347) is emitted only once. */\n private _warnedAboutMultiCharPlaceholder = false;\n\n public _maskService = inject(NgxMaskService, { self: true });\n private readonly document = inject(DOCUMENT);\n protected _config = inject<NgxMaskConfig>(NGX_MASK_CONFIG);\n /**\n * Under zoneless change detection, writing to the underlying FormControl programmatically\n * (e.g. `setValue`/`patchValue` from outside a signal/effect context, or from a callback\n * zone.js used to auto-flush like `requestAnimationFrame`/`queueMicrotask`) does not itself\n * trigger a CD run. Bindings that read `form.pristine`/`form.dirty`/`form.value` on the host\n * template need an explicit `markForCheck()` once the directive finishes reacting to a\n * programmatic value write, otherwise the view stays stale until something else schedules CD.\n */\n private readonly _changeDetectorRef = inject(ChangeDetectorRef);\n private readonly _elementRef = inject<ElementRef<HTMLInputElement>>(ElementRef);\n private readonly _renderer = inject(Renderer2);\n\n // Injector is used to lazily resolve NgControl. NgControl cannot be injected directly:\n // this directive is registered as the control's NG_VALUE_ACCESSOR, so a direct\n // inject(NgControl) would form a circular dependency. Resolving it lazily on first use\n // (after the control graph is wired) sidesteps the cycle.\n private readonly _injector = inject(Injector);\n\n private _ngControl: NgControl | null | undefined;\n\n private _resolveNgControl(): NgControl | null {\n if (typeof this._ngControl === 'undefined') {\n this._ngControl = this._injector.get(NgControl, null);\n }\n return this._ngControl;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onChange = (_: unknown) => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onTouch = () => {};\n\n public constructor() {\n // Default onChange used in Signal Forms mode, where Angular never calls registerOnChange.\n // It pushes the unmasked value into the `value` model so the `valueChange` output fires.\n // registerOnChange() overrides this to additionally invoke Angular's CVA callback.\n this._maskService.onChange = this.onChange = (value: unknown) => {\n this._propagateToValueModel(value);\n };\n\n // Signal Forms drives the `value` model input directly (custom-control mode).\n // In classic CVA mode `writeValue` handles rendering instead, so this effect is a no-op\n // there. We skip the pass immediately following our own onChange propagation to avoid\n // clobbering the raw `_inputValue` with the masked value echoed back from the model.\n effect(() => {\n const signalValue = this.value();\n untracked(() => {\n if (this._isCvaMode()) {\n return;\n }\n if (this._skipNextValueEffect()) {\n this._skipNextValueEffect.set(false);\n return;\n }\n if (String(signalValue) !== String(this._inputValue())) {\n this.writeValue(signalValue);\n }\n });\n });\n\n effect(() => {\n const isDisabled = this.disabled();\n untracked(() => {\n // Never force-enable on the default `false`: it would clobber Angular Forms'\n // own setDisabledState(true) for initially-disabled controls (see\n // _disabledEverSet). `false` is forwarded only after an explicit `true`.\n if (!isDisabled && !this._disabledEverSet) {\n return;\n }\n this._disabledEverSet = true;\n this.setDisabledState(isDisabled);\n });\n });\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n const {\n mask,\n specialCharacters,\n patterns,\n prefix,\n suffix,\n thousandSeparator,\n decimalMarker,\n dropSpecialCharacters,\n hiddenInput,\n showMaskTyped,\n placeHolderCharacter,\n shownMaskExpression,\n clearIfNotMatch,\n validation,\n separatorLimit,\n typeFromDecimals,\n allowNegativeNumbers,\n leadZeroDateTime,\n leadZero,\n triggerOnMaskChange,\n apm,\n inputTransformFn,\n outputTransformFn,\n keepCharacterPositions,\n instantPrefix,\n } = changes;\n if (mask) {\n if (mask.currentValue !== mask.previousValue && !mask.firstChange) {\n this._maskService.maskChanged = true;\n }\n // User-defined aliases (config maskAliases) expand BEFORE any other processing,\n // including the `||` multi-mask split — an alias may expand to a multi-mask.\n const resolvedMask = this._resolvedMaskInput();\n const maskParts = resolvedMask.split(MaskExpression.OR);\n if (maskParts.length > 1) {\n this._maskExpressionArray.set(\n maskParts.sort((a: string, b: string) => a.length - b.length)\n );\n this._setMask();\n } else {\n this._maskExpressionArray.set([]);\n this._maskValue.set(resolvedMask);\n this._maskService.maskExpression = this._maskValue();\n }\n }\n if (specialCharacters) {\n if (Array.isArray(specialCharacters.currentValue)) {\n this._maskService.specialCharacters = specialCharacters.currentValue;\n }\n // A non-array value (e.g. null from an unset dynamic config) keeps the current\n // service value (config defaults) and must not abort the whole ngOnChanges pass,\n // otherwise sibling inputs changed in the same cycle would be silently ignored (#1512).\n }\n if (allowNegativeNumbers) {\n this._maskService.allowNegativeNumbers = allowNegativeNumbers.currentValue;\n if (this._maskService.allowNegativeNumbers) {\n this._maskService.specialCharacters = this._maskService.specialCharacters.filter(\n (c: string) => c !== MaskExpression.MINUS\n );\n }\n }\n // Only overwrite the mask available patterns if a pattern has actually been passed in\n if (patterns && patterns.currentValue) {\n this._maskService.patterns = patterns.currentValue;\n }\n if (apm && apm.currentValue) {\n this._maskService.apm = apm.currentValue;\n }\n\n if (instantPrefix) {\n this._maskService.instantPrefix = instantPrefix.currentValue;\n }\n if (prefix) {\n this._maskService.prefix = prefix.currentValue;\n }\n if (suffix) {\n this._maskService.suffix = suffix.currentValue;\n }\n if (thousandSeparator) {\n this._maskService.thousandSeparator = thousandSeparator.currentValue;\n if (thousandSeparator.previousValue && thousandSeparator.currentValue) {\n const previousDecimalMarker = this._maskService.decimalMarker;\n\n if (thousandSeparator.currentValue === this._maskService.decimalMarker) {\n this._maskService.decimalMarker =\n thousandSeparator.currentValue === MaskExpression.COMMA\n ? MaskExpression.DOT\n : MaskExpression.COMMA;\n }\n if (this._maskService.dropSpecialCharacters === true) {\n this._maskService.specialCharacters = this._config.specialCharacters;\n }\n if (\n typeof previousDecimalMarker === 'string' &&\n typeof this._maskService.decimalMarker === 'string'\n ) {\n this._inputValue.set(\n this._inputValue()\n .split(thousandSeparator.previousValue)\n .join('')\n .replace(previousDecimalMarker, this._maskService.decimalMarker)\n );\n this._maskService.actualValue = this._inputValue();\n }\n this._maskService.writingValue = true;\n }\n }\n if (decimalMarker) {\n this._maskService.decimalMarker = decimalMarker.currentValue;\n }\n if (dropSpecialCharacters) {\n this._maskService.dropSpecialCharacters = dropSpecialCharacters.currentValue;\n }\n if (hiddenInput) {\n this._maskService.hiddenInput = hiddenInput.currentValue;\n if (hiddenInput.previousValue === true && hiddenInput.currentValue === false) {\n this._inputValue.set(this._maskService.actualValue);\n }\n }\n if (showMaskTyped) {\n this._maskService.showMaskTyped = showMaskTyped.currentValue;\n if (\n showMaskTyped.previousValue === false &&\n showMaskTyped.currentValue === true &&\n this._isFocused()\n ) {\n requestAnimationFrame(() => {\n this._maskService._elementRef?.nativeElement.click();\n });\n }\n }\n if (placeHolderCharacter) {\n // `null`/`undefined` means \"no custom placeholder\" (#1643): fall back to the default\n // instead of storing null, which broke every `.length` read on the service.\n this._maskService.placeHolderCharacter =\n placeHolderCharacter.currentValue ?? this._config.placeHolderCharacter;\n if (\n typeof placeHolderCharacter.currentValue === 'string' &&\n placeHolderCharacter.currentValue.length > 1 &&\n !this._warnedAboutMultiCharPlaceholder\n ) {\n this._warnedAboutMultiCharPlaceholder = true;\n // eslint-disable-next-line no-console\n console.warn(\n 'Ngx-mask: placeHolderCharacter should be a single character; behavior with multi-character values is undefined (e.g. keepCharacterPositions will not work). Current value:',\n placeHolderCharacter.currentValue\n );\n }\n }\n if (shownMaskExpression) {\n this._maskService.shownMaskExpression = shownMaskExpression.currentValue;\n }\n if (clearIfNotMatch) {\n this._maskService.clearIfNotMatch = clearIfNotMatch.currentValue;\n }\n if (validation) {\n this._maskService.validation = validation.currentValue;\n }\n if (separatorLimit) {\n this._maskService.separatorLimit = separatorLimit.currentValue;\n }\n if (typeFromDecimals) {\n this._maskService.typeFromDecimals = typeFromDecimals.currentValue;\n }\n if (leadZeroDateTime) {\n this._maskService.leadZeroDateTime = leadZeroDateTime.currentValue;\n }\n if (leadZero) {\n this._maskService.leadZero = leadZero.currentValue;\n }\n if (triggerOnMaskChange) {\n this._maskService.triggerOnMaskChange = triggerOnMaskChange.currentValue;\n }\n if (inputTransformFn) {\n this._maskService.inputTransformFn = inputTransformFn.currentValue;\n }\n if (outputTransformFn) {\n this._maskService.outputTransformFn = outputTransformFn.currentValue;\n }\n if (keepCharacterPositions) {\n this._maskService.keepCharacterPositions = keepCharacterPositions.currentValue;\n }\n this._applyMask();\n if (!this._configApplied) {\n this._configApplied = true;\n if (this._hasPendingInitialValue) {\n // Replay the writeValue() call that arrived before this first ngOnChanges pass\n // (see _configApplied) now that the mask configuration is applied.\n this._hasPendingInitialValue = false;\n const pendingValue = this._pendingInitialValue;\n this._pendingInitialValue = null;\n this.writeValue(pendingValue);\n }\n }\n }\n\n public validate({ value }: FormControl): ValidationErrors | null {\n const processedValue: string = typeof value === 'number' ? String(value) : value;\n const maskValue = this._maskValue();\n\n if (!this._maskService.validation || !maskValue) {\n return null;\n }\n if (this._maskService.ipError) {\n return this._createValidationError(processedValue);\n }\n if (this._maskService.cpfCnpjError) {\n return this._createValidationError(processedValue);\n }\n if (maskValue.startsWith(MaskExpression.SEPARATOR)) {\n return null;\n }\n if (withoutValidation.includes(maskValue)) {\n return null;\n }\n if (this._maskService.clearIfNotMatch) {\n return null;\n }\n if (timeMasks.includes(maskValue)) {\n return this._validateTime(processedValue);\n }\n if (maskValue === MaskExpression.EMAIL_MASK) {\n const emailPattern = /^[^@]+@[^@]+\\.[^@]+$/;\n\n if (!emailPattern.test(processedValue) && processedValue) {\n return this._createValidationError(processedValue);\n } else {\n return null;\n }\n }\n if (processedValue && processedValue.length >= 1) {\n let counterOfOpt = 0;\n\n if (\n maskValue.includes(MaskExpression.CURLY_BRACKETS_LEFT) &&\n maskValue.includes(MaskExpression.CURLY_BRACKETS_RIGHT)\n ) {\n const lengthInsideCurlyBrackets = maskValue.slice(\n maskValue.indexOf(MaskExpression.CURLY_BRACKETS_LEFT) + 1,\n maskValue.indexOf(MaskExpression.CURLY_BRACKETS_RIGHT)\n );\n\n return lengthInsideCurlyBrackets === String(processedValue.length)\n ? null\n : this._createValidationError(processedValue);\n }\n if (maskValue.startsWith(MaskExpression.PERCENT)) {\n return null;\n }\n for (const key in this._maskService.patterns) {\n if (this._maskService.patterns[key]?.optional) {\n if (maskValue.indexOf(key) !== maskValue.lastIndexOf(key)) {\n const opt: string = maskValue\n .split(MaskExpression.EMPTY_STRING)\n .filter((i: string) => i === key)\n .join(MaskExpression.EMPTY_STRING);\n counterOfOpt += opt.length;\n } else if (maskValue.indexOf(key) !== -1) {\n counterOfOpt++;\n }\n const firstOptionalIndex = maskValue.indexOf(key);\n if (firstOptionalIndex !== -1 && processedValue.length >= firstOptionalIndex) {\n // #1515: the early \"everything before the first optional token is\n // filled\" return is only sound for trailing-optional layouts. When a\n // mandatory token follows the first optional one (e.g. `999SSS`,\n // indexOf === 0) it used to mark EVERY value as valid.\n const hasMandatoryAfterOptional = maskValue\n .slice(firstOptionalIndex)\n .split(MaskExpression.EMPTY_STRING)\n .some(\n (symbol: string) =>\n !!this._maskService.patterns[symbol] &&\n !this._maskService.patterns[symbol]?.optional\n );\n if (!hasMandatoryAfterOptional) {\n return null;\n }\n if (!this.prefix() && !this.suffix() && this._isPlainTokenMask(maskValue)) {\n // Position-aware check: match the value against the mask allowing\n // optional tokens to be skipped; every mandatory token must be\n // consumed (catches `12a` for `999SSS`, which a pure length\n // check cannot).\n return this._matchesMaskWithOptionalSkip(processedValue, maskValue)\n ? null\n : this._createValidationError(processedValue);\n }\n // Non-plain masks (prefix/suffix, exotic symbols) fall through to the\n // legacy length check below (`maskValue.length - counterOfOpt`).\n }\n if (counterOfOpt === maskValue.length) {\n return null;\n }\n }\n }\n if (\n (maskValue.indexOf(MaskExpression.SYMBOL_STAR) > 1 &&\n processedValue.length < maskValue.indexOf(MaskExpression.SYMBOL_STAR)) ||\n (maskValue.indexOf(MaskExpression.SYMBOL_QUESTION) > 1 &&\n processedValue.length < maskValue.indexOf(MaskExpression.SYMBOL_QUESTION))\n ) {\n return this._createValidationError(processedValue);\n }\n if (\n maskValue.indexOf(MaskExpression.SYMBOL_STAR) === -1 ||\n maskValue.indexOf(MaskExpression.SYMBOL_QUESTION) === -1\n ) {\n const array = maskValue.split('*');\n const length: number = this._maskService.dropSpecialCharacters\n ? maskValue.length -\n this._maskService.checkDropSpecialCharAmount(maskValue) -\n counterOfOpt\n : this.prefix()\n ? maskValue.length + this.prefix().length - counterOfOpt\n : maskValue.length - counterOfOpt;\n\n if (array.length === 1) {\n if (processedValue.length < length) {\n // #1583: for `||` multi-masks, a value shorter than the selected\n // alternative can still be complete: it must stop exactly at a\n // special-character boundary of the selected alternative and satisfy\n // the length requirement of another (shorter) alternative.\n if (this._isCompleteAlternativeBoundary(processedValue)) {\n return null;\n }\n return this._createValidationError(processedValue);\n }\n }\n if (array.length > 1) {\n const lastIndexArray = array[array.length - 1];\n if (\n lastIndexArray &&\n this._maskService.specialCharacters.includes(lastIndexArray[0] as string) &&\n String(processedValue).includes(lastIndexArray[0] ?? '') &&\n !this.dropSpecialCharacters()\n ) {\n const special = value.split(lastIndexArray[0]);\n return special[special.length - 1].length === lastIndexArray.length - 1\n ? null\n : this._createValidationError(processedValue);\n } else if (\n ((lastIndexArray &&\n !this._maskService.specialCharacters.includes(\n lastIndexArray[0] as string\n )) ||\n !lastIndexArray ||\n this._maskService.dropSpecialCharacters) &&\n processedValue.length >= length - 1\n ) {\n return null;\n } else {\n return this._createValidationError(processedValue);\n }\n }\n }\n if (\n maskValue.indexOf(MaskExpression.SYMBOL_STAR) === 1 ||\n maskValue.indexOf(MaskExpression.SYMBOL_QUESTION) === 1\n ) {\n return null;\n }\n }\n if (value) {\n this.maskFilled.emit();\n return null;\n }\n return null;\n }\n\n @HostListener('paste')\n public onPaste() {\n this._justPasted.set(true);\n }\n\n @HostListener('focus')\n public onFocus(): void {\n this._isFocused.set(true);\n this._maskService._isFocused.set(true);\n }\n\n @HostListener('ngModelChange', ['$event'])\n public onModelChange(value: unknown): void {\n // on form reset we need to update the actualValue\n if (\n (value === MaskExpression.EMPTY_STRING ||\n value === null ||\n typeof value === 'undefined') &&\n this._maskService.actualValue\n ) {\n this._maskService.actualValue = this._maskService.getActualValue(\n MaskExpression.EMPTY_STRING\n );\n }\n }\n\n @HostListener('input', ['$event'])\n public onInput(e: Event): void {\n this._maskService.isInitialized = true;\n // Android IMEs report every keydown as key 'Unidentified' / keyCode 229, so a\n // backspace is undetectable from keydown alone and all _code()-based deletion\n // branches misfire (cursor jumps, \"stuck\" backspace — #1497). The input event's\n // inputType is the reliable source: derive the deletion code from it.\n const inputType: string | undefined = (e as InputEvent).inputType;\n if (inputType === 'deleteContentBackward') {\n this._code.set(MaskExpression.BACKSPACE);\n } else if (inputType === 'deleteContentForward') {\n this._code.set(MaskExpression.DELETE);\n } else if (\n inputType &&\n (this._code() === MaskExpression.BACKSPACE || this._code() === MaskExpression.DELETE)\n ) {\n // A non-delete edit that produced no meaningful keydown (IME insertion,\n // context-menu paste): clear the stale deletion code so the edit is not\n // processed as a backspace.\n this._code.set(inputType);\n }\n // If IME is composing text, we wait for the composed text — but only when the mask\n // can actually accept letters. Purely numeric masks gain nothing from composition,\n // and some Android IMEs (Samsung Keyboard) deliver every keystroke as\n // insertCompositionText without firing compositionend until blur, which would leave\n // the FormControl stale for the whole edit (#1293).\n if (this._isComposing() && this._maskAcceptsLetterInput()) {\n return;\n }\n const el: HTMLInputElement = (e as InputEvent).target as HTMLInputElement;\n\n const transformedValue = this._maskService.inputTransformFn\n ? this._maskService.inputTransformFn(el.value)\n : el.value;\n\n if (el.type !== 'number') {\n if (typeof transformedValue === 'string' || typeof transformedValue === 'number') {\n const transformedString = transformedValue.toString();\n // Only rewrite el.value when the transform actually changed it: any\n // programmatic `.value =` assignment clears the browser's \"last changed\n // by a user edit\" flag, which silently disables native constraint\n // validation (minlength -> validity.tooShort) even when the mask is a\n // no-op (#1379). With an empty mask the directive must stay a pure\n // passthrough for the native input.\n if (el.value !== transformedString) {\n el.value = transformedString;\n }\n\n this._inputValue.set(el.value);\n this._setMask();\n\n if (!this._maskValue()) {\n this.onChange(el.value);\n return;\n }\n\n // On paste of a raw value that does not yet carry the prefix, the caret\n // position reported by the element is prefix.length short of where it must\n // land once applyMask prepends the prefix (#1571). Captured here because the\n // applyValueChanges callback below resets the _justPasted flag.\n const pastedValueWithoutPrefix =\n this._justPasted() &&\n !!this._maskService.prefix &&\n !el.value.startsWith(this._maskService.prefix);\n\n let position: number =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n\n if (\n this.keepCharacterPositions() &&\n this._maskService.placeHolderCharacter.length === 1 &&\n !this._justPasted()\n ) {\n const suffix = this.suffix();\n const prefix = this.prefix();\n const inputSymbol = el.value.slice(position - 1, position);\n const prefixLength = prefix.length;\n const showMaskTyped = this.showMaskTyped();\n const maskExpression = this._maskService.maskExpression;\n // Placeholder skeleton of the mask (special chars kept, fillable slots\n // replaced by the placeholder character). With showMaskTyped the service\n // renders it as maskIsShown; without showMaskTyped it is derived locally so\n // keepCharacterPositions works on its own (#1545, #1543).\n const maskSkeleton: string = this._maskService.maskIsShown.length\n ? this._maskService.maskIsShown\n : maskExpression.replace(/\\w/g, this._maskService.placeHolderCharacter);\n\n const hasSelection: boolean =\n this._maskService.selStart !== this._maskService.selEnd;\n const selStartAbs = Number(this._maskService.selStart);\n const selEndAbs = Number(this._maskService.selEnd);\n const selStart = selStartAbs - prefixLength;\n const selEnd = selEndAbs - prefixLength;\n\n const backspaceOrDelete =\n this._code() === MaskExpression.BACKSPACE ||\n this._code() === MaskExpression.DELETE;\n\n // Whether this block fully resolved the resulting display value into\n // this._maskService.actualValue. When true, applyMask short-circuits and\n // renders actualValue as-is; when false the edit flows through regular\n // masking (e.g. appending at the end, or clearing the whole value).\n let kcpHandled = true;\n\n if (backspaceOrDelete) {\n if (hasSelection) {\n const preEditLength = el.value.length + (selEndAbs - selStartAbs);\n if (\n !showMaskTyped &&\n selStartAbs <= prefixLength &&\n selEndAbs >= preEditLength\n ) {\n // The whole value was selected and deleted: clear through the\n // regular path instead of showing a placeholder skeleton.\n kcpHandled = false;\n } else if (this._maskService.selStart === prefixLength) {\n this._maskService.actualValue = `${prefix}${maskSkeleton.slice(0, selEnd)}${this._inputValue().split(prefix).join('')}`;\n } else if (\n this._maskService.selStart ===\n maskSkeleton.length + prefixLength\n ) {\n this._maskService.actualValue = `${this._inputValue()}${maskSkeleton.slice(selStart, selEnd)}`;\n } else {\n this._maskService.actualValue = `${prefix}${this._inputValue()\n .split(prefix)\n .join('')\n .slice(\n 0,\n selStart\n )}${maskSkeleton.slice(selStart, selEnd)}${this._maskService.actualValue.slice(\n selEnd + prefixLength,\n maskSkeleton.length + prefixLength\n )}${suffix}`;\n }\n } else if (\n !this._maskService.specialCharacters.includes(\n maskExpression.slice(\n position - prefixLength,\n position + 1 - prefixLength\n )\n )\n ) {\n if (!showMaskTyped && position >= el.value.length) {\n // Deleting the last character: no gap needs to be kept.\n kcpHandled = false;\n } else if (selStart === 1 && prefix) {\n this._maskService.actualValue = `${prefix}${this._maskService.placeHolderCharacter}${el.value\n .split(prefix)\n .join('')\n .split(suffix)\n .join('')}${suffix}`;\n\n position = position - 1;\n } else {\n const part1 = el.value.substring(0, position);\n const part2 = el.value.substring(position);\n this._maskService.actualValue = `${part1}${this._maskService.placeHolderCharacter}${part2}`;\n }\n }\n position = this._code() === MaskExpression.DELETE ? position + 1 : position;\n } else if (hasSelection) {\n // A selected range was replaced by the typed symbol. Keep the layout:\n // blank the selection to the mask skeleton and put the typed symbol\n // into the first fillable slot of the selection (#1527, #1489).\n const preEditLength = el.value.length - 1 + (selEndAbs - selStartAbs);\n if (\n !showMaskTyped &&\n selStartAbs <= prefixLength &&\n selEndAbs >= preEditLength\n ) {\n // The whole value was replaced: mask it through the regular path.\n kcpHandled = false;\n } else {\n let maskIdx = Math.max(selStart, 0);\n while (\n maskIdx < maskExpression.length &&\n this._maskService.specialCharacters.includes(\n maskExpression[maskIdx] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n maskIdx += 1;\n }\n const blanked = `${el.value.slice(0, selStartAbs)}${maskSkeleton.slice(\n Math.max(selStart, 0),\n selEnd\n )}${el.value.slice(selStartAbs + 1)}`;\n const targetAbs = maskIdx + prefixLength;\n if (\n targetAbs < blanked.length - suffix.length &&\n this._maskService._checkSymbolMask(\n inputSymbol,\n maskExpression[maskIdx] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n this._maskService.actualValue = `${blanked.slice(0, targetAbs)}${inputSymbol}${blanked.slice(targetAbs + 1)}`;\n position = targetAbs + 1;\n } else {\n this._maskService.actualValue = blanked;\n position = selStartAbs;\n }\n }\n } else {\n // Single-caret insert (overwrite mode): the typed symbol lands in the\n // first fillable mask slot at or after the caret, skipping any number\n // of special characters (#1544, #1489).\n const oldDisplay = `${el.value.slice(0, position - 1)}${el.value.slice(position)}`;\n const oldDisplayNoSuffix = suffix\n ? oldDisplay.split(suffix).join('')\n : oldDisplay;\n let maskIdx = position - 1 - prefixLength;\n if (maskIdx < 0) {\n // Typed inside the prefix: reject the symbol.\n position = position - 1;\n } else {\n while (\n maskIdx < maskExpression.length &&\n this._maskService.specialCharacters.includes(\n maskExpression[maskIdx] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n maskIdx += 1;\n }\n const targetAbs = maskIdx + prefixLength;\n if (targetAbs >= oldDisplayNoSuffix.length) {\n if (oldDisplayNoSuffix.length <= prefixLength || !showMaskTyped) {\n // First symbol, or appending at the end without\n // showMaskTyped: regular masking handles it (including\n // leadZeroDateTime insertions).\n kcpHandled = false;\n } else {\n // All slots of the rendered mask are already consumed.\n position = position - 1;\n }\n } else if (\n this._maskService._checkSymbolMask(\n inputSymbol,\n maskExpression[maskIdx] ?? MaskExpression.EMPTY_STRING\n )\n ) {\n this._maskService.actualValue = `${oldDisplayNoSuffix.slice(0, targetAbs)}${inputSymbol}${oldDisplayNoSuffix.slice(targetAbs + 1)}${suffix}`;\n position = targetAbs + 1;\n } else {\n // Rejected symbol: keep the current display.\n position = position - 1;\n }\n }\n }\n this._maskService.keepCharacterPositionsHandled = kcpHandled;\n }\n\n // A literal '*' typed into the VALUE (custom pattern allowing asterisks) makes\n // the service's applyMask take its hiddenInput shadow-value branch, whose\n // equal/shorter-length cases restore the stale pre-edit actualValue and discard\n // a selection replacement (#1504). Without hiddenInput there is no shadow state\n // to preserve, so drop it and let the edited value flow through regular masking.\n if (\n !this._maskService.hiddenInput &&\n !this._maskService.showMaskTyped &&\n !this.keepCharacterPositions() &&\n this._maskService.selStart !== this._maskService.selEnd &&\n el.value.includes(MaskExpression.SYMBOL_STAR)\n ) {\n this._maskService.actualValue = MaskExpression.EMPTY_STRING;\n }\n\n let caretShift = 0;\n let backspaceShift = false;\n if (this._code() === MaskExpression.DELETE && MaskExpression.SEPARATOR) {\n this._maskService.deletedSpecialCharacter = true;\n }\n if (\n this._inputValue().length >= this._maskService.maskExpression.length - 1 &&\n this._code() !== MaskExpression.BACKSPACE &&\n this._maskService.maskExpression === MaskExpression.DAYS_MONTHS_YEARS &&\n position < 10\n ) {\n const inputSymbol = this._inputValue().slice(position - 1, position);\n el.value =\n this._inputValue().slice(0, position - 1) +\n inputSymbol +\n this._inputValue().slice(position + 1);\n }\n // #1488: generalizes the single-mask (d0/M0/0000) caret-shift-past-separator\n // fix to any date/time field. Locates the date/time field containing\n // `position` by scanning maskExpression for a DAY/MONTH/HOURS/HOUR/MINUTE/\n // SECOND token followed by its digit run, then checks overflow against the\n // same per-field thresholds generic-pattern.handler.ts already establishes\n // (day 31, month 12, hour 23/12 w/ apm, minute/second 59). Read-only against\n // generic-pattern.handler.ts — mirrors its thresholds, does not import from it.\n if (this.leadZeroDateTime()) {\n const field = this._findDateTimeFieldAt(\n this._maskService.maskExpression,\n position\n );\n if (\n field &&\n this._isFieldOverflowing(\n field,\n position,\n el.value,\n this._inputValue(),\n !!this.apm()\n )\n ) {\n position = position + 2;\n }\n }\n if (\n this._maskService.maskExpression === MaskExpression.HOURS_MINUTES_SECONDS &&\n this.apm()\n ) {\n if (this._justPasted() && el.value.slice(0, 2) === MaskExpression.DOUBLE_ZERO) {\n el.value = el.value.slice(1, 2) + el.value.slice(2, el.value.length);\n }\n el.value =\n el.value === MaskExpression.DOUBLE_ZERO\n ? MaskExpression.NUMBER_ZERO\n : el.value;\n }\n\n this._maskService.applyValueChanges(\n position,\n this._justPasted(),\n this._code() === MaskExpression.BACKSPACE ||\n this._code() === MaskExpression.DELETE,\n (shift: number, _backspaceShift: boolean) => {\n this._justPasted.set(false);\n caretShift = shift;\n backspaceShift = _backspaceShift;\n }\n );\n // only set the selection if the element is active\n if (this._getActiveElement() !== el) {\n return;\n }\n\n if (this._maskService.plusOnePosition) {\n position = position + 1;\n this._maskService.plusOnePosition = false;\n }\n // update position after applyValueChanges to prevent cursor on wrong position when it has an array of maskExpression\n if (this._maskExpressionArray().length) {\n if (this._code() === MaskExpression.BACKSPACE) {\n const specialChartMinusOne = this.specialCharacters().includes(\n this._maskService.actualValue.slice(position - 1, position)\n );\n const allowFewMaskChangeMask =\n this._maskService.removeMask(this._inputValue())?.length ===\n this._maskService.removeMask(this._maskService.maskExpression)?.length;\n\n const specialChartPlusOne = this.specialCharacters().includes(\n this._maskService.actualValue.slice(position, position + 1)\n );\n if (allowFewMaskChangeMask && !specialChartPlusOne) {\n position = (el.selectionStart as number) + 1;\n } else {\n position = specialChartMinusOne ? position - 1 : position;\n }\n } else {\n position =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n }\n }\n this._position.set(\n this._position() === 1 && this._inputValue().length === 1\n ? null\n : this._position()\n );\n let positionToApply: number = this._position()\n ? this._inputValue().length + position + caretShift\n : position +\n (this._code() === MaskExpression.BACKSPACE && !backspaceShift\n ? 0\n : caretShift);\n // For separator masks the applier's caret shift is computed on the raw\n // (prefix-less) value, so account for the prefix the mask just added (#1571).\n if (\n pastedValueWithoutPrefix &&\n this._maskValue().startsWith(MaskExpression.SEPARATOR)\n ) {\n positionToApply += this._maskService.prefix.length;\n }\n if (positionToApply > this._getActualInputLength()) {\n // A bare decimal marker ('.' or, with a prefix, '$.') is not a number:\n // formControlResult has just emitted null for it, which the ngModelChange\n // reset handler treats as a form reset and clears actualValue. The plain\n // length clamp would then land the caret BEFORE the marker — keep it right\n // after the marker instead (#1572).\n const decimalMarker = this._maskService.decimalMarker;\n const prefix = this._maskService.prefix;\n const valueWithoutPrefix = el.value.startsWith(prefix)\n ? el.value.slice(prefix.length)\n : el.value;\n const isBareDecimalMarker =\n valueWithoutPrefix.length === 1 &&\n (Array.isArray(decimalMarker)\n ? decimalMarker.includes(\n valueWithoutPrefix as MaskExpression.DOT | MaskExpression.COMMA\n )\n : valueWithoutPrefix === decimalMarker);\n positionToApply = isBareDecimalMarker\n ? this._getActualInputLength() + 1\n : this._getActualInputLength();\n }\n if (positionToApply < 0) {\n positionToApply = 0;\n }\n el.setSelectionRange(positionToApply, positionToApply);\n this._position.set(null);\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Ngx-mask writeValue work with string | number, your current value:',\n typeof transformedValue\n );\n }\n } else {\n if (!this._maskValue()) {\n this.onChange(el.value);\n return;\n }\n this._maskService.applyValueChanges(\n el.value.length,\n this._justPasted(),\n this._code() === MaskExpression.BACKSPACE || this._code() === MaskExpression.DELETE\n );\n }\n }\n\n /**\n * #1488: locates the date/time field (DAY/MONTH/HOURS/HOUR/MINUTE/SECOND) that\n * `position` falls within, scanning `maskExpression` left-to-right. A field spans\n * its token plus its digit-pair companion — `0` for DAY/MONTH/MINUTE/SECOND (e.g.\n * `d0`, `M0`, `m0`, `s0`), or `HOUR` for the combined `Hh` hour field. Matches any\n * position from the field's first char up to and including its end (separator index),\n * so both a still-mid-typing caret and the just-completed field are covered — the\n * precise overflow decision (single first digit vs. completed 2-digit value) happens\n * in `_isFieldOverflowing`. Returns null for non-date/time masks, a no-op for the caller.\n */\n private _findDateTimeFieldAt(maskExpression: string, position: number): DateTimeField | null {\n const dateTimeTokens: readonly string[] = [\n MaskExpression.DAY,\n MaskExpression.MONTH,\n MaskExpression.HOURS,\n MaskExpression.HOUR,\n MaskExpression.MINUTE,\n MaskExpression.SECOND,\n ];\n let index = 0;\n while (index < maskExpression.length) {\n const token = maskExpression[index] ?? MaskExpression.EMPTY_STRING;\n if (dateTimeTokens.includes(token)) {\n const next = maskExpression[index + 1];\n const isCombinedHour =\n token === MaskExpression.HOURS && next === MaskExpression.HOUR;\n const end =\n next === MaskExpression.NUMBER_ZERO || isCombinedHour ? index + 2 : index + 1;\n if (position >= index && position <= end) {\n return {\n token: token as DateTimeField['token'],\n start: index,\n end,\n };\n }\n index = end;\n continue;\n }\n index++;\n }\n return null;\n }\n\n /**\n * Per-token overflow thresholds, mirroring the ones `generic-pattern.handler.ts`\n * already establishes (day 31, month 12, hour 23/12 w/ apm, minute/second 59) — kept\n * as a small local table rather than importing from the handler (see design's\n * Rejected Alternatives: the directive and the handler stay on separate sides of the\n * display/parse boundary).\n *\n * Two overflow shapes are checked, mirroring how the handler itself decides mid-type:\n * - `firstDigitValue`: when `position` is exactly one char past the field's start (the\n * just-typed char is the field's first digit), an out-of-range first digit alone\n * (e.g. month digit `3`, day digit `4`) already triggers the handler's own leadZero\n * pad within this same keystroke — `el.value` hasn't caught up yet at this point in\n * the pipeline, so the raw typed digit (`inputValue`) must be read instead.\n * - `fieldValue`: once both digits of the field are present in `el.value`, an\n * out-of-range 2-digit value (e.g. day `33`, month `13`) triggers the shift directly.\n */\n private _isFieldOverflowing(\n field: DateTimeField,\n position: number,\n elValue: string,\n inputValue: string,\n apm: boolean\n ): boolean {\n const fieldValue = Number(elValue.slice(field.start, field.end));\n const isFirstDigitOfField = position === field.start + 1;\n const firstDigitValue = isFirstDigitOfField\n ? Number(inputValue.slice(position - 1, position))\n : NaN;\n switch (field.token) {\n case MaskExpression.DAY:\n return (fieldValue > 31 && fieldValue < 40) || firstDigitValue > 3;\n case MaskExpression.MONTH:\n return fieldValue > 12 || firstDigitValue > 1;\n case MaskExpression.HOURS:\n return apm\n ? fieldValue > 9 || firstDigitValue > 9\n : fieldValue > 23 || firstDigitValue > 2;\n case MaskExpression.HOUR:\n return apm ? fieldValue > 12 : fieldValue > 23;\n case MaskExpression.MINUTE:\n case MaskExpression.SECOND:\n return fieldValue > 59 || firstDigitValue > 5;\n default:\n return false;\n }\n }\n\n /**\n * Whether any pattern slot of the current mask expression can accept a letter.\n * IME composition is only meaningful for such masks; for purely numeric masks\n * (digit patterns, separator, date/time, IP, CPF_CNPJ) waiting for compositionend\n * only delays the model sync — and Samsung Keyboard may never fire it until blur\n * (#1293). Unknown/letterless probe failures fall back to `false` (process live).\n */\n private _maskAcceptsLetterInput(): boolean {\n const patterns = this._maskService.patterns;\n const maskExpression = this._maskService.maskExpression;\n for (const symbol of maskExpression) {\n const pattern = patterns[symbol]?.pattern;\n if (!pattern) {\n continue;\n }\n // Re-create without sticky/global flags: test() on those is stateful.\n const probe = new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ''));\n if (probe.test('a') || probe.test('A')) {\n return true;\n }\n }\n return false;\n }\n\n // IME starts\n @HostListener('compositionstart')\n public onCompositionStart(): void {\n this._isComposing.set(true);\n }\n\n // IME completes\n @HostListener('compositionend', ['$event'])\n public onCompositionEnd(e: Event): void {\n this._isComposing.set(false);\n if (!this._maskAcceptsLetterInput()) {\n // For letterless masks every edit was already processed live in onInput\n // (#1293); reprocessing the same value through the paste path would\n // double-apply the mask.\n return;\n }\n this._justPasted.set(true);\n this.onInput(e);\n }\n\n @HostListener('blur', ['$event'])\n public onBlur(e: Event): void {\n if (this._maskValue()) {\n const el: HTMLInputElement = (e as FocusEvent).target as HTMLInputElement;\n const pristineBeforeDefault = this._applyDefaultValueOnBlur(el);\n if (\n this._maskService.leadZero &&\n el.value.length > 0 &&\n typeof this._maskService.decimalMarker === 'string'\n ) {\n const maskExpression = this._maskService.maskExpression;\n const decimalMarker = this._maskService.decimalMarker as string;\n const suffix = this._maskService.suffix;\n const precision = Number(\n this._maskService.maskExpression.slice(\n maskExpression.length - 1,\n maskExpression.length\n )\n );\n\n if (precision > 0) {\n el.value = suffix ? el.value.split(suffix).join('') : el.value;\n const decimalPart = el.value.split(decimalMarker)[1] as string;\n\n el.value = el.value.includes(decimalMarker)\n ? el.value +\n MaskExpression.NUMBER_ZERO.repeat(\n precision - (decimalPart?.length || 0)\n ) +\n suffix\n : el.value +\n decimalMarker +\n MaskExpression.NUMBER_ZERO.repeat(precision) +\n suffix;\n this._maskService.actualValue = el.value;\n // #1634: propagate through the regular formControlResult pipeline (not a\n // raw onChange) so outputTransformFn runs on this blur-time reformat, same\n // as every typing-time emission. A raw onChange here sent the masked display\n // string straight to the model, bypassing outputTransformFn entirely.\n this._maskService.formControlResult(this._maskService.actualValue);\n }\n }\n this._maskService.clearIfNotMatchFn();\n if (pristineBeforeDefault !== null) {\n // The default-value emission (and a possible leadZero padding pass above)\n // ran through the view-change pipeline, which dirties the control. A\n // blur-time programmatic write must not change dirtiness, so restore the\n // pre-write pristine state. Touched is NOT restored — blur legitimately\n // touches the control (onTouch below).\n this._restoreControlStateAfterWrite(pristineBeforeDefault, false);\n this._changeDetectorRef.markForCheck();\n }\n }\n this._isFocused.set(false);\n this._maskService._isFocused.set(false);\n this.onTouch();\n }\n\n /**\n * Issue #1435 (defaultValueOnBlur): when configured — via the directive input or the\n * DI config — and the control's unmasked value is empty on blur (covers '', a bare\n * prefix/suffix and the showMaskTyped skeleton), writes the default through the\n * regular mask pipeline: applyMask renders the masked display and emits the usual\n * model output (dropSpecialCharacters/outputTransformFn applied) via formControlResult.\n * Returns the control's pre-write pristine state for the caller to restore once the\n * whole blur pass is done, or `null` when no default was applied.\n */\n private _applyDefaultValueOnBlur(el: HTMLInputElement): boolean | null {\n const defaultValue = this.defaultValueOnBlur() ?? this._config.defaultValueOnBlur;\n if (!defaultValue || this._maskService.removeMask(el.value)) {\n return null;\n }\n const ngControl = this._resolveNgControl();\n const wasPristine = ngControl ? Boolean(ngControl.pristine) : true;\n const displayValue = this._maskService.applyMask(\n defaultValue,\n this._maskService.maskExpression\n );\n el.value = displayValue;\n this._inputValue.set(displayValue);\n return wasPristine;\n }\n\n @HostListener('click', ['$event'])\n public onClick(e: Event): void {\n if (!this._maskValue()) {\n return;\n }\n\n const el: HTMLInputElement = (e as MouseEvent).target as HTMLInputElement;\n const posStart = 0;\n const posEnd = 0;\n\n if (\n el !== null &&\n el.selectionStart !== null &&\n el.selectionStart === el.selectionEnd &&\n el.selectionStart > this._maskService.prefix.length &&\n (e as unknown as { keyCode?: number }).keyCode !== 38\n ) {\n if (this._maskService.showMaskTyped && !this.keepCharacterPositions()) {\n // We are showing the mask in the input\n this._maskService.maskIsShown = this._maskService.showMaskInInput();\n if (\n el.setSelectionRange &&\n this._maskService.prefix + this._maskService.maskIsShown === el.value\n ) {\n // the input ONLY contains the mask, so position the cursor at the start\n el.focus();\n el.setSelectionRange(posStart, posEnd);\n } else {\n // the input contains some characters already\n if (el.selectionStart > this._maskService.actualValue.length) {\n // if the user clicked beyond our value's length, position the cursor at the end of our value\n el.setSelectionRange(\n this._maskService.actualValue.length,\n this._maskService.actualValue.length\n );\n }\n }\n }\n }\n const nextValue: string | null =\n el &&\n (el.value === this._maskService.prefix\n ? this._maskService.prefix + this._maskService.maskIsShown\n : el.value);\n\n /** Fix of cursor position jumping to end in most browsers no matter where cursor is inserted onFocus */\n if (el && el.value !== nextValue) {\n el.value = nextValue;\n }\n /** fix of cursor position with prefix when mouse click occur */\n if (\n el &&\n el.type !== 'number' &&\n ((el.selectionStart as number) || (el.selectionEnd as number)) <=\n this._maskService.prefix.length\n ) {\n const specialCharactersAtTheStart =\n this._maskService.maskExpression.match(\n new RegExp(\n `^[${this._maskService.specialCharacters.map((c) => `\\\\${c}`).join('')}]+`\n )\n )?.[0].length || 0;\n\n el.selectionStart = this._maskService.prefix.length + specialCharactersAtTheStart;\n return;\n }\n /** select only inserted text */\n if (el && (el.selectionEnd as number) > this._getActualInputLength()) {\n el.selectionEnd = this._getActualInputLength();\n }\n }\n\n @HostListener('keydown', ['$event'])\n public onKeyDown(event: Event): void {\n const e = event as KeyboardEvent;\n if (!this._maskValue()) {\n return;\n }\n\n if (this._isComposing()) {\n // User finalize their choice from IME composition, so trigger onInput() for the composed text.\n if (e.key === 'Enter') {\n this.onCompositionEnd(event);\n return;\n }\n // Android IMEs can keep a single composition open across many keystrokes\n // (#1293): still capture the pre-edit value and selection that onInput\n // relies on when it processes edits during composition.\n const composingEl = e.target as HTMLInputElement;\n this._inputValue.set(composingEl.value);\n this._maskService.selStart = composingEl.selectionStart;\n this._maskService.selEnd = composingEl.selectionEnd;\n return;\n }\n\n this._code.set(e.code ? e.code : e.key);\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue.set(el.value);\n this._setMask();\n\n const isTextarea = el.tagName.toLowerCase() === 'textarea';\n\n if (el.type !== 'number') {\n if (this._insertNumpadDecimalMarker(e, el)) {\n return;\n }\n if (e.key === MaskExpression.ARROW_UP && !isTextarea) {\n e.preventDefault();\n }\n if (\n e.key === MaskExpression.ARROW_LEFT ||\n e.key === MaskExpression.BACKSPACE ||\n e.key === MaskExpression.DELETE\n ) {\n if (e.key === MaskExpression.BACKSPACE && el.value.length === 0) {\n el.selectionStart = el.selectionEnd;\n }\n if (e.key === MaskExpression.BACKSPACE && (el.selectionStart as number) !== 0) {\n const prefixLength = this.prefix().length;\n // Use the service value: it holds the config defaults when the input is not\n // bound and the bound value otherwise, so an explicitly bound empty array is\n // respected instead of silently falling back to the defaults (#1512).\n const specialCharacters = this._maskService.specialCharacters;\n\n if (prefixLength > 1 && (el.selectionStart as number) <= prefixLength) {\n el.setSelectionRange(prefixLength, el.selectionEnd);\n } else {\n if (\n this._inputValue().length !== (el.selectionStart as number) &&\n (el.selectionStart as number) !== 1\n ) {\n while (\n specialCharacters.includes(\n (\n this._inputValue()[(el.selectionStart as number) - 1] ??\n MaskExpression.EMPTY_STRING\n ).toString()\n ) &&\n ((prefixLength >= 1 &&\n (el.selectionStart as number) > prefixLength) ||\n prefixLength === 0)\n ) {\n el.setSelectionRange(\n (el.selectionStart as number) - 1,\n el.selectionEnd\n );\n }\n }\n }\n }\n this.checkSelectionOnDeletion(el);\n if (\n this._maskService.prefix.length &&\n (el.selectionStart as number) <= this._maskService.prefix.length &&\n (el.selectionEnd as number) <= this._maskService.prefix.length\n ) {\n e.preventDefault();\n }\n const cursorStart: number | null = el.selectionStart;\n if (\n e.key === MaskExpression.BACKSPACE &&\n !el.readOnly &&\n cursorStart === 0 &&\n el.selectionEnd === el.value.length &&\n el.value.length !== 0\n ) {\n // Handle the clear fully here instead of emitting the model change and\n // relying on the browser's default deletion + input event to update the\n // view: Firefox can drop the default action after the emission below\n // triggers change detection (DOM churn around the input), leaving the\n // model empty but the view untouched until a second Backspace (#1350).\n e.preventDefault();\n // The default action (and its input event) is suppressed, so the\n // inputTransformFn would never see the cleared value; run it here (#1651).\n const transformedEmpty = this._maskService.inputTransformFn\n ? this._maskService.inputTransformFn(MaskExpression.EMPTY_STRING)\n : MaskExpression.EMPTY_STRING;\n const clearedValue =\n typeof transformedEmpty === 'string' || typeof transformedEmpty === 'number'\n ? String(transformedEmpty)\n : MaskExpression.EMPTY_STRING;\n const displayValue = this._maskService.applyMask(\n clearedValue,\n this._maskService.maskExpression,\n 0,\n false,\n true\n );\n el.value = displayValue;\n this._inputValue.set(displayValue);\n const caret = Math.min(this._maskService.prefix.length, displayValue.length);\n el.setSelectionRange(caret, caret);\n }\n }\n if (\n !!this.suffix() &&\n this.suffix().length > 1 &&\n this._inputValue().length - this.suffix().length < (el.selectionStart as number)\n ) {\n el.setSelectionRange(\n this._inputValue().length - this.suffix().length,\n this._inputValue().length\n );\n } else if (\n (e.code === 'KeyA' && e.ctrlKey) ||\n (e.code === 'KeyA' && e.metaKey) // Cmd + A (Mac)\n ) {\n el.setSelectionRange(0, this._getActualInputLength());\n e.preventDefault();\n }\n this._maskService.selStart = el.selectionStart;\n this._maskService.selEnd = el.selectionEnd;\n }\n }\n\n /**\n * #1641: on layouts whose decimal separator is a comma, the numeric keypad still emits\n * a period, which a separator mask configured with a comma decimal marker rejects. The\n * keypad decimal key (`key: 'Decimal'`, or a `.` from `code: 'NumpadDecimal'`) is\n * therefore turned into the configured marker. Only the keypad key is intercepted: a\n * period typed on the main keyboard keeps its normal behavior (e.g. as a thousand\n * separator). Returns true when the key press was handled.\n */\n private _insertNumpadDecimalMarker(e: KeyboardEvent, el: HTMLInputElement): boolean {\n const isNumpadDecimal =\n e.key === MaskExpression.NUMPAD_DECIMAL ||\n (e.code === MaskExpression.NUMPAD_DECIMAL_CODE && e.key === MaskExpression.DOT);\n if (\n !isNumpadDecimal ||\n e.ctrlKey ||\n e.metaKey ||\n e.altKey ||\n el.readOnly ||\n !this._maskValue().startsWith(MaskExpression.SEPARATOR)\n ) {\n return false;\n }\n const configuredMarker = this._maskService.decimalMarker;\n const marker = Array.isArray(configuredMarker)\n ? configuredMarker.find((item) => item !== this._maskService.thousandSeparator)\n : configuredMarker;\n if (marker !== MaskExpression.COMMA) {\n return false;\n }\n const start = el.selectionStart ?? el.value.length;\n const end = el.selectionEnd ?? start;\n e.preventDefault();\n this._code.set(MaskExpression.NUMPAD_DECIMAL_CODE);\n this._inputValue.set(el.value);\n this._maskService.selStart = start;\n this._maskService.selEnd = end;\n el.value = `${el.value.slice(0, start)}${marker}${el.value.slice(end)}`;\n el.setSelectionRange(start + 1, start + 1);\n el.dispatchEvent(\n new InputEvent('input', { inputType: 'insertText', data: marker, bubbles: true })\n );\n return true;\n }\n\n /**\n * Restores the control's pristine/untouched state after a writeValue-driven emission.\n *\n * writeValue is a one-way model->view sync. When the mask normalizes the written value\n * (e.g. leadZero '10.2' -> '10.20'), the directive must still emit the corrected value so\n * the model adopts it — but that emission runs through Angular's view-change pipeline, which\n * calls markAsDirty()/markAsTouched(). A programmatic setValue/patchValue must leave the\n * control pristine, so we undo that side effect here when the control was pristine before\n * the write. `onlySelf: true` keeps parent group state untouched.\n */\n private _restoreControlStateAfterWrite(wasPristine: boolean, wasUntouched: boolean): void {\n const ngControl = this._resolveNgControl();\n const control = ngControl?.control;\n if (!control) {\n return;\n }\n if (wasPristine && ngControl.dirty && typeof control.markAsPristine === 'function') {\n control.markAsPristine({ onlySelf: true });\n }\n if (wasUntouched && ngControl.touched && typeof control.markAsUntouched === 'function') {\n control.markAsUntouched({ onlySelf: true });\n }\n }\n\n /** It writes the value in the input */\n public writeValue(controlValue: unknown): void {\n if (!this._configApplied && this.mask()) {\n // Called before the first ngOnChanges pass configured the mask service (happens with\n // Signal Forms' [formField], whose control-sync instruction runs before sibling\n // directives' ngOnChanges). Defer and replay once the configuration is applied.\n this._pendingInitialValue = controlValue;\n this._hasPendingInitialValue = true;\n return;\n }\n // Skip the model echo of a value we just propagated ourselves (see the\n // _lastPropagatedValue doc). Empty writes are never skipped: form reset('') must\n // always clear the display and the currentValue/previousValue service state below.\n const lastPropagated = this._lastPropagatedValue;\n this._lastPropagatedValue = null;\n if (\n lastPropagated !== null &&\n lastPropagated !== '' &&\n (typeof controlValue === 'string' || typeof controlValue === 'number') &&\n String(controlValue) === lastPropagated\n ) {\n return;\n }\n const ngControl = this._resolveNgControl();\n const wasPristine = ngControl ? Boolean(ngControl.pristine) : true;\n const wasUntouched = ngControl ? Boolean(ngControl.untouched) : true;\n let value = controlValue;\n const inputTransformFn = this._maskService.inputTransformFn;\n if (typeof value === 'object' && value !== null && 'value' in value) {\n if ('disable' in value) {\n this.setDisabledState(Boolean(value.disable));\n }\n\n value = value.value;\n }\n if (value !== null) {\n value = inputTransformFn ? inputTransformFn(value) : value;\n }\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n value === null ||\n typeof value === 'undefined'\n ) {\n if (value === null || typeof value === 'undefined' || value === '') {\n this._maskService.currentValue = '';\n this._maskService.previousValue = '';\n }\n\n let inputValue: string | number | null | undefined = value;\n if (\n typeof inputValue === 'number' ||\n this._maskValue().startsWith(MaskExpression.SEPARATOR)\n ) {\n inputValue = String(inputValue);\n const localeDecimalMarker = this._maskService.currentLocaleDecimalMarker();\n if (!Array.isArray(this._maskService.decimalMarker)) {\n inputValue =\n this._maskService.decimalMarker !== localeDecimalMarker\n ? inputValue.replace(\n localeDecimalMarker,\n this._maskService.decimalMarker\n )\n : inputValue;\n }\n\n if (\n this._maskService.leadZero &&\n inputValue &&\n this.mask() &&\n this.dropSpecialCharacters() !== false\n ) {\n inputValue = this._maskService._checkPrecision(\n this._maskService.maskExpression,\n inputValue as string\n );\n }\n\n if (\n this._maskService.decimalMarker === MaskExpression.COMMA ||\n (Array.isArray(this._maskService.decimalMarker) &&\n this._maskService.thousandSeparator === MaskExpression.DOT)\n ) {\n inputValue = inputValue\n .toString()\n .replace(MaskExpression.DOT, MaskExpression.COMMA);\n }\n if (\n this._resolvedMaskInput().startsWith(MaskExpression.SEPARATOR) &&\n this.leadZero()\n ) {\n const isFirstWrite = !this._maskService.isInitialized;\n requestAnimationFrame(() => {\n // On initial load, temporarily set isInitialized to false\n // so formControlResult returns early and doesn't mark form as dirty.\n // On later writeValue-driven writes, leave isInitialized as-is: this pass\n // may legitimately need to push a leadZero-normalized value (e.g.\n // '10.2' -> '10.20') back to the FormControl, which Angular's forms\n // pipeline can only do via the same onChange callback used for real user\n // edits — see the `should change formValue` unit tests, which assert the\n // normalized value lands in `form.value` after a programmatic setValue.\n if (isFirstWrite) {\n this._maskService.isInitialized = false;\n }\n this._maskService.applyMask(\n inputValue?.toString() ?? '',\n this._maskService.maskExpression\n );\n if (isFirstWrite) {\n this._maskService.isInitialized = true;\n }\n // The leadZero normalization above emits the corrected value through the\n // view-change pipeline, which dirties/touches the control. Undo that so a\n // programmatic write stays pristine.\n this._restoreControlStateAfterWrite(wasPristine, wasUntouched);\n // Zoneless CD does not auto-flush after requestAnimationFrame; request\n // a check so form.pristine/form.value bindings reflect the new state.\n this._changeDetectorRef.markForCheck();\n });\n }\n this._maskService.isNumberValue = true;\n }\n\n if (typeof inputValue !== 'string' || value === null || typeof value === 'undefined') {\n inputValue = '';\n }\n\n this._inputValue.set(inputValue);\n this._setMask();\n\n if (\n (inputValue && this._maskService.maskExpression) ||\n (this._maskService.maskExpression &&\n (this._maskService.prefix || this._maskService.showMaskTyped))\n ) {\n // Let the service we know we are writing value so that triggering onChange function won't happen during applyMask\n this._maskService.writingValue = true;\n\n const displayValue = this._maskedOrVerbatim(inputValue);\n this._maskService.formElementProperty = ['value', displayValue];\n this._writeElementValueSync(displayValue);\n // Let the service know we've finished writing value\n this._maskService.writingValue = false;\n this._maskService.isInitialized = true;\n } else {\n this._maskService.formElementProperty = ['value', inputValue];\n this._writeElementValueSync(inputValue);\n this._maskService.isInitialized = true;\n }\n // A writeValue-driven emission may have dirtied/touched the control via the\n // view-change pipeline; undo that so programmatic writes stay pristine.\n this._restoreControlStateAfterWrite(wasPristine, wasUntouched);\n // Programmatic writes (setValue/patchValue called outside a signal/effect context)\n // don't schedule CD under zoneless change detection. Request a check so bindings\n // reading form.pristine/form.dirty/form.value on the host template stay in sync.\n this._changeDetectorRef.markForCheck();\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Ngx-mask writeValue work with string | number, your current value:',\n typeof value\n );\n }\n }\n\n /**\n * Mirrors a writeValue-driven render into the DOM synchronously, in the same\n * change-detection pass (#1305). The service's `formElementProperty` setter defers all\n * writes via queueMicrotask (to keep FIFO ordering with config-driven re-renders and\n * dodge ExpressionChanged issues), but consumers that read `nativeElement.value` DURING\n * the CD pass — Angular Material's floating label (`MatInput.empty`), CDK autofill —\n * never see a value that only lands in a later microtask. The deferred write still runs\n * afterwards and re-applies the same final value, so ordering guarantees are preserved.\n *\n * Skipped while a mask reconfiguration is pending (`mask()` input changed but\n * `ngOnChanges` has not applied it yet — e.g. `mask.set(...)` + `setValue(...)` before\n * the next CD pass): the value just computed used the STALE mask config, and rendering\n * it synchronously would expose an intermediate state that the deferred pipeline is\n * about to supersede. Multi-masks (`||`) resolve `_maskValue` to one alternative and\n * therefore also fall back to the deferred-only path.\n */\n private _writeElementValueSync(value: string): void {\n if (this._resolvedMaskInput() !== this._maskValue()) {\n return;\n }\n this._renderer.setProperty(this._elementRef.nativeElement, 'value', value);\n }\n\n /** The `mask` input with a user-defined alias (config maskAliases) expanded, if any. */\n private _resolvedMaskInput(): string {\n return resolveMaskAlias(this.mask(), this._config.maskAliases);\n }\n\n public registerOnChange(fn: typeof this.onChange): void {\n // Angular only calls this in classic ControlValueAccessor mode (reactive/template forms).\n // Its invocation is therefore our reliable signal that we are NOT in Signal Forms mode.\n this._isCvaMode.set(true);\n const originalFn = fn;\n this._maskService.onChange = this.onChange = (value: unknown) => {\n originalFn(value);\n this._propagateToValueModel(value);\n };\n }\n\n public registerOnTouched(fn: typeof this.onTouch): void {\n this.onTouch = () => {\n fn();\n if (!this.touched()) {\n this.touched.set(true);\n }\n };\n }\n\n /**\n * Pushes the current unmasked value into the `value` model input. In Signal Forms mode this\n * fires the `valueChange` output that Angular listens to; in CVA mode it is a harmless write\n * to a model nobody reads. We flag `_skipNextValueEffect` so the resulting model change does\n * not bounce back through the value effect and overwrite the raw `_inputValue`.\n */\n private _propagateToValueModel(value: unknown): void {\n const stringValue = value === null || typeof value === 'undefined' ? '' : String(value);\n this._lastPropagatedValue = stringValue;\n untracked(() => {\n if (String(this.value()) !== stringValue) {\n this._skipNextValueEffect.set(true);\n this.value.set(stringValue);\n }\n });\n }\n\n /**\n * Focus the input element.\n * Required by FormValueControl interface for Signal Forms.\n */\n public focus(): void {\n this._maskService._elementRef?.nativeElement?.focus();\n }\n\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n public checkSelectionOnDeletion(el: HTMLInputElement): void {\n const prefixLength = this.prefix().length;\n const suffixLength = this.suffix().length;\n const inputValueLength = this._inputValue().length;\n\n el.selectionStart = Math.min(\n Math.max(prefixLength, el.selectionStart as number),\n inputValueLength - suffixLength\n );\n el.selectionEnd = Math.min(\n Math.max(prefixLength, el.selectionEnd as number),\n inputValueLength - suffixLength\n );\n }\n\n /**\n * It disables the input element.\n *\n * Mirrors `_writeElementValueSync` (#1305): the service's `formElementProperty` setter\n * defers ALL DOM writes via `queueMicrotask` to dodge ExpressionChangedAfterItHasBeenChecked\n * and keep FIFO ordering with config-driven re-renders. For `disabled` specifically, that\n * deferral leaves `nativeElement.disabled` stale for at least one microtask after Angular\n * Forms' `setUpControl` calls this method synchronously during init — long enough for a\n * consumer reading the DOM property in the same synchronous phase (or another deferred write\n * racing in FIFO order) to observe the wrong value, e.g. an initially-disabled FormControl\n * whose native input briefly (or, depending on interleaving, persistently) reports\n * `disabled === false` (#1633). Writing synchronously here closes that gap; the deferred\n * write below still runs afterwards and re-applies the same final value, preserving the\n * existing ordering guarantees other call sites rely on.\n */\n public setDisabledState(isDisabled: boolean): void {\n this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);\n this._maskService.formElementProperty = ['disabled', isDisabled];\n }\n\n private _applyMask(): void {\n this._maskService.maskExpression = this._maskService._repeatPatternSymbols(\n this._maskValue() || ''\n );\n this._maskService.formElementProperty = [\n 'value',\n this._maskedOrVerbatim(this._inputValue()),\n ];\n }\n\n /**\n * Renders `inputValue` through the mask, falling back to the raw value verbatim when the\n * mask cannot process ANY of it (#1615, e.g. a sentinel like 'ONGOING' written into a\n * digits-only control). Values that PARTIALLY match keep regular masking.\n *\n * Shared by writeValue() and _applyMask() (called from every ngOnChanges pass, including\n * ones triggered by an UNRELATED input like `disabled`) so the verbatim verdict for a\n * value written once via writeValue() is not lost on a later re-render that replays the\n * same raw `inputValue` outside of writeValue — which would otherwise re-run regular\n * masking, produce an empty result, and emit it through onChange, clobbering the model.\n *\n * Excludes an actual mask RECONFIGURATION (`maskChanged`): when the mask itself just\n * changed, a value that no longer matches must clear through the regular path (see\n * trigger-on-mask-change.spec.ts) — verbatim passthrough only covers re-renders of the\n * SAME mask.\n */\n private _maskedOrVerbatim(inputValue: string): string {\n // Snapshot before applyMask(): it resets maskChanged internally as part of emitting\n // (or skipping) the change, so it must be read before the call, not after.\n const wasMaskChanged = this._maskService.maskChanged;\n const maskedResult = this._maskService.applyMask(\n inputValue,\n this._maskService.maskExpression\n );\n return !maskedResult &&\n inputValue &&\n !wasMaskChanged &&\n this._maskService.removeMask(inputValue)\n ? inputValue\n : maskedResult;\n }\n\n private _validateTime(value: string): ValidationErrors | null {\n const rowMaskLen: number = this._maskValue()\n .split(MaskExpression.EMPTY_STRING)\n .filter((s: string) => s !== ':').length;\n if (!value) {\n return null; // Don't validate empty values to allow for optional form control\n }\n\n if (\n (+(value[value.length - 1] ?? -1) === 0 && value.length < rowMaskLen) ||\n value.length <= rowMaskLen - 2\n ) {\n return this._createValidationError(value);\n }\n\n return null;\n }\n\n private _getActualInputLength() {\n return (\n this._maskService.actualValue.length ||\n this._maskService.actualValue.length + this._maskService.prefix.length\n );\n }\n\n /**\n * For `||` multi-masks only (#1583): a value shorter than the currently selected\n * alternative is still valid when it is a pattern-valid prefix of that alternative\n * ending exactly at a special-character boundary (e.g. `0` for `0,N`) and it meets\n * the length requirement of at least one alternative (e.g. `1`). Values stopping\n * mid-pattern-block (e.g. `112A` for `000SS`) remain invalid.\n */\n private _isCompleteAlternativeBoundary(processedValue: string): boolean {\n const alternatives = this._maskExpressionArray();\n if (!alternatives.length) {\n return false;\n }\n const maskValue = this._maskValue();\n const cleanValue = this._maskService.removeMask(processedValue);\n const cleanMask = this._maskService.removeMask(maskValue);\n const isPatternPrefix = cleanValue\n .split(MaskExpression.EMPTY_STRING)\n .every((character, index) =>\n this._maskService._checkSymbolMask(character, cleanMask.charAt(index))\n );\n if (!isPatternPrefix) {\n return false;\n }\n let patternCount = 0;\n let boundaryCharacter: string = MaskExpression.EMPTY_STRING;\n for (const maskCharacter of maskValue) {\n if (patternCount === cleanValue.length) {\n boundaryCharacter = maskCharacter;\n break;\n }\n if (!this._maskService.specialCharacters.includes(maskCharacter)) {\n patternCount++;\n }\n }\n if (\n !boundaryCharacter ||\n !this._maskService.specialCharacters.includes(boundaryCharacter)\n ) {\n return false;\n }\n return alternatives.some((alternative) => {\n const requiredLength = this._maskService.dropSpecialCharacters\n ? alternative.length - this._maskService.checkDropSpecialCharAmount(alternative)\n : this.prefix()\n ? alternative.length + this.prefix().length\n : alternative.length;\n // Exact match, not `>=`: a longer value must not pass on the strength of a\n // shorter alternative it has already outgrown (#1645, 7 digits vs `00000 9`).\n return processedValue.length === requiredLength;\n });\n }\n\n /**\n * True when every character of the mask expression is either a pattern token or a\n * special character — i.e. the mask has no quantifiers (`*`, `?`), curly-bracket\n * repetitions or other constructs the position-aware matcher does not model.\n */\n private _isPlainTokenMask(mask: string): boolean {\n return mask\n .split(MaskExpression.EMPTY_STRING)\n .every(\n (symbol: string) =>\n !!this._maskService.patterns[symbol] ||\n this._maskService.specialCharacters.includes(symbol)\n );\n }\n\n /**\n * Backtracking match of a value against a mask mixing optional and mandatory pattern\n * tokens (#1515, e.g. `999SSS`). Optional tokens may be left unfilled; special\n * characters may be absent from the value (dropSpecialCharacters). The value is valid\n * when it is fully consumed and every remaining mask token is optional or special.\n */\n private _matchesMaskWithOptionalSkip(value: string, mask: string): boolean {\n const patterns = this._maskService.patterns;\n const match = (maskIndex: number, valueIndex: number): boolean => {\n if (valueIndex === value.length) {\n return mask\n .slice(maskIndex)\n .split(MaskExpression.EMPTY_STRING)\n .every((symbol: string) => !patterns[symbol] || !!patterns[symbol]?.optional);\n }\n if (maskIndex === mask.length) {\n return false;\n }\n const maskSymbol = mask[maskIndex] as string;\n const valueSymbol = value[valueIndex] as string;\n const pattern = patterns[maskSymbol];\n if (pattern) {\n if (pattern.pattern.test(valueSymbol) && match(maskIndex + 1, valueIndex + 1)) {\n return true;\n }\n return !!pattern.optional && match(maskIndex + 1, valueIndex);\n }\n // Special character: consume it when present in the value, otherwise treat it\n // as dropped (dropSpecialCharacters).\n if (valueSymbol === maskSymbol && match(maskIndex + 1, valueIndex + 1)) {\n return true;\n }\n return match(maskIndex + 1, valueIndex);\n };\n return match(0, 0);\n }\n\n private _createValidationError(actualValue: string): ValidationErrors {\n return {\n mask: {\n requiredMask: this._maskValue(),\n actualValue,\n },\n };\n }\n\n private _setMask() {\n this._maskExpressionArray().some((mask): boolean | void => {\n const specialChart: boolean = mask\n .split(MaskExpression.EMPTY_STRING)\n .some((char) => this._maskService.specialCharacters.includes(char));\n if (\n (specialChart &&\n this._inputValue() &&\n this._areAllCharactersInEachStringSame(this._maskExpressionArray())) ||\n mask.includes(MaskExpression.CURLY_BRACKETS_LEFT)\n ) {\n const test =\n this._maskService.removeMask(this._inputValue())?.length <=\n this._maskService.removeMask(mask)?.length;\n if (test) {\n const maskValue = mask.includes(MaskExpression.CURLY_BRACKETS_LEFT)\n ? this._maskService._repeatPatternSymbols(mask)\n : mask;\n this._maskValue.set(maskValue);\n this._maskService.maskExpression = maskValue;\n return test;\n } else {\n const expression =\n this._maskExpressionArray()[this._maskExpressionArray().length - 1] ??\n MaskExpression.EMPTY_STRING;\n\n const maskValue = expression.includes(MaskExpression.CURLY_BRACKETS_LEFT)\n ? this._maskService._repeatPatternSymbols(expression)\n : expression;\n this._maskValue.set(maskValue);\n this._maskService.maskExpression = maskValue;\n }\n } else {\n const cleanMask = this._maskService.removeMask(mask);\n const check: boolean = this._maskService\n .removeMask(this._inputValue())\n ?.split(MaskExpression.EMPTY_STRING)\n .every((character, index) => {\n const indexMask = cleanMask.charAt(index);\n return this._maskService._checkSymbolMask(character, indexMask);\n });\n\n if (check || this._justPasted()) {\n this._maskValue.set(mask);\n this._maskService.maskExpression = mask;\n return check;\n }\n }\n });\n }\n\n private _areAllCharactersInEachStringSame(array: string[]): boolean {\n const specialCharacters = this._maskService.specialCharacters;\n\n function removeSpecialCharacters(str: string): string {\n const regex = new RegExp(`[${specialCharacters.map((ch) => `\\\\${ch}`).join('')}]`, 'g');\n return str.replace(regex, '');\n }\n\n const processedArr = array.map(removeSpecialCharacters);\n\n return processedArr.every((str) => {\n const uniqueCharacters = new Set(str);\n return uniqueCharacters.size === 1;\n });\n }\n}\n","import type { PipeTransform } from '@angular/core';\nimport { inject, Pipe } from '@angular/core';\n\nimport type { NgxMaskConfig } from './ngx-mask.config';\nimport { NGX_MASK_CONFIG, resolveMaskAlias } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\nimport { MaskExpression } from './ngx-mask-expression.enum';\n\n@Pipe({\n name: 'mask',\n pure: true,\n standalone: true,\n})\nexport class NgxMaskPipe implements PipeTransform {\n private readonly defaultOptions = inject<NgxMaskConfig>(NGX_MASK_CONFIG);\n\n private readonly _maskService = inject(NgxMaskService);\n\n private _maskExpressionArray: string[] = [];\n\n private mask = '';\n\n public transform(\n value: string | number,\n mask: string,\n { patterns, maskAliases, ...config }: Partial<NgxMaskConfig> = {} as Partial<NgxMaskConfig>\n ): string {\n let processedValue: string | number = value;\n\n // User-defined aliases expand BEFORE any other mask processing (incl. `||` handling).\n const resolvedMask = resolveMaskAlias(mask, {\n ...this.defaultOptions.maskAliases,\n ...maskAliases,\n });\n\n const currentConfig = {\n maskExpression: resolvedMask,\n ...this.defaultOptions,\n ...config,\n patterns: {\n ...this._maskService.patterns,\n ...patterns,\n },\n };\n\n Object.entries(currentConfig).forEach(([key, val]) => {\n (this._maskService as unknown as Record<string, unknown>)[key] = val;\n });\n\n if (resolvedMask.includes('||')) {\n const maskParts = resolvedMask.split('||');\n if (maskParts.length > 1) {\n this._maskExpressionArray = maskParts.sort(\n (a: string, b: string) => a.length - b.length\n );\n this._setMask(`${processedValue}`);\n return this._maskService.applyMask(`${processedValue}`, this.mask);\n } else {\n this._maskExpressionArray = [];\n return this._maskService.applyMask(`${processedValue}`, this.mask);\n }\n }\n\n if (resolvedMask.includes(MaskExpression.CURLY_BRACKETS_LEFT)) {\n return this._maskService.applyMask(\n `${processedValue}`,\n this._maskService._repeatPatternSymbols(resolvedMask)\n );\n }\n\n if (resolvedMask.startsWith(MaskExpression.SEPARATOR)) {\n if (config.decimalMarker) {\n this._maskService.decimalMarker = config.decimalMarker;\n }\n if (config.thousandSeparator) {\n this._maskService.thousandSeparator = config.thousandSeparator;\n }\n if (config.leadZero) {\n this._maskService.leadZero = config.leadZero;\n }\n\n processedValue = String(processedValue);\n const localeDecimalMarker = this._maskService.currentLocaleDecimalMarker();\n\n if (!Array.isArray(this._maskService.decimalMarker)) {\n processedValue =\n this._maskService.decimalMarker !== localeDecimalMarker\n ? (processedValue as string).replace(\n localeDecimalMarker,\n this._maskService.decimalMarker\n )\n : processedValue;\n }\n\n if (\n this._maskService.leadZero &&\n processedValue &&\n this._maskService.dropSpecialCharacters !== false\n ) {\n processedValue = this._maskService._checkPrecision(\n resolvedMask,\n processedValue as string\n );\n }\n\n if (this._maskService.decimalMarker === MaskExpression.COMMA) {\n processedValue = (processedValue as string).replace(\n MaskExpression.DOT,\n MaskExpression.COMMA\n );\n }\n\n this._maskService.isNumberValue = true;\n }\n\n if (processedValue === null || typeof processedValue === 'undefined') {\n return this._maskService.applyMask('', resolvedMask);\n }\n\n return this._maskService.applyMask(`${processedValue}`, resolvedMask);\n }\n\n private _setMask(value: string) {\n if (this._maskExpressionArray.length > 0) {\n this._maskExpressionArray.some((mask): boolean | void => {\n const test =\n this._maskService.removeMask(value)?.length <=\n this._maskService.removeMask(mask)?.length;\n if (value && test) {\n this.mask = mask;\n return test;\n } else {\n this.mask =\n this._maskExpressionArray[this._maskExpressionArray.length - 1] ??\n MaskExpression.EMPTY_STRING;\n }\n });\n }\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}