diff --git a/Examples/HelloWorldServer/Package.resolved b/Examples/HelloWorldServer/Package.resolved index 9cf6507..5c14e4d 100644 --- a/Examples/HelloWorldServer/Package.resolved +++ b/Examples/HelloWorldServer/Package.resolved @@ -6,8 +6,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQL.git", "state" : { - "revision" : "397c0f43a1eb6a401858f896263288375efcf0bd", - "version" : "4.1.0" + "revision" : "a83766b34139a855476166b1dc44d9ae9d8ecff4", + "version" : "4.3.0" } }, { diff --git a/Examples/StarWars/Package.resolved b/Examples/StarWars/Package.resolved index 27931cc..b99e4b9 100644 --- a/Examples/StarWars/Package.resolved +++ b/Examples/StarWars/Package.resolved @@ -33,8 +33,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQL.git", "state" : { - "revision" : "397c0f43a1eb6a401858f896263288375efcf0bd", - "version" : "4.1.0" + "revision" : "a83766b34139a855476166b1dc44d9ae9d8ecff4", + "version" : "4.3.0" } }, { diff --git a/Package.resolved b/Package.resolved index ac47c68..5499771 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,13 +1,13 @@ { - "originHash" : "5cf7598aebac7232928647b5e11c512efafa656536195387ff0cfdf963d3921c", + "originHash" : "66b7f6278d702f64d00bafe865c19ca50c6e21d21160020fbb7ff28d84530008", "pins" : [ { "identity" : "graphql", "kind" : "remoteSourceControl", "location" : "https://github.com/GraphQLSwift/GraphQL.git", "state" : { - "revision" : "397c0f43a1eb6a401858f896263288375efcf0bd", - "version" : "4.1.0" + "revision" : "a83766b34139a855476166b1dc44d9ae9d8ecff4", + "version" : "4.3.0" } }, { diff --git a/Package.swift b/Package.swift index a3d688c..d5ac1ee 100644 --- a/Package.swift +++ b/Package.swift @@ -26,7 +26,7 @@ let package = Package( ), ], dependencies: [ - .package(url: "https://github.com/GraphQLSwift/GraphQL.git", from: "4.1.0"), + .package(url: "https://github.com/GraphQLSwift/GraphQL.git", from: "4.3.0"), .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.3.0"), .package(url: "https://github.com/swiftlang/swift-syntax.git", "600.0.1"..<"603.0.0"), .package(url: "https://github.com/jpsim/Yams.git", "4.0.0"..<"7.0.0"), @@ -61,7 +61,7 @@ let package = Package( .testTarget( name: "GraphQLGeneratorCoreTests", dependencies: [ - "GraphQLGeneratorCore" + "GraphQLGeneratorCore", ] ), .testTarget( diff --git a/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift b/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift index 4fc2d22..d049551 100644 --- a/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift +++ b/Sources/GraphQLGeneratorCore/Generator/BuildGraphQLSchemaGenerator.swift @@ -28,6 +28,22 @@ package struct BuildGraphQLSchemaGenerator { !$0.name.hasPrefix("__") } + // Apply serialize and parse methods for scalar types + let scalarTypes = types.compactMap { + $0 as? GraphQLScalarType + } + for scalar in scalarTypes { + // Avoid default scalars + guard scalar.astNode != nil else { + continue + } + output += """ + + + \(generateScalarType(for: scalar).indent(1)) + """ + } + // Generate type definitions for all object types let interfaceTypes = types.compactMap { $0 as? GraphQLInterfaceType @@ -94,6 +110,20 @@ package struct BuildGraphQLSchemaGenerator { return output } + func generateScalarType(for type: GraphQLScalarType) -> String { + let swiftType = mapScalarType(type, nameGenerator: nameGenerator) + return """ + + + if let scalar = schema.typeMap["\(type.name)"] as? GraphQLScalarType { + scalar.serialize = { try \(swiftType).serialize(any: $0) } + scalar.parseValue = { try \(swiftType).parseValue(map: $0) } + scalar.parseLiteral = { try \(swiftType).parseLiteral(value: $0) } + } + + """ + } + func generateInterfaceType(for type: GraphQLInterfaceType) throws -> String { let typeName = nameGenerator.swiftMemberName(for: type.name) let variableName = "\(typeName)Fields" diff --git a/Sources/GraphQLGeneratorCore/Utilities/swiftTypeName.swift b/Sources/GraphQLGeneratorCore/Utilities/swiftTypeName.swift index 1bb2219..13c1ee2 100644 --- a/Sources/GraphQLGeneratorCore/Utilities/swiftTypeName.swift +++ b/Sources/GraphQLGeneratorCore/Utilities/swiftTypeName.swift @@ -105,11 +105,10 @@ func swiftTypeDeclaration( throw GeneratorError.unsupportedType("Unknown type: \(type)") } -/// Map GraphQL leaf types to Swift types. +/// Map GraphQL scalar types to Swift types. /// /// - Parameters: /// - graphQLType: The GraphQL Type to generate a reference to -/// - includeNamespace: Whether to include the `GraphQLGenerated` type namespace in the result /// - nameGenerator: The name generator func mapScalarType(_ type: GraphQLScalarType, nameGenerator: SafeNameGenerator) -> String { switch type.name { diff --git a/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift b/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift index 166d424..0348e1a 100644 --- a/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift +++ b/Tests/GraphQLGeneratorCoreTests/SchemaGeneratorTests.swift @@ -87,6 +87,25 @@ struct SchemaGeneratorTests { ) } + @Test func generateScalarType() throws { + let scalar = try GraphQLScalarType(name: "EmailAddress") + + let result = generator.generateScalarType(for: scalar) + + let expected = """ + + + if let scalar = schema.typeMap["EmailAddress"] as? GraphQLScalarType { + scalar.serialize = { try GraphQLScalars.EmailAddress.serialize(any: $0) } + scalar.parseValue = { try GraphQLScalars.EmailAddress.parseValue(map: $0) } + scalar.parseLiteral = { try GraphQLScalars.EmailAddress.parseLiteral(value: $0) } + } + + """ + + #expect(result == expected) + } + @Test func generateInterfaceType() throws { let interfaceType = try GraphQLInterfaceType( name: "Node",