@arkyn/shared 1.3.73 → 1.3.75

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.
Files changed (46) hide show
  1. package/dist/formats/formatToBRL.d.ts +3 -0
  2. package/dist/formats/formatToBRL.d.ts.map +1 -0
  3. package/dist/formats/formatToBRL.js +8 -0
  4. package/dist/formats/formatToHiddenDigits.d.ts +4 -0
  5. package/dist/formats/formatToHiddenDigits.d.ts.map +1 -0
  6. package/dist/formats/formatToHiddenDigits.js +14 -0
  7. package/dist/generators/generateColorByString.d.ts +3 -0
  8. package/dist/generators/generateColorByString.d.ts.map +1 -0
  9. package/dist/generators/generateColorByString.js +14 -0
  10. package/dist/generators/generateId.d.ts +6 -0
  11. package/dist/generators/generateId.d.ts.map +1 -0
  12. package/dist/generators/generateId.js +23 -0
  13. package/dist/generators/generateSlug.d.ts +3 -0
  14. package/dist/generators/generateSlug.d.ts.map +1 -0
  15. package/dist/generators/generateSlug.js +11 -0
  16. package/dist/index.d.ts +10 -6
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +15 -6
  19. package/dist/parsers/parseToCharacters.d.ts +17 -0
  20. package/dist/parsers/parseToCharacters.d.ts.map +1 -0
  21. package/dist/parsers/parseToCharacters.js +13 -0
  22. package/dist/services/calculateCardInstallment.d.ts +7 -0
  23. package/dist/services/calculateCardInstallment.d.ts.map +1 -0
  24. package/dist/services/calculateCardInstallment.js +14 -0
  25. package/dist/services/range.d.ts +4 -0
  26. package/dist/services/range.d.ts.map +1 -0
  27. package/dist/services/range.js +9 -0
  28. package/dist/validations/regex.d.ts +15 -0
  29. package/dist/validations/regex.d.ts.map +1 -0
  30. package/dist/validations/regex.js +25 -0
  31. package/dist/validations/validateCPF.d.ts +3 -0
  32. package/dist/validations/validateCPF.d.ts.map +1 -0
  33. package/dist/validations/validateCPF.js +36 -0
  34. package/package.json +1 -1
  35. package/src/formats/formatToBRL.ts +10 -0
  36. package/src/formats/formatToHiddenDigits.ts +21 -0
  37. package/src/{uuid.ts → generators/generateId.ts} +7 -7
  38. package/src/index.ts +19 -6
  39. package/src/parsers/parseToCharacters.ts +34 -0
  40. package/src/services/range.ts +15 -0
  41. package/src/{regex.ts → validations/regex.ts} +4 -2
  42. package/src/validations/validateCPF.ts +38 -0
  43. package/src/currencyFormat.ts +0 -10
  44. /package/src/{generateColorByString.ts → generators/generateColorByString.ts} +0 -0
  45. /package/src/{generateSlug.ts → generators/generateSlug.ts} +0 -0
  46. /package/src/{calculateCardInstallment.ts → services/calculateCardInstallment.ts} +0 -0
@@ -0,0 +1,3 @@
1
+ declare function formatToBRL(value: number, showPrefix?: boolean): string;
2
+ export { formatToBRL };
3
+ //# sourceMappingURL=formatToBRL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatToBRL.d.ts","sourceRoot":"","sources":["../../src/formats/formatToBRL.ts"],"names":[],"mappings":"AAAA,iBAAS,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,UAAO,UAOpD;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ function formatToBRL(value, showPrefix = true) {
2
+ const format = new Intl.NumberFormat("pt-BR", {
3
+ style: "currency",
4
+ currency: "BRL",
5
+ }).format(value);
6
+ return showPrefix ? format : format.replace("R$", "").trim();
7
+ }
8
+ export { formatToBRL };
@@ -0,0 +1,4 @@
1
+ import type { FormatToHiddenDigitsOptions } from "@arkyn/types";
2
+ declare const formatToHiddenDigits: (value: string, options?: FormatToHiddenDigitsOptions) => string;
3
+ export { formatToHiddenDigits };
4
+ //# sourceMappingURL=formatToHiddenDigits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatToHiddenDigits.d.ts","sourceRoot":"","sources":["../../src/formats/formatToHiddenDigits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAKhE,QAAA,MAAM,oBAAoB,UACjB,MAAM,YACJ,2BAA2B,KACnC,MAUF,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { parseToCharacters } from "../parsers/parseToCharacters";
2
+ import { normalizeRange, within } from "../services/range";
3
+ const formatToHiddenDigits = (value, options = {}) => {
4
+ const characters = parseToCharacters(value);
5
+ const range = normalizeRange(options.range ?? 3, characters.digits);
6
+ return characters.children
7
+ .map((node) => {
8
+ if (node.kind === "digit" && within(range, node.digit))
9
+ return options.hider ?? "*";
10
+ return node.character;
11
+ })
12
+ .join("");
13
+ };
14
+ export { formatToHiddenDigits };
@@ -0,0 +1,3 @@
1
+ declare function generateColorByString(string: string): string;
2
+ export { generateColorByString };
3
+ //# sourceMappingURL=generateColorByString.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateColorByString.d.ts","sourceRoot":"","sources":["../../src/generators/generateColorByString.ts"],"names":[],"mappings":"AAAA,iBAAS,qBAAqB,CAAC,MAAM,EAAE,MAAM,UAgB5C;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ function generateColorByString(string) {
2
+ var hash = 0;
3
+ for (var i = 0; i < string.length; i++) {
4
+ hash = string.charCodeAt(i) + ((hash << 5) - hash);
5
+ }
6
+ var red = (hash & 0xff0000) >> 16;
7
+ var green = (hash & 0x00ff00) >> 8;
8
+ var blue = hash & 0x0000ff;
9
+ var redHex = red.toString(16).padStart(2, "0");
10
+ var greenHex = green.toString(16).padStart(2, "0");
11
+ var blueHex = blue.toString(16).padStart(2, "0");
12
+ return "#" + redHex + greenHex + blueHex;
13
+ }
14
+ export { generateColorByString };
@@ -0,0 +1,6 @@
1
+ declare function generateId(type: "text" | "binary"): {
2
+ v4: string | Uint8Array;
3
+ v7: string | Uint8Array;
4
+ };
5
+ export { generateId };
6
+ //# sourceMappingURL=generateId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateId.d.ts","sourceRoot":"","sources":["../../src/generators/generateId.ts"],"names":[],"mappings":"AAsBA,iBAAS,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;;;EAK1C;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { v4, v7 } from "uuid";
2
+ function hexToBin(hex) {
3
+ const buffer = new Uint8Array(hex.length / 2);
4
+ for (let i = 0; i < hex.length; i += 2) {
5
+ buffer[i / 2] = parseInt(hex.substring(i, i + 2), 16);
6
+ }
7
+ return buffer;
8
+ }
9
+ function uuidV4() {
10
+ const uuid = v4();
11
+ return { text: uuid, binary: hexToBin(uuid) };
12
+ }
13
+ function uuidV7() {
14
+ const uuid = v7();
15
+ return { text: uuid, binary: hexToBin(uuid) };
16
+ }
17
+ function generateId(type) {
18
+ return {
19
+ v4: uuidV4()[type],
20
+ v7: uuidV7()[type],
21
+ };
22
+ }
23
+ export { generateId };
@@ -0,0 +1,3 @@
1
+ declare function generateSlug(string: string): string;
2
+ export { generateSlug };
3
+ //# sourceMappingURL=generateSlug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateSlug.d.ts","sourceRoot":"","sources":["../../src/generators/generateSlug.ts"],"names":[],"mappings":"AAAA,iBAAS,YAAY,CAAC,MAAM,EAAE,MAAM,UAanC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ function generateSlug(string) {
2
+ let slug = string.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
3
+ slug = slug
4
+ .replace(/[^\w\s-]/g, "")
5
+ .replace(/\s+/g, "-")
6
+ .toLowerCase();
7
+ slug = slug.replace(/-{2,}/g, "-");
8
+ slug = slug.replace(/^-+|-+$/g, "");
9
+ return slug;
10
+ }
11
+ export { generateSlug };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- export { calculateCardInstallment } from "./calculateCardInstallment";
2
- export { currencyFormat } from "./currencyFormat";
3
- export { generateColorByString } from "./generateColorByString";
4
- export { generateSlug } from "./generateSlug";
5
- export { regex } from "./regex";
6
- export { uuidV4, uuidV7 } from "./uuid";
1
+ export { formatToBRL } from "./formats/formatToBRL";
2
+ export { formatToHiddenDigits } from "./formats/formatToHiddenDigits";
3
+ export { generateColorByString } from "./generators/generateColorByString";
4
+ export { generateId } from "./generators/generateId";
5
+ export { generateSlug } from "./generators/generateSlug";
6
+ export { parseToCharacters } from "./parsers/parseToCharacters";
7
+ export { calculateCardInstallment } from "./services/calculateCardInstallment";
8
+ export { normalizeRange, within } from "./services/range";
9
+ export { regex } from "./validations/regex";
10
+ export { validateCPF } from "./validations/validateCPF";
7
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAGtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,15 @@
1
- export { calculateCardInstallment } from "./calculateCardInstallment";
2
- export { currencyFormat } from "./currencyFormat";
3
- export { generateColorByString } from "./generateColorByString";
4
- export { generateSlug } from "./generateSlug";
5
- export { regex } from "./regex";
6
- export { uuidV4, uuidV7 } from "./uuid";
1
+ // Formats
2
+ export { formatToBRL } from "./formats/formatToBRL";
3
+ export { formatToHiddenDigits } from "./formats/formatToHiddenDigits";
4
+ // Generators
5
+ export { generateColorByString } from "./generators/generateColorByString";
6
+ export { generateId } from "./generators/generateId";
7
+ export { generateSlug } from "./generators/generateSlug";
8
+ // Parsers
9
+ export { parseToCharacters } from "./parsers/parseToCharacters";
10
+ // Services
11
+ export { calculateCardInstallment } from "./services/calculateCardInstallment";
12
+ export { normalizeRange, within } from "./services/range";
13
+ // Validations
14
+ export { regex } from "./validations/regex";
15
+ export { validateCPF } from "./validations/validateCPF";
@@ -0,0 +1,17 @@
1
+ type DigitCharacterNode = {
2
+ kind: "digit";
3
+ digit: number;
4
+ character: string;
5
+ };
6
+ type OtherCharacterNode = {
7
+ kind: "other";
8
+ character: string;
9
+ };
10
+ type RootCharacterNode = {
11
+ kind: "root";
12
+ digits: number;
13
+ children: (DigitCharacterNode | OtherCharacterNode)[];
14
+ };
15
+ declare const parseToCharacters: (value: string) => RootCharacterNode;
16
+ export { parseToCharacters };
17
+ //# sourceMappingURL=parseToCharacters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseToCharacters.d.ts","sourceRoot":"","sources":["../../src/parsers/parseToCharacters.ts"],"names":[],"mappings":"AAEA,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,kBAAkB,GAAG,kBAAkB,CAAC,EAAE,CAAC;CACvD,CAAC;AAEF,QAAA,MAAM,iBAAiB,UAAW,MAAM,KAAG,iBAY1C,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ const DIGIT = /^\d$/;
2
+ const parseToCharacters = (value) => {
3
+ let digits = 0;
4
+ const children = value
5
+ .split("")
6
+ .map((character) => {
7
+ if (DIGIT.test(character))
8
+ return { character, kind: "digit", digit: ++digits };
9
+ return { character, kind: "other" };
10
+ });
11
+ return { digits, children, kind: "root" };
12
+ };
13
+ export { parseToCharacters };
@@ -0,0 +1,7 @@
1
+ import type { CalculateCardInstallmentProps } from "@arkyn/types";
2
+ declare function calculateCardInstallment(args: CalculateCardInstallmentProps): {
3
+ total_price: number;
4
+ installment_price: number;
5
+ };
6
+ export { calculateCardInstallment };
7
+ //# sourceMappingURL=calculateCardInstallment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculateCardInstallment.d.ts","sourceRoot":"","sources":["../../src/services/calculateCardInstallment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAElE,iBAAS,wBAAwB,CAAC,IAAI,EAAE,6BAA6B;;;EAgBpE;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ function calculateCardInstallment(args) {
2
+ const { cash_price, number_installments, fees = 0.0349 } = args;
3
+ let installment_price = 0;
4
+ let total_price = 0;
5
+ let numerator = Math.pow(1 + fees, number_installments) * fees;
6
+ let denominator = Math.pow(1 + fees, number_installments) - 1;
7
+ installment_price = cash_price * (numerator / denominator);
8
+ total_price = number_installments * installment_price;
9
+ return {
10
+ total_price: +total_price.toFixed(2),
11
+ installment_price: +installment_price.toFixed(2),
12
+ };
13
+ }
14
+ export { calculateCardInstallment };
@@ -0,0 +1,4 @@
1
+ declare const normalizeRange: (range: number | [number, number], limit: number) => [number, number];
2
+ declare const within: (range: [number, number], value: number) => boolean;
3
+ export { normalizeRange, within };
4
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/services/range.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,UACX,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,SACzB,MAAM,KACZ,CAAC,MAAM,EAAE,MAAM,CAMjB,CAAC;AAEF,QAAA,MAAM,MAAM,UAAW,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,MAAM,KAAG,OACjB,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ const normalizeRange = (range, limit) => {
2
+ if (Array.isArray(range))
3
+ return range;
4
+ if (range >= 0)
5
+ return [0, range];
6
+ return [limit + 1 - Math.abs(range), limit];
7
+ };
8
+ const within = (range, value) => value >= range[0] && value <= range[1];
9
+ export { normalizeRange, within };
@@ -0,0 +1,15 @@
1
+ declare const regex: {
2
+ URL: RegExp;
3
+ HOUR: RegExp;
4
+ RG: RegExp;
5
+ PHONE: RegExp;
6
+ PASSWORD: RegExp;
7
+ DATEHOUR: RegExp;
8
+ CPF: RegExp;
9
+ CNPJ: RegExp;
10
+ CEP: RegExp;
11
+ CPFCNPJ: RegExp;
12
+ DATE: RegExp;
13
+ };
14
+ export { regex };
15
+ //# sourceMappingURL=regex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../src/validations/regex.ts"],"names":[],"mappings":"AA0BA,QAAA,MAAM,KAAK;;;;;;;;;;;;CAYV,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ const CEP = /^(\d{8}|\d{2}\.?\d{3}\-\d{3})$/;
2
+ const CNPJ = /(^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$)/;
3
+ const CPF = /(^\d{3}\.\d{3}\.\d{3}\-\d{2}$)/;
4
+ const DATE = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/\d{4}$/;
5
+ const DATEHOUR = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/\d{4}\s(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])$/;
6
+ const HOUR = /^(0[0-9]|1[0-9]|2[0-3]):([0-5][0-9])$/;
7
+ const PASSWORD = /(?=^.{8,}$)((?=.*\w)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[|!"$%&\/\(\)\?\^\'\\\+\-\*]))^.*/;
8
+ const PHONE = /([0-9]{2})?(\s|-)?(9?[0-9]{4})-?([0-9]{4}$)/;
9
+ const RG = /(^\d{1,2}).?(\d{3}).?(\d{3})-?(\d{1}|X|x$)/;
10
+ const URL = /^(((https?|ftp):\/\/)?([\w\-\.])+(\.)([\w]){2,4}([\w\/+=%&_\.~?\-]*))*$/;
11
+ const CPFCNPJ = /^(?:(\d{3}\.\d{3}\.\d{3}-\d{2})|(\d{11})|(\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2})|(\d{14}))$/;
12
+ const regex = {
13
+ URL,
14
+ HOUR,
15
+ RG,
16
+ PHONE,
17
+ PASSWORD,
18
+ DATEHOUR,
19
+ CPF,
20
+ CNPJ,
21
+ CEP,
22
+ CPFCNPJ,
23
+ DATE,
24
+ };
25
+ export { regex };
@@ -0,0 +1,3 @@
1
+ declare function validateCPF(rawCpf: string): boolean;
2
+ export { validateCPF };
3
+ //# sourceMappingURL=validateCPF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCPF.d.ts","sourceRoot":"","sources":["../../src/validations/validateCPF.ts"],"names":[],"mappings":"AA2BA,iBAAS,WAAW,CAAC,MAAM,EAAE,MAAM,WAQlC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ function removeNonDigits(cpf) {
2
+ return cpf.replace(/\D/g, "");
3
+ }
4
+ function isInvalidLength(cpf) {
5
+ const CPF_LENGTH = 11;
6
+ return cpf.length !== CPF_LENGTH;
7
+ }
8
+ function hasAllDigitsEqual(cpf) {
9
+ const [firstCpfDigit] = cpf;
10
+ return [...cpf].every((digit) => digit === firstCpfDigit);
11
+ }
12
+ function calculateDigit(cpf, factor) {
13
+ let total = 0;
14
+ for (const digit of cpf) {
15
+ if (factor > 1)
16
+ total += parseInt(digit) * factor--;
17
+ }
18
+ const rest = total % 11;
19
+ return rest < 2 ? 0 : 11 - rest;
20
+ }
21
+ function extractDigit(cpf) {
22
+ return cpf.slice(9);
23
+ }
24
+ function validateCPF(rawCpf) {
25
+ if (!rawCpf)
26
+ return false;
27
+ const cpf = removeNonDigits(rawCpf);
28
+ if (isInvalidLength(cpf))
29
+ return false;
30
+ if (hasAllDigitsEqual(cpf))
31
+ return false;
32
+ const digit1 = calculateDigit(cpf, 10);
33
+ const digit2 = calculateDigit(cpf, 11);
34
+ return extractDigit(cpf) === `${digit1}${digit2}`;
35
+ }
36
+ export { validateCPF };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkyn/shared",
3
- "version": "1.3.73",
3
+ "version": "1.3.75",
4
4
  "main": "./dist/bundle.js",
5
5
  "module": "./src/index.ts",
6
6
  "type": "module",
@@ -0,0 +1,10 @@
1
+ function formatToBRL(value: number, showPrefix = true) {
2
+ const format = new Intl.NumberFormat("pt-BR", {
3
+ style: "currency",
4
+ currency: "BRL",
5
+ }).format(value);
6
+
7
+ return showPrefix ? format : format.replace("R$", "").trim();
8
+ }
9
+
10
+ export { formatToBRL };
@@ -0,0 +1,21 @@
1
+ import type { FormatToHiddenDigitsOptions } from "@arkyn/types";
2
+
3
+ import { parseToCharacters } from "../parsers/parseToCharacters";
4
+ import { normalizeRange, within } from "../services/range";
5
+
6
+ const formatToHiddenDigits = (
7
+ value: string,
8
+ options: FormatToHiddenDigitsOptions = {}
9
+ ): string => {
10
+ const characters = parseToCharacters(value);
11
+ const range = normalizeRange(options.range ?? 3, characters.digits);
12
+ return characters.children
13
+ .map((node) => {
14
+ if (node.kind === "digit" && within(range, node.digit))
15
+ return options.hider ?? "*";
16
+ return node.character;
17
+ })
18
+ .join("");
19
+ };
20
+
21
+ export { formatToHiddenDigits };
@@ -12,19 +12,19 @@ function hexToBin(hex: string) {
12
12
 
13
13
  function uuidV4() {
14
14
  const uuid = v4();
15
- return {
16
- text: uuid,
17
- binary: hexToBin(uuid),
18
- };
15
+ return { text: uuid, binary: hexToBin(uuid) };
19
16
  }
20
17
 
21
18
  function uuidV7() {
22
19
  const uuid = v7();
20
+ return { text: uuid, binary: hexToBin(uuid) };
21
+ }
23
22
 
23
+ function generateId(type: "text" | "binary") {
24
24
  return {
25
- text: uuid,
26
- binary: hexToBin(uuid),
25
+ v4: uuidV4()[type],
26
+ v7: uuidV7()[type],
27
27
  };
28
28
  }
29
29
 
30
- export { uuidV4, uuidV7 };
30
+ export { generateId };
package/src/index.ts CHANGED
@@ -1,6 +1,19 @@
1
- export { calculateCardInstallment } from "./calculateCardInstallment";
2
- export { currencyFormat } from "./currencyFormat";
3
- export { generateColorByString } from "./generateColorByString";
4
- export { generateSlug } from "./generateSlug";
5
- export { regex } from "./regex";
6
- export { uuidV4, uuidV7 } from "./uuid";
1
+ // Formats
2
+ export { formatToBRL } from "./formats/formatToBRL";
3
+ export { formatToHiddenDigits } from "./formats/formatToHiddenDigits";
4
+
5
+ // Generators
6
+ export { generateColorByString } from "./generators/generateColorByString";
7
+ export { generateId } from "./generators/generateId";
8
+ export { generateSlug } from "./generators/generateSlug";
9
+
10
+ // Parsers
11
+ export { parseToCharacters } from "./parsers/parseToCharacters";
12
+
13
+ // Services
14
+ export { calculateCardInstallment } from "./services/calculateCardInstallment";
15
+ export { normalizeRange, within } from "./services/range";
16
+
17
+ // Validations
18
+ export { regex } from "./validations/regex";
19
+ export { validateCPF } from "./validations/validateCPF";
@@ -0,0 +1,34 @@
1
+ const DIGIT = /^\d$/;
2
+
3
+ type DigitCharacterNode = {
4
+ kind: "digit";
5
+ digit: number;
6
+ character: string;
7
+ };
8
+
9
+ type OtherCharacterNode = {
10
+ kind: "other";
11
+ character: string;
12
+ };
13
+
14
+ type RootCharacterNode = {
15
+ kind: "root";
16
+ digits: number;
17
+ children: (DigitCharacterNode | OtherCharacterNode)[];
18
+ };
19
+
20
+ const parseToCharacters = (value: string): RootCharacterNode => {
21
+ let digits = 0;
22
+
23
+ const children = value
24
+ .split("")
25
+ .map((character: string): DigitCharacterNode | OtherCharacterNode => {
26
+ if (DIGIT.test(character))
27
+ return { character, kind: "digit", digit: ++digits };
28
+ return { character, kind: "other" };
29
+ });
30
+
31
+ return { digits, children, kind: "root" };
32
+ };
33
+
34
+ export { parseToCharacters };
@@ -0,0 +1,15 @@
1
+ const normalizeRange = (
2
+ range: number | [number, number],
3
+ limit: number
4
+ ): [number, number] => {
5
+ if (Array.isArray(range)) return range;
6
+
7
+ if (range >= 0) return [0, range];
8
+
9
+ return [limit + 1 - Math.abs(range), limit];
10
+ };
11
+
12
+ const within = (range: [number, number], value: number): boolean =>
13
+ value >= range[0] && value <= range[1];
14
+
15
+ export { normalizeRange, within };
@@ -1,4 +1,4 @@
1
- const CEP = /(^[0-9]{5})-?([0-9]{3}$)/;
1
+ const CEP = /^(\d{8}|\d{2}\.?\d{3}\-\d{3})$/;
2
2
 
3
3
  const CNPJ = /(^\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{2}$)/;
4
4
 
@@ -24,7 +24,7 @@ const URL =
24
24
  const CPFCNPJ =
25
25
  /^(?:(\d{3}\.\d{3}\.\d{3}-\d{2})|(\d{11})|(\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2})|(\d{14}))$/;
26
26
 
27
- export const regex = {
27
+ const regex = {
28
28
  URL,
29
29
  HOUR,
30
30
  RG,
@@ -37,3 +37,5 @@ export const regex = {
37
37
  CPFCNPJ,
38
38
  DATE,
39
39
  };
40
+
41
+ export { regex };
@@ -0,0 +1,38 @@
1
+ function removeNonDigits(cpf: string) {
2
+ return cpf.replace(/\D/g, "");
3
+ }
4
+
5
+ function isInvalidLength(cpf: string) {
6
+ const CPF_LENGTH = 11;
7
+ return cpf.length !== CPF_LENGTH;
8
+ }
9
+
10
+ function hasAllDigitsEqual(cpf: string) {
11
+ const [firstCpfDigit] = cpf;
12
+ return [...cpf].every((digit) => digit === firstCpfDigit);
13
+ }
14
+
15
+ function calculateDigit(cpf: string, factor: number) {
16
+ let total = 0;
17
+ for (const digit of cpf) {
18
+ if (factor > 1) total += parseInt(digit) * factor--;
19
+ }
20
+ const rest = total % 11;
21
+ return rest < 2 ? 0 : 11 - rest;
22
+ }
23
+
24
+ function extractDigit(cpf: string) {
25
+ return cpf.slice(9);
26
+ }
27
+
28
+ function validateCPF(rawCpf: string) {
29
+ if (!rawCpf) return false;
30
+ const cpf = removeNonDigits(rawCpf);
31
+ if (isInvalidLength(cpf)) return false;
32
+ if (hasAllDigitsEqual(cpf)) return false;
33
+ const digit1 = calculateDigit(cpf, 10);
34
+ const digit2 = calculateDigit(cpf, 11);
35
+ return extractDigit(cpf) === `${digit1}${digit2}`;
36
+ }
37
+
38
+ export { validateCPF };
@@ -1,10 +0,0 @@
1
- function currencyFormat(value: number) {
2
- const format = new Intl.NumberFormat("pt-BR", {
3
- style: "currency",
4
- currency: "BRL",
5
- }).format(value);
6
-
7
- return { value: format, valueWithoutPrefix: format.replace("R$", "").trim() };
8
- }
9
-
10
- export { currencyFormat };