@indodev/toolkit 0.4.1 → 0.5.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/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { NIKInfo, MaskOptions as NIKMaskOptions, formatBirthDate, formatNIK, getAge, isValidForBirthDate, isValidForGender, maskNIK, parseNIK, validateNIK } from './nik/index.cjs';
2
- export { P as PhoneFormat, l as PhoneInfo, M as PhoneMaskOptions, d as cleanPhoneNumber, f as formatPhoneNumber, h as generateSmsLink, j as generateTelLink, e as generateWALink, g as getOperator, a as isLandlineNumber, i as isMobileNumber, k as isProvider, m as maskPhoneNumber, p as parsePhoneNumber, c as toE164, t as toInternational, b as toNational, v as validatePhoneNumber } from './parse-BDfy3aQw.cjs';
2
+ export { P as PhoneFormat, l as PhoneInfo, M as PhoneMaskOptions, d as cleanPhoneNumber, f as formatPhoneNumber, h as generateSmsLink, j as generateTelLink, e as generateWALink, g as getOperator, a as isLandlineNumber, i as isMobileNumber, k as isProvider, m as maskPhoneNumber, p as parsePhoneNumber, c as toE164, t as toInternational, b as toNational, v as validatePhoneNumber } from './parse-BmmsNlJt.cjs';
3
3
  export { NPWPInfo, MaskOptions as NPWPMaskOptions, formatNPWP, maskNPWP, parseNPWP, validateNPWP } from './npwp/index.cjs';
4
4
  export { f as formatPlate, g as getRegionFromPlate, v as validatePlate } from './utils-DDVlOusI.cjs';
5
5
  export { V as VINOptions, a as VINValidationResult, v as validateVIN } from './types-i5e6R0AS.cjs';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { NIKInfo, MaskOptions as NIKMaskOptions, formatBirthDate, formatNIK, getAge, isValidForBirthDate, isValidForGender, maskNIK, parseNIK, validateNIK } from './nik/index.js';
2
- export { P as PhoneFormat, l as PhoneInfo, M as PhoneMaskOptions, d as cleanPhoneNumber, f as formatPhoneNumber, h as generateSmsLink, j as generateTelLink, e as generateWALink, g as getOperator, a as isLandlineNumber, i as isMobileNumber, k as isProvider, m as maskPhoneNumber, p as parsePhoneNumber, c as toE164, t as toInternational, b as toNational, v as validatePhoneNumber } from './parse-BDfy3aQw.js';
2
+ export { P as PhoneFormat, l as PhoneInfo, M as PhoneMaskOptions, d as cleanPhoneNumber, f as formatPhoneNumber, h as generateSmsLink, j as generateTelLink, e as generateWALink, g as getOperator, a as isLandlineNumber, i as isMobileNumber, k as isProvider, m as maskPhoneNumber, p as parsePhoneNumber, c as toE164, t as toInternational, b as toNational, v as validatePhoneNumber } from './parse-BmmsNlJt.js';
3
3
  export { NPWPInfo, MaskOptions as NPWPMaskOptions, formatNPWP, maskNPWP, parseNPWP, validateNPWP } from './npwp/index.js';
4
4
  export { f as formatPlate, g as getRegionFromPlate, v as validatePlate } from './utils-DDVlOusI.js';
5
5
  export { V as VINOptions, a as VINValidationResult, v as validateVIN } from './types-i5e6R0AS.js';
package/dist/index.js CHANGED
@@ -57,53 +57,66 @@ var REGENCIES = {
57
57
  }
58
58
  };
59
59
 
60
- // src/nik/validate.ts
61
- function validateNIK(nik) {
62
- if (!/^\d{16}$/.test(nik)) {
63
- return false;
64
- }
65
- const provinceCode = nik.substring(0, 2);
66
- if (!PROVINCES[provinceCode]) {
67
- return false;
60
+ // src/nik/utils/date.ts
61
+ function parseNIKDate(nik) {
62
+ if (nik.length !== 16) {
63
+ return null;
68
64
  }
69
65
  const yearStr = nik.substring(6, 8);
70
66
  const monthStr = nik.substring(8, 10);
71
- const dayStr = nik.substring(10, 12);
67
+ const dayEncodedStr = nik.substring(10, 12);
72
68
  const year = parseInt(yearStr, 10);
69
+ if (isNaN(year)) return null;
73
70
  const fullYear = year > 30 ? 1900 + year : 2e3 + year;
74
71
  const month = parseInt(monthStr, 10);
75
- let day = parseInt(dayStr, 10);
76
- if (day > 40) {
77
- day = day - 40;
72
+ if (isNaN(month)) return null;
73
+ const dayEncoded = parseInt(dayEncodedStr, 10);
74
+ if (isNaN(dayEncoded)) return null;
75
+ const gender = dayEncoded > 40 ? "female" : "male";
76
+ const day = dayEncoded > 40 ? dayEncoded - 40 : dayEncoded;
77
+ return { year, fullYear, month, day, gender, dayEncoded };
78
+ }
79
+ function validateNIKDateComponents(year, month, day) {
80
+ if (month < 1 || month > 12) return false;
81
+ if (day < 1 || day > 31) return false;
82
+ const testDate = new Date(year, month - 1, day);
83
+ return testDate.getFullYear() === year && testDate.getMonth() === month - 1 && testDate.getDate() === day;
84
+ }
85
+
86
+ // src/nik/validate.ts
87
+ var NIK_PATTERN = /^\d{16}$/;
88
+ function validateNIK(nik) {
89
+ if (!NIK_PATTERN.test(nik)) {
90
+ return false;
78
91
  }
79
- if (month < 1 || month > 12) {
92
+ const provinceCode = nik.substring(0, 2);
93
+ if (!PROVINCES[provinceCode]) {
80
94
  return false;
81
95
  }
82
- if (day < 1 || day > 31) {
96
+ const parsed = parseNIKDate(nik);
97
+ if (!parsed) {
83
98
  return false;
84
99
  }
85
- const testDate = new Date(fullYear, month - 1, day);
86
- if (testDate.getFullYear() !== fullYear || testDate.getMonth() !== month - 1 || testDate.getDate() !== day) {
100
+ const { fullYear, month, day } = parsed;
101
+ if (!validateNIKDateComponents(fullYear, month, day)) {
87
102
  return false;
88
103
  }
89
104
  const now = /* @__PURE__ */ new Date();
90
- if (testDate > now || testDate < new Date(1900, 0, 1)) {
105
+ if (new Date(fullYear, month - 1, day) > now || fullYear < 1900) {
91
106
  return false;
92
107
  }
93
108
  return true;
94
109
  }
95
110
 
96
111
  // src/nik/parse.ts
112
+ var NIK_PATTERN2 = /^\d{16}$/;
97
113
  function parseNIK(nik) {
98
- if (!/^\d{16}$/.test(nik)) {
114
+ if (!NIK_PATTERN2.test(nik)) {
99
115
  return null;
100
116
  }
101
117
  const provinceCode = nik.substring(0, 2);
102
118
  const regencyCode = nik.substring(2, 4);
103
119
  const districtCode = nik.substring(4, 6);
104
- const yearStr = nik.substring(6, 8);
105
- const monthStr = nik.substring(8, 10);
106
- const dayStr = nik.substring(10, 12);
107
120
  const serialNumber = nik.substring(12, 16);
108
121
  const province = PROVINCES[provinceCode];
109
122
  if (!province) {
@@ -111,21 +124,15 @@ function parseNIK(nik) {
111
124
  }
112
125
  const regencies = REGENCIES[provinceCode] || {};
113
126
  const regency = regencies[regencyCode] || "Unknown";
114
- let day = parseInt(dayStr, 10);
115
- const month = parseInt(monthStr, 10);
116
- const year = parseInt(yearStr, 10);
117
- let gender = null;
118
- if (day > 40) {
119
- gender = "female";
120
- day -= 40;
121
- } else {
122
- gender = "male";
127
+ const parsed = parseNIKDate(nik);
128
+ if (!parsed) {
129
+ return null;
123
130
  }
124
- const fullYear = year > 30 ? 1900 + year : 2e3 + year;
125
- const birthDate = new Date(fullYear, month - 1, day);
126
- if (birthDate.getFullYear() !== fullYear || birthDate.getMonth() !== month - 1 || birthDate.getDate() !== day) {
131
+ const { fullYear, month, day, gender } = parsed;
132
+ if (!validateNIKDateComponents(fullYear, month, day)) {
127
133
  return null;
128
134
  }
135
+ const birthDate = new Date(fullYear, month - 1, day);
129
136
  return {
130
137
  province: {
131
138
  code: provinceCode,
@@ -745,24 +752,12 @@ function normalizePhoneNumber(phone) {
745
752
  }
746
753
  return "";
747
754
  }
748
- function normalizeToNational(phone) {
749
- if (phone.startsWith("+62")) {
750
- return "0" + phone.substring(3);
751
- }
752
- if (phone.startsWith("62") && !phone.startsWith("620")) {
753
- return "0" + phone.substring(2);
754
- }
755
- if (phone.startsWith("0")) {
756
- return phone;
757
- }
758
- return "";
759
- }
760
755
  function getLandlineRegion(phone) {
761
756
  if (!phone || typeof phone !== "string") {
762
757
  return null;
763
758
  }
764
759
  const cleaned = phone.replace(/[^\d+]/g, "");
765
- const normalized = normalizeToNational(cleaned);
760
+ const normalized = normalizePhoneNumber(cleaned);
766
761
  if (!normalized || !normalized.startsWith("0")) {
767
762
  return null;
768
763
  }
@@ -933,7 +928,7 @@ function maskPhoneNumber(phone, options = {}) {
933
928
 
934
929
  // src/phone/links.ts
935
930
  function generateWALink(phone, message) {
936
- if (!validatePhoneNumber(phone)) {
931
+ if (!validatePhoneNumber(phone) || !isMobileNumber(phone)) {
937
932
  return "";
938
933
  }
939
934
  const e164 = toE164(phone);
@@ -944,7 +939,7 @@ function generateWALink(phone, message) {
944
939
  return link;
945
940
  }
946
941
  function generateSmsLink(phone, body) {
947
- if (!validatePhoneNumber(phone)) {
942
+ if (!validatePhoneNumber(phone) || !isMobileNumber(phone)) {
948
943
  return "";
949
944
  }
950
945
  const e164 = toE164(phone);