olivermbs / enumshare
A Laravel package to export PHP Enums to TypeScript with labels, metadata, and type-safe frontend access
Fund package maintenance!
Oliver Smith
Installs: 20
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/olivermbs/enumshare
Requires
- php: ^8.3
- illuminate/console: ^11.0||^12.0
- illuminate/contracts: ^11.0||^12.0
- symfony/finder: ^6.0||^7.0
Requires (Dev)
- larastan/larastan: ^2.9||^3.0
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0.0||^9.5.0||^8.22.0
- pestphp/pest: ^2.0||^3.0
- pestphp/pest-plugin-arch: ^2.5||^3.0
- pestphp/pest-plugin-laravel: ^2.0||^3.0
- phpstan/extension-installer: ^1.3
- phpstan/phpstan-deprecation-rules: ^1.1||^2.0
- phpstan/phpstan-phpunit: ^1.3||^2.0
README
A Laravel package to export PHP Enums to TypeScript. Simple, type-safe, zero runtime dependencies.
Installation
composer require olivermbs/enumshare
Quick Start
1. Create your enum
<?php namespace App\Enums; use Olivermbs\Enumshare\Attributes\Label; use Olivermbs\Enumshare\Attributes\Meta; enum Status: string { #[Label('Active')] #[Meta(['color' => 'green'])] case Active = 'active'; #[Label('Inactive')] #[Meta(['color' => 'red'])] case Inactive = 'inactive'; }
Any PHP enum can be exported - no trait required.
2. Export
php artisan enums:export
3. Use in TypeScript
import { Status } from '@/Enums/Status'; Status.Active.value // 'active' Status.Active.label // 'Active' Status.Active.meta // { color: 'green' } Status.from('active') // Status.Active entry Status.isValid('active') // true Status.options // [{ value: 'active', label: 'Active' }, ...]
Generated Output
↓ Generates ↓
Output Modes
Configure the output mode in config/enumshare.php:
'mode' => 'full', // or 'minimal'
Full (default)
Includes labels, meta, lookup maps, type guards, and utility methods.
Minimal
Simple output - just values and types (~10 lines per enum):
/* eslint-disable */ // Auto-generated from App\Enums\Status export const Status = { Active: 'active', Inactive: 'inactive', } as const; export type Status = typeof Status[keyof typeof Status];
Configuration
php artisan vendor:publish --tag="enumshare-config"
// config/enumshare.php return [ 'enums' => [ App\Enums\Status::class, ], 'path' => resource_path('js/Enums'), 'mode' => 'full', // 'full' or 'minimal' 'auto_discovery' => true, 'auto_paths' => ['app/Enums'], ];
Commands
php artisan enums:export # Export enums php artisan enums:export --force # Rewrite all, even if unchanged php artisan enums:export --list # List enums that would be exported php artisan enums:export --index # Generate barrel index file php artisan enums:export --types # Export TypeScript helper types php artisan enums:export --path=... # Override export path php artisan enums:export --locale=... # Override locale for labels
Attributes
| Attribute | Description |
|---|---|
#[Label('Text')] |
Static label |
#[TranslatedLabel('key')] |
Translation key |
#[Meta(['key' => 'value'])] |
Metadata |
#[ExportMethod] |
Export method result |
Note: Enums are keyed by short name (class basename). Duplicate names across namespaces will cause a collision error.
Auto-Regeneration with Vite
For automatic regeneration during development, install Laravel Wayfinder:
composer require laravel/wayfinder npm install @laravel/vite-plugin-wayfinder
Then configure Vite to watch your enum files:
// vite.config.js import { wayfinder } from '@laravel/vite-plugin-wayfinder'; export default defineConfig({ plugins: [ wayfinder({ command: 'php artisan enums:export --force', patterns: ['app/Enums/**/*.php', 'lang/**/*.php', 'config/enumshare.php'], }), ], });
Note: Wayfinder is optional - only needed for auto-regeneration. You can always run
php artisan enums:exportmanually.
Testing
composer test
License
MIT

