diff --git a/src/Drush/Generators/SchemaExtensionGenerator.php b/src/Drush/Generators/SchemaExtensionGenerator.php new file mode 100644 index 0000000000000000000000000000000000000000..d4f83cb2530472640df5d94a766c7ad992e0ee04 --- /dev/null +++ b/src/Drush/Generators/SchemaExtensionGenerator.php @@ -0,0 +1,56 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\graphql\Drush\Generators; + +use Drupal\graphql\Plugin\SchemaPluginManager; +use DrupalCodeGenerator\Asset\AssetCollection; +use DrupalCodeGenerator\Attribute\Generator; +use DrupalCodeGenerator\Command\BaseGenerator; +use DrupalCodeGenerator\GeneratorType; +use Drush\Commands\AutowireTrait; +use Symfony\Component\DependencyInjection\Attribute\Autowire; + +/** + * Generator for GraphQL schema extension plugins. + */ +#[Generator( + name: 'plugin:graphql-schema-extension', + description: 'Generates a GraphQL schema extension plugin.', + aliases: ['graphql-schema-extension'], + templatePath: __DIR__, + type: GeneratorType::MODULE_COMPONENT, +)] +final class SchemaExtensionGenerator extends BaseGenerator { + + use AutowireTrait; + + public function __construct( + #[Autowire(service: 'plugin.manager.graphql.schema')] + protected SchemaPluginManager $schemaPluginManager, + ) { + parent::__construct(); + } + + /** + * {@inheritdoc} + */ + protected function generate(array &$vars, AssetCollection $assets): void { + $ir = $this->createInterviewer($vars); + + $vars['machine_name'] = $ir->askMachineName(); + + $vars['plugin_label'] = $ir->askPluginLabel(); + $vars['plugin_id'] = $ir->askPluginId(); + $vars['plugin_description'] = $ir->ask('Description'); + $vars['class'] = $ir->askPluginClass(suffix: 'Extension'); + $vars['services'] = $ir->askServices(FALSE); + + $schemas = array_map(fn ($definition) => $definition['name'] ?? $definition['id'], $this->schemaPluginManager->getDefinitions()); + $vars['schema'] = $ir->choice('Schema', $schemas); + + $assets->addFile('src/Plugin/GraphQL/SchemaExtension/{class}.php', 'schema-extension.twig'); + } + +} diff --git a/src/Drush/Generators/schema-extension.twig b/src/Drush/Generators/schema-extension.twig new file mode 100644 index 0000000000000000000000000000000000000000..07601dd0e4fa12df3e2883cceb6fcd9b1ef7c80b --- /dev/null +++ b/src/Drush/Generators/schema-extension.twig @@ -0,0 +1,64 @@ +{% import '@lib/di.twig' as di %} +<?php + +declare(strict_types=1); + +namespace Drupal\{{ machine_name }}\Plugin\GraphQL\SchemaExtension; + +{% apply sort_namespaces %} +use Drupal\graphql\GraphQL\ResolverBuilder; +use Drupal\graphql\GraphQL\ResolverRegistryInterface; +use Drupal\graphql\Plugin\GraphQL\SchemaExtension\SdlSchemaExtensionPluginBase; + {% if services %} +{{ di.use(services) }} +use Drupal\Core\Plugin\ContainerFactoryPluginInterface; +use Symfony\Component\DependencyInjection\ContainerInterface; + {% endif %} +{% endapply %} + +/** + * The '{{ plugin_id }}' schema extension. + * + * @SchemaExtension( + * id = "{{ plugin_id }}", + * name = @Translation("{{ plugin_label }}"), +{% if plugin_description %} * description = @Translation("{{ plugin_description }}"), +{% endif %} + * schema = "{{ schema }}", + * ) + */ +final class {{ class }} extends SdlSchemaExtensionPluginBase { + +{% if services %} + public function __construct( + array $configuration, + $pluginId, + $pluginDefinition, +{{ di.signature(services) }} + ) { + parent::__construct($configuration, $pluginId, $pluginDefinition); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self { + return new self( + $configuration, + $plugin_id, + $plugin_definition, +{{ di.container(services) }} + ); + } + +{% endif %} + /** + * {@inheritdoc} + */ + public function registerResolvers(ResolverRegistryInterface $registry): void { + $builder = new ResolverBuilder(); + + // Register your resolvers here. + } + +}