From 4596fd339f625d1e0dbbe52dfa2ba685a3ece4b4 Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Wed, 16 Apr 2025 17:34:05 -0400 Subject: [PATCH 1/2] Add errors property to @connect and @source --- composition-js/src/__tests__/connectors.test.ts | 9 +++++---- internals-js/src/specs/connectSpec.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/composition-js/src/__tests__/connectors.test.ts b/composition-js/src/__tests__/connectors.test.ts index b682aea0c..0598a608e 100644 --- a/composition-js/src/__tests__/connectors.test.ts +++ b/composition-js/src/__tests__/connectors.test.ts @@ -372,14 +372,14 @@ describe("connect spec and join__directive", () => { url: "https://specs.apollo.dev/connect/v0.2" import: ["@connect", "@source"] ) - @source(name: "v1", http: { baseURL: "http://v1" }) + @source(name: "v1", http: { baseURL: "http://v1" }, errors: { message: "" extensions: "" }) type Query { resources: [Resource!]! @connect(source: "v1", http: { GET: "/resources" }, selection: "") } - type Resource @key(fields: "id") @connect(source: "v1", http: { GET: "/resources" }, batch: { maxSize: 5 } selection: "") { + type Resource @key(fields: "id") @connect(source: "v1", http: { GET: "/resources" }, batch: { maxSize: 5 }, errors: { message: "" extensions: "" }, selection: "") { id: ID! name: String! } @@ -422,7 +422,8 @@ describe("connect spec and join__directive", () => { @link(url: \\"https://specs.apollo.dev/connect/v0.2\\", for: EXECUTION) @join__directive(graphs: [WITH_CONNECTORS_V0_1_], name: \\"link\\", args: {url: \\"https://specs.apollo.dev/connect/v0.1\\", import: [\\"@connect\\", \\"@source\\"]}) @join__directive(graphs: [WITH_CONNECTORS_V0_2_], name: \\"link\\", args: {url: \\"https://specs.apollo.dev/connect/v0.2\\", import: [\\"@connect\\", \\"@source\\"]}) - @join__directive(graphs: [WITH_CONNECTORS_V0_1_, WITH_CONNECTORS_V0_2_], name: \\"source\\", args: {name: \\"v1\\", http: {baseURL: \\"http://v1\\"}}) + @join__directive(graphs: [WITH_CONNECTORS_V0_1_], name: \\"source\\", args: {name: \\"v1\\", http: {baseURL: \\"http://v1\\"}}) + @join__directive(graphs: [WITH_CONNECTORS_V0_2_], name: \\"source\\", args: {name: \\"v1\\", http: {baseURL: \\"http://v1\\"}, errors: {message: \\"\\", extensions: \\"\\"}}) { query: Query } @@ -492,7 +493,7 @@ describe("connect spec and join__directive", () => { type Resource @join__type(graph: WITH_CONNECTORS_V0_2_, key: \\"id\\") - @join__directive(graphs: [WITH_CONNECTORS_V0_2_], name: \\"connect\\", args: {source: \\"v1\\", http: {GET: \\"/resources\\"}, batch: {maxSize: 5}, selection: \\"\\"}) + @join__directive(graphs: [WITH_CONNECTORS_V0_2_], name: \\"connect\\", args: {source: \\"v1\\", http: {GET: \\"/resources\\"}, batch: {maxSize: 5}, errors: {message: \\"\\", extensions: \\"\\"}, selection: \\"\\"}) { id: ID! name: String! diff --git a/internals-js/src/specs/connectSpec.ts b/internals-js/src/specs/connectSpec.ts index ee98f37ea..d49e391a3 100644 --- a/internals-js/src/specs/connectSpec.ts +++ b/internals-js/src/specs/connectSpec.ts @@ -18,7 +18,9 @@ const URL_PATH_TEMPLATE = "URLPathTemplate"; const JSON_SELECTION = "JSONSelection"; const CONNECT_HTTP = "ConnectHTTP"; const CONNECT_BATCH = "ConnectBatch"; +const CONNECT_ERRORS = "ConnectErrors"; const SOURCE_HTTP = "SourceHTTP"; +const SOURCE_ERRORS = "SourceErrors"; const HTTP_HEADER_MAPPING = "HTTPHeaderMapping"; export class ConnectSpecDefinition extends FeatureDefinition { @@ -111,6 +113,11 @@ export class ConnectSpecDefinition extends FeatureDefinition { ConnectBatch.addField(new InputFieldDefinition('maxSize')).type = schema.intType(); connect.addArgument('batch', ConnectBatch); + const ConnectErrors = schema.addType(new InputObjectType(this.typeNameInSchema(schema, CONNECT_ERRORS)!)); + ConnectErrors.addField(new InputFieldDefinition('message')).type = JSONSelection; + ConnectErrors.addField(new InputFieldDefinition('extensions')).type = JSONSelection; + connect.addArgument('errors', ConnectErrors); + connect.addArgument('selection', new NonNullType(JSONSelection)); connect.addArgument('entity', schema.booleanType(), false); @@ -140,6 +147,11 @@ export class ConnectSpecDefinition extends FeatureDefinition { source.addArgument('http', new NonNullType(SourceHTTP)); + const SourceErrors = schema.addType(new InputObjectType(this.typeNameInSchema(schema, SOURCE_ERRORS)!)); + SourceErrors.addField(new InputFieldDefinition('message')).type = JSONSelection; + SourceErrors.addField(new InputFieldDefinition('extensions')).type = JSONSelection; + source.addArgument('errors', SourceErrors); + return []; } From 1d0b91dd40e21ebf978864de77d27ce850c36282 Mon Sep 17 00:00:00 2001 From: Andrew McGivery Date: Wed, 23 Apr 2025 01:53:11 -0400 Subject: [PATCH 2/2] Merge CONNECT_ERRORS and SOURCE_ERRORS into a single definition --- internals-js/src/specs/connectSpec.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/internals-js/src/specs/connectSpec.ts b/internals-js/src/specs/connectSpec.ts index cf8b43a21..88bdf0396 100644 --- a/internals-js/src/specs/connectSpec.ts +++ b/internals-js/src/specs/connectSpec.ts @@ -27,9 +27,8 @@ const URL_PATH_TEMPLATE = 'URLPathTemplate'; const JSON_SELECTION = 'JSONSelection'; const CONNECT_HTTP = 'ConnectHTTP'; const CONNECT_BATCH = 'ConnectBatch'; -const CONNECT_ERRORS = "ConnectErrors"; +const CONNECTOR_ERRORS = "ConnectorErrors"; const SOURCE_HTTP = "SourceHTTP"; -const SOURCE_ERRORS = "SourceErrors"; const HTTP_HEADER_MAPPING = 'HTTPHeaderMapping'; export class ConnectSpecDefinition extends FeatureDefinition { @@ -85,6 +84,7 @@ export class ConnectSpecDefinition extends FeatureDefinition { http: ConnectHTTP selection: JSONSelection! entity: Boolean = false + errors: ConnectorErrors ) repeatable on FIELD_DEFINITION | OBJECT # added in v0.2, validation enforced in rust */ @@ -155,10 +155,10 @@ export class ConnectSpecDefinition extends FeatureDefinition { ConnectBatch.addField(new InputFieldDefinition('maxSize')).type = schema.intType(); connect.addArgument('batch', ConnectBatch); - const ConnectErrors = schema.addType(new InputObjectType(this.typeNameInSchema(schema, CONNECT_ERRORS)!)); - ConnectErrors.addField(new InputFieldDefinition('message')).type = JSONSelection; - ConnectErrors.addField(new InputFieldDefinition('extensions')).type = JSONSelection; - connect.addArgument('errors', ConnectErrors); + const ConnectorErrors = schema.addType(new InputObjectType(this.typeNameInSchema(schema, CONNECTOR_ERRORS)!)); + ConnectorErrors.addField(new InputFieldDefinition('message')).type = JSONSelection; + ConnectorErrors.addField(new InputFieldDefinition('extensions')).type = JSONSelection; + connect.addArgument('errors', ConnectorErrors); connect.addArgument('selection', new NonNullType(JSONSelection)); connect.addArgument('entity', schema.booleanType(), false); @@ -167,6 +167,7 @@ export class ConnectSpecDefinition extends FeatureDefinition { directive @source( name: String! http: ConnectHTTP + errors: ConnectorErrors ) repeatable on SCHEMA */ const source = this.addDirective(schema, SOURCE).addLocations( @@ -197,11 +198,7 @@ export class ConnectSpecDefinition extends FeatureDefinition { SourceHTTP.addField(new InputFieldDefinition('queryParams')).type = JSONSelection; source.addArgument('http', new NonNullType(SourceHTTP)); - - const SourceErrors = schema.addType(new InputObjectType(this.typeNameInSchema(schema, SOURCE_ERRORS)!)); - SourceErrors.addField(new InputFieldDefinition('message')).type = JSONSelection; - SourceErrors.addField(new InputFieldDefinition('extensions')).type = JSONSelection; - source.addArgument('errors', SourceErrors); + source.addArgument('errors', ConnectorErrors); return []; }