@indodev/toolkit 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/{compare-B1MKSOWV.d.cts → compare-CZadJMGl.d.cts} +54 -1
  2. package/dist/{compare-B1MKSOWV.d.ts → compare-CZadJMGl.d.ts} +54 -1
  3. package/dist/currency/index.cjs +23 -0
  4. package/dist/currency/index.cjs.map +1 -1
  5. package/dist/currency/index.d.cts +367 -3
  6. package/dist/currency/index.d.ts +367 -3
  7. package/dist/currency/index.js +21 -1
  8. package/dist/currency/index.js.map +1 -1
  9. package/dist/index.cjs +1188 -0
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +7 -4
  12. package/dist/index.d.ts +7 -4
  13. package/dist/index.js +1165 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/nik/index.cjs +44 -0
  16. package/dist/nik/index.cjs.map +1 -1
  17. package/dist/nik/index.d.cts +44 -1
  18. package/dist/nik/index.d.ts +44 -1
  19. package/dist/nik/index.js +41 -1
  20. package/dist/nik/index.js.map +1 -1
  21. package/dist/npwp/index.cjs +95 -0
  22. package/dist/npwp/index.cjs.map +1 -0
  23. package/dist/npwp/index.d.cts +76 -0
  24. package/dist/npwp/index.d.ts +76 -0
  25. package/dist/npwp/index.js +90 -0
  26. package/dist/npwp/index.js.map +1 -0
  27. package/dist/phone/index.cjs +42 -0
  28. package/dist/phone/index.cjs.map +1 -1
  29. package/dist/phone/index.d.cts +57 -1
  30. package/dist/phone/index.d.ts +57 -1
  31. package/dist/phone/index.js +39 -1
  32. package/dist/phone/index.js.map +1 -1
  33. package/dist/plate/index.cjs +99 -0
  34. package/dist/plate/index.cjs.map +1 -0
  35. package/dist/plate/index.d.cts +8 -0
  36. package/dist/plate/index.d.ts +8 -0
  37. package/dist/plate/index.js +94 -0
  38. package/dist/plate/index.js.map +1 -0
  39. package/dist/text/index.cjs +811 -0
  40. package/dist/text/index.cjs.map +1 -1
  41. package/dist/text/index.d.cts +1 -1
  42. package/dist/text/index.d.ts +1 -1
  43. package/dist/text/index.js +808 -1
  44. package/dist/text/index.js.map +1 -1
  45. package/dist/types-i5e6R0AS.d.cts +39 -0
  46. package/dist/types-i5e6R0AS.d.ts +39 -0
  47. package/dist/utils-DDVlOusI.d.cts +30 -0
  48. package/dist/utils-DDVlOusI.d.ts +30 -0
  49. package/dist/vin/index.cjs +84 -0
  50. package/dist/vin/index.cjs.map +1 -0
  51. package/dist/vin/index.d.cts +39 -0
  52. package/dist/vin/index.d.ts +39 -0
  53. package/dist/vin/index.js +74 -0
  54. package/dist/vin/index.js.map +1 -0
  55. package/package.json +48 -18
  56. package/LICENCE +0 -21
  57. package/dist/words-Dy8iYkbv.d.cts +0 -333
  58. package/dist/words-Dy8iYkbv.d.ts +0 -333
package/dist/index.cjs CHANGED
@@ -210,6 +210,46 @@ function maskNIK(nik, options = {}) {
210
210
  return startPart + char.repeat(maskLength) + endPart;
211
211
  }
212
212
 
213
+ // src/nik/utils.ts
214
+ function getAge(nik, referenceDate = /* @__PURE__ */ new Date()) {
215
+ const info = parseNIK(nik);
216
+ if (!info || !info.birthDate) {
217
+ return null;
218
+ }
219
+ const birthDate = info.birthDate;
220
+ let age = referenceDate.getFullYear() - birthDate.getFullYear();
221
+ const m = referenceDate.getMonth() - birthDate.getMonth();
222
+ if (m < 0 || m === 0 && referenceDate.getDate() < birthDate.getDate()) {
223
+ age--;
224
+ }
225
+ return age;
226
+ }
227
+ function formatBirthDate(nik, options = {
228
+ day: "numeric",
229
+ month: "long",
230
+ year: "numeric"
231
+ }, locale = "id-ID") {
232
+ const info = parseNIK(nik);
233
+ if (!info || !info.birthDate) {
234
+ return null;
235
+ }
236
+ return new Intl.DateTimeFormat(locale, options).format(info.birthDate);
237
+ }
238
+ function isValidForGender(nik, gender) {
239
+ const info = parseNIK(nik);
240
+ if (!info) {
241
+ return false;
242
+ }
243
+ return info.gender === gender;
244
+ }
245
+ function isValidForBirthDate(nik, birthDate) {
246
+ const info = parseNIK(nik);
247
+ if (!info || !info.birthDate) {
248
+ return false;
249
+ }
250
+ return info.birthDate.getFullYear() === birthDate.getFullYear() && info.birthDate.getMonth() === birthDate.getMonth() && info.birthDate.getDate() === birthDate.getDate();
251
+ }
252
+
213
253
  // src/phone/constants.ts
214
254
  var OPERATOR_PREFIXES = {
215
255
  // Telkomsel (Halo, Simpati, by.U)
@@ -852,6 +892,37 @@ function maskPhoneNumber(phone, options = {}) {
852
892
  return masked;
853
893
  }
854
894
 
895
+ // src/phone/links.ts
896
+ function generateWALink(phone, message) {
897
+ if (!validatePhoneNumber(phone)) {
898
+ return "";
899
+ }
900
+ const e164 = toE164(phone);
901
+ let link = `https://wa.me/${e164}`;
902
+ if (message) {
903
+ link += `?text=${encodeURIComponent(message)}`;
904
+ }
905
+ return link;
906
+ }
907
+ function generateSmsLink(phone, body) {
908
+ if (!validatePhoneNumber(phone)) {
909
+ return "";
910
+ }
911
+ const e164 = toE164(phone);
912
+ let link = `sms:+${e164}`;
913
+ if (body) {
914
+ link += `?body=${encodeURIComponent(body)}`;
915
+ }
916
+ return link;
917
+ }
918
+ function generateTelLink(phone) {
919
+ if (!validatePhoneNumber(phone)) {
920
+ return "";
921
+ }
922
+ const e164 = toE164(phone);
923
+ return `tel:+${e164}`;
924
+ }
925
+
855
926
  // src/phone/parse.ts
856
927
  function parsePhoneNumber(phone) {
857
928
  if (!validatePhoneNumber(phone)) {
@@ -900,6 +971,13 @@ function getOperator(phone) {
900
971
  const prefix = normalized.substring(0, 4);
901
972
  return OPERATOR_PREFIXES[prefix] || null;
902
973
  }
974
+ function isProvider(phone, providerName) {
975
+ const operator = getOperator(phone);
976
+ if (!operator) {
977
+ return false;
978
+ }
979
+ return operator.toLowerCase() === providerName.toLowerCase();
980
+ }
903
981
  function getRegion(phone) {
904
982
  if (!phone.startsWith("0")) {
905
983
  return null;
@@ -925,6 +1003,254 @@ function normalizeToNational2(phone) {
925
1003
  return "";
926
1004
  }
927
1005
 
1006
+ // src/npwp/validate.ts
1007
+ function validateNPWP(npwp) {
1008
+ if (!npwp || typeof npwp !== "string") {
1009
+ return false;
1010
+ }
1011
+ const cleaned = npwp.replace(/[^\d]/g, "");
1012
+ if (cleaned.length !== 15 && cleaned.length !== 16) {
1013
+ return false;
1014
+ }
1015
+ if (!/^\d+$/.test(cleaned)) {
1016
+ return false;
1017
+ }
1018
+ return true;
1019
+ }
1020
+
1021
+ // src/npwp/format.ts
1022
+ function formatNPWP(npwp) {
1023
+ if (!validateNPWP(npwp)) {
1024
+ return npwp;
1025
+ }
1026
+ const cleaned = npwp.replace(/[^\d]/g, "");
1027
+ if (cleaned.length === 15) {
1028
+ return `${cleaned.substring(0, 2)}.${cleaned.substring(
1029
+ 2,
1030
+ 5
1031
+ )}.${cleaned.substring(5, 8)}.${cleaned.substring(8, 9)}-${cleaned.substring(
1032
+ 9,
1033
+ 12
1034
+ )}.${cleaned.substring(12, 15)}`;
1035
+ }
1036
+ return cleaned;
1037
+ }
1038
+ function parseNPWP(npwp) {
1039
+ if (!validateNPWP(npwp)) {
1040
+ return null;
1041
+ }
1042
+ const cleaned = npwp.replace(/[^\d]/g, "");
1043
+ const isNikBased = cleaned.length === 16;
1044
+ if (isNikBased) {
1045
+ return {
1046
+ npwp: cleaned,
1047
+ type: cleaned.substring(0, 2),
1048
+ serial: cleaned.substring(2, 8),
1049
+ checksum: cleaned.substring(8, 9),
1050
+ taxOfficeCode: cleaned.substring(9, 12),
1051
+ branchCode: cleaned.substring(12, 16),
1052
+ isNikBased: true
1053
+ };
1054
+ }
1055
+ return {
1056
+ npwp: cleaned,
1057
+ type: cleaned.substring(0, 2),
1058
+ serial: cleaned.substring(2, 8),
1059
+ checksum: cleaned.substring(8, 9),
1060
+ taxOfficeCode: cleaned.substring(9, 12),
1061
+ branchCode: cleaned.substring(12, 15),
1062
+ isNikBased: false
1063
+ };
1064
+ }
1065
+ function maskNPWP(npwp, options) {
1066
+ if (!npwp) return "";
1067
+ const { visibleStart = 2, visibleEnd = 3, maskChar = "*" } = options || {};
1068
+ if (npwp.includes(".") || npwp.includes("-")) {
1069
+ let digitCount = 0;
1070
+ const digitsOnly = npwp.replace(/[^\d]/g, "");
1071
+ const totalDigits = digitsOnly.length;
1072
+ return npwp.split("").map((char) => {
1073
+ if (/\d/.test(char)) {
1074
+ digitCount++;
1075
+ if (digitCount <= visibleStart || digitCount > totalDigits - visibleEnd) {
1076
+ return char;
1077
+ }
1078
+ return maskChar;
1079
+ }
1080
+ return char;
1081
+ }).join("");
1082
+ }
1083
+ const cleaned = npwp.replace(/[^\d]/g, "");
1084
+ if (cleaned.length < visibleStart + visibleEnd) {
1085
+ return cleaned.replace(/./g, maskChar);
1086
+ }
1087
+ const start = cleaned.substring(0, visibleStart);
1088
+ const end = cleaned.substring(cleaned.length - visibleEnd);
1089
+ const middle = maskChar.repeat(cleaned.length - visibleStart - visibleEnd);
1090
+ return `${start}${middle}${end}`;
1091
+ }
1092
+
1093
+ // src/plate/regions.ts
1094
+ var PLATE_REGIONS = {
1095
+ A: "Banten",
1096
+ B: "Jakarta, Depok, Tangerang, Bekasi",
1097
+ D: "Bandung, Cimahi",
1098
+ E: "Cirebon, Indramayu, Majalengka, Kuningan",
1099
+ F: "Bogor, Cianjur, Sukabumi",
1100
+ G: "Pekalongan, Pemalang, Batang, Tegal, Brebes",
1101
+ H: "Semarang, Salatiga, Kendal, Demak",
1102
+ K: "Pati, Kudus, Jepara, Rembang, Blora, Grobogan",
1103
+ L: "Surabaya",
1104
+ M: "Madura",
1105
+ N: "Malang, Probolinggo, Pasuruan, Lumajang, Batu",
1106
+ P: "Besuki, Bondowoso, Situbondo, Jember, Banyuwangi",
1107
+ R: "Banyumas, Cilacap, Purbalinggo, Banjarnegara",
1108
+ S: "Bojonegoro, Tuban, Lamongan, Jombang, Mojokerto",
1109
+ T: "Purwakarta, Subang, Karawang",
1110
+ AA: "Kedu, Magelang, Purworejo, Kebumen, Temanggung, Wonosobo",
1111
+ AB: "Yogyakarta",
1112
+ AD: "Surakarta, Boyolali, Sukoharjo, Karanganyar, Wonogiri, Sragen, Klaten",
1113
+ AE: "Madiun, Ngawi, Magetan, Ponorogo, Pacitan",
1114
+ AG: "Kediri, Blitar, Tulungagung, Nganjuk, Trenggalek",
1115
+ BA: "Sumatera Barat",
1116
+ BB: "Sumatera Utara (Pantai Barat)",
1117
+ BD: "Bengkulu",
1118
+ BE: "Lampung",
1119
+ BG: "Sumatera Selatan",
1120
+ BH: "Jambi",
1121
+ BK: "Sumatera Utara (Pantai Timur)",
1122
+ BL: "Aceh",
1123
+ BM: "Riau",
1124
+ BN: "Kepulauan Bangka Belitung",
1125
+ BP: "Kepulauan Riau",
1126
+ DA: "Kalimantan Selatan",
1127
+ DB: "Sulawesi Utara (Daratan)",
1128
+ DC: "Sulawesi Barat",
1129
+ DD: "Sulawesi Selatan (Selatan)",
1130
+ DE: "Maluku",
1131
+ DF: "Timor Timur (Historical)",
1132
+ DG: "Maluku Utara",
1133
+ DH: "NTT (Timor)",
1134
+ DK: "Bali",
1135
+ DL: "Sulawesi Utara (Kepulauan)",
1136
+ DM: "Gorontalo",
1137
+ DN: "Sulawesi Tengah",
1138
+ DP: "Sulawesi Selatan (Utara)",
1139
+ DR: "NTB (Lombok)",
1140
+ DS: "Papua",
1141
+ DT: "Sulawesi Tenggara",
1142
+ EA: "NTB (Sumbawa)",
1143
+ EB: "NTT (Flores)",
1144
+ ED: "NTT (Sumba)",
1145
+ KB: "Kalimantan Barat",
1146
+ KH: "Kalimantan Tengah",
1147
+ KT: "Kalimantan Timur",
1148
+ KU: "Kalimantan Utara",
1149
+ PA: "Papua",
1150
+ PB: "Papua Barat"
1151
+ };
1152
+
1153
+ // src/plate/utils.ts
1154
+ function validatePlate(plate) {
1155
+ if (!plate || typeof plate !== "string") {
1156
+ return false;
1157
+ }
1158
+ const cleaned = plate.replace(/\s+/g, "").toUpperCase();
1159
+ const regex = /^[A-Z]{1,2}\d{1,4}[A-Z]{1,3}$/;
1160
+ return regex.test(cleaned);
1161
+ }
1162
+ function getRegionFromPlate(plate) {
1163
+ if (!plate || typeof plate !== "string") {
1164
+ return null;
1165
+ }
1166
+ const cleaned = plate.replace(/\s+/g, "").toUpperCase();
1167
+ const match = cleaned.match(/^([A-Z]{1,2})/);
1168
+ if (!match) {
1169
+ return null;
1170
+ }
1171
+ const prefix = match[1];
1172
+ return PLATE_REGIONS[prefix] || null;
1173
+ }
1174
+ function formatPlate(plate) {
1175
+ if (!plate) return "";
1176
+ const cleaned = plate.replace(/\s+/g, "").toUpperCase();
1177
+ const match = cleaned.match(/^([A-Z]{1,2})(\d{1,4})([A-Z]{1,3})$/);
1178
+ if (!match) {
1179
+ return cleaned;
1180
+ }
1181
+ return `${match[1]} ${match[2]} ${match[3]}`;
1182
+ }
1183
+
1184
+ // src/vin/constants.ts
1185
+ var VIN_LENGTH = 17;
1186
+ var VIN_CHECK_DIGIT_INDEX = 8;
1187
+ var VIN_MODULUS = 11;
1188
+ var VIN_CHECK_DIGIT_X = "X";
1189
+ var VIN_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2];
1190
+ var VIN_CHAR_VALUES = {
1191
+ "0": 0,
1192
+ "1": 1,
1193
+ "2": 2,
1194
+ "3": 3,
1195
+ "4": 4,
1196
+ "5": 5,
1197
+ "6": 6,
1198
+ "7": 7,
1199
+ "8": 8,
1200
+ "9": 9,
1201
+ "A": 1,
1202
+ "B": 2,
1203
+ "C": 3,
1204
+ "D": 4,
1205
+ "E": 5,
1206
+ "F": 6,
1207
+ "G": 7,
1208
+ "H": 8,
1209
+ "J": 1,
1210
+ "K": 2,
1211
+ "L": 3,
1212
+ "M": 4,
1213
+ "N": 5,
1214
+ "P": 7,
1215
+ "R": 9,
1216
+ "S": 2,
1217
+ "T": 3,
1218
+ "U": 4,
1219
+ "V": 5,
1220
+ "W": 6,
1221
+ "X": 7,
1222
+ "Y": 8,
1223
+ "Z": 9
1224
+ };
1225
+ var EXCLUDED_VIN_CHARS = ["I", "O", "Q"];
1226
+
1227
+ // src/vin/validate.ts
1228
+ function validateVIN(vin) {
1229
+ if (!vin || vin.length !== VIN_LENGTH) {
1230
+ return false;
1231
+ }
1232
+ const normalizedVIN = vin.toUpperCase();
1233
+ for (const char of EXCLUDED_VIN_CHARS) {
1234
+ if (normalizedVIN.includes(char)) {
1235
+ return false;
1236
+ }
1237
+ }
1238
+ let sum = 0;
1239
+ for (let i = 0; i < VIN_LENGTH; i++) {
1240
+ const char = normalizedVIN[i];
1241
+ const weight = VIN_WEIGHTS[i];
1242
+ const val = VIN_CHAR_VALUES[char];
1243
+ if (val === void 0) {
1244
+ return false;
1245
+ }
1246
+ sum += val * weight;
1247
+ }
1248
+ const checkDigitValue = sum % VIN_MODULUS;
1249
+ const expectedCheckDigit = checkDigitValue === 10 ? VIN_CHECK_DIGIT_X : checkDigitValue.toString();
1250
+ const actualCheckDigit = normalizedVIN[VIN_CHECK_DIGIT_INDEX];
1251
+ return actualCheckDigit === expectedCheckDigit;
1252
+ }
1253
+
928
1254
  // src/currency/format.ts
929
1255
  function formatRupiah(amount, options) {
930
1256
  const {
@@ -1150,6 +1476,37 @@ function capitalize(str) {
1150
1476
  return str.charAt(0).toUpperCase() + str.slice(1);
1151
1477
  }
1152
1478
 
1479
+ // src/currency/utils.ts
1480
+ function roundToClean(amount, unit = "ribu") {
1481
+ const divisors = {
1482
+ ribu: 1e3,
1483
+ "ratus-ribu": 1e5,
1484
+ juta: 1e6
1485
+ };
1486
+ const divisor = divisors[unit];
1487
+ return Math.round(amount / divisor) * divisor;
1488
+ }
1489
+ function formatAccounting(amount, options) {
1490
+ const isNegative = amount < 0;
1491
+ const formatted = formatRupiah(Math.abs(amount), options);
1492
+ if (isNegative) {
1493
+ return `(${formatted})`;
1494
+ }
1495
+ return formatted;
1496
+ }
1497
+ function calculateTax(amount, rate = 0.11) {
1498
+ return amount * rate;
1499
+ }
1500
+ function addRupiahSymbol(amount) {
1501
+ if (typeof amount === "number") {
1502
+ return `Rp ${amount.toLocaleString("id-ID")}`;
1503
+ }
1504
+ if (amount.trim().startsWith("Rp")) {
1505
+ return amount;
1506
+ }
1507
+ return `Rp ${amount.trim()}`;
1508
+ }
1509
+
1153
1510
  // src/text/constants.ts
1154
1511
  var LOWERCASE_WORDS = [
1155
1512
  // Indonesian prepositions (kata depan)
@@ -1600,6 +1957,741 @@ var ABBREVIATIONS = {
1600
1957
  "m3.": "meter kubik",
1601
1958
  "ha.": "hektar"
1602
1959
  };
1960
+ var PROFANITY = [
1961
+ "anjing",
1962
+ "babi",
1963
+ "bangsat",
1964
+ "bajingan",
1965
+ "brengsek",
1966
+ "goblok",
1967
+ "tolol",
1968
+ "idiot",
1969
+ "perek",
1970
+ "jablay",
1971
+ "kontol",
1972
+ "memek",
1973
+ "ngewe",
1974
+ "puki",
1975
+ "jembut",
1976
+ "asu",
1977
+ "itil",
1978
+ "lanjiao",
1979
+ "pantek",
1980
+ "anying",
1981
+ "anjrit"
1982
+ ];
1983
+ var STOPWORDS = [
1984
+ "ada",
1985
+ "adalah",
1986
+ "adanya",
1987
+ "adapun",
1988
+ "agak",
1989
+ "agaknya",
1990
+ "agar",
1991
+ "akan",
1992
+ "akankah",
1993
+ "akhir",
1994
+ "akhiri",
1995
+ "akhirnya",
1996
+ "aku",
1997
+ "akulah",
1998
+ "amat",
1999
+ "amatlah",
2000
+ "anda",
2001
+ "andalah",
2002
+ "antar",
2003
+ "antara",
2004
+ "antaranya",
2005
+ "apa",
2006
+ "apaan",
2007
+ "apabila",
2008
+ "apakah",
2009
+ "apalagi",
2010
+ "apatah",
2011
+ "artinya",
2012
+ "asal",
2013
+ "asalkan",
2014
+ "atas",
2015
+ "atau",
2016
+ "ataukah",
2017
+ "ataupun",
2018
+ "awal",
2019
+ "awalnya",
2020
+ "bagai",
2021
+ "bagaikan",
2022
+ "bagaimana",
2023
+ "bagaimanakah",
2024
+ "bagaimanapun",
2025
+ "bagi",
2026
+ "bagian",
2027
+ "bahkan",
2028
+ "bahwa",
2029
+ "bahwasanya",
2030
+ "baik",
2031
+ "bakal",
2032
+ "bakalan",
2033
+ "balik",
2034
+ "banyak",
2035
+ "bapak",
2036
+ "baru",
2037
+ "bawah",
2038
+ "beberapa",
2039
+ "begini",
2040
+ "beginian",
2041
+ "beginikah",
2042
+ "beginilah",
2043
+ "begitu",
2044
+ "begitukah",
2045
+ "begitulah",
2046
+ "begitupun",
2047
+ "bekerja",
2048
+ "belakang",
2049
+ "belakangan",
2050
+ "belum",
2051
+ "belumlah",
2052
+ "benar",
2053
+ "benarkah",
2054
+ "benarlah",
2055
+ "berada",
2056
+ "berakhir",
2057
+ "berakhirlah",
2058
+ "berakhirnya",
2059
+ "berapa",
2060
+ "berapakah",
2061
+ "berapalah",
2062
+ "berapapun",
2063
+ "berarti",
2064
+ "berawal",
2065
+ "berbagai",
2066
+ "berikut",
2067
+ "berikutnya",
2068
+ "berjumlah",
2069
+ "berkali-kali",
2070
+ "berkata",
2071
+ "berkeinginan",
2072
+ "berkenaan",
2073
+ "berlainan",
2074
+ "berlalu",
2075
+ "berlangsung",
2076
+ "berlebihan",
2077
+ "bermacam",
2078
+ "bermacam-macam",
2079
+ "bermaksud",
2080
+ "bermula",
2081
+ "bersama",
2082
+ "bersama-sama",
2083
+ "bersiap",
2084
+ "bersiap-siap",
2085
+ "bertanya",
2086
+ "bertanya-tanya",
2087
+ "berturut",
2088
+ "berturut-turut",
2089
+ "bertutur",
2090
+ "berujar",
2091
+ "berupa",
2092
+ "besar",
2093
+ "betul",
2094
+ "betulkah",
2095
+ "biasa",
2096
+ "biasanya",
2097
+ "bila",
2098
+ "bilakah",
2099
+ "bisa",
2100
+ "bisakah",
2101
+ "boleh",
2102
+ "bolehkah",
2103
+ "bolehlah",
2104
+ "buat",
2105
+ "bukan",
2106
+ "bukankah",
2107
+ "bukanlah",
2108
+ "bukannya",
2109
+ "bulan",
2110
+ "bung",
2111
+ "cara",
2112
+ "caranya",
2113
+ "cukup",
2114
+ "cukupkah",
2115
+ "cukuplah",
2116
+ "cuma",
2117
+ "dahulu",
2118
+ "dalam",
2119
+ "dan",
2120
+ "dapat",
2121
+ "dari",
2122
+ "daripada",
2123
+ "datang",
2124
+ "dekat",
2125
+ "demi",
2126
+ "demikian",
2127
+ "demikianlah",
2128
+ "dengan",
2129
+ "depan",
2130
+ "di",
2131
+ "dia",
2132
+ "diakhiri",
2133
+ "diakhirinya",
2134
+ "dialah",
2135
+ "diantara",
2136
+ "diantaranya",
2137
+ "diberi",
2138
+ "diberikan",
2139
+ "diberikannya",
2140
+ "dibuat",
2141
+ "dibuatnya",
2142
+ "didapat",
2143
+ "didatangkan",
2144
+ "digunakan",
2145
+ "diibaratkan",
2146
+ "diingat",
2147
+ "diingatkan",
2148
+ "diinginkan",
2149
+ "dijawab",
2150
+ "dijelaskan",
2151
+ "dijelaskannya",
2152
+ "dikarenakan",
2153
+ "dikatakan",
2154
+ "dikatakannya",
2155
+ "dikerjakan",
2156
+ "diketahui",
2157
+ "diketahuinya",
2158
+ "dikira",
2159
+ "dilakukan",
2160
+ "dilalui",
2161
+ "dilihat",
2162
+ "dimaksud",
2163
+ "dimaksudkan",
2164
+ "dimaksudkannya",
2165
+ "dimana",
2166
+ "dimanalah",
2167
+ "dimulai",
2168
+ "dimulailah",
2169
+ "dimulainya",
2170
+ "diminta",
2171
+ "dimintai",
2172
+ "dimisalkan",
2173
+ "dimungkinkan",
2174
+ "dini",
2175
+ "dipastikan",
2176
+ "diperbuat",
2177
+ "diperbuatnya",
2178
+ "dipergunakan",
2179
+ "diperkirakan",
2180
+ "diperlihatkan",
2181
+ "diperlukan",
2182
+ "diperlukannya",
2183
+ "dipersoalkan",
2184
+ "dipertanyakan",
2185
+ "dipunyai",
2186
+ "diri",
2187
+ "dirinya",
2188
+ "disampaikan",
2189
+ "disebut",
2190
+ "disebutkan",
2191
+ "disebutkannya",
2192
+ "disini",
2193
+ "disinilah",
2194
+ "disitulah",
2195
+ "diterangkan",
2196
+ "diterangkannya",
2197
+ "diteruskan",
2198
+ "ditujukan",
2199
+ "ditunjuk",
2200
+ "ditunjuki",
2201
+ "ditunjukkan",
2202
+ "ditunjukkannya",
2203
+ "ditunjuknya",
2204
+ "dituturkan",
2205
+ "dituturkannya",
2206
+ "diucapkan",
2207
+ "diucapkannya",
2208
+ "diungkapkan",
2209
+ "dua",
2210
+ "dulu",
2211
+ "empat",
2212
+ "enggak",
2213
+ "enggaknya",
2214
+ "entah",
2215
+ "entahlah",
2216
+ "guna",
2217
+ "gunakan",
2218
+ "hal",
2219
+ "hampir",
2220
+ "hanya",
2221
+ "hanyalah",
2222
+ "hari",
2223
+ "harus",
2224
+ "haruslah",
2225
+ "harusnya",
2226
+ "hendak",
2227
+ "hendaklah",
2228
+ "hendaknya",
2229
+ "hingga",
2230
+ "ia",
2231
+ "ialah",
2232
+ "ibarat",
2233
+ "ibaratkan",
2234
+ "ibaratnya",
2235
+ "ibu",
2236
+ "ikut",
2237
+ "ingat",
2238
+ "ingat-ingat",
2239
+ "ingin",
2240
+ "inginkah",
2241
+ "inginkan",
2242
+ "ini",
2243
+ "inikah",
2244
+ "inilah",
2245
+ "itu",
2246
+ "itukah",
2247
+ "itulah",
2248
+ "jadi",
2249
+ "jadilah",
2250
+ "jadinya",
2251
+ "jangan",
2252
+ "jangankan",
2253
+ "janganlah",
2254
+ "jauh",
2255
+ "jawab",
2256
+ "jawaban",
2257
+ "jawabnya",
2258
+ "jelas",
2259
+ "jelaskan",
2260
+ "jelaslah",
2261
+ "jelasnya",
2262
+ "jika",
2263
+ "jikalau",
2264
+ "juga",
2265
+ "jumlah",
2266
+ "jumlahnya",
2267
+ "justru",
2268
+ "kala",
2269
+ "kalau",
2270
+ "kalaulah",
2271
+ "kalaupun",
2272
+ "kali",
2273
+ "kalian",
2274
+ "kami",
2275
+ "kamilah",
2276
+ "kamu",
2277
+ "kamulah",
2278
+ "kan",
2279
+ "kapan",
2280
+ "kapankah",
2281
+ "kapanpun",
2282
+ "karena",
2283
+ "karenanya",
2284
+ "ke",
2285
+ "keadaan",
2286
+ "kebetulan",
2287
+ "kecil",
2288
+ "kedua",
2289
+ "keduanya",
2290
+ "keinginan",
2291
+ "kelak",
2292
+ "kelihatan",
2293
+ "kelihatannya",
2294
+ "kelima",
2295
+ "keluar",
2296
+ "kembali",
2297
+ "kemudian",
2298
+ "kemungkinan",
2299
+ "kemungkinannya",
2300
+ "kenapa",
2301
+ "kepada",
2302
+ "kepadanya",
2303
+ "kesampaian",
2304
+ "keseluruhan",
2305
+ "keseluruhannya",
2306
+ "keterlaluan",
2307
+ "ketika",
2308
+ "khususnya",
2309
+ "kini",
2310
+ "kinilah",
2311
+ "kira",
2312
+ "kira-kira",
2313
+ "kiranya",
2314
+ "kita",
2315
+ "kitalah",
2316
+ "kok",
2317
+ "kurang",
2318
+ "lagi",
2319
+ "lagian",
2320
+ "lah",
2321
+ "lain",
2322
+ "lainnya",
2323
+ "lalu",
2324
+ "lama",
2325
+ "lamanya",
2326
+ "lanjut",
2327
+ "lanjutnya",
2328
+ "lebih",
2329
+ "lewat",
2330
+ "luar",
2331
+ "macam",
2332
+ "maka",
2333
+ "makanya",
2334
+ "makin",
2335
+ "malah",
2336
+ "malahan",
2337
+ "mampu",
2338
+ "mampukah",
2339
+ "mana",
2340
+ "manakala",
2341
+ "manalagi",
2342
+ "masih",
2343
+ "masihkah",
2344
+ "masing",
2345
+ "masing-masing",
2346
+ "mau",
2347
+ "maupun",
2348
+ "melainkan",
2349
+ "melakukan",
2350
+ "melalui",
2351
+ "melihat",
2352
+ "melihatnya",
2353
+ "memang",
2354
+ "memastikan",
2355
+ "memberi",
2356
+ "memberikan",
2357
+ "membuat",
2358
+ "memerlukan",
2359
+ "memihak",
2360
+ "meminta",
2361
+ "memisalkan",
2362
+ "memperbuat",
2363
+ "mempergunakan",
2364
+ "memperkirakan",
2365
+ "memperlihatkan",
2366
+ "mempersiapkan",
2367
+ "mempersoalkan",
2368
+ "mempertanyakan",
2369
+ "mempunyai",
2370
+ "memulai",
2371
+ "memungkinkan",
2372
+ "memutuskan",
2373
+ "menanti",
2374
+ "menanti-nanti",
2375
+ "menantikan",
2376
+ "menunjuk",
2377
+ "menunjuknya",
2378
+ "menuju",
2379
+ "menurut",
2380
+ "menurutnya",
2381
+ "menurutmu",
2382
+ "menurutku",
2383
+ "menurutnya",
2384
+ "menurut mereka",
2385
+ "menyampaikan",
2386
+ "menyebut",
2387
+ "menyebutkan",
2388
+ "menjelaskan",
2389
+ "menjadi",
2390
+ "menjadikan",
2391
+ "menjalani",
2392
+ "menjelang",
2393
+ "menjawab",
2394
+ "menunjukkan",
2395
+ "menuangkan",
2396
+ "menulis",
2397
+ "menyatakan",
2398
+ "merupakan",
2399
+ "mereka",
2400
+ "merekalah",
2401
+ "meski",
2402
+ "meskipun",
2403
+ "mula",
2404
+ "mulai",
2405
+ "mulailah",
2406
+ "mulanya",
2407
+ "mungkin",
2408
+ "mungkinkah",
2409
+ "nah",
2410
+ "naik",
2411
+ "namun",
2412
+ "nanti",
2413
+ "nantinya",
2414
+ "nyaris",
2415
+ "oleh",
2416
+ "olehnya",
2417
+ "orang",
2418
+ "pada",
2419
+ "padahal",
2420
+ "padanya",
2421
+ "pakai",
2422
+ "paling",
2423
+ "panjang",
2424
+ "pantas",
2425
+ "para",
2426
+ "pasti",
2427
+ "pastilah",
2428
+ "pagi",
2429
+ "per",
2430
+ "pernah",
2431
+ "persoalan",
2432
+ "pertama",
2433
+ "pertama-tama",
2434
+ "perlu",
2435
+ "perlukah",
2436
+ "perlulah",
2437
+ "pernah",
2438
+ "pihak",
2439
+ "pihaknya",
2440
+ "pukul",
2441
+ "pula",
2442
+ "pun",
2443
+ "punya",
2444
+ "rasa",
2445
+ "rasanya",
2446
+ "rata",
2447
+ "rupanya",
2448
+ "saat",
2449
+ "saatnya",
2450
+ "saja",
2451
+ "sajalah",
2452
+ "salam",
2453
+ "saling",
2454
+ "sama",
2455
+ "sama-sama",
2456
+ "sambil",
2457
+ "sampai",
2458
+ "sampai-sampai",
2459
+ "sampaikan",
2460
+ "sana",
2461
+ "sangat",
2462
+ "sangatlah",
2463
+ "satu",
2464
+ "saya",
2465
+ "sayalah",
2466
+ "sayang",
2467
+ "seperti",
2468
+ "seperti-itu",
2469
+ "sepura",
2470
+ "sebab",
2471
+ "sebabnya",
2472
+ "sebagai",
2473
+ "sebagaimana",
2474
+ "sebagainya",
2475
+ "sebagian",
2476
+ "sebaik",
2477
+ "sebaik-baiknya",
2478
+ "sebaiknya",
2479
+ "sebaliknya",
2480
+ "sebanyak",
2481
+ "sebegini",
2482
+ "sebegitu",
2483
+ "sebelum",
2484
+ "sebelumnya",
2485
+ "sebenarnya",
2486
+ "seberapa",
2487
+ "sebesar",
2488
+ "sebetulnya",
2489
+ "sebisanya",
2490
+ "sebuah",
2491
+ "sebut",
2492
+ "sebutkan",
2493
+ "sebutnya",
2494
+ "secara",
2495
+ "secukupnya",
2496
+ "sedang",
2497
+ "sedangkan",
2498
+ "sedikit",
2499
+ "sedikitnya",
2500
+ "sedemikian",
2501
+ "sediakala",
2502
+ "sedikit",
2503
+ "sedikitnya",
2504
+ "segala",
2505
+ "segalanya",
2506
+ "segera",
2507
+ "seharusnya",
2508
+ "sehingga",
2509
+ "seingat",
2510
+ "sejak",
2511
+ "sejauh",
2512
+ "sejenak",
2513
+ "sejumlah",
2514
+ "sekali",
2515
+ "sekali-kali",
2516
+ "sekalian",
2517
+ "sekaligus",
2518
+ "sekalipun",
2519
+ "sekarang",
2520
+ "sekaranglah",
2521
+ "sekecil",
2522
+ "seketika",
2523
+ "sekiranya",
2524
+ "sekitar",
2525
+ "sekitarnya",
2526
+ "sekurang",
2527
+ "sekurangnya",
2528
+ "sela",
2529
+ "selalu",
2530
+ "selama",
2531
+ "selama-lamanya",
2532
+ "selamanya",
2533
+ "selanjutnya",
2534
+ "seluruh",
2535
+ "seluruhnya",
2536
+ "semacam",
2537
+ "semakin",
2538
+ "semampu",
2539
+ "semampunya",
2540
+ "semasa",
2541
+ "semata",
2542
+ "semata-mata",
2543
+ "semaunya",
2544
+ "sementara",
2545
+ "semisal",
2546
+ "semisalnya",
2547
+ "sempat",
2548
+ "semua",
2549
+ "semuanya",
2550
+ "semula",
2551
+ "sendiri",
2552
+ "sendirinya",
2553
+ "seolah",
2554
+ "seolah-olah",
2555
+ "seorang",
2556
+ "sepanjang",
2557
+ "sepantasnya",
2558
+ "sepantasnyalah",
2559
+ "seperempat",
2560
+ "seperti",
2561
+ "sepertinya",
2562
+ "sepihak",
2563
+ "sepuluh",
2564
+ "seratus",
2565
+ "seribu",
2566
+ "sering",
2567
+ "seringnya",
2568
+ "serta",
2569
+ "serupa",
2570
+ "sesaat",
2571
+ "sesama",
2572
+ "sesampai",
2573
+ "sesampainya",
2574
+ "sesegera",
2575
+ "sesekali",
2576
+ "seseorang",
2577
+ "sesuatu",
2578
+ "sesuatunya",
2579
+ "sesudah",
2580
+ "sesudahnya",
2581
+ "setelah",
2582
+ "setempat",
2583
+ "setengah",
2584
+ "seterusnya",
2585
+ "setiap",
2586
+ "setidaknya",
2587
+ "setinggi",
2588
+ "seusai",
2589
+ "sewaktu",
2590
+ "siap",
2591
+ "siapa",
2592
+ "siapakah",
2593
+ "siapapun",
2594
+ "sini",
2595
+ "sinilah",
2596
+ "situ",
2597
+ "situlah",
2598
+ "suatu",
2599
+ "sudah",
2600
+ "sudahkah",
2601
+ "sudahlah",
2602
+ "supaya",
2603
+ "tadi",
2604
+ "tadinya",
2605
+ "tahu",
2606
+ "tak",
2607
+ "tambah",
2608
+ "tambahnya",
2609
+ "tampak",
2610
+ "tampaknya",
2611
+ "tandas",
2612
+ "tandasnya",
2613
+ "tanpa",
2614
+ "tanya",
2615
+ "tanyakan",
2616
+ "tanyanya",
2617
+ "tapi",
2618
+ "tegas",
2619
+ "tegasnya",
2620
+ "telah",
2621
+ "tempat",
2622
+ "tengah",
2623
+ "tentang",
2624
+ "tentu",
2625
+ "tentulah",
2626
+ "tentunya",
2627
+ "tepat",
2628
+ "terakhir",
2629
+ "terasa",
2630
+ "terbanyak",
2631
+ "terdahulu",
2632
+ "terdapat",
2633
+ "terdiri",
2634
+ "terdiri-dari",
2635
+ "terhadap",
2636
+ "terhadapnya",
2637
+ "teringat",
2638
+ "teringat-ingat",
2639
+ "terjadi",
2640
+ "terjadilah",
2641
+ "terjadinya",
2642
+ "terkira",
2643
+ "terlalu",
2644
+ "terlebih",
2645
+ "terlihat",
2646
+ "termasuk",
2647
+ "ternyata",
2648
+ "tersampaikan",
2649
+ "tersebut",
2650
+ "tersebutlah",
2651
+ "tertentu",
2652
+ "tertuju",
2653
+ "terus",
2654
+ "terutama",
2655
+ "tetap",
2656
+ "tetapi",
2657
+ "tiap",
2658
+ "tiba",
2659
+ "tiba-tiba",
2660
+ "tidak",
2661
+ "tidakkah",
2662
+ "tidaklah",
2663
+ "tiga",
2664
+ "tadi",
2665
+ "tadinya",
2666
+ "tinggi",
2667
+ "toh",
2668
+ "tuju",
2669
+ "tunjuk",
2670
+ "turut",
2671
+ "tutur",
2672
+ "tuturnya",
2673
+ "ucap",
2674
+ "ucapnya",
2675
+ "ujar",
2676
+ "ujarnya",
2677
+ "umumnya",
2678
+ "ungkap",
2679
+ "ungkapnya",
2680
+ "untuk",
2681
+ "untaian",
2682
+ "usai",
2683
+ "usah",
2684
+ "waduh",
2685
+ "wah",
2686
+ "wahai",
2687
+ "walau",
2688
+ "walaupun",
2689
+ "wong",
2690
+ "yaitu",
2691
+ "yakin",
2692
+ "yakni",
2693
+ "yang"
2694
+ ];
1603
2695
 
1604
2696
  // src/text/capitalization.ts
1605
2697
  function capitalize2(text) {
@@ -1937,6 +3029,78 @@ function contractAbbreviation(text, options) {
1937
3029
  return result;
1938
3030
  }
1939
3031
 
3032
+ // src/text/filter.ts
3033
+ function profanityFilter(text, mask = "*") {
3034
+ let filtered = text;
3035
+ PROFANITY.forEach((word) => {
3036
+ const regex = new RegExp(`\\b${word}\\b`, "gi");
3037
+ filtered = filtered.replace(regex, mask.repeat(word.length));
3038
+ });
3039
+ return filtered;
3040
+ }
3041
+ function removeStopwords(text) {
3042
+ const words = text.split(/\s+/);
3043
+ const filtered = words.filter(
3044
+ (word) => !STOPWORDS.includes(word.toLowerCase())
3045
+ );
3046
+ return filtered.join(" ");
3047
+ }
3048
+
3049
+ // src/text/normalization.ts
3050
+ var INFORMAL_MAP = {
3051
+ gw: "saya",
3052
+ gua: "saya",
3053
+ lu: "kamu",
3054
+ lo: "kamu",
3055
+ elo: "kamu",
3056
+ lagi: "sedang",
3057
+ gue: "saya",
3058
+ gwe: "saya",
3059
+ gak: "tidak",
3060
+ ga: "tidak",
3061
+ nggak: "tidak",
3062
+ kalo: "kalau",
3063
+ karna: "karena",
3064
+ tapi: "tetapi",
3065
+ udah: "sudah",
3066
+ dah: "sudah",
3067
+ aja: "saja",
3068
+ banget: "sekali",
3069
+ emang: "memang",
3070
+ pake: "pakai",
3071
+ bikin: "membuat",
3072
+ kasih: "memberi",
3073
+ dapet: "dapat",
3074
+ liat: "lihat",
3075
+ ngasih: "memberi",
3076
+ nyari: "mencari",
3077
+ nanya: "bertanya",
3078
+ bilang: "berkata"
3079
+ };
3080
+ function toFormal(text) {
3081
+ const words = text.split(/\s+/);
3082
+ const formalized = words.map((word) => {
3083
+ const lower = word.toLowerCase().replace(/[^\w]/g, "");
3084
+ const formal = INFORMAL_MAP[lower];
3085
+ if (formal) {
3086
+ if (word[0] === word[0].toUpperCase()) {
3087
+ return formal.charAt(0).toUpperCase() + formal.slice(1);
3088
+ }
3089
+ return formal;
3090
+ }
3091
+ return word;
3092
+ });
3093
+ return formalized.join(" ");
3094
+ }
3095
+ function isAlay(text) {
3096
+ if (!text) return false;
3097
+ const alternatingCaps = /([a-z][A-Z][a-z]|[A-Z][a-z][A-Z])/.test(text);
3098
+ const numberSub = /\b\w*[0431572]\w*\b/.test(text);
3099
+ const qSub = /q/i.test(text) && !/u/i.test(text);
3100
+ const excessiveChars = /(.)\1{2,}/.test(text);
3101
+ return alternatingCaps || numberSub || qSub || excessiveChars;
3102
+ }
3103
+
1940
3104
  // src/text/extract.ts
1941
3105
  function truncate(text, maxLength, options) {
1942
3106
  if (!text || maxLength <= 0) {
@@ -2045,30 +3209,51 @@ function similarity(str1, str2) {
2045
3209
  return 1 - distance / maxLength;
2046
3210
  }
2047
3211
 
3212
+ exports.addRupiahSymbol = addRupiahSymbol;
3213
+ exports.calculateTax = calculateTax;
2048
3214
  exports.capitalize = capitalize2;
2049
3215
  exports.cleanPhoneNumber = cleanPhoneNumber;
2050
3216
  exports.compareStrings = compareStrings;
2051
3217
  exports.contractAbbreviation = contractAbbreviation;
2052
3218
  exports.expandAbbreviation = expandAbbreviation;
2053
3219
  exports.extractWords = extractWords;
3220
+ exports.formatAccounting = formatAccounting;
3221
+ exports.formatBirthDate = formatBirthDate;
2054
3222
  exports.formatCompact = formatCompact;
2055
3223
  exports.formatNIK = formatNIK;
3224
+ exports.formatNPWP = formatNPWP;
2056
3225
  exports.formatPhoneNumber = formatPhoneNumber;
3226
+ exports.formatPlate = formatPlate;
2057
3227
  exports.formatRupiah = formatRupiah;
3228
+ exports.generateSmsLink = generateSmsLink;
3229
+ exports.generateTelLink = generateTelLink;
3230
+ exports.generateWALink = generateWALink;
3231
+ exports.getAge = getAge;
2058
3232
  exports.getOperator = getOperator;
3233
+ exports.getRegionFromPlate = getRegionFromPlate;
3234
+ exports.isAlay = isAlay;
2059
3235
  exports.isLandlineNumber = isLandlineNumber;
2060
3236
  exports.isMobileNumber = isMobileNumber;
3237
+ exports.isProvider = isProvider;
3238
+ exports.isValidForBirthDate = isValidForBirthDate;
3239
+ exports.isValidForGender = isValidForGender;
2061
3240
  exports.maskNIK = maskNIK;
3241
+ exports.maskNPWP = maskNPWP;
2062
3242
  exports.maskPhoneNumber = maskPhoneNumber;
2063
3243
  exports.normalizeWhitespace = normalizeWhitespace;
2064
3244
  exports.parseNIK = parseNIK;
3245
+ exports.parseNPWP = parseNPWP;
2065
3246
  exports.parsePhoneNumber = parsePhoneNumber;
2066
3247
  exports.parseRupiah = parseRupiah;
3248
+ exports.profanityFilter = profanityFilter;
2067
3249
  exports.removeAccents = removeAccents;
3250
+ exports.removeStopwords = removeStopwords;
3251
+ exports.roundToClean = roundToClean;
2068
3252
  exports.sanitize = sanitize;
2069
3253
  exports.similarity = similarity;
2070
3254
  exports.slugify = slugify;
2071
3255
  exports.toE164 = toE164;
3256
+ exports.toFormal = toFormal;
2072
3257
  exports.toInternational = toInternational;
2073
3258
  exports.toNational = toNational;
2074
3259
  exports.toSentenceCase = toSentenceCase;
@@ -2076,6 +3261,9 @@ exports.toTitleCase = toTitleCase;
2076
3261
  exports.toWords = toWords;
2077
3262
  exports.truncate = truncate;
2078
3263
  exports.validateNIK = validateNIK;
3264
+ exports.validateNPWP = validateNPWP;
2079
3265
  exports.validatePhoneNumber = validatePhoneNumber;
3266
+ exports.validatePlate = validatePlate;
3267
+ exports.validateVIN = validateVIN;
2080
3268
  //# sourceMappingURL=index.cjs.map
2081
3269
  //# sourceMappingURL=index.cjs.map