{"_id":"@azamani/badwords-filter","name":"@azamani/badwords-filter","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"@azamani/badwords-filter","version":"2.0.0","description":"A powerful multi-language profanity filter for JavaScript/Node.js. Filter bad words in 9 languages with customizable options.","main":"index.js","types":"index.d.ts","scripts":{"test":"node test.js"},"keywords":["badwords","filter","profanity","profanity-filter","content-filter","censorship","moderation","english","french","arabic","darija","spanish","dutch","hindi","italian","japanese","multilingual"],"author":{"name":"azamani"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/azamani/badwords-filter.git"},"engines":{"node":">=14.0.0"},"bugs":{"url":"https://github.com/azamani/badwords-filter/issues"},"homepage":"https://github.com/azamani/badwords-filter#readme","_id":"@azamani/badwords-filter@2.0.0","_nodeVersion":"18.16.1","_npmVersion":"9.5.1","dist":{"integrity":"sha512-HexZ4NvZ7e+iptxaks5uN+H8qe6mo1Uc5UgL1lDBSc2zg+KhRSB5Lx4OgJkcfqIDY9W87bxDNhey05d5odoGFQ==","shasum":"f76489542659b9feae2db3aababee9da99639790","tarball":"https://registry.npmjs.org/@azamani/badwords-filter/-/badwords-filter-2.0.0.tgz","fileCount":13,"unpackedSize":49998,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC2mERoaC78C8aXXfcNz5WtPUhbrFTb6tTEmf1H6rWQqwIgZeo/AQciTADAUg/tWeejQodbhg21mZ8sc4BwZ2r2yYg="}]},"_npmUser":{"name":"azamani","email":"zmi.amn@gmail.com"},"directories":{},"maintainers":[{"name":"azamani","email":"zmi.amn@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/badwords-filter_2.0.0_1767621749268_0.13662774614229423"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-05T14:02:29.162Z","2.0.0":"2026-01-05T14:02:29.408Z","modified":"2026-01-05T14:02:29.704Z"},"maintainers":[{"name":"azamani","email":"zmi.amn@gmail.com"}],"description":"A powerful multi-language profanity filter for JavaScript/Node.js. Filter bad words in 9 languages with customizable options.","homepage":"https://github.com/azamani/badwords-filter#readme","keywords":["badwords","filter","profanity","profanity-filter","content-filter","censorship","moderation","english","french","arabic","darija","spanish","dutch","hindi","italian","japanese","multilingual"],"repository":{"type":"git","url":"git+https://github.com/azamani/badwords-filter.git"},"author":{"name":"azamani"},"bugs":{"url":"https://github.com/azamani/badwords-filter/issues"},"license":"MIT","readme":"# Bad Words Filter\r\n\r\nA powerful, multi-language profanity filter library for JavaScript/Node.js. Filter bad words in 9 languages with highly customizable options.\r\n\r\n[![npm version](https://badge.fury.io/js/badwords-filter.svg)](https://badge.fury.io/js/badwords-filter)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\n## Features\r\n\r\n- **9 Built-in Languages**: English, French, Arabic, Darija (Moroccan Arabic), Spanish, Dutch, Hindi, Italian, Japanese\r\n- **Highly Customizable**: Enable/disable filter, custom placeholders, whitelist words, custom word lists\r\n- **Method Chaining**: Fluent API for easy configuration\r\n- **TypeScript Support**: Full type definitions included\r\n- **Zero Dependencies**: Lightweight and fast\r\n- **Case Insensitive**: Matches words regardless of case\r\n- **Smart Word Boundaries**: Proper handling for different scripts (Latin, Arabic, CJK)\r\n- **Save Original**: Optionally save original text before filtering\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install badwords-filter\r\n```\r\n\r\n## Quick Start\r\n\r\n```javascript\r\nconst BadWordsFilter = require('badwords-filter');\r\n\r\n// Create filter with default English language\r\nconst filter = new BadWordsFilter();\r\n\r\n// Filter text\r\nconst result = filter.clean('This is some fuck text.');\r\nconsole.log(result); // This is some **** text.\r\n\r\n// Check if text contains bad words\r\nif (filter.isProfane('Some text to check')) {\r\n  console.log('Bad words detected!');\r\n}\r\n```\r\n\r\n## Supported Languages\r\n\r\n| Language | Code | Script | Word Count |\r\n|----------|------|--------|------------|\r\n| English | `english` | Latin | 78+ words |\r\n| French | `french` | Latin | 90+ words |\r\n| Arabic | `arabic` | Arabic | 37+ words |\r\n| Darija | `darija` | Arabic | 37+ words |\r\n| Spanish | `spanish` | Latin | 68+ words |\r\n| Dutch | `dutch` | Latin | 180+ words |\r\n| Hindi | `hindi` | Latin (romanized) | 95+ words |\r\n| Italian | `italian` | Latin | 175+ words |\r\n| Japanese | `japanese` | Japanese | 180+ words |\r\n\r\n## Configuration Options\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter({\r\n  enabled: true,           // Enable/disable the filter (default: true)\r\n  saveOriginal: false,     // Save original text (default: false)\r\n  placeHolder: '*',        // Replacement character (default: '*')\r\n  replaceRegex: null,      // Custom regex for replacement\r\n  separatorRegex: /\\s+/,   // Regex to split words\r\n  excludeWords: [],        // Words to whitelist (ignore)\r\n  wordsList: [],           // Custom word list (overrides default)\r\n  language: 'english'      // Default language (default: 'english')\r\n});\r\n```\r\n\r\n## Usage Examples\r\n\r\n### Basic Filtering\r\n\r\n```javascript\r\nconst BadWordsFilter = require('badwords-filter');\r\n\r\n// Default English filter\r\nconst filter = new BadWordsFilter();\r\nconsole.log(filter.clean('This is shit!'));\r\n// Output: This is ****!\r\n\r\n// With custom placeholder\r\nconst filter2 = new BadWordsFilter({ placeHolder: '#' });\r\nconsole.log(filter2.clean('This is shit!'));\r\n// Output: This is ####!\r\n```\r\n\r\n### Enable/Disable Filter\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter({ enabled: false });\r\nconsole.log(filter.clean('fuck this')); // fuck this (not filtered)\r\n\r\nfilter.setEnabled(true);\r\nconsole.log(filter.clean('fuck this')); // **** this (filtered)\r\n```\r\n\r\n### Save Original Text\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter({ saveOriginal: true });\r\nconst cleaned = filter.clean('This is fuck bad');\r\nconsole.log(cleaned);              // This is **** bad\r\nconsole.log(filter.getOriginal()); // This is fuck bad\r\n```\r\n\r\n### Whitelist Words (excludeWords)\r\n\r\n```javascript\r\n// Exclude specific words from filtering\r\nconst filter = new BadWordsFilter({\r\n  excludeWords: ['damn', 'hell']\r\n});\r\n\r\nconsole.log(filter.isProfane('damn'));  // false (whitelisted)\r\nconsole.log(filter.isProfane('fuck'));  // true (not whitelisted)\r\n\r\n// Add more words to whitelist\r\nfilter.addExcludeWords(['ass']);\r\n```\r\n\r\n### Custom Word List (wordsList)\r\n\r\n```javascript\r\n// Override default dictionary completely\r\nconst filter = new BadWordsFilter({\r\n  wordsList: ['badword1', 'badword2', 'customword']\r\n});\r\n\r\nconsole.log(filter.isProfane('fuck'));      // false (not in custom list)\r\nconsole.log(filter.isProfane('badword1'));  // true (in custom list)\r\n\r\n// Or set it later\r\nfilter.setWordsList(['new1', 'new2']);\r\n```\r\n\r\n### Multiple Languages\r\n\r\n```javascript\r\n// Set language in constructor\r\nconst filter = new BadWordsFilter({ language: 'french' });\r\nconsole.log(filter.isProfane('merde')); // true\r\n\r\n// Or change language dynamically\r\nfilter.setLanguage('spanish');\r\nconsole.log(filter.isProfane('mierda')); // true\r\n\r\n// Load additional languages\r\nfilter.loadLanguage('italian');\r\nfilter.loadLanguage('dutch');\r\n\r\n// Load all languages at once\r\nfilter.loadAllLanguages();\r\n\r\n// Filter against multiple languages\r\nconst result = filter.clean('fuck merde mierda', ['english', 'french', 'spanish']);\r\n```\r\n\r\n### Detecting Bad Words\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter();\r\n\r\n// Simple check\r\nif (filter.isProfane('This has fuck in it')) {\r\n  console.log('Contains profanity!');\r\n}\r\n\r\n// Alias method\r\nfilter.hasBadWords('fuck'); // true\r\n\r\n// Find all bad words with details\r\nconst matches = filter.detect('fuck this shit');\r\nconsole.log(matches);\r\n// Output: [\r\n//   { word: 'fuck', language: 'english', index: 0 },\r\n//   { word: 'shit', language: 'english', index: 10 }\r\n// ]\r\n```\r\n\r\n### Adding/Removing Words\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter();\r\n\r\n// Add custom words to current language\r\nfilter.addWords(['customword', 'anotherword']);\r\n\r\n// Add to specific language\r\nfilter.addWords(['palabra'], 'spanish');\r\n\r\n// Remove words from filter\r\nfilter.removeWords(['damn', 'hell']);\r\nfilter.removeWords(['merde'], 'french');\r\n```\r\n\r\n### Method Chaining\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter()\r\n  .setLanguage('english')\r\n  .loadLanguage('french')\r\n  .loadLanguage('spanish')\r\n  .setPlaceHolder('#')\r\n  .addWords(['customword'])\r\n  .setExcludeWords(['damn'])\r\n  .setEnabled(true);\r\n\r\nconst result = filter.clean('This has customword and damn');\r\n// Output: This has ########## and damn\r\n```\r\n\r\n### Get Information\r\n\r\n```javascript\r\nconst filter = new BadWordsFilter().loadAllLanguages();\r\n\r\n// Get loaded languages\r\nconsole.log(filter.getLanguages());\r\n// Output: ['english', 'french', 'arabic', ...]\r\n\r\n// Get words for a language\r\nconsole.log(filter.getWords('english').length); // 78+\r\n\r\n// Get supported languages (static method)\r\nconsole.log(BadWordsFilter.getSupportedLanguages());\r\n// Output: ['english', 'french', 'arabic', 'darija', 'spanish', 'dutch', 'hindi', 'italian', 'japanese']\r\n```\r\n\r\n## API Reference\r\n\r\n### Constructor Options\r\n\r\n| Option | Type | Default | Description |\r\n|--------|------|---------|-------------|\r\n| `enabled` | `boolean` | `true` | Enable or disable the filter |\r\n| `saveOriginal` | `boolean` | `false` | Save the original input string |\r\n| `placeHolder` | `string` | `'*'` | Character used to replace profane words |\r\n| `replaceRegex` | `RegExp` | `null` | Custom regex for replacement |\r\n| `separatorRegex` | `RegExp` | `/\\s+/` | Regex to split string into words |\r\n| `excludeWords` | `string[]` | `[]` | Words to ignore (whitelist) |\r\n| `wordsList` | `string[]` | `[]` | Custom words list (overrides default) |\r\n| `language` | `string` | `'english'` | Default language for filtering |\r\n\r\n### Methods\r\n\r\n| Method | Returns | Description |\r\n|--------|---------|-------------|\r\n| `clean(text, languages?)` | `string` | Filter profane words from text |\r\n| `filter(text, languages?)` | `string` | Alias for `clean()` |\r\n| `isProfane(text, languages?)` | `boolean` | Check if text contains profane words |\r\n| `hasBadWords(text, languages?)` | `boolean` | Alias for `isProfane()` |\r\n| `detect(text, languages?)` | `BadWordMatch[]` | Find all profane words with details |\r\n| `loadLanguage(language, filePath?)` | `this` | Load a language's word list |\r\n| `loadAllLanguages()` | `this` | Load all 9 built-in languages |\r\n| `setLanguage(language)` | `this` | Set the default language |\r\n| `setEnabled(state)` | `this` | Enable or disable the filter |\r\n| `setPlaceHolder(char)` | `this` | Set the placeholder character |\r\n| `setExcludeWords(words)` | `this` | Set words to exclude (whitelist) |\r\n| `addExcludeWords(words)` | `this` | Add words to the exclude list |\r\n| `setWordsList(words, language?)` | `this` | Override the word list |\r\n| `addWords(words, language?)` | `this` | Add words to a language's list |\r\n| `removeWords(words, language?)` | `this` | Remove words from a language's list |\r\n| `getOriginal()` | `string\\|null` | Get original text (if saveOriginal enabled) |\r\n| `getLanguages()` | `string[]` | Get list of loaded languages |\r\n| `getWords(language?)` | `string[]` | Get words for a language |\r\n| `static getSupportedLanguages()` | `string[]` | Get all supported language names |\r\n\r\n### Types (TypeScript)\r\n\r\n```typescript\r\ninterface BadWordsFilterOptions {\r\n  enabled?: boolean;\r\n  saveOriginal?: boolean;\r\n  placeHolder?: string;\r\n  replaceRegex?: RegExp;\r\n  separatorRegex?: RegExp;\r\n  excludeWords?: string[];\r\n  wordsList?: string[];\r\n  language?: string;\r\n}\r\n\r\ninterface BadWordMatch {\r\n  word: string;      // The matched word\r\n  language: string;  // Which language matched\r\n  index: number;     // Position in the original text\r\n}\r\n```\r\n\r\n### Legacy Function\r\n\r\nFor backwards compatibility:\r\n\r\n```javascript\r\nconst { filterBadWords } = require('badwords-filter');\r\nconst result = filterBadWords('Some text', 'english', '*');\r\n```\r\n\r\n## TypeScript Support\r\n\r\nFull TypeScript definitions are included:\r\n\r\n```typescript\r\nimport BadWordsFilter, { BadWordMatch, BadWordsFilterOptions } from 'badwords-filter';\r\n\r\nconst options: BadWordsFilterOptions = {\r\n  placeHolder: '#',\r\n  excludeWords: ['damn']\r\n};\r\n\r\nconst filter = new BadWordsFilter(options);\r\n\r\nconst cleaned: string = filter.clean('text');\r\nconst isProfane: boolean = filter.isProfane('text');\r\nconst matches: BadWordMatch[] = filter.detect('text');\r\n```\r\n\r\n## Use Cases\r\n\r\n- **Chat Applications**: Filter user messages in real-time\r\n- **Comment Systems**: Clean user-submitted content\r\n- **Social Media**: Moderate posts and comments\r\n- **Gaming**: Filter player names and chat\r\n- **Forums**: Automatic content moderation\r\n- **Email Systems**: Filter inappropriate content\r\n- **Content Management**: Pre-publish content checking\r\n\r\n## Performance\r\n\r\n- Uses compiled RegExp for fast matching\r\n- Word lists are loaded once and cached\r\n- Zero external dependencies\r\n- Minimal memory footprint\r\n\r\n## Node.js Compatibility\r\n\r\nRequires Node.js 14.0.0 or higher.\r\n\r\n## Contributing\r\n\r\nContributions are welcome! You can:\r\n\r\n1. Add new languages\r\n2. Improve existing word lists\r\n3. Report bugs\r\n4. Suggest features\r\n\r\n## License\r\n\r\nMIT License - see [LICENSE](LICENSE) for details.\r\n\r\n## Changelog\r\n\r\n### v2.0.0\r\n- New class-based API with method chaining\r\n- Added configuration options: `enabled`, `saveOriginal`, `excludeWords`, `wordsList`\r\n- Renamed methods: `clean()`, `isProfane()`, `detect()`\r\n- Added 5 new languages (Spanish, Dutch, Hindi, Italian, Japanese)\r\n- TypeScript definitions included\r\n- Legacy function maintained for backwards compatibility\r\n","readmeFilename":"README.md","_rev":"1-f189092c4836fcadae79c24e902c6482"}