rut-kit 0.2.0 → 0.4.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 +8 -5
- package/dist/core.d.ts +8 -5
- 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/{types-Bd2Yz_p4.d.cts → types-BSKDzT30.d.cts} +1 -2
- package/dist/{types-Bd2Yz_p4.d.ts → types-BSKDzT30.d.ts} +1 -2
- package/dist/zod.cjs +1 -1
- package/dist/zod.cjs.map +1 -1
- package/dist/zod.d.cts +30 -1
- package/dist/zod.d.ts +30 -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: `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
|
|
1
|
+
'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(e){let t=e.replace(/[^\dkK]/gi,"").toUpperCase();return t.replace(/^0+/,"")||t}function u(e){let t=c(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],o=0,i=t.split("").reverse();for(let n=0;n<i.length;n++)o+=parseInt(i[n],10)*r[n%6];let s=11-o%11;return s===11?"0":s===10?"K":s.toString()}function l(e){if(typeof e!="string"||e.length===0)return false;let t=/^0*\d{1,2}\.0*\d{3}\.0*\d{3}-[\dkK]$/,r=/^0*\d{7,8}-[\dkK]$/,o=/^0*\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function x(e){if(!l(e))return false;let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)===o}function y(e){if(!l(e))return {valid:false,error:"invalidFormat"};let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...d,...t}[e]}function h(e,t){let r=c(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}exports.cleanRut=c;exports.formatRut=h;exports.getErrorMessage=M;exports.getRutCheckDigit=u;exports.isValidRut=x;exports.validateRut=y;//# 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","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","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 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, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\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(/[^\\dkK]/gi, '').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 if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash) - allows leading zeros\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash) - allows leading zeros\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting) - allows leading zeros\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\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 if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * invalidFormat: 'Invalid RUT format'\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,8 @@
|
|
|
1
|
-
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-
|
|
1
|
+
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-BSKDzT30.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, asterisks, etc).
|
|
5
|
+
* This function is permissive and accepts any separator for cleaning purposes.
|
|
5
6
|
* @param rut - The RUT string to clean
|
|
6
7
|
* @returns The cleaned RUT string (only digits and K)
|
|
7
8
|
*/
|
|
@@ -14,13 +15,15 @@ declare function cleanRut(rut: string): string;
|
|
|
14
15
|
declare function getRutCheckDigit(rut: string): string;
|
|
15
16
|
/**
|
|
16
17
|
* Validates a complete Chilean RUT (including check digit).
|
|
17
|
-
*
|
|
18
|
+
* Only accepts valid Chilean RUT formats.
|
|
19
|
+
* @param rut - The RUT to validate, must be in a valid format
|
|
18
20
|
* @returns true if the RUT is valid, false otherwise
|
|
19
21
|
*/
|
|
20
22
|
declare function isValidRut(rut: string): boolean;
|
|
21
23
|
/**
|
|
22
24
|
* Validates a complete Chilean RUT with detailed error information.
|
|
23
|
-
*
|
|
25
|
+
* Only accepts valid Chilean RUT formats.
|
|
26
|
+
* @param rut - The RUT to validate, must be in a valid format
|
|
24
27
|
* @returns Validation result with cleaned RUT if valid, or error type if invalid
|
|
25
28
|
* @example
|
|
26
29
|
* const result = validateRut('12.345.678-5');
|
|
@@ -40,7 +43,7 @@ declare function validateRut(rut: string): RutValidationResult;
|
|
|
40
43
|
* const result = validateRut('invalid');
|
|
41
44
|
* if (!result.valid) {
|
|
42
45
|
* const message = getErrorMessage(result.error, {
|
|
43
|
-
*
|
|
46
|
+
* invalidFormat: 'Invalid RUT format'
|
|
44
47
|
* });
|
|
45
48
|
* console.log(message);
|
|
46
49
|
* }
|
package/dist/core.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-
|
|
1
|
+
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-BSKDzT30.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, asterisks, etc).
|
|
5
|
+
* This function is permissive and accepts any separator for cleaning purposes.
|
|
5
6
|
* @param rut - The RUT string to clean
|
|
6
7
|
* @returns The cleaned RUT string (only digits and K)
|
|
7
8
|
*/
|
|
@@ -14,13 +15,15 @@ declare function cleanRut(rut: string): string;
|
|
|
14
15
|
declare function getRutCheckDigit(rut: string): string;
|
|
15
16
|
/**
|
|
16
17
|
* Validates a complete Chilean RUT (including check digit).
|
|
17
|
-
*
|
|
18
|
+
* Only accepts valid Chilean RUT formats.
|
|
19
|
+
* @param rut - The RUT to validate, must be in a valid format
|
|
18
20
|
* @returns true if the RUT is valid, false otherwise
|
|
19
21
|
*/
|
|
20
22
|
declare function isValidRut(rut: string): boolean;
|
|
21
23
|
/**
|
|
22
24
|
* Validates a complete Chilean RUT with detailed error information.
|
|
23
|
-
*
|
|
25
|
+
* Only accepts valid Chilean RUT formats.
|
|
26
|
+
* @param rut - The RUT to validate, must be in a valid format
|
|
24
27
|
* @returns Validation result with cleaned RUT if valid, or error type if invalid
|
|
25
28
|
* @example
|
|
26
29
|
* const result = validateRut('12.345.678-5');
|
|
@@ -40,7 +43,7 @@ declare function validateRut(rut: string): RutValidationResult;
|
|
|
40
43
|
* const result = validateRut('invalid');
|
|
41
44
|
* if (!result.valid) {
|
|
42
45
|
* const message = getErrorMessage(result.error, {
|
|
43
|
-
*
|
|
46
|
+
* invalidFormat: 'Invalid RUT format'
|
|
44
47
|
* });
|
|
45
48
|
* console.log(message);
|
|
46
49
|
* }
|
package/dist/core.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var a={CLEAN:"clean",FORMATTED:"formatted"};var
|
|
1
|
+
var a={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(e){let t=e.replace(/[^\dkK]/gi,"").toUpperCase();return t.replace(/^0+/,"")||t}function u(e){let t=c(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],o=0,i=t.split("").reverse();for(let n=0;n<i.length;n++)o+=parseInt(i[n],10)*r[n%6];let s=11-o%11;return s===11?"0":s===10?"K":s.toString()}function l(e){if(typeof e!="string"||e.length===0)return false;let t=/^0*\d{1,2}\.0*\d{3}\.0*\d{3}-[\dkK]$/,r=/^0*\d{7,8}-[\dkK]$/,o=/^0*\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function x(e){if(!l(e))return false;let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)===o}function y(e){if(!l(e))return {valid:false,error:"invalidFormat"};let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...d,...t}[e]}function h(e,t){let r=c(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}export{c as cleanRut,h as formatRut,M as getErrorMessage,u as getRutCheckDigit,x as isValidRut,y 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","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","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 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, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\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(/[^\\dkK]/gi, '').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 if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash) - allows leading zeros\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash) - allows leading zeros\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting) - allows leading zeros\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\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 if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * invalidFormat: 'Invalid RUT format'\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 d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[^\dkK]/gi,"").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],o=0,i=t.split("").reverse();for(let a=0;a<i.length;a++)o+=parseInt(i[a],10)*r[a%6];let n=11-o%11;return n===11?"0":n===10?"K":n.toString()}function c(e){if(typeof e!="string"||e.length===0)return false;let t=/^0*\d{1,2}\.0*\d{3}\.0*\d{3}-[\dkK]$/,r=/^0*\d{7,8}-[\dkK]$/,o=/^0*\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function g(e){if(!c(e))return false;let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)===o}function R(e){if(!c(e))return {valid:false,error:"invalidFormat"};let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(e,t){return {...d,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}exports.cleanRut=s;exports.formatRut=p;exports.getErrorMessage=f;exports.getRutCheckDigit=l;exports.isValidRut=g;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","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"aAMO,IAAMA,EAAa,CAKxB,KAAA,CAAO,OAAA,CAKP,SAAA,CAAW,WACb,CAAA,CCZO,IAAMC,CAAAA,CAAmD,CAC9D,SAAU,kBAAA,CACV,aAAA,CAAe,4BAAA,CACf,iBAAA,CAAmB,kCACrB,CAAA,CCMO,SAASC,CAAAA,CAASC,CAAAA,CAAqB,CAC5C,IAAMC,CAAAA,CAAUD,CAAAA,CAAI,OAAA,CAAQ,YAAa,EAAE,CAAA,CAAE,WAAA,EAAY,CACzD,OAAOC,CAAAA,CAAQ,OAAA,CAAQ,KAAA,CAAO,EAAE,GAAKA,CACvC,CAOO,SAASC,CAAAA,CAAiBF,EAAqB,CACpD,IAAMC,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,EAE/C,GAAI,CAAC,OAAA,CAAQ,IAAA,CAAKC,CAAO,CAAA,CACvB,OAAO,EAAA,CAGT,IAAME,EAAU,CAAC,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,EAAG,CAAA,CAAG,CAAC,CAAA,CAC7BC,CAAAA,CAAM,EAEJC,CAAAA,CAASJ,CAAAA,CAAQ,MAAM,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,CAWA,SAASC,CAAAA,CAAiBR,CAAAA,CAAsB,CAC9C,GAAI,OAAOA,CAAAA,EAAQ,QAAA,EAAYA,CAAAA,CAAI,SAAW,CAAA,CAC5C,OAAO,MAAA,CAIT,IAAMS,EAAgB,sCAAA,CAEhBC,CAAAA,CAAgB,oBAAA,CAEhBC,CAAAA,CAAa,oBAEnB,OAAOF,CAAAA,CAAc,IAAA,CAAKT,CAAG,GAAKU,CAAAA,CAAc,IAAA,CAAKV,CAAG,CAAA,EAAKW,EAAW,IAAA,CAAKX,CAAG,CAClF,CAQO,SAASY,CAAAA,CAAWZ,CAAAA,CAAsB,CAC/C,GAAI,CAACQ,CAAAA,CAAiBR,CAAG,EACvB,OAAO,MAAA,CAGT,IAAMC,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAI,CAAC,sBAAA,CAAuB,IAAA,CAAKC,CAAO,EACtC,OAAO,MAAA,CAGT,IAAMY,CAAAA,CAAOZ,EAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1Ba,EAAab,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAAE,aAAY,CAEjD,OAAOC,CAAAA,CAAiBW,CAAI,IAAMC,CACpC,CAeO,SAASC,CAAAA,CAAYf,EAAkC,CAC5D,GAAI,CAACQ,CAAAA,CAAiBR,CAAG,CAAA,CACvB,OAAO,CAAE,KAAA,CAAO,MAAO,KAAA,CAAO,eAAgB,CAAA,CAGhD,IAAMC,EAAUF,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAI,CAAC,sBAAA,CAAuB,IAAA,CAAKC,CAAO,CAAA,CACtC,OAAO,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,eAAgB,CAAA,CAGhD,IAAMY,CAAAA,CAAOZ,CAAAA,CAAQ,MAAM,CAAA,CAAG,EAAE,CAAA,CAC1Ba,CAAAA,CAAab,EAAQ,KAAA,CAAM,EAAE,EAAE,WAAA,EAAY,CAEjD,OAAIC,CAAAA,CAAiBW,CAAI,CAAA,GAAMC,CAAAA,CACtB,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,mBAAoB,EAG7C,CAAE,KAAA,CAAO,IAAA,CAAM,GAAA,CAAKb,CAAQ,CACrC,CAgBO,SAASe,CAAAA,CAAgBC,EAA2BC,CAAAA,CAAqC,CAE9F,OADa,CAAE,GAAGpB,CAAAA,CAAsB,GAAGoB,CAAS,CAAA,CACxCD,CAAK,CACnB,CAYO,SAASE,CAAAA,CAAUnB,EAAaoB,CAAAA,CAAkC,CACvE,IAAMnB,CAAAA,CAAUF,EAASC,CAAG,CAAA,CAE5B,GAAIC,CAAAA,CAAQ,OAAS,CAAA,CACnB,OAAOA,CAAAA,CAGT,IAAMY,EAAOZ,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,EAC1Ba,CAAAA,CAAab,CAAAA,CAAQ,KAAA,CAAM,EAAE,EAEnC,OAAImB,CAAAA,GAAWvB,CAAAA,CAAW,KAAA,CACjBI,EAGLmB,CAAAA,GAAWvB,CAAAA,CAAW,SAAA,CAEjB,CAAA,EADegB,EAAK,OAAA,CAAQ,uBAAA,CAAyB,GAAG,CACxC,IAAIC,CAAU,CAAA,CAAA,CAIhC,GAAGD,CAAI,CAAA,CAAA,EAAIC,CAAU,CAAA,CAC9B","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 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, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\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(/[^\\dkK]/gi, '').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 if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash) - allows leading zeros\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash) - allows leading zeros\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting) - allows leading zeros\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\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 if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * invalidFormat: 'Invalid RUT format'\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-BSKDzT30.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-BSKDzT30.js';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
var u={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[^\dkK]/gi,"").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],o=0,i=t.split("").reverse();for(let a=0;a<i.length;a++)o+=parseInt(i[a],10)*r[a%6];let n=11-o%11;return n===11?"0":n===10?"K":n.toString()}function c(e){if(typeof e!="string"||e.length===0)return false;let t=/^0*\d{1,2}\.0*\d{3}\.0*\d{3}-[\dkK]$/,r=/^0*\d{7,8}-[\dkK]$/,o=/^0*\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function g(e){if(!c(e))return false;let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)===o}function R(e){if(!c(e))return {valid:false,error:"invalidFormat"};let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(e,t){return {...d,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}export{s as cleanRut,p as formatRut,f as getErrorMessage,l as getRutCheckDigit,g 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","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","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 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, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\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(/[^\\dkK]/gi, '').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 if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash) - allows leading zeros\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash) - allows leading zeros\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting) - allows leading zeros\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\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 if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * invalidFormat: 'Invalid RUT format'\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"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Error types that can occur during RUT validation.
|
|
3
3
|
*/
|
|
4
|
-
type RutValidationError = '
|
|
4
|
+
type RutValidationError = 'invalidFormat' | 'invalidCheckDigit';
|
|
5
5
|
/**
|
|
6
6
|
* Output format for RUT formatting.
|
|
7
7
|
* - clean: No dots, no dash (e.g., "123456789")
|
|
@@ -25,7 +25,6 @@ type RutValidationResult = {
|
|
|
25
25
|
*/
|
|
26
26
|
type RutErrorMessages = {
|
|
27
27
|
required?: string;
|
|
28
|
-
invalidChars?: string;
|
|
29
28
|
invalidFormat?: string;
|
|
30
29
|
invalidCheckDigit?: string;
|
|
31
30
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Error types that can occur during RUT validation.
|
|
3
3
|
*/
|
|
4
|
-
type RutValidationError = '
|
|
4
|
+
type RutValidationError = 'invalidFormat' | 'invalidCheckDigit';
|
|
5
5
|
/**
|
|
6
6
|
* Output format for RUT formatting.
|
|
7
7
|
* - clean: No dots, no dash (e.g., "123456789")
|
|
@@ -25,7 +25,6 @@ type RutValidationResult = {
|
|
|
25
25
|
*/
|
|
26
26
|
type RutErrorMessages = {
|
|
27
27
|
required?: string;
|
|
28
|
-
invalidChars?: string;
|
|
29
28
|
invalidFormat?: string;
|
|
30
29
|
invalidCheckDigit?: string;
|
|
31
30
|
};
|
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",
|
|
1
|
+
'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(n){let s=n.replace(/[^\dkK]/gi,"").toUpperCase();return s.replace(/^0+/,"")||s}function l(n){let s=c(n).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let i=0;i<t.length;i++)r+=parseInt(t[i],10)*o[i%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function g(n,s){let o=c(n);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 f(n={}){let{messages:s={},outputFormat:o}=n,r={...u,...s};return zod.z.string({error:r.required}).min(1,{error:r.required}).check(t=>{let e=t.value,i=/^0*\d{1,2}\.0*\d{3}\.0*\d{3}-[\dkK]$/,d=/^0*\d{7,8}-[\dkK]$/,p=/^0*\d{7,8}[\dkK]$/;if(!i.test(e)&&!d.test(e)&&!p.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[1-9]\d{6,7}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let i=e.slice(0,-1),d=e.slice(-1).toUpperCase();l(i)!==d&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>g(t,o))}var $=f();exports.createRutSchema=f;exports.rutSchema=$;//# 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","getRutCheckDigit","cleaned","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.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","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","ctx","val","withDotsRegex","withDashRegex","cleanRegex","rutSchema"],"mappings":"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","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 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, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\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(/[^\\dkK]/gi, '').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 if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash) - allows leading zeros\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash) - allows leading zeros\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting) - allows leading zeros\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\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 if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * invalidFormat: 'Invalid RUT format'\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\n/**\n * Creates a customizable Zod schema for validating Chilean RUTs.\n *\n * Validates format (strict), structure, and check digit. Returns the RUT in the specified format.\n *\n * @param options - Configuration options\n * @param options.messages - Custom error messages for validation errors\n * @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)\n * @returns A Zod schema that validates and formats RUTs\n *\n * @example\n * // Default schema\n * const schema = createRutSchema()\n * schema.parse('189726317') // \"18972631-7\"\n *\n * @example\n * // With custom messages\n * const schema = createRutSchema({\n * messages: {\n * required: 'RUT es obligatorio',\n * invalidFormat: 'Formato de RUT incorrecto'\n * }\n * })\n *\n * @example\n * // With custom output format\n * const schema = createRutSchema({ outputFormat: 'formatted' })\n * schema.parse('189726317') // \"18.972.631-7\"\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 .check((ctx) => {\n const val = ctx.value;\n\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n if (!withDotsRegex.test(val) && !withDashRegex.test(val) && !cleanRegex.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[1-9]\\d{6,7}[\\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.d.cts
CHANGED
|
@@ -1,11 +1,40 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { R as RutErrorMessages, a as RutOutputFormat } from './types-
|
|
2
|
+
import { R as RutErrorMessages, a as RutOutputFormat } from './types-BSKDzT30.cjs';
|
|
3
3
|
|
|
4
4
|
type RutMessages = RutErrorMessages;
|
|
5
5
|
interface RutSchemaOptions {
|
|
6
6
|
messages?: RutMessages;
|
|
7
7
|
outputFormat?: RutOutputFormat;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a customizable Zod schema for validating Chilean RUTs.
|
|
11
|
+
*
|
|
12
|
+
* Validates format (strict), structure, and check digit. Returns the RUT in the specified format.
|
|
13
|
+
*
|
|
14
|
+
* @param options - Configuration options
|
|
15
|
+
* @param options.messages - Custom error messages for validation errors
|
|
16
|
+
* @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)
|
|
17
|
+
* @returns A Zod schema that validates and formats RUTs
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Default schema
|
|
21
|
+
* const schema = createRutSchema()
|
|
22
|
+
* schema.parse('189726317') // "18972631-7"
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // With custom messages
|
|
26
|
+
* const schema = createRutSchema({
|
|
27
|
+
* messages: {
|
|
28
|
+
* required: 'RUT es obligatorio',
|
|
29
|
+
* invalidFormat: 'Formato de RUT incorrecto'
|
|
30
|
+
* }
|
|
31
|
+
* })
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // With custom output format
|
|
35
|
+
* const schema = createRutSchema({ outputFormat: 'formatted' })
|
|
36
|
+
* schema.parse('189726317') // "18.972.631-7"
|
|
37
|
+
*/
|
|
9
38
|
declare function createRutSchema(options?: RutSchemaOptions): z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
10
39
|
declare const rutSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
11
40
|
|
package/dist/zod.d.ts
CHANGED
|
@@ -1,11 +1,40 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { R as RutErrorMessages, a as RutOutputFormat } from './types-
|
|
2
|
+
import { R as RutErrorMessages, a as RutOutputFormat } from './types-BSKDzT30.js';
|
|
3
3
|
|
|
4
4
|
type RutMessages = RutErrorMessages;
|
|
5
5
|
interface RutSchemaOptions {
|
|
6
6
|
messages?: RutMessages;
|
|
7
7
|
outputFormat?: RutOutputFormat;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a customizable Zod schema for validating Chilean RUTs.
|
|
11
|
+
*
|
|
12
|
+
* Validates format (strict), structure, and check digit. Returns the RUT in the specified format.
|
|
13
|
+
*
|
|
14
|
+
* @param options - Configuration options
|
|
15
|
+
* @param options.messages - Custom error messages for validation errors
|
|
16
|
+
* @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)
|
|
17
|
+
* @returns A Zod schema that validates and formats RUTs
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Default schema
|
|
21
|
+
* const schema = createRutSchema()
|
|
22
|
+
* schema.parse('189726317') // "18972631-7"
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // With custom messages
|
|
26
|
+
* const schema = createRutSchema({
|
|
27
|
+
* messages: {
|
|
28
|
+
* required: 'RUT es obligatorio',
|
|
29
|
+
* invalidFormat: 'Formato de RUT incorrecto'
|
|
30
|
+
* }
|
|
31
|
+
* })
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // With custom output format
|
|
35
|
+
* const schema = createRutSchema({ outputFormat: 'formatted' })
|
|
36
|
+
* schema.parse('189726317') // "18.972.631-7"
|
|
37
|
+
*/
|
|
9
38
|
declare function createRutSchema(options?: RutSchemaOptions): z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
10
39
|
declare const rutSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
11
40
|
|
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",
|
|
1
|
+
import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(n){let s=n.replace(/[^\dkK]/gi,"").toUpperCase();return s.replace(/^0+/,"")||s}function l(n){let s=c(n).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let i=0;i<t.length;i++)r+=parseInt(t[i],10)*o[i%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function g(n,s){let o=c(n);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 f(n={}){let{messages:s={},outputFormat:o}=n,r={...u,...s};return z.string({error:r.required}).min(1,{error:r.required}).check(t=>{let e=t.value,i=/^0*\d{1,2}\.0*\d{3}\.0*\d{3}-[\dkK]$/,d=/^0*\d{7,8}-[\dkK]$/,p=/^0*\d{7,8}[\dkK]$/;if(!i.test(e)&&!d.test(e)&&!p.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[1-9]\d{6,7}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let i=e.slice(0,-1),d=e.slice(-1).toUpperCase();l(i)!==d&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>g(t,o))}var $=f();export{f as createRutSchema,$ 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","getRutCheckDigit","cleaned","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).\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","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","ctx","val","withDotsRegex","withDashRegex","cleanRegex","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 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, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\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(/[^\\dkK]/gi, '').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 if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash) - allows leading zeros\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash) - allows leading zeros\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting) - allows leading zeros\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\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 if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,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 * invalidFormat: 'Invalid RUT format'\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\n/**\n * Creates a customizable Zod schema for validating Chilean RUTs.\n *\n * Validates format (strict), structure, and check digit. Returns the RUT in the specified format.\n *\n * @param options - Configuration options\n * @param options.messages - Custom error messages for validation errors\n * @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)\n * @returns A Zod schema that validates and formats RUTs\n *\n * @example\n * // Default schema\n * const schema = createRutSchema()\n * schema.parse('189726317') // \"18972631-7\"\n *\n * @example\n * // With custom messages\n * const schema = createRutSchema({\n * messages: {\n * required: 'RUT es obligatorio',\n * invalidFormat: 'Formato de RUT incorrecto'\n * }\n * })\n *\n * @example\n * // With custom output format\n * const schema = createRutSchema({ outputFormat: 'formatted' })\n * schema.parse('189726317') // \"18.972.631-7\"\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 .check((ctx) => {\n const val = ctx.value;\n\n const withDotsRegex = /^0*\\d{1,2}\\.0*\\d{3}\\.0*\\d{3}-[\\dkK]$/;\n const withDashRegex = /^0*\\d{7,8}-[\\dkK]$/;\n const cleanRegex = /^0*\\d{7,8}[\\dkK]$/;\n\n if (!withDotsRegex.test(val) && !withDashRegex.test(val) && !cleanRegex.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[1-9]\\d{6,7}[\\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.4.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",
|