ChilliCream / graphql-platform

Welcome to the home of the Hot Chocolate GraphQL server for .NET, the Strawberry Shake GraphQL client for .NET and Banana Cake Pop the awesome Monaco based GraphQL IDE.
https://chillicream.com
MIT License
5.26k stars 746 forks source link

StrawberryShake code generation crashes if directive specifies location VARIABLE_DEFINITION #7025

Closed nloum closed 6 months ago

nloum commented 8 months ago

Product

Strawberry Shake

Version

13.9.0 and also 14.0.0-p.80

Link to minimal reproduction

https://github.com/nloum/Repro-StrawberryShakeVariableDefinitionLocation

Steps to reproduce

Add a directive to your schema like this:

directive @aRandomDirective on VARIABLE_DEFINITION

The important part is specifying VARIABLE_DEFINITION.

What is expected?

The project should compile successfully.

What is actually happening?

The project fails to compile

Relevant log output

PS C:\src\Repro-StrawberryShakeVariableDefinitionLocation> dotnet build
MSBuild version 17.9.6+a4ecab324 for .NET
  Determining projects to restore...
  Restored C:\src\Repro-StrawberryShakeVariableDefinitionLocation\Repro-StrawberryShakeVariableDefinitionLocation.csproj (in 273 ms).
  Generate C# Clients started.
  Generate MyAppClient started.
  Generate MyAppClient completed in 76 ms
  Generate C# Clients completed in 182 ms
  Unhandled exception. System.AggregateException: One or more errors occurred. (The specified location `VARIABLE_DEFINITION` is not supported.)
   ---> System.NotSupportedException: The specified location `VARIABLE_DEFINITION` is not supported.
     at HotChocolate.Types.Factories.DirectiveTypeFactory.MapDirectiveLocation(DirectiveLocation location) in /home/runner/work/graphql-platform/graphql-platfor 
  m/src/HotChocolate/Core/src/Types/Types/Factories/DirectiveTypeFactory.cs:line 164
     at HotChocolate.Types.Factories.DirectiveTypeFactory.DeclareLocations(DirectiveTypeDefinition parent, DirectiveDefinitionNode node) in /home/runner/work/gr 
  aphql-platform/graphql-platform/src/HotChocolate/Core/src/Types/Types/Factories/DirectiveTypeFactory.cs:line 154
     at HotChocolate.Types.Factories.DirectiveTypeFactory.Create(IDescriptorContext context, DirectiveDefinitionNode node) in /home/runner/work/graphql-platform 
  /graphql-platform/src/HotChocolate/Core/src/Types/Types/Factories/DirectiveTypeFactory.cs:line 112
     at HotChocolate.Types.Factories.SchemaSyntaxVisitor.VisitChildren(DirectiveDefinitionNode node, SchemaSyntaxVisitorContext context) in /home/runner/work/gr 
  aphql-platform/graphql-platform/src/HotChocolate/Core/src/Types/Types/Factories/SchemaSyntaxVisitor.cs:line 161
     at HotChocolate.Language.Visitors.SyntaxVisitor`1.VisitChildren(ISyntaxNode node, TContext context) in /home/runner/work/graphql-platform/graphql-platform/ 
  src/HotChocolate/Language/src/Language.Visitors/SyntaxVisitor~1.VisitationMap.cs:line 78
     at HotChocolate.Language.Visitors.SyntaxVisitor`1.Visit[TNode,TParent](TNode node, TParent parent, TContext context) in /home/runner/work/graphql-platform/ 
  graphql-platform/src/HotChocolate/Language/src/Language.Visitors/SyntaxVisitor~1.cs:line 76
     at HotChocolate.Language.Visitors.SyntaxVisitor`1.VisitChildren(DocumentNode node, TContext context) in /home/runner/work/graphql-platform/graphql-platform 
  /src/HotChocolate/Language/src/Language.Visitors/SyntaxVisitor~1.VisitationMap.cs:line 107
     at HotChocolate.Language.Visitors.SyntaxVisitor`1.VisitChildren(ISyntaxNode node, TContext context) in /home/runner/work/graphql-platform/graphql-platform/ 
  src/HotChocolate/Language/src/Language.Visitors/SyntaxVisitor~1.VisitationMap.cs:line 40
     at HotChocolate.Language.Visitors.SyntaxVisitor`1.Visit[TNode,TParent](TNode node, TParent parent, TContext context) in /home/runner/work/graphql-platform/ 
  graphql-platform/src/HotChocolate/Language/src/Language.Visitors/SyntaxVisitor~1.cs:line 76
     at HotChocolate.Language.Visitors.SyntaxVisitor`1.Visit(ISyntaxNode node, TContext context) in /home/runner/work/graphql-platform/graphql-platform/src/HotC 
  hocolate/Language/src/Language.Visitors/SyntaxVisitor~1.cs:line 61
     at HotChocolate.SchemaBuilder.Setup.ParseDocuments(SchemaBuilder builder, IDescriptorContext context) in /home/runner/work/graphql-platform/graphql-platfor 
  m/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs:line 143
     at HotChocolate.SchemaBuilder.Setup.CreateTypeReferences(SchemaBuilder builder, IDescriptorContext context) in /home/runner/work/graphql-platform/graphql-p 
  latform/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs:line 116
     at HotChocolate.SchemaBuilder.Setup.Create(SchemaBuilder builder, LazySchema lazySchema, IDescriptorContext context) in /home/runner/work/graphql-platform/ 
  graphql-platform/src/HotChocolate/Core/src/Types/SchemaBuilder.Setup.cs:line 68
     at HotChocolate.SchemaBuilder.Setup.Create(SchemaBuilder builder) in /home/runner/work/graphql-platform/graphql-platform/src/HotChocolate/Core/src/Types/Sc 
  hemaBuilder.Setup.cs:line 28
     at HotChocolate.SchemaBuilder.Create() in /home/runner/work/graphql-platform/graphql-platform/src/HotChocolate/Core/src/Types/SchemaBuilder.Create.cs:line  
  10
     at HotChocolate.SchemaBuilder.HotChocolate.ISchemaBuilder.Create() in /home/runner/work/graphql-platform/graphql-platform/src/HotChocolate/Core/src/Types/S 
  chemaBuilder.Create.cs:line 29
     at StrawberryShake.CodeGeneration.Utilities.SchemaHelper.Load(IReadOnlyCollection`1 schemaFiles, Boolean strictValidation, Boolean noStore) in /home/runner 
  /work/graphql-platform/graphql-platform/src/StrawberryShake/CodeGeneration/src/CodeGeneration/Utilities/SchemaHelper.cs:line 92
     at StrawberryShake.CodeGeneration.CSharp.CSharpGenerator.TryCreateSchema(IReadOnlyList`1 files, Dictionary`2 fileLookup, ICollection`1 errors, Boolean stri 
  ctValidation, Boolean noStore, ISchema& schema) in /home/runner/work/graphql-platform/graphql-platform/src/StrawberryShake/CodeGeneration/src/CodeGeneration.C 
  Sharp/CSharpGenerator.cs:line 424
     at StrawberryShake.CodeGeneration.CSharp.CSharpGenerator.GenerateAsync(IEnumerable`1 fileNames, CSharpGeneratorSettings settings) in /home/runner/work/grap 
  hql-platform/graphql-platform/src/StrawberryShake/CodeGeneration/src/CodeGeneration.CSharp/CSharpGenerator.cs:line 101
     --- End of inner exception stack trace ---
     at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
     at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
     at StrawberryShake.Tools.GenerateCommand.GenerateCommandHandler.GenerateClient(String clientName, String[] documents, CSharpGeneratorSettings settings) in  
  /home/runner/work/graphql-platform/graphql-platform/src/StrawberryShake/Tooling/src/dotnet-graphql/GenerateCommand.cs:line 164
     at StrawberryShake.Tools.GenerateCommand.GenerateCommandHandler.ExecuteAsync(GenerateCommandArguments args, CancellationToken cancellationToken) in /home/r 
  unner/work/graphql-platform/graphql-platform/src/StrawberryShake/Tooling/src/dotnet-graphql/GenerateCommand.cs:line 124
     at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync(String[] args, CancellationToken cancellationToken)
     at StrawberryShake.Tools.Program.<Main>(String[] args)
C:\Users\nloum\.nuget\packages\strawberryshake.server\13.9.0\build\StrawberryShake.Server.targets(83,5): error MSB3073: The command "dotnet "C:\User
s\nloum\.nuget\packages\strawberryshake.server\13.9.0\build\..\tools\net8\dotnet-graphql.dll" generate "C:\src\Repro-StrawberryShakeVariableDefiniti
onLocation" -o "C:\src\Repro-StrawberryShakeVariableDefinitionLocation\obj\Debug\net8.0\berry" -n Repro_StrawberryShakeVariableDefinitionLocation -a md5 -t" exi 
ted with code -532462766. [C:\src\Repro-StrawberryShakeVariableDefinitionLocation\Repro-StrawberryShakeVariableDefinitionLocation.csproj]

Build FAILED.

C:\Users\nloum\.nuget\packages\strawberryshake.server\13.9.0\build\StrawberryShake.Server.targets(83,5): error MSB3073: The command "dotnet "C:\User
s\nloum\.nuget\packages\strawberryshake.server\13.9.0\build\..\tools\net8\dotnet-graphql.dll" generate "C:\src\Repro-StrawberryShakeVariableDefiniti
onLocation" -o "C:\src\Repro-StrawberryShakeVariableDefinitionLocation\obj\Debug\net8.0\berry" -n Repro_StrawberryShakeVariableDefinitionLocation -a md5 -t" exi
ted with code -532462766. [C:\src\Repro-StrawberryShakeVariableDefinitionLocation\Repro-StrawberryShakeVariableDefinitionLocation.csproj]
    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:02.60

Workload updates are available. Run `dotnet workload list` for more information.
PS C:\src\Repro-StrawberryShakeVariableDefinitionLocation>

Additional context

Directives with VARIABLE_DEFINITION as their location can be generated by a HotChocolate server, so I would expect StrawberryShake to support that. Also, the schema parses successfully when using HotChocolate.Language.Utf8GraphQLParser.

The reason I'm using this custom directive is because I'm doing automated analysis my GraphQL queries, so I don't want StrawberryShake's generated code to be different based on my custom directive.

glen-84 commented 6 months ago

Fixed in #7134. The fix should be available in the next 13.x release.