type->getName()}Input"; } /** * @return InputField[] */ public function fieldClasses(): array { $fields = []; $baseType = $this->type; $fields[] = collect($baseType->fieldClasses()) ->filter(fn (Field $field): bool => $field instanceof BindableField) ->map(fn (Field&BindableField $field): InputField => new InputField($field->getName(), $field->type()->__toString().'!')) ->toArray(); $fields[] = collect($baseType->fieldClasses()) ->filter(fn (Field $field): bool => $field instanceof UpdatableField) // and reportable field? ->map( fn (Field&UpdatableField $field): InputField => new InputField($field->getName(), $field->type().($field instanceof RequiredOnUpdate ? '!' : '')) ) ->toArray(); $fields[] = collect($baseType->relations()) ->mapWithKeys(function (Relation $relation): array { $baseType = $relation->getBaseType(); if (! $baseType instanceof EloquentType) { return []; } return match (true) { $relation instanceof BelongsToRelation => [$relation->getName() => new UpdateBelongsToInput($baseType)], $relation instanceof HasManyRelation => [$relation->getName() => new UpdateHasManyInput($baseType)], $relation instanceof BelongsToManyRelation => [$relation->getName() => new UpdateBelongsToManyInput($relation->getEdgeType()->getPivotType())], default => [], }; }) ->map(fn (Input $input, string $name): InputField => new InputField($name, $input->getName())) ->toArray(); return Arr::flatten($fields); } }