inner->generate($reflection); if (isset($schema['properties']) && is_array($schema['properties'])) { foreach ($schema['properties'] as $name => $property) { if (is_array($property)) { $schema['properties'][$name] = $this->relaxNode($property); } } } return $schema; } public function generateOutputSchema(Reflector $reflection): ?array { return $this->inner->generateOutputSchema($reflection); } /** * @param array $node * * @return array */ private function relaxNode(array $node): array { if (isset($node['type'])) { $node['type'] = $this->relaxType($node['type']); } // Relax array element types too (stringified IDs inside tagIds, etc.). if (isset($node['items']) && is_array($node['items'])) { $node['items'] = $this->relaxNode($node['items']); } return $node; } /** * Adds "string" to a type definition that allows integer/number/boolean. * * @param string|string[] $type * * @return string|string[] */ private function relaxType(array|string $type): array|string { $types = (array) $type; $isNumericOrBool = in_array('integer', $types, true) || in_array('number', $types, true) || in_array('boolean', $types, true); if ($isNumericOrBool && !in_array('string', $types, true)) { $types[] = 'string'; } return 1 === count($types) ? $types[0] : array_values($types); } }