@sideid/id-profanity-filter 1.9.6 β†’ 1.10.4

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/.eslintrc.js CHANGED
@@ -1,16 +1,44 @@
1
1
  module.exports = {
2
2
  parser: '@typescript-eslint/parser',
3
- extends: ['plugin:@typescript-eslint/recommended', 'prettier'],
4
3
  parserOptions: {
5
4
  ecmaVersion: 2020,
6
5
  sourceType: 'module',
6
+ project: './tsconfig.json',
7
7
  },
8
+ extends: [
9
+ 'eslint:recommended',
10
+ 'plugin:@typescript-eslint/recommended',
11
+ 'prettier', // Disables ESLint rules that might conflict with Prettier
12
+ ],
13
+ plugins: ['@typescript-eslint'],
8
14
  env: {
9
15
  node: true,
10
16
  jest: true,
11
17
  },
12
18
  rules: {
19
+ // Enforce consistent code style
13
20
  '@typescript-eslint/explicit-function-return-type': 'off',
14
- '@typescript-eslint/no-explicit-any': 'off',
21
+ '@typescript-eslint/no-explicit-any': 'warn',
22
+ '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],
23
+
24
+ // Allow certain TypeScript patterns
25
+ '@typescript-eslint/no-non-null-assertion': 'off',
26
+
27
+ // General ESLint rules
28
+ 'no-console': ['warn', { allow: ['warn', 'error'] }],
29
+ 'prefer-const': 'warn',
30
+ 'no-var': 'error',
31
+
32
+ // Make sure imports are properly sorted
33
+ 'sort-imports': [
34
+ 'off',
35
+ {
36
+ ignoreCase: false,
37
+ ignoreDeclarationSort: true,
38
+ ignoreMemberSort: false,
39
+ memberSyntaxSortOrder: ['none', 'all', 'multiple', 'single'],
40
+ },
41
+ ],
15
42
  },
43
+ ignorePatterns: ['dist/', 'node_modules/', '*.js', '*.d.ts'],
16
44
  };
package/README.md CHANGED
@@ -13,6 +13,7 @@ Library JavaScript/TypeScript untuk mendeteksi, menyensor, dan menganalisis kata
13
13
  - πŸ”’ **Penyensoran** - Menyensor kata-kata kotor dengan berbagai opsi kustomisasi
14
14
  - πŸ—ΊοΈ **Dukungan Bahasa Daerah** - Mencakup kata-kata dari berbagai daerah di Indonesia (Jawa, Sunda, Batak, dll)
15
15
  - 🧠 **Deteksi Cerdas** - Mendeteksi variasi ejaan, kata terpisah, dan kesamaan kata
16
+ - πŸ”  **Deteksi Levenshtein** - Mendeteksi kata kotor yang dimodifikasi dengan typo atau sengaja disamarkan
16
17
  - πŸ›‘οΈ **Preset** - Preset filter siap pakai untuk berbagai kebutuhan
17
18
  - πŸ”§ **Kustomisasi** - Opsi untuk menambahkan whitelist dan daftar kata kustom
18
19
 
@@ -182,11 +183,20 @@ Mengaktifkan deteksi variasi ejaan Bahasa Indonesia.
182
183
 
183
184
  Mengaktifkan deteksi kata yang dipisah.
184
185
 
185
- ##### `enableSimilarityDetection(threshold: number = 0.8)`
186
+ ##### `enableSimilarityDetection(threshold: number = 0.8, useLevenshtein: boolean = false, maxLevenshteinDistance: number = 2)`
186
187
 
187
188
  Mengaktifkan deteksi berdasarkan kesamaan kata.
188
189
 
189
190
  - **threshold**: Ambang batas kesamaan (0-1, default: 0.8)
191
+ - **useLevenshtein**: Gunakan algoritma Levenshtein untuk deteksi (default: false)
192
+ - **maxLevenshteinDistance**: Jarak edit maksimum yang diizinkan (default: 2)
193
+
194
+ ##### `enableLevenshteinDetection(threshold: number = 0.8, maxDistance: number = 2)`
195
+
196
+ Mengaktifkan deteksi berbasis jarak Levenshtein.
197
+
198
+ - **threshold**: Ambang batas kesamaan (0-1, default: 0.8)
199
+ - **maxDistance**: Jarak edit maksimum yang diizinkan (default: 2)
190
200
 
191
201
  ### Opsi Filter
192
202
 
@@ -210,6 +220,8 @@ interface FilterOptions {
210
220
  detectSimilarity?: boolean; // Deteksi kata berdasarkan kesamaan
211
221
  similarityThreshold?: number; // Ambang batas kesamaan (0-1)
212
222
  detectSplit?: boolean; // Deteksi kata yang dipisah (a-n-j-i-n-g)
223
+ useLevenshtein?: boolean; // Gunakan algoritma Levenshtein untuk deteksi kesamaan
224
+ maxLevenshteinDistance?: number; // Jarak edit maksimum untuk deteksi Levenshtein
213
225
  }
214
226
  ```
215
227
 
@@ -258,6 +270,8 @@ const filter = new IDProfanityFilter({
258
270
  detectSimilarity: true, // Deteksi kata yang mirip
259
271
  similarityThreshold: 0.8, // Ambang batas kesamaan
260
272
  detectSplit: true, // Deteksi kata yang dipisah
273
+ useLevenshtein: true, // Gunakan algoritma Levenshtein
274
+ maxLevenshteinDistance: 2, // Jarak Levenshtein maksimum
261
275
  });
262
276
  ```
263
277
 
@@ -300,10 +314,10 @@ console.log(hasil2.filtered);
300
314
  // Output: "Dia sangat ***** dan ****** dengan temannya"
301
315
  ```
302
316
 
303
- ### Deteksi Berdasarkan Kesamaan
317
+ ### Deteksi Berdasarkan Kesamaan (Similarity Detection)
304
318
 
305
319
  ```typescript
306
- // Aktifkan deteksi kesamaan
320
+ // Aktifkan deteksi kesamaan standar
307
321
  const filter = new IDProfanityFilter();
308
322
  filter.enableSimilarityDetection(0.75); // Set threshold kesamaan ke 0.75
309
323
 
@@ -323,6 +337,34 @@ console.log(hasil.filtered);
323
337
  // Output: "Dia benar-benar ****** dan *******!"
324
338
  ```
325
339
 
340
+ ### Deteksi dengan Algoritma Levenshtein Distance
341
+
342
+ ```typescript
343
+ // Aktifkan deteksi menggunakan algoritma Levenshtein Distance
344
+ const filter = new IDProfanityFilter();
345
+ filter.enableLevenshteinDetection(0.85, 2);
346
+ // Threshold 0.85, maksimal 2 karakter berbeda
347
+
348
+ const teks = 'Dia benar-benar konntol dan anjiing sekali!';
349
+ const hasil = filter.filter(teks);
350
+
351
+ console.log(hasil.filtered);
352
+ // Output: "Dia benar-benar ******* dan ****** sekali!"
353
+
354
+ // Atau menggunakan opsi langsung:
355
+ const filterCustom = new IDProfanityFilter({
356
+ detectSimilarity: true,
357
+ useLevenshtein: true,
358
+ similarityThreshold: 0.85,
359
+ maxLevenshteinDistance: 2,
360
+ });
361
+
362
+ // Mendeteksi typo atau variasi disengaja
363
+ const teksVariasi = 'kontool kamu kwontol anjiing';
364
+ console.log(filterCustom.filter(teksVariasi).filtered);
365
+ // Output: "******* kamu ******* ******"
366
+ ```
367
+
326
368
  ### Variasi Sensor Kata
327
369
 
328
370
  ```typescript
@@ -17,6 +17,8 @@ export declare const FILTER_PRESETS: {
17
17
  detectSimilarity?: boolean;
18
18
  similarityThreshold?: number;
19
19
  detectSplit?: boolean;
20
+ useLevenshtein?: boolean;
21
+ maxLevenshteinDistance?: number;
20
22
  };
21
23
  moderate: {
22
24
  severityThreshold: number;
@@ -34,6 +36,8 @@ export declare const FILTER_PRESETS: {
34
36
  detectSimilarity?: boolean;
35
37
  similarityThreshold?: number;
36
38
  detectSplit?: boolean;
39
+ useLevenshtein?: boolean;
40
+ maxLevenshteinDistance?: number;
37
41
  };
38
42
  light: {
39
43
  severityThreshold: number;
@@ -51,6 +55,8 @@ export declare const FILTER_PRESETS: {
51
55
  detectSimilarity?: boolean;
52
56
  similarityThreshold?: number;
53
57
  detectSplit?: boolean;
58
+ useLevenshtein?: boolean;
59
+ maxLevenshteinDistance?: number;
54
60
  };
55
61
  childSafe: {
56
62
  checkSubstring: boolean;
@@ -68,6 +74,8 @@ export declare const FILTER_PRESETS: {
68
74
  detectSimilarity?: boolean;
69
75
  similarityThreshold?: number;
70
76
  detectSplit?: boolean;
77
+ useLevenshtein?: boolean;
78
+ maxLevenshteinDistance?: number;
71
79
  };
72
80
  };
73
81
  export declare const CATEGORY_PRESETS: {
@@ -87,6 +95,8 @@ export declare const CATEGORY_PRESETS: {
87
95
  detectSimilarity?: boolean;
88
96
  similarityThreshold?: number;
89
97
  detectSplit?: boolean;
98
+ useLevenshtein?: boolean;
99
+ maxLevenshteinDistance?: number;
90
100
  };
91
101
  insults: {
92
102
  categories: ProfanityCategory[];
@@ -104,6 +114,8 @@ export declare const CATEGORY_PRESETS: {
104
114
  detectSimilarity?: boolean;
105
115
  similarityThreshold?: number;
106
116
  detectSplit?: boolean;
117
+ useLevenshtein?: boolean;
118
+ maxLevenshteinDistance?: number;
107
119
  };
108
120
  profanity: {
109
121
  categories: ProfanityCategory[];
@@ -121,6 +133,8 @@ export declare const CATEGORY_PRESETS: {
121
133
  detectSimilarity?: boolean;
122
134
  similarityThreshold?: number;
123
135
  detectSplit?: boolean;
136
+ useLevenshtein?: boolean;
137
+ maxLevenshteinDistance?: number;
124
138
  };
125
139
  };
126
140
  export declare const REGION_PRESETS: {
@@ -140,6 +154,8 @@ export declare const REGION_PRESETS: {
140
154
  detectSimilarity?: boolean;
141
155
  similarityThreshold?: number;
142
156
  detectSplit?: boolean;
157
+ useLevenshtein?: boolean;
158
+ maxLevenshteinDistance?: number;
143
159
  };
144
160
  jawa: {
145
161
  regions: Region[];
@@ -157,6 +173,8 @@ export declare const REGION_PRESETS: {
157
173
  detectSimilarity?: boolean;
158
174
  similarityThreshold?: number;
159
175
  detectSplit?: boolean;
176
+ useLevenshtein?: boolean;
177
+ maxLevenshteinDistance?: number;
160
178
  };
161
179
  sunda: {
162
180
  regions: Region[];
@@ -174,6 +192,8 @@ export declare const REGION_PRESETS: {
174
192
  detectSimilarity?: boolean;
175
193
  similarityThreshold?: number;
176
194
  detectSplit?: boolean;
195
+ useLevenshtein?: boolean;
196
+ maxLevenshteinDistance?: number;
177
197
  };
178
198
  betawi: {
179
199
  regions: Region[];
@@ -191,6 +211,8 @@ export declare const REGION_PRESETS: {
191
211
  detectSimilarity?: boolean;
192
212
  similarityThreshold?: number;
193
213
  detectSplit?: boolean;
214
+ useLevenshtein?: boolean;
215
+ maxLevenshteinDistance?: number;
194
216
  };
195
217
  batak: {
196
218
  regions: Region[];
@@ -208,6 +230,8 @@ export declare const REGION_PRESETS: {
208
230
  detectSimilarity?: boolean;
209
231
  similarityThreshold?: number;
210
232
  detectSplit?: boolean;
233
+ useLevenshtein?: boolean;
234
+ maxLevenshteinDistance?: number;
211
235
  };
212
236
  };
213
237
  export declare const REPLACEMENT_CHARS: {
@@ -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
  *
@@ -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
package/dist/index.d.ts CHANGED
@@ -25,6 +25,8 @@ interface FilterOptions {
25
25
  detectSimilarity?: boolean;
26
26
  similarityThreshold?: number;
27
27
  detectSplit?: boolean;
28
+ useLevenshtein?: boolean;
29
+ maxLevenshteinDistance?: number;
28
30
  }
29
31
  interface FilterResult {
30
32
  filtered: string;