@@ -170,7 +170,7 @@ function formatComment(formatter: TextFormatter, comment?: string | null) {
170
170
171
171
// GENERATOR FUNCTIONS
172
172
173
- function getTypeNamePermissive(fieldType: string, resolvedType: Protobuf.Type | Protobuf.Enum | null): string {
173
+ function getTypeNamePermissive(fieldType: string, resolvedType: Protobuf.Type | Protobuf.Enum | null, repeated: boolean, map: boolean ): string {
174
174
switch (fieldType) {
175
175
case 'double':
176
176
case 'float':
@@ -199,15 +199,19 @@ function getTypeNamePermissive(fieldType: string, resolvedType: Protobuf.Type |
199
199
}
200
200
const typeInterfaceName = getTypeInterfaceName(resolvedType);
201
201
if (resolvedType instanceof Protobuf.Type) {
202
- return typeInterfaceName;
202
+ if (repeated || map) {
203
+ return typeInterfaceName;
204
+ } else {
205
+ return ` $ { typeInterfaceName } | null `;
206
+ }
203
207
} else {
204
208
return ` $ { typeInterfaceName} | keyof typeof ${typeInterfaceName } `;
205
209
}
206
210
}
207
211
}
208
212
209
213
function getFieldTypePermissive(field: Protobuf.FieldBase): string {
210
- const valueType = getTypeNamePermissive(field.type, field.resolvedType);
214
+ const valueType = getTypeNamePermissive(field.type, field.resolvedType, field.repeated, field.map );
211
215
if (field instanceof Protobuf.MapField) {
212
216
const keyType = field.keyType === 'string' ? 'string' : 'number';
213
217
return ` { [ key : ${keyType } ] : ${valueType } } `;
@@ -250,7 +254,7 @@ function generatePermissiveMessageInterface(formatter: TextFormatter, messageTyp
250
254
formatter.writeLine('}');
251
255
}
252
256
253
- function getTypeNameRestricted(fieldType: string, resolvedType: Protobuf.Type | Protobuf.Enum | null, options: GeneratorOptions): string {
257
+ function getTypeNameRestricted(fieldType: string, resolvedType: Protobuf.Type | Protobuf.Enum | null, repeated: boolean, map: boolean, options: GeneratorOptions): string {
254
258
switch (fieldType) {
255
259
case 'double':
256
260
case 'float':
@@ -295,7 +299,13 @@ function getTypeNameRestricted(fieldType: string, resolvedType: Protobuf.Type |
295
299
}
296
300
const typeInterfaceName = getTypeInterfaceName(resolvedType);
297
301
if (resolvedType instanceof Protobuf.Type) {
298
- return typeInterfaceName + '__Output';
302
+ /* null is only used to represent absent message values if the defaults
303
+ * option is set, and only for non-repeated, non-map fields. */
304
+ if (options.defaults && !repeated && !map) {
305
+ return ` $ { typeInterfaceName } __Output | null `;
306
+ } else {
307
+ return ` $ { typeInterfaceName } __Output `;
308
+ }
299
309
} else {
300
310
if (options.enums == String) {
301
311
return ` keyof typeof ${typeInterfaceName } `;
@@ -307,7 +317,7 @@ function getTypeNameRestricted(fieldType: string, resolvedType: Protobuf.Type |
307
317
}
308
318
309
319
function getFieldTypeRestricted(field: Protobuf.FieldBase, options: GeneratorOptions): string {
310
- const valueType = getTypeNameRestricted(field.type, field.resolvedType, options);
320
+ const valueType = getTypeNameRestricted(field.type, field.resolvedType, field.repeated, field.map, options);
311
321
if (field instanceof Protobuf.MapField) {
312
322
const keyType = field.keyType === 'string' ? 'string' : 'number';
313
323
return ` { [ key : ${keyType } ] : $ { valueType } } `;
@@ -326,7 +336,7 @@ function generateRestrictedMessageInterface(formatter: TextFormatter, messageTyp
326
336
let optionalString = options.defaults ? '' : '?';
327
337
formatter.writeLine('export type Any__Output = AnyExtension | {');
328
338
formatter.writeLine(` type_url$ { optionalString } : string ; `);
329
- formatter.writeLine(` value$ { optionalString } : ${getTypeNameRestricted ( 'bytes' , null , options ) } ; `);
339
+ formatter.writeLine(` value$ { optionalString } : ${getTypeNameRestricted ( 'bytes' , null , false , false , options ) } ; `);
330
340
formatter.writeLine('}');
331
341
return;
332
342
}
@@ -339,19 +349,10 @@ function generateRestrictedMessageInterface(formatter: TextFormatter, messageTyp
339
349
fieldGuaranteed = false;
340
350
} else if (field.repeated) {
341
351
fieldGuaranteed = (options.defaults || options.arrays) ?? false;
342
- } else if (field.resolvedType) {
343
- if (field.resolvedType instanceof Protobuf.Enum) {
344
- fieldGuaranteed = options.defaults ?? false;
345
- } else {
346
- // Message fields can always be omitted
347
- fieldGuaranteed = false;
348
- }
352
+ } else if (field.map) {
353
+ fieldGuaranteed = (options.defaults || options.objects) ?? false;
349
354
} else {
350
- if (field.map) {
351
- fieldGuaranteed = (options.defaults || options.objects) ?? false;
352
- } else {
353
- fieldGuaranteed = options.defaults ?? false;
354
- }
355
+ fieldGuaranteed = options.defaults ?? false;
355
356
}
356
357
const optionalString = fieldGuaranteed ? '' : '?';
357
358
const repeatedString = field.repeated ? '[]' : '';
0 commit comments