glin-profanity 1.1.9 → 2.1.0

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.
@@ -4,22 +4,20 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Filter = void 0;
7
- // src/filters/Filter.ts
8
- const globalWhitelist_json_1 = __importDefault(require("../data/globalWhitelist.json"));
9
7
  const dictionary_1 = __importDefault(require("../data/dictionary"));
8
+ const types_1 = require("../types/types");
10
9
  class Filter {
11
10
  constructor(config) {
12
- var _a, _b, _c, _d, _e, _f;
11
+ var _a, _b, _c, _d, _e, _f, _g;
13
12
  let words = [];
14
13
  this.caseSensitive = (_a = config === null || config === void 0 ? void 0 : config.caseSensitive) !== null && _a !== void 0 ? _a : false;
15
- this.wordBoundaries = (_b = config === null || config === void 0 ? void 0 : config.wordBoundaries) !== null && _b !== void 0 ? _b : true;
14
+ this.allowObfuscatedMatch = (_b = config === null || config === void 0 ? void 0 : config.allowObfuscatedMatch) !== null && _b !== void 0 ? _b : false;
15
+ this.wordBoundaries = (_c = config === null || config === void 0 ? void 0 : config.wordBoundaries) !== null && _c !== void 0 ? _c : !this.allowObfuscatedMatch;
16
16
  this.replaceWith = config === null || config === void 0 ? void 0 : config.replaceWith;
17
- this.severityLevels = (_c = config === null || config === void 0 ? void 0 : config.severityLevels) !== null && _c !== void 0 ? _c : false;
18
- this.ignoreWords = new Set(((_d = config === null || config === void 0 ? void 0 : config.ignoreWords) === null || _d === void 0 ? void 0 : _d.map(word => word.toLowerCase())) || []);
19
- this.logProfanity = (_e = config === null || config === void 0 ? void 0 : config.logProfanity) !== null && _e !== void 0 ? _e : false;
20
- const jsonWhitelist = globalWhitelist_json_1.default.whitelist.map(word => word.toLowerCase());
21
- const mergedWhitelist = [...jsonWhitelist, ...((_f = config === null || config === void 0 ? void 0 : config.globalWhitelist) !== null && _f !== void 0 ? _f : [])];
22
- this.globalWhitelist = new Set(mergedWhitelist);
17
+ this.severityLevels = (_d = config === null || config === void 0 ? void 0 : config.severityLevels) !== null && _d !== void 0 ? _d : false;
18
+ this.ignoreWords = new Set(((_e = config === null || config === void 0 ? void 0 : config.ignoreWords) === null || _e === void 0 ? void 0 : _e.map((word) => word.toLowerCase())) || []);
19
+ this.logProfanity = (_f = config === null || config === void 0 ? void 0 : config.logProfanity) !== null && _f !== void 0 ? _f : false;
20
+ this.fuzzyToleranceLevel = (_g = config === null || config === void 0 ? void 0 : config.fuzzyToleranceLevel) !== null && _g !== void 0 ? _g : 0.8;
23
21
  if (config === null || config === void 0 ? void 0 : config.allLanguages) {
24
22
  for (const lang in dictionary_1.default) {
25
23
  if (dictionary_1.default.hasOwnProperty(lang)) {
@@ -30,108 +28,135 @@ class Filter {
30
28
  else {
31
29
  const languages = (config === null || config === void 0 ? void 0 : config.languages) || ['english'];
32
30
  const languagesChecks = new Set(languages);
33
- if (languagesChecks.size !== 0) {
34
- languagesChecks.forEach(lang => {
35
- words = [...words, ...dictionary_1.default[lang]];
36
- });
37
- }
31
+ languagesChecks.forEach((lang) => {
32
+ words = [...words, ...dictionary_1.default[lang]];
33
+ });
38
34
  }
39
35
  if (config === null || config === void 0 ? void 0 : config.customWords) {
40
36
  words = [...words, ...config.customWords];
41
37
  }
42
- this.words = new Map(words.map(word => [word.toLowerCase(), 1])); // Store words in lowercase
38
+ this.words = new Map(words.map((word) => [word.toLowerCase(), 1]));
39
+ }
40
+ debugLog(...args) {
41
+ if (this.logProfanity) {
42
+ console.log('[glin-profanity]', ...args);
43
+ }
44
+ }
45
+ normalizeObfuscated(text) {
46
+ let normalized = text.replace(/([a-zA-Z])\1{1,}/g, '$1$1');
47
+ const charMap = {
48
+ '@': 'a',
49
+ $: 's',
50
+ '!': 'i',
51
+ '1': 'i',
52
+ '*': '',
53
+ };
54
+ normalized = normalized.replace(/[@$!1*]/g, (m) => charMap[m] || m);
55
+ return normalized;
43
56
  }
44
57
  getRegex(word) {
45
58
  const flags = this.caseSensitive ? 'g' : 'gi';
59
+ const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
46
60
  const boundary = this.wordBoundaries ? '\\b' : '';
47
- return new RegExp(`${boundary}${word.replace(/(\W)/g, '\\$1')}${boundary}`, flags);
48
- }
49
- isFuzzyMatch(word, text) {
50
- const pattern = `${word.split('').join('[^a-zA-Z]*')}`;
51
- const regex = new RegExp(pattern, this.caseSensitive ? 'g' : 'gi');
52
- return regex.test(text);
61
+ return new RegExp(`${boundary}${escapedWord}${boundary}`, flags);
53
62
  }
54
- isMergedMatch(word, text) {
55
- const pattern = `${word}`;
56
- const regex = new RegExp(pattern, this.caseSensitive ? 'g' : 'gi');
57
- return regex.test(text);
63
+ isFuzzyToleranceMatch(word, text) {
64
+ const simplifiedText = text.toLowerCase().replace(/[^a-z]/g, '');
65
+ const simplifiedWord = word.toLowerCase();
66
+ let matchCount = 0;
67
+ let index = 0;
68
+ for (let i = 0; i < simplifiedText.length; i++) {
69
+ if (simplifiedText[i] === simplifiedWord[index]) {
70
+ matchCount++;
71
+ index++;
72
+ if (index === simplifiedWord.length)
73
+ break;
74
+ }
75
+ }
76
+ const score = matchCount / simplifiedWord.length;
77
+ return score >= this.fuzzyToleranceLevel;
58
78
  }
59
79
  evaluateSeverity(word, text) {
60
- if (this.getRegex(word).test(text)) {
61
- return 1; // Exact match
62
- }
63
- else if (this.isFuzzyMatch(word, text)) {
64
- return 2; // Fuzzy match
80
+ if (this.wordBoundaries && this.getRegex(word).test(text)) {
81
+ return types_1.SeverityLevel.Exact;
65
82
  }
66
- else if (this.isMergedMatch(word, text)) {
67
- return 3; // Merged word match
68
- }
69
- return undefined; // No match or irrelevant match
83
+ if (this.getRegex(word).test(text))
84
+ return types_1.SeverityLevel.Exact;
85
+ if (this.isFuzzyToleranceMatch(word, text))
86
+ return types_1.SeverityLevel.Fuzzy;
87
+ return undefined;
70
88
  }
71
89
  isProfane(value) {
90
+ let input = this.allowObfuscatedMatch
91
+ ? this.normalizeObfuscated(value)
92
+ : value;
72
93
  for (const word of this.words.keys()) {
73
- if (!this.ignoreWords.has(word.toLowerCase()) && !this.globalWhitelist.has(word.toLowerCase()) && this.evaluateSeverity(word, value) !== undefined) {
94
+ if (!this.ignoreWords.has(word.toLowerCase()) &&
95
+ this.evaluateSeverity(word, input) !== undefined) {
74
96
  return true;
75
97
  }
76
98
  }
77
99
  return false;
78
100
  }
79
- checkProfanityInSentence(text) {
80
- const words = text.split(/\s+/);
81
- const profaneWords = [];
82
- const severityMap = {};
83
- for (const word of words) {
84
- for (const dictWord of this.words.keys()) {
85
- const severity = this.evaluateSeverity(dictWord, word);
86
- if (severity !== undefined && !this.ignoreWords.has(dictWord.toLowerCase())) {
87
- profaneWords.push(word);
88
- severityMap[word] = severity; // Use the actual word found in text as the key
89
- }
90
- }
91
- }
92
- let processedText = text;
93
- if (this.replaceWith) {
94
- for (const word of profaneWords) {
95
- processedText = processedText.replace(new RegExp(word, 'gi'), this.replaceWith);
96
- }
97
- }
98
- return {
99
- containsProfanity: profaneWords.length > 0,
100
- profaneWords,
101
- processedText: this.replaceWith ? processedText : undefined,
102
- severityMap: Object.keys(severityMap).length > 0 ? severityMap : undefined, // Only return if there are valid severities
103
- };
101
+ matches(word) {
102
+ return this.isProfane(word);
104
103
  }
105
104
  checkProfanity(text) {
106
- const words = text.split(/\s+/);
105
+ let input = this.allowObfuscatedMatch
106
+ ? this.normalizeObfuscated(text)
107
+ : text;
108
+ input = input.toLowerCase();
107
109
  const profaneWords = [];
108
110
  const severityMap = {};
109
- // Check each word individually
110
- for (const word of words) {
111
- for (const dictWord of this.words.keys()) {
112
- const severity = this.evaluateSeverity(dictWord, word);
113
- if (severity !== undefined && !this.ignoreWords.has(dictWord.toLowerCase())) {
114
- profaneWords.push(word);
115
- severityMap[word] = severity; // Use the actual word found in text as the key
111
+ for (const dictWord of this.words.keys()) {
112
+ if (this.ignoreWords.has(dictWord.toLowerCase()))
113
+ continue;
114
+ const severity = this.evaluateSeverity(dictWord, input);
115
+ if (severity !== undefined) {
116
+ const regex = this.getRegex(dictWord);
117
+ let match;
118
+ while ((match = regex.exec(input)) !== null) {
119
+ profaneWords.push(match[0]);
120
+ if (severityMap[match[0]] === undefined) {
121
+ severityMap[match[0]] = severity;
122
+ }
116
123
  }
117
124
  }
118
125
  }
119
- const sentenceResult = this.checkProfanityInSentence(text);
120
- profaneWords.push(...sentenceResult.profaneWords);
121
- Object.assign(severityMap, sentenceResult.severityMap);
126
+ if (profaneWords.length > 0) {
127
+ this.debugLog('Detected:', profaneWords);
128
+ }
122
129
  let processedText = text;
123
- if (this.replaceWith) {
124
- for (const word of profaneWords) {
125
- processedText = processedText.replace(new RegExp(word, 'gi'), this.replaceWith);
130
+ if (this.replaceWith && profaneWords.length > 0) {
131
+ const uniqueWords = Array.from(new Set(profaneWords));
132
+ for (const word of uniqueWords) {
133
+ const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
134
+ const replacementRegex = this.wordBoundaries
135
+ ? new RegExp(`\\b${escaped}\\b`, 'gi')
136
+ : new RegExp(escaped, 'gi');
137
+ processedText = processedText.replace(replacementRegex, this.replaceWith);
126
138
  }
127
139
  }
128
140
  return {
129
141
  containsProfanity: profaneWords.length > 0,
130
142
  profaneWords: Array.from(new Set(profaneWords)),
131
143
  processedText: this.replaceWith ? processedText : undefined,
132
- severityMap: Object.keys(severityMap).length > 0 ? severityMap : undefined,
144
+ severityMap: this.severityLevels && Object.keys(severityMap).length > 0
145
+ ? severityMap
146
+ : undefined,
133
147
  };
134
148
  }
149
+ checkProfanityWithMinSeverity(text, minSeverity = types_1.SeverityLevel.Exact) {
150
+ const result = this.checkProfanity(text);
151
+ const filteredWords = result.severityMap && result.profaneWords.length > 0
152
+ ? result.profaneWords.filter((word) => {
153
+ var _a;
154
+ const severity = (_a = result.severityMap) === null || _a === void 0 ? void 0 : _a[word];
155
+ return typeof severity === 'number' && severity >= minSeverity;
156
+ })
157
+ : [];
158
+ return { filteredWords, result };
159
+ }
135
160
  }
136
161
  exports.Filter = Filter;
137
162
  //# sourceMappingURL=Filter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Filter.js","sourceRoot":"","sources":["../../../src/filters/Filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Filter.js","sourceRoot":"","sources":["../../../src/filters/Filter.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { CheckProfanityResult, Language } from '../types/types';
2
- interface ProfanityCheckerConfig {
1
+ import { CheckProfanityResult, Language, SeverityLevel } from '../types/types';
2
+ export interface ProfanityCheckerConfig {
3
3
  languages?: Language[];
4
4
  allLanguages?: boolean;
5
5
  caseSensitive?: boolean;
@@ -7,11 +7,28 @@ interface ProfanityCheckerConfig {
7
7
  customWords?: string[];
8
8
  replaceWith?: string;
9
9
  severityLevels?: boolean;
10
+ allowObfuscatedMatch?: boolean;
11
+ fuzzyToleranceLevel?: number;
12
+ minSeverity?: SeverityLevel;
13
+ autoReplace?: boolean;
10
14
  customActions?: (result: CheckProfanityResult) => void;
11
15
  }
12
16
  export declare const useProfanityChecker: (config?: ProfanityCheckerConfig) => {
13
17
  result: CheckProfanityResult;
14
- checkText: (text: string) => void;
18
+ checkText: (text: string) => {
19
+ filteredWords: string[];
20
+ autoReplaced: string;
21
+ containsProfanity: boolean;
22
+ profaneWords: string[];
23
+ processedText?: string;
24
+ severityMap?: Record<string, SeverityLevel>;
25
+ matchContexts?: {
26
+ word: string;
27
+ context: string;
28
+ }[];
29
+ };
15
30
  checkTextAsync: (text: string) => Promise<CheckProfanityResult>;
31
+ reset: () => void;
32
+ isDirty: boolean;
33
+ isWordProfane: (word: string) => boolean;
16
34
  };
17
- export {};
@@ -17,30 +17,51 @@ const react_1 = require("react");
17
17
  const Filter_1 = require("../filters/Filter");
18
18
  const globalWhitelist_json_1 = __importDefault(require("../data/globalWhitelist.json"));
19
19
  const useProfanityChecker = (config) => {
20
+ var _a;
20
21
  const [result, setResult] = (0, react_1.useState)(null);
21
- const filterConfig = Object.assign(Object.assign({}, config), { globalWhitelist: globalWhitelist_json_1.default.whitelist });
22
- const filter = new Filter_1.Filter(filterConfig);
22
+ const filterConfig = (0, react_1.useMemo)(() => {
23
+ var _a;
24
+ const effective = Object.assign(Object.assign({}, (config !== null && config !== void 0 ? config : {})), { ignoreWords: globalWhitelist_json_1.default.whitelist, fuzzyToleranceLevel: (_a = config === null || config === void 0 ? void 0 : config.fuzzyToleranceLevel) !== null && _a !== void 0 ? _a : 0.8 });
25
+ if (effective.allowObfuscatedMatch && effective.wordBoundaries) {
26
+ console.warn('[Glin-Profanity] Obfuscated match enabled → wordBoundaries will be ignored internally.');
27
+ }
28
+ return effective;
29
+ }, [config]);
30
+ const filter = (0, react_1.useMemo)(() => new Filter_1.Filter(filterConfig), [filterConfig]);
23
31
  const checkText = (text) => {
32
+ var _a;
24
33
  const checkResult = filter.checkProfanity(text);
34
+ // Filter based on minSeverity (if provided)
35
+ const filteredWords = (config === null || config === void 0 ? void 0 : config.minSeverity) && checkResult.severityMap
36
+ ? checkResult.profaneWords.filter((word) => checkResult.severityMap &&
37
+ checkResult.severityMap[word] >= config.minSeverity)
38
+ : checkResult.profaneWords;
39
+ // Optional auto-replace
40
+ const autoReplaced = (config === null || config === void 0 ? void 0 : config.autoReplace) && checkResult.processedText
41
+ ? checkResult.processedText
42
+ : text;
25
43
  setResult(checkResult);
26
- if (config === null || config === void 0 ? void 0 : config.customActions) {
27
- config.customActions(checkResult);
28
- }
44
+ (_a = config === null || config === void 0 ? void 0 : config.customActions) === null || _a === void 0 ? void 0 : _a.call(config, checkResult);
45
+ return Object.assign(Object.assign({}, checkResult), { filteredWords,
46
+ autoReplaced });
29
47
  };
30
48
  const checkTextAsync = (text) => __awaiter(void 0, void 0, void 0, function* () {
31
49
  return new Promise((resolve) => {
32
- const checkResult = filter.checkProfanity(text);
33
- setResult(checkResult);
34
- if (config === null || config === void 0 ? void 0 : config.customActions) {
35
- config.customActions(checkResult);
36
- }
50
+ const checkResult = checkText(text); // sync call
37
51
  resolve(checkResult);
38
52
  });
39
53
  });
54
+ const isWordProfane = (word) => {
55
+ return filter.checkProfanity(word).containsProfanity;
56
+ };
57
+ const reset = () => setResult(null);
40
58
  return {
41
59
  result,
42
60
  checkText,
43
61
  checkTextAsync,
62
+ reset,
63
+ isDirty: (_a = result === null || result === void 0 ? void 0 : result.containsProfanity) !== null && _a !== void 0 ? _a : false,
64
+ isWordProfane,
44
65
  };
45
66
  };
46
67
  exports.useProfanityChecker = useProfanityChecker;
@@ -1 +1 @@
1
- {"version":3,"file":"useProfanityChecker.js","sourceRoot":"","sources":["../../../src/hooks/useProfanityChecker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iCAAiC;AACjC,8CAA2C;AAE3C,wFAA+D;AAaxD,MAAM,mBAAmB,GAAG,CAAC,MAA+B,EAAE,EAAE;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAA8B,IAAI,CAAC,CAAC;IACxE,MAAM,YAAY,mCACb,MAAM,KACT,eAAe,EAAE,8BAAmB,CAAC,SAAS,GAC/C,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,YAAY,CAAC,CAAC;IAExC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;QACjC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAChD,SAAS,CAAC,WAAW,CAAC,CAAC;QACvB,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,EAAE,CAAC;YAC1B,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAO,IAAY,EAAE,EAAE;QAC5C,OAAO,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,EAAE;YACnD,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAChD,SAAS,CAAC,WAAW,CAAC,CAAC;YACvB,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,EAAE,CAAC;gBAC1B,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAA,CAAC;IAEF,OAAO;QACL,MAAM;QACN,SAAS;QACT,cAAc;KACf,CAAC;AACJ,CAAC,CAAC;AAjCW,QAAA,mBAAmB,uBAiC9B"}
1
+ {"version":3,"file":"useProfanityChecker.js","sourceRoot":"","sources":["../../../src/hooks/useProfanityChecker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iCAA0C;AAC1C,8CAAyD;AAEzD,wFAA+D;AAiBxD,MAAM,mBAAmB,GAAG,CAAC,MAA+B,EAAE,EAAE;;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAA8B,IAAI,CAAC,CAAC;IAExE,MAAM,YAAY,GAAiB,IAAA,eAAO,EAAC,GAAG,EAAE;;QAC9C,MAAM,SAAS,mCACV,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,KACjB,WAAW,EAAE,8BAAmB,CAAC,SAAS,EAC1C,mBAAmB,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,mBAAmB,mCAAI,GAAG,GACxD,CAAC;QAEF,IAAI,SAAS,CAAC,oBAAoB,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC/D,OAAO,CAAC,IAAI,CACV,wFAAwF,CACzF,CAAC;QACJ,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAI,eAAM,CAAC,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEvE,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;;QACjC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAEhD,4CAA4C;QAC5C,MAAM,aAAa,GACjB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,KAAI,WAAW,CAAC,WAAW;YAC5C,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAC7B,CAAC,IAAI,EAAE,EAAE,CACP,WAAW,CAAC,WAAW;gBACvB,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,WAAY,CACvD;YACH,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;QAE/B,wBAAwB;QACxB,MAAM,YAAY,GAChB,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,KAAI,WAAW,CAAC,aAAa;YAC9C,CAAC,CAAC,WAAW,CAAC,aAAa;YAC3B,CAAC,CAAC,IAAI,CAAC;QAEX,SAAS,CAAC,WAAW,CAAC,CAAC;QACvB,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,aAAa,uDAAG,WAAW,CAAC,CAAC;QAErC,uCACK,WAAW,KACd,aAAa;YACb,YAAY,IACZ;IACJ,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAO,IAAY,EAAE,EAAE;QAC5C,OAAO,IAAI,OAAO,CAAuB,CAAC,OAAO,EAAE,EAAE;YACnD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;YACjD,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAA,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;QACrC,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC;IACvD,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEpC,OAAO;QACL,MAAM;QACN,SAAS;QACT,cAAc;QACd,KAAK;QACL,OAAO,EAAE,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,iBAAiB,mCAAI,KAAK;QAC3C,aAAa;KACd,CAAC;AACJ,CAAC,CAAC;AAvEW,QAAA,mBAAmB,uBAuE9B"}
@@ -1,3 +1,4 @@
1
1
  export { Filter } from './filters/Filter';
2
2
  export { useProfanityChecker } from './hooks/useProfanityChecker';
3
+ export { SeverityLevel } from './types/types';
3
4
  export type { Language, CheckProfanityResult } from './types/types';
package/lib/cjs/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useProfanityChecker = exports.Filter = void 0;
3
+ exports.SeverityLevel = exports.useProfanityChecker = exports.Filter = void 0;
4
4
  var Filter_1 = require("./filters/Filter");
5
5
  Object.defineProperty(exports, "Filter", { enumerable: true, get: function () { return Filter_1.Filter; } });
6
6
  var useProfanityChecker_1 = require("./hooks/useProfanityChecker");
7
7
  Object.defineProperty(exports, "useProfanityChecker", { enumerable: true, get: function () { return useProfanityChecker_1.useProfanityChecker; } });
8
+ var types_1 = require("./types/types");
9
+ Object.defineProperty(exports, "SeverityLevel", { enumerable: true, get: function () { return types_1.SeverityLevel; } });
8
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0C;AAAjC,gGAAA,MAAM,OAAA;AACf,mEAAkE;AAAzD,0HAAA,mBAAmB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0C;AAAjC,gGAAA,MAAM,OAAA;AACf,mEAAkE;AAAzD,0HAAA,mBAAmB,OAAA;AAC5B,uCAA8C;AAArC,sGAAA,aAAa,OAAA"}
@@ -1,9 +1,21 @@
1
+ export declare enum SeverityLevel {
2
+ Exact = 1,
3
+ Fuzzy = 2,
4
+ Merged = 3
5
+ }
6
+ export type SeverityLabel = keyof typeof SeverityLevel;
7
+ export interface FilteredProfanityResult {
8
+ result: CheckProfanityResult;
9
+ filteredWords: string[];
10
+ }
1
11
  export interface CheckProfanityResult {
2
12
  containsProfanity: boolean;
3
13
  profaneWords: string[];
4
14
  processedText?: string;
5
- severityMap?: {
6
- [word: string]: number;
7
- };
15
+ severityMap?: Record<string, SeverityLevel>;
16
+ matchContexts?: {
17
+ word: string;
18
+ context: string;
19
+ }[];
8
20
  }
9
21
  export type Language = 'arabic' | 'chinese' | 'czech' | 'danish' | 'english' | 'esperanto' | 'finnish' | 'french' | 'german' | 'hindi' | 'hungarian' | 'italian' | 'japanese' | 'korean' | 'norwegian' | 'persian' | 'polish' | 'portuguese' | 'russian' | 'turkish' | 'swedish' | 'thai';
@@ -1,3 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeverityLevel = void 0;
4
+ // src/types/types.ts
5
+ var SeverityLevel;
6
+ (function (SeverityLevel) {
7
+ SeverityLevel[SeverityLevel["Exact"] = 1] = "Exact";
8
+ SeverityLevel[SeverityLevel["Fuzzy"] = 2] = "Fuzzy";
9
+ SeverityLevel[SeverityLevel["Merged"] = 3] = "Merged";
10
+ })(SeverityLevel || (exports.SeverityLevel = SeverityLevel = {}));
3
11
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":";;;AAAA,qBAAqB;AACrB,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,mDAAS,CAAA;IACT,mDAAS,CAAA;IACT,qDAAU,CAAA;AACZ,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB"}