@indodev/toolkit 0.6.0 → 0.7.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.
Files changed (65) hide show
  1. package/dist/email-validator/index.cjs +10 -0
  2. package/dist/email-validator/index.cjs.map +1 -1
  3. package/dist/email-validator/index.d.cts +1 -1
  4. package/dist/email-validator/index.d.ts +1 -1
  5. package/dist/email-validator/index.js +10 -1
  6. package/dist/email-validator/index.js.map +1 -1
  7. package/dist/{parse-BmmsNlJt.d.cts → errors--47zprcf.d.cts} +41 -7
  8. package/dist/{parse-BmmsNlJt.d.ts → errors--47zprcf.d.ts} +41 -7
  9. package/dist/{email-validator-R9L5unIw.d.cts → errors-DdutHLae.d.cts} +23 -1
  10. package/dist/{email-validator-R9L5unIw.d.ts → errors-DdutHLae.d.ts} +23 -1
  11. package/dist/index.cjs +271 -24
  12. package/dist/index.cjs.map +1 -1
  13. package/dist/index.d.cts +7 -7
  14. package/dist/index.d.ts +7 -7
  15. package/dist/index.js +264 -25
  16. package/dist/index.js.map +1 -1
  17. package/dist/{compare-Ku_8OhuU.d.cts → mask-CToJqmrd.d.cts} +79 -1
  18. package/dist/{compare-Ku_8OhuU.d.ts → mask-CToJqmrd.d.ts} +79 -1
  19. package/dist/nik/index.cjs +21 -12
  20. package/dist/nik/index.cjs.map +1 -1
  21. package/dist/nik/index.d.cts +2 -2
  22. package/dist/nik/index.d.ts +2 -2
  23. package/dist/nik/index.js +21 -12
  24. package/dist/nik/index.js.map +1 -1
  25. package/dist/npwp/index.cjs +10 -0
  26. package/dist/npwp/index.cjs.map +1 -1
  27. package/dist/npwp/index.d.cts +23 -1
  28. package/dist/npwp/index.d.ts +23 -1
  29. package/dist/npwp/index.js +10 -1
  30. package/dist/npwp/index.js.map +1 -1
  31. package/dist/parse-B3UzEHq3.d.cts +155 -0
  32. package/dist/parse-B3UzEHq3.d.ts +155 -0
  33. package/dist/parse-DlrgrRfY.d.cts +155 -0
  34. package/dist/parse-DlrgrRfY.d.ts +155 -0
  35. package/dist/phone/index.cjs +36 -12
  36. package/dist/phone/index.cjs.map +1 -1
  37. package/dist/phone/index.d.cts +1 -1
  38. package/dist/phone/index.d.ts +1 -1
  39. package/dist/phone/index.js +36 -13
  40. package/dist/phone/index.js.map +1 -1
  41. package/dist/plate/index.cjs +57 -0
  42. package/dist/plate/index.cjs.map +1 -1
  43. package/dist/plate/index.d.cts +1 -1
  44. package/dist/plate/index.d.ts +1 -1
  45. package/dist/plate/index.js +56 -1
  46. package/dist/plate/index.js.map +1 -1
  47. package/dist/text/index.cjs +31 -8
  48. package/dist/text/index.cjs.map +1 -1
  49. package/dist/text/index.d.cts +2 -63
  50. package/dist/text/index.d.ts +2 -63
  51. package/dist/text/index.js +31 -8
  52. package/dist/text/index.js.map +1 -1
  53. package/dist/{utils-DT8-jt63.d.cts → utils-D4A4ro8M.d.cts} +21 -9
  54. package/dist/{utils-DT8-jt63.d.ts → utils-D4A4ro8M.d.ts} +21 -9
  55. package/dist/vin/index.cjs +64 -0
  56. package/dist/vin/index.cjs.map +1 -1
  57. package/dist/vin/index.d.cts +1 -1
  58. package/dist/vin/index.d.ts +1 -1
  59. package/dist/vin/index.js +63 -1
  60. package/dist/vin/index.js.map +1 -1
  61. package/package.json +1 -1
  62. package/dist/types-i5e6R0AS.d.cts +0 -39
  63. package/dist/types-i5e6R0AS.d.ts +0 -39
  64. package/dist/utils-DDVlOusI.d.cts +0 -30
  65. package/dist/utils-DDVlOusI.d.ts +0 -30
@@ -119,13 +119,13 @@ interface NIKInfo {
119
119
  * what character to use for masking, and optional separators.
120
120
  *
121
121
  * @example
122
+ * Default masking:
122
123
  * ```typescript
123
- * // Default: shows first 4 and last 4 digits
124
- * { start: 4, end: 4, char: '*' }
124
+ * { visibleStart: 4, visibleEnd: 4, maskChar: '*' }
125
125
  * // Result: '3201********0123'
126
126
  *
127
127
  * // With separator
128
- * { start: 4, end: 4, char: '*', separator: '-' }
128
+ * { visibleStart: 4, visibleEnd: 4, maskChar: '*', separator: '-' }
129
129
  * // Result: '3201-****-****-0123'
130
130
  * ```
131
131
  *
@@ -137,19 +137,19 @@ interface MaskOptions {
137
137
  *
138
138
  * @defaultValue 4
139
139
  */
140
- start?: number;
140
+ visibleStart?: number;
141
141
  /**
142
142
  * Number of characters to show at the end.
143
143
  *
144
144
  * @defaultValue 4
145
145
  */
146
- end?: number;
146
+ visibleEnd?: number;
147
147
  /**
148
148
  * Character to use for masking hidden digits.
149
149
  *
150
150
  * @defaultValue '*'
151
151
  */
152
- char?: string;
152
+ maskChar?: string;
153
153
  /**
154
154
  * Optional separator to add between groups of digits.
155
155
  * If provided, the NIK will be formatted with separators.
@@ -163,6 +163,18 @@ interface MaskOptions {
163
163
  * ```
164
164
  */
165
165
  separator?: string;
166
+ /**
167
+ * @deprecated Use `visibleStart` instead. Deprecated in v0.7.0.
168
+ */
169
+ start?: number;
170
+ /**
171
+ * @deprecated Use `visibleEnd` instead. Deprecated in v0.7.0.
172
+ */
173
+ end?: number;
174
+ /**
175
+ * @deprecated Use `maskChar` instead. Deprecated in v0.7.0.
176
+ */
177
+ char?: string;
166
178
  }
167
179
  /**
168
180
  * Error thrown when an invalid NIK is provided to a function.
@@ -352,7 +364,7 @@ declare function formatNIK(nik: string, separator?: string): string;
352
364
  * @example
353
365
  * Custom mask character:
354
366
  * ```typescript
355
- * maskNIK('3201234567890123', { char: 'X' });
367
+ * maskNIK('3201234567890123', { maskChar: 'X' });
356
368
  * // '3201XXXXXXXX0123'
357
369
  * ```
358
370
  *
@@ -364,9 +376,9 @@ declare function formatNIK(nik: string, separator?: string): string;
364
376
  * ```
365
377
  *
366
378
  * @example
367
- * Custom start and end:
379
+ * Custom visibleStart and visibleEnd:
368
380
  * ```typescript
369
- * maskNIK('3201234567890123', { start: 6, end: 4 });
381
+ * maskNIK('3201234567890123', { visibleStart: 6, visibleEnd: 4 });
370
382
  * // '320123******0123'
371
383
  * ```
372
384
  *
@@ -119,13 +119,13 @@ interface NIKInfo {
119
119
  * what character to use for masking, and optional separators.
120
120
  *
121
121
  * @example
122
+ * Default masking:
122
123
  * ```typescript
123
- * // Default: shows first 4 and last 4 digits
124
- * { start: 4, end: 4, char: '*' }
124
+ * { visibleStart: 4, visibleEnd: 4, maskChar: '*' }
125
125
  * // Result: '3201********0123'
126
126
  *
127
127
  * // With separator
128
- * { start: 4, end: 4, char: '*', separator: '-' }
128
+ * { visibleStart: 4, visibleEnd: 4, maskChar: '*', separator: '-' }
129
129
  * // Result: '3201-****-****-0123'
130
130
  * ```
131
131
  *
@@ -137,19 +137,19 @@ interface MaskOptions {
137
137
  *
138
138
  * @defaultValue 4
139
139
  */
140
- start?: number;
140
+ visibleStart?: number;
141
141
  /**
142
142
  * Number of characters to show at the end.
143
143
  *
144
144
  * @defaultValue 4
145
145
  */
146
- end?: number;
146
+ visibleEnd?: number;
147
147
  /**
148
148
  * Character to use for masking hidden digits.
149
149
  *
150
150
  * @defaultValue '*'
151
151
  */
152
- char?: string;
152
+ maskChar?: string;
153
153
  /**
154
154
  * Optional separator to add between groups of digits.
155
155
  * If provided, the NIK will be formatted with separators.
@@ -163,6 +163,18 @@ interface MaskOptions {
163
163
  * ```
164
164
  */
165
165
  separator?: string;
166
+ /**
167
+ * @deprecated Use `visibleStart` instead. Deprecated in v0.7.0.
168
+ */
169
+ start?: number;
170
+ /**
171
+ * @deprecated Use `visibleEnd` instead. Deprecated in v0.7.0.
172
+ */
173
+ end?: number;
174
+ /**
175
+ * @deprecated Use `maskChar` instead. Deprecated in v0.7.0.
176
+ */
177
+ char?: string;
166
178
  }
167
179
  /**
168
180
  * Error thrown when an invalid NIK is provided to a function.
@@ -352,7 +364,7 @@ declare function formatNIK(nik: string, separator?: string): string;
352
364
  * @example
353
365
  * Custom mask character:
354
366
  * ```typescript
355
- * maskNIK('3201234567890123', { char: 'X' });
367
+ * maskNIK('3201234567890123', { maskChar: 'X' });
356
368
  * // '3201XXXXXXXX0123'
357
369
  * ```
358
370
  *
@@ -364,9 +376,9 @@ declare function formatNIK(nik: string, separator?: string): string;
364
376
  * ```
365
377
  *
366
378
  * @example
367
- * Custom start and end:
379
+ * Custom visibleStart and visibleEnd:
368
380
  * ```typescript
369
- * maskNIK('3201234567890123', { start: 6, end: 4 });
381
+ * maskNIK('3201234567890123', { visibleStart: 6, visibleEnd: 4 });
370
382
  * // '320123******0123'
371
383
  * ```
372
384
  *
@@ -71,7 +71,70 @@ function validateVIN(vin) {
71
71
  return actualCheckDigit === expectedCheckDigit;
72
72
  }
73
73
 
74
+ // src/vin/errors.ts
75
+ var InvalidVINError = class extends Error {
76
+ constructor(message = "Invalid VIN provided") {
77
+ super(message);
78
+ this.code = "INVALID_VIN";
79
+ this.name = "InvalidVINError";
80
+ }
81
+ };
82
+
83
+ // src/vin/parse.ts
84
+ function parseVIN(vin) {
85
+ if (!vin || typeof vin !== "string") {
86
+ return null;
87
+ }
88
+ const normalizedVIN = vin.toUpperCase();
89
+ if (normalizedVIN.length !== VIN_LENGTH) {
90
+ return null;
91
+ }
92
+ for (const char of EXCLUDED_VIN_CHARS) {
93
+ if (normalizedVIN.includes(char)) {
94
+ return null;
95
+ }
96
+ }
97
+ for (const char of normalizedVIN) {
98
+ if (VIN_CHAR_VALUES[char] === void 0) {
99
+ return null;
100
+ }
101
+ }
102
+ const isValid = validateCheckDigit(normalizedVIN);
103
+ const wmi = normalizedVIN.substring(0, 3);
104
+ const vds = normalizedVIN.substring(3, 9);
105
+ const checkDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];
106
+ const modelYearCode = normalizedVIN[9];
107
+ const plantCode = normalizedVIN[10];
108
+ const serialNumber = normalizedVIN.substring(11, 17);
109
+ return {
110
+ wmi,
111
+ vds,
112
+ checkDigit,
113
+ modelYearCode,
114
+ plantCode,
115
+ serialNumber,
116
+ isValid
117
+ };
118
+ }
119
+ function validateCheckDigit(vin) {
120
+ let sum = 0;
121
+ for (let i = 0; i < VIN_LENGTH; i++) {
122
+ const char = vin[i];
123
+ const weight = VIN_WEIGHTS[i];
124
+ const val = VIN_CHAR_VALUES[char];
125
+ if (val === void 0) {
126
+ return false;
127
+ }
128
+ sum += val * weight;
129
+ }
130
+ const checkDigitValue = sum % VIN_MODULUS;
131
+ const expectedCheckDigit = checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();
132
+ const actualCheckDigit = vin[VIN_CHECK_DIGIT_INDEX];
133
+ return actualCheckDigit === expectedCheckDigit;
134
+ }
135
+
74
136
  exports.EXCLUDED_VIN_CHARS = EXCLUDED_VIN_CHARS;
137
+ exports.InvalidVINError = InvalidVINError;
75
138
  exports.VIN_CHAR_VALUES = VIN_CHAR_VALUES;
76
139
  exports.VIN_CHECK_DIGIT_INDEX = VIN_CHECK_DIGIT_INDEX;
77
140
  exports.VIN_CHECK_DIGIT_X = VIN_CHECK_DIGIT_X;
@@ -79,6 +142,7 @@ exports.VIN_LENGTH = VIN_LENGTH;
79
142
  exports.VIN_MODULUS = VIN_MODULUS;
80
143
  exports.VIN_VERSION = VIN_VERSION;
81
144
  exports.VIN_WEIGHTS = VIN_WEIGHTS;
145
+ exports.parseVIN = parseVIN;
82
146
  exports.validateVIN = validateVIN;
83
147
  //# sourceMappingURL=index.cjs.map
84
148
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vin/constants.ts","../../src/vin/validate.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The standard length of a VIN (ISO 3779).\n */\nexport const VIN_LENGTH = 17;\n\n/**\n * The 0-based index of the check digit in the VIN (Position 9).\n */\nexport const VIN_CHECK_DIGIT_INDEX = 8;\n\n/**\n * The modulus used in the VIN checksum calculation.\n */\nexport const VIN_MODULUS = 11;\n\n/**\n * The character representing a checksum value of 10.\n */\nexport const VIN_CHECK_DIGIT_X = 'X';\n\n/**\n * Weights used in the VIN checksum calculation.\n * Each position (1-17) is multiplied by its corresponding weight.\n * Position 9 is the check digit itself (weight 0).\n */\nexport const VIN_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];\n\n/**\n * Values assigned to each valid character for VIN calculation.\n * Invalid characters: I, O, Q are not allowed in VIN.\n */\nexport const VIN_CHAR_VALUES: Record<string, number> = {\n '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,\n 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8,\n 'J': 1, 'K': 2, 'L': 3, 'M': 4, 'N': 5, 'P': 7, 'R': 9,\n 'S': 2, 'T': 3, 'U': 4, 'V': 5, 'W': 6, 'X': 7, 'Y': 8, 'Z': 9,\n};\n\n/**\n * Characters excluded from VIN (I, O, Q).\n */\nexport const EXCLUDED_VIN_CHARS = ['I', 'O', 'Q'];\n\n/**\n * Version of the VIN utility module.\n */\nexport const VIN_VERSION = '1.0.0';\n\n","import {\n VIN_WEIGHTS,\n VIN_CHAR_VALUES,\n EXCLUDED_VIN_CHARS,\n VIN_LENGTH,\n VIN_CHECK_DIGIT_INDEX,\n VIN_MODULUS,\n VIN_CHECK_DIGIT_X,\n} from './constants';\n\n/**\n * Validates a Vehicle Identification Number (VIN) based on ISO 3779.\n *\n * Checks for:\n * - Exactly 17 characters length.\n * - Exclusion of characters I, O, and Q.\n * - Checksum validation using the check digit at position 9.\n *\n * @param vin - The VIN string to validate\n * @returns boolean indicating if the VIN is valid\n *\n * @example\n * ```typescript\n * import { validateVIN } from '@indodev/toolkit/vin';\n *\n * validateVIN('1HBHA82L7ZB000001'); // true\n * validateVIN('1HBHA82I7ZB000001'); // false (contains 'I')\n * ```\n */\nexport function validateVIN(vin: string): boolean {\n if (!vin || vin.length !== VIN_LENGTH) {\n return false;\n }\n\n const normalizedVIN = vin.toUpperCase();\n\n // 1. Check for excluded characters (I, O, Q)\n for (const char of EXCLUDED_VIN_CHARS) {\n if (normalizedVIN.includes(char)) {\n return false;\n }\n }\n\n // 2. Checksum validation (Position 9)\n let sum = 0;\n for (let i = 0; i < VIN_LENGTH; i++) {\n const char = normalizedVIN[i];\n const weight = VIN_WEIGHTS[i];\n const val = VIN_CHAR_VALUES[char];\n\n if (val === undefined) {\n return false; // Invalid character found\n }\n\n sum += val * weight;\n }\n\n const checkDigitValue = sum % VIN_MODULUS;\n const expectedCheckDigit =\n checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();\n const actualCheckDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];\n\n return actualCheckDigit === expectedCheckDigit;\n}\n"]}
1
+ {"version":3,"sources":["../../src/vin/constants.ts","../../src/vin/validate.ts","../../src/vin/errors.ts","../../src/vin/parse.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The standard length of a VIN (ISO 3779).\n */\nexport const VIN_LENGTH = 17;\n\n/**\n * The 0-based index of the check digit in the VIN (Position 9).\n */\nexport const VIN_CHECK_DIGIT_INDEX = 8;\n\n/**\n * The modulus used in the VIN checksum calculation.\n */\nexport const VIN_MODULUS = 11;\n\n/**\n * The character representing a checksum value of 10.\n */\nexport const VIN_CHECK_DIGIT_X = 'X';\n\n/**\n * Weights used in the VIN checksum calculation.\n * Each position (1-17) is multiplied by its corresponding weight.\n * Position 9 is the check digit itself (weight 0).\n */\nexport const VIN_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];\n\n/**\n * Values assigned to each valid character for VIN calculation.\n * Invalid characters: I, O, Q are not allowed in VIN.\n */\nexport const VIN_CHAR_VALUES: Record<string, number> = {\n '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,\n 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8,\n 'J': 1, 'K': 2, 'L': 3, 'M': 4, 'N': 5, 'P': 7, 'R': 9,\n 'S': 2, 'T': 3, 'U': 4, 'V': 5, 'W': 6, 'X': 7, 'Y': 8, 'Z': 9,\n};\n\n/**\n * Characters excluded from VIN (I, O, Q).\n */\nexport const EXCLUDED_VIN_CHARS = ['I', 'O', 'Q'];\n\n/**\n * Version of the VIN utility module.\n */\nexport const VIN_VERSION = '1.0.0';\n\n","import {\n VIN_WEIGHTS,\n VIN_CHAR_VALUES,\n EXCLUDED_VIN_CHARS,\n VIN_LENGTH,\n VIN_CHECK_DIGIT_INDEX,\n VIN_MODULUS,\n VIN_CHECK_DIGIT_X,\n} from './constants';\n\n/**\n * Validates a Vehicle Identification Number (VIN) based on ISO 3779.\n *\n * Checks for:\n * - Exactly 17 characters length.\n * - Exclusion of characters I, O, and Q.\n * - Checksum validation using the check digit at position 9.\n *\n * @param vin - The VIN string to validate\n * @returns boolean indicating if the VIN is valid\n *\n * @example\n * ```typescript\n * import { validateVIN } from '@indodev/toolkit/vin';\n *\n * validateVIN('1HBHA82L7ZB000001'); // true\n * validateVIN('1HBHA82I7ZB000001'); // false (contains 'I')\n * ```\n */\nexport function validateVIN(vin: string): boolean {\n if (!vin || vin.length !== VIN_LENGTH) {\n return false;\n }\n\n const normalizedVIN = vin.toUpperCase();\n\n // 1. Check for excluded characters (I, O, Q)\n for (const char of EXCLUDED_VIN_CHARS) {\n if (normalizedVIN.includes(char)) {\n return false;\n }\n }\n\n // 2. Checksum validation (Position 9)\n let sum = 0;\n for (let i = 0; i < VIN_LENGTH; i++) {\n const char = normalizedVIN[i];\n const weight = VIN_WEIGHTS[i];\n const val = VIN_CHAR_VALUES[char];\n\n if (val === undefined) {\n return false; // Invalid character found\n }\n\n sum += val * weight;\n }\n\n const checkDigitValue = sum % VIN_MODULUS;\n const expectedCheckDigit =\n checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();\n const actualCheckDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];\n\n return actualCheckDigit === expectedCheckDigit;\n}\n","/**\n * Error thrown when an invalid VIN is provided to a function.\n * Extends native Error with a `code` property for programmatic error handling.\n *\n * @example\n * ```typescript\n * try {\n * requireVIN('invalid');\n * } catch (error) {\n * if (error instanceof InvalidVINError) {\n * console.log(error.code); // 'INVALID_VIN'\n * }\n * }\n * ```\n *\n * @public\n */\nexport class InvalidVINError extends Error {\n readonly code = 'INVALID_VIN' as const;\n\n constructor(message: string = 'Invalid VIN provided') {\n super(message);\n this.name = 'InvalidVINError';\n }\n}\n","import {\n VIN_LENGTH,\n VIN_CHAR_VALUES,\n EXCLUDED_VIN_CHARS,\n VIN_WEIGHTS,\n VIN_CHECK_DIGIT_INDEX,\n VIN_MODULUS,\n VIN_CHECK_DIGIT_X,\n} from './constants';\nimport type { VINInfo } from './types';\n\n/**\n * Parses a Vehicle Identification Number (VIN) into its component parts.\n *\n * Extracts the WMI (World Manufacturer Identifier), VDS (Vehicle Descriptor Section),\n * check digit, model year code, plant code, and serial number from a VIN.\n *\n * @param vin - The VIN string to parse\n * @returns VINInfo object with extracted components, or null if invalid\n *\n * @example\n * Valid VIN:\n * ```typescript\n * parseVIN('1HBHA82L7ZB000001');\n * // {\n * // wmi: '1HB',\n * // vds: 'HA82L7',\n * // checkDigit: '7',\n * // modelYearCode: 'Z',\n * // plantCode: 'B',\n * // serialNumber: '0000001',\n * // isValid: true\n * // }\n * ```\n *\n * @example\n * Invalid VIN returns null:\n * ```typescript\n * parseVIN('invalid');\n * // null\n * ```\n *\n * @public\n */\nexport function parseVIN(vin: string): VINInfo | null {\n if (!vin || typeof vin !== 'string') {\n return null;\n }\n\n const normalizedVIN = vin.toUpperCase();\n\n if (normalizedVIN.length !== VIN_LENGTH) {\n return null;\n }\n\n for (const char of EXCLUDED_VIN_CHARS) {\n if (normalizedVIN.includes(char)) {\n return null;\n }\n }\n\n for (const char of normalizedVIN) {\n if (VIN_CHAR_VALUES[char] === undefined) {\n return null;\n }\n }\n\n const isValid = validateCheckDigit(normalizedVIN);\n\n const wmi = normalizedVIN.substring(0, 3);\n const vds = normalizedVIN.substring(3, 9);\n const checkDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];\n const modelYearCode = normalizedVIN[9];\n const plantCode = normalizedVIN[10];\n const serialNumber = normalizedVIN.substring(11, 17);\n\n return {\n wmi,\n vds,\n checkDigit,\n modelYearCode,\n plantCode,\n serialNumber,\n isValid,\n };\n}\n\n/**\n * Validates the check digit of a VIN.\n *\n * @internal\n */\nfunction validateCheckDigit(vin: string): boolean {\n let sum = 0;\n for (let i = 0; i < VIN_LENGTH; i++) {\n const char = vin[i];\n const weight = VIN_WEIGHTS[i];\n const val = VIN_CHAR_VALUES[char];\n\n if (val === undefined) {\n return false;\n }\n\n sum += val * weight;\n }\n\n const checkDigitValue = sum % VIN_MODULUS;\n const expectedCheckDigit =\n checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();\n const actualCheckDigit = vin[VIN_CHECK_DIGIT_INDEX];\n\n return actualCheckDigit === expectedCheckDigit;\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { V as VINOptions, a as VINValidationResult, v as validateVIN } from '../types-i5e6R0AS.cjs';
1
+ export { I as InvalidVINError, b as VINInfo, V as VINOptions, a as VINValidationResult, p as parseVIN, v as validateVIN } from '../parse-DlrgrRfY.cjs';
2
2
 
3
3
  /**
4
4
  * The standard length of a VIN (ISO 3779).
@@ -1,4 +1,4 @@
1
- export { V as VINOptions, a as VINValidationResult, v as validateVIN } from '../types-i5e6R0AS.js';
1
+ export { I as InvalidVINError, b as VINInfo, V as VINOptions, a as VINValidationResult, p as parseVIN, v as validateVIN } from '../parse-DlrgrRfY.js';
2
2
 
3
3
  /**
4
4
  * The standard length of a VIN (ISO 3779).
package/dist/vin/index.js CHANGED
@@ -69,6 +69,68 @@ function validateVIN(vin) {
69
69
  return actualCheckDigit === expectedCheckDigit;
70
70
  }
71
71
 
72
- export { EXCLUDED_VIN_CHARS, VIN_CHAR_VALUES, VIN_CHECK_DIGIT_INDEX, VIN_CHECK_DIGIT_X, VIN_LENGTH, VIN_MODULUS, VIN_VERSION, VIN_WEIGHTS, validateVIN };
72
+ // src/vin/errors.ts
73
+ var InvalidVINError = class extends Error {
74
+ constructor(message = "Invalid VIN provided") {
75
+ super(message);
76
+ this.code = "INVALID_VIN";
77
+ this.name = "InvalidVINError";
78
+ }
79
+ };
80
+
81
+ // src/vin/parse.ts
82
+ function parseVIN(vin) {
83
+ if (!vin || typeof vin !== "string") {
84
+ return null;
85
+ }
86
+ const normalizedVIN = vin.toUpperCase();
87
+ if (normalizedVIN.length !== VIN_LENGTH) {
88
+ return null;
89
+ }
90
+ for (const char of EXCLUDED_VIN_CHARS) {
91
+ if (normalizedVIN.includes(char)) {
92
+ return null;
93
+ }
94
+ }
95
+ for (const char of normalizedVIN) {
96
+ if (VIN_CHAR_VALUES[char] === void 0) {
97
+ return null;
98
+ }
99
+ }
100
+ const isValid = validateCheckDigit(normalizedVIN);
101
+ const wmi = normalizedVIN.substring(0, 3);
102
+ const vds = normalizedVIN.substring(3, 9);
103
+ const checkDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];
104
+ const modelYearCode = normalizedVIN[9];
105
+ const plantCode = normalizedVIN[10];
106
+ const serialNumber = normalizedVIN.substring(11, 17);
107
+ return {
108
+ wmi,
109
+ vds,
110
+ checkDigit,
111
+ modelYearCode,
112
+ plantCode,
113
+ serialNumber,
114
+ isValid
115
+ };
116
+ }
117
+ function validateCheckDigit(vin) {
118
+ let sum = 0;
119
+ for (let i = 0; i < VIN_LENGTH; i++) {
120
+ const char = vin[i];
121
+ const weight = VIN_WEIGHTS[i];
122
+ const val = VIN_CHAR_VALUES[char];
123
+ if (val === void 0) {
124
+ return false;
125
+ }
126
+ sum += val * weight;
127
+ }
128
+ const checkDigitValue = sum % VIN_MODULUS;
129
+ const expectedCheckDigit = checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();
130
+ const actualCheckDigit = vin[VIN_CHECK_DIGIT_INDEX];
131
+ return actualCheckDigit === expectedCheckDigit;
132
+ }
133
+
134
+ export { EXCLUDED_VIN_CHARS, InvalidVINError, VIN_CHAR_VALUES, VIN_CHECK_DIGIT_INDEX, VIN_CHECK_DIGIT_X, VIN_LENGTH, VIN_MODULUS, VIN_VERSION, VIN_WEIGHTS, parseVIN, validateVIN };
73
135
  //# sourceMappingURL=index.js.map
74
136
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/vin/constants.ts","../../src/vin/validate.ts"],"names":[],"mappings":";AAGO,IAAM,UAAA,GAAa;AAKnB,IAAM,qBAAA,GAAwB;AAK9B,IAAM,WAAA,GAAc;AAKpB,IAAM,iBAAA,GAAoB;AAO1B,IAAM,cAAc,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAMvE,IAAM,eAAA,GAA0C;AAAA,EACrD,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAC7E,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAC7D,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EACrD,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK;AAC/D;AAKO,IAAM,kBAAA,GAAqB,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG;AAKzC,IAAM,WAAA,GAAc;;;ACjBpB,SAAS,YAAY,GAAA,EAAsB;AAChD,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAI,WAAA,EAAY;AAGtC,EAAA,KAAA,MAAW,QAAQ,kBAAA,EAAoB;AACrC,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,EAAG;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,IAAA,MAAM,GAAA,GAAM,gBAAgB,IAAI,CAAA;AAEhC,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,GAAA,IAAO,GAAA,GAAM,MAAA;AAAA,EACf;AAEA,EAAA,MAAM,kBAAkB,GAAA,GAAM,WAAA;AAC9B,EAAA,MAAM,kBAAA,GACJ,eAAA,KAAoB,EAAA,GAAK,iBAAA,GAAoB,gBAAgB,QAAA,EAAS;AACxE,EAAA,MAAM,gBAAA,GAAmB,cAAc,qBAAqB,CAAA;AAE5D,EAAA,OAAO,gBAAA,KAAqB,kBAAA;AAC9B","file":"index.js","sourcesContent":["/**\n * The standard length of a VIN (ISO 3779).\n */\nexport const VIN_LENGTH = 17;\n\n/**\n * The 0-based index of the check digit in the VIN (Position 9).\n */\nexport const VIN_CHECK_DIGIT_INDEX = 8;\n\n/**\n * The modulus used in the VIN checksum calculation.\n */\nexport const VIN_MODULUS = 11;\n\n/**\n * The character representing a checksum value of 10.\n */\nexport const VIN_CHECK_DIGIT_X = 'X';\n\n/**\n * Weights used in the VIN checksum calculation.\n * Each position (1-17) is multiplied by its corresponding weight.\n * Position 9 is the check digit itself (weight 0).\n */\nexport const VIN_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];\n\n/**\n * Values assigned to each valid character for VIN calculation.\n * Invalid characters: I, O, Q are not allowed in VIN.\n */\nexport const VIN_CHAR_VALUES: Record<string, number> = {\n '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,\n 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8,\n 'J': 1, 'K': 2, 'L': 3, 'M': 4, 'N': 5, 'P': 7, 'R': 9,\n 'S': 2, 'T': 3, 'U': 4, 'V': 5, 'W': 6, 'X': 7, 'Y': 8, 'Z': 9,\n};\n\n/**\n * Characters excluded from VIN (I, O, Q).\n */\nexport const EXCLUDED_VIN_CHARS = ['I', 'O', 'Q'];\n\n/**\n * Version of the VIN utility module.\n */\nexport const VIN_VERSION = '1.0.0';\n\n","import {\n VIN_WEIGHTS,\n VIN_CHAR_VALUES,\n EXCLUDED_VIN_CHARS,\n VIN_LENGTH,\n VIN_CHECK_DIGIT_INDEX,\n VIN_MODULUS,\n VIN_CHECK_DIGIT_X,\n} from './constants';\n\n/**\n * Validates a Vehicle Identification Number (VIN) based on ISO 3779.\n *\n * Checks for:\n * - Exactly 17 characters length.\n * - Exclusion of characters I, O, and Q.\n * - Checksum validation using the check digit at position 9.\n *\n * @param vin - The VIN string to validate\n * @returns boolean indicating if the VIN is valid\n *\n * @example\n * ```typescript\n * import { validateVIN } from '@indodev/toolkit/vin';\n *\n * validateVIN('1HBHA82L7ZB000001'); // true\n * validateVIN('1HBHA82I7ZB000001'); // false (contains 'I')\n * ```\n */\nexport function validateVIN(vin: string): boolean {\n if (!vin || vin.length !== VIN_LENGTH) {\n return false;\n }\n\n const normalizedVIN = vin.toUpperCase();\n\n // 1. Check for excluded characters (I, O, Q)\n for (const char of EXCLUDED_VIN_CHARS) {\n if (normalizedVIN.includes(char)) {\n return false;\n }\n }\n\n // 2. Checksum validation (Position 9)\n let sum = 0;\n for (let i = 0; i < VIN_LENGTH; i++) {\n const char = normalizedVIN[i];\n const weight = VIN_WEIGHTS[i];\n const val = VIN_CHAR_VALUES[char];\n\n if (val === undefined) {\n return false; // Invalid character found\n }\n\n sum += val * weight;\n }\n\n const checkDigitValue = sum % VIN_MODULUS;\n const expectedCheckDigit =\n checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();\n const actualCheckDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];\n\n return actualCheckDigit === expectedCheckDigit;\n}\n"]}
1
+ {"version":3,"sources":["../../src/vin/constants.ts","../../src/vin/validate.ts","../../src/vin/errors.ts","../../src/vin/parse.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The standard length of a VIN (ISO 3779).\n */\nexport const VIN_LENGTH = 17;\n\n/**\n * The 0-based index of the check digit in the VIN (Position 9).\n */\nexport const VIN_CHECK_DIGIT_INDEX = 8;\n\n/**\n * The modulus used in the VIN checksum calculation.\n */\nexport const VIN_MODULUS = 11;\n\n/**\n * The character representing a checksum value of 10.\n */\nexport const VIN_CHECK_DIGIT_X = 'X';\n\n/**\n * Weights used in the VIN checksum calculation.\n * Each position (1-17) is multiplied by its corresponding weight.\n * Position 9 is the check digit itself (weight 0).\n */\nexport const VIN_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];\n\n/**\n * Values assigned to each valid character for VIN calculation.\n * Invalid characters: I, O, Q are not allowed in VIN.\n */\nexport const VIN_CHAR_VALUES: Record<string, number> = {\n '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,\n 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8,\n 'J': 1, 'K': 2, 'L': 3, 'M': 4, 'N': 5, 'P': 7, 'R': 9,\n 'S': 2, 'T': 3, 'U': 4, 'V': 5, 'W': 6, 'X': 7, 'Y': 8, 'Z': 9,\n};\n\n/**\n * Characters excluded from VIN (I, O, Q).\n */\nexport const EXCLUDED_VIN_CHARS = ['I', 'O', 'Q'];\n\n/**\n * Version of the VIN utility module.\n */\nexport const VIN_VERSION = '1.0.0';\n\n","import {\n VIN_WEIGHTS,\n VIN_CHAR_VALUES,\n EXCLUDED_VIN_CHARS,\n VIN_LENGTH,\n VIN_CHECK_DIGIT_INDEX,\n VIN_MODULUS,\n VIN_CHECK_DIGIT_X,\n} from './constants';\n\n/**\n * Validates a Vehicle Identification Number (VIN) based on ISO 3779.\n *\n * Checks for:\n * - Exactly 17 characters length.\n * - Exclusion of characters I, O, and Q.\n * - Checksum validation using the check digit at position 9.\n *\n * @param vin - The VIN string to validate\n * @returns boolean indicating if the VIN is valid\n *\n * @example\n * ```typescript\n * import { validateVIN } from '@indodev/toolkit/vin';\n *\n * validateVIN('1HBHA82L7ZB000001'); // true\n * validateVIN('1HBHA82I7ZB000001'); // false (contains 'I')\n * ```\n */\nexport function validateVIN(vin: string): boolean {\n if (!vin || vin.length !== VIN_LENGTH) {\n return false;\n }\n\n const normalizedVIN = vin.toUpperCase();\n\n // 1. Check for excluded characters (I, O, Q)\n for (const char of EXCLUDED_VIN_CHARS) {\n if (normalizedVIN.includes(char)) {\n return false;\n }\n }\n\n // 2. Checksum validation (Position 9)\n let sum = 0;\n for (let i = 0; i < VIN_LENGTH; i++) {\n const char = normalizedVIN[i];\n const weight = VIN_WEIGHTS[i];\n const val = VIN_CHAR_VALUES[char];\n\n if (val === undefined) {\n return false; // Invalid character found\n }\n\n sum += val * weight;\n }\n\n const checkDigitValue = sum % VIN_MODULUS;\n const expectedCheckDigit =\n checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();\n const actualCheckDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];\n\n return actualCheckDigit === expectedCheckDigit;\n}\n","/**\n * Error thrown when an invalid VIN is provided to a function.\n * Extends native Error with a `code` property for programmatic error handling.\n *\n * @example\n * ```typescript\n * try {\n * requireVIN('invalid');\n * } catch (error) {\n * if (error instanceof InvalidVINError) {\n * console.log(error.code); // 'INVALID_VIN'\n * }\n * }\n * ```\n *\n * @public\n */\nexport class InvalidVINError extends Error {\n readonly code = 'INVALID_VIN' as const;\n\n constructor(message: string = 'Invalid VIN provided') {\n super(message);\n this.name = 'InvalidVINError';\n }\n}\n","import {\n VIN_LENGTH,\n VIN_CHAR_VALUES,\n EXCLUDED_VIN_CHARS,\n VIN_WEIGHTS,\n VIN_CHECK_DIGIT_INDEX,\n VIN_MODULUS,\n VIN_CHECK_DIGIT_X,\n} from './constants';\nimport type { VINInfo } from './types';\n\n/**\n * Parses a Vehicle Identification Number (VIN) into its component parts.\n *\n * Extracts the WMI (World Manufacturer Identifier), VDS (Vehicle Descriptor Section),\n * check digit, model year code, plant code, and serial number from a VIN.\n *\n * @param vin - The VIN string to parse\n * @returns VINInfo object with extracted components, or null if invalid\n *\n * @example\n * Valid VIN:\n * ```typescript\n * parseVIN('1HBHA82L7ZB000001');\n * // {\n * // wmi: '1HB',\n * // vds: 'HA82L7',\n * // checkDigit: '7',\n * // modelYearCode: 'Z',\n * // plantCode: 'B',\n * // serialNumber: '0000001',\n * // isValid: true\n * // }\n * ```\n *\n * @example\n * Invalid VIN returns null:\n * ```typescript\n * parseVIN('invalid');\n * // null\n * ```\n *\n * @public\n */\nexport function parseVIN(vin: string): VINInfo | null {\n if (!vin || typeof vin !== 'string') {\n return null;\n }\n\n const normalizedVIN = vin.toUpperCase();\n\n if (normalizedVIN.length !== VIN_LENGTH) {\n return null;\n }\n\n for (const char of EXCLUDED_VIN_CHARS) {\n if (normalizedVIN.includes(char)) {\n return null;\n }\n }\n\n for (const char of normalizedVIN) {\n if (VIN_CHAR_VALUES[char] === undefined) {\n return null;\n }\n }\n\n const isValid = validateCheckDigit(normalizedVIN);\n\n const wmi = normalizedVIN.substring(0, 3);\n const vds = normalizedVIN.substring(3, 9);\n const checkDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];\n const modelYearCode = normalizedVIN[9];\n const plantCode = normalizedVIN[10];\n const serialNumber = normalizedVIN.substring(11, 17);\n\n return {\n wmi,\n vds,\n checkDigit,\n modelYearCode,\n plantCode,\n serialNumber,\n isValid,\n };\n}\n\n/**\n * Validates the check digit of a VIN.\n *\n * @internal\n */\nfunction validateCheckDigit(vin: string): boolean {\n let sum = 0;\n for (let i = 0; i < VIN_LENGTH; i++) {\n const char = vin[i];\n const weight = VIN_WEIGHTS[i];\n const val = VIN_CHAR_VALUES[char];\n\n if (val === undefined) {\n return false;\n }\n\n sum += val * weight;\n }\n\n const checkDigitValue = sum % VIN_MODULUS;\n const expectedCheckDigit =\n checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();\n const actualCheckDigit = vin[VIN_CHECK_DIGIT_INDEX];\n\n return actualCheckDigit === expectedCheckDigit;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indodev/toolkit",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Indonesian developer utilities for validation, formatting, and more",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -1,39 +0,0 @@
1
- /**
2
- * Validates a Vehicle Identification Number (VIN) based on ISO 3779.
3
- *
4
- * Checks for:
5
- * - Exactly 17 characters length.
6
- * - Exclusion of characters I, O, and Q.
7
- * - Checksum validation using the check digit at position 9.
8
- *
9
- * @param vin - The VIN string to validate
10
- * @returns boolean indicating if the VIN is valid
11
- *
12
- * @example
13
- * ```typescript
14
- * import { validateVIN } from '@indodev/toolkit/vin';
15
- *
16
- * validateVIN('1HBHA82L7ZB000001'); // true
17
- * validateVIN('1HBHA82I7ZB000001'); // false (contains 'I')
18
- * ```
19
- */
20
- declare function validateVIN(vin: string): boolean;
21
-
22
- /**
23
- * VIN Validation options.
24
- */
25
- interface VINOptions {
26
- /**
27
- * Whether to include error messages in the validation result.
28
- */
29
- includeDetails?: boolean;
30
- }
31
- /**
32
- * Detailed validation result.
33
- */
34
- interface VINValidationResult {
35
- isValid: boolean;
36
- error?: string;
37
- }
38
-
39
- export { type VINOptions as V, type VINValidationResult as a, validateVIN as v };
@@ -1,39 +0,0 @@
1
- /**
2
- * Validates a Vehicle Identification Number (VIN) based on ISO 3779.
3
- *
4
- * Checks for:
5
- * - Exactly 17 characters length.
6
- * - Exclusion of characters I, O, and Q.
7
- * - Checksum validation using the check digit at position 9.
8
- *
9
- * @param vin - The VIN string to validate
10
- * @returns boolean indicating if the VIN is valid
11
- *
12
- * @example
13
- * ```typescript
14
- * import { validateVIN } from '@indodev/toolkit/vin';
15
- *
16
- * validateVIN('1HBHA82L7ZB000001'); // true
17
- * validateVIN('1HBHA82I7ZB000001'); // false (contains 'I')
18
- * ```
19
- */
20
- declare function validateVIN(vin: string): boolean;
21
-
22
- /**
23
- * VIN Validation options.
24
- */
25
- interface VINOptions {
26
- /**
27
- * Whether to include error messages in the validation result.
28
- */
29
- includeDetails?: boolean;
30
- }
31
- /**
32
- * Detailed validation result.
33
- */
34
- interface VINValidationResult {
35
- isValid: boolean;
36
- error?: string;
37
- }
38
-
39
- export { type VINOptions as V, type VINValidationResult as a, validateVIN as v };
@@ -1,30 +0,0 @@
1
- /**
2
- * Validates an Indonesian license plate number format.
3
- * Format: [1-2 letters] [1-4 digits] [1-3 letters]
4
- *
5
- * @param plate - The plate number string to validate
6
- * @returns `true` if valid, `false` otherwise
7
- *
8
- * @example
9
- * ```typescript
10
- * validatePlate('B 1234 ABC'); // true
11
- * validatePlate('AB 1 CD'); // true
12
- * ```
13
- */
14
- declare function validatePlate(plate: string): boolean;
15
- /**
16
- * Gets the region name from a license plate number.
17
- *
18
- * @param plate - The plate number
19
- * @returns Region name or null if not found
20
- */
21
- declare function getRegionFromPlate(plate: string): string | null;
22
- /**
23
- * Formats a license plate number with spaces (e.g., B 1234 ABC).
24
- *
25
- * @param plate - The plate number
26
- * @returns Formatted plate string
27
- */
28
- declare function formatPlate(plate: string): string;
29
-
30
- export { formatPlate as f, getRegionFromPlate as g, validatePlate as v };
@@ -1,30 +0,0 @@
1
- /**
2
- * Validates an Indonesian license plate number format.
3
- * Format: [1-2 letters] [1-4 digits] [1-3 letters]
4
- *
5
- * @param plate - The plate number string to validate
6
- * @returns `true` if valid, `false` otherwise
7
- *
8
- * @example
9
- * ```typescript
10
- * validatePlate('B 1234 ABC'); // true
11
- * validatePlate('AB 1 CD'); // true
12
- * ```
13
- */
14
- declare function validatePlate(plate: string): boolean;
15
- /**
16
- * Gets the region name from a license plate number.
17
- *
18
- * @param plate - The plate number
19
- * @returns Region name or null if not found
20
- */
21
- declare function getRegionFromPlate(plate: string): string | null;
22
- /**
23
- * Formats a license plate number with spaces (e.g., B 1234 ABC).
24
- *
25
- * @param plate - The plate number
26
- * @returns Formatted plate string
27
- */
28
- declare function formatPlate(plate: string): string;
29
-
30
- export { formatPlate as f, getRegionFromPlate as g, validatePlate as v };