maskarajs 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +339 -169
- package/mask.cjs.js +173 -44
- package/mask.d.ts +49 -7
- package/mask.js +2 -874
- package/mask.mjs +2 -874
- package/package.json +39 -3
- package/presets/br.cjs.js +45 -0
- package/presets/br.d.ts +23 -0
- package/presets/br.mjs +40 -0
- package/react.cjs.js +89 -0
- package/react.d.ts +57 -0
- package/react.mjs +2 -0
- package/src/core/mask.d.ts +333 -0
- package/src/core/mask.mjs +1002 -0
- package/src/react/useMask.mjs +80 -0
package/mask.cjs.js
CHANGED
|
@@ -232,6 +232,120 @@ function selectPattern(patterns, chars, slots = globalSlots, cacheId = 'global',
|
|
|
232
232
|
return sorted[sorted.length - 1]
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
+
function isPatternRule(item) {
|
|
236
|
+
return item && typeof item === 'object' && !Array.isArray(item) && typeof item.pattern !== 'undefined'
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function toPatternList(pattern) {
|
|
240
|
+
return Array.isArray(pattern) ? pattern : [pattern]
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function flattenPatterns(pattern) {
|
|
244
|
+
const list = toPatternList(pattern)
|
|
245
|
+
const flattened = []
|
|
246
|
+
|
|
247
|
+
for (const item of list) {
|
|
248
|
+
if (isPatternRule(item)) {
|
|
249
|
+
flattened.push(...flattenPatterns(item.pattern))
|
|
250
|
+
} else if (Array.isArray(item)) {
|
|
251
|
+
flattened.push(...flattenPatterns(item))
|
|
252
|
+
} else {
|
|
253
|
+
flattened.push(item)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return flattened
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function hasConditionalRules(pattern) {
|
|
261
|
+
return Array.isArray(pattern) && pattern.some(isPatternRule)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function extractCandidateChars(value, patterns, slots = globalSlots, cacheId = 'global', slotsVersion = globalSlotsVersion) {
|
|
265
|
+
const allLiterals = new Set()
|
|
266
|
+
for (const p of flattenPatterns(patterns)) {
|
|
267
|
+
for (const t of parse(p, slots, cacheId, slotsVersion)) {
|
|
268
|
+
if (t.type === 'literal') {
|
|
269
|
+
for (const ch of t.value) allLiterals.add(ch)
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return Array.from(String(value)).filter(ch => !allLiterals.has(ch))
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function resolvePatternList(pattern, value = '', slots = globalSlots, cacheId = 'global', slotsVersion = globalSlotsVersion) {
|
|
277
|
+
if (!hasConditionalRules(pattern)) return flattenPatterns(pattern)
|
|
278
|
+
|
|
279
|
+
const rules = pattern.map(item => isPatternRule(item) ? item : { pattern: item })
|
|
280
|
+
const raw = extractCandidateChars(value, rules.map(rule => rule.pattern), slots, cacheId, slotsVersion).join('')
|
|
281
|
+
const matched = rules.find(rule => typeof rule.when === 'function' && rule.when(raw, String(value)))
|
|
282
|
+
const fallback = rules.find(rule => typeof rule.when !== 'function')
|
|
283
|
+
return flattenPatterns((matched || fallback || rules[0]).pattern)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function assertPatternRules(pattern, label) {
|
|
287
|
+
if (!Array.isArray(pattern)) return
|
|
288
|
+
for (const rule of pattern) {
|
|
289
|
+
if (!isPatternRule(rule)) continue
|
|
290
|
+
if (rule.when && typeof rule.when !== 'function') {
|
|
291
|
+
throw new Error(`${label}: when precisa ser uma função`)
|
|
292
|
+
}
|
|
293
|
+
assertPatternRules(rule.pattern, label)
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function hasPatternMap(definition) {
|
|
298
|
+
return definition?.patterns && typeof definition.patterns === 'object' && !Array.isArray(definition.patterns)
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function patternMapValues(patterns) {
|
|
302
|
+
return Object.values(patterns)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function selectDefinitionPattern(definition, value = '', slots = globalSlots, cacheId = 'global', slotsVersion = globalSlotsVersion) {
|
|
306
|
+
if (!hasPatternMap(definition)) return definition.pattern
|
|
307
|
+
|
|
308
|
+
const raw = extractCandidateChars(value, patternMapValues(definition.patterns), slots, cacheId, slotsVersion).join('')
|
|
309
|
+
const selected = definition.select(raw, String(value))
|
|
310
|
+
|
|
311
|
+
if (!Object.prototype.hasOwnProperty.call(definition.patterns, selected)) {
|
|
312
|
+
throw new Error(`mask.select: "${String(selected)}" não existe em patterns`)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return definition.patterns[selected]
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function allDefinitionPatterns(definition) {
|
|
319
|
+
return hasPatternMap(definition) ? patternMapValues(definition.patterns) : definition.pattern
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function assertDefinition(name, definition, label = 'mask.define') {
|
|
323
|
+
if (!definition || (!definition.pattern && !definition.patterns)) {
|
|
324
|
+
throw new Error(`${label}: "${name}" precisa de um pattern`)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (definition.pattern && definition.patterns) {
|
|
328
|
+
throw new Error(`${label}: "${name}" use pattern ou patterns, não ambos`)
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (hasPatternMap(definition)) {
|
|
332
|
+
if (typeof definition.select !== 'function') {
|
|
333
|
+
throw new Error(`${label}: "${name}" select precisa ser uma função`)
|
|
334
|
+
}
|
|
335
|
+
const values = patternMapValues(definition.patterns)
|
|
336
|
+
if (values.length === 0) {
|
|
337
|
+
throw new Error(`${label}: "${name}" patterns precisa ter ao menos um pattern`)
|
|
338
|
+
}
|
|
339
|
+
for (const pattern of values) assertPatternRules(pattern, `${label}: "${name}"`)
|
|
340
|
+
} else {
|
|
341
|
+
assertPatternRules(definition.pattern, `${label}: "${name}"`)
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (definition.validate && typeof definition.validate !== 'function') {
|
|
345
|
+
throw new Error(`${label}: "${name}" validate precisa ser uma função`)
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
235
349
|
// ─── Extração e validação de chars de input ────────────────────────────────
|
|
236
350
|
|
|
237
351
|
/**
|
|
@@ -254,7 +368,7 @@ function fullLength(pattern, slots = globalSlots, cacheId = 'global', slotsVersi
|
|
|
254
368
|
}
|
|
255
369
|
|
|
256
370
|
function extractInputChars(value, patterns, validate = defaultValidate, slots = globalSlots, cacheId = 'global', slotsVersion = globalSlotsVersion) {
|
|
257
|
-
const patList =
|
|
371
|
+
const patList = flattenPatterns(patterns)
|
|
258
372
|
|
|
259
373
|
// 1. coleta todos os literais para remover do valor
|
|
260
374
|
const allLiterals = new Set()
|
|
@@ -321,10 +435,10 @@ function mask(pattern, value) {
|
|
|
321
435
|
if (typeof pattern === 'string' && registry.has(pattern)) {
|
|
322
436
|
const entry = registry.get(pattern)
|
|
323
437
|
validate = entry.validate
|
|
324
|
-
pattern = entry
|
|
438
|
+
pattern = selectDefinitionPattern(entry, value, globalSlots, 'global', globalSlotsVersion)
|
|
325
439
|
}
|
|
326
440
|
const str = String(value)
|
|
327
|
-
const patterns =
|
|
441
|
+
const patterns = resolvePatternList(pattern, str, globalSlots, 'global', globalSlotsVersion)
|
|
328
442
|
const chars = extractInputChars(str, patterns, validate, globalSlots, 'global', globalSlotsVersion)
|
|
329
443
|
const chosen = selectPattern(patterns, chars, globalSlots, 'global', globalSlotsVersion)
|
|
330
444
|
return applyTokens(parse(chosen, globalSlots, 'global', globalSlotsVersion), chars)
|
|
@@ -353,10 +467,10 @@ mask.raw = function (pattern, value) {
|
|
|
353
467
|
const entry = registry.get(pattern)
|
|
354
468
|
transform = entry.transform
|
|
355
469
|
validate = entry.validate
|
|
356
|
-
pattern = entry
|
|
470
|
+
pattern = selectDefinitionPattern(entry, value, globalSlots, 'global', globalSlotsVersion)
|
|
357
471
|
}
|
|
358
472
|
|
|
359
|
-
const patterns =
|
|
473
|
+
const patterns = resolvePatternList(pattern, String(value), globalSlots, 'global', globalSlotsVersion)
|
|
360
474
|
const raw = extractInputChars(String(value), patterns, validate, globalSlots, 'global', globalSlotsVersion).join('')
|
|
361
475
|
|
|
362
476
|
if (!transform) return raw
|
|
@@ -378,9 +492,9 @@ mask.is = function (pattern, value) {
|
|
|
378
492
|
if (typeof pattern === 'string' && registry.has(pattern)) {
|
|
379
493
|
const entry = registry.get(pattern)
|
|
380
494
|
validate = entry.validate
|
|
381
|
-
pattern = entry
|
|
495
|
+
pattern = selectDefinitionPattern(entry, value, globalSlots, 'global', globalSlotsVersion)
|
|
382
496
|
}
|
|
383
|
-
const patterns =
|
|
497
|
+
const patterns = resolvePatternList(pattern, String(value), globalSlots, 'global', globalSlotsVersion)
|
|
384
498
|
const chars = extractInputChars(String(value), patterns, validate, globalSlots, 'global', globalSlotsVersion)
|
|
385
499
|
return patterns.some(p => chars.length >= inputCount(p, globalSlots, 'global', globalSlotsVersion))
|
|
386
500
|
}
|
|
@@ -395,9 +509,10 @@ mask.is = function (pattern, value) {
|
|
|
395
509
|
*/
|
|
396
510
|
mask.hint = function (pattern) {
|
|
397
511
|
if (typeof pattern === 'string' && registry.has(pattern)) {
|
|
398
|
-
pattern = registry.get(pattern)
|
|
512
|
+
pattern = selectDefinitionPattern(registry.get(pattern), '', globalSlots, 'global', globalSlotsVersion)
|
|
399
513
|
}
|
|
400
|
-
const
|
|
514
|
+
const patterns = resolvePatternList(pattern, '', globalSlots, 'global', globalSlotsVersion)
|
|
515
|
+
const p = patterns[patterns.length - 1]
|
|
401
516
|
return parse(p, globalSlots, 'global', globalSlotsVersion)
|
|
402
517
|
.map(t => {
|
|
403
518
|
if (t.type === 'literal') return t.value
|
|
@@ -434,9 +549,9 @@ mask.rawLength = function (pattern, value) {
|
|
|
434
549
|
if (typeof p === 'string' && registry.has(p)) {
|
|
435
550
|
const entry = registry.get(p)
|
|
436
551
|
validate = entry.validate
|
|
437
|
-
p = entry
|
|
552
|
+
p = selectDefinitionPattern(entry, value, globalSlots, 'global', globalSlotsVersion)
|
|
438
553
|
}
|
|
439
|
-
const patterns =
|
|
554
|
+
const patterns = resolvePatternList(p, String(value), globalSlots, 'global', globalSlotsVersion)
|
|
440
555
|
// Aplica a máscara e conta os chars do resultado — fonte da verdade
|
|
441
556
|
// é o valor mascarado, não o valor bruto (que pode ter chars não validados)
|
|
442
557
|
const masked = mask(p, String(value))
|
|
@@ -460,9 +575,9 @@ mask.rawLength = function (pattern, value) {
|
|
|
460
575
|
*/
|
|
461
576
|
mask.patternLength = function (pattern) {
|
|
462
577
|
if (typeof pattern === 'string' && registry.has(pattern)) {
|
|
463
|
-
pattern = registry.get(pattern)
|
|
578
|
+
pattern = allDefinitionPatterns(registry.get(pattern))
|
|
464
579
|
}
|
|
465
|
-
const patterns =
|
|
580
|
+
const patterns = flattenPatterns(pattern)
|
|
466
581
|
return Math.max(...patterns.map(p => fullLength(p, globalSlots, 'global', globalSlotsVersion)))
|
|
467
582
|
}
|
|
468
583
|
|
|
@@ -508,10 +623,7 @@ mask.format = function (pattern, value) {
|
|
|
508
623
|
* })
|
|
509
624
|
*/
|
|
510
625
|
mask.define = function (name, definition) {
|
|
511
|
-
|
|
512
|
-
if (definition.validate && typeof definition.validate !== 'function') {
|
|
513
|
-
throw new Error(`mask.define: "${name}" validate precisa ser uma função`)
|
|
514
|
-
}
|
|
626
|
+
assertDefinition(name, definition)
|
|
515
627
|
registry.set(name, definition)
|
|
516
628
|
}
|
|
517
629
|
|
|
@@ -590,19 +702,19 @@ mask.slots = function () {
|
|
|
590
702
|
* }))
|
|
591
703
|
*/
|
|
592
704
|
mask.on = function (input, pattern, options = {}) {
|
|
593
|
-
const { onValue, onMasked } = options
|
|
705
|
+
const { onValue, onMaskara, onMasked } = options
|
|
594
706
|
|
|
595
|
-
function
|
|
707
|
+
function currentPatterns() {
|
|
596
708
|
let p = pattern
|
|
597
|
-
if (typeof p === 'string' && registry.has(p)) p = registry.get(p).
|
|
598
|
-
return
|
|
709
|
+
if (typeof p === 'string' && registry.has(p)) p = selectDefinitionPattern(registry.get(p), input.value, globalSlots, 'global', globalSlotsVersion)
|
|
710
|
+
return resolvePatternList(p, input.value, globalSlots, 'global', globalSlotsVersion)
|
|
599
711
|
}
|
|
600
712
|
|
|
601
713
|
// Bloqueia keydown quando já no limite máximo —
|
|
602
714
|
// evita o flash de um frame com char excedente antes do handler corrigir
|
|
603
715
|
function onKeydown(e) {
|
|
604
716
|
if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return
|
|
605
|
-
const patterns =
|
|
717
|
+
const patterns = currentPatterns()
|
|
606
718
|
let validate
|
|
607
719
|
if (typeof pattern === 'string' && registry.has(pattern)) validate = registry.get(pattern).validate
|
|
608
720
|
const chars = extractInputChars(e.target.value, patterns, validate, globalSlots, 'global', globalSlotsVersion)
|
|
@@ -625,6 +737,7 @@ mask.on = function (input, pattern, options = {}) {
|
|
|
625
737
|
el.setSelectionRange(pos, pos)
|
|
626
738
|
})
|
|
627
739
|
|
|
740
|
+
onMaskara?.(masked)
|
|
628
741
|
onMasked?.(masked)
|
|
629
742
|
onValue?.(mask.raw(pattern, masked))
|
|
630
743
|
}
|
|
@@ -702,7 +815,7 @@ mask.create = function (presets = {}) {
|
|
|
702
815
|
|
|
703
816
|
// registra presets iniciais
|
|
704
817
|
for (const [name, def] of Object.entries(presets)) {
|
|
705
|
-
|
|
818
|
+
assertDefinition(name, def, 'mask.create')
|
|
706
819
|
localRegistry.set(name, def)
|
|
707
820
|
}
|
|
708
821
|
|
|
@@ -714,6 +827,20 @@ mask.create = function (presets = {}) {
|
|
|
714
827
|
return pattern
|
|
715
828
|
}
|
|
716
829
|
|
|
830
|
+
function resolveLocalForValue(pattern, value = '') {
|
|
831
|
+
if (typeof pattern === 'string' && localRegistry.has(pattern)) {
|
|
832
|
+
return selectDefinitionPattern(localRegistry.get(pattern), value, localSlots, localCacheId, localSlotsVersion)
|
|
833
|
+
}
|
|
834
|
+
return pattern
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
function resolveLocalForLength(pattern) {
|
|
838
|
+
if (typeof pattern === 'string' && localRegistry.has(pattern)) {
|
|
839
|
+
return allDefinitionPatterns(localRegistry.get(pattern))
|
|
840
|
+
}
|
|
841
|
+
return pattern
|
|
842
|
+
}
|
|
843
|
+
|
|
717
844
|
function resolveLocalEntry(pattern) {
|
|
718
845
|
if (typeof pattern === 'string' && localRegistry.has(pattern)) {
|
|
719
846
|
return localRegistry.get(pattern)
|
|
@@ -725,8 +852,8 @@ mask.create = function (presets = {}) {
|
|
|
725
852
|
|
|
726
853
|
function instance(pattern, value) {
|
|
727
854
|
if (value == null) return ''
|
|
728
|
-
const p =
|
|
729
|
-
const pats =
|
|
855
|
+
const p = resolveLocalForValue(pattern, value)
|
|
856
|
+
const pats = resolvePatternList(p, String(value), localSlots, localCacheId, localSlotsVersion)
|
|
730
857
|
const chars = extractInputChars(String(value), pats, resolveLocalEntry(pattern)?.validate, localSlots, localCacheId, localSlotsVersion)
|
|
731
858
|
const chosen = selectPattern(pats, chars, localSlots, localCacheId, localSlotsVersion)
|
|
732
859
|
return applyTokens(parse(chosen, localSlots, localCacheId, localSlotsVersion), chars)
|
|
@@ -740,9 +867,9 @@ mask.create = function (presets = {}) {
|
|
|
740
867
|
const entry = localRegistry.get(pattern)
|
|
741
868
|
transform = entry.transform
|
|
742
869
|
validate = entry.validate
|
|
743
|
-
pattern = entry
|
|
870
|
+
pattern = selectDefinitionPattern(entry, value, localSlots, localCacheId, localSlotsVersion)
|
|
744
871
|
}
|
|
745
|
-
const pats =
|
|
872
|
+
const pats = resolvePatternList(pattern, String(value), localSlots, localCacheId, localSlotsVersion)
|
|
746
873
|
const raw = extractInputChars(String(value), pats, validate, localSlots, localCacheId, localSlotsVersion).join('')
|
|
747
874
|
if (!transform) return raw
|
|
748
875
|
const complete = pats.some(p => raw.length >= inputCount(p, localSlots, localCacheId, localSlotsVersion))
|
|
@@ -751,15 +878,16 @@ mask.create = function (presets = {}) {
|
|
|
751
878
|
|
|
752
879
|
instance.is = function (pattern, value) {
|
|
753
880
|
if (value == null) return false
|
|
754
|
-
const p =
|
|
755
|
-
const pats =
|
|
881
|
+
const p = resolveLocalForValue(pattern, value)
|
|
882
|
+
const pats = resolvePatternList(p, String(value), localSlots, localCacheId, localSlotsVersion)
|
|
756
883
|
const chars = extractInputChars(String(value), pats, resolveLocalEntry(pattern)?.validate, localSlots, localCacheId, localSlotsVersion)
|
|
757
884
|
return pats.some(pt => chars.length >= inputCount(pt, localSlots, localCacheId, localSlotsVersion))
|
|
758
885
|
}
|
|
759
886
|
|
|
760
887
|
instance.hint = function (pattern) {
|
|
761
|
-
const p =
|
|
762
|
-
const
|
|
888
|
+
const p = resolveLocalForValue(pattern, '')
|
|
889
|
+
const pats = resolvePatternList(p, '', localSlots, localCacheId, localSlotsVersion)
|
|
890
|
+
const pat = pats[pats.length - 1]
|
|
763
891
|
return parse(pat, localSlots, localCacheId, localSlotsVersion).map(t => {
|
|
764
892
|
if (t.type === 'literal') return t.value
|
|
765
893
|
if (t.constraint) {
|
|
@@ -776,10 +904,7 @@ mask.create = function (presets = {}) {
|
|
|
776
904
|
}
|
|
777
905
|
|
|
778
906
|
instance.define = function (name, definition) {
|
|
779
|
-
|
|
780
|
-
if (definition.validate && typeof definition.validate !== 'function') {
|
|
781
|
-
throw new Error(`mask.define: "${name}" validate precisa ser uma função`)
|
|
782
|
-
}
|
|
907
|
+
assertDefinition(name, definition)
|
|
783
908
|
localRegistry.set(name, definition)
|
|
784
909
|
}
|
|
785
910
|
|
|
@@ -793,29 +918,29 @@ mask.create = function (presets = {}) {
|
|
|
793
918
|
|
|
794
919
|
instance.rawLength = function (pattern, value) {
|
|
795
920
|
if (value == null) return 0
|
|
796
|
-
const p =
|
|
797
|
-
const pats =
|
|
921
|
+
const p = resolveLocalForValue(pattern, value)
|
|
922
|
+
const pats = resolvePatternList(p, String(value), localSlots, localCacheId, localSlotsVersion)
|
|
798
923
|
const masked = instance(pattern, String(value))
|
|
799
924
|
return extractInputChars(masked, pats, resolveLocalEntry(pattern)?.validate, localSlots, localCacheId, localSlotsVersion).length
|
|
800
925
|
}
|
|
801
926
|
|
|
802
927
|
instance.patternLength = function (pattern) {
|
|
803
|
-
const p =
|
|
804
|
-
const pats =
|
|
928
|
+
const p = resolveLocalForLength(pattern)
|
|
929
|
+
const pats = flattenPatterns(p)
|
|
805
930
|
return Math.max(...pats.map(p => fullLength(p, localSlots, localCacheId, localSlotsVersion)))
|
|
806
931
|
}
|
|
807
932
|
|
|
808
933
|
instance.on = function (input, pattern, options = {}) {
|
|
809
|
-
const { onValue, onMasked } = options
|
|
934
|
+
const { onValue, onMaskara, onMasked } = options
|
|
810
935
|
|
|
811
|
-
function
|
|
812
|
-
const p =
|
|
813
|
-
return
|
|
936
|
+
function currentPatterns() {
|
|
937
|
+
const p = resolveLocalForValue(pattern, input.value)
|
|
938
|
+
return resolvePatternList(p, input.value, localSlots, localCacheId, localSlotsVersion)
|
|
814
939
|
}
|
|
815
940
|
|
|
816
941
|
function onKeydown(e) {
|
|
817
942
|
if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return
|
|
818
|
-
const pats =
|
|
943
|
+
const pats = currentPatterns()
|
|
819
944
|
const chars = extractInputChars(e.target.value, pats, resolveLocalEntry(pattern)?.validate, localSlots, localCacheId, localSlotsVersion)
|
|
820
945
|
const maxLimit = Math.max(...pats.map(p => inputCount(p, localSlots, localCacheId, localSlotsVersion)))
|
|
821
946
|
if (chars.length >= maxLimit) e.preventDefault()
|
|
@@ -832,6 +957,7 @@ mask.create = function (presets = {}) {
|
|
|
832
957
|
const pos = Math.max(0, cursor + diff)
|
|
833
958
|
el.setSelectionRange(pos, pos)
|
|
834
959
|
})
|
|
960
|
+
onMaskara?.(masked)
|
|
835
961
|
onMasked?.(masked)
|
|
836
962
|
onValue?.(instance.raw(pattern, masked))
|
|
837
963
|
}
|
|
@@ -872,3 +998,6 @@ mask.create = function (presets = {}) {
|
|
|
872
998
|
// export default mask
|
|
873
999
|
|
|
874
1000
|
module.exports = mask
|
|
1001
|
+
module.exports.mask = mask
|
|
1002
|
+
module.exports.maskara = mask
|
|
1003
|
+
module.exports.default = mask
|
package/mask.d.ts
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Tipagens com parâmetro de registry para autocomplete de nomes registrados.
|
|
5
5
|
*
|
|
6
6
|
* Uso básico (sem generics — funciona, sem autocomplete de nomes):
|
|
7
|
-
* import
|
|
8
|
-
*
|
|
7
|
+
* import maskara from './mask.js'
|
|
8
|
+
* maskara('cpf', value)
|
|
9
9
|
*
|
|
10
10
|
* Uso tipado (com autocomplete de nomes):
|
|
11
|
-
* const m =
|
|
11
|
+
* const m = maskara.create<{ cpf: string; date: Date | null; money: number }>({
|
|
12
12
|
* cpf: { pattern: '###[.]###[.]###[-]##' },
|
|
13
13
|
* date: { pattern: '##[/]##[/]####', transform: ... },
|
|
14
14
|
* money: { pattern: '########[,]##', transform: ... },
|
|
@@ -21,41 +21,79 @@
|
|
|
21
21
|
|
|
22
22
|
// ─── Primitivos ───────────────────────────────────────────────────────────
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
export
|
|
24
|
+
/** Regra condicional para escolher um pattern a partir do raw digitado */
|
|
25
|
+
export interface MaskPatternRule {
|
|
26
|
+
pattern: string | string[]
|
|
27
|
+
when?: (raw: string, value: string) => boolean
|
|
28
|
+
}
|
|
29
|
+
export type MaskaraPatternRule = MaskPatternRule
|
|
30
|
+
|
|
31
|
+
/** Mapa de patterns usado por máscaras nomeadas condicionais */
|
|
32
|
+
export type MaskPatternMap = Record<string, string | string[]>
|
|
33
|
+
export type MaskaraPatternMap = MaskPatternMap
|
|
34
|
+
|
|
35
|
+
/** Função que escolhe uma chave de patterns a partir do valor digitado */
|
|
36
|
+
export type MaskSelect<K extends string = string> = (raw: string, value: string) => K
|
|
37
|
+
export type MaskaraSelect<K extends string = string> = MaskSelect<K>
|
|
38
|
+
|
|
39
|
+
/** String de padrão declarativo, array dinâmico ou array de regras condicionais */
|
|
40
|
+
export type MaskPattern = string | string[] | MaskPatternRule[]
|
|
41
|
+
export type MaskaraPattern = MaskPattern
|
|
26
42
|
|
|
27
43
|
/** Função de transformação — recebe (raw, masked, complete) e retorna T */
|
|
28
44
|
export type MaskTransform<T> = (raw: string, masked: string, complete: boolean) => T
|
|
45
|
+
export type MaskaraTransform<T> = MaskTransform<T>
|
|
29
46
|
|
|
30
47
|
/** Validação incremental — retorna false para recusar o próximo caractere */
|
|
31
48
|
export type MaskValidate = (raw: string, masked: string, complete: boolean) => boolean
|
|
49
|
+
export type MaskaraValidate = MaskValidate
|
|
32
50
|
|
|
33
51
|
/** Predicado usado por um slot customizado */
|
|
34
52
|
export type MaskSlotTest = (ch: string) => boolean
|
|
53
|
+
export type MaskaraSlotTest = MaskSlotTest
|
|
35
54
|
|
|
36
55
|
/** Definição completa de um slot customizado */
|
|
37
56
|
export interface MaskSlotDefinition {
|
|
38
57
|
test: MaskSlotTest
|
|
39
58
|
hint?: string
|
|
40
59
|
}
|
|
60
|
+
export type MaskaraSlotDefinition = MaskSlotDefinition
|
|
41
61
|
|
|
42
62
|
/** Formas aceitas para registrar um slot customizado */
|
|
43
63
|
export type MaskSlotInput = MaskSlotTest | RegExp | MaskSlotDefinition
|
|
64
|
+
export type MaskaraSlotInput = MaskSlotInput
|
|
44
65
|
|
|
45
|
-
/** Definição de uma máscara nomeada */
|
|
46
|
-
export interface
|
|
66
|
+
/** Definição de uma máscara nomeada com pattern único ou array dinâmico */
|
|
67
|
+
export interface MaskPatternDefinition<T = string> {
|
|
47
68
|
pattern: MaskPattern
|
|
48
69
|
transform?: MaskTransform<T>
|
|
49
70
|
validate?: MaskValidate
|
|
50
71
|
}
|
|
72
|
+
export type MaskaraPatternDefinition<T = string> = MaskPatternDefinition<T>
|
|
73
|
+
|
|
74
|
+
/** Definição de uma máscara nomeada que seleciona um pattern por raw/value */
|
|
75
|
+
export interface MaskConditionalDefinition<T = string, K extends string = string> {
|
|
76
|
+
patterns: Record<K, MaskPattern>
|
|
77
|
+
select: MaskSelect<K>
|
|
78
|
+
transform?: MaskTransform<T>
|
|
79
|
+
validate?: MaskValidate
|
|
80
|
+
}
|
|
81
|
+
export type MaskaraConditionalDefinition<T = string, K extends string = string> = MaskConditionalDefinition<T, K>
|
|
82
|
+
|
|
83
|
+
/** Definição de uma máscara nomeada */
|
|
84
|
+
export type MaskDefinition<T = string> = MaskPatternDefinition<T> | MaskConditionalDefinition<T>
|
|
85
|
+
export type MaskaraDefinition<T = string> = MaskDefinition<T>
|
|
51
86
|
|
|
52
87
|
/** Opções de mask.on */
|
|
53
88
|
export interface MaskOnOptions<T> {
|
|
54
89
|
/** Chamado a cada keystroke com o valor limpo / resultado do transform */
|
|
55
90
|
onValue?: (value: T) => void
|
|
91
|
+
/** Chamado a cada keystroke com o valor mascarado (display). Nome preferido. */
|
|
92
|
+
onMaskara?: (masked: string) => void
|
|
56
93
|
/** Chamado a cada keystroke com o valor mascarado (display) */
|
|
57
94
|
onMasked?: (masked: string) => void
|
|
58
95
|
}
|
|
96
|
+
export type MaskaraOnOptions<T> = MaskOnOptions<T>
|
|
59
97
|
|
|
60
98
|
// ─── Registry map ─────────────────────────────────────────────────────────
|
|
61
99
|
//
|
|
@@ -195,6 +233,7 @@ export interface MaskInstance<R extends Record<string, unknown> = Record<string,
|
|
|
195
233
|
presets?: { [K in keyof S]: MaskDefinition<S[K]> }
|
|
196
234
|
): MaskInstance<S>
|
|
197
235
|
}
|
|
236
|
+
export type MaskaraInstance<R extends Record<string, unknown> = Record<string, string>> = MaskInstance<R>
|
|
198
237
|
|
|
199
238
|
// ─── Função principal (registry global, sem generics de nome) ─────────────
|
|
200
239
|
|
|
@@ -288,4 +327,7 @@ export declare namespace mask {
|
|
|
288
327
|
): MaskInstance<R>
|
|
289
328
|
}
|
|
290
329
|
|
|
330
|
+
/** Preferred alias for the main engine. `mask` remains available for compatibility. */
|
|
331
|
+
export declare const maskara: typeof mask
|
|
332
|
+
|
|
291
333
|
export default mask
|