rut-kit 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core.cjs +2 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +61 -0
- package/dist/core.d.ts +61 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/types-Bd2Yz_p4.d.cts +33 -0
- package/dist/types-Bd2Yz_p4.d.ts +33 -0
- package/dist/zod.cjs +2 -0
- package/dist/zod.cjs.map +1 -0
- package/dist/zod.d.cts +12 -0
- package/dist/zod.d.ts +12 -0
- package/dist/zod.js +2 -0
- package/dist/zod.js.map +1 -0
- package/package.json +96 -0
package/dist/core.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){return e.replace(/[.\-\s]/g,"").toUpperCase()}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}exports.cleanRut=u;exports.formatRut=y;exports.getErrorMessage=M;exports.getRutCheckDigit=l;exports.isValidRut=E;exports.validateRut=v;//# sourceMappingURL=core.cjs.map
|
|
2
|
+
//# sourceMappingURL=core.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
|
package/dist/core.d.cts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Removes all formatting characters from a RUT (dots, dashes, spaces).
|
|
5
|
+
* @param rut - The RUT string to clean
|
|
6
|
+
* @returns The cleaned RUT string (only digits and K)
|
|
7
|
+
*/
|
|
8
|
+
declare function cleanRut(rut: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.
|
|
11
|
+
* @param rut - The RUT body (without check digit), can be formatted or clean
|
|
12
|
+
* @returns The calculated check digit ("0"-"9" or "K")
|
|
13
|
+
*/
|
|
14
|
+
declare function getRutCheckDigit(rut: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Validates a complete Chilean RUT (including check digit).
|
|
17
|
+
* @param rut - The RUT to validate, can be formatted or clean
|
|
18
|
+
* @returns true if the RUT is valid, false otherwise
|
|
19
|
+
*/
|
|
20
|
+
declare function isValidRut(rut: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Validates a complete Chilean RUT with detailed error information.
|
|
23
|
+
* @param rut - The RUT to validate, can be formatted or clean
|
|
24
|
+
* @returns Validation result with cleaned RUT if valid, or error type if invalid
|
|
25
|
+
* @example
|
|
26
|
+
* const result = validateRut('12.345.678-5');
|
|
27
|
+
* if (result.valid) {
|
|
28
|
+
* console.log(result.rut); // '123456785'
|
|
29
|
+
* } else {
|
|
30
|
+
* console.log(result.error); // 'invalidCheckDigit'
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
declare function validateRut(rut: string): RutValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Gets a custom error message for a validation error.
|
|
36
|
+
* @param error - The validation error type
|
|
37
|
+
* @param messages - Optional custom error messages
|
|
38
|
+
* @returns The error message
|
|
39
|
+
* @example
|
|
40
|
+
* const result = validateRut('invalid');
|
|
41
|
+
* if (!result.valid) {
|
|
42
|
+
* const message = getErrorMessage(result.error, {
|
|
43
|
+
* invalidChars: 'Invalid characters in RUT'
|
|
44
|
+
* });
|
|
45
|
+
* console.log(message);
|
|
46
|
+
* }
|
|
47
|
+
*/
|
|
48
|
+
declare function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string;
|
|
49
|
+
/**
|
|
50
|
+
* Formats a RUT according to the specified format.
|
|
51
|
+
* @param rut - The RUT to format
|
|
52
|
+
* @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)
|
|
53
|
+
* @returns The formatted RUT string
|
|
54
|
+
* @example
|
|
55
|
+
* formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)
|
|
56
|
+
* formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)
|
|
57
|
+
* formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)
|
|
58
|
+
*/
|
|
59
|
+
declare function formatRut(rut: string, format?: RutOutputFormat): string;
|
|
60
|
+
|
|
61
|
+
export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut };
|
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { a as RutOutputFormat, b as RutValidationError, R as RutErrorMessages, c as RutValidationResult } from './types-Bd2Yz_p4.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Removes all formatting characters from a RUT (dots, dashes, spaces).
|
|
5
|
+
* @param rut - The RUT string to clean
|
|
6
|
+
* @returns The cleaned RUT string (only digits and K)
|
|
7
|
+
*/
|
|
8
|
+
declare function cleanRut(rut: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.
|
|
11
|
+
* @param rut - The RUT body (without check digit), can be formatted or clean
|
|
12
|
+
* @returns The calculated check digit ("0"-"9" or "K")
|
|
13
|
+
*/
|
|
14
|
+
declare function getRutCheckDigit(rut: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Validates a complete Chilean RUT (including check digit).
|
|
17
|
+
* @param rut - The RUT to validate, can be formatted or clean
|
|
18
|
+
* @returns true if the RUT is valid, false otherwise
|
|
19
|
+
*/
|
|
20
|
+
declare function isValidRut(rut: string): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Validates a complete Chilean RUT with detailed error information.
|
|
23
|
+
* @param rut - The RUT to validate, can be formatted or clean
|
|
24
|
+
* @returns Validation result with cleaned RUT if valid, or error type if invalid
|
|
25
|
+
* @example
|
|
26
|
+
* const result = validateRut('12.345.678-5');
|
|
27
|
+
* if (result.valid) {
|
|
28
|
+
* console.log(result.rut); // '123456785'
|
|
29
|
+
* } else {
|
|
30
|
+
* console.log(result.error); // 'invalidCheckDigit'
|
|
31
|
+
* }
|
|
32
|
+
*/
|
|
33
|
+
declare function validateRut(rut: string): RutValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Gets a custom error message for a validation error.
|
|
36
|
+
* @param error - The validation error type
|
|
37
|
+
* @param messages - Optional custom error messages
|
|
38
|
+
* @returns The error message
|
|
39
|
+
* @example
|
|
40
|
+
* const result = validateRut('invalid');
|
|
41
|
+
* if (!result.valid) {
|
|
42
|
+
* const message = getErrorMessage(result.error, {
|
|
43
|
+
* invalidChars: 'Invalid characters in RUT'
|
|
44
|
+
* });
|
|
45
|
+
* console.log(message);
|
|
46
|
+
* }
|
|
47
|
+
*/
|
|
48
|
+
declare function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string;
|
|
49
|
+
/**
|
|
50
|
+
* Formats a RUT according to the specified format.
|
|
51
|
+
* @param rut - The RUT to format
|
|
52
|
+
* @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)
|
|
53
|
+
* @returns The formatted RUT string
|
|
54
|
+
* @example
|
|
55
|
+
* formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)
|
|
56
|
+
* formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)
|
|
57
|
+
* formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)
|
|
58
|
+
*/
|
|
59
|
+
declare function formatRut(rut: string, format?: RutOutputFormat): string;
|
|
60
|
+
|
|
61
|
+
export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut };
|
package/dist/core.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var a={CLEAN:"clean",FORMATTED:"formatted"};var c={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function u(e){return e.replace(/[.\-\s]/g,"").toUpperCase()}function l(e){let t=u(e).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],i=0,o=t.split("").reverse();for(let n=0;n<o.length;n++)i+=parseInt(o[n],10)*r[n%6];let s=11-i%11;return s===11?"0":s===10?"K":s.toString()}function E(e){let t=u(e);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)===i}function v(e){let t=u(e);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),i=t.slice(-1).toUpperCase();return l(r)!==i?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function M(e,t){return {...c,...t}[e]}function y(e,t){let r=u(e);if(r.length<2)return r;let i=r.slice(0,-1),o=r.slice(-1);return t===a.CLEAN?r:t===a.FORMATTED?`${i.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${o}`:`${i}-${o}`}export{u as cleanRut,y as formatRut,M as getErrorMessage,l as getRutCheckDigit,E as isValidRut,v as validateRut};//# sourceMappingURL=core.js.map
|
|
2
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format"],"mappings":"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","file":"core.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n"]}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var zod=require('zod');var d={CLEAN:"clean",FORMATTED:"formatted"};var n={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function a(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function c(o){let t=a(o).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],e=0,s=t.split("").reverse();for(let u=0;u<s.length;u++)e+=parseInt(s[u],10)*r[u%6];let i=11-e%11;return i===11?"0":i===10?"K":i.toString()}function R(o){let t=a(o);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)===e}function m(o){let t=a(o);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)!==e?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(o,t){return {...n,...t}[o]}function p(o,t){let r=a(o);if(r.length<2)return r;let e=r.slice(0,-1),s=r.slice(-1);return t===d.CLEAN?r:t===d.FORMATTED?`${e.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${s}`:`${e}-${s}`}function l(o={}){let{messages:t={},outputFormat:r}=o,e={...n,...t};return zod.z.string({error:e.required}).min(1,{error:e.required}).transform(s=>a(s)).check(s=>{let i=s.value;if(!/^[\dkK]+$/.test(i)){s.issues.push({code:"custom",message:e.invalidChars,input:i});return}if(!/^\d{1,8}[\dkK]$/.test(i)){s.issues.push({code:"custom",message:e.invalidFormat,input:i});return}let u=i.slice(0,-1),g=i.slice(-1).toUpperCase();c(u)!==g&&s.issues.push({code:"custom",message:e.invalidCheckDigit,input:i});}).transform(s=>p(s,r))}var E=l();exports.cleanRut=a;exports.createRutSchema=l;exports.defaultErrorMessages=n;exports.formatRut=p;exports.getErrorMessage=f;exports.getRutCheckDigit=c;exports.isValidRut=R;exports.rutSchema=E;exports.validateRut=m;//# sourceMappingURL=index.cjs.map
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format","createRutSchema","options","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.cjs';
|
|
2
|
+
import { R as RutErrorMessages } from './types-Bd2Yz_p4.cjs';
|
|
3
|
+
export { a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.cjs';
|
|
4
|
+
export { RutMessages, createRutSchema, rutSchema } from './zod.cjs';
|
|
5
|
+
import 'zod';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Default error messages in Spanish.
|
|
9
|
+
*/
|
|
10
|
+
declare const defaultErrorMessages: Required<RutErrorMessages>;
|
|
11
|
+
|
|
12
|
+
export { RutErrorMessages, defaultErrorMessages };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { cleanRut, formatRut, getErrorMessage, getRutCheckDigit, isValidRut, validateRut } from './core.js';
|
|
2
|
+
import { R as RutErrorMessages } from './types-Bd2Yz_p4.js';
|
|
3
|
+
export { a as RutOutputFormat, b as RutValidationError, c as RutValidationResult } from './types-Bd2Yz_p4.js';
|
|
4
|
+
export { RutMessages, createRutSchema, rutSchema } from './zod.js';
|
|
5
|
+
import 'zod';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Default error messages in Spanish.
|
|
9
|
+
*/
|
|
10
|
+
declare const defaultErrorMessages: Required<RutErrorMessages>;
|
|
11
|
+
|
|
12
|
+
export { RutErrorMessages, defaultErrorMessages };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {z}from'zod';var d={CLEAN:"clean",FORMATTED:"formatted"};var n={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function a(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function c(o){let t=a(o).replace(/k$/i,"");if(!/^\d+$/.test(t))return "";let r=[2,3,4,5,6,7],e=0,s=t.split("").reverse();for(let u=0;u<s.length;u++)e+=parseInt(s[u],10)*r[u%6];let i=11-e%11;return i===11?"0":i===10?"K":i.toString()}function R(o){let t=a(o);if(!/^\d{1,8}[\dkK]$/.test(t))return false;let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)===e}function m(o){let t=a(o);if(!/^[\dkK]+$/.test(t))return {valid:false,error:"invalidChars"};if(!/^\d{1,8}[\dkK]$/.test(t))return {valid:false,error:"invalidFormat"};let r=t.slice(0,-1),e=t.slice(-1).toUpperCase();return c(r)!==e?{valid:false,error:"invalidCheckDigit"}:{valid:true,rut:t}}function f(o,t){return {...n,...t}[o]}function p(o,t){let r=a(o);if(r.length<2)return r;let e=r.slice(0,-1),s=r.slice(-1);return t===d.CLEAN?r:t===d.FORMATTED?`${e.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${s}`:`${e}-${s}`}function l(o={}){let{messages:t={},outputFormat:r}=o,e={...n,...t};return z.string({error:e.required}).min(1,{error:e.required}).transform(s=>a(s)).check(s=>{let i=s.value;if(!/^[\dkK]+$/.test(i)){s.issues.push({code:"custom",message:e.invalidChars,input:i});return}if(!/^\d{1,8}[\dkK]$/.test(i)){s.issues.push({code:"custom",message:e.invalidFormat,input:i});return}let u=i.slice(0,-1),g=i.slice(-1).toUpperCase();c(u)!==g&&s.issues.push({code:"custom",message:e.invalidCheckDigit,input:i});}).transform(s=>p(s,r))}var E=l();export{a as cleanRut,l as createRutSchema,n as defaultErrorMessages,p as formatRut,f as getErrorMessage,c as getRutCheckDigit,R as isValidRut,E as rutSchema,m as validateRut};//# sourceMappingURL=index.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","isValidRut","body","checkDigit","validateRut","getErrorMessage","error","messages","formatRut","format","createRutSchema","options","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error types that can occur during RUT validation.
|
|
3
|
+
*/
|
|
4
|
+
type RutValidationError = 'invalidChars' | 'invalidFormat' | 'invalidCheckDigit';
|
|
5
|
+
/**
|
|
6
|
+
* Output format for RUT formatting.
|
|
7
|
+
* - clean: No dots, no dash (e.g., "123456789")
|
|
8
|
+
* - formatted: With dots and dash (e.g., "12.345.678-9")
|
|
9
|
+
*
|
|
10
|
+
* Default (when not specified): No dots, with dash (e.g., "12345678-9") - Recommended for storage
|
|
11
|
+
*/
|
|
12
|
+
type RutOutputFormat = 'clean' | 'formatted';
|
|
13
|
+
/**
|
|
14
|
+
* Result of RUT validation with detailed error information.
|
|
15
|
+
*/
|
|
16
|
+
type RutValidationResult = {
|
|
17
|
+
valid: true;
|
|
18
|
+
rut: string;
|
|
19
|
+
} | {
|
|
20
|
+
valid: false;
|
|
21
|
+
error: RutValidationError;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Custom error messages for RUT validation.
|
|
25
|
+
*/
|
|
26
|
+
type RutErrorMessages = {
|
|
27
|
+
required?: string;
|
|
28
|
+
invalidChars?: string;
|
|
29
|
+
invalidFormat?: string;
|
|
30
|
+
invalidCheckDigit?: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type { RutErrorMessages as R, RutOutputFormat as a, RutValidationError as b, RutValidationResult as c };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error types that can occur during RUT validation.
|
|
3
|
+
*/
|
|
4
|
+
type RutValidationError = 'invalidChars' | 'invalidFormat' | 'invalidCheckDigit';
|
|
5
|
+
/**
|
|
6
|
+
* Output format for RUT formatting.
|
|
7
|
+
* - clean: No dots, no dash (e.g., "123456789")
|
|
8
|
+
* - formatted: With dots and dash (e.g., "12.345.678-9")
|
|
9
|
+
*
|
|
10
|
+
* Default (when not specified): No dots, with dash (e.g., "12345678-9") - Recommended for storage
|
|
11
|
+
*/
|
|
12
|
+
type RutOutputFormat = 'clean' | 'formatted';
|
|
13
|
+
/**
|
|
14
|
+
* Result of RUT validation with detailed error information.
|
|
15
|
+
*/
|
|
16
|
+
type RutValidationResult = {
|
|
17
|
+
valid: true;
|
|
18
|
+
rut: string;
|
|
19
|
+
} | {
|
|
20
|
+
valid: false;
|
|
21
|
+
error: RutValidationError;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Custom error messages for RUT validation.
|
|
25
|
+
*/
|
|
26
|
+
type RutErrorMessages = {
|
|
27
|
+
required?: string;
|
|
28
|
+
invalidChars?: string;
|
|
29
|
+
invalidFormat?: string;
|
|
30
|
+
invalidCheckDigit?: string;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export type { RutErrorMessages as R, RutOutputFormat as a, RutValidationError as b, RutValidationResult as c };
|
package/dist/zod.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var zod=require('zod');var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function d(o){let i=c(o).replace(/k$/i,"");if(!/^\d+$/.test(i))return "";let s=[2,3,4,5,6,7],r=0,t=i.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*s[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(o,i){let s=c(o);if(s.length<2)return s;let r=s.slice(0,-1),t=s.slice(-1);return i===a.CLEAN?s:i===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(o={}){let{messages:i={},outputFormat:s}=o,r={...u,...i};return zod.z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,s))}var T=m();exports.createRutSchema=m;exports.rutSchema=T;//# sourceMappingURL=zod.cjs.map
|
|
2
|
+
//# sourceMappingURL=zod.cjs.map
|
package/dist/zod.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"zod.cjs","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
package/dist/zod.d.cts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { R as RutErrorMessages, a as RutOutputFormat } from './types-Bd2Yz_p4.cjs';
|
|
3
|
+
|
|
4
|
+
type RutMessages = RutErrorMessages;
|
|
5
|
+
interface RutSchemaOptions {
|
|
6
|
+
messages?: RutMessages;
|
|
7
|
+
outputFormat?: RutOutputFormat;
|
|
8
|
+
}
|
|
9
|
+
declare function createRutSchema(options?: RutSchemaOptions): z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
10
|
+
declare const rutSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
11
|
+
|
|
12
|
+
export { type RutMessages, type RutSchemaOptions, createRutSchema, rutSchema };
|
package/dist/zod.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { R as RutErrorMessages, a as RutOutputFormat } from './types-Bd2Yz_p4.js';
|
|
3
|
+
|
|
4
|
+
type RutMessages = RutErrorMessages;
|
|
5
|
+
interface RutSchemaOptions {
|
|
6
|
+
messages?: RutMessages;
|
|
7
|
+
outputFormat?: RutOutputFormat;
|
|
8
|
+
}
|
|
9
|
+
declare function createRutSchema(options?: RutSchemaOptions): z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
10
|
+
declare const rutSchema: z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>;
|
|
11
|
+
|
|
12
|
+
export { type RutMessages, type RutSchemaOptions, createRutSchema, rutSchema };
|
package/dist/zod.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {z}from'zod';var a={CLEAN:"clean",FORMATTED:"formatted"};var u={required:"RUT es requerido",invalidChars:"RUT contiene caracteres inv\xE1lidos",invalidFormat:"Formato de RUT inv\xE1lido",invalidCheckDigit:"D\xEDgito verificador incorrecto"};function c(o){return o.replace(/[.\-\s]/g,"").toUpperCase()}function d(o){let i=c(o).replace(/k$/i,"");if(!/^\d+$/.test(i))return "";let s=[2,3,4,5,6,7],r=0,t=i.split("").reverse();for(let n=0;n<t.length;n++)r+=parseInt(t[n],10)*s[n%6];let e=11-r%11;return e===11?"0":e===10?"K":e.toString()}function l(o,i){let s=c(o);if(s.length<2)return s;let r=s.slice(0,-1),t=s.slice(-1);return i===a.CLEAN?s:i===a.FORMATTED?`${r.replace(/\B(?=(\d{3})+(?!\d))/g,".")}-${t}`:`${r}-${t}`}function m(o={}){let{messages:i={},outputFormat:s}=o,r={...u,...i};return z.string({error:r.required}).min(1,{error:r.required}).transform(t=>c(t)).check(t=>{let e=t.value;if(!/^[\dkK]+$/.test(e)){t.issues.push({code:"custom",message:r.invalidChars,input:e});return}if(!/^\d{1,8}[\dkK]$/.test(e)){t.issues.push({code:"custom",message:r.invalidFormat,input:e});return}let n=e.slice(0,-1),p=e.slice(-1).toUpperCase();d(n)!==p&&t.issues.push({code:"custom",message:r.invalidCheckDigit,input:e});}).transform(t=>l(t,s))}var T=m();export{m as createRutSchema,T as rutSchema};//# sourceMappingURL=zod.js.map
|
|
2
|
+
//# sourceMappingURL=zod.js.map
|
package/dist/zod.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/constants.ts","../src/shared/messages.ts","../src/core.ts","../src/zod.ts"],"names":["RUT_FORMAT","defaultErrorMessages","cleanRut","rut","getRutCheckDigit","cleaned","weights","sum","digits","i","remainder","formatRut","format","body","checkDigit","createRutSchema","options","messages","outputFormat","msgs","z","val","ctx","rutSchema"],"mappings":"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","file":"zod.js","sourcesContent":["/**\n * RUT output format constants.\n * Use these constants instead of string literals for type safety.\n *\n * @internal These constants are for internal use only.\n */\nexport const RUT_FORMAT = {\n /**\n * Clean format: No dots, no dash (e.g., \"123456789\")\n * Use for: Internal processing, comparisons\n */\n CLEAN: 'clean',\n /**\n * Formatted format: With dots and dash (e.g., \"12.345.678-9\")\n * Use for: UI display, reports\n */\n FORMATTED: 'formatted',\n} as const;\n","import type { RutErrorMessages } from './types';\n\n/**\n * Default error messages in Spanish.\n */\nexport const defaultErrorMessages: Required<RutErrorMessages> = {\n required: 'RUT es requerido',\n invalidChars: 'RUT contiene caracteres inválidos',\n invalidFormat: 'Formato de RUT inválido',\n invalidCheckDigit: 'Dígito verificador incorrecto',\n};\n","import {\n defaultErrorMessages,\n RUT_FORMAT,\n type RutErrorMessages,\n type RutOutputFormat,\n type RutValidationError,\n type RutValidationResult,\n} from './shared';\n\n/**\n * Removes all formatting characters from a RUT (dots, dashes, spaces).\n * @param rut - The RUT string to clean\n * @returns The cleaned RUT string (only digits and K)\n */\nexport function cleanRut(rut: string): string {\n return rut.replace(/[.\\-\\s]/g, '').toUpperCase();\n}\n\n/**\n * Calculates the check digit (digito verificador) for a RUT using module 11 algorithm.\n * @param rut - The RUT body (without check digit), can be formatted or clean\n * @returns The calculated check digit (\"0\"-\"9\" or \"K\")\n */\nexport function getRutCheckDigit(rut: string): string {\n const cleaned = cleanRut(rut).replace(/k$/i, '');\n\n if (!/^\\d+$/.test(cleaned)) {\n return '';\n }\n\n const weights = [2, 3, 4, 5, 6, 7];\n let sum = 0;\n\n const digits = cleaned.split('').reverse();\n for (let i = 0; i < digits.length; i++) {\n sum += parseInt(digits[i], 10) * weights[i % 6];\n }\n\n const remainder = 11 - (sum % 11);\n\n if (remainder === 11) return '0';\n if (remainder === 10) return 'K';\n return remainder.toString();\n}\n\n/**\n * Validates a complete Chilean RUT (including check digit).\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns true if the RUT is valid, false otherwise\n */\nexport function isValidRut(rut: string): boolean {\n const cleaned = cleanRut(rut);\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return false;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n return getRutCheckDigit(body) === checkDigit;\n}\n\n/**\n * Validates a complete Chilean RUT with detailed error information.\n * @param rut - The RUT to validate, can be formatted or clean\n * @returns Validation result with cleaned RUT if valid, or error type if invalid\n * @example\n * const result = validateRut('12.345.678-5');\n * if (result.valid) {\n * console.log(result.rut); // '123456785'\n * } else {\n * console.log(result.error); // 'invalidCheckDigit'\n * }\n */\nexport function validateRut(rut: string): RutValidationResult {\n const cleaned = cleanRut(rut);\n\n if (!/^[\\dkK]+$/.test(cleaned)) {\n return { valid: false, error: 'invalidChars' };\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(cleaned)) {\n return { valid: false, error: 'invalidFormat' };\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n return { valid: false, error: 'invalidCheckDigit' };\n }\n\n return { valid: true, rut: cleaned };\n}\n\n/**\n * Gets a custom error message for a validation error.\n * @param error - The validation error type\n * @param messages - Optional custom error messages\n * @returns The error message\n * @example\n * const result = validateRut('invalid');\n * if (!result.valid) {\n * const message = getErrorMessage(result.error, {\n * invalidChars: 'Invalid characters in RUT'\n * });\n * console.log(message);\n * }\n */\nexport function getErrorMessage(error: RutValidationError, messages?: RutErrorMessages): string {\n const msgs = { ...defaultErrorMessages, ...messages };\n return msgs[error];\n}\n\n/**\n * Formats a RUT according to the specified format.\n * @param rut - The RUT to format\n * @param format - The output format: 'clean' or 'formatted'. Default: standard format (no dots, with dash)\n * @returns The formatted RUT string\n * @example\n * formatRut('18.972.631-7') // '18972631-7' (default: no dots, with dash)\n * formatRut('18.972.631-7', 'clean') // '189726317' (no dots, no dash)\n * formatRut('18.972.631-7', 'formatted') // '18.972.631-7' (with dots and dash)\n */\nexport function formatRut(rut: string, format?: RutOutputFormat): string {\n const cleaned = cleanRut(rut);\n\n if (cleaned.length < 2) {\n return cleaned;\n }\n\n const body = cleaned.slice(0, -1);\n const checkDigit = cleaned.slice(-1);\n\n if (format === RUT_FORMAT.CLEAN) {\n return cleaned;\n }\n\n if (format === RUT_FORMAT.FORMATTED) {\n const formattedBody = body.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n return `${formattedBody}-${checkDigit}`;\n }\n\n // Default: standard format (no dots, with dash)\n return `${body}-${checkDigit}`;\n}\n","import { z } from 'zod';\nimport { cleanRut, formatRut, getRutCheckDigit } from './core';\nimport { defaultErrorMessages, type RutErrorMessages, type RutOutputFormat } from './shared';\n\nexport type RutMessages = RutErrorMessages;\n\nexport interface RutSchemaOptions {\n messages?: RutMessages;\n outputFormat?: RutOutputFormat;\n}\n\nexport function createRutSchema(options: RutSchemaOptions = {}) {\n const { messages = {}, outputFormat } = options;\n const msgs = { ...defaultErrorMessages, ...messages };\n\n return z\n .string({ error: msgs.required })\n .min(1, { error: msgs.required })\n .transform((val) => cleanRut(val))\n .check((ctx) => {\n const val = ctx.value;\n\n if (!/^[\\dkK]+$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidChars,\n input: val,\n });\n return;\n }\n\n if (!/^\\d{1,8}[\\dkK]$/.test(val)) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidFormat,\n input: val,\n });\n return;\n }\n\n const body = val.slice(0, -1);\n const checkDigit = val.slice(-1).toUpperCase();\n\n if (getRutCheckDigit(body) !== checkDigit) {\n ctx.issues.push({\n code: 'custom',\n message: msgs.invalidCheckDigit,\n input: val,\n });\n }\n })\n .transform((val) => formatRut(val, outputFormat));\n}\n\nexport const rutSchema = createRutSchema();\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rut-kit",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Chilean RUT validator with custom messages for JavaScript, TypeScript and Zod",
|
|
5
|
+
"author": "Javier Gómez C",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/javiev/rut-kit.git"
|
|
9
|
+
},
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/javiev/rut-kit/issues"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/javiev/rut-kit",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"rut",
|
|
16
|
+
"chile",
|
|
17
|
+
"chilean",
|
|
18
|
+
"validation",
|
|
19
|
+
"validator",
|
|
20
|
+
"zod",
|
|
21
|
+
"typescript",
|
|
22
|
+
"javascript"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.cjs",
|
|
26
|
+
"module": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"import": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"default": "./dist/index.js"
|
|
33
|
+
},
|
|
34
|
+
"require": {
|
|
35
|
+
"types": "./dist/index.d.cts",
|
|
36
|
+
"default": "./dist/index.cjs"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"./core": {
|
|
40
|
+
"import": {
|
|
41
|
+
"types": "./dist/core.d.ts",
|
|
42
|
+
"default": "./dist/core.js"
|
|
43
|
+
},
|
|
44
|
+
"require": {
|
|
45
|
+
"types": "./dist/core.d.cts",
|
|
46
|
+
"default": "./dist/core.cjs"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"./zod": {
|
|
50
|
+
"import": {
|
|
51
|
+
"types": "./dist/zod.d.ts",
|
|
52
|
+
"default": "./dist/zod.js"
|
|
53
|
+
},
|
|
54
|
+
"require": {
|
|
55
|
+
"types": "./dist/zod.d.cts",
|
|
56
|
+
"default": "./dist/zod.cjs"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"files": [
|
|
61
|
+
"dist"
|
|
62
|
+
],
|
|
63
|
+
"lint-staged": {
|
|
64
|
+
"*.{js,ts}": "biome check --write"
|
|
65
|
+
},
|
|
66
|
+
"engines": {
|
|
67
|
+
"node": ">=18.13.0"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@biomejs/biome": "2.3.11",
|
|
71
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
72
|
+
"husky": "^9.1.7",
|
|
73
|
+
"lint-staged": "^16.2.7",
|
|
74
|
+
"tsup": "^8.5.1",
|
|
75
|
+
"typescript": "^5.9.3",
|
|
76
|
+
"vitest": "^4.0.16",
|
|
77
|
+
"zod": "^4.3.5"
|
|
78
|
+
},
|
|
79
|
+
"peerDependencies": {
|
|
80
|
+
"zod": "^4.3.5"
|
|
81
|
+
},
|
|
82
|
+
"peerDependenciesMeta": {
|
|
83
|
+
"zod": {
|
|
84
|
+
"optional": true
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"scripts": {
|
|
88
|
+
"build": "tsup",
|
|
89
|
+
"test": "vitest run",
|
|
90
|
+
"test:coverage": "vitest run --coverage",
|
|
91
|
+
"test:watch": "vitest",
|
|
92
|
+
"lint": "biome check .",
|
|
93
|
+
"lint:fix": "biome check --write .",
|
|
94
|
+
"format": "biome format --write ."
|
|
95
|
+
}
|
|
96
|
+
}
|