@wundergraph/protographic 0.11.0 → 0.12.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.
Files changed (36) hide show
  1. package/README.md +34 -3
  2. package/dist/src/index.d.ts +15 -0
  3. package/dist/src/index.js +10 -0
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/operation-to-proto.d.ts +48 -0
  6. package/dist/src/operation-to-proto.js +378 -0
  7. package/dist/src/operation-to-proto.js.map +1 -0
  8. package/dist/src/operations/field-numbering.d.ts +73 -0
  9. package/dist/src/operations/field-numbering.js +134 -0
  10. package/dist/src/operations/field-numbering.js.map +1 -0
  11. package/dist/src/operations/list-type-utils.d.ts +28 -0
  12. package/dist/src/operations/list-type-utils.js +49 -0
  13. package/dist/src/operations/list-type-utils.js.map +1 -0
  14. package/dist/src/operations/message-builder.d.ts +58 -0
  15. package/dist/src/operations/message-builder.js +377 -0
  16. package/dist/src/operations/message-builder.js.map +1 -0
  17. package/dist/src/operations/proto-text-generator.d.ts +74 -0
  18. package/dist/src/operations/proto-text-generator.js +336 -0
  19. package/dist/src/operations/proto-text-generator.js.map +1 -0
  20. package/dist/src/operations/request-builder.d.ts +56 -0
  21. package/dist/src/operations/request-builder.js +194 -0
  22. package/dist/src/operations/request-builder.js.map +1 -0
  23. package/dist/src/operations/type-mapper.d.ts +66 -0
  24. package/dist/src/operations/type-mapper.js +236 -0
  25. package/dist/src/operations/type-mapper.js.map +1 -0
  26. package/dist/src/proto-options.d.ts +23 -0
  27. package/dist/src/proto-options.js +45 -0
  28. package/dist/src/proto-options.js.map +1 -0
  29. package/dist/src/sdl-to-proto-visitor.d.ts +2 -14
  30. package/dist/src/sdl-to-proto-visitor.js +25 -38
  31. package/dist/src/sdl-to-proto-visitor.js.map +1 -1
  32. package/dist/src/types.d.ts +12 -0
  33. package/dist/src/types.js +2 -0
  34. package/dist/src/types.js.map +1 -0
  35. package/dist/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +2 -2
@@ -0,0 +1,194 @@
1
+ import protobuf from 'protobufjs';
2
+ import { typeFromAST, } from 'graphql';
3
+ import { mapGraphQLTypeToProto } from './type-mapper.js';
4
+ import { assignFieldNumbersFromLockData } from './field-numbering.js';
5
+ import { graphqlFieldToProtoField, graphqlArgumentToProtoField, createEnumUnspecifiedValue, graphqlEnumValueToProtoEnumValue, } from '../naming-conventions.js';
6
+ /**
7
+ * Builds a Protocol Buffer request message from GraphQL operation variables
8
+ *
9
+ * @param messageName - The name for the request message
10
+ * @param variables - Array of variable definitions from the operation
11
+ * @param schema - The GraphQL schema for type resolution
12
+ * @param options - Optional configuration
13
+ * @returns A protobuf Type object representing the request message
14
+ */
15
+ export function buildRequestMessage(messageName, variables, schema, options) {
16
+ const message = new protobuf.Type(messageName);
17
+ const fieldNumberManager = options === null || options === void 0 ? void 0 : options.fieldNumberManager;
18
+ // Collect all variable names
19
+ const variableNames = variables.map((v) => graphqlArgumentToProtoField(v.variable.name.value));
20
+ // Reconcile field order using lock manager if available
21
+ let orderedVariableNames = variableNames;
22
+ if (fieldNumberManager && 'reconcileFieldOrder' in fieldNumberManager) {
23
+ orderedVariableNames = fieldNumberManager.reconcileFieldOrder(messageName, variableNames);
24
+ }
25
+ // Create a map for quick lookup
26
+ const variableMap = new Map();
27
+ for (const variable of variables) {
28
+ const protoName = graphqlArgumentToProtoField(variable.variable.name.value);
29
+ variableMap.set(protoName, variable);
30
+ }
31
+ // Pre-assign field numbers from lock data if available
32
+ assignFieldNumbersFromLockData(messageName, orderedVariableNames, fieldNumberManager);
33
+ // Process variables in reconciled order
34
+ let fieldNumber = 1;
35
+ for (const protoVariableName of orderedVariableNames) {
36
+ const variable = variableMap.get(protoVariableName);
37
+ if (!variable)
38
+ continue;
39
+ const variableName = variable.variable.name.value;
40
+ const field = buildVariableField(variableName, variable.type, schema, messageName, options, fieldNumber);
41
+ if (field) {
42
+ message.add(field);
43
+ fieldNumber++;
44
+ }
45
+ }
46
+ return message;
47
+ }
48
+ /**
49
+ * Builds a proto field from a GraphQL variable definition
50
+ *
51
+ * @param variableName - The name of the variable
52
+ * @param typeNode - The GraphQL type node from the variable definition
53
+ * @param schema - The GraphQL schema for type resolution
54
+ * @param messageName - The name of the message this field belongs to
55
+ * @param options - Optional configuration
56
+ * @param defaultFieldNumber - Default field number if no manager is provided
57
+ * @returns A protobuf Field object
58
+ */
59
+ export function buildVariableField(variableName, typeNode, schema, messageName, options, defaultFieldNumber = 1) {
60
+ const protoFieldName = graphqlArgumentToProtoField(variableName);
61
+ const fieldNumberManager = options === null || options === void 0 ? void 0 : options.fieldNumberManager;
62
+ // Convert TypeNode to GraphQLType for mapping
63
+ const graphqlType = typeNodeToGraphQLType(typeNode, schema);
64
+ if (!graphqlType) {
65
+ return null;
66
+ }
67
+ const typeInfo = mapGraphQLTypeToProto(graphqlType, {
68
+ customScalarMappings: options === null || options === void 0 ? void 0 : options.customScalarMappings,
69
+ });
70
+ // Handle nested list wrappers
71
+ let finalTypeName = typeInfo.typeName;
72
+ let isRepeated = typeInfo.isRepeated;
73
+ if (typeInfo.requiresNestedWrapper && (options === null || options === void 0 ? void 0 : options.ensureNestedListWrapper)) {
74
+ // Create wrapper message and use its name
75
+ finalTypeName = options.ensureNestedListWrapper(graphqlType);
76
+ isRepeated = false; // Wrapper handles the repetition
77
+ }
78
+ // Get field number - check if already assigned from reconciliation
79
+ const existingFieldNumber = fieldNumberManager === null || fieldNumberManager === void 0 ? void 0 : fieldNumberManager.getFieldNumber(messageName, protoFieldName);
80
+ let fieldNumber;
81
+ if (existingFieldNumber !== undefined) {
82
+ // Use existing field number from reconciliation
83
+ fieldNumber = existingFieldNumber;
84
+ }
85
+ else if (fieldNumberManager) {
86
+ // Get next field number and assign it
87
+ fieldNumber = fieldNumberManager.getNextFieldNumber(messageName);
88
+ fieldNumberManager.assignFieldNumber(messageName, protoFieldName, fieldNumber);
89
+ }
90
+ else {
91
+ // No field number manager, use default
92
+ fieldNumber = defaultFieldNumber;
93
+ }
94
+ const field = new protobuf.Field(protoFieldName, fieldNumber, finalTypeName);
95
+ if (isRepeated) {
96
+ field.repeated = true;
97
+ }
98
+ return field;
99
+ }
100
+ /**
101
+ * Builds an input object message type from a GraphQL input object type
102
+ *
103
+ * @param inputType - The GraphQL input object type
104
+ * @param options - Optional configuration
105
+ * @returns A protobuf Type object
106
+ */
107
+ export function buildInputObjectMessage(inputType, options) {
108
+ const message = new protobuf.Type(inputType.name);
109
+ const fieldNumberManager = options === null || options === void 0 ? void 0 : options.fieldNumberManager;
110
+ const fields = inputType.getFields();
111
+ // Collect all field names
112
+ const fieldNames = Object.keys(fields).map((name) => graphqlFieldToProtoField(name));
113
+ // Reconcile field order using lock manager if available
114
+ let orderedFieldNames = fieldNames;
115
+ if (fieldNumberManager && 'reconcileFieldOrder' in fieldNumberManager) {
116
+ orderedFieldNames = fieldNumberManager.reconcileFieldOrder(message.name, fieldNames);
117
+ }
118
+ // Create a map for quick lookup
119
+ const fieldMap = new Map();
120
+ for (const [fieldName, inputField] of Object.entries(fields)) {
121
+ const protoFieldName = graphqlFieldToProtoField(fieldName);
122
+ fieldMap.set(protoFieldName, inputField);
123
+ }
124
+ // Pre-assign field numbers from lock data if available
125
+ assignFieldNumbersFromLockData(message.name, orderedFieldNames, fieldNumberManager);
126
+ // Process fields in reconciled order
127
+ for (const protoFieldName of orderedFieldNames) {
128
+ const inputField = fieldMap.get(protoFieldName);
129
+ if (!inputField)
130
+ continue;
131
+ const typeInfo = mapGraphQLTypeToProto(inputField.type, {
132
+ customScalarMappings: options === null || options === void 0 ? void 0 : options.customScalarMappings,
133
+ });
134
+ // Handle nested list wrappers
135
+ let finalTypeName = typeInfo.typeName;
136
+ let isRepeated = typeInfo.isRepeated;
137
+ if (typeInfo.requiresNestedWrapper && (options === null || options === void 0 ? void 0 : options.ensureNestedListWrapper)) {
138
+ // Create wrapper message and use its name
139
+ finalTypeName = options.ensureNestedListWrapper(inputField.type);
140
+ isRepeated = false; // Wrapper handles the repetition
141
+ }
142
+ // Get field number - check if already assigned from reconciliation
143
+ let fieldNumber = fieldNumberManager === null || fieldNumberManager === void 0 ? void 0 : fieldNumberManager.getFieldNumber(message.name, protoFieldName);
144
+ if (fieldNumber === undefined && fieldNumberManager) {
145
+ fieldNumber = fieldNumberManager.getNextFieldNumber(message.name);
146
+ fieldNumberManager.assignFieldNumber(message.name, protoFieldName, fieldNumber);
147
+ }
148
+ else if (fieldNumber === undefined) {
149
+ fieldNumber = orderedFieldNames.indexOf(protoFieldName) + 1;
150
+ }
151
+ const field = new protobuf.Field(protoFieldName, fieldNumber, finalTypeName);
152
+ if (isRepeated) {
153
+ field.repeated = true;
154
+ }
155
+ if ((options === null || options === void 0 ? void 0 : options.includeComments) && inputField.description) {
156
+ field.comment = inputField.description;
157
+ }
158
+ message.add(field);
159
+ }
160
+ return message;
161
+ }
162
+ /**
163
+ * Builds an enum type from a GraphQL enum type
164
+ *
165
+ * @param enumType - The GraphQL enum type
166
+ * @param options - Optional configuration
167
+ * @returns A protobuf Enum object
168
+ */
169
+ export function buildEnumType(enumType, options) {
170
+ const protoEnum = new protobuf.Enum(enumType.name);
171
+ // Proto3 requires the first enum value to be 0 (unspecified)
172
+ // Use prefixed UNSPECIFIED to avoid collisions when multiple enums are in the same scope
173
+ const unspecifiedValue = createEnumUnspecifiedValue(enumType.name);
174
+ protoEnum.add(unspecifiedValue, 0);
175
+ let enumNumber = 1;
176
+ const enumValues = enumType.getValues();
177
+ for (const enumValue of enumValues) {
178
+ // Prefix enum values with the enum type name to avoid collisions
179
+ const protoEnumValue = graphqlEnumValueToProtoEnumValue(enumType.name, enumValue.name);
180
+ protoEnum.add(protoEnumValue, enumNumber);
181
+ // Note: protobufjs doesn't have direct comment support for enum values
182
+ // In a full implementation, you'd track these separately for text generation
183
+ enumNumber++;
184
+ }
185
+ return protoEnum;
186
+ }
187
+ /**
188
+ * Helper to convert a GraphQL TypeNode to a GraphQLType
189
+ * Uses GraphQL's built-in typeFromAST to properly handle NonNull and List wrappers
190
+ */
191
+ function typeNodeToGraphQLType(typeNode, schema) {
192
+ return typeFromAST(schema, typeNode);
193
+ }
194
+ //# sourceMappingURL=request-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-builder.js","sourceRoot":"","sources":["../../../src/operations/request-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { GraphQLType } from 'graphql';
2
+ /**
3
+ * Represents the proto type information for a GraphQL type
4
+ */
5
+ export interface ProtoTypeInfo {
6
+ /** The proto type name */
7
+ typeName: string;
8
+ /** Whether the field should be repeated (for lists) */
9
+ isRepeated: boolean;
10
+ /** Whether this is a wrapper type */
11
+ isWrapper: boolean;
12
+ /** Whether this is a scalar type */
13
+ isScalar: boolean;
14
+ /** Whether this requires a nested list wrapper message */
15
+ requiresNestedWrapper?: boolean;
16
+ /** The nesting level for nested lists (e.g., 2 for [[String]]) */
17
+ nestingLevel?: number;
18
+ }
19
+ /**
20
+ * Options for mapping GraphQL types to Proto types
21
+ */
22
+ export interface TypeMapperOptions {
23
+ /** Custom scalar type mappings (scalar name -> proto type) */
24
+ customScalarMappings?: Record<string, string>;
25
+ /** Whether to use wrapper types for nullable scalars (default: true) */
26
+ useWrapperTypes?: boolean;
27
+ }
28
+ /**
29
+ * Maps a GraphQL type to its Protocol Buffer type representation
30
+ *
31
+ * @param type - The GraphQL type to map
32
+ * @param options - Optional type mapping configuration
33
+ * @returns Proto type information including type name, repeated flag, etc.
34
+ */
35
+ export declare function mapGraphQLTypeToProto(type: GraphQLType, options?: TypeMapperOptions): ProtoTypeInfo;
36
+ /**
37
+ * Gets the Protocol Buffer type name for a GraphQL type
38
+ *
39
+ * @param type - The GraphQL type
40
+ * @param options - Optional type mapping configuration
41
+ * @returns The proto type name as a string
42
+ */
43
+ export declare function getProtoTypeName(type: GraphQLType, options?: TypeMapperOptions): string;
44
+ /**
45
+ * Checks if a GraphQL type is a scalar type
46
+ *
47
+ * @param type - The GraphQL type to check
48
+ * @returns True if the type is a scalar
49
+ */
50
+ export declare function isGraphQLScalarType(type: GraphQLType): boolean;
51
+ /**
52
+ * Checks if a GraphQL type requires a wrapper type in proto
53
+ *
54
+ * @param type - The GraphQL type to check
55
+ * @param options - Optional type mapping configuration
56
+ * @returns True if the type needs a wrapper
57
+ */
58
+ export declare function requiresWrapperType(type: GraphQLType, options?: TypeMapperOptions): boolean;
59
+ /**
60
+ * Gets the list of required proto imports based on the types used
61
+ *
62
+ * @param types - Array of GraphQL types that will be mapped
63
+ * @param options - Optional type mapping configuration
64
+ * @returns Array of import statements needed
65
+ */
66
+ export declare function getRequiredImports(types: GraphQLType[], options?: TypeMapperOptions): string[];
@@ -0,0 +1,236 @@
1
+ import { isScalarType, isEnumType, isObjectType, isInterfaceType, isUnionType, isInputObjectType, isListType, isNonNullType, getNamedType, } from 'graphql';
2
+ import { unwrapNonNullType, isNestedListType, calculateNestingLevel } from './list-type-utils.js';
3
+ /**
4
+ * Maps GraphQL scalar types to Protocol Buffer types
5
+ */
6
+ const SCALAR_TYPE_MAP = {
7
+ ID: 'string',
8
+ String: 'string',
9
+ Int: 'int32',
10
+ Float: 'double',
11
+ Boolean: 'bool',
12
+ };
13
+ /**
14
+ * Maps GraphQL scalar types to Protocol Buffer wrapper types for nullable fields
15
+ */
16
+ const SCALAR_WRAPPER_TYPE_MAP = {
17
+ ID: 'google.protobuf.StringValue',
18
+ String: 'google.protobuf.StringValue',
19
+ Int: 'google.protobuf.Int32Value',
20
+ Float: 'google.protobuf.DoubleValue',
21
+ Boolean: 'google.protobuf.BoolValue',
22
+ };
23
+ /**
24
+ * Maps a GraphQL type to its Protocol Buffer type representation
25
+ *
26
+ * @param type - The GraphQL type to map
27
+ * @param options - Optional type mapping configuration
28
+ * @returns Proto type information including type name, repeated flag, etc.
29
+ */
30
+ export function mapGraphQLTypeToProto(type, options) {
31
+ var _a, _b;
32
+ const useWrapperTypes = (_a = options === null || options === void 0 ? void 0 : options.useWrapperTypes) !== null && _a !== void 0 ? _a : true;
33
+ const customScalarMappings = (_b = options === null || options === void 0 ? void 0 : options.customScalarMappings) !== null && _b !== void 0 ? _b : {};
34
+ // Check for nested lists first (before handling non-null)
35
+ if (isListType(type) || (isNonNullType(type) && isListType(type.ofType))) {
36
+ return handleListType(type, options);
37
+ }
38
+ // Handle non-null types
39
+ if (isNonNullType(type)) {
40
+ const innerType = type.ofType;
41
+ const innerInfo = mapGraphQLTypeToProto(innerType, options);
42
+ // For non-null scalars, we don't use wrapper types
43
+ if (isScalarType(getNamedType(innerType))) {
44
+ const namedType = getNamedType(innerType);
45
+ const scalarName = namedType.name;
46
+ // Check custom mappings first
47
+ if (customScalarMappings[scalarName]) {
48
+ return {
49
+ typeName: customScalarMappings[scalarName],
50
+ isRepeated: innerInfo.isRepeated,
51
+ isWrapper: false,
52
+ isScalar: true,
53
+ };
54
+ }
55
+ // Use direct scalar type for non-null fields
56
+ if (SCALAR_TYPE_MAP[scalarName]) {
57
+ return {
58
+ typeName: SCALAR_TYPE_MAP[scalarName],
59
+ isRepeated: innerInfo.isRepeated,
60
+ isWrapper: false,
61
+ isScalar: true,
62
+ };
63
+ }
64
+ }
65
+ return innerInfo;
66
+ }
67
+ // Get the named type
68
+ const namedType = getNamedType(type);
69
+ // Handle scalar types
70
+ if (isScalarType(namedType)) {
71
+ const scalarName = namedType.name;
72
+ // Check custom mappings first
73
+ if (customScalarMappings[scalarName]) {
74
+ return {
75
+ typeName: customScalarMappings[scalarName],
76
+ isRepeated: false,
77
+ isWrapper: false,
78
+ isScalar: true,
79
+ };
80
+ }
81
+ // Use wrapper types for nullable scalars
82
+ if (useWrapperTypes && SCALAR_WRAPPER_TYPE_MAP[scalarName]) {
83
+ return {
84
+ typeName: SCALAR_WRAPPER_TYPE_MAP[scalarName],
85
+ isRepeated: false,
86
+ isWrapper: true,
87
+ isScalar: true,
88
+ };
89
+ }
90
+ // Fallback to direct mapping
91
+ const protoType = SCALAR_TYPE_MAP[scalarName] || 'string';
92
+ return {
93
+ typeName: protoType,
94
+ isRepeated: false,
95
+ isWrapper: false,
96
+ isScalar: true,
97
+ };
98
+ }
99
+ // Handle enum types
100
+ if (isEnumType(namedType)) {
101
+ return {
102
+ typeName: namedType.name,
103
+ isRepeated: false,
104
+ isWrapper: false,
105
+ isScalar: false,
106
+ };
107
+ }
108
+ // Handle input object types
109
+ if (isInputObjectType(namedType)) {
110
+ return {
111
+ typeName: namedType.name,
112
+ isRepeated: false,
113
+ isWrapper: false,
114
+ isScalar: false,
115
+ };
116
+ }
117
+ // Handle object, interface, and union types
118
+ if (isObjectType(namedType) || isInterfaceType(namedType) || isUnionType(namedType)) {
119
+ return {
120
+ typeName: namedType.name,
121
+ isRepeated: false,
122
+ isWrapper: false,
123
+ isScalar: false,
124
+ };
125
+ }
126
+ // Fallback for unknown types
127
+ return {
128
+ typeName: 'string',
129
+ isRepeated: false,
130
+ isWrapper: false,
131
+ isScalar: true,
132
+ };
133
+ }
134
+ /**
135
+ * Handles GraphQL list types, including nested lists
136
+ * Similar to sdl-to-proto-visitor.ts handleListType
137
+ */
138
+ function handleListType(graphqlType, options) {
139
+ const listType = unwrapNonNullType(graphqlType);
140
+ const isNullableList = !isNonNullType(graphqlType);
141
+ // Only check for nested lists if we have a list type
142
+ if (!isListType(listType)) {
143
+ // This shouldn't happen, but handle gracefully
144
+ return mapGraphQLTypeToProto(listType, options);
145
+ }
146
+ const isNestedList = isNestedListType(listType);
147
+ // Simple non-nullable lists can use repeated fields directly
148
+ if (!isNullableList && !isNestedList) {
149
+ const baseType = getNamedType(listType);
150
+ const baseTypeInfo = mapGraphQLTypeToProto(baseType, { ...options, useWrapperTypes: false });
151
+ return {
152
+ ...baseTypeInfo,
153
+ isRepeated: true,
154
+ };
155
+ }
156
+ // Only nested lists need wrapper messages
157
+ // Single-level nullable lists use repeated + wrapper types for nullable items
158
+ if (isNestedList) {
159
+ const baseType = getNamedType(listType);
160
+ const nestingLevel = calculateNestingLevel(listType);
161
+ // Generate wrapper message name
162
+ const wrapperName = `${'ListOf'.repeat(nestingLevel)}${baseType.name}`;
163
+ // For nested lists, never use repeated at field level to preserve nullability
164
+ return {
165
+ typeName: wrapperName,
166
+ isRepeated: false,
167
+ isWrapper: false,
168
+ isScalar: false,
169
+ requiresNestedWrapper: true,
170
+ nestingLevel: nestingLevel,
171
+ };
172
+ }
173
+ // Single-level nullable lists: [String], [String!], etc.
174
+ // Use repeated with appropriate item type (wrapper type for nullable items)
175
+ if (!isListType(listType)) {
176
+ // Safety check - shouldn't happen
177
+ return mapGraphQLTypeToProto(listType, options);
178
+ }
179
+ const itemType = listType.ofType;
180
+ const itemTypeInfo = mapGraphQLTypeToProto(itemType, options);
181
+ return {
182
+ typeName: itemTypeInfo.typeName,
183
+ isRepeated: true,
184
+ isWrapper: itemTypeInfo.isWrapper,
185
+ isScalar: itemTypeInfo.isScalar,
186
+ };
187
+ }
188
+ /**
189
+ * Gets the Protocol Buffer type name for a GraphQL type
190
+ *
191
+ * @param type - The GraphQL type
192
+ * @param options - Optional type mapping configuration
193
+ * @returns The proto type name as a string
194
+ */
195
+ export function getProtoTypeName(type, options) {
196
+ const typeInfo = mapGraphQLTypeToProto(type, options);
197
+ return typeInfo.typeName;
198
+ }
199
+ /**
200
+ * Checks if a GraphQL type is a scalar type
201
+ *
202
+ * @param type - The GraphQL type to check
203
+ * @returns True if the type is a scalar
204
+ */
205
+ export function isGraphQLScalarType(type) {
206
+ return isScalarType(getNamedType(type));
207
+ }
208
+ /**
209
+ * Checks if a GraphQL type requires a wrapper type in proto
210
+ *
211
+ * @param type - The GraphQL type to check
212
+ * @param options - Optional type mapping configuration
213
+ * @returns True if the type needs a wrapper
214
+ */
215
+ export function requiresWrapperType(type, options) {
216
+ const typeInfo = mapGraphQLTypeToProto(type, options);
217
+ return typeInfo.isWrapper;
218
+ }
219
+ /**
220
+ * Gets the list of required proto imports based on the types used
221
+ *
222
+ * @param types - Array of GraphQL types that will be mapped
223
+ * @param options - Optional type mapping configuration
224
+ * @returns Array of import statements needed
225
+ */
226
+ export function getRequiredImports(types, options) {
227
+ const imports = new Set();
228
+ for (const type of types) {
229
+ const typeInfo = mapGraphQLTypeToProto(type, options);
230
+ if (typeInfo.isWrapper) {
231
+ imports.add('google/protobuf/wrappers.proto');
232
+ }
233
+ }
234
+ return Array.from(imports);
235
+ }
236
+ //# sourceMappingURL=type-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-mapper.js","sourceRoot":"","sources":["../../../src/operations/type-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Options for Protocol Buffer file generation
3
+ */
4
+ export interface ProtoOptions {
5
+ goPackage?: string;
6
+ javaPackage?: string;
7
+ javaOuterClassname?: string;
8
+ javaMultipleFiles?: boolean;
9
+ csharpNamespace?: string;
10
+ rubyPackage?: string;
11
+ phpNamespace?: string;
12
+ phpMetadataNamespace?: string;
13
+ objcClassPrefix?: string;
14
+ swiftPrefix?: string;
15
+ }
16
+ /**
17
+ * Builds an array of proto option statements from the provided options
18
+ *
19
+ * @param options - The proto options to convert to statements
20
+ * @param packageName - Optional package name for generating default go_package
21
+ * @returns Array of proto option statements (e.g., 'option go_package = "...";')
22
+ */
23
+ export declare function buildProtoOptions(options: ProtoOptions, packageName?: string): string[];
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Builds an array of proto option statements from the provided options
3
+ *
4
+ * @param options - The proto options to convert to statements
5
+ * @param packageName - Optional package name for generating default go_package
6
+ * @returns Array of proto option statements (e.g., 'option go_package = "...";')
7
+ */
8
+ export function buildProtoOptions(options, packageName) {
9
+ const optionStatements = [];
10
+ if (options.goPackage && options.goPackage !== '') {
11
+ // Generate default go_package if not provided
12
+ const defaultGoPackage = packageName ? `cosmo/pkg/proto/${packageName};${packageName.replace('.', '')}` : undefined;
13
+ const goPackageOption = options.goPackage || defaultGoPackage;
14
+ optionStatements.push(`option go_package = "${goPackageOption}";`);
15
+ }
16
+ if (options.javaPackage) {
17
+ optionStatements.push(`option java_package = "${options.javaPackage}";`);
18
+ }
19
+ if (options.javaOuterClassname) {
20
+ optionStatements.push(`option java_outer_classname = "${options.javaOuterClassname}";`);
21
+ }
22
+ if (options.javaMultipleFiles) {
23
+ optionStatements.push(`option java_multiple_files = true;`);
24
+ }
25
+ if (options.csharpNamespace) {
26
+ optionStatements.push(`option csharp_namespace = "${options.csharpNamespace}";`);
27
+ }
28
+ if (options.rubyPackage) {
29
+ optionStatements.push(`option ruby_package = "${options.rubyPackage}";`);
30
+ }
31
+ if (options.phpNamespace) {
32
+ optionStatements.push(`option php_namespace = "${options.phpNamespace}";`);
33
+ }
34
+ if (options.phpMetadataNamespace) {
35
+ optionStatements.push(`option php_metadata_namespace = "${options.phpMetadataNamespace}";`);
36
+ }
37
+ if (options.objcClassPrefix) {
38
+ optionStatements.push(`option objc_class_prefix = "${options.objcClassPrefix}";`);
39
+ }
40
+ if (options.swiftPrefix) {
41
+ optionStatements.push(`option swift_prefix = "${options.swiftPrefix}";`);
42
+ }
43
+ return optionStatements;
44
+ }
45
+ //# sourceMappingURL=proto-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proto-options.js","sourceRoot":"","sources":["../../src/proto-options.ts"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAqB,EAAE,WAAoB;IAC3E,MAAM,gBAAgB,GAAa,EAAE,CAAC;IAEtC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;QAClD,8CAA8C;QAC9C,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,CAAC,mBAAmB,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACpH,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;QAC9D,gBAAgB,CAAC,IAAI,CAAC,wBAAwB,eAAe,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,gBAAgB,CAAC,IAAI,CAAC,kCAAkC,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,gBAAgB,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,gBAAgB,CAAC,IAAI,CAAC,8BAA8B,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACjC,gBAAgB,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,oBAAoB,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,gBAAgB,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,gBAAgB,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -1,9 +1,10 @@
1
1
  import { GraphQLSchema } from 'graphql';
2
2
  import { ProtoLock } from './proto-lock.js';
3
+ import { type ProtoOptions } from './proto-options.js';
3
4
  /**
4
5
  * Options for GraphQLToProtoTextVisitor
5
6
  */
6
- export interface GraphQLToProtoTextVisitorOptions {
7
+ export interface GraphQLToProtoTextVisitorOptions extends ProtoOptions {
7
8
  serviceName?: string;
8
9
  packageName?: string;
9
10
  lockData?: ProtoLock;
@@ -363,19 +364,6 @@ export declare class GraphQLToProtoTextVisitor {
363
364
  * @returns ProtoType object containing the type name and whether it should be repeated
364
365
  */
365
366
  private handleListType;
366
- /**
367
- * Unwraps a GraphQL type from a GraphQLNonNull type
368
- */
369
- private unwrapNonNullType;
370
- /**
371
- * Checks if a GraphQL list type contains nested lists
372
- * Type guard that narrows the input type when nested lists are detected
373
- */
374
- private isNestedListType;
375
- /**
376
- * Calculates the nesting level of a GraphQL list type
377
- */
378
- private calculateNestingLevel;
379
367
  /**
380
368
  * Creates wrapper messages for nullable or nested GraphQL lists.
381
369
  *