PHP code example of splitstack / laravel-typewriter

1. Go to this page and download the library: Download splitstack/laravel-typewriter library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

splitstack / laravel-typewriter example snippets


use Splitstack\Typewriter\DataPacket;

return inertia('Orders/Index', [
    'orders' => DataPacket::from([
        'data'   => $orders->toArray(),
        'meta'   => ['total' => $orders->total()],
        'source' => 'orders',
    ]),
]);

// app/Domain/Data/OrderData.php
#[TypeScript]
class OrderData extends Data
{
    public function __construct(
        public readonly int $id,
        public readonly string $status,
        public readonly float $total,
    ) {}
}

// app/Domain/Packets/OrderPacket.php
class OrderPacket extends DataPacket
{
    public function __construct(
        public readonly OrderData $data,
        array $meta = [],
        array $defaults = [],
        mixed $default = null,
        string|int|null $source = null,
        string|int|null $target = null,
    ) {
        parent::__construct($data->toArray(), $meta, $defaults, $default, $source, $target);
    }
}

return inertia('Orders/Show', [
    'order' => OrderPacket::from([
        'data'    => OrderData::from($order),
        'defaults'=> ['status' => 'pending'],
        'source'  => OrderSource::Api->value,
        'target'  => OrderTarget::Checkout->value,
    ]),
]);

'sources' => [
    'value_objects' => [
        'directories' => ['Domain/ValueObjects'],
    ],
    'dtos' => [
        'directories' => ['Domain/DTOs', 'Http/Resources'],
    ],
    'packets' => [
        'directories' => ['Domain/Packets', 'Http/Packets'],
        'enums'       => ['Domain/Enums'],  // BackedEnums used as source/target
        'enabled'     => true,
    ],
],

use Spatie\TypeScriptTransformer\Attributes\TypeScript;

#[TypeScript]
class OrderData extends Data { ... }

enum OrderSource: string
{
    case Api = 'api';
    case Admin = 'admin';
}

// config/typewriter.php
return [
    'sources' => [
        'value_objects' => [
            'directories' => ['Domain/ValueObjects'],
            'packets' => [
            'directories' => ['Domain/Packets', 'Http/Packets'],
            'enums'       => ['Domain/Enums'],
            'enabled'     => false,   // opt-in; enable once you have packets
        ],
    ],

    'output' => [
        'value_objects' => null,  // resource_path('js/types/value-objects.ts')
        'dtos'          => null,  // resource_path('js/types/dtos.ts')
        'packets'       => null,  // resource_path('js/types/packets.ts')
        'barrel'        => null,  // resource_path('js/types/index.ts')
    ],

    'ts_asset_path' => null, // resource_path('js/utils/DataPacket.ts')
];
bash
php artisan vendor:publish --tag=typewriter-config
bash
php artisan make:packet OrderPacket --data=OrderData