@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.
- package/dist/{compare-B1MKSOWV.d.cts → compare-CZadJMGl.d.cts} +54 -1
- package/dist/{compare-B1MKSOWV.d.ts → compare-CZadJMGl.d.ts} +54 -1
- package/dist/currency/index.cjs +23 -0
- package/dist/currency/index.cjs.map +1 -1
- package/dist/currency/index.d.cts +367 -3
- package/dist/currency/index.d.ts +367 -3
- package/dist/currency/index.js +21 -1
- package/dist/currency/index.js.map +1 -1
- package/dist/index.cjs +1188 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -4
- package/dist/index.d.ts +7 -4
- package/dist/index.js +1165 -1
- package/dist/index.js.map +1 -1
- package/dist/nik/index.cjs +44 -0
- package/dist/nik/index.cjs.map +1 -1
- package/dist/nik/index.d.cts +44 -1
- package/dist/nik/index.d.ts +44 -1
- package/dist/nik/index.js +41 -1
- package/dist/nik/index.js.map +1 -1
- package/dist/npwp/index.cjs +95 -0
- package/dist/npwp/index.cjs.map +1 -0
- package/dist/npwp/index.d.cts +76 -0
- package/dist/npwp/index.d.ts +76 -0
- package/dist/npwp/index.js +90 -0
- package/dist/npwp/index.js.map +1 -0
- package/dist/phone/index.cjs +42 -0
- package/dist/phone/index.cjs.map +1 -1
- package/dist/phone/index.d.cts +57 -1
- package/dist/phone/index.d.ts +57 -1
- package/dist/phone/index.js +39 -1
- package/dist/phone/index.js.map +1 -1
- package/dist/plate/index.cjs +99 -0
- package/dist/plate/index.cjs.map +1 -0
- package/dist/plate/index.d.cts +8 -0
- package/dist/plate/index.d.ts +8 -0
- package/dist/plate/index.js +94 -0
- package/dist/plate/index.js.map +1 -0
- package/dist/text/index.cjs +811 -0
- package/dist/text/index.cjs.map +1 -1
- package/dist/text/index.d.cts +1 -1
- package/dist/text/index.d.ts +1 -1
- package/dist/text/index.js +808 -1
- package/dist/text/index.js.map +1 -1
- package/dist/types-i5e6R0AS.d.cts +39 -0
- package/dist/types-i5e6R0AS.d.ts +39 -0
- package/dist/utils-DDVlOusI.d.cts +30 -0
- package/dist/utils-DDVlOusI.d.ts +30 -0
- package/dist/vin/index.cjs +84 -0
- package/dist/vin/index.cjs.map +1 -0
- package/dist/vin/index.d.cts +39 -0
- package/dist/vin/index.d.ts +39 -0
- package/dist/vin/index.js +74 -0
- package/dist/vin/index.js.map +1 -0
- package/package.json +48 -18
- package/LICENCE +0 -21
- package/dist/words-Dy8iYkbv.d.cts +0 -333
- 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
|