From a534473ba838cc6b85b9d46042bc9b783e6c6918 Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Mon, 11 Nov 2024 12:31:40 -0700 Subject: [PATCH 01/10] refactor(tests): update test functions and improve input handling TypeTest now mimics true typing since there isn't a browser with the testing suite. --- .../ngx-mask-lib/src/test/add-prefix.spec.ts | 70 +++++++++---------- .../ngx-mask-lib/src/test/basic-logic.spec.ts | 18 ++--- projects/ngx-mask-lib/src/test/delete.spec.ts | 4 +- .../ngx-mask-lib/src/test/dynamic.spec.ts | 2 +- .../ngx-mask-lib/src/test/secure-mask.spec.ts | 28 ++++---- .../ngx-mask-lib/src/test/separator.spec.ts | 10 +-- .../src/test/show-mask-typed.spec.ts | 8 +-- .../ngx-mask-lib/src/test/time-mask.spec.ts | 49 ++++++------- .../test/utils/test-functions.component.ts | 42 +++++++++-- 9 files changed, 133 insertions(+), 98 deletions(-) diff --git a/projects/ngx-mask-lib/src/test/add-prefix.spec.ts b/projects/ngx-mask-lib/src/test/add-prefix.spec.ts index 5694b87d..50067da5 100644 --- a/projects/ngx-mask-lib/src/test/add-prefix.spec.ts +++ b/projects/ngx-mask-lib/src/test/add-prefix.spec.ts @@ -2,7 +2,7 @@ import type { ComponentFixture } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal } from './utils/test-functions.component'; +import { equal, Paste } from './utils/test-functions.component'; import { provideNgxMask } from '../lib/ngx-mask.providers'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; @@ -40,18 +40,18 @@ describe('Directive: Mask (Add prefix)', () => { equal('123456789', '+55 (12) 3456-789_', fixture); equal('1234567890', '+55 (12) 3456-7890', fixture); equal('12345678901', '+55 (12) 3 4567-8901', fixture); - equal('+55 (1', '+55 (1_) ____-____', fixture); - equal('+55 (12', '+55 (12) ____-____', fixture); - equal('+55 (12)', '+55 (12) ____-____', fixture); - equal('+55 (12) 3', '+55 (12) 3___-____', fixture); - equal('+55 (12) 34', '+55 (12) 34__-____', fixture); - equal('+55 (12) 345', '+55 (12) 345_-____', fixture); - equal('+55 (12) 3456', '+55 (12) 3456-____', fixture); - equal('+55 (12) 3456-7', '+55 (12) 3456-7___', fixture); - equal('+55 (12) 3456-78', '+55 (12) 3456-78__', fixture); - equal('+55 (12) 3456-789', '+55 (12) 3456-789_', fixture); - equal('+55 (12) 3456-7890', '+55 (12) 3456-7890', fixture); - equal('+55 (12) 3 4567-8901', '+55 (12) 3 4567-8901', fixture); + equal('+55 (1', '+55 (1_) ____-____', fixture, false, Paste); + equal('+55 (12', '+55 (12) ____-____', fixture, false, Paste); + equal('+55 (12)', '+55 (12) ____-____', fixture, false, Paste); + equal('+55 (12) 3', '+55 (12) 3___-____', fixture, false, Paste); + equal('+55 (12) 34', '+55 (12) 34__-____', fixture, false, Paste); + equal('+55 (12) 345', '+55 (12) 345_-____', fixture, false, Paste); + equal('+55 (12) 3456', '+55 (12) 3456-____', fixture, false, Paste); + equal('+55 (12) 3456-7', '+55 (12) 3456-7___', fixture, false, Paste); + equal('+55 (12) 3456-78', '+55 (12) 3456-78__', fixture, false, Paste); + equal('+55 (12) 3456-789', '+55 (12) 3456-789_', fixture, false, Paste); + equal('+55 (12) 3456-7890', '+55 (12) 3456-7890', fixture, false, Paste); + equal('+55 (12) 3 4567-8901', '+55 (12) 3 4567-8901', fixture, false, Paste); }); it('dropSpecialCharacters false should return value with prefix', () => { component.mask = '00-000-000-00'; @@ -71,15 +71,15 @@ describe('Directive: Mask (Add prefix)', () => { it('should delete prefix in pasted content', () => { component.mask = 'AAA-AAA-AAA'; component.prefix = 'FOO-'; - equal('FOO-D', 'FOO-D', fixture); - equal('FOO-DD', 'FOO-DD', fixture); - equal('FOO-DDD', 'FOO-DDD', fixture); - equal('FOO-DDD-D', 'FOO-DDD-D', fixture); - equal('FOO-DDD-DD', 'FOO-DDD-DD', fixture); - equal('FOO-DDD-DDD', 'FOO-DDD-DDD', fixture); - equal('FOO-DDD-DDD-D', 'FOO-DDD-DDD-D', fixture); - equal('FOO-DDD-DDD-DD', 'FOO-DDD-DDD-DD', fixture); - equal('FOO-DDD-DDD-DDD', 'FOO-DDD-DDD-DDD', fixture); + equal('FOO-D', 'FOO-D', fixture, false, Paste); + equal('FOO-DD', 'FOO-DD', fixture, false, Paste); + equal('FOO-DDD', 'FOO-DDD', fixture, false, Paste); + equal('FOO-DDD-D', 'FOO-DDD-D', fixture, false, Paste); + equal('FOO-DDD-DD', 'FOO-DDD-DD', fixture, false, Paste); + equal('FOO-DDD-DDD', 'FOO-DDD-DDD', fixture, false, Paste); + equal('FOO-DDD-DDD-D', 'FOO-DDD-DDD-D', fixture, false, Paste); + equal('FOO-DDD-DDD-DD', 'FOO-DDD-DDD-DD', fixture, false, Paste); + equal('FOO-DDD-DDD-DDD', 'FOO-DDD-DDD-DDD', fixture, false, Paste); expect(component.form.value).toEqual('DDDDDDDDD'); }); @@ -87,15 +87,15 @@ describe('Directive: Mask (Add prefix)', () => { component.mask = 'AAA-AAA-AAA'; component.prefix = 'FOO-'; component.dropSpecialCharacters = false; - equal('FOO-S', 'FOO-S', fixture); - equal('FOO-SS', 'FOO-SS', fixture); - equal('FOO-SSS', 'FOO-SSS', fixture); - equal('FOO-SSS-S', 'FOO-SSS-S', fixture); - equal('FOO-SSS-SS', 'FOO-SSS-SS', fixture); - equal('FOO-SSS-SSS', 'FOO-SSS-SSS', fixture); - equal('FOO-SSS-SSS-S', 'FOO-SSS-SSS-S', fixture); - equal('FOO-SSS-SSS-SS', 'FOO-SSS-SSS-SS', fixture); - equal('FOO-SSS-SSS-SSS', 'FOO-SSS-SSS-SSS', fixture); + equal('FOO-S', 'FOO-S', fixture, false, Paste); + equal('FOO-SS', 'FOO-SS', fixture, false, Paste); + equal('FOO-SSS', 'FOO-SSS', fixture, false, Paste); + equal('FOO-SSS-S', 'FOO-SSS-S', fixture, false, Paste); + equal('FOO-SSS-SS', 'FOO-SSS-SS', fixture, false, Paste); + equal('FOO-SSS-SSS', 'FOO-SSS-SSS', fixture, false, Paste); + equal('FOO-SSS-SSS-S', 'FOO-SSS-SSS-S', fixture, false, Paste); + equal('FOO-SSS-SSS-SS', 'FOO-SSS-SSS-SS', fixture, false, Paste); + equal('FOO-SSS-SSS-SSS', 'FOO-SSS-SSS-SSS', fixture, false, Paste); expect(component.form.value).toEqual('FOO-SSS-SSS-SSS'); }); @@ -144,21 +144,21 @@ describe('Directive: Mask (Add prefix)', () => { expect(component.form.value).toBe('KZ123 123'); }); - it('should remove prefix when setValue triggerOnMaskChange = false', () => { + it('should remove prefix when setValue triggerOnMaskChange = false & dropSpecialCharacters = true', () => { component.mask = '000 000'; component.prefix = 'KZ'; component.dropSpecialCharacters = true; component.form.setValue('KZ123123'); equal('KZ123123', 'KZ123 123', fixture); - expect(component.form.value).toBe('KZ123123'); + expect(component.form.value).toBe('123123'); }); - it('should remove prefix when setValue triggerOnMaskChange = false', () => { + it('should remove prefix when setValue triggerOnMaskChange = false & dropSpecialCharacters = false', () => { component.mask = '000 000'; component.prefix = 'KZ'; component.dropSpecialCharacters = false; component.form.setValue('KZ123123'); equal('KZ123123', 'KZ123 123', fixture); - expect(component.form.value).toBe('KZ123123'); + expect(component.form.value).toBe('KZ123 123'); }); }); diff --git a/projects/ngx-mask-lib/src/test/basic-logic.spec.ts b/projects/ngx-mask-lib/src/test/basic-logic.spec.ts index 24cc97f6..2c75594e 100644 --- a/projects/ngx-mask-lib/src/test/basic-logic.spec.ts +++ b/projects/ngx-mask-lib/src/test/basic-logic.spec.ts @@ -5,7 +5,7 @@ import { By } from '@angular/platform-browser'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal, typeTest } from './utils/test-functions.component'; +import { equal, Paste, pasteTest } from './utils/test-functions.component'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; import { provideNgxMask } from '../lib/ngx-mask.providers'; @@ -110,7 +110,7 @@ describe('Directive: Mask', () => { it('Masks with numbers, strings e special characters', () => { component.mask = '(099) A99-SSSS'; - equal('as', '(', fixture); + equal('as', '(', fixture, false, Paste); equal('(1', '(1', fixture); equal('(12', '(12', fixture); equal('(123', '(123', fixture); @@ -339,7 +339,7 @@ describe('Directive: Mask', () => { it('should strip special characters from form control value', () => { component.mask = '00/00/0000'; - typeTest('30/08/19921', fixture); + pasteTest('30/08/19921', fixture); expect(component.form.value).toBe('30081992'); }); @@ -368,9 +368,9 @@ describe('Directive: Mask', () => { }, }; equal('', '', fixture); - equal('2578989', '[', fixture); + equal('2578989', '[', fixture, false, Paste); equal('hello world', '[hel]-[low]*[or]', fixture); - equal('111.111-11', '[', fixture); + equal('111.111-11', '[', fixture, false, Paste); component.mask = '(000-000)'; component.specialCharacters = ['(', '-', ')']; @@ -496,7 +496,7 @@ describe('Directive: Mask', () => { component.mask = '(000) 000-00-00'; fixture.detectChanges(); equal('0', '(0', fixture); - equal('(', '(', fixture); + equal('(', '(', fixture, false, Paste); const debugElement: DebugElement = fixture.debugElement.query(By.css('input')); const inputTarget: HTMLInputElement = debugElement.nativeElement as HTMLInputElement; debugElement.triggerEventHandler('keydown', { @@ -504,7 +504,9 @@ describe('Directive: Mask', () => { keyCode: 8, target: inputTarget, }); - equal('(', '', fixture); + debugElement.triggerEventHandler('input', { target: inputTarget }); + debugElement.triggerEventHandler('ngModelChange', { target: inputTarget }); + expect(inputTarget.value).toBe(''); }); it('should remove ghost character on toggling mask', () => { @@ -941,7 +943,7 @@ describe('Directive: Mask', () => { component.showMaskTyped = true; component.keepCharacterPositions = true; - equal('11/11/1111', '11/11/1111', fixture); + equal('11111111', '11/11/1111', fixture, false, Paste); component.form.setValue('22/22/2222'); fixture.detectChanges(); requestAnimationFrame(() => { diff --git a/projects/ngx-mask-lib/src/test/delete.spec.ts b/projects/ngx-mask-lib/src/test/delete.spec.ts index 62b6ebaa..6d596a02 100644 --- a/projects/ngx-mask-lib/src/test/delete.spec.ts +++ b/projects/ngx-mask-lib/src/test/delete.spec.ts @@ -5,7 +5,6 @@ import type { DebugElement } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal } from './utils/test-functions.component'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; import { provideNgxMask } from '../lib/ngx-mask.providers'; @@ -86,8 +85,9 @@ describe('Directive: Mask (Delete)', () => { target: inputTarget, }); debugElement.triggerEventHandler('input', { target: inputTarget }); + debugElement.triggerEventHandler('ngModelChange', { target: inputTarget }); - equal(inputTarget.value, '***/*5/6789', fixture); + expect(inputTarget.value).toEqual('***/*5/6789'); expect(inputTarget.selectionStart).toEqual(6); }); diff --git a/projects/ngx-mask-lib/src/test/dynamic.spec.ts b/projects/ngx-mask-lib/src/test/dynamic.spec.ts index eb436594..5e20201a 100644 --- a/projects/ngx-mask-lib/src/test/dynamic.spec.ts +++ b/projects/ngx-mask-lib/src/test/dynamic.spec.ts @@ -221,7 +221,7 @@ describe('Directive: Mask (Dynamic)', () => { expect(component.form.valid).toBeFalse(); equal('A0', 'A0', fixture); expect(component.form.valid).toBeFalse(); - equal('A00', 'A00', fixture); + equal('A00', 'A0 0', fixture); expect(component.form.valid).toBeFalse(); equal('AAA0DD', 'AAA 0DD', fixture); expect(component.form.valid).toBeTrue(); diff --git a/projects/ngx-mask-lib/src/test/secure-mask.spec.ts b/projects/ngx-mask-lib/src/test/secure-mask.spec.ts index fdedcdf8..536e4ff9 100644 --- a/projects/ngx-mask-lib/src/test/secure-mask.spec.ts +++ b/projects/ngx-mask-lib/src/test/secure-mask.spec.ts @@ -3,7 +3,7 @@ import { fakeAsync, TestBed, tick } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal, typeTest } from './utils/test-functions.component'; +import { equal, typeTest, pasteTest, Paste } from './utils/test-functions.component'; import { provideNgxMask } from '../lib/ngx-mask.providers'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; import type { DebugElement } from '@angular/core'; @@ -69,7 +69,7 @@ describe('Directive: Mask (Secure)', () => { it('it checks secure input functionality on reset', () => { component.mask = 'XXX/X0/0000'; component.hiddenInput = true; - typeTest('54321', fixture); + pasteTest('54321', fixture); component.form.reset('98765'); fixture.whenStable().then(() => { expect(fixture.nativeElement.querySelector('input').value).toBe('***/*5'); @@ -79,7 +79,7 @@ describe('Directive: Mask (Secure)', () => { it('it checks secure input functionality on reset then typed', () => { component.mask = 'XXX/X0/0000'; component.hiddenInput = true; - typeTest('54321', fixture); + pasteTest('54321', fixture); component.form.reset(); equal('98765', '***/*5', fixture); }); @@ -87,7 +87,7 @@ describe('Directive: Mask (Secure)', () => { it('it checks secure input functionality on setValue(longer string)', () => { component.mask = 'XXX/X0/0000'; component.hiddenInput = true; - typeTest('54321', fixture); + pasteTest('54321', fixture); component.form.setValue('1234567'); fixture.whenStable().then(() => { expect(fixture.nativeElement.querySelector('input').value).toBe('***/*5/67'); @@ -106,7 +106,7 @@ describe('Directive: Mask (Secure)', () => { fixture.detectChanges(); expect(component.form.dirty).toBeTruthy(); expect(component.form.pristine).toBeFalsy(); - fixture.whenStable().then(() => { + return fixture.whenStable().then(() => { expect(fixture.nativeElement.querySelector('input').value).toBe('123/45/6789'); }); }); @@ -133,7 +133,7 @@ describe('Directive: Mask (Secure)', () => { component.hiddenInput = true; component.mask = 'XXX/X0/0000'; equal('54321', '***/*1', fixture); - typeTest('1', fixture); + pasteTest('1', fixture); expect(component.form.value).toBe('1'); component.form.reset(); expect(component.form.value).toBe(null); @@ -207,7 +207,7 @@ describe('Directive: Mask (Secure)', () => { equal('1234', '***-*', fixture); fixture.detectChanges(); component.hiddenInput = false; - equal(inputTarget.value, '123-4', fixture, true); + equal(inputTarget.value, '123-4', fixture, true, Paste); }); it('change hiddenInput to false ', async () => { @@ -224,17 +224,15 @@ describe('Directive: Mask (Secure)', () => { }); it('change hiddenInput to false when mask is full', async () => { - const debug: DebugElement = fixture.debugElement.query(By.css('input')); - const inputTarget: HTMLInputElement = debug.nativeElement as HTMLInputElement; - spyOnProperty(document, 'activeElement').and.returnValue(inputTarget); - fixture.detectChanges(); component.mask = 'XXX/XX/XXXX'; component.hiddenInput = true; - equal('123456789', '***/**/****', fixture); - expect(component.form.value).toBe('123456789'); + fixture.detectChanges(); + typeTest('123456789', fixture); fixture.detectChanges(); component.hiddenInput = false; - equal(inputTarget.value, '123/45/6789', fixture, true); - expect(component.form.value).toBe('123456789'); + fixture.detectChanges(); + return fixture.whenStable().then(() => { + expect(fixture.nativeElement.querySelector('input').value).toBe('123/45/6789'); + }); }); }); diff --git a/projects/ngx-mask-lib/src/test/separator.spec.ts b/projects/ngx-mask-lib/src/test/separator.spec.ts index 93529b7a..4cf63a10 100644 --- a/projects/ngx-mask-lib/src/test/separator.spec.ts +++ b/projects/ngx-mask-lib/src/test/separator.spec.ts @@ -4,7 +4,7 @@ import { By } from '@angular/platform-browser'; import type { DebugElement } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal, typeTest } from './utils/test-functions.component'; +import { equal, Paste, typeTest } from './utils/test-functions.component'; import { provideNgxMask } from '../lib/ngx-mask.providers'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; import { initialConfig } from 'ngx-mask'; @@ -114,7 +114,7 @@ describe('Separator: Mask', () => { it('separator precision 0 for 1000000.00', () => { component.mask = 'separator.0'; - equal('1000000.00', '1 000 000', fixture); + equal('1000000.00', '1 000 000', fixture, false, Paste); }); it('separator precision 2 with 0 after point for 1000000.00', () => { @@ -201,7 +201,7 @@ describe('Separator: Mask', () => { it('separator thousandSeparator . precision 0 for 1000000.00', () => { component.mask = 'separator.0'; component.thousandSeparator = '.'; - equal('1000000,00', '1.000.000', fixture); + equal('1000000,00', '1.000.000', fixture, false, Paste); }); it('separator thousandSeparator , for 1000000', () => { @@ -225,7 +225,7 @@ describe('Separator: Mask', () => { it('separator thousandSeparator , precision 0 for 1000000.00', () => { component.mask = 'separator.0'; component.thousandSeparator = ','; - equal('1000000.00', '1,000,000', fixture); + equal('1000000.00', '1,000,000', fixture, false, Paste); }); it(`separator thousandSeparator ' for 1000000`, () => { @@ -249,7 +249,7 @@ describe('Separator: Mask', () => { it(`separator thousandSeparator ' precision 0 for 1000000.00`, () => { component.mask = 'separator.0'; component.thousandSeparator = `'`; - equal('1000000.00', `1'000'000`, fixture); + equal('1000000.00', `1'000'000`, fixture, false, Paste); }); it('should not shift cursor for input in-between digits', () => { diff --git a/projects/ngx-mask-lib/src/test/show-mask-typed.spec.ts b/projects/ngx-mask-lib/src/test/show-mask-typed.spec.ts index 28b9e2d8..af062b92 100644 --- a/projects/ngx-mask-lib/src/test/show-mask-typed.spec.ts +++ b/projects/ngx-mask-lib/src/test/show-mask-typed.spec.ts @@ -3,7 +3,7 @@ import { TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal } from './utils/test-functions.component'; +import { equal, Paste } from './utils/test-functions.component'; import { provideNgxMask } from '../lib/ngx-mask.providers'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; import type { DebugElement } from '@angular/core'; @@ -193,9 +193,9 @@ describe('Directive: Mask', () => { spyOnProperty(document, 'activeElement').and.returnValue(inputTarget); fixture.detectChanges(); - equal('+38 1', '+38 1', fixture); - equal('+38 12', '+38 12', fixture); - equal('+38 123', '+38 123', fixture); + equal('+38 1', '+38 1', fixture, false, Paste); + equal('+38 12', '+38 12', fixture, false, Paste); + equal('+38 123', '+38 123', fixture, false, Paste); expect(inputTarget.selectionStart).toBe(7); component.showMaskTyped = true; inputTarget.focus(); diff --git a/projects/ngx-mask-lib/src/test/time-mask.spec.ts b/projects/ngx-mask-lib/src/test/time-mask.spec.ts index 5355a101..99efc6d9 100644 --- a/projects/ngx-mask-lib/src/test/time-mask.spec.ts +++ b/projects/ngx-mask-lib/src/test/time-mask.spec.ts @@ -3,7 +3,7 @@ import { TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { TestMaskComponent } from './utils/test-component.component'; -import { equal } from './utils/test-functions.component'; +import { equal, Paste } from './utils/test-functions.component'; import { provideNgxMask } from '../lib/ngx-mask.providers'; import { NgxMaskDirective } from '../lib/ngx-mask.directive'; @@ -45,7 +45,8 @@ describe('Directive: Mask (Time)', () => { it('Hours', () => { component.showMaskTyped = true; component.mask = 'Hh:m0'; - equal('3__:__', '3_:__', fixture); + equal('3__:__', '3_:__', fixture, false, Paste); + equal('3__:__', '3:__', fixture); equal('33:__', '3:3_', fixture); equal('33__:__', '3:3_', fixture); }); @@ -207,30 +208,30 @@ describe('Directive: Mask (Time)', () => { it('Date (d0/M0:0000', () => { component.mask = 'd0/M0:0000'; - equal('999999', '9/9:9999', fixture); - equal('888888', '8/8:8888', fixture); - equal('777777', '7/7:7777', fixture); - equal('666666', '6/6:6666', fixture); - equal('555555', '5/5:5555', fixture); - equal('444444', '4/4:4444', fixture); - equal('333333', '3/3:3333', fixture); - equal('2222222', '22/2:2222', fixture); - equal('11111111', '11/11:1111', fixture); - equal('20232023', '20/2:3202', fixture); + equal('999999', '9/9:9999', fixture, false, Paste); + equal('888888', '8/8:8888', fixture, false, Paste); + equal('777777', '7/7:7777', fixture, false, Paste); + equal('666666', '6/6:6666', fixture, false, Paste); + equal('555555', '5/5:5555', fixture, false, Paste); + equal('444444', '4/4:4444', fixture, false, Paste); + equal('333333', '3/3:3333', fixture, false, Paste); + equal('2222222', '22/2:2222', fixture, false, Paste); + equal('11111111', '11/11:1111', fixture, false, Paste); + equal('20232023', '20/2:3202', fixture, false, Paste); }); it('Date (m0/d0/0000', () => { component.mask = 'm0/d0/0000'; - equal('999999', '9/9/9999', fixture); - equal('888888', '8/8/8888', fixture); - equal('777777', '7/7/7777', fixture); - equal('666666', '6/6/6666', fixture); - equal('5555555', '55/5/5555', fixture); - equal('4444444', '44/4/4444', fixture); - equal('3333333', '33/3/3333', fixture); - equal('22222222', '22/22/2222', fixture); - equal('11111111', '11/11/1111', fixture); - equal('20232023', '20/2/3202', fixture); + equal('999999', '9/9/9999', fixture, false, Paste); + equal('888888', '8/8/8888', fixture, false, Paste); + equal('777777', '7/7/7777', fixture, false, Paste); + equal('666666', '6/6/6666', fixture, false, Paste); + equal('5555555', '55/5/5555', fixture, false, Paste); + equal('4444444', '44/4/4444', fixture, false, Paste); + equal('3333333', '33/3/3333', fixture, false, Paste); + equal('22222222', '22/22/2222', fixture, false, Paste); + equal('11111111', '11/11/1111', fixture, false, Paste); + equal('20232023', '20/2/3202', fixture, false, Paste); }); it('Date (0000-M0-d0', () => { @@ -441,7 +442,7 @@ describe('Directive: Mask (Time)', () => { equal('20231031', '2023.10.31', fixture); }); - it('Date (0000.M0.d0 leadZero and showMaskTyped', () => { + it('Date (M0/d0/0000 leadZero and showMaskTyped', () => { component.mask = 'M0/d0/0000'; component.leadZeroDateTime = true; component.showMaskTyped = true; @@ -452,7 +453,7 @@ describe('Directive: Mask (Time)', () => { }); it('Date (d0/M0/0000 leadZero)', () => { - component.mask = 'M0/d0/0000'; + component.mask = 'd0/M0/0000'; component.leadZeroDateTime = true; equal('4122000', '04/12/2000', fixture); equal('442000', '04/04/2000', fixture); diff --git a/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts b/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts index c55bb246..ac8bad17 100644 --- a/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts +++ b/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts @@ -1,16 +1,50 @@ -export function typeTest(inputValue: string, fixture: any): string { +export const Paste = 'Paste'; +export const Type = 'Type'; + +export function pasteTest(inputValue: string, fixture: any): string { fixture.detectChanges(); fixture.nativeElement.querySelector('input').value = inputValue; + fixture.nativeElement.querySelector('input').dispatchEvent(new Event('paste')); fixture.nativeElement.querySelector('input').dispatchEvent(new Event('input')); + fixture.nativeElement.querySelector('input').dispatchEvent(new Event('ngModelChange')); - fixture.detectChanges(); return fixture.nativeElement.querySelector('input').value; } -export function equal(value: string, expectedValue: string, fixture: any, async = false): void { - typeTest(value, fixture); +export function typeTest(inputValue: string, fixture: any): string { + fixture.detectChanges(); + const inputArray = inputValue.split(''); + const inputElement = fixture.nativeElement.querySelector('input'); + + inputElement.value = ''; + inputElement.dispatchEvent(new Event('input')); + inputElement.dispatchEvent(new Event('ngModelChange')); + + { + for (const element of inputArray) { + inputElement.dispatchEvent(new Event('keydown'), { key: element }); + inputElement.value += element; + inputElement.dispatchEvent(new Event('input')); + inputElement.dispatchEvent(new Event('ngModelChange')); + } + } + return inputElement.value; +} + +export function equal( + value: string, + expectedValue: string, + fixture: any, + async = false, + testType: typeof Paste | typeof Type = Type +): void { + if (testType === Paste) { + pasteTest(value, fixture); + } else { + typeTest(value, fixture); + } if (async) { Promise.resolve().then(() => { From 16dbcbc67b092e4580bfd07522679e607319b28f Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Mon, 11 Nov 2024 12:32:37 -0700 Subject: [PATCH 02/10] fix(1449): handle changing of hiddenInput; enhance applyMask method with detailed comments and improved handling --- .../ngx-mask-lib/src/lib/ngx-mask.config.ts | 4 +- .../ngx-mask-lib/src/lib/ngx-mask.service.ts | 120 ++++++++++++++---- 2 files changed, 99 insertions(+), 25 deletions(-) diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask.config.ts b/projects/ngx-mask-lib/src/lib/ngx-mask.config.ts index 62c15a61..1732356b 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask.config.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask.config.ts @@ -17,7 +17,7 @@ export type NgxMaskConfig = { shownMaskExpression: string; specialCharacters: string[] | readonly string[]; dropSpecialCharacters: boolean | string[] | readonly string[]; - hiddenInput: boolean | null; + hiddenInput: boolean; validation: boolean; separatorLimit: string; apm: boolean; @@ -54,7 +54,7 @@ export const initialConfig: NgxMaskConfig = { showMaskTyped: false, placeHolderCharacter: '_', dropSpecialCharacters: true, - hiddenInput: null, + hiddenInput: false, shownMaskExpression: '', separatorLimit: '', allowNegativeNumbers: false, diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts b/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts index 2dcad3cf..18c55e52 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts @@ -48,6 +48,16 @@ export class NgxMaskService extends NgxMaskApplierService { private readonly _renderer = inject(Renderer2, { optional: true }); + /** + * Applies the mask to the input value. + * @param inputValue The input value to be masked. + * @param maskExpression The mask expression to apply. + * @param position The position in the input value. + * @param justPasted Whether the value was just pasted. + * @param backspaced Whether the value was backspaced. + * @param cb Callback function. + * @returns The masked value. + */ public override applyMask( inputValue: string, maskExpression: string, @@ -57,18 +67,25 @@ export class NgxMaskService extends NgxMaskApplierService { // eslint-disable-next-line @typescript-eslint/no-empty-function cb: (...args: any[]) => any = () => {} ): string { + // If no mask expression, return the input value or the actual value if (!maskExpression) { return inputValue !== this.actualValue ? this.actualValue : inputValue; } + + // Show mask in input if required this.maskIsShown = this.showMaskTyped ? this.showMaskInInput() : MaskExpression.EMPTY_STRING; + + // Handle specific mask expressions if (this.maskExpression === MaskExpression.IP && this.showMaskTyped) { this.maskIsShown = this.showMaskInInput(inputValue || MaskExpression.HASH); } if (this.maskExpression === MaskExpression.CPF_CNPJ && this.showMaskTyped) { this.maskIsShown = this.showMaskInInput(inputValue || MaskExpression.HASH); } + + // Handle empty input value with mask typed if (!inputValue && this.showMaskTyped) { this.formControlResult(this.prefix); return `${this.prefix}${this.maskIsShown}${this.suffix}`; @@ -80,41 +97,87 @@ export class NgxMaskService extends NgxMaskApplierService { : MaskExpression.EMPTY_STRING; let newInputValue = ''; let newPosition = position; - if (this.hiddenInput !== null && !this.writingValue) { + + // Handle hidden input or input with asterisk symbol + if ( + (this.hiddenInput || + (inputValue && inputValue.indexOf(MaskExpression.SYMBOL_STAR) >= 0)) && + !this.writingValue + ) { let actualResult: string[] = inputValue && inputValue.length === 1 ? inputValue.split(MaskExpression.EMPTY_STRING) : this.actualValue.split(MaskExpression.EMPTY_STRING); + + // Handle backspace + if (backspaced) { + actualResult = actualResult + .slice(0, position) + .concat(actualResult.slice(position + 1)); + } + + // Remove mask if showMaskTyped is true + if (this.showMaskTyped) { + // eslint-disable-next-line no-param-reassign + inputValue = this.removeMask(inputValue); + actualResult = this.removeMask(actualResult.join('')).split( + MaskExpression.EMPTY_STRING + ); + } + + // Handle selection start and end if (typeof this.selStart === 'object' && typeof this.selEnd === 'object') { this.selStart = Number(this.selStart); this.selEnd = Number(this.selEnd); } else { - // eslint-disable-next-line no-unused-expressions,@typescript-eslint/no-unused-expressions - inputValue !== MaskExpression.EMPTY_STRING && actualResult.length - ? typeof this.selStart === 'number' && typeof this.selEnd === 'number' - ? inputValue.length > actualResult.length - ? actualResult.splice(this.selStart, 0, getSymbol) - : inputValue.length < actualResult.length - ? actualResult.length - inputValue.length === 1 - ? backspaced - ? actualResult.splice(this.selStart - 1, 1) - : actualResult.splice(inputValue.length - 1, 1) - : actualResult.splice(this.selStart, this.selEnd - this.selStart) - : null - : null - : (actualResult = []); + if (inputValue !== MaskExpression.EMPTY_STRING && actualResult.length) { + if (typeof this.selStart === 'number' && typeof this.selEnd === 'number') { + if (inputValue.length > actualResult.length) { + actualResult.splice(this.selStart, 0, getSymbol); + } else if (inputValue.length < actualResult.length) { + if (actualResult.length - inputValue.length === 1) { + if (backspaced) { + actualResult.splice(this.selStart - 1, 1); + } else { + actualResult.splice(inputValue.length - 1, 1); + } + } else { + actualResult.splice(this.selStart, this.selEnd - this.selStart); + } + } + } + } else { + actualResult = []; + } } + + // Remove mask if showMaskTyped is true and hiddenInput is false if (this.showMaskTyped && !this.hiddenInput) { newInputValue = this.removeMask(inputValue); } - newInputValue = - this.actualValue.length && actualResult.length <= inputValue.length - ? this.shiftTypedSymbols(actualResult.join(MaskExpression.EMPTY_STRING)) - : inputValue; + + // Handle actual value length + if (this.actualValue.length) { + if (actualResult.length < inputValue.length) { + newInputValue = this.shiftTypedSymbols( + actualResult.join(MaskExpression.EMPTY_STRING) + ); + } else if (actualResult.length === inputValue.length) { + newInputValue = actualResult.join(MaskExpression.EMPTY_STRING); + } else { + newInputValue = inputValue; + } + } else { + newInputValue = inputValue; + } } + + // Handle just pasted input if (justPasted && (this.hiddenInput || !this.hiddenInput)) { newInputValue = inputValue; } + + // Handle backspace with special characters if ( backspaced && this.specialCharacters.indexOf( @@ -125,6 +188,8 @@ export class NgxMaskService extends NgxMaskApplierService { ) { newInputValue = this._currentValue; } + + // Handle deleted special character if (this.deletedSpecialCharacter && newPosition) { if ( this.specialCharacters.includes( @@ -140,14 +205,17 @@ export class NgxMaskService extends NgxMaskApplierService { this.deletedSpecialCharacter = false; } + + // Remove mask if showMaskTyped is true and placeHolderCharacter length is 1 if ( this.showMaskTyped && this.placeHolderCharacter.length === 1 && !this.leadZeroDateTime ) { - newInputValue = this.removeMask(inputValue); + newInputValue = this.removeMask(newInputValue); } + // Handle mask changed if (this.maskChanged) { newInputValue = inputValue; } else { @@ -155,6 +223,7 @@ export class NgxMaskService extends NgxMaskApplierService { Boolean(newInputValue) && newInputValue.length ? newInputValue : inputValue; } + // Handle showMaskTyped and keepCharacterPositions if ( this.showMaskTyped && this.keepCharacterPositions && @@ -171,6 +240,7 @@ export class NgxMaskService extends NgxMaskApplierService { : `${this.prefix}${this.maskIsShown}${this.suffix}`; } + // Apply the mask using the parent class method const result: string = super.applyMask( newInputValue, maskExpression, @@ -181,6 +251,7 @@ export class NgxMaskService extends NgxMaskApplierService { ); this.actualValue = this.getActualValue(result); + // handle some separator implications: // a.) adjust decimalMarker default (. -> ,) if thousandSeparator is a dot if ( @@ -200,6 +271,7 @@ export class NgxMaskService extends NgxMaskApplierService { ); } + // Update previous and current values if (result || result === '') { this._previousValue = this._currentValue; this._currentValue = result; @@ -210,6 +282,7 @@ export class NgxMaskService extends NgxMaskApplierService { (this._previousValue === this._currentValue && justPasted); } + // Propagate the input value back to the Angular model // eslint-disable-next-line no-unused-expressions,@typescript-eslint/no-unused-expressions this._emitValue ? this.writingValue && this.triggerOnMaskChange @@ -217,18 +290,18 @@ export class NgxMaskService extends NgxMaskApplierService { : this.formControlResult(result) : ''; + // Handle hidden input and showMaskTyped if (!this.showMaskTyped || (this.showMaskTyped && this.hiddenInput)) { if (this.hiddenInput) { - if (backspaced) { - return this.hideInput(result, this.maskExpression); - } return `${this.hideInput(result, this.maskExpression)}${this.maskIsShown.slice(result.length)}`; } return result; } + const resLen: number = result.length; const prefNmask = `${this.prefix}${this.maskIsShown}${this.suffix}`; + // Handle specific mask expressions if (this.maskExpression.includes(MaskExpression.HOURS)) { const countSkipedSymbol = this._numberSkipedSymbols(result); return `${result}${prefNmask.slice(resLen + countSkipedSymbol)}`; @@ -238,6 +311,7 @@ export class NgxMaskService extends NgxMaskApplierService { ) { return `${result}${prefNmask}`; } + return `${result}${prefNmask.slice(resLen)}`; } From 4320bcd433b090b1beead981536038b1281ec99f Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Mon, 11 Nov 2024 12:34:26 -0700 Subject: [PATCH 03/10] fix: improve mask validation by using cleaned mask for character checks This is needed with inputs with multiple mask types and they have specialCharacters in the mask. --- projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts b/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts index 4ab0e2a0..0c040d7a 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts @@ -1147,11 +1147,12 @@ export class NgxMaskDirective implements ControlValueAccessor, OnChanges, Valida : expression; } } else { + const cleanMask = this._maskService.removeMask(mask); const check: boolean = this._maskService .removeMask(this._inputValue) ?.split(MaskExpression.EMPTY_STRING) .every((character, index) => { - const indexMask = mask.charAt(index); + const indexMask = cleanMask.charAt(index); return this._maskService._checkSymbolMask(character, indexMask); }); From 2c52290b192e8b1de36377d115c3f06f7c0a9ea2 Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Mon, 11 Nov 2024 14:30:46 -0700 Subject: [PATCH 04/10] fix(tests): enhance backspace handling in mask delete tests and update hiddenInput default value --- projects/ngx-mask-lib/src/test/delete.cy-spec.ts | 7 ++++++- .../src/test/utils/cypress-test-component.component.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/projects/ngx-mask-lib/src/test/delete.cy-spec.ts b/projects/ngx-mask-lib/src/test/delete.cy-spec.ts index 2b3a12b1..0da63c8b 100644 --- a/projects/ngx-mask-lib/src/test/delete.cy-spec.ts +++ b/projects/ngx-mask-lib/src/test/delete.cy-spec.ts @@ -225,6 +225,7 @@ describe('Directive: Mask (Delete)', () => { .should('have.prop', 'selectionStart', 14) .should('have.value', '+7 (123) 456-7___') .type('{backspace}') + .type('{backspace}') .should('have.prop', 'selectionStart', 12) .should('have.value', '+7 (123) 456-____') .type('{backspace}') @@ -234,6 +235,7 @@ describe('Directive: Mask (Delete)', () => { .should('have.prop', 'selectionStart', 10) .should('have.value', '+7 (123) 4__-____') .type('{backspace}') + .type('{backspace}') .should('have.prop', 'selectionStart', 7) .should('have.value', '+7 (123) ___-____') .type('{backspace}') @@ -264,12 +266,14 @@ describe('Directive: Mask (Delete)', () => { .should('have.prop', 'selectionStart', 15) .should('have.value', '+32 12 345 67 8_') .type('{backspace}') + .type('{backspace}') .should('have.prop', 'selectionStart', 13) .should('have.value', '+32 12 345 67 __') .type('{backspace}') .should('have.prop', 'selectionStart', 12) .should('have.value', '+32 12 345 6_ __') .type('{backspace}') + .type('{backspace}') .should('have.prop', 'selectionStart', 10) .should('have.value', '+32 12 345 __ __') .type('{backspace}') @@ -279,6 +283,7 @@ describe('Directive: Mask (Delete)', () => { .should('have.prop', 'selectionStart', 8) .should('have.value', '+32 12 3__ __ __') .type('{backspace}') + .type('{backspace}') .should('have.prop', 'selectionStart', 6) .should('have.value', '+32 12 ___ __ __') .type('{backspace}') @@ -352,7 +357,7 @@ describe('Directive: Mask (Delete)', () => { cy.get('#masked') .type('1234') .should('have.value', '12:34') - .type('{backspace}'.repeat(4)) + .type('{backspace}'.repeat(5)) .should('have.value', '__:__'); }); diff --git a/projects/ngx-mask-lib/src/test/utils/cypress-test-component.component.ts b/projects/ngx-mask-lib/src/test/utils/cypress-test-component.component.ts index 70cb470a..b23114ae 100644 --- a/projects/ngx-mask-lib/src/test/utils/cypress-test-component.component.ts +++ b/projects/ngx-mask-lib/src/test/utils/cypress-test-component.component.ts @@ -38,7 +38,7 @@ export class CypressTestMaskComponent { protected _config = inject(NGX_MASK_CONFIG); @Input() public mask = ''; - @Input() public hiddenInput = null; + @Input() public hiddenInput = false; @Input() public allowNegativeNumbers = false; From 25a510a191f01f2ed5397db29b2f5c53f1fe4c84 Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Wed, 27 Nov 2024 15:30:34 -0700 Subject: [PATCH 05/10] fix(tests): enhance input handling in typeTest function for text elements --- .../src/test/utils/test-functions.component.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts b/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts index ac8bad17..859e600a 100644 --- a/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts +++ b/projects/ngx-mask-lib/src/test/utils/test-functions.component.ts @@ -24,8 +24,19 @@ export function typeTest(inputValue: string, fixture: any): string { { for (const element of inputArray) { - inputElement.dispatchEvent(new Event('keydown'), { key: element }); - inputElement.value += element; + inputElement.dispatchEvent(new KeyboardEvent('keydown'), { key: element }); + if (inputElement.type === 'text') { + const selectionStart = inputElement.selectionStart || 0; + const selectionEnd = inputElement.selectionEnd || 0; + inputElement.value = + inputElement.value.slice(0, selectionStart) + + element + + inputElement.value.slice(selectionEnd); + + inputElement.selectionStart = selectionStart + 1; + } else { + inputElement.value += element; + } inputElement.dispatchEvent(new Event('input')); inputElement.dispatchEvent(new Event('ngModelChange')); } From 6a442c683c228eede163600b1ec3b491de252b23 Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Wed, 27 Nov 2024 18:32:53 -0700 Subject: [PATCH 06/10] fix(hiddenInput): reset input value when hiddenInput changes from true to false --- projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts b/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts index 0c040d7a..a5b3f1f3 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts @@ -204,6 +204,9 @@ export class NgxMaskDirective implements ControlValueAccessor, OnChanges, Valida } if (hiddenInput) { this._maskService.hiddenInput = hiddenInput.currentValue; + if (hiddenInput.previousValue === true && hiddenInput.currentValue === false) { + this._inputValue = this._maskService.actualValue; + } } if (showMaskTyped) { this._maskService.showMaskTyped = showMaskTyped.currentValue; From 242d8e290c5bfe1cdc97a0d0ceca8357c0357f02 Mon Sep 17 00:00:00 2001 From: Austin Walker Date: Wed, 27 Nov 2024 18:33:42 -0700 Subject: [PATCH 07/10] refactor(ngx-mask-applier): simplify _shiftStep method by removing unnecessary parameters This fixes cursor position when they have a * in the mask. --- .../src/lib/ngx-mask-applier.service.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts b/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts index df083564..7e5da380 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts @@ -485,7 +485,7 @@ export class NgxMaskApplierService { ? processedPosition + 1 : processedPosition; cursor += 1; - this._shiftStep(maskExpression, cursor, inputArray.length); + this._shiftStep(cursor); i--; if (this.leadZeroDateTime) { result += '0'; @@ -525,7 +525,7 @@ export class NgxMaskApplierService { ? processedPosition + 1 : processedPosition; cursor += 1; - this._shiftStep(maskExpression, cursor, inputArray.length); + this._shiftStep(cursor); i--; if (this.leadZeroDateTime) { result += '0'; @@ -574,7 +574,7 @@ export class NgxMaskApplierService { ? processedPosition + 1 : processedPosition; cursor += 1; - this._shiftStep(maskExpression, cursor, inputArray.length); + this._shiftStep(cursor); i--; if (this.leadZeroDateTime) { @@ -647,7 +647,7 @@ export class NgxMaskApplierService { ? processedPosition + 1 : processedPosition; cursor += 1; - this._shiftStep(maskExpression, cursor, inputArray.length); + this._shiftStep(cursor); i--; if (this.leadZeroDateTime) { result += '0'; @@ -670,13 +670,13 @@ export class NgxMaskApplierService { ) { result += maskExpression[cursor]; cursor++; - this._shiftStep(maskExpression, cursor, inputArray.length); + this._shiftStep(cursor); i--; } else if ( maskExpression[cursor] === MaskExpression.NUMBER_NINE && this.showMaskTyped ) { - this._shiftStep(maskExpression, cursor, inputArray.length); + this._shiftStep(cursor); } else if ( this.patterns[maskExpression[cursor] ?? MaskExpression.EMPTY_STRING] && this.patterns[maskExpression[cursor] ?? MaskExpression.EMPTY_STRING]?.optional @@ -980,11 +980,8 @@ export class NgxMaskApplierService { return char; } - private _shiftStep(maskExpression: string, cursor: number, inputLength: number) { - const shiftStep: number = /[*?]/g.test(maskExpression.slice(0, cursor)) - ? inputLength - : cursor; - this._shift.add(shiftStep + this.prefix.length || 0); + private _shiftStep(cursor: number) { + this._shift.add(cursor + this.prefix.length || 0); } protected _compareOrIncludes(value: T, comparedValue: T | T[], excludedValue: T): boolean { From 1fe199bac995161c984fffb0b78422ce381ecd5b Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Fri, 6 Dec 2024 13:04:01 +0200 Subject: [PATCH 08/10] fix(ref: no-ref): fix issues --- CHANGELOG.md | 11 +++++++++++ README.md | 8 ++++++++ USAGE.md | 16 +++++++++++++--- package.json | 2 +- projects/ngx-mask-lib/package.json | 2 +- .../src/lib/ngx-mask-applier.service.ts | 1 + .../ngx-mask-lib/src/lib/ngx-mask.service.ts | 2 +- .../ngx-mask-lib/src/test/basic-logic.spec.ts | 8 ++++++++ projects/ngx-mask-lib/src/test/mask.pipe.spec.ts | 7 +++++-- 9 files changed, 49 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97e6c5f8..d0a7cd2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# 19.0.3(2024-12-05) + +### Contributing Fix + +- Fix ([#1455](https://github.com/JsDaddy/ngx-mask/pull/1455)) + +### Fix + +- Fix ([#1472](https://github.com/JsDaddy/ngx-mask/pull/1472)) +- Fix ([#1415](https://github.com/JsDaddy/ngx-mask/pull/1415)) + # 19.0.2(2024-12-03) ### Fix diff --git a/README.md b/README.md index 2727163a..5fad4fc6 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,14 @@ const maskConfigFunction: () => Partial = () => { Then, just define masks in inputs. +## Actively supported versions + +ngx-mask follows the official Angular support policy, supporting the Active and LTS (Long-Term Support) versions of Angular. As of the latest release, Angular v17 and newer are supported. + +Projects using Angular versions outside the supported range (e.g., older than v17) should use the last compatible version of ngx-mask. However, these versions will no longer receive updates, bug fixes, or new features. + +For detailed information about Angular's versioning and support schedule, visit the official [Angular releases page](https://angular.dev/reference/releases#actively-supported-versions). + ## Usage Text [documentation](https://github.com/JsDaddy/ngx-mask/blob/develop/USAGE.md) diff --git a/USAGE.md b/USAGE.md index 8e60b629..9ea4d5eb 100644 --- a/USAGE.md +++ b/USAGE.md @@ -104,10 +104,20 @@ Input value: 789HelloWorld Masked value: (Hel-loW) ``` -### Custom pattern for this +### Custom Pattern Definition for Input Masks + +You can define a custom pattern and specify a unique symbol to be rendered in the input field. + +Important Notes: + +Reserved Characters: Certain characters (h, d, m, s) are reserved for date patterns and should not be used in custom patterns to avoid conflicts. + +```html +Special Symbol *: The * character is reserved for patterns like 0*, which means any length of digits can appear before the asterisk. Avoid using this symbol in custom patterns. + + +``` -You can define custom pattern and specify symbol to be rendered in input field. -Patterns may conflict with such letters as h, d, m, s, because we use these characters for dates. ```typescript pattern = { diff --git a/package.json b/package.json index 40ec6ef6..6265dfd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ngx-mask", - "version": "19.0.2", + "version": "19.0.3", "description": "Awesome ngx mask", "license": "MIT", "engines": { diff --git a/projects/ngx-mask-lib/package.json b/projects/ngx-mask-lib/package.json index 418437ff..7abb7f1f 100644 --- a/projects/ngx-mask-lib/package.json +++ b/projects/ngx-mask-lib/package.json @@ -1,6 +1,6 @@ { "name": "ngx-mask", - "version": "19.0.2", + "version": "19.0.3", "description": "awesome ngx mask", "keywords": [ "ng2-mask", diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts b/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts index eb9d5b4a..b2bd5f2b 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts @@ -738,6 +738,7 @@ export class NgxMaskApplierService { } } if ( + result[processedPosition - 1] && result.length + 1 === maskExpression.length && this.specialCharacters.indexOf( maskExpression[maskExpression.length - 1] ?? MaskExpression.EMPTY_STRING diff --git a/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts b/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts index 6d442656..064e88a1 100644 --- a/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts +++ b/projects/ngx-mask-lib/src/lib/ngx-mask.service.ts @@ -597,7 +597,7 @@ export class NgxMaskService extends NgxMaskApplierService { */ private formControlResult(inputValue: string): void { if (this.writingValue && !inputValue) { - this.onChange(this.outputTransformFn('')); + this.onChange(this.outputTransformFn(null)); return; } if (this.writingValue || (!this.triggerOnMaskChange && this.maskChanged)) { diff --git a/projects/ngx-mask-lib/src/test/basic-logic.spec.ts b/projects/ngx-mask-lib/src/test/basic-logic.spec.ts index 4093133d..8d76cadf 100644 --- a/projects/ngx-mask-lib/src/test/basic-logic.spec.ts +++ b/projects/ngx-mask-lib/src/test/basic-logic.spec.ts @@ -1020,4 +1020,12 @@ describe('Directive: Mask', () => { expect(inputTarget.value).toBe(''); }); + + it('should show correct value d0.M0.', () => { + component.mask.set('d0.M0.'); + equal('1', '1', fixture); + equal('12', '12', fixture); + equal('122', '12.2', fixture); + equal('12.22', '12.2.', fixture); + }); }); diff --git a/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts b/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts index 87b3d646..2ff1843b 100644 --- a/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts +++ b/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts @@ -358,7 +358,10 @@ describe('Pipe: Mask', () => { const valueWithPrefix: string | number = maskPipe.transform('55555', '00 (000)', { prefix: 'DDD ', }); - expect(valueWithSuffix).toEqual('55 (555) DDD'); - expect(valueWithPrefix).toEqual('DDD 55 (555)'); + + requestAnimationFrame(() => { + expect(valueWithSuffix).toEqual('55 (555) DDD'); + expect(valueWithPrefix).toEqual('DDD 55 (555)'); + }); }); }); From ca691e65ef45deb38f24abf3500822c7601938d5 Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Fri, 6 Dec 2024 13:10:06 +0200 Subject: [PATCH 09/10] fix(ref: no-ref): fix issues --- .github/PULL_REQUEST_TEMPLATE.md | 26 +- CHANGELOG.md | 514 +++++++++++++++---------------- CODE_OF_CONDUCT.md | 30 +- CONTRIBUTING.md | 14 +- README.md | 2 +- USAGE.md | 8 +- 6 files changed, 297 insertions(+), 297 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 351c327a..51915647 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,9 +2,9 @@ Please check if your PR fulfills the following requirements: -- [ ] The commit message follows our guidelines: https://github.com/JsDaddy/ngx-mask/blob/develop/CONTRIBUTING.md#commit -- [ ] Tests for the changes have been added (for bug fixes / features) -- [ ] Docs have been added / updated (for bug fixes / features) +- [ ] The commit message follows our guidelines: https://github.com/JsDaddy/ngx-mask/blob/develop/CONTRIBUTING.md#commit +- [ ] Tests for the changes have been added (for bug fixes / features) +- [ ] Docs have been added / updated (for bug fixes / features) ## PR Type @@ -12,14 +12,14 @@ What kind of change does this PR introduce? -- [ ] Bugfix -- [ ] Feature -- [ ] Code style update (formatting, local variables) -- [ ] Refactoring (no functional changes, no api changes) -- [ ] Build related changes -- [ ] CI related changes -- [ ] Documentation content changes -- [ ] Other... Please describe: +- [ ] Bugfix +- [ ] Feature +- [ ] Code style update (formatting, local variables) +- [ ] Refactoring (no functional changes, no api changes) +- [ ] Build related changes +- [ ] CI related changes +- [ ] Documentation content changes +- [ ] Other... Please describe: ## What is the current behavior? @@ -31,8 +31,8 @@ Issue Number: N/A ## Does this PR introduce a breaking change? -- [ ] Yes -- [ ] No +- [ ] Yes +- [ ] No diff --git a/CHANGELOG.md b/CHANGELOG.md index d0a7cd2e..5c11837e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,564 +2,564 @@ ### Contributing Fix -- Fix ([#1455](https://github.com/JsDaddy/ngx-mask/pull/1455)) +- Fix ([#1455](https://github.com/JsDaddy/ngx-mask/pull/1455)) ### Fix -- Fix ([#1472](https://github.com/JsDaddy/ngx-mask/pull/1472)) -- Fix ([#1415](https://github.com/JsDaddy/ngx-mask/pull/1415)) +- Fix ([#1472](https://github.com/JsDaddy/ngx-mask/pull/1472)) +- Fix ([#1415](https://github.com/JsDaddy/ngx-mask/pull/1415)) # 19.0.2(2024-12-03) ### Fix -- Fix ([#1456](https://github.com/JsDaddy/ngx-mask/issues/1456)) -- Fix ([#1458](https://github.com/JsDaddy/ngx-mask/issues/1458)) -- Fix ([#1446](https://github.com/JsDaddy/ngx-mask/issues/1446)) -- Fix ([#1457](https://github.com/JsDaddy/ngx-mask/issues/1457)) +- Fix ([#1456](https://github.com/JsDaddy/ngx-mask/issues/1456)) +- Fix ([#1458](https://github.com/JsDaddy/ngx-mask/issues/1458)) +- Fix ([#1446](https://github.com/JsDaddy/ngx-mask/issues/1446)) +- Fix ([#1457](https://github.com/JsDaddy/ngx-mask/issues/1457)) # 19.0.1(2024-11-29) ### Feature -- change @Input to input in NgxMaskDirective -- change @Output output in NgxMaskDirective -- change variables to signals in NgxMaskDirective +- change @Input to input in NgxMaskDirective +- change @Output output in NgxMaskDirective +- change variables to signals in NgxMaskDirective # 19.0.0(2024-11-22) ### Feature -- update ng 19.x +- update ng 19.x # 18.0.4(2024-11-11) ### Fix -- Fix ([#1449](https://github.com/JsDaddy/ngx-mask/issues/1449)) +- Fix ([#1449](https://github.com/JsDaddy/ngx-mask/issues/1449)) # 18.0.3(2024-11-05) ### Fix -- Fix ([#1372](https://github.com/JsDaddy/ngx-mask/issues/1372)) -- Fix ([#1441](https://github.com/JsDaddy/ngx-mask/issues/1441)) -- Fix ([#1442](https://github.com/JsDaddy/ngx-mask/issues/1442)) -- Fix ([#1440](https://github.com/JsDaddy/ngx-mask/issues/1440)) -- Fix ([#1409](https://github.com/JsDaddy/ngx-mask/issues/1409)) +- Fix ([#1372](https://github.com/JsDaddy/ngx-mask/issues/1372)) +- Fix ([#1441](https://github.com/JsDaddy/ngx-mask/issues/1441)) +- Fix ([#1442](https://github.com/JsDaddy/ngx-mask/issues/1442)) +- Fix ([#1440](https://github.com/JsDaddy/ngx-mask/issues/1440)) +- Fix ([#1409](https://github.com/JsDaddy/ngx-mask/issues/1409)) # 18.0.2(2024-11-01) ### Fix -- Fix ([#1427](https://github.com/JsDaddy/ngx-mask/issues/1427)) -- Fix ([#1405](https://github.com/JsDaddy/ngx-mask/issues/1405)) -- Fix ([#1426](https://github.com/JsDaddy/ngx-mask/issues/1426)) -- Fix ([#1406](https://github.com/JsDaddy/ngx-mask/issues/1406)) -- Fix ([#1420](https://github.com/JsDaddy/ngx-mask/issues/1420)) -- Fix ([#1416](https://github.com/JsDaddy/ngx-mask/issues/1416)) +- Fix ([#1427](https://github.com/JsDaddy/ngx-mask/issues/1427)) +- Fix ([#1405](https://github.com/JsDaddy/ngx-mask/issues/1405)) +- Fix ([#1426](https://github.com/JsDaddy/ngx-mask/issues/1426)) +- Fix ([#1406](https://github.com/JsDaddy/ngx-mask/issues/1406)) +- Fix ([#1420](https://github.com/JsDaddy/ngx-mask/issues/1420)) +- Fix ([#1416](https://github.com/JsDaddy/ngx-mask/issues/1416)) # 18.0.1(2024-10-29) ### Breaking Changes -- rename "IConfig" to "NgxMaskConfig" -- rename "optionsConfig" to "NgxMaskOptions" -- change interface to type +- rename "IConfig" to "NgxMaskConfig" +- rename "optionsConfig" to "NgxMaskOptions" +- change interface to type ### Fix -- Fix ([#1410](https://github.com/JsDaddy/ngx-mask/issues/1410)) +- Fix ([#1410](https://github.com/JsDaddy/ngx-mask/issues/1410)) # 17.1.8(2024-07-16) ### Fix -- Fix ([#1344](https://github.com/JsDaddy/ngx-mask/issues/1344)) -- Fix ([#1356](https://github.com/JsDaddy/ngx-mask/issues/1356)) +- Fix ([#1344](https://github.com/JsDaddy/ngx-mask/issues/1344)) +- Fix ([#1356](https://github.com/JsDaddy/ngx-mask/issues/1356)) # 17.1.8(2024-07-16) ### Fix -- Fix ([#1344](https://github.com/JsDaddy/ngx-mask/issues/1344)) -- Fix ([#1356](https://github.com/JsDaddy/ngx-mask/issues/1356)) +- Fix ([#1344](https://github.com/JsDaddy/ngx-mask/issues/1344)) +- Fix ([#1356](https://github.com/JsDaddy/ngx-mask/issues/1356)) # 17.1.7(2024-07-18) ### Fix -- Fix ([#1399](https://github.com/JsDaddy/ngx-mask/issues/1399)) -- Fix ([#1360](https://github.com/JsDaddy/ngx-mask/issues/1360)) -- Fix ([#1357](https://github.com/JsDaddy/ngx-mask/issues/1357)) -- Fix ([#1364](https://github.com/JsDaddy/ngx-mask/issues/1364)) +- Fix ([#1399](https://github.com/JsDaddy/ngx-mask/issues/1399)) +- Fix ([#1360](https://github.com/JsDaddy/ngx-mask/issues/1360)) +- Fix ([#1357](https://github.com/JsDaddy/ngx-mask/issues/1357)) +- Fix ([#1364](https://github.com/JsDaddy/ngx-mask/issues/1364)) # 17.1.6(2024-07-16) ### Fix -- Fix ([#1342](https://github.com/JsDaddy/ngx-mask/issues/1342)) +- Fix ([#1342](https://github.com/JsDaddy/ngx-mask/issues/1342)) # 17.1.5(2024-07-16) ### Fix -- Fix ([#1389](https://github.com/JsDaddy/ngx-mask/issues/1389)) +- Fix ([#1389](https://github.com/JsDaddy/ngx-mask/issues/1389)) # 17.1.4(2024-07-16) ### Fix -- Fix ([#1389](https://github.com/JsDaddy/ngx-mask/issues/1389)) +- Fix ([#1389](https://github.com/JsDaddy/ngx-mask/issues/1389)) # 17.1.3(2024-07-16) ### Fix -- Fix ([#1386](https://github.com/JsDaddy/ngx-mask/issues/1386)) -- Fix ([#1370](https://github.com/JsDaddy/ngx-mask/issues/1370)) +- Fix ([#1386](https://github.com/JsDaddy/ngx-mask/issues/1386)) +- Fix ([#1370](https://github.com/JsDaddy/ngx-mask/issues/1370)) # 17.1.2(2024-07-15) ### Fix -- Fix ([#1378](https://github.com/JsDaddy/ngx-mask/issues/1378)) -- Fix ([#1390](https://github.com/JsDaddy/ngx-mask/issues/1390)) +- Fix ([#1378](https://github.com/JsDaddy/ngx-mask/issues/1378)) +- Fix ([#1390](https://github.com/JsDaddy/ngx-mask/issues/1390)) # 17.1.1(2024-07-05) ### Fix -- Fix ([#1383](https://github.com/JsDaddy/ngx-mask/issues/1383)) +- Fix ([#1383](https://github.com/JsDaddy/ngx-mask/issues/1383)) # 17.1.0(2024-07-05) ### Fix -- Fix ([#1294](https://github.com/JsDaddy/ngx-mask/issues/1294)) -- Fix ([#1344](https://github.com/JsDaddy/ngx-mask/issues/1344)) -- Fix ([#1365](https://github.com/JsDaddy/ngx-mask/issues/1365)) +- Fix ([#1294](https://github.com/JsDaddy/ngx-mask/issues/1294)) +- Fix ([#1344](https://github.com/JsDaddy/ngx-mask/issues/1344)) +- Fix ([#1365](https://github.com/JsDaddy/ngx-mask/issues/1365)) # 17.0.9(2024-07-02) ### Fix -- Fix ([#1349](https://github.com/JsDaddy/ngx-mask/issues/1349)) -- Fix ([#1354](https://github.com/JsDaddy/ngx-mask/issues/1354)) -- Fix ([#1369](https://github.com/JsDaddy/ngx-mask/issues/1369)) -- Fix ([#1378](https://github.com/JsDaddy/ngx-mask/issues/1378)) -- Fix ([#1377](https://github.com/JsDaddy/ngx-mask/issues/1377)) +- Fix ([#1349](https://github.com/JsDaddy/ngx-mask/issues/1349)) +- Fix ([#1354](https://github.com/JsDaddy/ngx-mask/issues/1354)) +- Fix ([#1369](https://github.com/JsDaddy/ngx-mask/issues/1369)) +- Fix ([#1378](https://github.com/JsDaddy/ngx-mask/issues/1378)) +- Fix ([#1377](https://github.com/JsDaddy/ngx-mask/issues/1377)) # 17.0.8(2024-04-30) ### Fix -- Fix ([#1358](https://github.com/JsDaddy/ngx-mask/issues/1358)) +- Fix ([#1358](https://github.com/JsDaddy/ngx-mask/issues/1358)) # 17.0.7(2024-03-28) ### Fix -- Fix ([#1298](https://github.com/JsDaddy/ngx-mask/issues/1298)) -- Fix ([#1307](https://github.com/JsDaddy/ngx-mask/issues/1307)) -- Fix ([#1306](https://github.com/JsDaddy/ngx-mask/issues/1306)) +- Fix ([#1298](https://github.com/JsDaddy/ngx-mask/issues/1298)) +- Fix ([#1307](https://github.com/JsDaddy/ngx-mask/issues/1307)) +- Fix ([#1306](https://github.com/JsDaddy/ngx-mask/issues/1306)) # 17.0.6(2024-03-27) ### Fix -- Fix ([#1301](https://github.com/JsDaddy/ngx-mask/issues/1301)) -- Fix ([#1302](https://github.com/JsDaddy/ngx-mask/issues/1302)) -- Fix ([#1292](https://github.com/JsDaddy/ngx-mask/issues/1292)) +- Fix ([#1301](https://github.com/JsDaddy/ngx-mask/issues/1301)) +- Fix ([#1302](https://github.com/JsDaddy/ngx-mask/issues/1302)) +- Fix ([#1292](https://github.com/JsDaddy/ngx-mask/issues/1292)) # 17.0.5(2024-03-25) ### Fix -- Fix ([#1295](https://github.com/JsDaddy/ngx-mask/issues/1295)) -- Fix ([#1292](https://github.com/JsDaddy/ngx-mask/issues/1292)) -- Fix ([#1314](https://github.com/JsDaddy/ngx-mask/issues/1314)) -- Fix ([#1310](https://github.com/JsDaddy/ngx-mask/issues/1310)) -- Fix ([#1304](https://github.com/JsDaddy/ngx-mask/issues/1304)) -- Fix ([#1308](https://github.com/JsDaddy/ngx-mask/issues/1308)) -- Fix ([#1299](https://github.com/JsDaddy/ngx-mask/issues/1299)) +- Fix ([#1295](https://github.com/JsDaddy/ngx-mask/issues/1295)) +- Fix ([#1292](https://github.com/JsDaddy/ngx-mask/issues/1292)) +- Fix ([#1314](https://github.com/JsDaddy/ngx-mask/issues/1314)) +- Fix ([#1310](https://github.com/JsDaddy/ngx-mask/issues/1310)) +- Fix ([#1304](https://github.com/JsDaddy/ngx-mask/issues/1304)) +- Fix ([#1308](https://github.com/JsDaddy/ngx-mask/issues/1308)) +- Fix ([#1299](https://github.com/JsDaddy/ngx-mask/issues/1299)) # 17.0.4(2023-12-01) ### Feat -- update v16.4.2 -- update v15.2.3 -- update v14.3.3 -- update v13.2.2 +- update v16.4.2 +- update v15.2.3 +- update v14.3.3 +- update v13.2.2 # 17.0.3(2023-11-30) ### Feat -- update dependencies +- update dependencies # 17.0.2(2023-11-29) ### Feat -- update dependencies +- update dependencies # 17.0.2(2023-11-29) ### Fix -- Fix ([#1272](https://github.com/JsDaddy/ngx-mask/issues/1272)) -- Fix ([#1270](https://github.com/JsDaddy/ngx-mask/issues/1270)) -- Fix ([#1259](https://github.com/JsDaddy/ngx-mask/issues/1259)) -- Fix ([#1240](https://github.com/JsDaddy/ngx-mask/issues/1240)) -- Fix ([#1274](https://github.com/JsDaddy/ngx-mask/issues/1274)) +- Fix ([#1272](https://github.com/JsDaddy/ngx-mask/issues/1272)) +- Fix ([#1270](https://github.com/JsDaddy/ngx-mask/issues/1270)) +- Fix ([#1259](https://github.com/JsDaddy/ngx-mask/issues/1259)) +- Fix ([#1240](https://github.com/JsDaddy/ngx-mask/issues/1240)) +- Fix ([#1274](https://github.com/JsDaddy/ngx-mask/issues/1274)) # 17.0.1(2023-11-28) ### Fix -- Fix ([#1271](https://github.com/JsDaddy/ngx-mask/issues/1271)) -- Fix ([#1278](https://github.com/JsDaddy/ngx-mask/issues/1278)) -- Fix ([#1277](https://github.com/JsDaddy/ngx-mask/issues/1277)) -- Fix ([#1269](https://github.com/JsDaddy/ngx-mask/issues/1269)) -- Fix ([#1276](https://github.com/JsDaddy/ngx-mask/issues/1276)) -- Fix ([#1279](https://github.com/JsDaddy/ngx-mask/issues/1279)) +- Fix ([#1271](https://github.com/JsDaddy/ngx-mask/issues/1271)) +- Fix ([#1278](https://github.com/JsDaddy/ngx-mask/issues/1278)) +- Fix ([#1277](https://github.com/JsDaddy/ngx-mask/issues/1277)) +- Fix ([#1269](https://github.com/JsDaddy/ngx-mask/issues/1269)) +- Fix ([#1276](https://github.com/JsDaddy/ngx-mask/issues/1276)) +- Fix ([#1279](https://github.com/JsDaddy/ngx-mask/issues/1279)) # 17.0.0(2023-11-08) ### Feature -- update ng 17.x +- update ng 17.x - ### Feature 16.4.2 -- Upgrade version 16.4.2 with more fixes since version 17.x.x +- Upgrade version 16.4.2 with more fixes since version 17.x.x # 16.4.1(2023-11-08) ### Fix -- Fix ([#1251](https://github.com/JsDaddy/ngx-mask/issues/1251)) +- Fix ([#1251](https://github.com/JsDaddy/ngx-mask/issues/1251)) # 16.4.0(2023-11-07) ### Fix -- Fix ([#1261](https://github.com/JsDaddy/ngx-mask/issues/1261)) -- Fix ([#1258](https://github.com/JsDaddy/ngx-mask/issues/1258)) -- Fix ([#1262](https://github.com/JsDaddy/ngx-mask/issues/1262)) -- Fix ([#1254](https://github.com/JsDaddy/ngx-mask/issues/1254)) -- Fix ([#1256](https://github.com/JsDaddy/ngx-mask/issues/1256)) +- Fix ([#1261](https://github.com/JsDaddy/ngx-mask/issues/1261)) +- Fix ([#1258](https://github.com/JsDaddy/ngx-mask/issues/1258)) +- Fix ([#1262](https://github.com/JsDaddy/ngx-mask/issues/1262)) +- Fix ([#1254](https://github.com/JsDaddy/ngx-mask/issues/1254)) +- Fix ([#1256](https://github.com/JsDaddy/ngx-mask/issues/1256)) # 16.3.9(2023-10-02) ### Fix -- Fix ([#1248](https://github.com/JsDaddy/ngx-mask/issues/1248)) -- Fix ([#1246](https://github.com/JsDaddy/ngx-mask/issues/1246)) -- Fix ([#1247](https://github.com/JsDaddy/ngx-mask/issues/1247)) +- Fix ([#1248](https://github.com/JsDaddy/ngx-mask/issues/1248)) +- Fix ([#1246](https://github.com/JsDaddy/ngx-mask/issues/1246)) +- Fix ([#1247](https://github.com/JsDaddy/ngx-mask/issues/1247)) # 16.3.8(2023-09-18) ### Fix -- Change README.md -- Fix ([#1242](https://github.com/JsDaddy/ngx-mask/issues/1242)) +- Change README.md +- Fix ([#1242](https://github.com/JsDaddy/ngx-mask/issues/1242)) # 16.3.7(2023-09-18) ### Fix -- Fix ([#1238](https://github.com/JsDaddy/ngx-mask/issues/1238)) +- Fix ([#1238](https://github.com/JsDaddy/ngx-mask/issues/1238)) # 16.3.6(2023-09-15) ### Fix -- Fix ([#1232](https://github.com/JsDaddy/ngx-mask/issues/1232)) +- Fix ([#1232](https://github.com/JsDaddy/ngx-mask/issues/1232)) # 16.3.5(2023-09-14) ### Fix -- Fix ([#1225](https://github.com/JsDaddy/ngx-mask/issues/1225)) +- Fix ([#1225](https://github.com/JsDaddy/ngx-mask/issues/1225)) # 16.3.4(2023-09-13) ### Feat -- update version +- update version # 16.3.3(2023-09-13) ### Fix -- Fix ([#1222](https://github.com/JsDaddy/ngx-mask/issues/1222)) +- Fix ([#1222](https://github.com/JsDaddy/ngx-mask/issues/1222)) # 16.3.2(2023-09-13) ### Fix -- Fix ([#658](https://github.com/JsDaddy/ngx-mask/issues/658)) +- Fix ([#658](https://github.com/JsDaddy/ngx-mask/issues/658)) # 16.3.1(2023-09-01) ### Fix -- Fix ([#877](https://github.com/JsDaddy/ngx-mask/issues/877)) -- Fix ([#613](https://github.com/JsDaddy/ngx-mask/issues/613)) -- Fix ([#644](https://github.com/JsDaddy/ngx-mask/issues/644)) -- Fix ([#788](https://github.com/JsDaddy/ngx-mask/issues/788)) +- Fix ([#877](https://github.com/JsDaddy/ngx-mask/issues/877)) +- Fix ([#613](https://github.com/JsDaddy/ngx-mask/issues/613)) +- Fix ([#644](https://github.com/JsDaddy/ngx-mask/issues/644)) +- Fix ([#788](https://github.com/JsDaddy/ngx-mask/issues/788)) # 16.3.0(2023-08-28) ### Fix -- Fix ([#1212](https://github.com/JsDaddy/ngx-mask/issues/1212)) -- Fix ([#1215](https://github.com/JsDaddy/ngx-mask/issues/1215)) -- Fix ([#1210](https://github.com/JsDaddy/ngx-mask/issues/1210)) -- Fix ([#1213](https://github.com/JsDaddy/ngx-mask/issues/1213)) -- Fix ([#1217](https://github.com/JsDaddy/ngx-mask/issues/1217)) -- Fix ([#1206](https://github.com/JsDaddy/ngx-mask/issues/1206)) -- Fix ([#1211](https://github.com/JsDaddy/ngx-mask/issues/1211)) +- Fix ([#1212](https://github.com/JsDaddy/ngx-mask/issues/1212)) +- Fix ([#1215](https://github.com/JsDaddy/ngx-mask/issues/1215)) +- Fix ([#1210](https://github.com/JsDaddy/ngx-mask/issues/1210)) +- Fix ([#1213](https://github.com/JsDaddy/ngx-mask/issues/1213)) +- Fix ([#1217](https://github.com/JsDaddy/ngx-mask/issues/1217)) +- Fix ([#1206](https://github.com/JsDaddy/ngx-mask/issues/1206)) +- Fix ([#1211](https://github.com/JsDaddy/ngx-mask/issues/1211)) # 16.2.9(2023-08-08) ### Fix -- Fix ([#1076](https://github.com/JsDaddy/ngx-mask/issues/1076)) -- Fix ([#890](https://github.com/JsDaddy/ngx-mask/issues/890)) -- Fix ([#841](https://github.com/JsDaddy/ngx-mask/issues/841)) -- Fix ([#1162](https://github.com/JsDaddy/ngx-mask/issues/1162)) +- Fix ([#1076](https://github.com/JsDaddy/ngx-mask/issues/1076)) +- Fix ([#890](https://github.com/JsDaddy/ngx-mask/issues/890)) +- Fix ([#841](https://github.com/JsDaddy/ngx-mask/issues/841)) +- Fix ([#1162](https://github.com/JsDaddy/ngx-mask/issues/1162)) # 16.2.7(2023-08-08) ### Fix -- Fix ([#843](https://github.com/JsDaddy/ngx-mask/issues/843)) -- Fix ([#1200](https://github.com/JsDaddy/ngx-mask/issues/1200)) +- Fix ([#843](https://github.com/JsDaddy/ngx-mask/issues/843)) +- Fix ([#1200](https://github.com/JsDaddy/ngx-mask/issues/1200)) # 16.2.6(2023-08-03) ### Fix -- Fix ([#613](https://github.com/JsDaddy/ngx-mask/issues/613)) -- Fix ([#671](https://github.com/JsDaddy/ngx-mask/issues/671)) -- Fix ([#774](https://github.com/JsDaddy/ngx-mask/issues/774)) -- Fix ([#1202](https://github.com/JsDaddy/ngx-mask/issues/1202)) -- Fix ([#1203](https://github.com/JsDaddy/ngx-mask/issues/1203)) +- Fix ([#613](https://github.com/JsDaddy/ngx-mask/issues/613)) +- Fix ([#671](https://github.com/JsDaddy/ngx-mask/issues/671)) +- Fix ([#774](https://github.com/JsDaddy/ngx-mask/issues/774)) +- Fix ([#1202](https://github.com/JsDaddy/ngx-mask/issues/1202)) +- Fix ([#1203](https://github.com/JsDaddy/ngx-mask/issues/1203)) # 16.2.5(2023-07-24) ### Fix -- Fix ([#838](https://github.com/JsDaddy/ngx-mask/issues/838)) -- Fix ([#1193](https://github.com/JsDaddy/ngx-mask/issues/1193)) -- Fix ([#1199](https://github.com/JsDaddy/ngx-mask/issues/1199)) +- Fix ([#838](https://github.com/JsDaddy/ngx-mask/issues/838)) +- Fix ([#1193](https://github.com/JsDaddy/ngx-mask/issues/1193)) +- Fix ([#1199](https://github.com/JsDaddy/ngx-mask/issues/1199)) # 16.2.4(2023-07-12) ### Fix -- Fix ([#1182](https://github.com/JsDaddy/ngx-mask/issues/1182)) -- Fix ([#1191](https://github.com/JsDaddy/ngx-mask/issues/1191)) -- Fix ([#941](https://github.com/JsDaddy/ngx-mask/issues/941)) +- Fix ([#1182](https://github.com/JsDaddy/ngx-mask/issues/1182)) +- Fix ([#1191](https://github.com/JsDaddy/ngx-mask/issues/1191)) +- Fix ([#941](https://github.com/JsDaddy/ngx-mask/issues/941)) # 16.2.3(2023-07-05) ### Fix -- Fix ([#842](https://github.com/JsDaddy/ngx-mask/issues/842)) -- Fix ([#623](https://github.com/JsDaddy/ngx-mask/issues/623)) -- Fix ([#836](https://github.com/JsDaddy/ngx-mask/issues/836)) -- Fix ([#752](https://github.com/JsDaddy/ngx-mask/issues/752)) +- Fix ([#842](https://github.com/JsDaddy/ngx-mask/issues/842)) +- Fix ([#623](https://github.com/JsDaddy/ngx-mask/issues/623)) +- Fix ([#836](https://github.com/JsDaddy/ngx-mask/issues/836)) +- Fix ([#752](https://github.com/JsDaddy/ngx-mask/issues/752)) # 16.2.2(2023-07-03) ### Fix -- Fix ([#1186](https://github.com/JsDaddy/ngx-mask/issues/1186)) +- Fix ([#1186](https://github.com/JsDaddy/ngx-mask/issues/1186)) # 16.2.1(2023-06-30) ### Fix -- Fix ([#906](https://github.com/JsDaddy/ngx-mask/issues/906)) -- Fix ([#958](https://github.com/JsDaddy/ngx-mask/issues/958)) -- Fix ([#977](https://github.com/JsDaddy/ngx-mask/issues/977)) +- Fix ([#906](https://github.com/JsDaddy/ngx-mask/issues/906)) +- Fix ([#958](https://github.com/JsDaddy/ngx-mask/issues/958)) +- Fix ([#977](https://github.com/JsDaddy/ngx-mask/issues/977)) # 16.2.0(2023-06-27) ### Fix -- Fix ([#724](https://github.com/JsDaddy/ngx-mask/issues/724)) -- Fix ([#731](https://github.com/JsDaddy/ngx-mask/issues/731)) +- Fix ([#724](https://github.com/JsDaddy/ngx-mask/issues/724)) +- Fix ([#731](https://github.com/JsDaddy/ngx-mask/issues/731)) # 16.1.9(2023-06-21) ### Fix -- Fix ([#812](https://github.com/JsDaddy/ngx-mask/issues/812)) -- Fix ([#636](https://github.com/JsDaddy/ngx-mask/issues/636)) +- Fix ([#812](https://github.com/JsDaddy/ngx-mask/issues/812)) +- Fix ([#636](https://github.com/JsDaddy/ngx-mask/issues/636)) # 16.1.8(2023-06-19) ### Fix -- Fix ([#1166](https://github.com/JsDaddy/ngx-mask/issues/1166)) -- Fix ([#865](https://github.com/JsDaddy/ngx-mask/issues/865)) +- Fix ([#1166](https://github.com/JsDaddy/ngx-mask/issues/1166)) +- Fix ([#865](https://github.com/JsDaddy/ngx-mask/issues/865)) # 16.1.7(2023-06-14) ### Fix -- Fix ([#1171](https://github.com/JsDaddy/ngx-mask/issues/1171)) +- Fix ([#1171](https://github.com/JsDaddy/ngx-mask/issues/1171)) # 16.1.6(2023-06-14) ### Fix -- Fix ([#797](https://github.com/JsDaddy/ngx-mask/issues/797)) +- Fix ([#797](https://github.com/JsDaddy/ngx-mask/issues/797)) # 16.1.5(2023-06-13) ### Fix -- Fix ([#1167](https://github.com/JsDaddy/ngx-mask/issues/1167)) -- Fix ([#1169](https://github.com/JsDaddy/ngx-mask/issues/1169)) -- Fix ([#934](https://github.com/JsDaddy/ngx-mask/issues/934)) +- Fix ([#1167](https://github.com/JsDaddy/ngx-mask/issues/1167)) +- Fix ([#1169](https://github.com/JsDaddy/ngx-mask/issues/1169)) +- Fix ([#934](https://github.com/JsDaddy/ngx-mask/issues/934)) # 16.1.4(2023-06-13) ### Fix -- Fix ([#929](https://github.com/JsDaddy/ngx-mask/issues/929)) -- Fix ([#944](https://github.com/JsDaddy/ngx-mask/issues/944)) +- Fix ([#929](https://github.com/JsDaddy/ngx-mask/issues/929)) +- Fix ([#944](https://github.com/JsDaddy/ngx-mask/issues/944)) # 16.1.3(2023-06-08) ### Fix -- Fix ([#601](https://github.com/JsDaddy/ngx-mask/issues/601)) -- Fix ([#1042](https://github.com/JsDaddy/ngx-mask/issues/1042)) -- Fix ([#680](https://github.com/JsDaddy/ngx-mask/issues/680)) +- Fix ([#601](https://github.com/JsDaddy/ngx-mask/issues/601)) +- Fix ([#1042](https://github.com/JsDaddy/ngx-mask/issues/1042)) +- Fix ([#680](https://github.com/JsDaddy/ngx-mask/issues/680)) # 16.1.2(2023-06-05) ### Fix -- Fix ([#772](https://github.com/JsDaddy/ngx-mask/issues/722)) +- Fix ([#772](https://github.com/JsDaddy/ngx-mask/issues/722)) # 16.1.1(2023-06-05) ### Fix -- Fix ([#1071](https://github.com/JsDaddy/ngx-mask/issues/1071)) +- Fix ([#1071](https://github.com/JsDaddy/ngx-mask/issues/1071)) # 16.1.0(2023-06-01) ### Fix -- Fix ([#889](https://github.com/JsDaddy/ngx-mask/issues/889)) -- Fix ([#881](https://github.com/JsDaddy/ngx-mask/issues/881)) -- Fix ([#1024](https://github.com/JsDaddy/ngx-mask/issues/1024)) +- Fix ([#889](https://github.com/JsDaddy/ngx-mask/issues/889)) +- Fix ([#881](https://github.com/JsDaddy/ngx-mask/issues/881)) +- Fix ([#1024](https://github.com/JsDaddy/ngx-mask/issues/1024)) # 16.0.9(2023-05-24) ### Fix -- Fix ([#933](https://github.com/JsDaddy/ngx-mask/issues/933)) -- Fix ([#773](https://github.com/JsDaddy/ngx-mask/issues/773)) -- Fix ([#905](https://github.com/JsDaddy/ngx-mask/issues/905)) -- Fix ([#932](https://github.com/JsDaddy/ngx-mask/issues/932)) -- Fix ([#853](https://github.com/JsDaddy/ngx-mask/issues/853)) -- Fix ([#908](https://github.com/JsDaddy/ngx-mask/issues/908)) -- Fix ([#866](https://github.com/JsDaddy/ngx-mask/issues/866)) -- Fix ([#722](https://github.com/JsDaddy/ngx-mask/issues/722)) +- Fix ([#933](https://github.com/JsDaddy/ngx-mask/issues/933)) +- Fix ([#773](https://github.com/JsDaddy/ngx-mask/issues/773)) +- Fix ([#905](https://github.com/JsDaddy/ngx-mask/issues/905)) +- Fix ([#932](https://github.com/JsDaddy/ngx-mask/issues/932)) +- Fix ([#853](https://github.com/JsDaddy/ngx-mask/issues/853)) +- Fix ([#908](https://github.com/JsDaddy/ngx-mask/issues/908)) +- Fix ([#866](https://github.com/JsDaddy/ngx-mask/issues/866)) +- Fix ([#722](https://github.com/JsDaddy/ngx-mask/issues/722)) # 16.0.8(2023-05-29) ### Fix -- Fix ([#1018](https://github.com/JsDaddy/ngx-mask/issues/1018)) +- Fix ([#1018](https://github.com/JsDaddy/ngx-mask/issues/1018)) # 16.0.7(2023-05-26) ### Fix -- Fix ([#916](https://github.com/JsDaddy/ngx-mask/issues/916)) +- Fix ([#916](https://github.com/JsDaddy/ngx-mask/issues/916)) # 16.0.6(2023-05-25) ### Fix -- Fix ([#880](https://github.com/JsDaddy/ngx-mask/issues/880)) +- Fix ([#880](https://github.com/JsDaddy/ngx-mask/issues/880)) # 16.0.5(2023-05-24) ### Fix -- Fix ([#697](https://github.com/JsDaddy/ngx-mask/issues/697)) -- Fix ([#850](https://github.com/JsDaddy/ngx-mask/issues/850)) -- Fix ([#786](https://github.com/JsDaddy/ngx-mask/issues/786)) +- Fix ([#697](https://github.com/JsDaddy/ngx-mask/issues/697)) +- Fix ([#850](https://github.com/JsDaddy/ngx-mask/issues/850)) +- Fix ([#786](https://github.com/JsDaddy/ngx-mask/issues/786)) # 16.0.4(2023-05-19) ### Fix -- Fix ([#911](https://github.com/JsDaddy/ngx-mask/issues/911)) -- Fix ([#854](https://github.com/JsDaddy/ngx-mask/issues/854)) +- Fix ([#911](https://github.com/JsDaddy/ngx-mask/issues/911)) +- Fix ([#854](https://github.com/JsDaddy/ngx-mask/issues/854)) # 16.0.3(2023-05-18) ### Fix -- Fix ([#1135](https://github.com/JsDaddy/ngx-mask/issues/1135)) -- Fix ([#1066](https://github.com/JsDaddy/ngx-mask/issues/1066)) -- Fix ([#870](https://github.com/JsDaddy/ngx-mask/issues/870)) -- Fix ([#1019](https://github.com/JsDaddy/ngx-mask/issues/1019)) +- Fix ([#1135](https://github.com/JsDaddy/ngx-mask/issues/1135)) +- Fix ([#1066](https://github.com/JsDaddy/ngx-mask/issues/1066)) +- Fix ([#870](https://github.com/JsDaddy/ngx-mask/issues/870)) +- Fix ([#1019](https://github.com/JsDaddy/ngx-mask/issues/1019)) # 16.0.2(2023-05-16) ### Fix -- Fix ([#1146](https://github.com/JsDaddy/ngx-mask/issues/1146)) +- Fix ([#1146](https://github.com/JsDaddy/ngx-mask/issues/1146)) # 16.0.1(2023-05-16) ### Fix -- Fix ([#871](https://github.com/JsDaddy/ngx-mask/issues/871)) -- Fix ([#920](https://github.com/JsDaddy/ngx-mask/issues/920)) -- Fix ([#785](https://github.com/JsDaddy/ngx-mask/issues/785)) -- Fix ([#718](https://github.com/JsDaddy/ngx-mask/issues/718)) -- Fix ([725](https://github.com/JsDaddy/ngx-mask/issues/725)) -- Fix ([#903](https://github.com/JsDaddy/ngx-mask/issues/903)) -- Fix ([#860](https://github.com/JsDaddy/ngx-mask/issues/860)) +- Fix ([#871](https://github.com/JsDaddy/ngx-mask/issues/871)) +- Fix ([#920](https://github.com/JsDaddy/ngx-mask/issues/920)) +- Fix ([#785](https://github.com/JsDaddy/ngx-mask/issues/785)) +- Fix ([#718](https://github.com/JsDaddy/ngx-mask/issues/718)) +- Fix ([725](https://github.com/JsDaddy/ngx-mask/issues/725)) +- Fix ([#903](https://github.com/JsDaddy/ngx-mask/issues/903)) +- Fix ([#860](https://github.com/JsDaddy/ngx-mask/issues/860)) # 16.0.0(2023-05-13) ### Feature -- update ng 16.x +- update ng 16.x ### Feature 15.2.3 -- Upgrade version 15.2.3 with more fixes since version 17.x.x +- Upgrade version 15.2.3 with more fixes since version 17.x.x ### Feature 15.2.1 -- Upgrade version 15.2.1 with more fixes since version 16.x.x +- Upgrade version 15.2.1 with more fixes since version 16.x.x # 15.1.5(2023-05-12) ### Fix -- Fix ([#837](https://github.com/JsDaddy/ngx-mask/issues/837)) +- Fix ([#837](https://github.com/JsDaddy/ngx-mask/issues/837)) @@ -567,10 +567,10 @@ ### Fix -- Fix ([#1078](https://github.com/JsDaddy/ngx-mask/issues/1078)) -- Fix ([#816](https://github.com/JsDaddy/ngx-mask/issues/816)) -- Fix ([#925](https://github.com/JsDaddy/ngx-mask/issues/925)) -- Fix ([#811](https://github.com/JsDaddy/ngx-mask/issues/811)) +- Fix ([#1078](https://github.com/JsDaddy/ngx-mask/issues/1078)) +- Fix ([#816](https://github.com/JsDaddy/ngx-mask/issues/816)) +- Fix ([#925](https://github.com/JsDaddy/ngx-mask/issues/925)) +- Fix ([#811](https://github.com/JsDaddy/ngx-mask/issues/811)) @@ -578,7 +578,7 @@ ### Fix -- Fix ([#1103](https://github.com/JsDaddy/ngx-mask/issues/1103)) +- Fix ([#1103](https://github.com/JsDaddy/ngx-mask/issues/1103)) @@ -586,8 +586,8 @@ ### Fix -- Fix ([#1101](https://github.com/JsDaddy/ngx-mask/issues/1101)) -- Fix ([#1009](https://github.com/JsDaddy/ngx-mask/issues/1009)) +- Fix ([#1101](https://github.com/JsDaddy/ngx-mask/issues/1101)) +- Fix ([#1009](https://github.com/JsDaddy/ngx-mask/issues/1009)) @@ -595,7 +595,7 @@ ### Fix -- Close non public API +- Close non public API @@ -603,7 +603,7 @@ ### Fix -- Fix ([#1077](https://github.com/JsDaddy/ngx-mask/issues/1077)) +- Fix ([#1077](https://github.com/JsDaddy/ngx-mask/issues/1077)) @@ -611,7 +611,7 @@ ### Fix -- Fix ([#1069](https://github.com/JsDaddy/ngx-mask/issues/1069)) +- Fix ([#1069](https://github.com/JsDaddy/ngx-mask/issues/1069)) @@ -619,7 +619,7 @@ ### Fix -- Fix README.md +- Fix README.md @@ -627,7 +627,7 @@ ### Fix -- separate `provideEnvironmentNgxMask` and `provideNgxMask` +- separate `provideEnvironmentNgxMask` and `provideNgxMask` @@ -635,29 +635,29 @@ ### Fix -- update ng 15.x -- usage new standalone API +- update ng 15.x +- usage new standalone API ### Feature 14.3.3 -- Upgrade version 15.2.2 with more fixes since version 17.x.x +- Upgrade version 15.2.2 with more fixes since version 17.x.x ### Feature 14.3.2 -- Upgrade version 14.3.2 with more fixes since version 16.x.x -- Change MaskPipe => NgxMaskPipe -- Change MaskService => NgxMaskService -- Change MaskApplierService => NgxMaskApplierService -- Change MaskDirective => NgxMaskMaskDirective +- Upgrade version 14.3.2 with more fixes since version 16.x.x +- Change MaskPipe => NgxMaskPipe +- Change MaskService => NgxMaskService +- Change MaskApplierService => NgxMaskApplierService +- Change MaskDirective => NgxMaskMaskDirective # 14.2.4(2022-10-27) ### Fix -- Fix ([#1039](https://github.com/JsDaddy/ngx-mask/issues/1039)) -- new code and styles linting rules formatting +- Fix ([#1039](https://github.com/JsDaddy/ngx-mask/issues/1039)) +- new code and styles linting rules formatting @@ -665,7 +665,7 @@ ### Fix -- Fix ([#1030](https://github.com/JsDaddy/ngx-mask/issues/1030)) +- Fix ([#1030](https://github.com/JsDaddy/ngx-mask/issues/1030)) @@ -673,9 +673,9 @@ ### Fix -- Fix ([#960](https://github.com/JsDaddy/ngx-mask/issues/960)) -- Fix ([#946](https://github.com/JsDaddy/ngx-mask/issues/946)) -- Fix ([#1027](https://github.com/JsDaddy/ngx-mask/issues/1027)) +- Fix ([#960](https://github.com/JsDaddy/ngx-mask/issues/960)) +- Fix ([#946](https://github.com/JsDaddy/ngx-mask/issues/946)) +- Fix ([#1027](https://github.com/JsDaddy/ngx-mask/issues/1027)) @@ -683,7 +683,7 @@ ### Fix -- package build process +- package build process @@ -691,8 +691,8 @@ ### Fix -- update ng 14.2.1 -- Fix ([#1029](https://github.com/JsDaddy/ngx-mask/issues/1029)) +- update ng 14.2.1 +- Fix ([#1029](https://github.com/JsDaddy/ngx-mask/issues/1029)) @@ -700,14 +700,14 @@ ### Fix -- Fix ([#1017](https://github.com/JsDaddy/ngx-mask/issues/1017)) -- Fix ([#1008](https://github.com/JsDaddy/ngx-mask/issues/1008)) +- Fix ([#1017](https://github.com/JsDaddy/ngx-mask/issues/1017)) +- Fix ([#1008](https://github.com/JsDaddy/ngx-mask/issues/1008)) # 14.0.2(2022-06-09) -- Fix ([#688](https://github.com/JsDaddy/ngx-mask/issues/688)) +- Fix ([#688](https://github.com/JsDaddy/ngx-mask/issues/688)) @@ -719,21 +719,21 @@ ### Feature -- Update to Angular 14 +- Update to Angular 14 ### Feature 13.3.2 -- Upgrade version 13.2.2 with more fixes since version 17.x.x +- Upgrade version 13.2.2 with more fixes since version 17.x.x ### Feature 13.2.1 -- Upgrade version 13.2.1 with more fixes since version 16.x.x -- Change MaskPipe => NgxMaskPipe -- Change MaskService => NgxMaskService -- Change MaskApplierService => NgxMaskApplierService -- Change MaskDirective => NgxMaskMaskDirective +- Upgrade version 13.2.1 with more fixes since version 16.x.x +- Change MaskPipe => NgxMaskPipe +- Change MaskService => NgxMaskService +- Change MaskApplierService => NgxMaskApplierService +- Change MaskDirective => NgxMaskMaskDirective @@ -741,7 +741,7 @@ ### Fix -- Fix ([#648](https://github.com/JsDaddy/ngx-mask/issues/648)) +- Fix ([#648](https://github.com/JsDaddy/ngx-mask/issues/648)) @@ -749,7 +749,7 @@ ### Fix -- Fix ([#984](https://github.com/JsDaddy/ngx-mask/issues/984)) +- Fix ([#984](https://github.com/JsDaddy/ngx-mask/issues/984)) @@ -757,7 +757,7 @@ ### Fix -- Fix ([#915](https://github.com/JsDaddy/ngx-mask/issues/915)) +- Fix ([#915](https://github.com/JsDaddy/ngx-mask/issues/915)) @@ -765,8 +765,8 @@ ### Fix -- Fixed issue where active elements within a shadowRoot would not be found by mask -- Fix ([#909](https://github.com/JsDaddy/ngx-mask/issues/909)) +- Fixed issue where active elements within a shadowRoot would not be found by mask +- Fix ([#909](https://github.com/JsDaddy/ngx-mask/issues/909)) @@ -774,7 +774,7 @@ ### Fix -- Fix ([#1000](https://github.com/JsDaddy/ngx-mask/issues/1000)) +- Fix ([#1000](https://github.com/JsDaddy/ngx-mask/issues/1000)) @@ -782,7 +782,7 @@ ### Fix -- Fix ([#948](https://github.com/JsDaddy/ngx-mask/issues/948)) +- Fix ([#948](https://github.com/JsDaddy/ngx-mask/issues/948)) @@ -790,7 +790,7 @@ ### Fix -- Fix ([#923](https://github.com/JsDaddy/ngx-mask/pull/923)) +- Fix ([#923](https://github.com/JsDaddy/ngx-mask/pull/923)) @@ -798,8 +798,8 @@ ### Feature -- Added lowercase and uppercase mask support -- Feature ([#947](https://github.com/JsDaddy/ngx-mask/issues/947)) +- Added lowercase and uppercase mask support +- Feature ([#947](https://github.com/JsDaddy/ngx-mask/issues/947)) @@ -807,8 +807,8 @@ ### Fix -- Ghost characters shown in input when toggling mask on/off -- Fix ([#897](https://github.com/JsDaddy/ngx-mask/issues/897)) +- Ghost characters shown in input when toggling mask on/off +- Fix ([#897](https://github.com/JsDaddy/ngx-mask/issues/897)) @@ -816,7 +816,7 @@ ### Fix -- Fixed ([#848](https://github.com/JsDaddy/ngx-mask/issues/848)) +- Fixed ([#848](https://github.com/JsDaddy/ngx-mask/issues/848)) @@ -824,8 +824,8 @@ ### Feature -- Function maskFilled is added -- Feature ([#917](https://github.com/JsDaddy/ngx-mask/issues/917)) +- Function maskFilled is added +- Feature ([#917](https://github.com/JsDaddy/ngx-mask/issues/917)) @@ -842,7 +842,7 @@ Fixed ([#965](https://github.com/JsDaddy/ngx-mask/issues/965)) ### Features -- added triggerOnMaskChange, allow mask change to trigger onChange +- added triggerOnMaskChange, allow mask change to trigger onChange @@ -850,8 +850,8 @@ Fixed ([#965](https://github.com/JsDaddy/ngx-mask/issues/965)) ### Fixes -- Revision for separator logic. -- Set default decimalMarker to [".",","] instead "." +- Revision for separator logic. +- Set default decimalMarker to [".",","] instead "." @@ -859,12 +859,12 @@ Fixed ([#965](https://github.com/JsDaddy/ngx-mask/issues/965)) ### Features -- Enable non-zero-selections -- Deletion of special mask character moves just the cursor instead of deleting the character next to it +- Enable non-zero-selections +- Deletion of special mask character moves just the cursor instead of deleting the character next to it ### Test/CI fixes -- Enable cypress component testing +- Enable cypress component testing @@ -872,9 +872,9 @@ Fixed ([#965](https://github.com/JsDaddy/ngx-mask/issues/965)) ### Test/CI fixes -- the same that in 13.0.0 -- fix test -- fix CI +- the same that in 13.0.0 +- fix test +- fix CI @@ -882,10 +882,10 @@ Fixed ([#965](https://github.com/JsDaddy/ngx-mask/issues/965)) ### Angular 13 release -- up all dependencies to latest -- move from tslint to eslint -- add more strict rules for tsconfig and code quality config -- build library with IVY and new angular package structure +- up all dependencies to latest +- move from tslint to eslint +- add more strict rules for tsconfig and code quality config +- build library with IVY and new angular package structure diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 0bdf1c94..afaa98fe 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -17,24 +17,24 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the - overall community +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community Examples of unacceptable behavior include: -- The use of sexualized language or imagery, and sexual attention or - advances of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email - address, without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting ## Enforcement Responsibilities diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21e9ff38..1854b073 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,16 +8,16 @@ Please format code and markup in your issue using [github markdown](https://help ## Contributing to Source Code (Pull Requests) -- If your PR changes any behavior or fixes an issue, it should have an associated test. -- New features should be general and as simple as possible. -- Breaking changes should be avoided if possible. -- All pull requests require review. No PR will be merged without a comment from a team member stating LGTM (Looks good to me). +- If your PR changes any behavior or fixes an issue, it should have an associated test. +- New features should be general and as simple as possible. +- Breaking changes should be avoided if possible. +- All pull requests require review. No PR will be merged without a comment from a team member stating LGTM (Looks good to me). ## Protractor specific rules -- JavaScript style should generally follow the [Google JS style guide](https://google.github.io/styleguide/javascriptguide.xml). -- Document public methods with jsdoc. -- Be consistent with the code around you! +- JavaScript style should generally follow the [Google JS style guide](https://google.github.io/styleguide/javascriptguide.xml). +- Document public methods with jsdoc. +- Be consistent with the code around you! ## Commit Messages diff --git a/README.md b/README.md index 5fad4fc6..a3e63565 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,7 @@ ngx-mask follows the official Angular support policy, supporting the Active and Projects using Angular versions outside the supported range (e.g., older than v17) should use the last compatible version of ngx-mask. However, these versions will no longer receive updates, bug fixes, or new features. -For detailed information about Angular's versioning and support schedule, visit the official [Angular releases page](https://angular.dev/reference/releases#actively-supported-versions). +For detailed information about Angular's versioning and support schedule, visit the official [Angular releases page](https://angular.dev/reference/releases#actively-supported-versions). ## Usage diff --git a/USAGE.md b/USAGE.md index 9ea4d5eb..a29fdfdc 100644 --- a/USAGE.md +++ b/USAGE.md @@ -113,11 +113,11 @@ Important Notes: Reserved Characters: Certain characters (h, d, m, s) are reserved for date patterns and should not be used in custom patterns to avoid conflicts. ```html -Special Symbol *: The * character is reserved for patterns like 0*, which means any length of digits can appear before the asterisk. Avoid using this symbol in custom patterns. - - -``` +Special Symbol *: The * character is reserved for patterns like 0*, which means any length of digits +can appear before the asterisk. Avoid using this symbol in custom patterns. + +``` ```typescript pattern = { From cab94961dc19e51e3ef91cf7950120f654e5e8f5 Mon Sep 17 00:00:00 2001 From: andriikamaldinov1 Date: Fri, 6 Dec 2024 13:26:07 +0200 Subject: [PATCH 10/10] fix(ref: no-ref): fix issues --- projects/ngx-mask-lib/src/test/mask.pipe.spec.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts b/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts index 2ff1843b..7f4a47c5 100644 --- a/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts +++ b/projects/ngx-mask-lib/src/test/mask.pipe.spec.ts @@ -352,16 +352,14 @@ describe('Pipe: Mask', () => { }); it('should show second pipe without suffix', () => { - const valueWithSuffix: string | number = maskPipe.transform('55555', '00 (000)', { + const valueWithSuffix: string | number = maskPipe.transform('55555 ', '00 (000)', { suffix: ' DDD', }); - const valueWithPrefix: string | number = maskPipe.transform('55555', '00 (000)', { + const valueWithPrefix: string | number = maskPipe.transform('55555 ', '00 (000)', { prefix: 'DDD ', }); - requestAnimationFrame(() => { - expect(valueWithSuffix).toEqual('55 (555) DDD'); - expect(valueWithPrefix).toEqual('DDD 55 (555)'); - }); + expect(valueWithSuffix).toEqual('55 (555) DDD'); + expect(valueWithPrefix).toEqual('DDD 55 (555)'); }); });