{"version":3,"file":"ngx-trim-directive.mjs","sources":["../../../projects/ngx-trim-directive/src/lib/ngx-trim.directive.ts","../../../projects/ngx-trim-directive/src/lib/ngx-trim-directive.module.ts","../../../projects/ngx-trim-directive/src/public-api.ts","../../../projects/ngx-trim-directive/src/ngx-trim-directive.ts"],"sourcesContent":["import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\n\n@Directive({\n  selector: 'input[trim],textarea[trim]',\n})\nexport class NgxTrimDirective implements OnInit, OnDestroy {\n\n  private _trim: TrimOption = '';\n  @Input('trim')\n  public set trim(trimOption: TrimOption) {\n    if (trimOption !== '' && trimOption !== 'blur' && trimOption !== false) {\n      console.warn(`Note: The value ${JSON.stringify(trimOption)} is not assignable to the trim attribute.\n        Only blank string (\"\"), \"blur\" or false is allowed.`);\n\n      this._trim = false;\n      return;\n    }\n\n    this._trim = trimOption;\n\n    setTimeout( // fix the `Expression has changed after it was checked` error\n\n      () => {\n\n        const elem = this.elementRef.nativeElement;\n\n        const eleValue = elem.value;\n\n        if (trimOption !== false && eleValue !== eleValue.trim()) {\n\n          // initially trim the value if needed\n          NgxTrimDirective.dispatchEvent(elem, 'blur');\n        }\n\n      },\n\n    );\n  }\n\n  public get trim() {\n    return this._trim;\n  }\n\n  @Input() trimOnWriteValue = true;\n\n  private _valueAccessor: ControlValueAccessor | null = null;\n  private _writeValue: ((value: any) => void) | null = null;\n\n  constructor(\n    private elementRef: ElementRef,\n    @Optional() private ngControl: NgControl,\n  ) {\n  }\n\n  private static getCaret(el: TrimElement) {\n\n    return {\n      start: el.selectionStart,\n      end: el.selectionEnd,\n    };\n\n  }\n\n  private static setCaret(el: TrimElement, start: number | null, end: number | null) {\n\n    el.selectionStart = start;\n    el.selectionEnd = end;\n\n    el.focus();\n\n  }\n\n  private static dispatchEvent(el: TrimElement, eventType: string) {\n\n    const event = new Event(eventType);\n    el.dispatchEvent(event);\n\n  }\n\n  private static TrimOption(el: TrimElement, value: string) {\n\n    el.value = value.trim();\n\n    NgxTrimDirective.dispatchEvent(el, 'input');\n\n  }\n\n  ngOnInit(): void {\n\n    if (!this.ngControl) {\n\n      console.warn(\n        'Note: The trim directive should be used with one of ngModel, formControl or formControlName directives.');\n\n      return;\n\n    }\n\n    this._valueAccessor = this.ngControl.valueAccessor;\n\n    if (this._valueAccessor) {\n      this._writeValue = this._valueAccessor.writeValue;\n      this._valueAccessor.writeValue = (value) => {\n        const _value =\n          this.trim === false || !value || 'function' !== typeof value.trim || !this.trimOnWriteValue\n            ? value\n            : value.trim();\n\n        if (this._writeValue) {\n          this._writeValue.call(this._valueAccessor, _value);\n        }\n\n        if (value !== _value) {\n          if ((this._valueAccessor as any)['onChange']) {\n            (this._valueAccessor as any)['onChange'](_value);\n          }\n\n          if ((this._valueAccessor as any)['onTouched']) {\n            (this._valueAccessor as any)['onTouched']();\n          }\n        }\n\n      };\n    }\n\n  }\n\n  ngOnDestroy(): void {\n\n    if (this._valueAccessor && this._writeValue) {\n\n      this._valueAccessor.writeValue = this._writeValue;\n\n    }\n\n  }\n\n  @HostListener('blur', [\n    '$event.target',\n    '$event.target.value',\n  ])\n  onBlur(el: any, value: string): void {\n    if (this.trim === false) {\n\n      return;\n\n    }\n\n    if ((this.trim === '' || 'blur' === this.trim) && 'function' === typeof value.trim && value.trim() !== value) {\n\n      NgxTrimDirective.TrimOption(el, value);\n      NgxTrimDirective.dispatchEvent(el, 'blur'); // in case updateOn is set to blur\n\n    }\n\n  }\n\n  @HostListener('input', [\n    '$event.target',\n    '$event.target.value',\n  ])\n  onInput(el: any, value: string): void {\n\n    if (this.trim === false) {\n\n      return;\n\n    }\n\n    if (this.trim === '' && 'function' === typeof value.trim && value.trim() !== value) {\n\n      let { start, end } = NgxTrimDirective.getCaret(el);\n\n      if (value[0] === ' ' && start === 1 && end === 1) {\n\n        start = 0;\n        end = 0;\n\n      }\n\n      NgxTrimDirective.TrimOption(el, value);\n\n      NgxTrimDirective.setCaret(el, start, end);\n\n    }\n\n  }\n\n}\n\ntype TrimElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport type TrimOption = '' | 'blur' | false;\n","import { NgModule } from '@angular/core';\nimport { NgxTrimDirective } from './ngx-trim.directive';\n\n\n\n@NgModule({\n  declarations: [\n    NgxTrimDirective,\n  ],\n  imports: [],\n  exports: [\n    NgxTrimDirective,\n  ],\n})\nexport class NgxTrimDirectiveModule {\n}\n","/*\n * Public API Surface of ngx-trim-directive\n */\n\nexport * from './lib/ngx-trim.directive';\nexport * from './lib/ngx-trim-directive.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAMa,gBAAgB,CAAA;IAG3B,IACW,IAAI,CAAC,UAAsB,EAAA;QACpC,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,KAAK,EAAE;YACtE,OAAO,CAAC,IAAI,CAAC,CAAA,gBAAA,EAAmB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;AACJ,2DAAA,CAAA,CAAC,CAAC;AAExD,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;AAExB,QAAA,UAAU;AAER,QAAA,MAAK;AAEH,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAE3C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC;YAE5B,IAAI,UAAU,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,EAAE;;AAGxD,gBAAA,gBAAgB,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9C,aAAA;AAEH,SAAC,CAEF,CAAC;KACH;AAED,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;IAOD,WACU,CAAA,UAAsB,EACV,SAAoB,EAAA;QADhC,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;QACV,IAAS,CAAA,SAAA,GAAT,SAAS,CAAW;QA3ClC,IAAK,CAAA,KAAA,GAAe,EAAE,CAAC;QAoCtB,IAAgB,CAAA,gBAAA,GAAG,IAAI,CAAC;QAEzB,IAAc,CAAA,cAAA,GAAgC,IAAI,CAAC;QACnD,IAAW,CAAA,WAAA,GAAkC,IAAI,CAAC;KAMzD;IAEO,OAAO,QAAQ,CAAC,EAAe,EAAA;QAErC,OAAO;YACL,KAAK,EAAE,EAAE,CAAC,cAAc;YACxB,GAAG,EAAE,EAAE,CAAC,YAAY;SACrB,CAAC;KAEH;AAEO,IAAA,OAAO,QAAQ,CAAC,EAAe,EAAE,KAAoB,EAAE,GAAkB,EAAA;AAE/E,QAAA,EAAE,CAAC,cAAc,GAAG,KAAK,CAAC;AAC1B,QAAA,EAAE,CAAC,YAAY,GAAG,GAAG,CAAC;QAEtB,EAAE,CAAC,KAAK,EAAE,CAAC;KAEZ;AAEO,IAAA,OAAO,aAAa,CAAC,EAAe,EAAE,SAAiB,EAAA;AAE7D,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;AACnC,QAAA,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;KAEzB;AAEO,IAAA,OAAO,UAAU,CAAC,EAAe,EAAE,KAAa,EAAA;AAEtD,QAAA,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAExB,QAAA,gBAAgB,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;KAE7C;IAED,QAAQ,GAAA;AAEN,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAEnB,YAAA,OAAO,CAAC,IAAI,CACV,yGAAyG,CAAC,CAAC;YAE7G,OAAO;AAER,SAAA;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;QAEnD,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;YAClD,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,CAAC,KAAK,KAAI;gBACzC,MAAM,MAAM,GACV,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,UAAU,KAAK,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,gBAAgB;AACzF,sBAAE,KAAK;AACP,sBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;gBAEnB,IAAI,IAAI,CAAC,WAAW,EAAE;oBACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACpD,iBAAA;gBAED,IAAI,KAAK,KAAK,MAAM,EAAE;AACpB,oBAAA,IAAK,IAAI,CAAC,cAAsB,CAAC,UAAU,CAAC,EAAE;wBAC3C,IAAI,CAAC,cAAsB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAClD,qBAAA;AAED,oBAAA,IAAK,IAAI,CAAC,cAAsB,CAAC,WAAW,CAAC,EAAE;AAC5C,wBAAA,IAAI,CAAC,cAAsB,CAAC,WAAW,CAAC,EAAE,CAAC;AAC7C,qBAAA;AACF,iBAAA;AAEH,aAAC,CAAC;AACH,SAAA;KAEF;IAED,WAAW,GAAA;AAET,QAAA,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,EAAE;YAE3C,IAAI,CAAC,cAAc,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;AAEnD,SAAA;KAEF;IAMD,MAAM,CAAC,EAAO,EAAE,KAAa,EAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;YAEvB,OAAO;AAER,SAAA;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,UAAU,KAAK,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE;AAE5G,YAAA,gBAAgB,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACvC,gBAAgB,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAE5C,SAAA;KAEF;IAMD,OAAO,CAAC,EAAO,EAAE,KAAa,EAAA;AAE5B,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE;YAEvB,OAAO;AAER,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,IAAI,UAAU,KAAK,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE;AAElF,YAAA,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAEnD,YAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE;gBAEhD,KAAK,GAAG,CAAC,CAAC;gBACV,GAAG,GAAG,CAAC,CAAC;AAET,aAAA;AAED,YAAA,gBAAgB,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAEvC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAE3C,SAAA;KAEF;8GArLU,gBAAgB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAhB,gBAAgB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,MAAA,EAAA,2CAAA,EAAA,OAAA,EAAA,4CAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,4BAA4B;AACvC,iBAAA,CAAA;;0BA8CI,QAAQ;4CAzCA,IAAI,EAAA,CAAA;sBADd,KAAK;uBAAC,MAAM,CAAA;gBAmCJ,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBAkGN,MAAM,EAAA,CAAA;sBAJL,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,MAAM,EAAE;wBACpB,eAAe;wBACf,qBAAqB;AACtB,qBAAA,CAAA;gBAqBD,OAAO,EAAA,CAAA;sBAJN,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,OAAO,EAAE;wBACrB,eAAe;wBACf,qBAAqB;AACtB,qBAAA,CAAA;;;MCnJU,sBAAsB,CAAA;8GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;+GAAtB,sBAAsB,EAAA,YAAA,EAAA,CAP/B,gBAAgB,CAAA,EAAA,OAAA,EAAA,CAIhB,gBAAgB,CAAA,EAAA,CAAA,CAAA,EAAA;+GAGP,sBAAsB,EAAA,CAAA,CAAA,EAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBATlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,gBAAgB;AACjB,qBAAA;AACD,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,OAAO,EAAE;wBACP,gBAAgB;AACjB,qBAAA;AACF,iBAAA,CAAA;;;ACbD;;AAEG;;ACFH;;AAEG;;;;"}