Looking to hire Laravel developers? Try LaraJobs

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.
Last update
2026/08/16 18:41 (dev-master)
License
Downloads
56

Comments
comments powered by Disqus

Laravel Topic Normalizer

Laravel Topic Normalizer

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

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.