0.5.1 • Published 11 months ago

ts-simple-mask v0.5.1

Weekly downloads
-
License
MIT
Repository
github
Last release
11 months ago

install size npm bundle size npm downloads npm

Why

Need for a solution that works on different stacks.

Features

  • Mask, unmask input texts, apply custom rules.
  • Money functions.

divider

Table of Contents

divider

Getting Started

Install

npm install ts-simple-mask

Quickstart

There are some ready-to-use standard rules:

  • '0' = any digit
  • 'A' = any alphanumeric
  • 'S' = any letter
  • 'X' = any letter and transform to uppercase
  • 'x' = any letter and transform to lowercase
  • 'Z' = any alphanumeric and transform to uppercase
  • 'z' = any alphanumeric and transform to lowercase
import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const { masked, unmasked } = TsMask.mask("01011987", "00/00/0000");

divider

TS Mask API

  • Mask text

mask(value: string, maskRule: string)

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const { masked, unmasked } = TsMask.mask("ABC-1A23", "SSS-0A00");
  • Unmask text

unmask(value: string)

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const unmasked = TsMask.unmask("ABC-1A23");
  • Mask money

maskMoney(value: string)

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const { masked, unmasked } = TsMask.maskMoney("123456");
  • Unmask money

unmaskMoney(value: string)

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const unmasked = TsMask.unmaskMoney("1.234,56");
  • Get default masks

getMask(value: string, type: MaskType)

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const value = "46963603006";
TsMask.mask(value, TsMask.getMask(value, MaskType.DOCUMENT_BR));
  • Get placeholder

getPlaceholder(maskRule: string)

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();
const placeholder = TsMask.getPlaceholder("SSS-0A00");
  • Interfaces
interface TsMaskOptions {
  rulesMask?: MaskRules;
  rulesMoney?: MaskMoneyRules;
}

interface MaskMoneyRules {
  thousands: string;
  decimal: string;
  precision: number;
  prefix?: string;
  allowNegative?: boolean;
  beforeMask?: (value: number) => number;
  afterMask?: (value: string) => string;
}

interface MaskRules {
  map: Map<string, MaskOptions>;
  beforeMask?: (value: string) => string;
  afterMask?: (value: string) => string;
}

interface MaskOptions {
  pattern: RegExp;
  transform?: (
    prevValue: string,
    newChar: string
  ) => { prevValue: string; newChar: string };
}

divider

Customize

  • Default Rules
const DEFAULT_MONEY_RULES = {
  thousands: ".",
  decimal: ",",
  precision: 2,
};

const DEFAULT_MASK_RULES = {
  map: new Map<string, MaskOptions>([
    ["0", { pattern: /\d/ }],
    ["A", { pattern: /[a-zA-Z0-9]/ }],
    ["S", { pattern: /[A-Za-z]/ }],
    [
      "X",
      {
        pattern: /[A-Za-z]/,
        transform: (prevValue, newChar) => ({
          prevValue,
          newChar: newChar.toLocaleUpperCase(),
        }),
      },
    ],
    [
      "x",
      {
        pattern: /[A-Za-z]/,
        transform: (prevValue, newChar) => ({
          prevValue,
          newChar: newChar.toLocaleLowerCase(),
        }),
      },
    ],
    [
      "Z",
      {
        pattern: /[a-zA-Z0-9]/,
        transform: (prevValue, newChar) => ({
          prevValue,
          newChar: newChar.toLocaleUpperCase(),
        }),
      },
    ],
    [
      "z",
      {
        pattern: /[a-zA-Z0-9]/,
        transform: (prevValue, newChar) => ({
          prevValue,
          newChar: newChar.toLocaleLowerCase(),
        }),
      },
    ],
  ]),
};
  • Custom Rules
import createTsMask, { MaskOptions } from "ts-simple-mask";

const rulesMoney = {
  thousands: " ",
  decimal: ".",
  precision: 3,
  prefix: "R$",
};

const rulesMask = {
  map: new Map<string, MaskOptions>([
    [
      "#",
      {
        pattern: /[A-Za-z]/,
        transform: (prevValue, newChar) => ({
          prevValue,
          newChar: newChar.toLocaleUpperCase(),
        }),
      },
    ],
    ["9", { pattern: /\d/ }],
  ]),
};

const TsMask = createTsMask({
  rulesMask,
  rulesMoney,
});

const { masked, unmasked } = TsMask.mask("abcd", "####");
//transform uppercase
//return ABCD

const { masked, unmasked } = TsMask.maskMoney("123456789");
//return R$123 456.89

TsMask.setRuleMask(rulesMask);
TsMask.setRuleMoney(rulesMoney);
//change the mask rules
  • Before Mask, After Mask
import createTsMask, { MaskOptions } from "ts-simple-mask";

const TsMask = createTsMask({
  rulesMask: {
    map: new Map<string, MaskOptions>([["#", { pattern: /[A-Za-z]/ }]]),
    beforeMask: (value) => (value === "hello" ? "helloworld" : value),
    afterMask: (value) => (value.length > 10 ? value.slice(0, -1) : value),
  },
  rulesMoney: {
    thousands: ".",
    decimal: ",",
    precision: 2,
    beforeMask: (value) => (value === 1000 ? 1001 : value),
    afterMask: (value) => "$" + value,
  },
});

const { masked } = TsMask.mask("hello", "###########");
//return helloworld

const { masked } = TsMask.maskMoney("1000");
//return $1001

divider

Examples

Practical use examples

Vanilla JS

import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();

const value = "31072024";
const { masked } = TsMask.mask(value, "00/00/0000");
document.querySelector(".masked").innerHTML = masked;

React

import React from "react";
import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();

export const TextForm = () => {
  const [value, setValue] = React.useState("");

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { masked } = TsMask.maskMoney(e.target.value);
    setValue(masked);
  };

  return <input type="text" value={value} onChange={handleChange} />;
};

React Native

import React from "react";
import { TextInput } from "react-native";
import createTsMask, { MaskType } from "ts-simple-mask";

const TsMask = createTsMask();

export const TextForm = () => {
  const [value, setValue] = React.useState("");

  const handleChange = (text: string) => {
    const { masked } = TsMask.mask(
      text,
      TsMask.getMask(text, MaskType.DOCUMENT_BR)
    );
    setValue(masked);
  };

  return <TextInput onChangeText={handleChange} value={value} />;
};

Vue

<script setup>
import createTsMask from "ts-simple-mask";

const TsMask = createTsMask();

const onInput = (event) => {
  const { masked } = TsMask.mask(event.target.value.toUpperCase(), "SSS-0A00");
  event.target.value = masked;
};
</script>

<template>
  <input @input="onInput" />
</template>

Nodejs

import createTsMask, { maskType } from "ts-simple-mask";

const TsMask = createTsMask();

router.get("/", async () => {
  const value = "123456789";
  const { masked } = TsMask.mask(
    value,
    TsMask.getMask(value, MaskType.ZIPCODE_BR)
  );
  return masked;
});

divider

License

MIT

0.5.1

11 months ago

0.5.0

12 months ago

0.4.0

12 months ago

0.3.2

12 months ago

0.3.1

12 months ago

0.3.0

12 months ago

0.2.0

12 months ago

0.1.4

12 months ago

0.1.3

12 months ago

0.1.2

12 months ago

0.1.1

12 months ago

0.1.0

12 months ago

0.0.23

12 months ago

0.0.22

12 months ago

0.0.21

12 months ago

0.0.20

12 months ago

0.0.19

12 months ago

0.0.17

12 months ago

0.0.16

12 months ago

0.0.15

12 months ago

0.0.13

12 months ago

0.0.11

12 months ago

0.0.10

12 months ago

0.0.9

12 months ago

0.0.8

12 months ago

0.0.7

12 months ago

0.0.6

12 months ago

0.0.5

12 months ago

0.0.4

12 months ago

0.0.3

12 months ago

0.0.2

12 months ago

0.0.1

12 months ago

0.0.0

12 months ago