From 32bbbcf3da33d229d93218c47e0ca58f4b56967f Mon Sep 17 00:00:00 2001 From: Alexander Shabunevich Date: Fri, 9 Dec 2022 13:29:41 +0300 Subject: [PATCH] Parse input opts logic moved from MaskInput --- src/mask-input.ts | 21 ++------------ src/parser.ts | 33 +++++++++++++++++++--- test/parser.test.ts | 67 --------------------------------------------- 3 files changed, 31 insertions(+), 90 deletions(-) delete mode 100644 test/parser.test.ts diff --git a/src/mask-input.ts b/src/mask-input.ts index 8857f98..8168828 100644 --- a/src/mask-input.ts +++ b/src/mask-input.ts @@ -1,5 +1,5 @@ import { Mask, MaskOptions } from './mask' -import { parseMask, parseOpts, parseTokens } from './parser' +import { parseInput } from './parser' type OnMaskaType = (detail: MaskaDetail) => void @@ -41,24 +41,7 @@ export class MaskInput { private init (inputs: HTMLInputElement[], defaults: MaskOptions): void { for (const input of inputs) { - const opts = { ...defaults } - if (input.dataset.maska != null && input.dataset.maska !== '') { - opts.mask = parseMask(input.dataset.maska) - } - if (input.dataset.maskaEager != null) { - opts.eager = parseOpts(input.dataset.maskaEager) - } - if (input.dataset.maskaReversed != null) { - opts.reversed = parseOpts(input.dataset.maskaReversed) - } - if (input.dataset.maskaTokensReplace != null) { - opts.tokensReplace = parseOpts(input.dataset.maskaTokensReplace) - } - if (input.dataset.maskaTokens != null) { - opts.tokens = parseTokens(input.dataset.maskaTokens) - } - - const mask = new Mask(opts) + const mask = new Mask(parseInput(input, defaults)) this.items.set(input, mask) if (input.value !== '') { diff --git a/src/parser.ts b/src/parser.ts index cfd5e27..76f6e8e 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -1,15 +1,40 @@ -import { MaskType } from './mask' +import { MaskOptions, MaskType } from './mask' import { MaskTokens } from './tokens' const parseJson = (value: string): any => JSON.parse(value.replaceAll("'", '"')) -export const parseOpts = (value: string): boolean => +export const parseInput = ( + input: HTMLInputElement, + defaults: MaskOptions = {} +): MaskOptions => { + const opts = { ...defaults } + + if (input.dataset.maska != null && input.dataset.maska !== '') { + opts.mask = parseMask(input.dataset.maska) + } + if (input.dataset.maskaEager != null) { + opts.eager = parseOpts(input.dataset.maskaEager) + } + if (input.dataset.maskaReversed != null) { + opts.reversed = parseOpts(input.dataset.maskaReversed) + } + if (input.dataset.maskaTokensReplace != null) { + opts.tokensReplace = parseOpts(input.dataset.maskaTokensReplace) + } + if (input.dataset.maskaTokens != null) { + opts.tokens = parseTokens(input.dataset.maskaTokens) + } + + return opts +} + +const parseOpts = (value: string): boolean => value !== '' ? Boolean(JSON.parse(value)) : true -export const parseMask = (value: string): MaskType => +const parseMask = (value: string): MaskType => value.startsWith('[') && value.endsWith(']') ? parseJson(value) : value -export const parseTokens = (value: string): MaskTokens => { +const parseTokens = (value: string): MaskTokens => { if (value.startsWith('{') && value.endsWith('}')) { return parseJson(value) } diff --git a/test/parser.test.ts b/test/parser.test.ts deleted file mode 100644 index 02f2867..0000000 --- a/test/parser.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { expect, test } from 'vitest' - -import { parseMask, parseOpts, parseTokens } from '../src/parser' - -test('mask: empty', () => { - expect(parseMask('')).toBe('') -}) - -test('mask: string', () => { - expect(parseMask('#-#')).toBe('#-#') -}) - -test('mask: array', () => { - expect(parseMask('["#", "##"]')).toEqual(expect.arrayContaining(['#', '##'])) -}) - -test('opts: empty', () => { - expect(parseOpts('')).toBe(true) -}) - -test('opts: true', () => { - expect(parseOpts('true')).toBe(true) -}) - -test('opts: truthy', () => { - expect(parseOpts('1')).toBe(true) -}) - -test('opts: false', () => { - expect(parseOpts('false')).toBe(false) -}) - -test('opts: falsy', () => { - expect(parseOpts('0')).toBe(false) -}) - -test('tokens: json', () => { - expect(parseTokens('{ "Z": { "pattern": "[0-9]" } }')).toEqual( - expect.objectContaining({ Z: { pattern: '[0-9]' } }) - ) -}) - -test('tokens: code', () => { - expect(parseTokens('Z:[0-9]')).toEqual( - expect.objectContaining({ - Z: { pattern: /[0-9]/, multiple: false, optional: false, repeated: false } - }) - ) - - expect(parseTokens('Z:[0-9]:multiple')).toEqual( - expect.objectContaining({ - Z: { pattern: /[0-9]/, multiple: true, optional: false, repeated: false } - }) - ) - - expect(parseTokens('Z:[0-9]:optional')).toEqual( - expect.objectContaining({ - Z: { pattern: /[0-9]/, multiple: false, optional: true, repeated: false } - }) - ) - - expect(parseTokens('Z:[0-9]:repeated')).toEqual( - expect.objectContaining({ - Z: { pattern: /[0-9]/, multiple: false, optional: false, repeated: true } - }) - ) -})