glin-profanity 2.3.3 → 2.3.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 (101) hide show
  1. package/dist/index.cjs +5590 -0
  2. package/dist/index.d.cts +120 -0
  3. package/dist/index.d.ts +120 -0
  4. package/dist/index.js +5572 -0
  5. package/package.json +13 -12
  6. package/lib/cjs/packages/js/src/core/index.d.ts +0 -4
  7. package/lib/cjs/packages/js/src/core/index.js +0 -55
  8. package/lib/cjs/packages/js/src/core/index.js.map +0 -1
  9. package/lib/cjs/packages/js/src/core/types.d.ts +0 -20
  10. package/lib/cjs/packages/js/src/core/types.js +0 -3
  11. package/lib/cjs/packages/js/src/core/types.js.map +0 -1
  12. package/lib/cjs/packages/js/src/data/dictionary.d.ts +0 -26
  13. package/lib/cjs/packages/js/src/data/dictionary.js +0 -54
  14. package/lib/cjs/packages/js/src/data/dictionary.js.map +0 -1
  15. package/lib/cjs/packages/js/src/filters/Filter.d.ts +0 -32
  16. package/lib/cjs/packages/js/src/filters/Filter.js +0 -246
  17. package/lib/cjs/packages/js/src/filters/Filter.js.map +0 -1
  18. package/lib/cjs/packages/js/src/hooks/useProfanityChecker.d.ts +0 -11
  19. package/lib/cjs/packages/js/src/hooks/useProfanityChecker.js +0 -42
  20. package/lib/cjs/packages/js/src/hooks/useProfanityChecker.js.map +0 -1
  21. package/lib/cjs/packages/js/src/index.d.ts +0 -12
  22. package/lib/cjs/packages/js/src/index.js +0 -24
  23. package/lib/cjs/packages/js/src/index.js.map +0 -1
  24. package/lib/cjs/packages/js/src/nlp/contextAnalyzer.d.ts +0 -35
  25. package/lib/cjs/packages/js/src/nlp/contextAnalyzer.js +0 -203
  26. package/lib/cjs/packages/js/src/nlp/contextAnalyzer.js.map +0 -1
  27. package/lib/cjs/packages/js/src/types/types.d.ts +0 -56
  28. package/lib/cjs/packages/js/src/types/types.js +0 -14
  29. package/lib/cjs/packages/js/src/types/types.js.map +0 -1
  30. package/lib/cjs/shared/dictionaries/Norwegian.json +0 -17
  31. package/lib/cjs/shared/dictionaries/arabic.json +0 -157
  32. package/lib/cjs/shared/dictionaries/chinese.json +0 -298
  33. package/lib/cjs/shared/dictionaries/czech.json +0 -45
  34. package/lib/cjs/shared/dictionaries/danish.json +0 -24
  35. package/lib/cjs/shared/dictionaries/english.json +0 -410
  36. package/lib/cjs/shared/dictionaries/esperanto.json +0 -41
  37. package/lib/cjs/shared/dictionaries/finnish.json +0 -134
  38. package/lib/cjs/shared/dictionaries/french.json +0 -99
  39. package/lib/cjs/shared/dictionaries/german.json +0 -69
  40. package/lib/cjs/shared/dictionaries/globalWhitelist.json +0 -31
  41. package/lib/cjs/shared/dictionaries/hindi.json +0 -100
  42. package/lib/cjs/shared/dictionaries/hungarian.json +0 -100
  43. package/lib/cjs/shared/dictionaries/italian.json +0 -184
  44. package/lib/cjs/shared/dictionaries/japanese.json +0 -189
  45. package/lib/cjs/shared/dictionaries/korean.json +0 -76
  46. package/lib/cjs/shared/dictionaries/persian.json +0 -49
  47. package/lib/cjs/shared/dictionaries/polish.json +0 -57
  48. package/lib/cjs/shared/dictionaries/portuguese.json +0 -78
  49. package/lib/cjs/shared/dictionaries/russian.json +0 -156
  50. package/lib/cjs/shared/dictionaries/spanish.json +0 -72
  51. package/lib/cjs/shared/dictionaries/swedish.json +0 -47
  52. package/lib/cjs/shared/dictionaries/thai.json +0 -35
  53. package/lib/cjs/shared/dictionaries/turkish.json +0 -195
  54. package/lib/esm/packages/js/src/core/index.d.ts +0 -4
  55. package/lib/esm/packages/js/src/core/index.js +0 -47
  56. package/lib/esm/packages/js/src/core/index.js.map +0 -1
  57. package/lib/esm/packages/js/src/core/types.d.ts +0 -20
  58. package/lib/esm/packages/js/src/core/types.js +0 -2
  59. package/lib/esm/packages/js/src/core/types.js.map +0 -1
  60. package/lib/esm/packages/js/src/data/dictionary.d.ts +0 -26
  61. package/lib/esm/packages/js/src/data/dictionary.js +0 -49
  62. package/lib/esm/packages/js/src/data/dictionary.js.map +0 -1
  63. package/lib/esm/packages/js/src/filters/Filter.d.ts +0 -32
  64. package/lib/esm/packages/js/src/filters/Filter.js +0 -240
  65. package/lib/esm/packages/js/src/filters/Filter.js.map +0 -1
  66. package/lib/esm/packages/js/src/hooks/useProfanityChecker.d.ts +0 -11
  67. package/lib/esm/packages/js/src/hooks/useProfanityChecker.js +0 -38
  68. package/lib/esm/packages/js/src/hooks/useProfanityChecker.js.map +0 -1
  69. package/lib/esm/packages/js/src/index.d.ts +0 -12
  70. package/lib/esm/packages/js/src/index.js +0 -15
  71. package/lib/esm/packages/js/src/index.js.map +0 -1
  72. package/lib/esm/packages/js/src/nlp/contextAnalyzer.d.ts +0 -35
  73. package/lib/esm/packages/js/src/nlp/contextAnalyzer.js +0 -199
  74. package/lib/esm/packages/js/src/nlp/contextAnalyzer.js.map +0 -1
  75. package/lib/esm/packages/js/src/types/types.d.ts +0 -56
  76. package/lib/esm/packages/js/src/types/types.js +0 -11
  77. package/lib/esm/packages/js/src/types/types.js.map +0 -1
  78. package/lib/esm/shared/dictionaries/Norwegian.json +0 -17
  79. package/lib/esm/shared/dictionaries/arabic.json +0 -157
  80. package/lib/esm/shared/dictionaries/chinese.json +0 -298
  81. package/lib/esm/shared/dictionaries/czech.json +0 -45
  82. package/lib/esm/shared/dictionaries/danish.json +0 -24
  83. package/lib/esm/shared/dictionaries/english.json +0 -410
  84. package/lib/esm/shared/dictionaries/esperanto.json +0 -41
  85. package/lib/esm/shared/dictionaries/finnish.json +0 -134
  86. package/lib/esm/shared/dictionaries/french.json +0 -99
  87. package/lib/esm/shared/dictionaries/german.json +0 -69
  88. package/lib/esm/shared/dictionaries/globalWhitelist.json +0 -31
  89. package/lib/esm/shared/dictionaries/hindi.json +0 -100
  90. package/lib/esm/shared/dictionaries/hungarian.json +0 -100
  91. package/lib/esm/shared/dictionaries/italian.json +0 -184
  92. package/lib/esm/shared/dictionaries/japanese.json +0 -189
  93. package/lib/esm/shared/dictionaries/korean.json +0 -76
  94. package/lib/esm/shared/dictionaries/persian.json +0 -49
  95. package/lib/esm/shared/dictionaries/polish.json +0 -57
  96. package/lib/esm/shared/dictionaries/portuguese.json +0 -78
  97. package/lib/esm/shared/dictionaries/russian.json +0 -156
  98. package/lib/esm/shared/dictionaries/spanish.json +0 -72
  99. package/lib/esm/shared/dictionaries/swedish.json +0 -47
  100. package/lib/esm/shared/dictionaries/thai.json +0 -35
  101. package/lib/esm/shared/dictionaries/turkish.json +0 -195
@@ -1,195 +0,0 @@
1
- {
2
- "words": [
3
- "aardappels afgieteng",
4
- "achter het raam zitten",
5
- "afberen",
6
- "aflebberen",
7
- "afrossen",
8
- "afrukken",
9
- "aftrekken",
10
- "afwerkplaats",
11
- "afzeiken",
12
- "afzuigen",
13
- "anderhalve man en een paardekop",
14
- "anita",
15
- "asbak",
16
- "aso",
17
- "bagger schijten",
18
- "balen",
19
- "bedonderen",
20
- "befborstelg",
21
- "beffen",
22
- "bekken",
23
- "belazeren",
24
- "besodemieterd zijn",
25
- "besodemieteren",
26
- "beurt",
27
- "boemelen",
28
- "boerelul",
29
- "boerenpummelg",
30
- "bokkelul",
31
- "botergeil",
32
- "broekhoesten",
33
- "brugpieperg",
34
- "buffelen",
35
- "buiten de pot piesen",
36
- "da's kloten van de bok",
37
- "de ballen",
38
- "de hoer spelen",
39
- "de hond uitlaten",
40
- "de koffer induiken",
41
- "delg",
42
- "de pijp aan maarten geven",
43
- "de pijp uitgaan",
44
- "dombo",
45
- "draaikontg",
46
- "driehoog achter wonen",
47
- "drolg",
48
- "drooggeiler",
49
- "droogkloot",
50
- "een beurt geven",
51
- "een nummertje maken",
52
- "een wip maken",
53
- "eikel",
54
- "engerd",
55
- "flamoes",
56
- "flikken",
57
- "flikker",
58
- "gadverdamme",
59
- "galbak",
60
- "gat",
61
- "gedoogzone",
62
- "geilneef",
63
- "gesodemieter",
64
- "godverdomme",
65
- "graftak",
66
- "gras maaien",
67
- "gratenkutg",
68
- "greppeldel",
69
- "griet",
70
- "hoempert",
71
- "hoer",
72
- "hoerenbuurt",
73
- "hoerenloper",
74
- "hoerig",
75
- "hol",
76
- "hufter",
77
- "huisdealer",
78
- "johny",
79
- "kanen",
80
- "kettingzeugg",
81
- "klaarkomen",
82
- "klerebeer",
83
- "klojo",
84
- "klooien",
85
- "klootjesvolk",
86
- "klootoog",
87
- "klootzak",
88
- "kloten",
89
- "knor",
90
- "kontg",
91
- "kontneuken",
92
- "krentekakker",
93
- "kut",
94
- "kuttelikkertje",
95
- "kwakkieg",
96
- "liefdesgrot",
97
- "lul",
98
- "lul-de-behanger",
99
- "lulhannes",
100
- "lummel",
101
- "mafketel",
102
- "matennaaierg",
103
- "matje",
104
- "mof",
105
- "mutsg",
106
- "naaien",
107
- "naakt",
108
- "neuken",
109
- "neukstier",
110
- "nicht",
111
- "oetlul",
112
- "opgeilen",
113
- "opkankeren",
114
- "oprotten",
115
- "opsodemieteren",
116
- "op z'n hondjes",
117
- "op z'n sodemieter geven",
118
- "opzouten",
119
- "ouwehoer",
120
- "ouwehoeren",
121
- "ouwe rukker",
122
- "paal",
123
- "paardelul",
124
- "palen",
125
- "penozeg",
126
- "piesen",
127
- "pijpbekkieg",
128
- "pijpen",
129
- "pik",
130
- "pleurislaaier",
131
- "poep",
132
- "poepen",
133
- "poot",
134
- "portiekslet",
135
- "pot",
136
- "potverdorie",
137
- "publiciteitsgeil",
138
- "raaskallen",
139
- "reet",
140
- "reetridder",
141
- "reet trappen, voor zijn",
142
- "remsporeng",
143
- "reutelen",
144
- "rothoer",
145
- "rotzak",
146
- "rukhond",
147
- "rukken",
148
- "schatje",
149
- "schijt",
150
- "schijten",
151
- "schoft",
152
- "schuinsmarcheerder",
153
- "shit",
154
- "slempen",
155
- "sletg",
156
- "sletterig",
157
- "slik mijn zaad",
158
- "snolg",
159
- "spuiten",
160
- "standje",
161
- "standje-69g",
162
- "stoephoer",
163
- "stootje",
164
- "strontg",
165
- "sufferdg",
166
- "tapijtnek",
167
- "teefg",
168
- "temeier",
169
- "teringlijer",
170
- "toeter",
171
- "tongzoeng",
172
- "triootjeg",
173
- "trottoir prostituée",
174
- "trottoirteef",
175
- "vergallen",
176
- "verkloten",
177
- "verneuken",
178
- "viespeuk",
179
- "vingeren",
180
- "vleesroos",
181
- "voor jan lul",
182
- "voor jan-met-de-korte-achternaam",
183
- "watje",
184
- "welzijnsmafia",
185
- "wijf",
186
- "wippen",
187
- "wuftje",
188
- "zaadje",
189
- "zakkenwasser",
190
- "zeiken",
191
- "zeiker",
192
- "zuigen",
193
- "zuiplap"
194
- ]
195
- }
@@ -1,4 +0,0 @@
1
- import { ProfanityCheckerConfig, ProfanityCheckResult } from './types';
2
- export declare function checkProfanity(text: string, config?: ProfanityCheckerConfig): ProfanityCheckResult;
3
- export declare function checkProfanityAsync(text: string, config?: ProfanityCheckerConfig): Promise<ProfanityCheckResult>;
4
- export declare function isWordProfane(word: string, config?: ProfanityCheckerConfig): boolean;
@@ -1,47 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { Filter } from '../filters/Filter';
11
- import globalWhitelistData from '@shared/dictionaries/globalWhitelist.json';
12
- function createFilterConfig(config) {
13
- var _a;
14
- const effective = Object.assign(Object.assign({}, (config !== null && config !== void 0 ? config : {})), { ignoreWords: globalWhitelistData.whitelist, fuzzyToleranceLevel: (_a = config === null || config === void 0 ? void 0 : config.fuzzyToleranceLevel) !== null && _a !== void 0 ? _a : 0.8 });
15
- if (effective.allowObfuscatedMatch && effective.wordBoundaries) {
16
- console.warn('[Glin-Profanity] Obfuscated match enabled → wordBoundaries will be ignored internally.');
17
- }
18
- return effective;
19
- }
20
- export function checkProfanity(text, config) {
21
- var _a;
22
- const filterConfig = createFilterConfig(config);
23
- const filter = new Filter(filterConfig);
24
- const checkResult = filter.checkProfanity(text);
25
- // Filter based on minSeverity (if provided)
26
- const filteredWords = (config === null || config === void 0 ? void 0 : config.minSeverity) && checkResult.severityMap
27
- ? checkResult.profaneWords.filter((word) => checkResult.severityMap &&
28
- checkResult.severityMap[word] >= config.minSeverity)
29
- : checkResult.profaneWords;
30
- // Optional auto-replace
31
- const autoReplaced = (config === null || config === void 0 ? void 0 : config.autoReplace) && checkResult.processedText
32
- ? checkResult.processedText
33
- : text;
34
- // Custom actions
35
- (_a = config === null || config === void 0 ? void 0 : config.customActions) === null || _a === void 0 ? void 0 : _a.call(config, checkResult);
36
- return Object.assign(Object.assign({}, checkResult), { filteredWords,
37
- autoReplaced });
38
- }
39
- export function checkProfanityAsync(text, config) {
40
- return __awaiter(this, void 0, void 0, function* () {
41
- return Promise.resolve(checkProfanity(text, config));
42
- });
43
- }
44
- export function isWordProfane(word, config) {
45
- return checkProfanity(word, config).containsProfanity;
46
- }
47
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAgB,MAAM,mBAAmB,CAAC;AAEzD,OAAO,mBAAmB,MAAM,2CAA2C,CAAC;AAE5E,SAAS,kBAAkB,CAAC,MAA+B;;IACzD,MAAM,SAAS,mCACV,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,KACjB,WAAW,EAAG,mBAA2B,CAAC,SAAS,EACnD,mBAAmB,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,mCAAI,GAAG,GACxD,CAAC;IAEF,IAAI,SAAS,CAAC,oBAAoB,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;QAC/D,OAAO,CAAC,IAAI,CACV,wFAAwF,CACzF,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAA+B;;IAC1E,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAEhD,4CAA4C;IAC5C,MAAM,aAAa,GACjB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,KAAI,WAAW,CAAC,WAAW;QAC5C,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,IAAI,EAAE,EAAE,CACP,WAAW,CAAC,WAAW;YACvB,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAY,CACvD;QACH,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;IAE/B,wBAAwB;IACxB,MAAM,YAAY,GAChB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,KAAI,WAAW,CAAC,aAAa;QAC9C,CAAC,CAAC,WAAW,CAAC,aAAa;QAC3B,CAAC,CAAC,IAAI,CAAC;IAEX,iBAAiB;IACjB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,uDAAG,WAAW,CAAC,CAAC;IAErC,uCACK,WAAW,KACd,aAAa;QACb,YAAY,IACZ;AACJ,CAAC;AAED,MAAM,UAAgB,mBAAmB,CAAC,IAAY,EAAE,MAA+B;;QACrF,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;CAAA;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAA+B;IACzE,OAAO,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,iBAAiB,CAAC;AACxD,CAAC"}
@@ -1,20 +0,0 @@
1
- import { CheckProfanityResult, Language, SeverityLevel } from '../types/types';
2
- export interface ProfanityCheckerConfig {
3
- languages?: Language[];
4
- allLanguages?: boolean;
5
- caseSensitive?: boolean;
6
- wordBoundaries?: boolean;
7
- customWords?: string[];
8
- replaceWith?: string;
9
- severityLevels?: boolean;
10
- allowObfuscatedMatch?: boolean;
11
- fuzzyToleranceLevel?: number;
12
- minSeverity?: SeverityLevel;
13
- autoReplace?: boolean;
14
- customActions?: (result: CheckProfanityResult) => void;
15
- }
16
- export interface ProfanityCheckResult extends CheckProfanityResult {
17
- filteredWords: string[];
18
- autoReplaced: string;
19
- }
20
- export type { CheckProfanityResult, Language, SeverityLevel, FilterConfig } from '../types/types';
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/core/types.ts"],"names":[],"mappings":""}
@@ -1,26 +0,0 @@
1
- declare const _default: {
2
- arabic: string[];
3
- chinese: string[];
4
- czech: string[];
5
- danish: string[];
6
- english: string[];
7
- esperanto: string[];
8
- finnish: string[];
9
- french: string[];
10
- german: string[];
11
- hindi: string[];
12
- hungarian: string[];
13
- italian: string[];
14
- japanese: string[];
15
- korean: string[];
16
- norwegian: string[];
17
- persian: string[];
18
- polish: string[];
19
- portuguese: string[];
20
- russian: string[];
21
- spanish: string[];
22
- turkish: string[];
23
- swedish: string[];
24
- thai: string[];
25
- };
26
- export default _default;
@@ -1,49 +0,0 @@
1
- import Arabic from '@shared/dictionaries/arabic.json';
2
- import Chinese from '@shared/dictionaries/chinese.json';
3
- import Czech from '@shared/dictionaries/czech.json';
4
- import Danish from '@shared/dictionaries/danish.json';
5
- import Esperanto from '@shared/dictionaries/esperanto.json';
6
- import English from '@shared/dictionaries/english.json';
7
- import Finnish from '@shared/dictionaries/finnish.json';
8
- import German from '@shared/dictionaries/german.json';
9
- import Hindi from '@shared/dictionaries/hindi.json';
10
- import Hungarian from '@shared/dictionaries/hungarian.json';
11
- import Korean from '@shared/dictionaries/korean.json';
12
- import Norwegian from '@shared/dictionaries/Norwegian.json';
13
- import Persian from '@shared/dictionaries/persian.json';
14
- import Polish from '@shared/dictionaries/polish.json';
15
- import Portuguese from '@shared/dictionaries/portuguese.json';
16
- import Russian from '@shared/dictionaries/russian.json';
17
- import French from '@shared/dictionaries/french.json';
18
- import Italian from '@shared/dictionaries/italian.json';
19
- import Japanese from '@shared/dictionaries/japanese.json';
20
- import Turkish from '@shared/dictionaries/turkish.json';
21
- import Spanish from '@shared/dictionaries/spanish.json';
22
- import Swedish from '@shared/dictionaries/swedish.json';
23
- import Thai from '@shared/dictionaries/thai.json';
24
- export default {
25
- arabic: Arabic.words,
26
- chinese: Chinese.words,
27
- czech: Czech.words,
28
- danish: Danish.words,
29
- english: English.words,
30
- esperanto: Esperanto.words,
31
- finnish: Finnish.words,
32
- french: French.words,
33
- german: German.words,
34
- hindi: Hindi.words,
35
- hungarian: Hungarian.words,
36
- italian: Italian.words,
37
- japanese: Japanese.words,
38
- korean: Korean.words,
39
- norwegian: Norwegian.words,
40
- persian: Persian.words,
41
- polish: Polish.words,
42
- portuguese: Portuguese.words,
43
- russian: Russian.words,
44
- spanish: Spanish.words,
45
- turkish: Turkish.words,
46
- swedish: Swedish.words,
47
- thai: Thai.words,
48
- };
49
- //# sourceMappingURL=dictionary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dictionary.js","sourceRoot":"","sources":["../../../../../../src/data/dictionary.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,KAAK,MAAM,iCAAiC,CAAC;AACpD,OAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,OAAO,KAAK,MAAM,iCAAiC,CAAC;AACpD,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,OAAO,UAAU,MAAM,sCAAsC,CAAC;AAC9D,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,QAAQ,MAAM,oCAAoC,CAAC;AAC1D,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,IAAI,MAAM,gCAAgC,CAAC;AAClD,eAAe;IACb,MAAM,EAAE,MAAM,CAAC,KAAK;IACpB,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,MAAM,EAAE,MAAM,CAAC,KAAK;IACpB,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,SAAS,EAAE,SAAS,CAAC,KAAK;IAC1B,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,MAAM,EAAE,MAAM,CAAC,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC,KAAK;IACpB,KAAK,EAAE,KAAK,CAAC,KAAK;IAClB,SAAS,EAAE,SAAS,CAAC,KAAK;IAC1B,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,QAAQ,EAAE,QAAQ,CAAC,KAAK;IACxB,MAAM,EAAE,MAAM,CAAC,KAAK;IACpB,SAAS,EAAE,SAAS,CAAC,KAAK;IAC1B,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,MAAM,EAAE,MAAM,CAAC,KAAK;IACpB,UAAU,EAAE,UAAU,CAAC,KAAK;IAC5B,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,OAAO,EAAE,OAAO,CAAC,KAAK;IACtB,IAAI,EAAE,IAAI,CAAC,KAAK;CACjB,CAAC"}
@@ -1,32 +0,0 @@
1
- import { CheckProfanityResult, SeverityLevel, FilterConfig } from '../types/types';
2
- export type { FilterConfig };
3
- declare class Filter {
4
- private words;
5
- private caseSensitive;
6
- private wordBoundaries;
7
- private replaceWith?;
8
- private severityLevels;
9
- private ignoreWords;
10
- private logProfanity;
11
- private allowObfuscatedMatch;
12
- private fuzzyToleranceLevel;
13
- private enableContextAware;
14
- private contextWindow;
15
- private confidenceThreshold;
16
- private contextAnalyzer?;
17
- private primaryLanguage;
18
- constructor(config?: FilterConfig);
19
- private debugLog;
20
- private normalizeObfuscated;
21
- private getRegex;
22
- private isFuzzyToleranceMatch;
23
- private evaluateSeverity;
24
- isProfane(value: string): boolean;
25
- matches(word: string): boolean;
26
- checkProfanity(text: string): CheckProfanityResult;
27
- checkProfanityWithMinSeverity(text: string, minSeverity?: SeverityLevel): {
28
- filteredWords: string[];
29
- result: CheckProfanityResult;
30
- };
31
- }
32
- export { Filter };
@@ -1,240 +0,0 @@
1
- import dictionary from '../data/dictionary';
2
- import { SeverityLevel } from '../types/types';
3
- import { ContextAnalyzer } from '../nlp/contextAnalyzer';
4
- class Filter {
5
- constructor(config) {
6
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
7
- const defaultLanguage = 'english';
8
- this.enableContextAware = (_a = config === null || config === void 0 ? void 0 : config.enableContextAware) !== null && _a !== void 0 ? _a : false;
9
- this.contextWindow = (_b = config === null || config === void 0 ? void 0 : config.contextWindow) !== null && _b !== void 0 ? _b : 3;
10
- this.confidenceThreshold = (_c = config === null || config === void 0 ? void 0 : config.confidenceThreshold) !== null && _c !== void 0 ? _c : 0.7;
11
- this.primaryLanguage = ((_d = config === null || config === void 0 ? void 0 : config.languages) === null || _d === void 0 ? void 0 : _d[0]) || defaultLanguage;
12
- if (this.enableContextAware) {
13
- this.contextAnalyzer = new ContextAnalyzer({
14
- contextWindow: this.contextWindow,
15
- language: this.primaryLanguage,
16
- domainWhitelists: ((_e = config === null || config === void 0 ? void 0 : config.domainWhitelists) === null || _e === void 0 ? void 0 : _e[this.primaryLanguage]) || []
17
- });
18
- }
19
- let words = [];
20
- this.caseSensitive = (_f = config === null || config === void 0 ? void 0 : config.caseSensitive) !== null && _f !== void 0 ? _f : false;
21
- this.allowObfuscatedMatch = (_g = config === null || config === void 0 ? void 0 : config.allowObfuscatedMatch) !== null && _g !== void 0 ? _g : false;
22
- this.wordBoundaries = (_h = config === null || config === void 0 ? void 0 : config.wordBoundaries) !== null && _h !== void 0 ? _h : !this.allowObfuscatedMatch;
23
- this.replaceWith = config === null || config === void 0 ? void 0 : config.replaceWith;
24
- this.severityLevels = (_j = config === null || config === void 0 ? void 0 : config.severityLevels) !== null && _j !== void 0 ? _j : false;
25
- this.ignoreWords = new Set(((_k = config === null || config === void 0 ? void 0 : config.ignoreWords) === null || _k === void 0 ? void 0 : _k.map((word) => word.toLowerCase())) || []);
26
- this.logProfanity = (_l = config === null || config === void 0 ? void 0 : config.logProfanity) !== null && _l !== void 0 ? _l : false;
27
- this.fuzzyToleranceLevel = (_m = config === null || config === void 0 ? void 0 : config.fuzzyToleranceLevel) !== null && _m !== void 0 ? _m : 0.8;
28
- if (config === null || config === void 0 ? void 0 : config.allLanguages) {
29
- for (const lang in dictionary) {
30
- if (dictionary.hasOwnProperty(lang)) {
31
- words = [...words, ...dictionary[lang]];
32
- }
33
- }
34
- }
35
- else {
36
- const languages = (config === null || config === void 0 ? void 0 : config.languages) || ['english'];
37
- const languagesChecks = new Set(languages);
38
- languagesChecks.forEach((lang) => {
39
- words = [...words, ...dictionary[lang]];
40
- });
41
- }
42
- if (config === null || config === void 0 ? void 0 : config.customWords) {
43
- words = [...words, ...config.customWords];
44
- }
45
- this.words = new Map(words.map((word) => [word.toLowerCase(), 1]));
46
- }
47
- debugLog(...args) {
48
- if (this.logProfanity) {
49
- console.log('[glin-profanity]', ...args);
50
- }
51
- }
52
- normalizeObfuscated(text) {
53
- let normalized = text.replace(/([a-zA-Z])\1{1,}/g, '$1$1');
54
- const charMap = {
55
- '@': 'a',
56
- $: 's',
57
- '!': 'i',
58
- '1': 'i',
59
- '*': '',
60
- };
61
- normalized = normalized.replace(/[@$!1*]/g, (m) => charMap[m] || m);
62
- return normalized;
63
- }
64
- getRegex(word) {
65
- const flags = this.caseSensitive ? 'g' : 'gi';
66
- const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
67
- const boundary = this.wordBoundaries ? '\\b' : '';
68
- return new RegExp(`${boundary}${escapedWord}${boundary}`, flags);
69
- }
70
- isFuzzyToleranceMatch(word, text) {
71
- const simplifiedText = text.toLowerCase().replace(/[^a-z]/g, '');
72
- const simplifiedWord = word.toLowerCase();
73
- let matchCount = 0;
74
- let index = 0;
75
- for (let i = 0; i < simplifiedText.length; i++) {
76
- if (simplifiedText[i] === simplifiedWord[index]) {
77
- matchCount++;
78
- index++;
79
- if (index === simplifiedWord.length)
80
- break;
81
- }
82
- }
83
- const score = matchCount / simplifiedWord.length;
84
- return score >= this.fuzzyToleranceLevel;
85
- }
86
- evaluateSeverity(word, text) {
87
- if (this.wordBoundaries && this.getRegex(word).test(text)) {
88
- return SeverityLevel.EXACT;
89
- }
90
- if (this.getRegex(word).test(text))
91
- return SeverityLevel.EXACT;
92
- if (this.isFuzzyToleranceMatch(word, text))
93
- return SeverityLevel.FUZZY;
94
- return undefined;
95
- }
96
- isProfane(value) {
97
- let input = this.allowObfuscatedMatch
98
- ? this.normalizeObfuscated(value)
99
- : value;
100
- for (const word of this.words.keys()) {
101
- if (!this.ignoreWords.has(word.toLowerCase()) &&
102
- this.evaluateSeverity(word, input) !== undefined) {
103
- return true;
104
- }
105
- }
106
- return false;
107
- }
108
- matches(word) {
109
- return this.isProfane(word);
110
- }
111
- checkProfanity(text) {
112
- // Backward compatibility: if not context-aware, run old logic
113
- if (!this.enableContextAware) {
114
- let input = this.allowObfuscatedMatch
115
- ? this.normalizeObfuscated(text)
116
- : text;
117
- input = input.toLowerCase();
118
- const profaneWords = [];
119
- const severityMap = {};
120
- for (const dictWord of this.words.keys()) {
121
- if (this.ignoreWords.has(dictWord.toLowerCase()))
122
- continue;
123
- const severity = this.evaluateSeverity(dictWord, input);
124
- if (severity !== undefined) {
125
- const regex = this.getRegex(dictWord);
126
- let match;
127
- while ((match = regex.exec(input)) !== null) {
128
- profaneWords.push(match[0]);
129
- if (severityMap[match[0]] === undefined) {
130
- severityMap[match[0]] = severity;
131
- }
132
- }
133
- }
134
- }
135
- let processedText = text;
136
- if (this.replaceWith && profaneWords.length > 0) {
137
- const uniqueWords = Array.from(new Set(profaneWords));
138
- for (const word of uniqueWords) {
139
- const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
140
- const replacementRegex = this.wordBoundaries
141
- ? new RegExp(`\\b${escaped}\\b`, 'gi')
142
- : new RegExp(escaped, 'gi');
143
- processedText = processedText.replace(replacementRegex, this.replaceWith);
144
- }
145
- }
146
- return {
147
- containsProfanity: profaneWords.length > 0,
148
- profaneWords: Array.from(new Set(profaneWords)),
149
- processedText: this.replaceWith ? processedText : undefined,
150
- severityMap: this.severityLevels && Object.keys(severityMap).length > 0
151
- ? severityMap
152
- : undefined,
153
- };
154
- }
155
- // Context-aware path
156
- let input = this.allowObfuscatedMatch
157
- ? this.normalizeObfuscated(text)
158
- : text;
159
- input = input.toLowerCase();
160
- const originalText = text;
161
- const profaneWords = [];
162
- const severityMap = {};
163
- const matches = [];
164
- for (const dictWord of this.words.keys()) {
165
- if (this.ignoreWords.has(dictWord.toLowerCase()))
166
- continue;
167
- const severity = this.evaluateSeverity(dictWord, input);
168
- if (severity !== undefined) {
169
- const regex = this.getRegex(dictWord);
170
- let match;
171
- while ((match = regex.exec(input)) !== null) {
172
- const matchedWord = match[0];
173
- const matchIndex = match.index;
174
- const matchObj = {
175
- word: matchedWord,
176
- index: matchIndex,
177
- severity: severity
178
- };
179
- if (this.enableContextAware && this.contextAnalyzer) {
180
- const contextResult = this.contextAnalyzer.analyzeContext(originalText, matchedWord, matchIndex);
181
- matchObj.contextScore = contextResult.contextScore;
182
- matchObj.reason = contextResult.reason;
183
- matchObj.isWhitelisted = contextResult.isWhitelisted;
184
- if (contextResult.isWhitelisted || (contextResult.contextScore > this.confidenceThreshold)) {
185
- continue;
186
- }
187
- }
188
- profaneWords.push(matchedWord);
189
- if (severityMap[matchedWord] === undefined) {
190
- severityMap[matchedWord] = severity;
191
- }
192
- matches.push(matchObj);
193
- }
194
- }
195
- }
196
- if (profaneWords.length > 0) {
197
- this.debugLog('Detected:', profaneWords);
198
- }
199
- let processedText = text;
200
- if (this.replaceWith && profaneWords.length > 0) {
201
- const uniqueWords = Array.from(new Set(profaneWords));
202
- for (const word of uniqueWords) {
203
- const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
204
- const replacementRegex = this.wordBoundaries
205
- ? new RegExp(`\\b${escaped}\\b`, 'gi')
206
- : new RegExp(escaped, 'gi');
207
- processedText = processedText.replace(replacementRegex, this.replaceWith);
208
- }
209
- }
210
- let contextScore;
211
- if (this.enableContextAware && matches.length > 0) {
212
- const totalScore = matches.reduce((sum, match) => sum + (match.contextScore || 0.5), 0);
213
- contextScore = totalScore / matches.length;
214
- }
215
- return {
216
- containsProfanity: profaneWords.length > 0,
217
- profaneWords: Array.from(new Set(profaneWords)),
218
- processedText: this.replaceWith ? processedText : undefined,
219
- severityMap: this.severityLevels && Object.keys(severityMap).length > 0 ? severityMap : undefined,
220
- matches: matches.length > 0 ? matches : undefined,
221
- contextScore,
222
- reason: matches.length > 0 ?
223
- `Found ${matches.length} potential profanity matches` :
224
- 'No profanity detected'
225
- };
226
- }
227
- checkProfanityWithMinSeverity(text, minSeverity = SeverityLevel.EXACT) {
228
- const result = this.checkProfanity(text);
229
- const filteredWords = result.severityMap && result.profaneWords.length > 0
230
- ? result.profaneWords.filter((word) => {
231
- var _a;
232
- const severity = (_a = result.severityMap) === null || _a === void 0 ? void 0 : _a[word];
233
- return typeof severity === 'number' && severity >= minSeverity;
234
- })
235
- : [];
236
- return { filteredWords, result };
237
- }
238
- }
239
- export { Filter };
240
- //# sourceMappingURL=Filter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Filter.js","sourceRoot":"","sources":["../../../../../../src/filters/Filter.ts"],"names":[],"mappings":"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"}