From 367d29ecdf8aedda7a826fabf98a67dd07e64baa Mon Sep 17 00:00:00 2001 From: Jay Herron Date: Fri, 11 Sep 2026 10:51:07 -0600 Subject: [PATCH] fix: Build plugin detects changes to SDL `.graphql` and `.gql` files Previously, changing an SDL file would not trigger a re-generation by the build plugin, which meant that the Swift protocols and the SDL could drift over cached builds. --- Plugins/GraphQLGeneratorPlugin.swift | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Plugins/GraphQLGeneratorPlugin.swift b/Plugins/GraphQLGeneratorPlugin.swift index fc80dcb..6d31c0c 100644 --- a/Plugins/GraphQLGeneratorPlugin.swift +++ b/Plugins/GraphQLGeneratorPlugin.swift @@ -38,7 +38,7 @@ struct GraphQLGeneratorPlugin: BuildToolPlugin { arguments += ["--config", configURL.path] } - let inputFiles: [URL] = configFile.map { [$0] } ?? [] + let inputFiles = commandInputFiles(in: target.sourceFiles, configFile: configFile) return [ .buildCommand( @@ -57,6 +57,9 @@ struct GraphQLGeneratorPlugin: BuildToolPlugin { "graphql-generator-config.yml", ] + /// File extensions recognized as GraphQL schema files. + private static let schemaExtensions: Set = ["graphql", "gql"] + /// Finds the generator config file in the target's source files, if present. private func findConfigFile(in sourceFiles: FileList) -> URL? { let configs = sourceFiles.map(\.url).filter { @@ -64,6 +67,14 @@ struct GraphQLGeneratorPlugin: BuildToolPlugin { } return configs.first } + + /// Returns all files whose contents can affect generated output. + private func commandInputFiles(in sourceFiles: FileList, configFile: URL?) -> [URL] { + let schemaFiles = sourceFiles.map(\.url).filter { + Self.schemaExtensions.contains($0.pathExtension.lowercased()) + } + return (configFile.map { [$0] } ?? []) + schemaFiles + } } #if canImport(XcodeProjectPlugin) @@ -106,7 +117,10 @@ struct GraphQLGeneratorPlugin: BuildToolPlugin { arguments += ["--config", configURL.path] } - let inputFiles: [URL] = configFile.map { [$0] } ?? [] + let inputFiles = commandInputFiles( + in: target.inputFiles, + configFile: configFile + ) return [ .buildCommand(