rut-kit 0.3.0 → 0.4.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Javier Gómez Contreras
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -34,9 +34,10 @@ bun add rut-kit zod
34
34
 
35
35
  ## Características
36
36
 
37
- - **Errores Descriptivos** 🎯 - Indica qué está mal: caracteres inválidos, formato incorrecto o dígito verificador erróneo.
37
+ - **Errores Descriptivos** 🎯 - Indica qué está mal: formato incorrecto o dígito verificador erróneo.
38
38
  - **Ultraliviano** ⚡ - 960 bytes gzipped. Sin dependencias. Solo lo esencial.
39
39
  - **Multi-runtime** 🌍 - Funciona en Node.js, Bun, Edge y el navegador.
40
+ - **Agnóstico** 🔌 - Funciona con cualquier framework: React, Vue, Svelte, Angular, etc.
40
41
  - **TypeScript Nativo** 🔷 - Escrito en TypeScript. Tipos incluidos. Autocompletado completo.
41
42
  - **Integración Zod** 🛡️ - Schema listo para formularios y APIs. Valida, transforma y formatea en un paso.
42
43
 
@@ -60,7 +61,7 @@ const result = validateRut('18.972.631-0')
60
61
  // { valid: false, error: 'invalidCheckDigit' }
61
62
  ```
62
63
 
63
- Errores posibles: `invalidChars` | `invalidFormat` | `invalidCheckDigit`
64
+ Errores posibles: `invalidFormat` | `invalidCheckDigit`
64
65
 
65
66
  ### Formateo
66
67
 
@@ -90,4 +91,8 @@ const schema = createRutSchema({
90
91
 
91
92
  ## Documentación
92
93
 
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.
94
+ Visita la [documentación completa](https://rut-kit.pages.dev/) para guías detalladas e integraciones con React, Next.js, Express y más.
95
+
96
+ ## Licencia
97
+
98
+ MIT © [Javier Gómez Contreras](https://github.com/javiev)
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){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
1
+ 'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(e){let t=e.replace(/[^\dkK]/gi,"").toUpperCase();return t.replace(/^0+/,"")||t}function u(e){let t=c(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],o=0,i=t.split("").reverse();for(let n=0;n<i.length;n++)o+=parseInt(i[n],10)*r[n%6];let s=11-o%11;return s===11?"0":s===10?"K":s.toString()}function l(e){if(typeof e!="string"||e.length===0)return false;let t=/^(?:0\d|\d{1,2})\.\d{3}\.\d{3}-[\dkK]$/,r=/^0{0,2}\d{7,8}-[\dkK]$/,o=/^0{0,2}\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function x(e){if(!l(e))return false;let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)===o}function y(e){if(!l(e))return {valid:false,error:"invalidFormat"};let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...d,...t}[e]}function h(e,t){let r=c(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}exports.cleanRut=c;exports.formatRut=h;exports.getErrorMessage=M;exports.getRutCheckDigit=u;exports.isValidRut=x;exports.validateRut=y;//# sourceMappingURL=core.cjs.map
2
2
  //# sourceMappingURL=core.cjs.map
package/dist/core.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[.\\-\\s,]/g, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^[1-9]\\d{0,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[^\\dkK]/gi, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash)\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash)\n // Allows max 2 leading zeros (e.g., \"001234567-8\")\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting)\n // Allows max 2 leading zeros (e.g., \"0012345678\")\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidFormat: 'Invalid RUT format'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/core.d.cts CHANGED
@@ -1,7 +1,8 @@
1
- import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
1
+ import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-BSKDzT30.cjs';
2
2
 
3
3
  /**
4
- * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).
4
+ * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).
5
+ * This function is permissive and accepts any separator for cleaning purposes.
5
6
  * @param rut - The RUT string to clean
6
7
  * @returns The cleaned RUT string (only digits and K)
7
8
  */
@@ -14,13 +15,15 @@ declare function cleanRut(rut: string): string;
14
15
  declare function getRutCheckDigit(rut: string): string;
15
16
  /**
16
17
  * Validates a complete Chilean RUT (including check digit).
17
- * @param rut - The RUT to validate, can be formatted or clean
18
+ * Only accepts valid Chilean RUT formats.
19
+ * @param rut - The RUT to validate, must be in a valid format
18
20
  * @returns true if the RUT is valid, false otherwise
19
21
  */
20
22
  declare function isValidRut(rut: string): boolean;
21
23
  /**
22
24
  * Validates a complete Chilean RUT with detailed error information.
23
- * @param rut - The RUT to validate, can be formatted or clean
25
+ * Only accepts valid Chilean RUT formats.
26
+ * @param rut - The RUT to validate, must be in a valid format
24
27
  * @returns Validation result with cleaned RUT if valid, or error type if invalid
25
28
  * @example
26
29
  * const result = validateRut('12.345.678-5');
@@ -40,7 +43,7 @@ declare function validateRut(rut: string): RutValidationResult;
40
43
  * const result = validateRut('invalid');
41
44
  * if (!result.valid) {
42
45
  * const message = getErrorMessage(result.error, {
43
- * invalidChars: 'Invalid characters in RUT'
46
+ * invalidFormat: 'Invalid RUT format'
44
47
  * });
45
48
  * console.log(message);
46
49
  * }
package/dist/core.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.js';
1
+ import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-BSKDzT30.js';
2
2
 
3
3
  /**
4
- * Removes all formatting characters from a RUT (dots, dashes, spaces, commas).
4
+ * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).
5
+ * This function is permissive and accepts any separator for cleaning purposes.
5
6
  * @param rut - The RUT string to clean
6
7
  * @returns The cleaned RUT string (only digits and K)
7
8
  */
@@ -14,13 +15,15 @@ declare function cleanRut(rut: string): string;
14
15
  declare function getRutCheckDigit(rut: string): string;
15
16
  /**
16
17
  * Validates a complete Chilean RUT (including check digit).
17
- * @param rut - The RUT to validate, can be formatted or clean
18
+ * Only accepts valid Chilean RUT formats.
19
+ * @param rut - The RUT to validate, must be in a valid format
18
20
  * @returns true if the RUT is valid, false otherwise
19
21
  */
20
22
  declare function isValidRut(rut: string): boolean;
21
23
  /**
22
24
  * Validates a complete Chilean RUT with detailed error information.
23
- * @param rut - The RUT to validate, can be formatted or clean
25
+ * Only accepts valid Chilean RUT formats.
26
+ * @param rut - The RUT to validate, must be in a valid format
24
27
  * @returns Validation result with cleaned RUT if valid, or error type if invalid
25
28
  * @example
26
29
  * const result = validateRut('12.345.678-5');
@@ -40,7 +43,7 @@ declare function validateRut(rut: string): RutValidationResult;
40
43
  * const result = validateRut('invalid');
41
44
  * if (!result.valid) {
42
45
  * const message = getErrorMessage(result.error, {
43
- * invalidChars: 'Invalid characters in RUT'
46
+ * invalidFormat: 'Invalid RUT format'
44
47
  * });
45
48
  * console.log(message);
46
49
  * }
package/dist/core.js CHANGED
@@ -1,2 +1,2 @@
1
- var a={CLEAN:"clean",FORMATTED:"formatted"};var 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
1
+ var a={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(e){let t=e.replace(/[^\dkK]/gi,"").toUpperCase();return t.replace(/^0+/,"")||t}function u(e){let t=c(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],o=0,i=t.split("").reverse();for(let n=0;n<i.length;n++)o+=parseInt(i[n],10)*r[n%6];let s=11-o%11;return s===11?"0":s===10?"K":s.toString()}function l(e){if(typeof e!="string"||e.length===0)return false;let t=/^(?:0\d|\d{1,2})\.\d{3}\.\d{3}-[\dkK]$/,r=/^0{0,2}\d{7,8}-[\dkK]$/,o=/^0{0,2}\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function x(e){if(!l(e))return false;let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)===o}function y(e){if(!l(e))return {valid:false,error:"invalidFormat"};let t=c(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return u(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...d,...t}[e]}function h(e,t){let r=c(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}export{c as cleanRut,h as formatRut,M as getErrorMessage,u as getRutCheckDigit,x as isValidRut,y as validateRut};//# sourceMappingURL=core.js.map
2
2
  //# sourceMappingURL=core.js.map
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[^\\dkK]/gi, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash)\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash)\n // Allows max 2 leading zeros (e.g., \"001234567-8\")\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting)\n // Allows max 2 leading zeros (e.g., \"0012345678\")\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidFormat: 'Invalid RUT format'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var 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
1
+ 'use strict';var u={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[^\dkK]/gi,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=s(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],o=0,i=t.split("").reverse();for(let a=0;a<i.length;a++)o+=parseInt(i[a],10)*r[a%6];let n=11-o%11;return n===11?"0":n===10?"K":n.toString()}function c(e){if(typeof e!="string"||e.length===0)return false;let t=/^(?:0\d|\d{1,2})\.\d{3}\.\d{3}-[\dkK]$/,r=/^0{0,2}\d{7,8}-[\dkK]$/,o=/^0{0,2}\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function g(e){if(!c(e))return false;let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)===o}function R(e){if(!c(e))return {valid:false,error:"invalidFormat"};let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(e,t){return {...d,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}exports.cleanRut=s;exports.formatRut=p;exports.getErrorMessage=f;exports.getRutCheckDigit=l;exports.isValidRut=g;exports.validateRut=R;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
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":"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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[^\\dkK]/gi, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash)\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash)\n // Allows max 2 leading zeros (e.g., \"001234567-8\")\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting)\n // Allows max 2 leading zeros (e.g., \"0012345678\")\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidFormat: 'Invalid RUT format'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.cjs';
2
- export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
2
+ export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-BSKDzT30.cjs';
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.js';
2
- export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.js';
2
+ export { R as RutErrorMessages, a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-BSKDzT30.js';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 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
1
+ var u={CLEAN:"clean",FORMATTED:"formatted"};var d={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function s(e){let t=e.replace(/[^\dkK]/gi,"").toUpperCase();return t.replace(/^0+/,"")||t}function l(e){let t=s(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],o=0,i=t.split("").reverse();for(let a=0;a<i.length;a++)o+=parseInt(i[a],10)*r[a%6];let n=11-o%11;return n===11?"0":n===10?"K":n.toString()}function c(e){if(typeof e!="string"||e.length===0)return false;let t=/^(?:0\d|\d{1,2})\.\d{3}\.\d{3}-[\dkK]$/,r=/^0{0,2}\d{7,8}-[\dkK]$/,o=/^0{0,2}\d{7,8}[\dkK]$/;return t.test(e)||r.test(e)||o.test(e)}function g(e){if(!c(e))return false;let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)===o}function R(e){if(!c(e))return {valid:false,error:"invalidFormat"};let t=s(e);if(!/^[1-9]\d{6,7}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),o=t.slice(-1).toUpperCase();return l(r)!==o?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(e,t){return {...d,...t}[e]}function p(e,t){let r=s(e);if(r.length<2)return r;let o=r.slice(0,-1),i=r.slice(-1);return t===u.CLEAN?r:t===u.FORMATTED?`${o.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${i}`:`${o}-${i}`}export{s as cleanRut,p as formatRut,f as getErrorMessage,l as getRutCheckDigit,g as isValidRut,R as validateRut};//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","i","remainder","isValidRutFormat","withDotsRegex","withDashRegex","cleanRegex","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[^\\dkK]/gi, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash)\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash)\n // Allows max 2 leading zeros (e.g., \"001234567-8\")\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting)\n // Allows max 2 leading zeros (e.g., \"0012345678\")\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidFormat: 'Invalid RUT format'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Error types that can occur during RUT validation.
3
3
  */
4
- type RutValidationError = 'invalidChars' | 'invalidFormat' | 'invalidCheckDigit';
4
+ type RutValidationError = 'invalidFormat' | 'invalidCheckDigit';
5
5
  /**
6
6
  * Output format for RUT formatting.
7
7
  * - clean: No dots, no dash (e.g., "123456789")
@@ -25,7 +25,6 @@ type RutValidationResult = {
25
25
  */
26
26
  type RutErrorMessages = {
27
27
  required?: string;
28
- invalidChars?: string;
29
28
  invalidFormat?: string;
30
29
  invalidCheckDigit?: string;
31
30
  };
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Error types that can occur during RUT validation.
3
3
  */
4
- type RutValidationError = 'invalidChars' | 'invalidFormat' | 'invalidCheckDigit';
4
+ type RutValidationError = 'invalidFormat' | 'invalidCheckDigit';
5
5
  /**
6
6
  * Output format for RUT formatting.
7
7
  * - clean: No dots, no dash (e.g., "123456789")
@@ -25,7 +25,6 @@ type RutValidationResult = {
25
25
  */
26
26
  type RutErrorMessages = {
27
27
  required?: string;
28
- invalidChars?: string;
29
28
  invalidFormat?: string;
30
29
  invalidCheckDigit?: string;
31
30
  };
package/dist/zod.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",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
1
+ 'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(n){let s=n.replace(/[^\dkK]/gi,"").toUpperCase();return s.replace(/^0+/,"")||s}function l(n){let s=c(n).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let i=0;i<t.length;i++)r+=parseInt(t[i],10)*o[i%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function g(n,s){let o=c(n);if(o.length<2)return o;let r=o.slice(0,-1),t=o.slice(-1);return s===a.CLEAN?o:s===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function f(n={}){let{messages:s={},outputFormat:o}=n,r={...u,...s};return zod.z.string({error:r.required}).min(1,{error:r.required}).check(t=>{let e=t.value,i=/^(?:0\d|\d{1,2})\.\d{3}\.\d{3}-[\dkK]$/,d=/^0{0,2}\d{7,8}-[\dkK]$/,p=/^0{0,2}\d{7,8}[\dkK]$/;if(!i.test(e)&&!d.test(e)&&!p.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[1-9]\d{6,7}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let i=e.slice(0,-1),d=e.slice(-1).toUpperCase();l(i)!==d&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>g(t,o))}var $=f();exports.createRutSchema=f;exports.rutSchema=$;//# sourceMappingURL=zod.cjs.map
2
2
  //# sourceMappingURL=zod.cjs.map
package/dist/zod.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","ctx","val","withDotsRegex","withDashRegex","cleanRegex","rutSchema"],"mappings":"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","file":"zod.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[^\\dkK]/gi, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash)\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash)\n // Allows max 2 leading zeros (e.g., \"001234567-8\")\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting)\n // Allows max 2 leading zeros (e.g., \"0012345678\")\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidFormat: 'Invalid RUT format'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\n/**\n * Creates a customizable Zod schema for validating Chilean RUTs.\n *\n * Validates format (strict), structure, and check digit. Returns the RUT in the specified format.\n *\n * @param options - Configuration options\n * @param options.messages - Custom error messages for validation errors\n * @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)\n * @returns A Zod schema that validates and formats RUTs\n *\n * @example\n * // Default schema\n * const schema = createRutSchema()\n * schema.parse('189726317') // \"18972631-7\"\n *\n * @example\n * // With custom messages\n * const schema = createRutSchema({\n * messages: {\n * required: 'RUT es obligatorio',\n * invalidFormat: 'Formato de RUT incorrecto'\n * }\n * })\n *\n * @example\n * // With custom output format\n * const schema = createRutSchema({ outputFormat: 'formatted' })\n * schema.parse('189726317') // \"18.972.631-7\"\n */\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .check((ctx) => {\n const val = ctx.value;\n\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n if (!withDotsRegex.test(val) && !withDashRegex.test(val) && !cleanRegex.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
package/dist/zod.d.cts CHANGED
@@ -1,11 +1,40 @@
1
1
  import { z } from 'zod';
2
- import { R as RutErrorMessages, a as RutOutputFormat } from './types-Bd2Yz_p4.cjs';
2
+ import { R as RutErrorMessages, a as RutOutputFormat } from './types-BSKDzT30.cjs';
3
3
 
4
4
  type RutMessages = RutErrorMessages;
5
5
  interface RutSchemaOptions {
6
6
  messages?: RutMessages;
7
7
  outputFormat?: RutOutputFormat;
8
8
  }
9
+ /**
10
+ * Creates a customizable Zod schema for validating Chilean RUTs.
11
+ *
12
+ * Validates format (strict), structure, and check digit. Returns the RUT in the specified format.
13
+ *
14
+ * @param options - Configuration options
15
+ * @param options.messages - Custom error messages for validation errors
16
+ * @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)
17
+ * @returns A Zod schema that validates and formats RUTs
18
+ *
19
+ * @example
20
+ * // Default schema
21
+ * const schema = createRutSchema()
22
+ * schema.parse('189726317') // "18972631-7"
23
+ *
24
+ * @example
25
+ * // With custom messages
26
+ * const schema = createRutSchema({
27
+ * messages: {
28
+ * required: 'RUT es obligatorio',
29
+ * invalidFormat: 'Formato de RUT incorrecto'
30
+ * }
31
+ * })
32
+ *
33
+ * @example
34
+ * // With custom output format
35
+ * const schema = createRutSchema({ outputFormat: 'formatted' })
36
+ * schema.parse('189726317') // "18.972.631-7"
37
+ */
9
38
  declare function createRutSchema(options?: RutSchemaOptions): z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
10
39
  declare const rutSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
11
40
 
package/dist/zod.d.ts CHANGED
@@ -1,11 +1,40 @@
1
1
  import { z } from 'zod';
2
- import { R as RutErrorMessages, a as RutOutputFormat } from './types-Bd2Yz_p4.js';
2
+ import { R as RutErrorMessages, a as RutOutputFormat } from './types-BSKDzT30.js';
3
3
 
4
4
  type RutMessages = RutErrorMessages;
5
5
  interface RutSchemaOptions {
6
6
  messages?: RutMessages;
7
7
  outputFormat?: RutOutputFormat;
8
8
  }
9
+ /**
10
+ * Creates a customizable Zod schema for validating Chilean RUTs.
11
+ *
12
+ * Validates format (strict), structure, and check digit. Returns the RUT in the specified format.
13
+ *
14
+ * @param options - Configuration options
15
+ * @param options.messages - Custom error messages for validation errors
16
+ * @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)
17
+ * @returns A Zod schema that validates and formats RUTs
18
+ *
19
+ * @example
20
+ * // Default schema
21
+ * const schema = createRutSchema()
22
+ * schema.parse('189726317') // "18972631-7"
23
+ *
24
+ * @example
25
+ * // With custom messages
26
+ * const schema = createRutSchema({
27
+ * messages: {
28
+ * required: 'RUT es obligatorio',
29
+ * invalidFormat: 'Formato de RUT incorrecto'
30
+ * }
31
+ * })
32
+ *
33
+ * @example
34
+ * // With custom output format
35
+ * const schema = createRutSchema({ outputFormat: 'formatted' })
36
+ * schema.parse('189726317') // "18.972.631-7"
37
+ */
9
38
  declare function createRutSchema(options?: RutSchemaOptions): z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
10
39
  declare const rutSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
11
40
 
package/dist/zod.js CHANGED
@@ -1,2 +1,2 @@
1
- import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",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
1
+ import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(n){let s=n.replace(/[^\dkK]/gi,"").toUpperCase();return s.replace(/^0+/,"")||s}function l(n){let s=c(n).replace(/k$/i,"");if(!/^\d+$/.test(s))return "";let o=[2,3,4,5,6,7],r=0,t=s.split("").reverse();for(let i=0;i<t.length;i++)r+=parseInt(t[i],10)*o[i%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function g(n,s){let o=c(n);if(o.length<2)return o;let r=o.slice(0,-1),t=o.slice(-1);return s===a.CLEAN?o:s===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function f(n={}){let{messages:s={},outputFormat:o}=n,r={...u,...s};return z.string({error:r.required}).min(1,{error:r.required}).check(t=>{let e=t.value,i=/^(?:0\d|\d{1,2})\.\d{3}\.\d{3}-[\dkK]$/,d=/^0{0,2}\d{7,8}-[\dkK]$/,p=/^0{0,2}\d{7,8}[\dkK]$/;if(!i.test(e)&&!d.test(e)&&!p.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[1-9]\d{6,7}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let i=e.slice(0,-1),d=e.slice(-1).toUpperCase();l(i)!==d&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>g(t,o))}var $=f();export{f as createRutSchema,$ as rutSchema};//# sourceMappingURL=zod.js.map
2
2
  //# sourceMappingURL=zod.js.map
package/dist/zod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","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"]}
1
+ {"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","cleaned","getRutCheckDigit","weights","sum","digits","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","ctx","val","withDotsRegex","withDashRegex","cleanRegex","rutSchema"],"mappings":"oBAMO,IAAMA,CAAAA,CAAa,CAKxB,KAAA,CAAO,OAAA,CAKP,SAAA,CAAW,WACb,ECZO,IAAMC,CAAAA,CAAmD,CAC9D,QAAA,CAAU,kBAAA,CACV,cAAe,4BAAA,CACf,iBAAA,CAAmB,kCACrB,CAAA,CCMO,SAASC,CAAAA,CAASC,CAAAA,CAAqB,CAC5C,IAAMC,EAAUD,CAAAA,CAAI,OAAA,CAAQ,WAAA,CAAa,EAAE,EAAE,WAAA,EAAY,CACzD,OAAOC,CAAAA,CAAQ,OAAA,CAAQ,MAAO,EAAE,CAAA,EAAKA,CACvC,CAOO,SAASC,CAAAA,CAAiBF,CAAAA,CAAqB,CACpD,IAAMC,EAAUF,CAAAA,CAASC,CAAG,CAAA,CAAE,OAAA,CAAQ,MAAO,EAAE,CAAA,CAE/C,GAAI,CAAC,OAAA,CAAQ,KAAKC,CAAO,CAAA,CACvB,OAAO,EAAA,CAGT,IAAME,CAAAA,CAAU,CAAC,CAAA,CAAG,CAAA,CAAG,EAAG,CAAA,CAAG,CAAA,CAAG,CAAC,CAAA,CAC7BC,EAAM,CAAA,CAEJC,CAAAA,CAASJ,EAAQ,KAAA,CAAM,EAAE,EAAE,OAAA,EAAQ,CACzC,IAAA,IAAS,CAAA,CAAI,EAAG,CAAA,CAAII,CAAAA,CAAO,MAAA,CAAQ,CAAA,EAAA,CACjCD,GAAO,QAAA,CAASC,CAAAA,CAAO,CAAC,CAAA,CAAG,EAAE,CAAA,CAAIF,CAAAA,CAAQ,EAAI,CAAC,CAAA,CAGhD,IAAMG,CAAAA,CAAY,EAAA,CAAMF,CAAAA,CAAM,EAAA,CAE9B,OAAIE,CAAAA,GAAc,EAAA,CAAW,GAAA,CACzBA,CAAAA,GAAc,GAAW,GAAA,CACtBA,CAAAA,CAAU,QAAA,EACnB,CAmHO,SAASC,CAAAA,CAAUP,EAAaQ,CAAAA,CAAkC,CACvE,IAAMP,CAAAA,CAAUF,CAAAA,CAASC,CAAG,CAAA,CAE5B,GAAIC,CAAAA,CAAQ,MAAA,CAAS,CAAA,CACnB,OAAOA,EAGT,IAAMQ,CAAAA,CAAOR,CAAAA,CAAQ,KAAA,CAAM,EAAG,EAAE,CAAA,CAC1BS,EAAaT,CAAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,CAEnC,OAAIO,CAAAA,GAAWX,CAAAA,CAAW,MACjBI,CAAAA,CAGLO,CAAAA,GAAWX,CAAAA,CAAW,SAAA,CAEjB,GADeY,CAAAA,CAAK,OAAA,CAAQ,uBAAA,CAAyB,GAAG,CACxC,CAAA,CAAA,EAAIC,CAAU,GAIhC,CAAA,EAAGD,CAAI,IAAIC,CAAU,CAAA,CAC9B,CC7IO,SAASC,EAAgBC,CAAAA,CAA4B,EAAC,CAAG,CAC9D,GAAM,CAAE,QAAA,CAAAC,CAAAA,CAAW,GAAI,YAAA,CAAAC,CAAa,EAAIF,CAAAA,CAClCG,CAAAA,CAAO,CAAE,GAAGjB,CAAAA,CAAsB,GAAGe,CAAS,EAEpD,OAAOG,CAAAA,CACJ,MAAA,CAAO,CAAE,MAAOD,CAAAA,CAAK,QAAS,CAAC,CAAA,CAC/B,IAAI,CAAA,CAAG,CAAE,MAAOA,CAAAA,CAAK,QAAS,CAAC,CAAA,CAC/B,KAAA,CAAOE,CAAAA,EAAQ,CACd,IAAMC,CAAAA,CAAMD,CAAAA,CAAI,KAAA,CAGVE,CAAAA,CAAgB,yCAChBC,CAAAA,CAAgB,wBAAA,CAChBC,CAAAA,CAAa,uBAAA,CAEnB,GAAI,CAACF,CAAAA,CAAc,KAAKD,CAAG,CAAA,EAAK,CAACE,CAAAA,CAAc,IAAA,CAAKF,CAAG,CAAA,EAAK,CAACG,CAAAA,CAAW,IAAA,CAAKH,CAAG,CAAA,CAAG,CACjFD,CAAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CACd,KAAM,QAAA,CACN,OAAA,CAASF,EAAK,aAAA,CACd,KAAA,CAAOG,CACT,CAAC,CAAA,CACD,MACF,CACF,CAAC,CAAA,CACA,SAAA,CAAWA,CAAAA,EAAQnB,CAAAA,CAASmB,CAAG,CAAC,CAAA,CAChC,KAAA,CAAOD,CAAAA,EAAQ,CACd,IAAMC,CAAAA,CAAMD,EAAI,KAAA,CAEhB,GAAI,CAAC,sBAAA,CAAuB,IAAA,CAAKC,CAAG,CAAA,CAAG,CACrCD,CAAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CACd,KAAM,QAAA,CACN,OAAA,CAASF,CAAAA,CAAK,aAAA,CACd,MAAOG,CACT,CAAC,EACD,MACF,CAEA,IAAMT,CAAAA,CAAOS,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,EAAE,CAAA,CACtBR,CAAAA,CAAaQ,CAAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,WAAA,EAAY,CAEzChB,CAAAA,CAAiBO,CAAI,CAAA,GAAMC,CAAAA,EAC7BO,EAAI,MAAA,CAAO,IAAA,CAAK,CACd,IAAA,CAAM,QAAA,CACN,OAAA,CAASF,CAAAA,CAAK,kBACd,KAAA,CAAOG,CACT,CAAC,EAEL,CAAC,CAAA,CACA,SAAA,CAAWA,CAAAA,EAAQX,CAAAA,CAAUW,EAAKJ,CAAY,CAAC,CACpD,CAEO,IAAMQ,EAAYX,CAAAA","file":"zod.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces, commas, asterisks, etc).\n * This function is permissive and accepts any separator for cleaning purposes.\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n const cleaned = rut.replace(/[^\\dkK]/gi, '').toUpperCase();\n return cleaned.replace(/^0+/, '') || cleaned;\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates if a RUT string has a valid Chilean RUT format.\n * Accepts only these formats:\n * - XX.XXX.XXX-X (with dots and dash) - allows leading zeros\n * - XXXXXXXX-X (without dots, with dash) - allows leading zeros\n * - XXXXXXXXX (no formatting) - allows leading zeros\n * @param rut - The RUT string to validate format\n * @returns true if the format is valid, false otherwise\n */\nfunction isValidRutFormat(rut: string): boolean {\n if (typeof rut !== 'string' || rut.length === 0) {\n return false;\n }\n\n // Format: XX.XXX.XXX-X or X.XXX.XXX-X (with dots and dash)\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n // Format: XXXXXXXX-X or XXXXXXX-X (without dots, with dash)\n // Allows max 2 leading zeros (e.g., \"001234567-8\")\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n // Format: XXXXXXXXX or XXXXXXXX (no formatting)\n // Allows max 2 leading zeros (e.g., \"0012345678\")\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n return withDotsRegex.test(rut) || withDashRegex.test(rut) || cleanRegex.test(rut);\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n if (!isValidRutFormat(rut)) {\n return false;\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * Only accepts valid Chilean RUT formats.\n * @param rut - The RUT to validate, must be in a valid format\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n if (!isValidRutFormat(rut)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const cleaned = cleanRut(rut);\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidFormat: 'Invalid RUT format'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\n/**\n * Creates a customizable Zod schema for validating Chilean RUTs.\n *\n * Validates format (strict), structure, and check digit. Returns the RUT in the specified format.\n *\n * @param options - Configuration options\n * @param options.messages - Custom error messages for validation errors\n * @param options.outputFormat - Output format: 'formatted' (XX.XXX.XXX-X), 'clean' (XXXXXXXXX), or default (XXXXXXXX-X)\n * @returns A Zod schema that validates and formats RUTs\n *\n * @example\n * // Default schema\n * const schema = createRutSchema()\n * schema.parse('189726317') // \"18972631-7\"\n *\n * @example\n * // With custom messages\n * const schema = createRutSchema({\n * messages: {\n * required: 'RUT es obligatorio',\n * invalidFormat: 'Formato de RUT incorrecto'\n * }\n * })\n *\n * @example\n * // With custom output format\n * const schema = createRutSchema({ outputFormat: 'formatted' })\n * schema.parse('189726317') // \"18.972.631-7\"\n */\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .check((ctx) => {\n const val = ctx.value;\n\n // Allows max 1 leading zero: either 0X (e.g., \"01.234.567-8\") or 1-2 digits without leading zero\n const withDotsRegex = /^(?:0\\d|\\d{1,2})\\.\\d{3}\\.\\d{3}-[\\dkK]$/;\n const withDashRegex = /^0{0,2}\\d{7,8}-[\\dkK]$/;\n const cleanRegex = /^0{0,2}\\d{7,8}[\\dkK]$/;\n\n if (!withDotsRegex.test(val) && !withDashRegex.test(val) && !cleanRegex.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[1-9]\\d{6,7}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rut-kit",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "Validador de RUT chileno con mensajes personalizados para JavaScript, TypeScript y Zod",
5
5
  "author": {
6
6
  "name": "Javier Gómez Contreras",
@@ -13,7 +13,7 @@
13
13
  "bugs": {
14
14
  "url": "https://github.com/javiev/rut-kit/issues"
15
15
  },
16
- "homepage": "https://github.com/javiev/rut-kit",
16
+ "homepage": "https://rut-kit.pages.dev/",
17
17
  "keywords": [
18
18
  "rut",
19
19
  "run",
@@ -62,6 +62,7 @@
62
62
  }
63
63
  }
64
64
  },
65
+ "license": "MIT",
65
66
  "files": [
66
67
  "dist"
67
68
  ],
@@ -72,10 +73,7 @@
72
73
  "node": ">=18.13.0"
73
74
  },
74
75
  "devDependencies": {
75
- "@biomejs/biome": "2.3.11",
76
76
  "@vitest/coverage-v8": "^4.0.16",
77
- "husky": "^9.1.7",
78
- "lint-staged": "^16.2.7",
79
77
  "tsup": "^8.5.1",
80
78
  "typescript": "^5.9.3",
81
79
  "vitest": "^4.0.16",