Skip to content

olivermbs/enumshare

Repository files navigation

Enumshare

Latest Version on Packagist Tests

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

PHP Enum

↓ Generates ↓

Generated TypeScript

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:export manually.

Testing

composer test

License

MIT

About

No description, website, or topics provided.

Resources

License

Security policy

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •