glin-profanity 2.1.0 → 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 (82) hide show
  1. package/README.md +205 -55
  2. package/dist/index.cjs +5590 -0
  3. package/dist/index.d.cts +120 -0
  4. package/dist/index.d.ts +120 -0
  5. package/dist/index.js +5572 -0
  6. package/package.json +37 -13
  7. package/lib/cjs/data/Norwegian.json +0 -17
  8. package/lib/cjs/data/arabic.json +0 -157
  9. package/lib/cjs/data/chinese.json +0 -298
  10. package/lib/cjs/data/czech.json +0 -45
  11. package/lib/cjs/data/danish.json +0 -24
  12. package/lib/cjs/data/dictionary.d.ts +0 -25
  13. package/lib/cjs/data/dictionary.js +0 -52
  14. package/lib/cjs/data/dictionary.js.map +0 -1
  15. package/lib/cjs/data/english.json +0 -410
  16. package/lib/cjs/data/esperanto.json +0 -41
  17. package/lib/cjs/data/finnish.json +0 -134
  18. package/lib/cjs/data/french.json +0 -99
  19. package/lib/cjs/data/german.json +0 -69
  20. package/lib/cjs/data/globalWhitelist.json +0 -31
  21. package/lib/cjs/data/hindi.json +0 -100
  22. package/lib/cjs/data/hungarian.json +0 -100
  23. package/lib/cjs/data/italian.json +0 -184
  24. package/lib/cjs/data/japanese.json +0 -189
  25. package/lib/cjs/data/korean.json +0 -76
  26. package/lib/cjs/data/persian.json +0 -49
  27. package/lib/cjs/data/polish.json +0 -57
  28. package/lib/cjs/data/portuguese.json +0 -78
  29. package/lib/cjs/data/russian.json +0 -156
  30. package/lib/cjs/data/swedish.json +0 -47
  31. package/lib/cjs/data/thai.json +0 -35
  32. package/lib/cjs/data/turkish.json +0 -195
  33. package/lib/cjs/filters/Filter.d.ts +0 -39
  34. package/lib/cjs/filters/Filter.js +0 -162
  35. package/lib/cjs/filters/Filter.js.map +0 -1
  36. package/lib/cjs/hooks/useProfanityChecker.d.ts +0 -34
  37. package/lib/cjs/hooks/useProfanityChecker.js +0 -68
  38. package/lib/cjs/hooks/useProfanityChecker.js.map +0 -1
  39. package/lib/cjs/index.d.ts +0 -4
  40. package/lib/cjs/index.js +0 -10
  41. package/lib/cjs/index.js.map +0 -1
  42. package/lib/cjs/types/types.d.ts +0 -21
  43. package/lib/cjs/types/types.js +0 -11
  44. package/lib/cjs/types/types.js.map +0 -1
  45. package/lib/esm/data/Norwegian.json +0 -17
  46. package/lib/esm/data/arabic.json +0 -157
  47. package/lib/esm/data/chinese.json +0 -298
  48. package/lib/esm/data/czech.json +0 -45
  49. package/lib/esm/data/danish.json +0 -24
  50. package/lib/esm/data/dictionary.d.ts +0 -25
  51. package/lib/esm/data/dictionary.js +0 -47
  52. package/lib/esm/data/dictionary.js.map +0 -1
  53. package/lib/esm/data/english.json +0 -410
  54. package/lib/esm/data/esperanto.json +0 -41
  55. package/lib/esm/data/finnish.json +0 -134
  56. package/lib/esm/data/french.json +0 -99
  57. package/lib/esm/data/german.json +0 -69
  58. package/lib/esm/data/globalWhitelist.json +0 -31
  59. package/lib/esm/data/hindi.json +0 -100
  60. package/lib/esm/data/hungarian.json +0 -100
  61. package/lib/esm/data/italian.json +0 -184
  62. package/lib/esm/data/japanese.json +0 -189
  63. package/lib/esm/data/korean.json +0 -76
  64. package/lib/esm/data/persian.json +0 -49
  65. package/lib/esm/data/polish.json +0 -57
  66. package/lib/esm/data/portuguese.json +0 -78
  67. package/lib/esm/data/russian.json +0 -156
  68. package/lib/esm/data/swedish.json +0 -47
  69. package/lib/esm/data/thai.json +0 -35
  70. package/lib/esm/data/turkish.json +0 -195
  71. package/lib/esm/filters/Filter.d.ts +0 -39
  72. package/lib/esm/filters/Filter.js +0 -156
  73. package/lib/esm/filters/Filter.js.map +0 -1
  74. package/lib/esm/hooks/useProfanityChecker.d.ts +0 -34
  75. package/lib/esm/hooks/useProfanityChecker.js +0 -61
  76. package/lib/esm/hooks/useProfanityChecker.js.map +0 -1
  77. package/lib/esm/index.d.ts +0 -4
  78. package/lib/esm/index.js +0 -4
  79. package/lib/esm/index.js.map +0 -1
  80. package/lib/esm/types/types.d.ts +0 -21
  81. package/lib/esm/types/types.js +0 -8
  82. package/lib/esm/types/types.js.map +0 -1
@@ -1,39 +0,0 @@
1
- import { Language, CheckProfanityResult, SeverityLevel } from '../types/types';
2
- export interface FilterConfig {
3
- languages?: Language[];
4
- allLanguages?: boolean;
5
- caseSensitive?: boolean;
6
- wordBoundaries?: boolean;
7
- customWords?: string[];
8
- replaceWith?: string;
9
- severityLevels?: boolean;
10
- ignoreWords?: string[];
11
- logProfanity?: boolean;
12
- allowObfuscatedMatch?: boolean;
13
- fuzzyToleranceLevel?: number;
14
- }
15
- declare class Filter {
16
- private words;
17
- private caseSensitive;
18
- private wordBoundaries;
19
- private replaceWith?;
20
- private severityLevels;
21
- private ignoreWords;
22
- private logProfanity;
23
- private allowObfuscatedMatch;
24
- private fuzzyToleranceLevel;
25
- constructor(config?: FilterConfig);
26
- private debugLog;
27
- private normalizeObfuscated;
28
- private getRegex;
29
- private isFuzzyToleranceMatch;
30
- private evaluateSeverity;
31
- isProfane(value: string): boolean;
32
- matches(word: string): boolean;
33
- checkProfanity(text: string): CheckProfanityResult;
34
- checkProfanityWithMinSeverity(text: string, minSeverity?: SeverityLevel): {
35
- filteredWords: string[];
36
- result: CheckProfanityResult;
37
- };
38
- }
39
- export { Filter };
@@ -1,156 +0,0 @@
1
- import dictionary from '../data/dictionary';
2
- import { SeverityLevel } from '../types/types';
3
- class Filter {
4
- constructor(config) {
5
- var _a, _b, _c, _d, _e, _f, _g;
6
- let words = [];
7
- this.caseSensitive = (_a = config === null || config === void 0 ? void 0 : config.caseSensitive) !== null && _a !== void 0 ? _a : false;
8
- this.allowObfuscatedMatch = (_b = config === null || config === void 0 ? void 0 : config.allowObfuscatedMatch) !== null && _b !== void 0 ? _b : false;
9
- this.wordBoundaries = (_c = config === null || config === void 0 ? void 0 : config.wordBoundaries) !== null && _c !== void 0 ? _c : !this.allowObfuscatedMatch;
10
- this.replaceWith = config === null || config === void 0 ? void 0 : config.replaceWith;
11
- this.severityLevels = (_d = config === null || config === void 0 ? void 0 : config.severityLevels) !== null && _d !== void 0 ? _d : false;
12
- 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())) || []);
13
- this.logProfanity = (_f = config === null || config === void 0 ? void 0 : config.logProfanity) !== null && _f !== void 0 ? _f : false;
14
- this.fuzzyToleranceLevel = (_g = config === null || config === void 0 ? void 0 : config.fuzzyToleranceLevel) !== null && _g !== void 0 ? _g : 0.8;
15
- if (config === null || config === void 0 ? void 0 : config.allLanguages) {
16
- for (const lang in dictionary) {
17
- if (dictionary.hasOwnProperty(lang)) {
18
- words = [...words, ...dictionary[lang]];
19
- }
20
- }
21
- }
22
- else {
23
- const languages = (config === null || config === void 0 ? void 0 : config.languages) || ['english'];
24
- const languagesChecks = new Set(languages);
25
- languagesChecks.forEach((lang) => {
26
- words = [...words, ...dictionary[lang]];
27
- });
28
- }
29
- if (config === null || config === void 0 ? void 0 : config.customWords) {
30
- words = [...words, ...config.customWords];
31
- }
32
- this.words = new Map(words.map((word) => [word.toLowerCase(), 1]));
33
- }
34
- debugLog(...args) {
35
- if (this.logProfanity) {
36
- console.log('[glin-profanity]', ...args);
37
- }
38
- }
39
- normalizeObfuscated(text) {
40
- let normalized = text.replace(/([a-zA-Z])\1{1,}/g, '$1$1');
41
- const charMap = {
42
- '@': 'a',
43
- $: 's',
44
- '!': 'i',
45
- '1': 'i',
46
- '*': '',
47
- };
48
- normalized = normalized.replace(/[@$!1*]/g, (m) => charMap[m] || m);
49
- return normalized;
50
- }
51
- getRegex(word) {
52
- const flags = this.caseSensitive ? 'g' : 'gi';
53
- const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
54
- const boundary = this.wordBoundaries ? '\\b' : '';
55
- return new RegExp(`${boundary}${escapedWord}${boundary}`, flags);
56
- }
57
- isFuzzyToleranceMatch(word, text) {
58
- const simplifiedText = text.toLowerCase().replace(/[^a-z]/g, '');
59
- const simplifiedWord = word.toLowerCase();
60
- let matchCount = 0;
61
- let index = 0;
62
- for (let i = 0; i < simplifiedText.length; i++) {
63
- if (simplifiedText[i] === simplifiedWord[index]) {
64
- matchCount++;
65
- index++;
66
- if (index === simplifiedWord.length)
67
- break;
68
- }
69
- }
70
- const score = matchCount / simplifiedWord.length;
71
- return score >= this.fuzzyToleranceLevel;
72
- }
73
- evaluateSeverity(word, text) {
74
- if (this.wordBoundaries && this.getRegex(word).test(text)) {
75
- return SeverityLevel.Exact;
76
- }
77
- if (this.getRegex(word).test(text))
78
- return SeverityLevel.Exact;
79
- if (this.isFuzzyToleranceMatch(word, text))
80
- return SeverityLevel.Fuzzy;
81
- return undefined;
82
- }
83
- isProfane(value) {
84
- let input = this.allowObfuscatedMatch
85
- ? this.normalizeObfuscated(value)
86
- : value;
87
- for (const word of this.words.keys()) {
88
- if (!this.ignoreWords.has(word.toLowerCase()) &&
89
- this.evaluateSeverity(word, input) !== undefined) {
90
- return true;
91
- }
92
- }
93
- return false;
94
- }
95
- matches(word) {
96
- return this.isProfane(word);
97
- }
98
- checkProfanity(text) {
99
- let input = this.allowObfuscatedMatch
100
- ? this.normalizeObfuscated(text)
101
- : text;
102
- input = input.toLowerCase();
103
- const profaneWords = [];
104
- const severityMap = {};
105
- for (const dictWord of this.words.keys()) {
106
- if (this.ignoreWords.has(dictWord.toLowerCase()))
107
- continue;
108
- const severity = this.evaluateSeverity(dictWord, input);
109
- if (severity !== undefined) {
110
- const regex = this.getRegex(dictWord);
111
- let match;
112
- while ((match = regex.exec(input)) !== null) {
113
- profaneWords.push(match[0]);
114
- if (severityMap[match[0]] === undefined) {
115
- severityMap[match[0]] = severity;
116
- }
117
- }
118
- }
119
- }
120
- if (profaneWords.length > 0) {
121
- this.debugLog('Detected:', profaneWords);
122
- }
123
- let processedText = text;
124
- if (this.replaceWith && profaneWords.length > 0) {
125
- const uniqueWords = Array.from(new Set(profaneWords));
126
- for (const word of uniqueWords) {
127
- const escaped = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
128
- const replacementRegex = this.wordBoundaries
129
- ? new RegExp(`\\b${escaped}\\b`, 'gi')
130
- : new RegExp(escaped, 'gi');
131
- processedText = processedText.replace(replacementRegex, this.replaceWith);
132
- }
133
- }
134
- return {
135
- containsProfanity: profaneWords.length > 0,
136
- profaneWords: Array.from(new Set(profaneWords)),
137
- processedText: this.replaceWith ? processedText : undefined,
138
- severityMap: this.severityLevels && Object.keys(severityMap).length > 0
139
- ? severityMap
140
- : undefined,
141
- };
142
- }
143
- checkProfanityWithMinSeverity(text, minSeverity = SeverityLevel.Exact) {
144
- const result = this.checkProfanity(text);
145
- const filteredWords = result.severityMap && result.profaneWords.length > 0
146
- ? result.profaneWords.filter((word) => {
147
- var _a;
148
- const severity = (_a = result.severityMap) === null || _a === void 0 ? void 0 : _a[word];
149
- return typeof severity === 'number' && severity >= minSeverity;
150
- })
151
- : [];
152
- return { filteredWords, result };
153
- }
154
- }
155
- export { Filter };
156
- //# 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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"}
@@ -1,34 +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 declare const useProfanityChecker: (config?: ProfanityCheckerConfig) => {
17
- result: CheckProfanityResult;
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
- };
30
- checkTextAsync: (text: string) => Promise<CheckProfanityResult>;
31
- reset: () => void;
32
- isDirty: boolean;
33
- isWordProfane: (word: string) => boolean;
34
- };
@@ -1,61 +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 { useMemo, useState } from 'react';
11
- import { Filter } from '../filters/Filter';
12
- import globalWhitelistData from '../data/globalWhitelist.json';
13
- export const useProfanityChecker = (config) => {
14
- var _a;
15
- const [result, setResult] = useState(null);
16
- const filterConfig = useMemo(() => {
17
- var _a;
18
- 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 });
19
- if (effective.allowObfuscatedMatch && effective.wordBoundaries) {
20
- console.warn('[Glin-Profanity] Obfuscated match enabled → wordBoundaries will be ignored internally.');
21
- }
22
- return effective;
23
- }, [config]);
24
- const filter = useMemo(() => new Filter(filterConfig), [filterConfig]);
25
- const checkText = (text) => {
26
- var _a;
27
- const checkResult = filter.checkProfanity(text);
28
- // Filter based on minSeverity (if provided)
29
- const filteredWords = (config === null || config === void 0 ? void 0 : config.minSeverity) && checkResult.severityMap
30
- ? checkResult.profaneWords.filter((word) => checkResult.severityMap &&
31
- checkResult.severityMap[word] >= config.minSeverity)
32
- : checkResult.profaneWords;
33
- // Optional auto-replace
34
- const autoReplaced = (config === null || config === void 0 ? void 0 : config.autoReplace) && checkResult.processedText
35
- ? checkResult.processedText
36
- : text;
37
- setResult(checkResult);
38
- (_a = config === null || config === void 0 ? void 0 : config.customActions) === null || _a === void 0 ? void 0 : _a.call(config, checkResult);
39
- return Object.assign(Object.assign({}, checkResult), { filteredWords,
40
- autoReplaced });
41
- };
42
- const checkTextAsync = (text) => __awaiter(void 0, void 0, void 0, function* () {
43
- return new Promise((resolve) => {
44
- const checkResult = checkText(text); // sync call
45
- resolve(checkResult);
46
- });
47
- });
48
- const isWordProfane = (word) => {
49
- return filter.checkProfanity(word).containsProfanity;
50
- };
51
- const reset = () => setResult(null);
52
- return {
53
- result,
54
- checkText,
55
- checkTextAsync,
56
- reset,
57
- isDirty: (_a = result === null || result === void 0 ? void 0 : result.containsProfanity) !== null && _a !== void 0 ? _a : false,
58
- isWordProfane,
59
- };
60
- };
61
- //# sourceMappingURL=useProfanityChecker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useProfanityChecker.js","sourceRoot":"","sources":["../../../src/hooks/useProfanityChecker.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAgB,MAAM,mBAAmB,CAAC;AAEzD,OAAO,mBAAmB,MAAM,8BAA8B,CAAC;AAiB/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA+B,EAAE,EAAE;;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA8B,IAAI,CAAC,CAAC;IAExE,MAAM,YAAY,GAAiB,OAAO,CAAC,GAAG,EAAE;;QAC9C,MAAM,SAAS,mCACV,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,KACjB,WAAW,EAAE,mBAAmB,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,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,MAAM,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"}
@@ -1,4 +0,0 @@
1
- export { Filter } from './filters/Filter';
2
- export { useProfanityChecker } from './hooks/useProfanityChecker';
3
- export { SeverityLevel } from './types/types';
4
- export type { Language, CheckProfanityResult } from './types/types';
package/lib/esm/index.js DELETED
@@ -1,4 +0,0 @@
1
- export { Filter } from './filters/Filter';
2
- export { useProfanityChecker } from './hooks/useProfanityChecker';
3
- export { SeverityLevel } from './types/types';
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
@@ -1,21 +0,0 @@
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
- }
11
- export interface CheckProfanityResult {
12
- containsProfanity: boolean;
13
- profaneWords: string[];
14
- processedText?: string;
15
- severityMap?: Record<string, SeverityLevel>;
16
- matchContexts?: {
17
- word: string;
18
- context: string;
19
- }[];
20
- }
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,8 +0,0 @@
1
- // src/types/types.ts
2
- export var SeverityLevel;
3
- (function (SeverityLevel) {
4
- SeverityLevel[SeverityLevel["Exact"] = 1] = "Exact";
5
- SeverityLevel[SeverityLevel["Fuzzy"] = 2] = "Fuzzy";
6
- SeverityLevel[SeverityLevel["Merged"] = 3] = "Merged";
7
- })(SeverityLevel || (SeverityLevel = {}));
8
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types/types.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,mDAAS,CAAA;IACT,mDAAS,CAAA;IACT,qDAAU,CAAA;AACZ,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}