{"version":3,"file":"ngx-currency.mjs","sources":["../../../projects/ngx-currency/src/lib/ngx-currency.config.ts","../../../projects/ngx-currency/src/lib/input.manager.ts","../../../projects/ngx-currency/src/lib/input.service.ts","../../../projects/ngx-currency/src/lib/input.handler.ts","../../../projects/ngx-currency/src/lib/ngx-currency.directive.ts","../../../projects/ngx-currency/src/lib/ngx-currency.providers.ts","../../../projects/ngx-currency/src/public-api.ts","../../../projects/ngx-currency/src/ngx-currency.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface NgxCurrencyConfig {\n  align: string;\n  allowNegative: boolean;\n  allowZero: boolean;\n  decimal: string;\n  precision: number;\n  prefix: string;\n  suffix: string;\n  thousands: string;\n  nullable: boolean;\n  min?: number | null;\n  max?: number | null;\n  inputMode?: NgxCurrencyInputMode;\n}\n\nexport enum NgxCurrencyInputMode {\n  Financial,\n  Natural,\n}\n\nexport const NGX_CURRENCY_CONFIG = new InjectionToken<\n  Partial<NgxCurrencyConfig>\n>('ngx-currency.config');\n","export class InputManager {\n  private _storedRawValue: string | null = null;\n\n  constructor(private readonly _htmlInputElement: HTMLInputElement) {}\n\n  setCursorAt(position: number): void {\n    this._htmlInputElement.focus();\n    this._htmlInputElement.setSelectionRange(position, position);\n  }\n\n  updateValueAndCursor(\n    newRawValue: string,\n    oldLength: number,\n    selectionStart: number,\n  ): void {\n    this.rawValue = newRawValue;\n    const newLength = newRawValue.length;\n    selectionStart = selectionStart - (oldLength - newLength);\n    this.setCursorAt(selectionStart);\n  }\n\n  get canInputMoreNumbers(): boolean {\n    const onlyNumbers =\n      this.rawValue?.replace(/[^0-9\\u0660-\\u0669\\u06F0-\\u06F9]/g, '') ?? '';\n    const hasReachedMaxLength = !(\n      onlyNumbers.length >= this._htmlInputElement.maxLength &&\n      this._htmlInputElement.maxLength >= 0\n    );\n    const selectionStart = this.inputSelection.selectionStart;\n    const selectionEnd = this.inputSelection.selectionEnd;\n    const haveNumberSelected = !!(\n      selectionStart != selectionEnd &&\n      this._htmlInputElement.value\n        .substring(selectionStart, selectionEnd)\n        .match(/[^0-9\\u0660-\\u0669\\u06F0-\\u06F9]/)\n    );\n    const startWithZero = this._htmlInputElement.value.substring(0, 1) == '0';\n    return hasReachedMaxLength || haveNumberSelected || startWithZero;\n  }\n\n  get inputSelection(): {\n    selectionStart: number;\n    selectionEnd: number;\n  } {\n    return {\n      selectionStart: this._htmlInputElement.selectionStart ?? 0,\n      selectionEnd: this._htmlInputElement.selectionEnd ?? 0,\n    };\n  }\n\n  get rawValue(): string | null {\n    return this._htmlInputElement && this._htmlInputElement.value;\n  }\n  set rawValue(value: string | null) {\n    this._storedRawValue = value;\n\n    if (this._htmlInputElement) {\n      this._htmlInputElement.value = value ?? '';\n    }\n  }\n\n  get storedRawValue(): string {\n    return this._storedRawValue || '';\n  }\n}\n","import { InputManager } from './input.manager';\nimport { NgxCurrencyConfig, NgxCurrencyInputMode } from './ngx-currency.config';\n\nexport class InputService {\n  private readonly _singleDigitRegex = new RegExp(\n    /^[0-9\\u0660-\\u0669\\u06F0-\\u06F9]$/,\n  );\n  private readonly _onlyNumbersRegex = new RegExp(\n    /[^0-9\\u0660-\\u0669\\u06F0-\\u06F9]/g,\n  );\n\n  private readonly _perArNumber = new Map<string, string>([\n    ['\\u06F0', '0'],\n    ['\\u06F1', '1'],\n    ['\\u06F2', '2'],\n    ['\\u06F3', '3'],\n    ['\\u06F4', '4'],\n    ['\\u06F5', '5'],\n    ['\\u06F6', '6'],\n    ['\\u06F7', '7'],\n    ['\\u06F8', '8'],\n    ['\\u06F9', '9'],\n\n    ['\\u0660', '0'],\n    ['\\u0661', '1'],\n    ['\\u0662', '2'],\n    ['\\u0663', '3'],\n    ['\\u0664', '4'],\n    ['\\u0665', '5'],\n    ['\\u0666', '6'],\n    ['\\u0667', '7'],\n    ['\\u0668', '8'],\n    ['\\u0669', '9'],\n  ]);\n\n  inputManager: InputManager;\n\n  constructor(\n    htmlInputElement: HTMLInputElement,\n    private _options: NgxCurrencyConfig,\n  ) {\n    this.inputManager = new InputManager(htmlInputElement);\n  }\n\n  addNumber(keyCode: number): void {\n    const { decimal, precision, inputMode } = this._options;\n    const keyChar = String.fromCharCode(keyCode);\n    const isDecimalChar = keyChar === this._options.decimal;\n\n    if (!this.rawValue) {\n      this.rawValue = this.applyMask(false, keyChar);\n      let selectionStart: number | undefined = undefined;\n      if (inputMode === NgxCurrencyInputMode.Natural && precision > 0) {\n        selectionStart = this.rawValue.indexOf(decimal);\n        if (isDecimalChar) {\n          selectionStart++;\n        }\n      }\n      this.updateFieldValue(selectionStart);\n    } else {\n      const selectionStart = this.inputSelection.selectionStart;\n      const selectionEnd = this.inputSelection.selectionEnd;\n      const rawValueStart = this.rawValue.substring(0, selectionStart);\n      let rawValueEnd = this.rawValue.substring(\n        selectionEnd,\n        this.rawValue.length,\n      );\n\n      // In natural mode, replace decimals instead of shifting them.\n      const inDecimalPortion = rawValueStart.indexOf(decimal) !== -1;\n      if (\n        inputMode === NgxCurrencyInputMode.Natural &&\n        inDecimalPortion &&\n        selectionStart === selectionEnd\n      ) {\n        rawValueEnd = rawValueEnd.substring(1);\n      }\n\n      const newValue = rawValueStart + keyChar + rawValueEnd;\n      let nextSelectionStart = selectionStart + 1;\n      const isDecimalOrThousands =\n        isDecimalChar || keyChar === this._options.thousands;\n      if (isDecimalOrThousands && keyChar === rawValueEnd[0]) {\n        // If the cursor is just before the decimal or thousands separator and the user types the\n        // decimal or thousands separator, move the cursor past it.\n        nextSelectionStart++;\n      } else if (!this._singleDigitRegex.test(keyChar)) {\n        // Ignore other non-numbers.\n        return;\n      }\n\n      this.rawValue = newValue;\n      this.updateFieldValue(nextSelectionStart);\n    }\n  }\n\n  applyMask(\n    isNumber: boolean,\n    rawValue: string,\n    disablePadAndTrim = false,\n  ): string {\n    const {\n      allowNegative,\n      decimal,\n      precision,\n      prefix,\n      suffix,\n      thousands,\n      min,\n      inputMode,\n    } = this._options;\n\n    let { max } = this._options;\n\n    rawValue = isNumber ? new Number(rawValue).toFixed(precision) : rawValue;\n    let onlyNumbers = rawValue.replace(this._onlyNumbersRegex, '');\n\n    if (!onlyNumbers && rawValue !== decimal) {\n      return '';\n    }\n\n    if (\n      inputMode === NgxCurrencyInputMode.Natural &&\n      !isNumber &&\n      !disablePadAndTrim\n    ) {\n      rawValue = this.padOrTrimPrecision(rawValue);\n      onlyNumbers = rawValue.replace(this._onlyNumbersRegex, '');\n    }\n\n    let integerPart = onlyNumbers\n      .slice(0, onlyNumbers.length - precision)\n      .replace(/^\\u0660*/g, '')\n      .replace(/^\\u06F0*/g, '')\n      .replace(/^0*/g, '');\n\n    if (integerPart == '') {\n      integerPart = '0';\n    }\n    const integerValue = parseInt(integerPart);\n\n    integerPart = integerPart.replace(\n      /\\B(?=([0-9\\u0660-\\u0669\\u06F0-\\u06F9]{3})+(?![0-9\\u0660-\\u0669\\u06F0-\\u06F9]))/g,\n      thousands,\n    );\n    if (thousands && integerPart.startsWith(thousands)) {\n      integerPart = integerPart.substring(1);\n    }\n\n    let newRawValue = integerPart;\n    const decimalPart = onlyNumbers.slice(onlyNumbers.length - precision);\n    const decimalValue = parseInt(decimalPart) || 0;\n\n    const isNegative = rawValue.indexOf('-') > -1;\n\n    // Ensure max is at least as large as min.\n    max =\n      max === null || max === undefined || min === null || min === undefined\n        ? max\n        : Math.max(max, min);\n\n    // Ensure precision number works well with more than 2 digits\n    // 23 / 100... 233 / 1000 and so on\n    const divideBy = Number('1'.padEnd(precision + 1, '0'));\n\n    // Restrict to the min and max values.\n    let newValue = integerValue + decimalValue / divideBy;\n\n    newValue = isNegative ? -newValue : newValue;\n    if (max !== null && max !== undefined && newValue > max) {\n      return this.applyMask(true, max + '');\n    } else if (min !== null && min !== undefined && newValue < min) {\n      return this.applyMask(true, min + '');\n    }\n\n    if (precision > 0) {\n      if (newRawValue == '0' && decimalPart.length < precision) {\n        newRawValue += decimal + '0'.repeat(precision - 1) + decimalPart;\n      } else {\n        newRawValue += decimal + decimalPart;\n      }\n    }\n\n    // let isZero = newValue == 0;\n    const operator = isNegative && allowNegative /*&& !isZero */ ? '-' : '';\n    return operator + prefix + newRawValue + suffix;\n  }\n\n  padOrTrimPrecision(rawValue: string): string {\n    const { decimal, precision } = this._options;\n\n    let decimalIndex = rawValue.lastIndexOf(decimal);\n    if (decimalIndex === -1) {\n      decimalIndex = rawValue.length;\n      rawValue += decimal;\n    }\n\n    let decimalPortion = rawValue\n      .substring(decimalIndex)\n      .replace(this._onlyNumbersRegex, '');\n    const actualPrecision = decimalPortion.length;\n    if (actualPrecision < precision) {\n      for (let i = actualPrecision; i < precision; i++) {\n        decimalPortion += '0';\n      }\n    } else if (actualPrecision > precision) {\n      decimalPortion = decimalPortion.substring(\n        0,\n        decimalPortion.length + precision - actualPrecision,\n      );\n    }\n\n    return rawValue.substring(0, decimalIndex) + decimal + decimalPortion;\n  }\n\n  clearMask(rawValue: string | null): number | null {\n    if (this.isNullable() && rawValue === '') return null;\n\n    let value = (rawValue || '0')\n      .replace(this._options.prefix, '')\n      .replace(this._options.suffix, '');\n\n    if (this._options.thousands) {\n      value = value.replace(\n        new RegExp('\\\\' + this._options.thousands, 'g'),\n        '',\n      );\n    }\n\n    if (this._options.decimal) {\n      value = value.replace(this._options.decimal, '.');\n    }\n\n    this._perArNumber.forEach((val: string, key: string) => {\n      const re = new RegExp(key, 'g');\n      value = value.replace(re, val);\n    });\n    return parseFloat(value);\n  }\n\n  changeToNegative(): void {\n    if (\n      this._options.allowNegative /*&& this.rawValue != \"\"*/ &&\n      this.rawValue?.charAt(0) != '-' /*&& this.value != 0*/\n    ) {\n      // Apply the mask to ensure the min and max values are enforced.\n      this.rawValue = this.applyMask(\n        false,\n        '-' + (this.rawValue ? this.rawValue : '0'),\n      );\n    }\n  }\n\n  changeToPositive(): void {\n    // Apply the mask to ensure the min and max values are enforced.\n    this.rawValue = this.applyMask(\n      false,\n      this.rawValue?.replace('-', '') ?? '',\n    );\n  }\n\n  removeNumber(keyCode: number): void {\n    const { decimal, thousands, prefix, suffix, inputMode } = this._options;\n\n    if (this.isNullable() && this.value == 0) {\n      this.rawValue = null;\n      return;\n    }\n\n    let selectionEnd = this.inputSelection.selectionEnd;\n    let selectionStart = this.inputSelection.selectionStart;\n\n    const suffixStart = (this.rawValue?.length ?? 0) - suffix.length;\n    selectionEnd = Math.min(suffixStart, Math.max(selectionEnd, prefix.length));\n    selectionStart = Math.min(\n      suffixStart,\n      Math.max(selectionStart, prefix.length),\n    );\n\n    // Check if selection was entirely in the prefix or suffix.\n    if (\n      selectionStart === selectionEnd &&\n      this.inputSelection.selectionStart !== this.inputSelection.selectionEnd\n    ) {\n      this.updateFieldValue(selectionStart);\n      return;\n    }\n\n    let decimalIndex = this.rawValue?.indexOf(decimal) ?? -1;\n    if (decimalIndex === -1) {\n      decimalIndex = this.rawValue?.length ?? 0;\n    }\n\n    let shiftSelection = 0;\n    let insertChars = '';\n\n    const isCursorInDecimals = decimalIndex < selectionEnd;\n    const isCursorImmediatelyAfterDecimalPoint =\n      decimalIndex + 1 === selectionEnd;\n\n    if (selectionEnd === selectionStart) {\n      if (keyCode == 8) {\n        if (selectionStart <= prefix.length) {\n          return;\n        }\n        selectionStart--;\n\n        // If previous char isn't a number, go back one more.\n        if (\n          !this.rawValue\n            ?.substring(selectionStart, selectionStart + 1)\n            .match(/\\d/)\n        ) {\n          selectionStart--;\n        }\n\n        // In natural mode, jump backwards when in decimal portion of number.\n        if (inputMode === NgxCurrencyInputMode.Natural && isCursorInDecimals) {\n          shiftSelection = -1;\n          // when removing a single whole number, replace it with 0\n          if (\n            isCursorImmediatelyAfterDecimalPoint &&\n            (this.value ?? 0) < 10 &&\n            (this.value ?? 0) > -10\n          ) {\n            insertChars += '0';\n          }\n        }\n      } else if (keyCode == 46 || keyCode == 63272) {\n        if (selectionStart === suffixStart) {\n          return;\n        }\n        selectionEnd++;\n\n        // If next char isn't a number, go one more.\n        if (\n          !this.rawValue\n            ?.substring(selectionStart, selectionStart + 1)\n            .match(/\\d/)\n        ) {\n          selectionStart++;\n          selectionEnd++;\n        }\n      }\n    }\n\n    // In natural mode, replace decimals with 0s.\n    if (\n      inputMode === NgxCurrencyInputMode.Natural &&\n      selectionStart > decimalIndex\n    ) {\n      const replacedDecimalCount = selectionEnd - selectionStart;\n      for (let i = 0; i < replacedDecimalCount; i++) {\n        insertChars += '0';\n      }\n    }\n\n    let selectionFromEnd = (this.rawValue?.length ?? 0) - selectionEnd;\n    this.rawValue =\n      this.rawValue?.substring(0, selectionStart) +\n      insertChars +\n      this.rawValue?.substring(selectionEnd);\n\n    // Remove leading thousand separator from raw value.\n    const startChar = this.rawValue.substring(prefix.length, prefix.length + 1);\n    if (startChar === thousands) {\n      this.rawValue =\n        this.rawValue.substring(0, prefix.length) +\n        this.rawValue.substring(prefix.length + 1);\n      selectionFromEnd = Math.min(\n        selectionFromEnd,\n        this.rawValue.length - prefix.length,\n      );\n    }\n\n    this.updateFieldValue(\n      this.rawValue.length - selectionFromEnd + shiftSelection,\n      true,\n    );\n  }\n\n  updateFieldValue(selectionStart?: number, disablePadAndTrim = false): void {\n    const newRawValue = this.applyMask(\n      false,\n      this.rawValue ?? '',\n      disablePadAndTrim,\n    );\n    selectionStart ??= this.rawValue?.length ?? 0;\n    selectionStart = Math.max(\n      this._options.prefix.length,\n      Math.min(\n        selectionStart,\n        (this.rawValue?.length ?? 0) - this._options.suffix.length,\n      ),\n    );\n    this.inputManager.updateValueAndCursor(\n      newRawValue,\n      this.rawValue?.length ?? 0,\n      selectionStart,\n    );\n  }\n\n  updateOptions(options: NgxCurrencyConfig): void {\n    const value = this.value;\n    this._options = options;\n    this.value = value;\n  }\n\n  prefixLength(): number {\n    return this._options.prefix.length;\n  }\n\n  suffixLength(): number {\n    return this._options.suffix.length;\n  }\n\n  isNullable() {\n    return this._options.nullable;\n  }\n\n  get canInputMoreNumbers(): boolean {\n    return this.inputManager.canInputMoreNumbers;\n  }\n\n  get inputSelection(): {\n    selectionStart: number;\n    selectionEnd: number;\n  } {\n    return this.inputManager.inputSelection;\n  }\n\n  get rawValue(): string | null {\n    return this.inputManager.rawValue;\n  }\n\n  set rawValue(value: string | null) {\n    this.inputManager.rawValue = value;\n  }\n\n  get storedRawValue(): string {\n    return this.inputManager.storedRawValue;\n  }\n\n  get value(): number | null {\n    return this.clearMask(this.rawValue);\n  }\n\n  set value(value: number | null) {\n    this.rawValue = this.applyMask(true, '' + value);\n  }\n\n  private _isNullOrUndefined(value: number | null | undefined): boolean {\n    return value === null || value === undefined;\n  }\n}\n","import { InputService } from './input.service';\nimport { NgxCurrencyConfig } from './ngx-currency.config';\n\nexport class InputHandler {\n  inputService: InputService;\n  onModelChange: (value: number | null) => void = () => undefined;\n  onModelTouched: () => void = () => undefined;\n\n  constructor(htmlInputElement: HTMLInputElement, options: NgxCurrencyConfig) {\n    this.inputService = new InputService(htmlInputElement, options);\n  }\n\n  handleCut(): void {\n    setTimeout(() => {\n      this.inputService.updateFieldValue();\n      this.setValue(this.inputService.value);\n      this.onModelChange(this.inputService.value);\n    }, 0);\n  }\n\n  handleInput(): void {\n    const rawValue = this.inputService.rawValue ?? '';\n    const selectionStart = this.inputService.inputSelection.selectionStart;\n    const keyCode = rawValue.charCodeAt(selectionStart - 1);\n    const rawValueLength = rawValue.length;\n    const storedRawValueLength = this.inputService.storedRawValue.length;\n\n    if (Math.abs(rawValueLength - storedRawValueLength) != 1) {\n      this.inputService.updateFieldValue(selectionStart);\n      this.onModelChange(this.inputService.value);\n      return;\n    }\n\n    // Restore the old value.\n    this.inputService.rawValue = this.inputService.storedRawValue;\n\n    if (rawValueLength < storedRawValueLength) {\n      // Chrome Android seems to move the cursor in response to a backspace AFTER processing the\n      // input event, so we need to wrap this in a timeout.\n      this.timer(() => {\n        // Move the cursor to just after the deleted value.\n        this.inputService.updateFieldValue(selectionStart + 1);\n\n        // Then backspace it.\n        this.inputService.removeNumber(8);\n        this.onModelChange(this.inputService.value);\n      }, 0);\n    }\n\n    if (rawValueLength > storedRawValueLength) {\n      // Move the cursor to just before the new value.\n      this.inputService.updateFieldValue(selectionStart - 1);\n\n      // Process the character like a keypress.\n      this._handleKeypressImpl(keyCode);\n    }\n  }\n\n  handleKeydown(event: KeyboardEvent): void {\n    const keyCode = event.which || event.charCode || event.keyCode;\n    if (keyCode == 8 || keyCode == 46 || keyCode == 63272) {\n      event.preventDefault();\n\n      if (\n        this.inputService.inputSelection.selectionStart <=\n          this.inputService.prefixLength() &&\n        this.inputService.inputSelection.selectionEnd >=\n          (this.inputService.rawValue?.length ?? 0) -\n            this.inputService.suffixLength()\n      ) {\n        this.clearValue();\n      } else {\n        this.inputService.removeNumber(keyCode);\n        this.onModelChange(this.inputService.value);\n      }\n    }\n  }\n\n  clearValue() {\n    this.setValue(this.inputService.isNullable() ? null : 0);\n    this.onModelChange(this.inputService.value);\n  }\n\n  handleKeypress(event: KeyboardEvent): void {\n    const keyCode = event.which || event.charCode || event.keyCode;\n    event.preventDefault();\n    if (keyCode === 97 && event.ctrlKey) {\n      return;\n    }\n\n    this._handleKeypressImpl(keyCode);\n  }\n\n  private _handleKeypressImpl(keyCode: number): void {\n    switch (keyCode) {\n      case undefined:\n      case 9:\n      case 13:\n        return;\n      case 43:\n        this.inputService.changeToPositive();\n        break;\n      case 45:\n        this.inputService.changeToNegative();\n        break;\n      default:\n        if (this.inputService.canInputMoreNumbers) {\n          const selectionRangeLength = Math.abs(\n            this.inputService.inputSelection.selectionEnd -\n              this.inputService.inputSelection.selectionStart,\n          );\n\n          if (\n            selectionRangeLength == (this.inputService.rawValue?.length ?? 0)\n          ) {\n            this.setValue(null);\n          }\n\n          this.inputService.addNumber(keyCode);\n        }\n        break;\n    }\n\n    this.onModelChange(this.inputService.value);\n  }\n\n  handlePaste(): void {\n    setTimeout(() => {\n      this.inputService.updateFieldValue();\n      this.setValue(this.inputService.value);\n      this.onModelChange(this.inputService.value);\n    }, 1);\n  }\n\n  updateOptions(options: NgxCurrencyConfig): void {\n    this.inputService.updateOptions(options);\n  }\n\n  getOnModelChange(): (value: number | null) => void {\n    return this.onModelChange;\n  }\n\n  setOnModelChange(callbackFunction: (value: number | null) => void): void {\n    this.onModelChange = callbackFunction;\n  }\n\n  getOnModelTouched(): () => void {\n    return this.onModelTouched;\n  }\n\n  setOnModelTouched(callbackFunction: () => void) {\n    this.onModelTouched = callbackFunction;\n  }\n\n  setValue(value: number | null): void {\n    this.inputService.value = value;\n  }\n\n  /**\n   * Passthrough to setTimeout that can be stubbed out in tests.\n   */\n  timer(callback: () => void, delayMilliseconds: number) {\n    setTimeout(callback, delayMilliseconds);\n  }\n}\n","import {\n  AfterViewInit,\n  Directive,\n  DoCheck,\n  ElementRef,\n  forwardRef,\n  HostListener,\n  Inject,\n  Input,\n  KeyValueDiffer,\n  KeyValueDiffers,\n  Optional,\n} from '@angular/core';\n\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { InputHandler } from './input.handler';\nimport {\n  NGX_CURRENCY_CONFIG,\n  NgxCurrencyConfig,\n  NgxCurrencyInputMode,\n} from './ngx-currency.config';\n\n@Directive({\n  selector: 'input[currencyMask]',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => NgxCurrencyDirective),\n      multi: true,\n    },\n  ],\n})\nexport class NgxCurrencyDirective\n  implements AfterViewInit, ControlValueAccessor, DoCheck\n{\n  @Input()\n  set currencyMask(value: Partial<NgxCurrencyConfig> | string) {\n    if (typeof value === 'string') return;\n\n    this._options = value;\n  }\n\n  /**\n   * @deprecated Use currencyMask input instead\n   */\n  @Input()\n  set options(value: Partial<NgxCurrencyConfig>) {\n    this._options = value;\n  }\n\n  private readonly _inputHandler: InputHandler;\n  private readonly _keyValueDiffer: KeyValueDiffer<\n    keyof NgxCurrencyConfig,\n    unknown\n  >;\n\n  private _options: Partial<NgxCurrencyConfig> = {};\n  private readonly _optionsTemplate: NgxCurrencyConfig;\n\n  constructor(\n    @Optional()\n    @Inject(NGX_CURRENCY_CONFIG)\n    globalOptions: Partial<NgxCurrencyConfig>,\n    keyValueDiffers: KeyValueDiffers,\n    private readonly _elementRef: ElementRef<HTMLInputElement>,\n  ) {\n    this._optionsTemplate = {\n      align: 'right',\n      allowNegative: true,\n      allowZero: true,\n      decimal: '.',\n      precision: 2,\n      prefix: '$ ',\n      suffix: '',\n      thousands: ',',\n      nullable: false,\n      inputMode: NgxCurrencyInputMode.Financial,\n      ...globalOptions,\n    };\n\n    this._keyValueDiffer = keyValueDiffers.find({}).create();\n\n    this._inputHandler = new InputHandler(this._elementRef.nativeElement, {\n      ...this._optionsTemplate,\n      ...this._options,\n    });\n  }\n\n  ngAfterViewInit() {\n    this._elementRef.nativeElement.style.textAlign =\n      this._options?.align ?? this._optionsTemplate.align;\n  }\n\n  ngDoCheck() {\n    if (this._keyValueDiffer.diff(this._options)) {\n      this._elementRef.nativeElement.style.textAlign =\n        this._options?.align ?? this._optionsTemplate.align;\n\n      this._inputHandler.updateOptions({\n        ...this._optionsTemplate,\n        ...this._options,\n      });\n    }\n  }\n\n  @HostListener('blur', ['$event'])\n  handleBlur(event: FocusEvent) {\n    this._inputHandler.getOnModelTouched().apply(event);\n  }\n\n  @HostListener('cut')\n  handleCut() {\n    if (!this.isChromeAndroid()) {\n      if (!this.isReadOnly()) this._inputHandler.handleCut();\n    }\n  }\n\n  @HostListener('input')\n  handleInput() {\n    if (this.isChromeAndroid()) {\n      if (!this.isReadOnly()) this._inputHandler.handleInput();\n    }\n  }\n\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent) {\n    if (!this.isChromeAndroid()) {\n      if (!this.isReadOnly()) this._inputHandler.handleKeydown(event);\n    }\n  }\n\n  @HostListener('keypress', ['$event'])\n  handleKeypress(event: KeyboardEvent) {\n    if (!this.isChromeAndroid()) {\n      if (!this.isReadOnly()) this._inputHandler.handleKeypress(event);\n    }\n  }\n\n  @HostListener('paste')\n  handlePaste() {\n    if (!this.isChromeAndroid()) {\n      if (!this.isReadOnly()) this._inputHandler.handlePaste();\n    }\n  }\n\n  @HostListener('drop', ['$event'])\n  handleDrop(event: DragEvent) {\n    if (!this.isChromeAndroid()) {\n      event.preventDefault();\n    }\n  }\n\n  isChromeAndroid(): boolean {\n    return (\n      /chrome/i.test(navigator.userAgent) &&\n      /android/i.test(navigator.userAgent)\n    );\n  }\n\n  isReadOnly(): boolean {\n    return this._elementRef.nativeElement.hasAttribute('readonly');\n  }\n\n  registerOnChange(callbackFunction: (value: number | null) => void): void {\n    this._inputHandler.setOnModelChange(callbackFunction);\n  }\n\n  registerOnTouched(callbackFunction: () => void): void {\n    this._inputHandler.setOnModelTouched(callbackFunction);\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this._elementRef.nativeElement.disabled = isDisabled;\n  }\n\n  writeValue(value: number): void {\n    this._inputHandler.setValue(value);\n  }\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_CURRENCY_CONFIG, NgxCurrencyConfig } from './ngx-currency.config';\n\nexport function provideEnvironmentNgxCurrency(\n  config: Partial<NgxCurrencyConfig>,\n): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: NGX_CURRENCY_CONFIG,\n      useValue: config,\n    },\n  ]);\n}\n","/*\n * Public API Surface of ngx-currency\n */\n\nexport * from './lib/ngx-currency.config';\nexport * from './lib/ngx-currency.directive';\nexport * from './lib/ngx-currency.providers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}