laravel-topic-normalizer maintained by jeffersongoncalves
Description
A tiny Laravel helper that merges raw topic/keyword lists (GitHub topics, composer.json + package.json keywords, Packagist keywords, …) into one slugged, deduplicated, length-filtered and capped list.
Author
Last update
2026/08/16 18:41
(dev-master)
License
Downloads
56

Laravel Topic Normalizer
Merge raw topic / keyword lists from several sources — GitHub topics, composer.json + package.json keywords, Packagist keywords — into one clean list: slugged, deduplicated, length-filtered and capped.
Installation
composer require jeffersongoncalves/laravel-topic-normalizer
Usage
use JeffersonGoncalves\TopicNormalizer\TopicNormalizer;
$topics = TopicNormalizer::normalize(
$repo['topics'] ?? [], // GitHub topics
$composer['keywords'] ?? [], // composer.json
$packageJson['keywords'] ?? [], // package.json
);
// => ['laravel', 'filament', 'php-package', …] (slugged, unique, max 20)
Pass any number of lists. Non-strings are skipped; values are Str::slug()-ed, empties and out-of-range slugs dropped, duplicates removed (first occurrence wins, order preserved), and the result capped.
Per-call overrides
The config defaults can be overridden per call with named arguments (each falls back to its config value):
$topics = TopicNormalizer::normalize(
$repo['topics'] ?? [],
$composer['keywords'] ?? [],
max: 10, // cap this call at 10
maxLength: 30, // drop slugs longer than 30 chars
minLength: 2, // drop single-character noise
);
max_length / min_length are accepted as snake_case aliases. A max of 0 (or less) returns an empty list.
Configuration
php artisan vendor:publish --tag="topic-normalizer-config"
| Key | Default | Description |
|---|---|---|
max |
20 |
Maximum number of topics returned (0 or less returns nothing). |
max_length |
50 |
Slugs longer than this are dropped as junk. |
min_length |
0 |
Slugs shorter than this are dropped as junk (0 disables the check). |
Testing
composer test
License
The MIT License (MIT). Please see License File for more information.