rut-kit 0.2.0 → 0.3.0
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 +93 -0
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -11
- package/dist/index.d.ts +1 -11
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/zod.cjs +1 -1
- package/dist/zod.cjs.map +1 -1
- package/dist/zod.js +1 -1
- package/dist/zod.js.map +1 -1
- package/package.json +19 -14
package/README.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# rut-kit 🇨🇱
|
|
2
|
+
|
|
3
|
+
Validación de RUT chileno con errores descriptivos para JavaScript y TypeScript. Rápido, liviano, con soporte para Zod.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { validateRut } from 'rut-kit'
|
|
7
|
+
|
|
8
|
+
validateRut('18.972.631-7')
|
|
9
|
+
// { valid: true, rut: '189726317' }
|
|
10
|
+
|
|
11
|
+
validateRut('18.972.631-0')
|
|
12
|
+
// { valid: false, error: 'invalidCheckDigit' }
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Instalación
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install rut-kit
|
|
19
|
+
# o
|
|
20
|
+
pnpm add rut-kit
|
|
21
|
+
# o
|
|
22
|
+
bun add rut-kit
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Con Zod:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install rut-kit zod
|
|
29
|
+
# o
|
|
30
|
+
pnpm add rut-kit zod
|
|
31
|
+
# o
|
|
32
|
+
bun add rut-kit zod
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Características
|
|
36
|
+
|
|
37
|
+
- **Errores Descriptivos** 🎯 - Indica qué está mal: caracteres inválidos, formato incorrecto o dígito verificador erróneo.
|
|
38
|
+
- **Ultraliviano** ⚡ - 960 bytes gzipped. Sin dependencias. Solo lo esencial.
|
|
39
|
+
- **Multi-runtime** 🌍 - Funciona en Node.js, Bun, Edge y el navegador.
|
|
40
|
+
- **TypeScript Nativo** 🔷 - Escrito en TypeScript. Tipos incluidos. Autocompletado completo.
|
|
41
|
+
- **Integración Zod** 🛡️ - Schema listo para formularios y APIs. Valida, transforma y formatea en un paso.
|
|
42
|
+
|
|
43
|
+
## Uso
|
|
44
|
+
|
|
45
|
+
### Validación Simple
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { isValidRut } from 'rut-kit'
|
|
49
|
+
|
|
50
|
+
isValidRut('18.972.631-7') // true
|
|
51
|
+
isValidRut('18.972.631-0') // false
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Validación con Detalles
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import { validateRut } from 'rut-kit'
|
|
58
|
+
|
|
59
|
+
const result = validateRut('18.972.631-0')
|
|
60
|
+
// { valid: false, error: 'invalidCheckDigit' }
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Errores posibles: `invalidChars` | `invalidFormat` | `invalidCheckDigit`
|
|
64
|
+
|
|
65
|
+
### Formateo
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { formatRut } from 'rut-kit'
|
|
69
|
+
|
|
70
|
+
formatRut('189726317') // '18972631-7'
|
|
71
|
+
formatRut('189726317', 'formatted') // '18.972.631-7'
|
|
72
|
+
formatRut('189726317', 'clean') // '189726317'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Con Zod
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { rutSchema, createRutSchema } from 'rut-kit/zod'
|
|
79
|
+
|
|
80
|
+
// Schema por defecto
|
|
81
|
+
rutSchema.parse('18.972.631-7')
|
|
82
|
+
// '18972631-7'
|
|
83
|
+
|
|
84
|
+
// Schema personalizado
|
|
85
|
+
const schema = createRutSchema({
|
|
86
|
+
messages: { required: 'Ingresa tu RUT' },
|
|
87
|
+
outputFormat: 'formatted'
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Documentación
|
|
92
|
+
|
|
93
|
+
Visita la [documentación completa](https://javiev.github.io/rut-kit/) para guías detalladas e integraciones con React, Next.js, Express y más.
|
package/dist/core.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){
|
|
1
|
+
'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}exports.cleanRut=u;exports.formatRut=y;exports.getErrorMessage=M;exports.getRutCheckDigit=l;exports.isValidRut=E;exports.validateRut=v;//# sourceMappingURL=core.cjs.map
|
|
2
2
|
//# sourceMappingURL=core.cjs.map
|
package/dist/core.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
|
package/dist/core.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Removes all formatting characters from a RUT (dots, dashes, spaces).
|
|
4
|
+
* Removes all formatting characters from a RUT (dots, dashes, spaces, commas).
|
|
5
5
|
* @param rut - The RUT string to clean
|
|
6
6
|
* @returns The cleaned RUT string (only digits and K)
|
|
7
7
|
*/
|
package/dist/core.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Removes all formatting characters from a RUT (dots, dashes, spaces).
|
|
4
|
+
* Removes all formatting characters from a RUT (dots, dashes, spaces, commas).
|
|
5
5
|
* @param rut - The RUT string to clean
|
|
6
6
|
* @returns The cleaned RUT string (only digits and K)
|
|
7
7
|
*/
|
package/dist/core.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){
|
|
1
|
+
var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}export{u as cleanRut,y as formatRut,M as getErrorMessage,l as getRutCheckDigit,E as isValidRut,v as validateRut};//# sourceMappingURL=core.js.map
|
|
2
2
|
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var u={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=s(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let a=0;a<o.length;a++)i+=parseInt(o[a],10)*r[a%6];let n=11-i%11;return n===11?"0":n===10?"K":n.toString()}function d(e){let t=s(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function R(e){let t=s(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function g(e,t){return {...c,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}exports.cleanRut=s;exports.formatRut=p;exports.getErrorMessage=g;exports.getRutCheckDigit=l;exports.isValidRut=d;exports.validateRut=R;//# sourceMappingURL=index.cjs.map
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format","createRutSchema","options","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
1
|
export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.cjs';
|
|
2
|
-
|
|
3
|
-
export { a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
|
|
4
|
-
export { RutMessages, createRutSchema, rutSchema } from './zod.cjs';
|
|
5
|
-
import 'zod';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Default error messages in Spanish.
|
|
9
|
-
*/
|
|
10
|
-
declare const defaultErrorMessages: Required<RutErrorMessages>;
|
|
11
|
-
|
|
12
|
-
export { RutErrorMessages, defaultErrorMessages };
|
|
2
|
+
export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
1
|
export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.js';
|
|
2
|
-
|
|
3
|
-
export { a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.js';
|
|
4
|
-
export { RutMessages, createRutSchema, rutSchema } from './zod.js';
|
|
5
|
-
import 'zod';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Default error messages in Spanish.
|
|
9
|
-
*/
|
|
10
|
-
declare const defaultErrorMessages: Required<RutErrorMessages>;
|
|
11
|
-
|
|
12
|
-
export { RutErrorMessages, defaultErrorMessages };
|
|
2
|
+
export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.js';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
var u={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=s(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let a=0;a<o.length;a++)i+=parseInt(o[a],10)*r[a%6];let n=11-i%11;return n===11?"0":n===10?"K":n.toString()}function d(e){let t=s(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function R(e){let t=s(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function g(e,t){return {...c,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}export{s as cleanRut,p as formatRut,g as getErrorMessage,l as getRutCheckDigit,d as isValidRut,R as validateRut};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format","createRutSchema","options","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
|
package/dist/zod.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(
|
|
1
|
+
'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(i){let s=i.replace(/[.\-\s,]/g,"").toUpperCase();return s.replace(/^0+/,"")||s}function d(i){let s=c(i).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*o[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(i,s){let o=c(i);if(o.length<2)return o;let r=o.slice(0,-1),t=o.slice(-1);return s===a.CLEAN?o:s===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(i={}){let{messages:s={},outputFormat:o}=i,r={...u,...s};return zod.z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,o))}var T=m();exports.createRutSchema=m;exports.rutSchema=T;//# sourceMappingURL=zod.cjs.map
|
|
2
2
|
//# sourceMappingURL=zod.cjs.map
|
package/dist/zod.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"oCAMO,IAAMA,EAAa,CAKxB,KAAA,CAAO,OAAA,CAKP,SAAA,CAAW,WACb,CAAA,CCZO,IAAMC,CAAAA,CAAmD,CAC9D,SAAU,kBAAA,CACV,YAAA,CAAc,sCAAA,CACd,aAAA,CAAe,6BACf,iBAAA,CAAmB,kCACrB,CAAA,CCIO,SAASC,EAASC,CAAAA,CAAqB,CAC5C,IAAMC,CAAAA,CAAUD,EAAI,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,CAAE,aAAY,CACzD,OAAOC,CAAAA,CAAQ,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,EAAKA,CACvC,CAOO,SAASC,CAAAA,CAAiBF,CAAAA,CAAqB,CACpD,IAAMC,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAAE,QAAQ,KAAA,CAAO,EAAE,CAAA,CAE/C,GAAI,CAAC,OAAA,CAAQ,IAAA,CAAKC,CAAO,CAAA,CACvB,OAAO,EAAA,CAGT,IAAME,CAAAA,CAAU,CAAC,EAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAC,CAAA,CAC7BC,CAAAA,CAAM,CAAA,CAEJC,CAAAA,CAASJ,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAAE,SAAQ,CACzC,IAAA,IAASK,CAAAA,CAAI,CAAA,CAAGA,EAAID,CAAAA,CAAO,MAAA,CAAQC,CAAAA,EAAAA,CACjCF,CAAAA,EAAO,SAASC,CAAAA,CAAOC,CAAC,CAAA,CAAG,EAAE,EAAIH,CAAAA,CAAQG,CAAAA,CAAI,CAAC,CAAA,CAGhD,IAAMC,CAAAA,CAAY,EAAA,CAAMH,CAAAA,CAAM,EAAA,CAE9B,OAAIG,CAAAA,GAAc,EAAA,CAAW,GAAA,CACzBA,CAAAA,GAAc,GAAW,GAAA,CACtBA,CAAAA,CAAU,QAAA,EACnB,CAkFO,SAASC,CAAAA,CAAUR,CAAAA,CAAaS,EAAkC,CACvE,IAAMR,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAIC,CAAAA,CAAQ,MAAA,CAAS,EACnB,OAAOA,CAAAA,CAGT,IAAMS,CAAAA,CAAOT,EAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BU,EAAaV,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAEnC,OAAIQ,CAAAA,GAAWZ,CAAAA,CAAW,KAAA,CACjBI,CAAAA,CAGLQ,IAAWZ,CAAAA,CAAW,SAAA,CAEjB,CAAA,EADea,CAAAA,CAAK,OAAA,CAAQ,uBAAA,CAAyB,GAAG,CACxC,IAAIC,CAAU,CAAA,CAAA,CAIhC,CAAA,EAAGD,CAAI,IAAIC,CAAU,CAAA,CAC9B,CCxIO,SAASC,EAAgBC,CAAAA,CAA4B,EAAC,CAAG,CAC9D,GAAM,CAAE,QAAA,CAAAC,CAAAA,CAAW,GAAI,YAAA,CAAAC,CAAa,CAAA,CAAIF,CAAAA,CAClCG,EAAO,CAAE,GAAGlB,CAAAA,CAAsB,GAAGgB,CAAS,CAAA,CAEpD,OAAOG,KAAAA,CACJ,MAAA,CAAO,CAAE,KAAA,CAAOD,CAAAA,CAAK,QAAS,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAA,CAAG,CAAE,MAAOA,CAAAA,CAAK,QAAS,CAAC,CAAA,CAC/B,UAAWE,CAAAA,EAAQnB,CAAAA,CAASmB,CAAG,CAAC,EAChC,KAAA,CAAOC,CAAAA,EAAQ,CACd,IAAMD,EAAMC,CAAAA,CAAI,KAAA,CAEhB,GAAI,CAAC,YAAY,IAAA,CAAKD,CAAG,CAAA,CAAG,CAC1BC,EAAI,MAAA,CAAO,IAAA,CAAK,CACd,IAAA,CAAM,QAAA,CACN,OAAA,CAASH,CAAAA,CAAK,YAAA,CACd,MAAOE,CACT,CAAC,CAAA,CACD,MACF,CAEA,GAAI,CAAC,iBAAA,CAAkB,IAAA,CAAKA,CAAG,CAAA,CAAG,CAChCC,CAAAA,CAAI,MAAA,CAAO,KAAK,CACd,IAAA,CAAM,QAAA,CACN,OAAA,CAASH,EAAK,aAAA,CACd,KAAA,CAAOE,CACT,CAAC,EACD,MACF,CAEA,IAAMR,CAAAA,CAAOQ,EAAI,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACtBP,EAAaO,CAAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,aAAY,CAEzChB,CAAAA,CAAiBQ,CAAI,CAAA,GAAMC,GAC7BQ,CAAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CACd,KAAM,QAAA,CACN,OAAA,CAASH,CAAAA,CAAK,iBAAA,CACd,MAAOE,CACT,CAAC,EAEL,CAAC,EACA,SAAA,CAAWA,CAAAA,EAAQV,CAAAA,CAAUU,CAAAA,CAAKH,CAAY,CAAC,CACpD,CAEO,IAAMK,EAAYR,CAAAA","file":"zod.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
package/dist/zod.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(
|
|
1
|
+
import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(i){let s=i.replace(/[.\-\s,]/g,"").toUpperCase();return s.replace(/^0+/,"")||s}function d(i){let s=c(i).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*o[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(i,s){let o=c(i);if(o.length<2)return o;let r=o.slice(0,-1),t=o.slice(-1);return s===a.CLEAN?o:s===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(i={}){let{messages:s={},outputFormat:o}=i,r={...u,...s};return z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,o))}var T=m();export{m as createRutSchema,T as rutSchema};//# sourceMappingURL=zod.js.map
|
|
2
2
|
//# sourceMappingURL=zod.js.map
|
package/dist/zod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"zod.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rut-kit",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author":
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Validador de RUT chileno con mensajes personalizados para JavaScript, TypeScript y Zod",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Javier Gómez Contreras",
|
|
7
|
+
"email": "hola@javiev.dev"
|
|
8
|
+
},
|
|
6
9
|
"repository": {
|
|
7
10
|
"type": "git",
|
|
8
11
|
"url": "https://github.com/javiev/rut-kit.git"
|
|
@@ -13,13 +16,25 @@
|
|
|
13
16
|
"homepage": "https://github.com/javiev/rut-kit",
|
|
14
17
|
"keywords": [
|
|
15
18
|
"rut",
|
|
19
|
+
"run",
|
|
16
20
|
"chile",
|
|
17
21
|
"chilean",
|
|
18
22
|
"validation",
|
|
19
23
|
"validator",
|
|
24
|
+
"validar",
|
|
25
|
+
"format",
|
|
26
|
+
"formatter",
|
|
27
|
+
"digito-verificador",
|
|
28
|
+
"check-digit",
|
|
20
29
|
"zod",
|
|
30
|
+
"schema",
|
|
21
31
|
"typescript",
|
|
22
|
-
"javascript"
|
|
32
|
+
"javascript",
|
|
33
|
+
"nodejs",
|
|
34
|
+
"deno",
|
|
35
|
+
"bun",
|
|
36
|
+
"browser",
|
|
37
|
+
"esm"
|
|
23
38
|
],
|
|
24
39
|
"type": "module",
|
|
25
40
|
"main": "./dist/index.cjs",
|
|
@@ -36,16 +51,6 @@
|
|
|
36
51
|
"default": "./dist/index.cjs"
|
|
37
52
|
}
|
|
38
53
|
},
|
|
39
|
-
"./core": {
|
|
40
|
-
"import": {
|
|
41
|
-
"types": "./dist/core.d.ts",
|
|
42
|
-
"default": "./dist/core.js"
|
|
43
|
-
},
|
|
44
|
-
"require": {
|
|
45
|
-
"types": "./dist/core.d.cts",
|
|
46
|
-
"default": "./dist/core.cjs"
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
54
|
"./zod": {
|
|
50
55
|
"import": {
|
|
51
56
|
"types": "./dist/zod.d.ts",
|