$defaultData * @param array> $rules * @param list $capabilities * @param list $webBehavior * @param array $exportCompatibility * @param array): array> $migrations */ public function __construct( public string $type, public string $category, public string $label, public string $icon, public int $schemaVersion, public array $defaultData, public array $rules, public array $capabilities = [], public array $webBehavior = ['responsive'], public array $exportCompatibility = ['pdf' => 'native', 'scorm' => 'native', 'mp4' => 'static'], public array $migrations = [], ) {} /** @return array */ public function metadata(): array { return [ 'type' => $this->type, 'category' => $this->category, 'label' => $this->label, 'icon' => $this->icon, 'schemaVersion' => $this->schemaVersion, 'defaultData' => $this->defaultData, 'capabilities' => $this->capabilities, 'webBehavior' => $this->webBehavior, 'exportCompatibility' => $this->exportCompatibility, 'latestSchemaVersion' => $this->schemaVersion, ]; } /** @param array $data @return array{version: int, data: array} */ public function migrate(int $fromVersion, array $data): array { $version = $fromVersion; while ($version < $this->schemaVersion) { $migration = $this->migrations[$version] ?? null; if (! $migration) { throw new \LogicException("Missing {$this->type} schema migration from version {$version}."); } $data = $migration($data); $version++; } return ['version' => $version, 'data' => $data]; } }