A Laravel package to export PHP Enums to TypeScript. Simple, type-safe, zero runtime dependencies.
composer require olivermbs/enumshare<?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.
php artisan enums:exportimport { 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' }, ...]↓ Generates ↓
Configure the output mode in config/enumshare.php:
'mode' => 'full', // or 'minimal'Includes labels, meta, lookup maps, type guards, and utility methods.
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];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'],
];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| 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.
For automatic regeneration during development, install Laravel Wayfinder:
composer require laravel/wayfinder
npm install @laravel/vite-plugin-wayfinderThen 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.
composer testMIT

