@sideid/id-profanity-filter 1.1.0 → 1.9.5

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 (41) hide show
  1. package/dist/config/options.d.ts +258 -0
  2. package/dist/constants/categories/insult.d.ts +1 -1
  3. package/dist/constants/categories/sexual.d.ts +1 -1
  4. package/dist/constants/regions/batak.d.ts +1 -1
  5. package/dist/constants/regions/betawi.d.ts +1 -1
  6. package/dist/constants/regions/general.d.ts +1 -1
  7. package/dist/constants/regions/jawa.d.ts +1 -1
  8. package/dist/constants/regions/sunda.d.ts +1 -1
  9. package/dist/constants/wordList.d.ts +1 -1
  10. package/dist/core/analyzer.d.ts +4 -4
  11. package/dist/core/filter.d.ts +1 -1
  12. package/dist/core/matcher.d.ts +5 -5
  13. package/dist/index.d.ts +30 -42
  14. package/dist/index.esm.js +1070 -432
  15. package/dist/index.esm.js.map +1 -1
  16. package/dist/index.js +1101 -429
  17. package/dist/index.js.map +1 -1
  18. package/dist/types/index.d.ts +29 -41
  19. package/dist/utils/regexUtils.d.ts +64 -0
  20. package/dist/utils/similarityUtils.d.ts +57 -0
  21. package/dist/utils/stringUtils.d.ts +79 -0
  22. package/package.json +1 -1
  23. package/src/config/options.ts +178 -0
  24. package/src/constants/categories/index.ts +31 -31
  25. package/src/constants/categories/insult.ts +114 -114
  26. package/src/constants/categories/sexual.ts +99 -100
  27. package/src/constants/regions/batak.ts +17 -17
  28. package/src/constants/regions/betawi.ts +39 -39
  29. package/src/constants/regions/general.ts +111 -111
  30. package/src/constants/regions/index.ts +62 -62
  31. package/src/constants/regions/jawa.ts +102 -102
  32. package/src/constants/regions/sunda.ts +35 -35
  33. package/src/constants/wordList.ts +125 -125
  34. package/src/core/analyzer.ts +225 -204
  35. package/src/core/filter.ts +129 -129
  36. package/src/core/matcher.ts +259 -267
  37. package/src/index.ts +188 -133
  38. package/src/types/index.ts +88 -115
  39. package/src/utils/regexUtils.ts +203 -0
  40. package/src/utils/similarityUtils.ts +195 -0
  41. package/src/utils/stringUtils.ts +213 -0
@@ -0,0 +1,258 @@
1
+ import { FilterOptions, ProfanityCategory, Region } from "../types";
2
+ export declare const DEFAULT_OPTIONS: FilterOptions;
3
+ export declare const FILTER_PRESETS: {
4
+ strict: {
5
+ checkSubstring: boolean;
6
+ detectLeetSpeak: boolean;
7
+ severityThreshold: number;
8
+ replaceWith?: string;
9
+ fullWordCensor?: boolean;
10
+ wordList?: string[];
11
+ whitelist?: string[];
12
+ categories?: ProfanityCategory[];
13
+ regions?: Region[];
14
+ useRandomGrawlix?: boolean;
15
+ keepFirstAndLast?: boolean;
16
+ indonesianVariation?: boolean;
17
+ detectSimilarity?: boolean;
18
+ similarityThreshold?: number;
19
+ detectSplit?: boolean;
20
+ };
21
+ moderate: {
22
+ severityThreshold: number;
23
+ replaceWith?: string;
24
+ fullWordCensor?: boolean;
25
+ detectLeetSpeak?: boolean;
26
+ checkSubstring?: boolean;
27
+ wordList?: string[];
28
+ whitelist?: string[];
29
+ categories?: ProfanityCategory[];
30
+ regions?: Region[];
31
+ useRandomGrawlix?: boolean;
32
+ keepFirstAndLast?: boolean;
33
+ indonesianVariation?: boolean;
34
+ detectSimilarity?: boolean;
35
+ similarityThreshold?: number;
36
+ detectSplit?: boolean;
37
+ };
38
+ light: {
39
+ severityThreshold: number;
40
+ categories: ProfanityCategory[];
41
+ replaceWith?: string;
42
+ fullWordCensor?: boolean;
43
+ detectLeetSpeak?: boolean;
44
+ checkSubstring?: boolean;
45
+ wordList?: string[];
46
+ whitelist?: string[];
47
+ regions?: Region[];
48
+ useRandomGrawlix?: boolean;
49
+ keepFirstAndLast?: boolean;
50
+ indonesianVariation?: boolean;
51
+ detectSimilarity?: boolean;
52
+ similarityThreshold?: number;
53
+ detectSplit?: boolean;
54
+ };
55
+ childSafe: {
56
+ checkSubstring: boolean;
57
+ detectLeetSpeak: boolean;
58
+ fullWordCensor: boolean;
59
+ severityThreshold: number;
60
+ replaceWith?: string;
61
+ wordList?: string[];
62
+ whitelist?: string[];
63
+ categories?: ProfanityCategory[];
64
+ regions?: Region[];
65
+ useRandomGrawlix?: boolean;
66
+ keepFirstAndLast?: boolean;
67
+ indonesianVariation?: boolean;
68
+ detectSimilarity?: boolean;
69
+ similarityThreshold?: number;
70
+ detectSplit?: boolean;
71
+ };
72
+ };
73
+ export declare const CATEGORY_PRESETS: {
74
+ sexual: {
75
+ categories: ProfanityCategory[];
76
+ replaceWith?: string;
77
+ fullWordCensor?: boolean;
78
+ detectLeetSpeak?: boolean;
79
+ checkSubstring?: boolean;
80
+ wordList?: string[];
81
+ whitelist?: string[];
82
+ regions?: Region[];
83
+ severityThreshold?: number;
84
+ useRandomGrawlix?: boolean;
85
+ keepFirstAndLast?: boolean;
86
+ indonesianVariation?: boolean;
87
+ detectSimilarity?: boolean;
88
+ similarityThreshold?: number;
89
+ detectSplit?: boolean;
90
+ };
91
+ insults: {
92
+ categories: ProfanityCategory[];
93
+ replaceWith?: string;
94
+ fullWordCensor?: boolean;
95
+ detectLeetSpeak?: boolean;
96
+ checkSubstring?: boolean;
97
+ wordList?: string[];
98
+ whitelist?: string[];
99
+ regions?: Region[];
100
+ severityThreshold?: number;
101
+ useRandomGrawlix?: boolean;
102
+ keepFirstAndLast?: boolean;
103
+ indonesianVariation?: boolean;
104
+ detectSimilarity?: boolean;
105
+ similarityThreshold?: number;
106
+ detectSplit?: boolean;
107
+ };
108
+ profanity: {
109
+ categories: ProfanityCategory[];
110
+ replaceWith?: string;
111
+ fullWordCensor?: boolean;
112
+ detectLeetSpeak?: boolean;
113
+ checkSubstring?: boolean;
114
+ wordList?: string[];
115
+ whitelist?: string[];
116
+ regions?: Region[];
117
+ severityThreshold?: number;
118
+ useRandomGrawlix?: boolean;
119
+ keepFirstAndLast?: boolean;
120
+ indonesianVariation?: boolean;
121
+ detectSimilarity?: boolean;
122
+ similarityThreshold?: number;
123
+ detectSplit?: boolean;
124
+ };
125
+ };
126
+ export declare const REGION_PRESETS: {
127
+ general: {
128
+ regions: Region[];
129
+ replaceWith?: string;
130
+ fullWordCensor?: boolean;
131
+ detectLeetSpeak?: boolean;
132
+ checkSubstring?: boolean;
133
+ wordList?: string[];
134
+ whitelist?: string[];
135
+ categories?: ProfanityCategory[];
136
+ severityThreshold?: number;
137
+ useRandomGrawlix?: boolean;
138
+ keepFirstAndLast?: boolean;
139
+ indonesianVariation?: boolean;
140
+ detectSimilarity?: boolean;
141
+ similarityThreshold?: number;
142
+ detectSplit?: boolean;
143
+ };
144
+ jawa: {
145
+ regions: Region[];
146
+ replaceWith?: string;
147
+ fullWordCensor?: boolean;
148
+ detectLeetSpeak?: boolean;
149
+ checkSubstring?: boolean;
150
+ wordList?: string[];
151
+ whitelist?: string[];
152
+ categories?: ProfanityCategory[];
153
+ severityThreshold?: number;
154
+ useRandomGrawlix?: boolean;
155
+ keepFirstAndLast?: boolean;
156
+ indonesianVariation?: boolean;
157
+ detectSimilarity?: boolean;
158
+ similarityThreshold?: number;
159
+ detectSplit?: boolean;
160
+ };
161
+ sunda: {
162
+ regions: Region[];
163
+ replaceWith?: string;
164
+ fullWordCensor?: boolean;
165
+ detectLeetSpeak?: boolean;
166
+ checkSubstring?: boolean;
167
+ wordList?: string[];
168
+ whitelist?: string[];
169
+ categories?: ProfanityCategory[];
170
+ severityThreshold?: number;
171
+ useRandomGrawlix?: boolean;
172
+ keepFirstAndLast?: boolean;
173
+ indonesianVariation?: boolean;
174
+ detectSimilarity?: boolean;
175
+ similarityThreshold?: number;
176
+ detectSplit?: boolean;
177
+ };
178
+ betawi: {
179
+ regions: Region[];
180
+ replaceWith?: string;
181
+ fullWordCensor?: boolean;
182
+ detectLeetSpeak?: boolean;
183
+ checkSubstring?: boolean;
184
+ wordList?: string[];
185
+ whitelist?: string[];
186
+ categories?: ProfanityCategory[];
187
+ severityThreshold?: number;
188
+ useRandomGrawlix?: boolean;
189
+ keepFirstAndLast?: boolean;
190
+ indonesianVariation?: boolean;
191
+ detectSimilarity?: boolean;
192
+ similarityThreshold?: number;
193
+ detectSplit?: boolean;
194
+ };
195
+ batak: {
196
+ regions: Region[];
197
+ replaceWith?: string;
198
+ fullWordCensor?: boolean;
199
+ detectLeetSpeak?: boolean;
200
+ checkSubstring?: boolean;
201
+ wordList?: string[];
202
+ whitelist?: string[];
203
+ categories?: ProfanityCategory[];
204
+ severityThreshold?: number;
205
+ useRandomGrawlix?: boolean;
206
+ keepFirstAndLast?: boolean;
207
+ indonesianVariation?: boolean;
208
+ detectSimilarity?: boolean;
209
+ similarityThreshold?: number;
210
+ detectSplit?: boolean;
211
+ };
212
+ };
213
+ export declare const REPLACEMENT_CHARS: {
214
+ asterisk: string;
215
+ hash: string;
216
+ dollar: string;
217
+ at: string;
218
+ percent: string;
219
+ underscore: string;
220
+ dash: string;
221
+ dot: string;
222
+ grawlix: string;
223
+ };
224
+ /**
225
+ * Membuat opsi custom dengan menggabungkan dengan default
226
+ *
227
+ * @param options Opsi yang akan digabungkan dengan default
228
+ * @returns Opsi yang sudah digabungkan
229
+ */
230
+ export declare function createOptions(options?: Partial<FilterOptions>): FilterOptions;
231
+ /**
232
+ * Mendapatkan opsi dari preset yang ada
233
+ *
234
+ * @param presetName Nama preset filter, kategori, atau region
235
+ * @param additionalOptions Opsi tambahan untuk mengganti preset
236
+ * @returns Opsi yang sudah digabungkan
237
+ */
238
+ export declare function getPresetOptions(presetName: string, additionalOptions?: Partial<FilterOptions>): FilterOptions;
239
+ /**
240
+ * Mendapatkan karakter pengganti
241
+ *
242
+ * @param type Tipe karakter pengganti
243
+ * @returns Karakter pengganti
244
+ */
245
+ export declare function getReplacementChar(type?: keyof typeof REPLACEMENT_CHARS): string;
246
+ /**
247
+ * Membuat karakter pengganti random dari grawlix
248
+ *
249
+ * @returns Karakter pengganti random
250
+ */
251
+ export declare function getRandomGrawlix(): string;
252
+ /**
253
+ * Membuat string pengganti untuk kata menggunakan grawlix random
254
+ *
255
+ * @param length Panjang string
256
+ * @returns String pengganti
257
+ */
258
+ export declare function makeRandomGrawlixString(length: number): string;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const insult: ProfanityWord[];
3
3
  export declare const insultWords: string[];
4
4
  export default insult;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const sexual: ProfanityWord[];
3
3
  export declare const sexualWords: string[];
4
4
  export default sexual;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const batak: ProfanityWord[];
3
3
  export declare const batakWords: string[];
4
4
  export default batak;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const betawi: ProfanityWord[];
3
3
  export declare const betawiWords: string[];
4
4
  export default betawi;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const general: ProfanityWord[];
3
3
  export declare const generalWords: string[];
4
4
  export default general;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const jawa: ProfanityWord[];
3
3
  export declare const jawaWords: string[];
4
4
  export default jawa;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../../types';
1
+ import { ProfanityWord } from "../../types";
2
2
  export declare const sunda: ProfanityWord[];
3
3
  export declare const sundaWords: string[];
4
4
  export default sunda;
@@ -1,4 +1,4 @@
1
- import { ProfanityWord } from '../types';
1
+ import { ProfanityWord } from "../types";
2
2
  export declare const wordCategories: {
3
3
  sexual: string[];
4
4
  insult: string[];
@@ -1,4 +1,4 @@
1
- import { FilterOptions, AnalysisResult, ProfanityCategory, Region } from '../types';
1
+ import { FilterOptions, AnalysisResult, ProfanityCategory, Region } from "../types";
2
2
  /**
3
3
  * Menganalisis teks untuk kata kotor
4
4
  *
@@ -8,9 +8,9 @@ import { FilterOptions, AnalysisResult, ProfanityCategory, Region } from '../typ
8
8
  */
9
9
  export declare function analyze(text: string, options?: FilterOptions): AnalysisResult;
10
10
  /**
11
- * menganalisis daftar teks dan ringkasan
11
+ * Menganalisis daftar teks dan ringkasan
12
12
  *
13
- * @param texts Daftar teks yagn dianalisis
13
+ * @param texts Daftar teks yang dianalisis
14
14
  * @param options Opsi untuk analisis
15
15
  * @return Objek dengan ringkasan analisis
16
16
  */
@@ -40,7 +40,7 @@ export declare function analyzeBySentence(text: string, options?: FilterOptions)
40
40
  * Menganalisis teks untuk menemukan kata kotor pada konteks tertentu
41
41
  *
42
42
  * @param text Teks yang akan dianalisis
43
- * @param context Kata konteks untuk dicari di dekat kata kotor
43
+ * @param contextWindowSize Ukuran konteks (jumlah kata) di sekitar kata kotor
44
44
  * @param options Opsi untuk analisis
45
45
  * @returns Konteks di dekat kata kotor
46
46
  */
@@ -1,4 +1,4 @@
1
- import { FilterOptions, FilterResult } from '../types';
1
+ import { FilterOptions, FilterResult } from "../types";
2
2
  /**
3
3
  * Menyensor kata kotor dalam teks
4
4
  *
@@ -1,4 +1,4 @@
1
- import { ProfanityWord, ProfanityCategory, Region, FilterOptions } from '../types';
1
+ import { ProfanityWord, ProfanityCategory, Region, FilterOptions } from "../types";
2
2
  export declare function findProfanity(text: string, options?: FilterOptions): string[];
3
3
  /**
4
4
  * Mencari kata kotor lengkap dengan metadata
@@ -11,15 +11,15 @@ export declare function findProfanityWithMetadata(text: string, options?: Filter
11
11
  /**
12
12
  * Mencari kategory kata kotor yang ada dalam teks
13
13
  *
14
- * @param text matchDetails Hasil pencarian dari fingProfanityWithMetadata()
15
- * @param options Opsi untuk pencarian kategori
14
+ * @param matchDetails Hasil pencarian dari fingProfanityWithMetadata()
15
+ * @return Array kategori unik
16
16
  */
17
17
  export declare function findCategories(matchDetails: ProfanityWord[]): ProfanityCategory[];
18
18
  /**
19
19
  * Mencari region kata kotor yang ada dalam teks
20
20
  *
21
- * @param text matchDetails Hasil pencarian dari fingProfanityWithMetadata()
22
- * @param options Opsi untuk pencarian region
21
+ * @param matchDetails Hasil pencarian dari fingProfanityWithMetadata()
22
+ * @return Array region unik
23
23
  */
24
24
  export declare function findRegions(matchDetails: ProfanityWord[]): Region[];
25
25
  /**
package/dist/index.d.ts CHANGED
@@ -1,8 +1,5 @@
1
- type ProfanityCategory = 'sexual' | 'insult' | 'profanity' | 'slur' | 'drugs' | 'disgusting' | 'blasphemy';
2
- type Region = 'general' | 'jawa' | 'sunda' | 'betawi' | 'batak' | 'minang' | 'bali' | 'madura' | 'bugis' | 'aceh' | 'ambon' | 'papua' | 'manado' | 'banjar' | 'palembang' | 'lampung' | 'ntt' | 'ntb';
3
- /**
4
- * Definisi kata kotor
5
- */
1
+ type ProfanityCategory = "sexual" | "insult" | "profanity" | "slur" | "drugs" | "disgusting" | "blasphemy";
2
+ type Region = "general" | "jawa" | "sunda" | "betawi" | "batak" | "minang" | "bali" | "madura" | "bugis" | "aceh" | "ambon" | "papua" | "manado" | "banjar" | "palembang" | "lampung" | "ntt" | "ntb";
6
3
  interface ProfanityWord {
7
4
  word: string;
8
5
  category: ProfanityCategory;
@@ -12,60 +9,51 @@ interface ProfanityWord {
12
9
  description?: string;
13
10
  context?: string;
14
11
  }
15
- /**
16
- * Opsi untuk konfigurasi filter
17
- */
18
12
  interface FilterOptions {
19
- /** List kata yang ingin difilter */
20
- wordList?: string[];
21
- /** Karakter pengganti untuk kata yang disensor */
22
13
  replaceWith?: string;
23
- /** Apakah harus menyensor seluruh kata atau hanya sebagian */
24
14
  fullWordCensor?: boolean;
25
- /** Apakah harus mendeteksi kata dengan variasi penulisan */
26
15
  detectLeetSpeak?: boolean;
27
- /** Mengabaikan kata-kata dalam konteks tertentu (misalnya nama) */
28
- whitelist?: string[];
29
- /** Apakah harus memeriksa substring (lebih ketat) */
30
16
  checkSubstring?: boolean;
31
- /** Kategori kata yang ingin difilter */
17
+ wordList?: string[];
18
+ whitelist?: string[];
32
19
  categories?: ProfanityCategory[];
33
- /** Daerah yang ingin difilter katanya */
34
20
  regions?: Region[];
35
- /** Tingkat keparahan minimum yang akan difilter (0-1) */
36
21
  severityThreshold?: number;
22
+ useRandomGrawlix?: boolean;
23
+ keepFirstAndLast?: boolean;
24
+ indonesianVariation?: boolean;
25
+ detectSimilarity?: boolean;
26
+ similarityThreshold?: number;
27
+ detectSplit?: boolean;
28
+ }
29
+ interface FilterResult {
30
+ filtered: string;
31
+ censored: number;
32
+ replacements: Array<{
33
+ original: string;
34
+ censored: string;
35
+ metadata?: ProfanityWord;
36
+ }>;
37
37
  }
38
- /**
39
- * Hasil analisis dari teks
40
- */
41
38
  interface AnalysisResult {
42
- /** Apakah teks mengandung kata kotor */
43
39
  hasProfanity: boolean;
44
- /** Daftar kata kotor yang ditemukan */
45
40
  matches: string[];
46
- /** Daftar kata kotor lengkap dengan metadata */
47
41
  matchDetails: ProfanityWord[];
48
- /** Daftar kategori kata kotor yang ditemukan */
49
42
  categories: ProfanityCategory[];
50
- /** Daftar daerah asal kata kotor yang ditemukan */
51
43
  regions: Region[];
52
- /** Tingkat keparahan (0-1) berdasarkan jumlah dan jenis kata */
53
44
  severityScore: number;
54
- }
55
- /**
56
- * Hasil filter dari teks
57
- */
58
- interface FilterResult {
59
- /** Teks hasil filter */
60
- filtered: string;
61
- /** Jumlah kata yang disensor */
62
- censored: number;
63
- /** Kata asli yang disensor dan penggantinya */
64
- replacements: Array<{
45
+ similarWords?: Array<{
46
+ word: string;
65
47
  original: string;
66
- censored: string;
67
- metadata?: ProfanityWord;
48
+ similarity: number;
68
49
  }>;
69
50
  }
51
+ interface RegexOptions {
52
+ wholeWord?: boolean;
53
+ caseSensitive?: boolean;
54
+ leetSpeak?: boolean;
55
+ detectSplit?: boolean;
56
+ indonesianVariation?: boolean;
57
+ }
70
58
 
71
- export type { AnalysisResult, FilterOptions, FilterResult, ProfanityCategory, ProfanityWord, Region };
59
+ export type { AnalysisResult, FilterOptions, FilterResult, ProfanityCategory, ProfanityWord, RegexOptions, Region };