rut-kit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # rut-kit 🇨🇱
2
+
3
+ Validación de RUT chileno con errores descriptivos para JavaScript y TypeScript. Rápido, liviano, con soporte para Zod.
4
+
5
+ ```ts
6
+ import { validateRut } from 'rut-kit'
7
+
8
+ validateRut('18.972.631-7')
9
+ // { valid: true, rut: '189726317' }
10
+
11
+ validateRut('18.972.631-0')
12
+ // { valid: false, error: 'invalidCheckDigit' }
13
+ ```
14
+
15
+ ## Instalación
16
+
17
+ ```bash
18
+ npm install rut-kit
19
+ # o
20
+ pnpm add rut-kit
21
+ # o
22
+ bun add rut-kit
23
+ ```
24
+
25
+ Con Zod:
26
+
27
+ ```bash
28
+ npm install rut-kit zod
29
+ # o
30
+ pnpm add rut-kit zod
31
+ # o
32
+ bun add rut-kit zod
33
+ ```
34
+
35
+ ## Características
36
+
37
+ - **Errores Descriptivos** 🎯 - Indica qué está mal: caracteres inválidos, formato incorrecto o dígito verificador erróneo.
38
+ - **Ultraliviano** ⚡ - 960 bytes gzipped. Sin dependencias. Solo lo esencial.
39
+ - **Multi-runtime** 🌍 - Funciona en Node.js, Bun, Edge y el navegador.
40
+ - **TypeScript Nativo** 🔷 - Escrito en TypeScript. Tipos incluidos. Autocompletado completo.
41
+ - **Integración Zod** 🛡️ - Schema listo para formularios y APIs. Valida, transforma y formatea en un paso.
42
+
43
+ ## Uso
44
+
45
+ ### Validación Simple
46
+
47
+ ```ts
48
+ import { isValidRut } from 'rut-kit'
49
+
50
+ isValidRut('18.972.631-7') // true
51
+ isValidRut('18.972.631-0') // false
52
+ ```
53
+
54
+ ### Validación con Detalles
55
+
56
+ ```ts
57
+ import { validateRut } from 'rut-kit'
58
+
59
+ const result = validateRut('18.972.631-0')
60
+ // { valid: false, error: 'invalidCheckDigit' }
61
+ ```
62
+
63
+ Errores posibles: `invalidChars` | `invalidFormat` | `invalidCheckDigit`
64
+
65
+ ### Formateo
66
+
67
+ ```ts
68
+ import { formatRut } from 'rut-kit'
69
+
70
+ formatRut('189726317') // '18972631-7'
71
+ formatRut('189726317', 'formatted') // '18.972.631-7'
72
+ formatRut('189726317', 'clean') // '189726317'
73
+ ```
74
+
75
+ ### Con Zod
76
+
77
+ ```ts
78
+ import { rutSchema, createRutSchema } from 'rut-kit/zod'
79
+
80
+ // Schema por defecto
81
+ rutSchema.parse('18.972.631-7')
82
+ // '18972631-7'
83
+
84
+ // Schema personalizado
85
+ const schema = createRutSchema({
86
+ messages: { required: 'Ingresa tu RUT' },
87
+ outputFormat: 'formatted'
88
+ })
89
+ ```
90
+
91
+ ## Documentación
92
+
93
+ Visita la [documentación completa](https://javiev.github.io/rut-kit/) para guías detalladas e integraciones con React, Next.js, Express y más.
package/dist/core.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){return e.replace(/[.\-\s]/g,"").toUpperCase()}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}exports.cleanRut=u;exports.formatRut=y;exports.getErrorMessage=M;exports.getRutCheckDigit=l;exports.isValidRut=E;exports.validateRut=v;//# sourceMappingURL=core.cjs.map
1
+ 'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}exports.cleanRut=u;exports.formatRut=y;exports.getErrorMessage=M;exports.getRutCheckDigit=l;exports.isValidRut=E;exports.validateRut=v;//# sourceMappingURL=core.cjs.map
2
2
  //# sourceMappingURL=core.cjs.map
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"aAMO,IAAMA,CAAAA,CAAa,CAKxB,KAAA,CAAO,OAAA,CAKP,SAAA,CAAW,WACb,CAAA,CCZO,IAAMC,CAAAA,CAAmD,CAC9D,QAAA,CAAU,kBAAA,CACV,aAAc,sCAAA,CACd,aAAA,CAAe,4BAAA,CACf,iBAAA,CAAmB,kCACrB,CAAA,CCIO,SAASC,CAAAA,CAASC,EAAqB,CAC5C,IAAMC,CAAAA,CAAUD,CAAAA,CAAI,OAAA,CAAQ,WAAA,CAAa,EAAE,CAAA,CAAE,aAAY,CACzD,OAAOC,CAAAA,CAAQ,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,EAAKA,CACvC,CAOO,SAASC,CAAAA,CAAiBF,CAAAA,CAAqB,CACpD,IAAMC,CAAAA,CAAUF,CAAAA,CAASC,CAAG,EAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAE/C,GAAI,CAAC,OAAA,CAAQ,IAAA,CAAKC,CAAO,CAAA,CACvB,OAAO,EAAA,CAGT,IAAME,CAAAA,CAAU,CAAC,CAAA,CAAG,CAAA,CAAG,EAAG,CAAA,CAAG,CAAA,CAAG,CAAC,CAAA,CAC7BC,CAAAA,CAAM,CAAA,CAEJC,CAAAA,CAASJ,CAAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,OAAA,EAAQ,CACzC,IAAA,IAASK,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAID,EAAO,MAAA,CAAQC,CAAAA,EAAAA,CACjCF,CAAAA,EAAO,QAAA,CAASC,CAAAA,CAAOC,CAAC,CAAA,CAAG,EAAE,EAAIH,CAAAA,CAAQG,CAAAA,CAAI,CAAC,CAAA,CAGhD,IAAMC,CAAAA,CAAY,EAAA,CAAMH,CAAAA,CAAM,GAE9B,OAAIG,CAAAA,GAAc,EAAA,CAAW,GAAA,CACzBA,CAAAA,GAAc,EAAA,CAAW,GAAA,CACtBA,CAAAA,CAAU,UACnB,CAOO,SAASC,CAAAA,CAAWR,CAAAA,CAAsB,CAC/C,IAAMC,CAAAA,CAAUF,EAASC,CAAG,CAAA,CAE5B,GAAI,CAAC,sBAAA,CAAuB,IAAA,CAAKC,CAAO,CAAA,CACtC,OAAO,MAAA,CAGT,IAAMQ,CAAAA,CAAOR,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BS,EAAaT,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAAE,WAAA,EAAY,CAEjD,OAAOC,CAAAA,CAAiBO,CAAI,CAAA,GAAMC,CACpC,CAcO,SAASC,CAAAA,CAAYX,CAAAA,CAAkC,CAC5D,IAAMC,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAI,CAAC,WAAA,CAAY,IAAA,CAAKC,CAAO,CAAA,CAC3B,OAAO,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,cAAe,CAAA,CAG/C,GAAI,CAAC,sBAAA,CAAuB,IAAA,CAAKA,CAAO,CAAA,CACtC,OAAO,CAAE,KAAA,CAAO,MAAO,KAAA,CAAO,eAAgB,CAAA,CAGhD,IAAMQ,CAAAA,CAAOR,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BS,CAAAA,CAAaT,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAAE,WAAA,EAAY,CAEjD,OAAIC,CAAAA,CAAiBO,CAAI,CAAA,GAAMC,CAAAA,CACtB,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,mBAAoB,CAAA,CAG7C,CAAE,KAAA,CAAO,IAAA,CAAM,GAAA,CAAKT,CAAQ,CACrC,CAgBO,SAASW,CAAAA,CAAgBC,CAAAA,CAA2BC,CAAAA,CAAqC,CAE9F,OADa,CAAE,GAAGhB,CAAAA,CAAsB,GAAGgB,CAAS,CAAA,CACxCD,CAAK,CACnB,CAYO,SAASE,CAAAA,CAAUf,CAAAA,CAAagB,EAAkC,CACvE,IAAMf,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAIC,CAAAA,CAAQ,OAAS,CAAA,CACnB,OAAOA,CAAAA,CAGT,IAAMQ,CAAAA,CAAOR,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BS,CAAAA,CAAaT,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAEnC,OAAIe,CAAAA,GAAWnB,EAAW,KAAA,CACjBI,CAAAA,CAGLe,CAAAA,GAAWnB,CAAAA,CAAW,SAAA,CAEjB,CAAA,EADeY,CAAAA,CAAK,OAAA,CAAQ,wBAAyB,GAAG,CACxC,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CAIhC,CAAA,EAAGD,CAAI,CAAA,CAAA,EAAIC,CAAU,CAAA,CAC9B","file":"core.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/core.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
2
2
 
3
3
  /**
4
- * Removes all formatting characters from a RUT (dots, dashes, spaces).
4
+ * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).
5
5
  * @param rut - The RUT string to clean
6
6
  * @returns The cleaned RUT string (only digits and K)
7
7
  */
package/dist/core.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.js';
2
2
 
3
3
  /**
4
- * Removes all formatting characters from a RUT (dots, dashes, spaces).
4
+ * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).
5
5
  * @param rut - The RUT string to clean
6
6
  * @returns The cleaned RUT string (only digits and K)
7
7
  */
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){return e.replace(/[.\-\s]/g,"").toUpperCase()}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}export{u as cleanRut,y as formatRut,M as getErrorMessage,l as getRutCheckDigit,E as isValidRut,v as validateRut};//# sourceMappingURL=core.js.map
1
+ var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}export{u as cleanRut,y as formatRut,M as getErrorMessage,l as getRutCheckDigit,E as isValidRut,v as validateRut};//# sourceMappingURL=core.js.map
2
2
  //# sourceMappingURL=core.js.map
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"AAMO,IAAMA,CAAAA,CAAa,CAKxB,KAAA,CAAO,OAAA,CAKP,SAAA,CAAW,WACb,CAAA,CCZO,IAAMC,CAAAA,CAAmD,CAC9D,QAAA,CAAU,kBAAA,CACV,aAAc,sCAAA,CACd,aAAA,CAAe,4BAAA,CACf,iBAAA,CAAmB,kCACrB,CAAA,CCIO,SAASC,CAAAA,CAASC,CAAAA,CAAqB,CAC5C,OAAOA,CAAAA,CAAI,OAAA,CAAQ,UAAA,CAAY,EAAE,CAAA,CAAE,aACrC,CAOO,SAASC,CAAAA,CAAiBD,CAAAA,CAAqB,CACpD,IAAME,CAAAA,CAAUH,CAAAA,CAASC,CAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAE/C,GAAI,CAAC,OAAA,CAAQ,IAAA,CAAKE,CAAO,CAAA,CACvB,OAAO,EAAA,CAGT,IAAMC,CAAAA,CAAU,CAAC,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAC,CAAA,CAC7BC,CAAAA,CAAM,EAEJC,CAAAA,CAASH,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAAE,OAAA,EAAQ,CACzC,IAAA,IAASI,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAID,CAAAA,CAAO,MAAA,CAAQC,CAAAA,EAAAA,CACjCF,CAAAA,EAAO,QAAA,CAASC,EAAOC,CAAC,CAAA,CAAG,EAAE,CAAA,CAAIH,CAAAA,CAAQG,CAAAA,CAAI,CAAC,CAAA,CAGhD,IAAMC,CAAAA,CAAY,EAAA,CAAMH,CAAAA,CAAM,EAAA,CAE9B,OAAIG,CAAAA,GAAc,EAAA,CAAW,GAAA,CACzBA,IAAc,EAAA,CAAW,GAAA,CACtBA,CAAAA,CAAU,QAAA,EACnB,CAOO,SAASC,CAAAA,CAAWR,CAAAA,CAAsB,CAC/C,IAAME,CAAAA,CAAUH,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAI,CAAC,iBAAA,CAAkB,IAAA,CAAKE,CAAO,CAAA,CACjC,OAAO,MAAA,CAGT,IAAMO,CAAAA,CAAOP,EAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BQ,CAAAA,CAAaR,CAAAA,CAAQ,KAAA,CAAM,EAAE,EAAE,WAAA,EAAY,CAEjD,OAAOD,CAAAA,CAAiBQ,CAAI,CAAA,GAAMC,CACpC,CAcO,SAASC,CAAAA,CAAYX,CAAAA,CAAkC,CAC5D,IAAME,CAAAA,CAAUH,CAAAA,CAASC,CAAG,EAE5B,GAAI,CAAC,WAAA,CAAY,IAAA,CAAKE,CAAO,CAAA,CAC3B,OAAO,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,cAAe,CAAA,CAG/C,GAAI,CAAC,iBAAA,CAAkB,KAAKA,CAAO,CAAA,CACjC,OAAO,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,eAAgB,CAAA,CAGhD,IAAMO,CAAAA,CAAOP,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BQ,EAAaR,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAAE,WAAA,EAAY,CAEjD,OAAID,CAAAA,CAAiBQ,CAAI,CAAA,GAAMC,CAAAA,CACtB,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,mBAAoB,CAAA,CAG7C,CAAE,KAAA,CAAO,IAAA,CAAM,GAAA,CAAKR,CAAQ,CACrC,CAgBO,SAASU,CAAAA,CAAgBC,CAAAA,CAA2BC,CAAAA,CAAqC,CAE9F,OADa,CAAE,GAAGhB,CAAAA,CAAsB,GAAGgB,CAAS,CAAA,CACxCD,CAAK,CACnB,CAYO,SAASE,CAAAA,CAAUf,CAAAA,CAAagB,CAAAA,CAAkC,CACvE,IAAMd,CAAAA,CAAUH,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAIE,CAAAA,CAAQ,MAAA,CAAS,EACnB,OAAOA,CAAAA,CAGT,IAAMO,CAAAA,CAAOP,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CAC1BQ,CAAAA,CAAaR,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAEnC,OAAIc,CAAAA,GAAWnB,EAAW,KAAA,CACjBK,CAAAA,CAGLc,CAAAA,GAAWnB,CAAAA,CAAW,SAAA,CAEjB,CAAA,EADeY,CAAAA,CAAK,OAAA,CAAQ,wBAAyB,GAAG,CACxC,CAAA,CAAA,EAAIC,CAAU,CAAA,CAAA,CAIhC,CAAA,EAAGD,CAAI,CAAA,CAAA,EAAIC,CAAU,CAAA,CAC9B","file":"core.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var zod=require('zod');var d={CLEAN:"clean",FORMATTED:"formatted"};var n={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function a(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function c(o){let t=a(o).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],e=0,s=t.split("").reverse();for(let u=0;u<s.length;u++)e+=parseInt(s[u],10)*r[u%6];let i=11-e%11;return i===11?"0":i===10?"K":i.toString()}function R(o){let t=a(o);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)===e}function m(o){let t=a(o);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)!==e?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(o,t){return {...n,...t}[o]}function p(o,t){let r=a(o);if(r.length<2)return r;let e=r.slice(0,-1),s=r.slice(-1);return t===d.CLEAN?r:t===d.FORMATTED?`${e.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${s}`:`${e}-${s}`}function l(o={}){let{messages:t={},outputFormat:r}=o,e={...n,...t};return zod.z.string({error:e.required}).min(1,{error:e.required}).transform(s=>a(s)).check(s=>{let i=s.value;if(!/^[\dkK]+$/.test(i)){s.issues.push({code:"custom",message:e.invalidChars,input:i});return}if(!/^\d{1,8}[\dkK]$/.test(i)){s.issues.push({code:"custom",message:e.invalidFormat,input:i});return}let u=i.slice(0,-1),g=i.slice(-1).toUpperCase();c(u)!==g&&s.issues.push({code:"custom",message:e.invalidCheckDigit,input:i});}).transform(s=>p(s,r))}var E=l();exports.cleanRut=a;exports.createRutSchema=l;exports.defaultErrorMessages=n;exports.formatRut=p;exports.getErrorMessage=f;exports.getRutCheckDigit=c;exports.isValidRut=R;exports.rutSchema=E;exports.validateRut=m;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var u={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=s(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let a=0;a<o.length;a++)i+=parseInt(o[a],10)*r[a%6];let n=11-i%11;return n===11?"0":n===10?"K":n.toString()}function d(e){let t=s(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function R(e){let t=s(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function g(e,t){return {...c,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}exports.cleanRut=s;exports.formatRut=p;exports.getErrorMessage=g;exports.getRutCheckDigit=l;exports.isValidRut=d;exports.validateRut=R;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format","createRutSchema","options","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,12 +1,2 @@
1
1
  export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.cjs';
2
- import { R as RutErrorMessages } from './types-Bd2Yz_p4.cjs';
3
- export { a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
4
- export { RutMessages, createRutSchema, rutSchema } from './zod.cjs';
5
- import 'zod';
6
-
7
- /**
8
- * Default error messages in Spanish.
9
- */
10
- declare const defaultErrorMessages: Required<RutErrorMessages>;
11
-
12
- export { RutErrorMessages, defaultErrorMessages };
2
+ export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
package/dist/index.d.ts CHANGED
@@ -1,12 +1,2 @@
1
1
  export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.js';
2
- import { R as RutErrorMessages } from './types-Bd2Yz_p4.js';
3
- export { a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.js';
4
- export { RutMessages, createRutSchema, rutSchema } from './zod.js';
5
- import 'zod';
6
-
7
- /**
8
- * Default error messages in Spanish.
9
- */
10
- declare const defaultErrorMessages: Required<RutErrorMessages>;
11
-
12
- export { RutErrorMessages, defaultErrorMessages };
2
+ export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import {z}from'zod';var d={CLEAN:"clean",FORMATTED:"formatted"};var n={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function a(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function c(o){let t=a(o).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],e=0,s=t.split("").reverse();for(let u=0;u<s.length;u++)e+=parseInt(s[u],10)*r[u%6];let i=11-e%11;return i===11?"0":i===10?"K":i.toString()}function R(o){let t=a(o);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)===e}function m(o){let t=a(o);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)!==e?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(o,t){return {...n,...t}[o]}function p(o,t){let r=a(o);if(r.length<2)return r;let e=r.slice(0,-1),s=r.slice(-1);return t===d.CLEAN?r:t===d.FORMATTED?`${e.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${s}`:`${e}-${s}`}function l(o={}){let{messages:t={},outputFormat:r}=o,e={...n,...t};return z.string({error:e.required}).min(1,{error:e.required}).transform(s=>a(s)).check(s=>{let i=s.value;if(!/^[\dkK]+$/.test(i)){s.issues.push({code:"custom",message:e.invalidChars,input:i});return}if(!/^\d{1,8}[\dkK]$/.test(i)){s.issues.push({code:"custom",message:e.invalidFormat,input:i});return}let u=i.slice(0,-1),g=i.slice(-1).toUpperCase();c(u)!==g&&s.issues.push({code:"custom",message:e.invalidCheckDigit,input:i});}).transform(s=>p(s,r))}var E=l();export{a as cleanRut,l as createRutSchema,n as defaultErrorMessages,p as formatRut,f as getErrorMessage,c as getRutCheckDigit,R as isValidRut,E as rutSchema,m as validateRut};//# sourceMappingURL=index.js.map
1
+ var u={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[.\-\s,]/g,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=s(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let a=0;a<o.length;a++)i+=parseInt(o[a],10)*r[a%6];let n=11-i%11;return n===11?"0":n===10?"K":n.toString()}function d(e){let t=s(e);if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function R(e){let t=s(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^[1-9]\d{0,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function g(e,t){return {...c,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}export{s as cleanRut,p as formatRut,g as getErrorMessage,l as getRutCheckDigit,d as isValidRut,R as validateRut};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format","createRutSchema","options","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/zod.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function d(o){let i=c(o).replace(/k$/i,"");if(!/^\d+$/.test(i))return "";let s=[2,3,4,5,6,7],r=0,t=i.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*s[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(o,i){let s=c(o);if(s.length<2)return s;let r=s.slice(0,-1),t=s.slice(-1);return i===a.CLEAN?s:i===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(o={}){let{messages:i={},outputFormat:s}=o,r={...u,...i};return zod.z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,s))}var T=m();exports.createRutSchema=m;exports.rutSchema=T;//# sourceMappingURL=zod.cjs.map
1
+ 'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(i){let s=i.replace(/[.\-\s,]/g,"").toUpperCase();return s.replace(/^0+/,"")||s}function d(i){let s=c(i).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*o[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(i,s){let o=c(i);if(o.length<2)return o;let r=o.slice(0,-1),t=o.slice(-1);return s===a.CLEAN?o:s===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(i={}){let{messages:s={},outputFormat:o}=i,r={...u,...s};return zod.z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,o))}var T=m();exports.createRutSchema=m;exports.rutSchema=T;//# sourceMappingURL=zod.cjs.map
2
2
  //# sourceMappingURL=zod.cjs.map
package/dist/zod.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","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","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, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
package/dist/zod.js CHANGED
@@ -1,2 +1,2 @@
1
- import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function d(o){let i=c(o).replace(/k$/i,"");if(!/^\d+$/.test(i))return "";let s=[2,3,4,5,6,7],r=0,t=i.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*s[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(o,i){let s=c(o);if(s.length<2)return s;let r=s.slice(0,-1),t=s.slice(-1);return i===a.CLEAN?s:i===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(o={}){let{messages:i={},outputFormat:s}=o,r={...u,...i};return z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,s))}var T=m();export{m as createRutSchema,T as rutSchema};//# sourceMappingURL=zod.js.map
1
+ import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(i){let s=i.replace(/[.\-\s,]/g,"").toUpperCase();return s.replace(/^0+/,"")||s}function d(i){let s=c(i).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*o[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(i,s){let o=c(i);if(o.length<2)return o;let r=o.slice(0,-1),t=o.slice(-1);return s===a.CLEAN?o:s===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(i={}){let{messages:s={},outputFormat:o}=i,r={...u,...s};return z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,o))}var T=m();export{m as createRutSchema,T as rutSchema};//# sourceMappingURL=zod.js.map
2
2
  //# sourceMappingURL=zod.js.map
package/dist/zod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","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","i","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"zod.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "rut-kit",
3
- "version": "0.2.0",
4
- "description": "Chilean RUT validator with custom messages for JavaScript, TypeScript and Zod",
5
- "author": "Javier Gómez C",
3
+ "version": "0.3.0",
4
+ "description": "Validador de RUT chileno con mensajes personalizados para JavaScript, TypeScript y Zod",
5
+ "author": {
6
+ "name": "Javier Gómez Contreras",
7
+ "email": "hola@javiev.dev"
8
+ },
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/javiev/rut-kit.git"
@@ -13,13 +16,25 @@
13
16
  "homepage": "https://github.com/javiev/rut-kit",
14
17
  "keywords": [
15
18
  "rut",
19
+ "run",
16
20
  "chile",
17
21
  "chilean",
18
22
  "validation",
19
23
  "validator",
24
+ "validar",
25
+ "format",
26
+ "formatter",
27
+ "digito-verificador",
28
+ "check-digit",
20
29
  "zod",
30
+ "schema",
21
31
  "typescript",
22
- "javascript"
32
+ "javascript",
33
+ "nodejs",
34
+ "deno",
35
+ "bun",
36
+ "browser",
37
+ "esm"
23
38
  ],
24
39
  "type": "module",
25
40
  "main": "./dist/index.cjs",
@@ -36,16 +51,6 @@
36
51
  "default": "./dist/index.cjs"
37
52
  }
38
53
  },
39
- "./core": {
40
- "import": {
41
- "types": "./dist/core.d.ts",
42
- "default": "./dist/core.js"
43
- },
44
- "require": {
45
- "types": "./dist/core.d.cts",
46
- "default": "./dist/core.cjs"
47
- }
48
- },
49
54
  "./zod": {
50
55
  "import": {
51
56
  "types": "./dist/zod.d.ts",