@wundergraph/protographic 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,7 @@ import { GraphQLSchema } from 'graphql';
2
2
  import { GRPCMapping } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';
3
3
  import type { GraphQLToProtoTextVisitorOptions } from './sdl-to-proto-visitor.js';
4
4
  import type { ProtoLock } from './proto-lock.js';
5
+ import { type ValidationResult } from './sdl-validation-visitor.js';
5
6
  /**
6
7
  * Compiles a GraphQL schema to a mapping structure
7
8
  *
@@ -29,9 +30,19 @@ export interface CompileGraphQLToProtoResult {
29
30
  * @returns Protocol Buffer text definition and lock data
30
31
  */
31
32
  export declare function compileGraphQLToProto(schemaOrSDL: GraphQLSchema | string, options?: GraphQLToProtoTextVisitorOptions): CompileGraphQLToProtoResult;
33
+ /**
34
+ * Validates a GraphQL SDL schema against specific rules and constraints
35
+ *
36
+ * @param sdl - The GraphQL SDL string to validate
37
+ * @returns ValidationResult containing any errors and warnings found during validation
38
+ * @throws Error if the SDL cannot be parsed as valid GraphQL
39
+ */
40
+ export declare function validateGraphQLSDL(sdl: string): ValidationResult;
32
41
  export * from './sdl-to-mapping-visitor.js';
33
42
  export { GraphQLToProtoTextVisitor } from './sdl-to-proto-visitor.js';
34
43
  export { ProtoLockManager } from './proto-lock.js';
44
+ export { SDLValidationVisitor } from './sdl-validation-visitor.js';
35
45
  export type { GraphQLToProtoTextVisitorOptions } from './sdl-to-proto-visitor.js';
36
46
  export type { ProtoLock } from './proto-lock.js';
47
+ export type { ValidationResult } from './sdl-validation-visitor.js';
37
48
  export { GRPCMapping, OperationMapping, EntityMapping, TypeFieldMapping, FieldMapping, ArgumentMapping, EnumMapping, EnumValueMapping, OperationType, } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';
package/dist/src/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { buildSchema } from 'graphql';
2
2
  import { GraphQLToProtoVisitor } from './sdl-to-mapping-visitor.js';
3
3
  import { GraphQLToProtoTextVisitor } from './sdl-to-proto-visitor.js';
4
+ import { SDLValidationVisitor } from './sdl-validation-visitor.js';
4
5
  /**
5
6
  * Compiles a GraphQL schema to a mapping structure
6
7
  *
@@ -46,8 +47,20 @@ export function compileGraphQLToProto(schemaOrSDL, options) {
46
47
  lockData: generatedLockData,
47
48
  };
48
49
  }
50
+ /**
51
+ * Validates a GraphQL SDL schema against specific rules and constraints
52
+ *
53
+ * @param sdl - The GraphQL SDL string to validate
54
+ * @returns ValidationResult containing any errors and warnings found during validation
55
+ * @throws Error if the SDL cannot be parsed as valid GraphQL
56
+ */
57
+ export function validateGraphQLSDL(sdl) {
58
+ const visitor = new SDLValidationVisitor(sdl);
59
+ return visitor.visit();
60
+ }
49
61
  export * from './sdl-to-mapping-visitor.js';
50
62
  export { GraphQLToProtoTextVisitor } from './sdl-to-proto-visitor.js';
51
63
  export { ProtoLockManager } from './proto-lock.js';
64
+ export { SDLValidationVisitor } from './sdl-validation-visitor.js';
52
65
  export { GRPCMapping, OperationMapping, EntityMapping, TypeFieldMapping, FieldMapping, ArgumentMapping, EnumMapping, EnumValueMapping, OperationType, } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';
53
66
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAGtE;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmC,EACnC,cAAsB,gBAAgB;IAEtC,6CAA6C;IAC7C,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;YACvB,WAAW,EAAE,IAAI,EAAE,oCAAoC;YACvD,cAAc,EAAE,IAAI,EAAE,sBAAsB;SAC7C,CAAC;QACJ,CAAC,CAAC,WAAW,CAAC;IAElB,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmC,EACnC,OAA0C;IAE1C,6CAA6C;IAC7C,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;YACvB,WAAW,EAAE,IAAI,EAAE,oCAAoC;YACvD,cAAc,EAAE,IAAI,EAAE,sBAAsB;SAC7C,CAAC;QACJ,CAAC,CAAC,WAAW,CAAC;IAElB,yDAAyD;IACzD,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAE9B,8BAA8B;IAC9B,MAAM,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAEzD,wDAAwD;IACxD,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;AACJ,CAAC;AAED,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAInD,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,iDAAiD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAyB,MAAM,6BAA6B,CAAC;AAE1F;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmC,EACnC,cAAsB,gBAAgB;IAEtC,6CAA6C;IAC7C,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;YACvB,WAAW,EAAE,IAAI,EAAE,oCAAoC;YACvD,cAAc,EAAE,IAAI,EAAE,sBAAsB;SAC7C,CAAC;QACJ,CAAC,CAAC,WAAW,CAAC;IAElB,6BAA6B;IAC7B,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAmC,EACnC,OAA0C;IAE1C,6CAA6C;IAC7C,MAAM,MAAM,GACV,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;YACvB,WAAW,EAAE,IAAI,EAAE,oCAAoC;YACvD,cAAc,EAAE,IAAI,EAAE,sBAAsB;SAC7C,CAAC;QACJ,CAAC,CAAC,WAAW,CAAC;IAElB,yDAAyD;IACzD,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAE9B,8BAA8B;IAC9B,MAAM,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAEzD,wDAAwD;IACxD,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,OAAO,GAAG,IAAI,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,cAAc,6BAA6B,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAKnE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,aAAa,GACd,MAAM,iDAAiD,CAAC"}
@@ -31,15 +31,7 @@ export declare function createResponseMessageName(methodName: string): string;
31
31
  /**
32
32
  * Creates an entity lookup method name for an entity type
33
33
  */
34
- export declare function createEntityLookupMethodName(typeName: string, keyField?: string): string;
35
- /**
36
- * Creates a request message name for an entity lookup
37
- */
38
- export declare function createEntityLookupRequestName(typeName: string, keyField?: string): string;
39
- /**
40
- * Creates a response message name for an entity lookup
41
- */
42
- export declare function createEntityLookupResponseName(typeName: string, keyField?: string): string;
34
+ export declare function createEntityLookupMethodName(typeName: string, keyString?: string): string;
43
35
  /**
44
36
  * Converts a GraphQL enum value to a Protocol Buffer enum value
45
37
  */
@@ -32,20 +32,14 @@ export function createResponseMessageName(methodName) {
32
32
  /**
33
33
  * Creates an entity lookup method name for an entity type
34
34
  */
35
- export function createEntityLookupMethodName(typeName, keyField = 'id') {
36
- return `Lookup${typeName}By${upperFirst(camelCase(keyField))}`;
37
- }
38
- /**
39
- * Creates a request message name for an entity lookup
40
- */
41
- export function createEntityLookupRequestName(typeName, keyField = 'id') {
42
- return `Lookup${typeName}By${upperFirst(camelCase(keyField))}Request`;
43
- }
44
- /**
45
- * Creates a response message name for an entity lookup
46
- */
47
- export function createEntityLookupResponseName(typeName, keyField = 'id') {
48
- return `Lookup${typeName}By${upperFirst(camelCase(keyField))}Response`;
35
+ export function createEntityLookupMethodName(typeName, keyString = 'id') {
36
+ const normalizedKey = keyString
37
+ .split(/[,\s]+/)
38
+ .filter((field) => field.length > 0)
39
+ .map((field) => upperFirst(camelCase(field)))
40
+ .sort()
41
+ .join('And');
42
+ return `Lookup${typeName}By${normalizedKey}`;
49
43
  }
50
44
  /**
51
45
  * Converts a GraphQL enum value to a Protocol Buffer enum value
@@ -1 +1 @@
1
- {"version":3,"file":"naming-conventions.js","sourceRoot":"","sources":["../../src/naming-conventions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAc7D;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAgC,EAAE,SAAiB;IAC3F,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,OAAO,GAAG,UAAU,SAAS,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,OAAO,GAAG,UAAU,UAAU,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAgB,EAAE,WAAmB,IAAI;IACpF,OAAO,SAAS,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAgB,EAAE,WAAmB,IAAI;IACrF,OAAO,SAAS,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAgB,EAAE,WAAmB,IAAI;IACtF,OAAO,SAAS,QAAQ,KAAK,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,YAAoB,EAAE,SAAiB;IACtF,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,YAAoB;IAC7D,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"naming-conventions.js","sourceRoot":"","sources":["../../src/naming-conventions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAc7D;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAAe;IACzD,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAgC,EAAE,SAAiB;IAC3F,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,OAAO,GAAG,UAAU,SAAS,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,OAAO,GAAG,UAAU,UAAU,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAgB,EAAE,YAAoB,IAAI;IACrF,MAAM,aAAa,GAAG,SAAS;SAC5B,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACnC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SAC5C,IAAI,EAAE;SACN,IAAI,CAAC,KAAK,CAAC,CAAC;IAEf,OAAO,SAAS,QAAQ,KAAK,aAAa,EAAE,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gCAAgC,CAAC,YAAoB,EAAE,SAAiB;IACtF,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,YAAoB;IAC7D,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC;AAChE,CAAC"}
@@ -41,12 +41,12 @@ export declare class GraphQLToProtoVisitor {
41
41
  */
42
42
  private processEntityTypes;
43
43
  /**
44
- * Extract the key directive from a GraphQL object type
44
+ * Extract all key directives from a GraphQL object type
45
45
  *
46
- * @param type - The GraphQL object type to check for key directive
47
- * @returns The key directive if found, undefined otherwise
46
+ * @param type - The GraphQL object type to check for key directives
47
+ * @returns Array of all key directives found
48
48
  */
49
- private getKeyDirective;
49
+ private getKeyDirectives;
50
50
  /**
51
51
  * Creates an entity mapping for a federated entity type
52
52
  *
@@ -61,12 +61,12 @@ export declare class GraphQLToProtoVisitor {
61
61
  * Extract key fields from a @key directive
62
62
  *
63
63
  * The @key directive specifies which fields form the entity's primary key
64
- * in Federation. This method extracts those field names.
64
+ * in Federation. This method extracts the key string as-is.
65
65
  *
66
66
  * @param directive - The @key directive from the GraphQL AST
67
- * @returns Array of field names that form the key
67
+ * @returns The key string (e.g. "id" or "id upc")
68
68
  */
69
- private getKeyFieldsFromDirective;
69
+ private getKeyFromDirective;
70
70
  /**
71
71
  * Process the GraphQL Query type to generate query operation mappings
72
72
  *
@@ -1,5 +1,5 @@
1
1
  import { isEnumType, isInputObjectType, isObjectType, Kind, } from 'graphql';
2
- import { createEntityLookupMethodName, createEntityLookupRequestName, createEntityLookupResponseName, createOperationMethodName, createRequestMessageName, createResponseMessageName, graphqlArgumentToProtoField, graphqlEnumValueToProtoEnumValue, graphqlFieldToProtoField, } from './naming-conventions.js';
2
+ import { createEntityLookupMethodName, createOperationMethodName, createRequestMessageName, createResponseMessageName, graphqlArgumentToProtoField, graphqlEnumValueToProtoEnumValue, graphqlFieldToProtoField, } from './naming-conventions.js';
3
3
  import { ArgumentMapping, EntityMapping, EnumMapping, EnumValueMapping, FieldMapping, GRPCMapping, OperationMapping, OperationType, TypeFieldMapping, } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb';
4
4
  /**
5
5
  * Visitor that converts a GraphQL schema to gRPC mapping definitions
@@ -69,26 +69,29 @@ export class GraphQLToProtoVisitor {
69
69
  continue;
70
70
  // Check if this is an entity type (has @key directive)
71
71
  if (isObjectType(type)) {
72
- const keyDirective = this.getKeyDirective(type);
73
- if (!keyDirective)
72
+ const keyDirectives = this.getKeyDirectives(type);
73
+ if (keyDirectives.length === 0)
74
74
  continue;
75
- const keyFields = this.getKeyFieldsFromDirective(keyDirective);
76
- if (keyFields.length > 0) {
77
- // Create entity mapping using the first key field
78
- this.createEntityMapping(typeName, keyFields[0]);
75
+ // Process each @key directive separately
76
+ for (const keyDirective of keyDirectives) {
77
+ const key = this.getKeyFromDirective(keyDirective);
78
+ if (key) {
79
+ // Create entity mapping for each key combination
80
+ this.createEntityMapping(typeName, key);
81
+ }
79
82
  }
80
83
  }
81
84
  }
82
85
  }
83
86
  /**
84
- * Extract the key directive from a GraphQL object type
87
+ * Extract all key directives from a GraphQL object type
85
88
  *
86
- * @param type - The GraphQL object type to check for key directive
87
- * @returns The key directive if found, undefined otherwise
89
+ * @param type - The GraphQL object type to check for key directives
90
+ * @returns Array of all key directives found
88
91
  */
89
- getKeyDirective(type) {
92
+ getKeyDirectives(type) {
90
93
  var _a, _b;
91
- return (_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.directives) === null || _b === void 0 ? void 0 : _b.find((d) => d.name.value === 'key');
94
+ return ((_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.directives) === null || _b === void 0 ? void 0 : _b.filter((d) => d.name.value === 'key')) || [];
92
95
  }
93
96
  /**
94
97
  * Creates an entity mapping for a federated entity type
@@ -100,13 +103,14 @@ export class GraphQLToProtoVisitor {
100
103
  * @param keyField - The field that serves as the entity's key
101
104
  */
102
105
  createEntityMapping(typeName, keyField) {
106
+ const rpc = createEntityLookupMethodName(typeName, keyField);
103
107
  const entityMapping = new EntityMapping({
104
108
  typeName,
105
109
  kind: 'entity',
106
110
  key: keyField,
107
- rpc: createEntityLookupMethodName(typeName, keyField),
108
- request: createEntityLookupRequestName(typeName, keyField),
109
- response: createEntityLookupResponseName(typeName, keyField),
111
+ rpc: rpc,
112
+ request: createRequestMessageName(rpc),
113
+ response: createResponseMessageName(rpc),
110
114
  });
111
115
  this.mapping.entityMappings.push(entityMapping);
112
116
  }
@@ -114,19 +118,19 @@ export class GraphQLToProtoVisitor {
114
118
  * Extract key fields from a @key directive
115
119
  *
116
120
  * The @key directive specifies which fields form the entity's primary key
117
- * in Federation. This method extracts those field names.
121
+ * in Federation. This method extracts the key string as-is.
118
122
  *
119
123
  * @param directive - The @key directive from the GraphQL AST
120
- * @returns Array of field names that form the key
124
+ * @returns The key string (e.g. "id" or "id upc")
121
125
  */
122
- getKeyFieldsFromDirective(directive) {
126
+ getKeyFromDirective(directive) {
123
127
  var _a;
124
128
  // Extract fields argument from the key directive
125
129
  const fieldsArg = (_a = directive.arguments) === null || _a === void 0 ? void 0 : _a.find((arg) => arg.name.value === 'fields');
126
130
  if (fieldsArg && fieldsArg.value.kind === Kind.STRING) {
127
- return fieldsArg.value.value.split(' ');
131
+ return fieldsArg.value.value;
128
132
  }
129
- return [];
133
+ return null;
130
134
  }
131
135
  /**
132
136
  * Process the GraphQL Query type to generate query operation mappings
@@ -1 +1 @@
1
- {"version":3,"file":"sdl-to-mapping-visitor.js","sourceRoot":"","sources":["../../src/sdl-to-mapping-visitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdl-to-mapping-visitor.js","sourceRoot":"","sources":["../../src/sdl-to-mapping-visitor.ts"],"names":[],"mappings":"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"}
@@ -178,6 +178,13 @@ export declare class GraphQLToProtoTextVisitor {
178
178
  * Creates a response message for a query/mutation field
179
179
  */
180
180
  private createFieldResponseMessage;
181
+ /**
182
+ * Extract all key directives from a GraphQL object type
183
+ *
184
+ * @param type - The GraphQL object type to check for key directives
185
+ * @returns Array of all key directives found
186
+ */
187
+ private getKeyDirectives;
181
188
  /**
182
189
  * Extract key fields from a directive
183
190
  *
@@ -187,7 +194,7 @@ export declare class GraphQLToProtoTextVisitor {
187
194
  * @param directive - The @key directive from the GraphQL AST
188
195
  * @returns Array of field names that form the key
189
196
  */
190
- private getKeyFieldsFromDirective;
197
+ private getKeyFromDirective;
191
198
  /**
192
199
  * Queue all types from the schema that need processing
193
200
  */
@@ -1,5 +1,5 @@
1
1
  import { getNamedType, isEnumType, isInputObjectType, isInterfaceType, isListType, isNonNullType, isObjectType, isScalarType, isUnionType, } from 'graphql';
2
- import { createEntityLookupMethodName, createEntityLookupRequestName, createEntityLookupResponseName, createEnumUnspecifiedValue, createOperationMethodName, createRequestMessageName, createResponseMessageName, graphqlEnumValueToProtoEnumValue, graphqlFieldToProtoField, } from './naming-conventions.js';
2
+ import { createEntityLookupMethodName, createEnumUnspecifiedValue, createOperationMethodName, createRequestMessageName, createResponseMessageName, graphqlEnumValueToProtoEnumValue, graphqlFieldToProtoField, } from './naming-conventions.js';
3
3
  import { camelCase } from 'lodash-es';
4
4
  import { ProtoLockManager } from './proto-lock.js';
5
5
  /**
@@ -381,7 +381,7 @@ export class GraphQLToProtoTextVisitor {
381
381
  * @returns Object containing RPC methods and message definitions
382
382
  */
383
383
  collectEntityRpcMethods() {
384
- var _a, _b, _c, _d;
384
+ var _a, _b, _c;
385
385
  const result = { rpcMethods: [], methodNames: [], messageDefinitions: [] };
386
386
  const typeMap = this.schema.getTypeMap();
387
387
  for (const typeName in typeMap) {
@@ -395,23 +395,36 @@ export class GraphQLToProtoTextVisitor {
395
395
  }
396
396
  // Check if this is an entity type (has @key directive)
397
397
  if (isObjectType(type)) {
398
- const astNode = type.astNode;
399
- const keyDirective = (_d = astNode === null || astNode === void 0 ? void 0 : astNode.directives) === null || _d === void 0 ? void 0 : _d.find((d) => d.name.value === 'key');
400
- if (keyDirective) {
401
- // Queue this type for message generation
398
+ const keyDirectives = this.getKeyDirectives(type);
399
+ if (keyDirectives.length > 0) {
400
+ // Queue this type for message generation (only once)
402
401
  this.queueTypeForProcessing(type);
403
- const keyFields = this.getKeyFieldsFromDirective(keyDirective);
404
- if (keyFields.length > 0) {
405
- const keyField = keyFields[0];
406
- const methodName = createEntityLookupMethodName(typeName, keyField);
407
- const requestName = createEntityLookupRequestName(typeName, keyField);
408
- const responseName = createEntityLookupResponseName(typeName, keyField);
402
+ // Normalize keys by sorting fields alphabetically and deduplicating
403
+ const normalizedKeysSet = new Set();
404
+ for (const keyDirective of keyDirectives) {
405
+ const keyString = this.getKeyFromDirective(keyDirective);
406
+ if (!keyString)
407
+ continue;
408
+ const normalizedKey = keyString
409
+ .split(/[,\s]+/)
410
+ .filter((field) => field.length > 0)
411
+ .sort()
412
+ .join(' ');
413
+ normalizedKeysSet.add(normalizedKey);
414
+ }
415
+ // Process each normalized key
416
+ for (const normalizedKeyString of normalizedKeysSet) {
417
+ const methodName = createEntityLookupMethodName(typeName, normalizedKeyString);
418
+ const requestName = createRequestMessageName(methodName);
419
+ const responseName = createResponseMessageName(methodName);
409
420
  // Add method name and RPC method with description from the entity type
410
421
  result.methodNames.push(methodName);
411
- const description = `Lookup ${typeName} entity by ${keyField}${type.description ? ': ' + type.description : ''}`;
422
+ const keyFields = normalizedKeyString.split(' ');
423
+ const keyDescription = keyFields.length === 1 ? keyFields[0] : keyFields.join(' and ');
424
+ const description = `Lookup ${typeName} entity by ${keyDescription}${type.description ? ': ' + type.description : ''}`;
412
425
  result.rpcMethods.push(this.createRpcMethod(methodName, requestName, responseName, description));
413
- // Create request and response messages
414
- result.messageDefinitions.push(...this.createKeyRequestMessage(typeName, requestName, keyFields[0], responseName));
426
+ // Create request and response messages for this key combination
427
+ result.messageDefinitions.push(...this.createKeyRequestMessage(typeName, requestName, normalizedKeyString, responseName));
415
428
  result.messageDefinitions.push(...this.createKeyResponseMessage(typeName, responseName, requestName));
416
429
  }
417
430
  }
@@ -507,7 +520,7 @@ export class GraphQLToProtoTextVisitor {
507
520
  /**
508
521
  * Creates a request message for entity lookup without adding to protoText
509
522
  */
510
- createKeyRequestMessage(typeName, requestName, keyField, responseName) {
523
+ createKeyRequestMessage(typeName, requestName, keyString, responseName) {
511
524
  const messageLines = [];
512
525
  const keyMessageName = `${requestName}Key`;
513
526
  const lockData = this.lockManager.getLockData();
@@ -522,24 +535,30 @@ export class GraphQLToProtoTextVisitor {
522
535
  if ((keyMessageLock === null || keyMessageLock === void 0 ? void 0 : keyMessageLock.reservedNumbers) && keyMessageLock.reservedNumbers.length > 0) {
523
536
  messageLines.push(` reserved ${this.formatReservedNumbers(keyMessageLock.reservedNumbers)};`);
524
537
  }
538
+ const keyFields = keyString.split(' ');
525
539
  // Check for field removals in the key message
526
540
  if (lockData.messages[keyMessageName]) {
527
541
  const originalKeyFieldNames = Object.keys(lockData.messages[keyMessageName].fields);
528
- const currentKeyFieldNames = [graphqlFieldToProtoField(keyField)];
542
+ const currentKeyFieldNames = keyFields.map((field) => graphqlFieldToProtoField(field));
529
543
  this.trackRemovedFields(keyMessageName, originalKeyFieldNames, currentKeyFieldNames);
530
544
  }
531
- const protoKeyField = graphqlFieldToProtoField(keyField);
532
- // Get the appropriate field number for the key field
533
- const keyFieldNumber = this.getFieldNumber(keyMessageName, protoKeyField, 1);
534
- if (this.includeComments) {
535
- const keyFieldComment = `Key field for ${typeName} entity lookup.`;
536
- messageLines.push(...this.formatComment(keyFieldComment, 1)); // Field comment, indent 1 level
537
- }
538
- messageLines.push(` string ${protoKeyField} = ${keyFieldNumber};`);
545
+ // Add all key fields to the key message
546
+ const protoKeyFields = [];
547
+ keyFields.forEach((keyField, index) => {
548
+ const protoKeyField = graphqlFieldToProtoField(keyField);
549
+ protoKeyFields.push(protoKeyField);
550
+ // Get the appropriate field number for this key field
551
+ const keyFieldNumber = this.getFieldNumber(keyMessageName, protoKeyField, index + 1);
552
+ if (this.includeComments) {
553
+ const keyFieldComment = `Key field for ${typeName} entity lookup.`;
554
+ messageLines.push(...this.formatComment(keyFieldComment, 1)); // Field comment, indent 1 level
555
+ }
556
+ messageLines.push(` string ${protoKeyField} = ${keyFieldNumber};`);
557
+ });
539
558
  messageLines.push('}');
540
559
  messageLines.push('');
541
560
  // Ensure the key message is registered in the lock manager data
542
- this.lockManager.reconcileMessageFieldOrder(keyMessageName, [protoKeyField]);
561
+ this.lockManager.reconcileMessageFieldOrder(keyMessageName, protoKeyFields);
543
562
  // Now create the main request message with a repeated key field
544
563
  // Check for field removals in the request message
545
564
  if (lockData.messages[requestName]) {
@@ -726,6 +745,16 @@ Example:
726
745
  this.lockManager.reconcileMessageFieldOrder(responseName, [protoFieldName]);
727
746
  return messageLines;
728
747
  }
748
+ /**
749
+ * Extract all key directives from a GraphQL object type
750
+ *
751
+ * @param type - The GraphQL object type to check for key directives
752
+ * @returns Array of all key directives found
753
+ */
754
+ getKeyDirectives(type) {
755
+ var _a, _b;
756
+ return ((_b = (_a = type.astNode) === null || _a === void 0 ? void 0 : _a.directives) === null || _b === void 0 ? void 0 : _b.filter((d) => d.name.value === 'key')) || [];
757
+ }
729
758
  /**
730
759
  * Extract key fields from a directive
731
760
  *
@@ -735,14 +764,14 @@ Example:
735
764
  * @param directive - The @key directive from the GraphQL AST
736
765
  * @returns Array of field names that form the key
737
766
  */
738
- getKeyFieldsFromDirective(directive) {
767
+ getKeyFromDirective(directive) {
739
768
  var _a;
740
769
  const fieldsArg = (_a = directive.arguments) === null || _a === void 0 ? void 0 : _a.find((arg) => arg.name.value === 'fields');
741
770
  if (fieldsArg && fieldsArg.value.kind === 'StringValue') {
742
771
  const stringValue = fieldsArg.value;
743
- return stringValue.value.split(' ');
772
+ return stringValue.value;
744
773
  }
745
- return [];
774
+ return null;
746
775
  }
747
776
  /**
748
777
  * Queue all types from the schema that need processing