@sideid/id-profanity-filter 1.11.0 → 1.11.6

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 (53) hide show
  1. package/.eslintrc.js +44 -44
  2. package/.github/workflows/release.yml +62 -0
  3. package/CONTRIBUTING.md +150 -150
  4. package/LICENSE +21 -21
  5. package/README.md +548 -548
  6. package/dist/index.d.ts +989 -0
  7. package/dist/index.esm.js +504 -234
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/index.js +504 -234
  10. package/dist/index.js.map +1 -1
  11. package/dist/types/constants/regions/aceh.d.ts +4 -0
  12. package/dist/types/constants/regions/bali.d.ts +4 -0
  13. package/dist/{constants → types/constants}/regions/jawa.d.ts +1 -1
  14. package/dist/types/index.d.ts +375 -57
  15. package/dist/types/types/index.d.ts +59 -0
  16. package/eslint.config.mjs +40 -40
  17. package/examples/advanced.ts +120 -120
  18. package/examples/basic.ts +71 -71
  19. package/examples/custom-list.ts +140 -140
  20. package/jest.config.mjs +10 -10
  21. package/package.json +2 -1
  22. package/prettierrc +6 -6
  23. package/rollup.config.mjs +40 -35
  24. package/src/constants/regions/aceh.ts +231 -0
  25. package/src/constants/regions/bali.ts +168 -0
  26. package/src/constants/regions/batak.ts +136 -6
  27. package/src/constants/regions/general.ts +9 -0
  28. package/src/constants/regions/jawa.ts +367 -229
  29. package/src/index.ts +15 -15
  30. package/tsconfig.json +115 -115
  31. package/.github/workflows/ci.yml +0 -0
  32. package/dist/constants/categories/index.d.ts +0 -9
  33. package/dist/constants/regions/index.d.ts +0 -8
  34. /package/dist/{config → types/config}/options.d.ts +0 -0
  35. /package/dist/{constants → types/constants}/categories/blasphemy.d.ts +0 -0
  36. /package/dist/{constants → types/constants}/categories/disgusting.d.ts +0 -0
  37. /package/dist/{constants → types/constants}/categories/drugs.d.ts +0 -0
  38. /package/dist/{constants → types/constants}/categories/insult.d.ts +0 -0
  39. /package/dist/{constants → types/constants}/categories/profanity.d.ts +0 -0
  40. /package/dist/{constants → types/constants}/categories/sexual.d.ts +0 -0
  41. /package/dist/{constants → types/constants}/categories/slur.d.ts +0 -0
  42. /package/dist/{constants → types/constants}/regions/batak.d.ts +0 -0
  43. /package/dist/{constants → types/constants}/regions/betawi.d.ts +0 -0
  44. /package/dist/{constants → types/constants}/regions/general.d.ts +0 -0
  45. /package/dist/{constants → types/constants}/regions/sunda.d.ts +0 -0
  46. /package/dist/{constants → types/constants}/wordList.d.ts +0 -0
  47. /package/dist/{core → types/core}/analyzer.d.ts +0 -0
  48. /package/dist/{core → types/core}/filter.d.ts +0 -0
  49. /package/dist/{core → types/core}/matcher.d.ts +0 -0
  50. /package/dist/{utils → types/utils}/ahoCorasick.d.ts +0 -0
  51. /package/dist/{utils → types/utils}/regexUtils.d.ts +0 -0
  52. /package/dist/{utils → types/utils}/similarityUtils.d.ts +0 -0
  53. /package/dist/{utils → types/utils}/stringUtils.d.ts +0 -0
package/dist/index.d.ts CHANGED
@@ -58,4 +58,993 @@ interface RegexOptions {
58
58
  indonesianVariation?: boolean;
59
59
  }
60
60
 
61
+ declare function findProfanity(text: string, options?: FilterOptions): string[];
62
+ /**
63
+ * Mencari kata kotor lengkap dengan metadata
64
+ *
65
+ * @param text Teks yang akan diperika
66
+ * @param options Opsi utnuk pencarian kata kotor
67
+ * @return Array dari objek kata kotor yang ditemukan
68
+ */
69
+ declare function findProfanityWithMetadata(text: string, options?: FilterOptions): ProfanityWord[];
70
+ /**
71
+ * Mencari kategory kata kotor yang ada dalam teks
72
+ *
73
+ * @param matchDetails Hasil pencarian dari fingProfanityWithMetadata()
74
+ * @return Array kategori unik
75
+ */
76
+ declare function findCategories(matchDetails: ProfanityWord[]): ProfanityCategory[];
77
+ /**
78
+ * Mencari region kata kotor yang ada dalam teks
79
+ *
80
+ * @param matchDetails Hasil pencarian dari fingProfanityWithMetadata()
81
+ * @return Array region unik
82
+ */
83
+ declare function findRegions(matchDetails: ProfanityWord[]): Region[];
84
+ /**
85
+ * Menghitung tingkat keparahan kata kotor yang ditemukan
86
+ *
87
+ * @param matchDetails Hasil pencarian dari findProfanityWithMetadata()
88
+ * @return Skor keparahan dari 0-1
89
+ */
90
+ declare function calculateSeverity(matchDetails: ProfanityWord[]): number;
91
+
92
+ /**
93
+ * Menyensor kata kotor dalam teks
94
+ *
95
+ * @param text Teks yang akan disensor
96
+ * @param options Opsi untuk filter
97
+ * @returns FilterResult dengan hasil filter
98
+ */
99
+ declare function filter(text: string, options?: FilterOptions): FilterResult;
100
+ /**
101
+ * Memeriksa apakah teks mengandung kata kotor
102
+ *
103
+ * @param text Teks yang akan diperiksa
104
+ * @param options Opsi untuk pemeriksaan
105
+ * @returns Boolean apakah teks mengandung kata kotor
106
+ */
107
+ declare function isProfane(text: string, options?: FilterOptions): boolean;
108
+
109
+ /**
110
+ * Menganalisis teks untuk kata kotor
111
+ *
112
+ * @param text Teks yang akan dianalisis
113
+ * @param options Opsi untuk analisis
114
+ * @return AnalysisResult dengan hasil analisis
115
+ */
116
+ declare function analyze(text: string, options?: FilterOptions): AnalysisResult;
117
+ /**
118
+ * Menganalisis daftar teks dan ringkasan
119
+ *
120
+ * @param texts Daftar teks yang dianalisis
121
+ * @param options Opsi untuk analisis
122
+ * @return Objek dengan ringkasan analisis
123
+ */
124
+ declare function batchAnalyze(texts: string[], options?: FilterOptions): {
125
+ totalTexts: number;
126
+ profaneTexts: number;
127
+ cleanTexts: number;
128
+ averageSeverity: number;
129
+ topCategories: ProfanityCategory[];
130
+ topRegions: Region[];
131
+ mostFrequentWords: Array<{
132
+ word: string;
133
+ count: number;
134
+ }>;
135
+ };
136
+ /**
137
+ * Menganalisis per-kalimat untuk melokalisasi kata kotor
138
+ *
139
+ * @param text Teks yang akan dianalisis per-kalimat
140
+ * @param options Opsi untuk analisis
141
+ * @returns Array hasil analisis per-kalimat
142
+ */
143
+ declare function analyzeBySentence(text: string, options?: FilterOptions): Array<AnalysisResult & {
144
+ sentence: string;
145
+ }>;
146
+ /**
147
+ * Menganalisis teks untuk menemukan kata kotor pada konteks tertentu
148
+ *
149
+ * @param text Teks yang akan dianalisis
150
+ * @param contextWindowSize Ukuran konteks (jumlah kata) di sekitar kata kotor
151
+ * @param options Opsi untuk analisis
152
+ * @returns Konteks di dekat kata kotor
153
+ */
154
+ declare function analyzeWithContext(text: string, contextWindowSize?: number, options?: FilterOptions): Array<{
155
+ word: string;
156
+ context: string;
157
+ position: {
158
+ start: number;
159
+ end: number;
160
+ };
161
+ }>;
162
+
163
+ /**
164
+ * Menyensor kata dengan karakter pengganti
165
+ *
166
+ * @param word Kata yang akan disensor
167
+ * @param replaceChar Karakter pengganti (default: '*')
168
+ * @param keepFirstAndLast Apakah harus menyimpan huruf pertama dan terakhir
169
+ * @returns Kata yang telah disensor
170
+ */
171
+ declare function censorWord(word: string, replaceChar?: string, keepFirstAndLast?: boolean): string;
172
+ /**
173
+ * Menormalisasi string untuk keperluan pembandingan
174
+ *
175
+ * @param text Teks yang akan dinormalisasi
176
+ * @returns Teks yang telah dinormalisasi
177
+ */
178
+ declare function normalizeText(text: string): string;
179
+ /**
180
+ * Mendeteksi apakah string berisi sebagian atau keseluruhan kata dalam wordList
181
+ *
182
+ * @param text Teks yang akan diperiksa
183
+ * @param wordList Daftar kata yang dicari
184
+ * @param checkSubstring Apakah harus memeriksa substring
185
+ * @returns Boolean apakah teks mengandung kata-kata dalam wordList
186
+ */
187
+ declare function containsAnyWord(text: string, wordList: string[], checkSubstring?: boolean): boolean;
188
+ /**
189
+ * Memerikasa apakah stirng merupakan kode untuk kata kotor
190
+ * (Menangkap kasus seperti disensor dengan titik atau garis: a**ing, b*bi, dll)
191
+ *
192
+ * @param text Teks yang akan diperika
193
+ * @param wordList daftar kata kotor
194
+ * @return Boolean apakah teks mengandung kata kotor
195
+ */
196
+ declare function containsEuphemism(text: string, wordList: string[]): boolean;
197
+ /**
198
+ * Mendeteksi upaya menghindari filter dengan pemisahan kata
199
+ * (Tangkap kasus seperti: a n j i n g, b-a-b-i, dll)
200
+ *
201
+ * @param text Teks yang akan diperiksa
202
+ * @param wordList Daftar kata kotor
203
+ * @returns Boolean apakah teks mengandung upaya menghindari filter
204
+ */
205
+ declare function detectSplitWords(text: string, wordList: string[]): boolean;
206
+ declare function escapeRegExp(string: string): string;
207
+ /**
208
+ * Mengganti sebagian kata dengan masking
209
+ * (berguna untuk email, nomor telepon, dll)
210
+ *
211
+ * @param text Teks untuk dimasking
212
+ * @param visibleStart Jumlah karakter yang terlihat di awal
213
+ * @param visibleEnd Jumlah karakter yang terlihat di akhir
214
+ * @param maskChar Karakter masking
215
+ * @returns Teks yang telah dimasking
216
+ */
217
+ declare function maskText(text: string, visibleStart?: number, visibleEnd?: number, maskChar?: string): string;
218
+ /**
219
+ * menguabh sting menjadi bentuk leet speak
220
+ * (untuk testing filter bypass)
221
+ *
222
+ * @param text Teks yang akan diubah
223
+ * @return Teks yang telah diubah ke leet speak
224
+ */
225
+ declare function toLeetSpeak(text: string): string;
226
+ /**
227
+ * memisahkan teks menajdi kelimat
228
+ *
229
+ * @param text Teks yang akan dipisahkan
230
+ * @return Array kalimat yang telah dipisahkan
231
+ */
232
+ declare function splitIntoSentences(text: string): string[];
233
+ /**
234
+ * mengambil kata-kata di sekitar indeks tertentu
235
+ *
236
+ * @param text Teks yang akan diambil
237
+ * @param index Indeks dalam teks
238
+ * @param windowSize jumlah kata di sekitar indeks
239
+ * @return Kata-kata di sekitar indeks
240
+ */
241
+ declare function getContextAroundIndex(text: string, index: number, windowSize?: number): string;
242
+
243
+ /**
244
+ * Membuat pola regex untuk mencocokkan kata
245
+ *
246
+ * @param word Kata yang akan dibuat pola regex-nya
247
+ * @param options Opsi untuk pembuatan regex
248
+ * @returns Objek RegExp
249
+ */
250
+ declare function createWordRegex(word: string, options?: RegexOptions): RegExp;
251
+ /**
252
+ * Menambahkan variasi leet speak ke pola regex
253
+ *
254
+ * Contoh:
255
+ * - 'a' bisa jadi '4', '@'
256
+ * - 'i' bisa jadi '1', '!'
257
+ *
258
+ * @param pattern Pola regex asli
259
+ * @returns Pola regex dengan variasi leet speak
260
+ */
261
+ declare function addLeetSpeakVariations(pattern: string): string;
262
+ /**
263
+ * Menambahkan kemungkinan split/pemisahan antar karakter
264
+ *
265
+ * @param pattern Pola regex asli
266
+ * @returns Pola regex dengan kemungkinan split
267
+ */
268
+ declare function addSplitVariations(pattern: string): string;
269
+ /**
270
+ * Membuat regex untuk mencari kata dengan variasi spasi dan karakter penghubung
271
+ * Berguna untuk mendeteksi upaya menghindari filter dengan menambahkan spasi atau karakter lain
272
+ *
273
+ * @param word Kata yang akan dibuat pola regexnya
274
+ * @returns Objek RegExp
275
+ */
276
+ declare function createEvasionRegex(word: string): RegExp;
277
+ /**
278
+ * Menambahkan variasi ejaan Bahasa Indonesia
279
+ *
280
+ * @param pattern Pola regex asli
281
+ * @returns Pola regex dengan variasi ejaan Bahasa Indonesia
282
+ */
283
+ declare function addIndonesianVariations(pattern: string): string;
284
+ /**
285
+ * Membuat regex untuk mencocokkan kata dengan mempertimbangkan variasi ejaan Bahasa Indonesia
286
+ *
287
+ * @param word Kata yang akan dibuat pola regexnya
288
+ * @returns Objek RegExp
289
+ */
290
+ declare function createIndonesianVariationRegex(word: string): RegExp;
291
+ /**
292
+ * Membuat regex untuk mencocokkan kata dengan konteks
293
+ *
294
+ * @param word Kata yang akan dibuat pola regexnya
295
+ * @param contextSize Jumlah kata konteks sebelum dan sesudah
296
+ * @returns Objek RegExp
297
+ */
298
+ declare function createContextRegex(word: string, contextSize?: number): RegExp;
299
+ /**
300
+ * Membuat regex untuk mencocokkan variasi penulisan kata
301
+ *
302
+ * @param word Kata dasar
303
+ * @returns Objek RegExp untuk mencocokkan berbagai bentuk kata
304
+ */
305
+ declare function createWordFormRegex(word: string): RegExp;
306
+
307
+ /**
308
+ * Menghitung jarak Levenshtein antara dua string
309
+ * (Jumlah operasi insert, delete, atau replace untuk mengubah string1 menjadi string2)
310
+ *
311
+ * @param str1 String pertama
312
+ * @param str2 String kedua
313
+ * @returns Jarak Levenshtein
314
+ */
315
+ declare function levenshteinDistance(str1: string, str2: string): number;
316
+ /**
317
+ * Menghitung tingkat kesamaan antara dua string
318
+ *
319
+ * @param str1 String pertama
320
+ * @param str2 String kedua
321
+ * @returns Nilai kesamaan (0-1, di mana 1 berarti identik)
322
+ */
323
+ declare function stringSimilarity(str1: string, str2: string): number;
324
+ /**
325
+ * Mencari string yang paling mirip dari array
326
+ *
327
+ * @param target String target
328
+ * @param candidates Array string kandidat
329
+ * @param threshold Minimum kesamaan yang diterima (0-1)
330
+ * @returns String yang paling mirip atau null jika tidak ada yang di atas threshold
331
+ */
332
+ declare function findMostSimilar(target: string, candidates: string[], threshold?: number): string | null;
333
+ /**
334
+ * Mencari string yang paling mirip dari array menggunakan Levenshtein distance
335
+ *
336
+ * @param target String target
337
+ * @param candidates Array string kandidat
338
+ * @param threshold Minimum kesamaan yang diterima (0-1)
339
+ * @param maxDistance Jarak Levenshtein maksimal yang diterima (default: 3)
340
+ * @returns String yang paling mirip atau null jika tidak ada yang di atas threshold
341
+ */
342
+ declare function findMostSimilarWithLevenshtein(target: string, candidates: string[], threshold?: number, maxDistance?: number): string | null;
343
+ /**
344
+ * Cek apakah string mungkin merupakan variasi dari kata kotor
345
+ * menggunakan kesamaan string
346
+ *
347
+ * @param input String yang akan diperiksa
348
+ * @param profanityWords Daftar kata kotor
349
+ * @param threshold Batas minimum kesamaan (default: 0.75)
350
+ * @returns Array [Boolean (apakah variasi), String original (jika ditemukan)]
351
+ */
352
+ declare function isPossibleProfanityVariation(input: string, profanityWords: string[], threshold?: number): [boolean, string | null];
353
+ /**
354
+ * Mengelompokkan kata berdasarkan kesamaan
355
+ *
356
+ * @param words Daftar kata
357
+ * @param threshold Batas minimum kesamaan (default: 0.8)
358
+ * @returns Array kluster kata yang mirip
359
+ */
360
+ declare function clusterSimilarWords(words: string[], threshold?: number): string[][];
361
+ /**
362
+ * Cari kata-kata kotor yang mungkin dari teks menggunakan kesamaan string
363
+ * dengan optimasi untuk mengurangi kompleksitas
364
+ *
365
+ * @param text Teks yang akan diperiksa
366
+ * @param profanityWords Daftar kata kotor
367
+ * @param threshold Batas minimum kesamaan (default: 0.8)
368
+ * @returns Array kata yang mungkin merupakan kata kotor
369
+ */
370
+ /**
371
+ * Cari kata-kata kotor yang mungkin dari teks berdasarkan kemiripan string
372
+ * dengan optimasi biar prosesnya nggak terlalu berat
373
+ *
374
+ * @param text Teks yang mau dicek
375
+ * @param profanityWords Daftar kata-kata kotor/kasar
376
+ * @param threshold Batas minimal kemiripan (default: 0.8)
377
+ * @returns Array kata yang kemungkinan kata kotor/kasar
378
+ */
379
+ declare function findPossibleProfanityBySimiliarity(text: string, profanityWords: string[], threshold?: number): Array<{
380
+ word: string;
381
+ original: string;
382
+ similarity: number;
383
+ }>;
384
+ /**
385
+ * Cari kata-kata kotor yang mungkin dari teks menggunakan Levenshtein distance
386
+ *
387
+ * @param text Teks yang akan diperiksa
388
+ * @param profanityWords Daftar kata kotor
389
+ * @param threshold Batas minimum kesamaan (default: 0.8)
390
+ * @param maxDistance Jarak Levenshtein maksimal (default: 2)
391
+ * @returns Array kata yang mungkin merupakan kata kotor
392
+ */
393
+ declare function findProfanityByLevenshteinDistance(text: string, profanityWords: string[], threshold?: number, maxDistance?: number): Array<{
394
+ word: string;
395
+ original: string;
396
+ similarity: number;
397
+ distance: number;
398
+ }>;
399
+
400
+ declare const DEFAULT_OPTIONS: FilterOptions;
401
+ declare const FILTER_PRESETS: {
402
+ strict: {
403
+ checkSubstring: boolean;
404
+ detectLeetSpeak: boolean;
405
+ severityThreshold: number;
406
+ replaceWith?: string;
407
+ fullWordCensor?: boolean;
408
+ wordList?: string[];
409
+ whitelist?: string[];
410
+ categories?: ProfanityCategory[];
411
+ regions?: Region[];
412
+ useRandomGrawlix?: boolean;
413
+ keepFirstAndLast?: boolean;
414
+ indonesianVariation?: boolean;
415
+ detectSimilarity?: boolean;
416
+ similarityThreshold?: number;
417
+ detectSplit?: boolean;
418
+ useLevenshtein?: boolean;
419
+ maxLevenshteinDistance?: number;
420
+ };
421
+ moderate: {
422
+ severityThreshold: number;
423
+ replaceWith?: string;
424
+ fullWordCensor?: boolean;
425
+ detectLeetSpeak?: boolean;
426
+ checkSubstring?: boolean;
427
+ wordList?: string[];
428
+ whitelist?: string[];
429
+ categories?: ProfanityCategory[];
430
+ regions?: Region[];
431
+ useRandomGrawlix?: boolean;
432
+ keepFirstAndLast?: boolean;
433
+ indonesianVariation?: boolean;
434
+ detectSimilarity?: boolean;
435
+ similarityThreshold?: number;
436
+ detectSplit?: boolean;
437
+ useLevenshtein?: boolean;
438
+ maxLevenshteinDistance?: number;
439
+ };
440
+ light: {
441
+ severityThreshold: number;
442
+ categories: ProfanityCategory[];
443
+ replaceWith?: string;
444
+ fullWordCensor?: boolean;
445
+ detectLeetSpeak?: boolean;
446
+ checkSubstring?: boolean;
447
+ wordList?: string[];
448
+ whitelist?: string[];
449
+ regions?: Region[];
450
+ useRandomGrawlix?: boolean;
451
+ keepFirstAndLast?: boolean;
452
+ indonesianVariation?: boolean;
453
+ detectSimilarity?: boolean;
454
+ similarityThreshold?: number;
455
+ detectSplit?: boolean;
456
+ useLevenshtein?: boolean;
457
+ maxLevenshteinDistance?: number;
458
+ };
459
+ childSafe: {
460
+ checkSubstring: boolean;
461
+ detectLeetSpeak: boolean;
462
+ fullWordCensor: boolean;
463
+ severityThreshold: number;
464
+ replaceWith?: string;
465
+ wordList?: string[];
466
+ whitelist?: string[];
467
+ categories?: ProfanityCategory[];
468
+ regions?: Region[];
469
+ useRandomGrawlix?: boolean;
470
+ keepFirstAndLast?: boolean;
471
+ indonesianVariation?: boolean;
472
+ detectSimilarity?: boolean;
473
+ similarityThreshold?: number;
474
+ detectSplit?: boolean;
475
+ useLevenshtein?: boolean;
476
+ maxLevenshteinDistance?: number;
477
+ };
478
+ };
479
+ declare const CATEGORY_PRESETS: {
480
+ sexual: {
481
+ categories: ProfanityCategory[];
482
+ replaceWith?: string;
483
+ fullWordCensor?: boolean;
484
+ detectLeetSpeak?: boolean;
485
+ checkSubstring?: boolean;
486
+ wordList?: string[];
487
+ whitelist?: string[];
488
+ regions?: Region[];
489
+ severityThreshold?: number;
490
+ useRandomGrawlix?: boolean;
491
+ keepFirstAndLast?: boolean;
492
+ indonesianVariation?: boolean;
493
+ detectSimilarity?: boolean;
494
+ similarityThreshold?: number;
495
+ detectSplit?: boolean;
496
+ useLevenshtein?: boolean;
497
+ maxLevenshteinDistance?: number;
498
+ };
499
+ insults: {
500
+ categories: ProfanityCategory[];
501
+ replaceWith?: string;
502
+ fullWordCensor?: boolean;
503
+ detectLeetSpeak?: boolean;
504
+ checkSubstring?: boolean;
505
+ wordList?: string[];
506
+ whitelist?: string[];
507
+ regions?: Region[];
508
+ severityThreshold?: number;
509
+ useRandomGrawlix?: boolean;
510
+ keepFirstAndLast?: boolean;
511
+ indonesianVariation?: boolean;
512
+ detectSimilarity?: boolean;
513
+ similarityThreshold?: number;
514
+ detectSplit?: boolean;
515
+ useLevenshtein?: boolean;
516
+ maxLevenshteinDistance?: number;
517
+ };
518
+ profanity: {
519
+ categories: ProfanityCategory[];
520
+ replaceWith?: string;
521
+ fullWordCensor?: boolean;
522
+ detectLeetSpeak?: boolean;
523
+ checkSubstring?: boolean;
524
+ wordList?: string[];
525
+ whitelist?: string[];
526
+ regions?: Region[];
527
+ severityThreshold?: number;
528
+ useRandomGrawlix?: boolean;
529
+ keepFirstAndLast?: boolean;
530
+ indonesianVariation?: boolean;
531
+ detectSimilarity?: boolean;
532
+ similarityThreshold?: number;
533
+ detectSplit?: boolean;
534
+ useLevenshtein?: boolean;
535
+ maxLevenshteinDistance?: number;
536
+ };
537
+ };
538
+ declare const REGION_PRESETS: {
539
+ general: {
540
+ regions: Region[];
541
+ replaceWith?: string;
542
+ fullWordCensor?: boolean;
543
+ detectLeetSpeak?: boolean;
544
+ checkSubstring?: boolean;
545
+ wordList?: string[];
546
+ whitelist?: string[];
547
+ categories?: ProfanityCategory[];
548
+ severityThreshold?: number;
549
+ useRandomGrawlix?: boolean;
550
+ keepFirstAndLast?: boolean;
551
+ indonesianVariation?: boolean;
552
+ detectSimilarity?: boolean;
553
+ similarityThreshold?: number;
554
+ detectSplit?: boolean;
555
+ useLevenshtein?: boolean;
556
+ maxLevenshteinDistance?: number;
557
+ };
558
+ jawa: {
559
+ regions: Region[];
560
+ replaceWith?: string;
561
+ fullWordCensor?: boolean;
562
+ detectLeetSpeak?: boolean;
563
+ checkSubstring?: boolean;
564
+ wordList?: string[];
565
+ whitelist?: string[];
566
+ categories?: ProfanityCategory[];
567
+ severityThreshold?: number;
568
+ useRandomGrawlix?: boolean;
569
+ keepFirstAndLast?: boolean;
570
+ indonesianVariation?: boolean;
571
+ detectSimilarity?: boolean;
572
+ similarityThreshold?: number;
573
+ detectSplit?: boolean;
574
+ useLevenshtein?: boolean;
575
+ maxLevenshteinDistance?: number;
576
+ };
577
+ sunda: {
578
+ regions: Region[];
579
+ replaceWith?: string;
580
+ fullWordCensor?: boolean;
581
+ detectLeetSpeak?: boolean;
582
+ checkSubstring?: boolean;
583
+ wordList?: string[];
584
+ whitelist?: string[];
585
+ categories?: ProfanityCategory[];
586
+ severityThreshold?: number;
587
+ useRandomGrawlix?: boolean;
588
+ keepFirstAndLast?: boolean;
589
+ indonesianVariation?: boolean;
590
+ detectSimilarity?: boolean;
591
+ similarityThreshold?: number;
592
+ detectSplit?: boolean;
593
+ useLevenshtein?: boolean;
594
+ maxLevenshteinDistance?: number;
595
+ };
596
+ betawi: {
597
+ regions: Region[];
598
+ replaceWith?: string;
599
+ fullWordCensor?: boolean;
600
+ detectLeetSpeak?: boolean;
601
+ checkSubstring?: boolean;
602
+ wordList?: string[];
603
+ whitelist?: string[];
604
+ categories?: ProfanityCategory[];
605
+ severityThreshold?: number;
606
+ useRandomGrawlix?: boolean;
607
+ keepFirstAndLast?: boolean;
608
+ indonesianVariation?: boolean;
609
+ detectSimilarity?: boolean;
610
+ similarityThreshold?: number;
611
+ detectSplit?: boolean;
612
+ useLevenshtein?: boolean;
613
+ maxLevenshteinDistance?: number;
614
+ };
615
+ batak: {
616
+ regions: Region[];
617
+ replaceWith?: string;
618
+ fullWordCensor?: boolean;
619
+ detectLeetSpeak?: boolean;
620
+ checkSubstring?: boolean;
621
+ wordList?: string[];
622
+ whitelist?: string[];
623
+ categories?: ProfanityCategory[];
624
+ severityThreshold?: number;
625
+ useRandomGrawlix?: boolean;
626
+ keepFirstAndLast?: boolean;
627
+ indonesianVariation?: boolean;
628
+ detectSimilarity?: boolean;
629
+ similarityThreshold?: number;
630
+ detectSplit?: boolean;
631
+ useLevenshtein?: boolean;
632
+ maxLevenshteinDistance?: number;
633
+ };
634
+ };
635
+ declare const REPLACEMENT_CHARS: {
636
+ asterisk: string;
637
+ hash: string;
638
+ dollar: string;
639
+ at: string;
640
+ percent: string;
641
+ underscore: string;
642
+ dash: string;
643
+ dot: string;
644
+ grawlix: string;
645
+ };
646
+ /**
647
+ * Membuat opsi custom dengan menggabungkan dengan default
648
+ *
649
+ * @param options Opsi yang akan digabungkan dengan default
650
+ * @returns Opsi yang sudah digabungkan
651
+ */
652
+ declare function createOptions(options?: Partial<FilterOptions>): FilterOptions;
653
+ /**
654
+ * Mendapatkan opsi dari preset yang ada
655
+ *
656
+ * @param presetName Nama preset filter, kategori, atau region
657
+ * @param additionalOptions Opsi tambahan untuk mengganti preset
658
+ * @returns Opsi yang sudah digabungkan
659
+ */
660
+ declare function getPresetOptions(presetName: string, additionalOptions?: Partial<FilterOptions>): FilterOptions;
661
+ /**
662
+ * Mendapatkan karakter pengganti
663
+ *
664
+ * @param type Tipe karakter pengganti
665
+ * @returns Karakter pengganti
666
+ */
667
+ declare function getReplacementChar(type?: keyof typeof REPLACEMENT_CHARS): string;
668
+ /**
669
+ * Membuat karakter pengganti random dari grawlix
670
+ *
671
+ * @returns Karakter pengganti random
672
+ */
673
+ declare function getRandomGrawlix(): string;
674
+ /**
675
+ * Membuat string pengganti untuk kata menggunakan grawlix random
676
+ *
677
+ * @param length Panjang string
678
+ * @returns String pengganti
679
+ */
680
+ declare function makeRandomGrawlixString(length: number): string;
681
+
682
+ declare class IDProfanityFilter {
683
+ private options;
684
+ /**
685
+ * Membuat instance filter baru
686
+ * @param options Opsi untuk filter
687
+ */
688
+ constructor(options?: FilterOptions);
689
+ /**
690
+ * Menyensor teks yang diberikan
691
+ * @param text Teks yang akan disensor
692
+ * @returns Hasil filter
693
+ */
694
+ filter(text: string): FilterResult;
695
+ /**
696
+ * Memeriksa apakah teks mengandung kata kotor
697
+ * @param text Teks yang akan diperiksa
698
+ * @returns Boolean apakah teks mengandung kata kotor
699
+ */
700
+ isProfane(text: string): boolean;
701
+ /**
702
+ * Menganalisis teks untuk kata kotor
703
+ * @param text Teks yang akan dianalisis
704
+ * @returns Hasil analisis
705
+ */
706
+ analyze(text: string): AnalysisResult;
707
+ /**
708
+ * Menganalisis batch teks untuk kata kotor
709
+ * @param texts Array dari teks yang akan dianalisis
710
+ * @returns Hasil analisis batch
711
+ */
712
+ batchAnalyze(texts: string[]): {
713
+ totalTexts: number;
714
+ profaneTexts: number;
715
+ cleanTexts: number;
716
+ averageSeverity: number;
717
+ topCategories: ProfanityCategory[];
718
+ topRegions: Region[];
719
+ mostFrequentWords: Array<{
720
+ word: string;
721
+ count: number;
722
+ }>;
723
+ };
724
+ /**
725
+ * Menganalisis teks per-kalimat
726
+ * @param text Teks yang akan dianalisis
727
+ * @returns Array hasil analisis per-kalimat
728
+ */
729
+ analyzeBySentence(text: string): (AnalysisResult & {
730
+ sentence: string;
731
+ })[];
732
+ /**
733
+ * Menganalisis teks dengan konteks di sekitar kata kotor
734
+ * @param text Teks yang akan dianalisis
735
+ * @param contextWindowSize Jumlah kata konteks
736
+ * @returns Konteks di dekat kata kotor
737
+ */
738
+ analyzeWithContext(text: string, contextWindowSize?: number): {
739
+ word: string;
740
+ context: string;
741
+ position: {
742
+ start: number;
743
+ end: number;
744
+ };
745
+ }[];
746
+ /**
747
+ * Mengubah opsi filter
748
+ * @param options Opsi baru untuk filter
749
+ */
750
+ setOptions(options: Partial<FilterOptions>): void;
751
+ /**
752
+ * Menggunakan preset yang telah ditentukan
753
+ * @param presetName Nama preset yang akan digunakan
754
+ * @param additionalOptions Opsi tambahan untuk override
755
+ */
756
+ usePreset(presetName: string, additionalOptions?: Partial<FilterOptions>): void;
757
+ /**
758
+ * Menetapkan daftar kata kustom
759
+ * @param wordList Daftar kata untuk digunakan
760
+ */
761
+ setWordList(wordList: string[]): void;
762
+ /**
763
+ * Menambahkan kata ke whitelist
764
+ * @param word Kata yang akan diabaikan
765
+ */
766
+ addToWhitelist(word: string): void;
767
+ /**
768
+ * Menghapus kata dari whitelist
769
+ * @param word Kata yang akan dihapus dari whitelist
770
+ */
771
+ removeFromWhitelist(word: string): void;
772
+ /**
773
+ * Mengaktifkan deteksi variasi ejaan Indonesia
774
+ */
775
+ enableIndonesianVariations(): void;
776
+ /**
777
+ * Mengaktifkan deteksi kata yang dipisah
778
+ */
779
+ enableSplitWordDetection(): void;
780
+ /**
781
+ * Mengaktifkan deteksi berdasarkan kesamaan
782
+ * @param threshold Threshold kesamaan (0-1)
783
+ * @param useLevenshtein Gunakan algoritma Levenshtein untuk deteksi
784
+ * @param maxLevenshteinDistance Jarak maksimal Levenshtein (default: 2)
785
+ */
786
+ enableSimilarityDetection(threshold?: number, useLevenshtein?: boolean, maxLevenshteinDistance?: number): void;
787
+ /**
788
+ * Mengaktifkan deteksi berbasis Levenshtein distance
789
+ * @param threshold Threshold kesamaan (0-1)
790
+ * @param maxDistance Jarak maksimal Levenshtein (default: 2)
791
+ */
792
+ enableLevenshteinDetection(threshold?: number, maxDistance?: number): void;
793
+ }
794
+ declare const idFilter: {
795
+ filter: (text: string, options?: FilterOptions) => FilterResult;
796
+ isProfane: (text: string, options?: FilterOptions) => boolean;
797
+ analyze: (text: string, options?: FilterOptions) => AnalysisResult;
798
+ batchAnalyze: (texts: string[], options?: FilterOptions) => {
799
+ totalTexts: number;
800
+ profaneTexts: number;
801
+ cleanTexts: number;
802
+ averageSeverity: number;
803
+ topCategories: ProfanityCategory[];
804
+ topRegions: Region[];
805
+ mostFrequentWords: Array<{
806
+ word: string;
807
+ count: number;
808
+ }>;
809
+ };
810
+ getPresetOptions: typeof getPresetOptions;
811
+ presets: {
812
+ filter: {
813
+ strict: {
814
+ checkSubstring: boolean;
815
+ detectLeetSpeak: boolean;
816
+ severityThreshold: number;
817
+ replaceWith?: string;
818
+ fullWordCensor?: boolean;
819
+ wordList?: string[];
820
+ whitelist?: string[];
821
+ categories?: ProfanityCategory[];
822
+ regions?: Region[];
823
+ useRandomGrawlix?: boolean;
824
+ keepFirstAndLast?: boolean;
825
+ indonesianVariation?: boolean;
826
+ detectSimilarity?: boolean;
827
+ similarityThreshold?: number;
828
+ detectSplit?: boolean;
829
+ useLevenshtein?: boolean;
830
+ maxLevenshteinDistance?: number;
831
+ };
832
+ moderate: {
833
+ severityThreshold: number;
834
+ replaceWith?: string;
835
+ fullWordCensor?: boolean;
836
+ detectLeetSpeak?: boolean;
837
+ checkSubstring?: boolean;
838
+ wordList?: string[];
839
+ whitelist?: string[];
840
+ categories?: ProfanityCategory[];
841
+ regions?: Region[];
842
+ useRandomGrawlix?: boolean;
843
+ keepFirstAndLast?: boolean;
844
+ indonesianVariation?: boolean;
845
+ detectSimilarity?: boolean;
846
+ similarityThreshold?: number;
847
+ detectSplit?: boolean;
848
+ useLevenshtein?: boolean;
849
+ maxLevenshteinDistance?: number;
850
+ };
851
+ light: {
852
+ severityThreshold: number;
853
+ categories: ProfanityCategory[];
854
+ replaceWith?: string;
855
+ fullWordCensor?: boolean;
856
+ detectLeetSpeak?: boolean;
857
+ checkSubstring?: boolean;
858
+ wordList?: string[];
859
+ whitelist?: string[];
860
+ regions?: Region[];
861
+ useRandomGrawlix?: boolean;
862
+ keepFirstAndLast?: boolean;
863
+ indonesianVariation?: boolean;
864
+ detectSimilarity?: boolean;
865
+ similarityThreshold?: number;
866
+ detectSplit?: boolean;
867
+ useLevenshtein?: boolean;
868
+ maxLevenshteinDistance?: number;
869
+ };
870
+ childSafe: {
871
+ checkSubstring: boolean;
872
+ detectLeetSpeak: boolean;
873
+ fullWordCensor: boolean;
874
+ severityThreshold: number;
875
+ replaceWith?: string;
876
+ wordList?: string[];
877
+ whitelist?: string[];
878
+ categories?: ProfanityCategory[];
879
+ regions?: Region[];
880
+ useRandomGrawlix?: boolean;
881
+ keepFirstAndLast?: boolean;
882
+ indonesianVariation?: boolean;
883
+ detectSimilarity?: boolean;
884
+ similarityThreshold?: number;
885
+ detectSplit?: boolean;
886
+ useLevenshtein?: boolean;
887
+ maxLevenshteinDistance?: number;
888
+ };
889
+ };
890
+ category: {
891
+ sexual: {
892
+ categories: ProfanityCategory[];
893
+ replaceWith?: string;
894
+ fullWordCensor?: boolean;
895
+ detectLeetSpeak?: boolean;
896
+ checkSubstring?: boolean;
897
+ wordList?: string[];
898
+ whitelist?: string[];
899
+ regions?: Region[];
900
+ severityThreshold?: number;
901
+ useRandomGrawlix?: boolean;
902
+ keepFirstAndLast?: boolean;
903
+ indonesianVariation?: boolean;
904
+ detectSimilarity?: boolean;
905
+ similarityThreshold?: number;
906
+ detectSplit?: boolean;
907
+ useLevenshtein?: boolean;
908
+ maxLevenshteinDistance?: number;
909
+ };
910
+ insults: {
911
+ categories: ProfanityCategory[];
912
+ replaceWith?: string;
913
+ fullWordCensor?: boolean;
914
+ detectLeetSpeak?: boolean;
915
+ checkSubstring?: boolean;
916
+ wordList?: string[];
917
+ whitelist?: string[];
918
+ regions?: Region[];
919
+ severityThreshold?: number;
920
+ useRandomGrawlix?: boolean;
921
+ keepFirstAndLast?: boolean;
922
+ indonesianVariation?: boolean;
923
+ detectSimilarity?: boolean;
924
+ similarityThreshold?: number;
925
+ detectSplit?: boolean;
926
+ useLevenshtein?: boolean;
927
+ maxLevenshteinDistance?: number;
928
+ };
929
+ profanity: {
930
+ categories: ProfanityCategory[];
931
+ replaceWith?: string;
932
+ fullWordCensor?: boolean;
933
+ detectLeetSpeak?: boolean;
934
+ checkSubstring?: boolean;
935
+ wordList?: string[];
936
+ whitelist?: string[];
937
+ regions?: Region[];
938
+ severityThreshold?: number;
939
+ useRandomGrawlix?: boolean;
940
+ keepFirstAndLast?: boolean;
941
+ indonesianVariation?: boolean;
942
+ detectSimilarity?: boolean;
943
+ similarityThreshold?: number;
944
+ detectSplit?: boolean;
945
+ useLevenshtein?: boolean;
946
+ maxLevenshteinDistance?: number;
947
+ };
948
+ };
949
+ region: {
950
+ general: {
951
+ regions: Region[];
952
+ replaceWith?: string;
953
+ fullWordCensor?: boolean;
954
+ detectLeetSpeak?: boolean;
955
+ checkSubstring?: boolean;
956
+ wordList?: string[];
957
+ whitelist?: string[];
958
+ categories?: ProfanityCategory[];
959
+ severityThreshold?: number;
960
+ useRandomGrawlix?: boolean;
961
+ keepFirstAndLast?: boolean;
962
+ indonesianVariation?: boolean;
963
+ detectSimilarity?: boolean;
964
+ similarityThreshold?: number;
965
+ detectSplit?: boolean;
966
+ useLevenshtein?: boolean;
967
+ maxLevenshteinDistance?: number;
968
+ };
969
+ jawa: {
970
+ regions: Region[];
971
+ replaceWith?: string;
972
+ fullWordCensor?: boolean;
973
+ detectLeetSpeak?: boolean;
974
+ checkSubstring?: boolean;
975
+ wordList?: string[];
976
+ whitelist?: string[];
977
+ categories?: ProfanityCategory[];
978
+ severityThreshold?: number;
979
+ useRandomGrawlix?: boolean;
980
+ keepFirstAndLast?: boolean;
981
+ indonesianVariation?: boolean;
982
+ detectSimilarity?: boolean;
983
+ similarityThreshold?: number;
984
+ detectSplit?: boolean;
985
+ useLevenshtein?: boolean;
986
+ maxLevenshteinDistance?: number;
987
+ };
988
+ sunda: {
989
+ regions: Region[];
990
+ replaceWith?: string;
991
+ fullWordCensor?: boolean;
992
+ detectLeetSpeak?: boolean;
993
+ checkSubstring?: boolean;
994
+ wordList?: string[];
995
+ whitelist?: string[];
996
+ categories?: ProfanityCategory[];
997
+ severityThreshold?: number;
998
+ useRandomGrawlix?: boolean;
999
+ keepFirstAndLast?: boolean;
1000
+ indonesianVariation?: boolean;
1001
+ detectSimilarity?: boolean;
1002
+ similarityThreshold?: number;
1003
+ detectSplit?: boolean;
1004
+ useLevenshtein?: boolean;
1005
+ maxLevenshteinDistance?: number;
1006
+ };
1007
+ betawi: {
1008
+ regions: Region[];
1009
+ replaceWith?: string;
1010
+ fullWordCensor?: boolean;
1011
+ detectLeetSpeak?: boolean;
1012
+ checkSubstring?: boolean;
1013
+ wordList?: string[];
1014
+ whitelist?: string[];
1015
+ categories?: ProfanityCategory[];
1016
+ severityThreshold?: number;
1017
+ useRandomGrawlix?: boolean;
1018
+ keepFirstAndLast?: boolean;
1019
+ indonesianVariation?: boolean;
1020
+ detectSimilarity?: boolean;
1021
+ similarityThreshold?: number;
1022
+ detectSplit?: boolean;
1023
+ useLevenshtein?: boolean;
1024
+ maxLevenshteinDistance?: number;
1025
+ };
1026
+ batak: {
1027
+ regions: Region[];
1028
+ replaceWith?: string;
1029
+ fullWordCensor?: boolean;
1030
+ detectLeetSpeak?: boolean;
1031
+ checkSubstring?: boolean;
1032
+ wordList?: string[];
1033
+ whitelist?: string[];
1034
+ categories?: ProfanityCategory[];
1035
+ severityThreshold?: number;
1036
+ useRandomGrawlix?: boolean;
1037
+ keepFirstAndLast?: boolean;
1038
+ indonesianVariation?: boolean;
1039
+ detectSimilarity?: boolean;
1040
+ similarityThreshold?: number;
1041
+ detectSplit?: boolean;
1042
+ useLevenshtein?: boolean;
1043
+ maxLevenshteinDistance?: number;
1044
+ };
1045
+ };
1046
+ };
1047
+ };
1048
+
1049
+ export { CATEGORY_PRESETS, DEFAULT_OPTIONS, FILTER_PRESETS, IDProfanityFilter, REGION_PRESETS, REPLACEMENT_CHARS, addIndonesianVariations, addLeetSpeakVariations, addSplitVariations, analyze, analyzeBySentence, analyzeWithContext, batchAnalyze, calculateSeverity, censorWord, clusterSimilarWords, containsAnyWord, containsEuphemism, createContextRegex, createEvasionRegex, createIndonesianVariationRegex, createOptions, createWordFormRegex, createWordRegex, IDProfanityFilter as default, detectSplitWords, escapeRegExp, filter, findCategories, findMostSimilar, findMostSimilarWithLevenshtein, findPossibleProfanityBySimiliarity, findProfanity, findProfanityByLevenshteinDistance, findProfanityWithMetadata, findRegions, getContextAroundIndex, getPresetOptions, getRandomGrawlix, getReplacementChar, idFilter, isPossibleProfanityVariation, isProfane, levenshteinDistance, makeRandomGrawlixString, maskText, normalizeText, splitIntoSentences, stringSimilarity, toLeetSpeak };
61
1050
  export type { AnalysisResult, FilterOptions, FilterResult, ProfanityCategory, ProfanityWord, RegexOptions, Region };