diff --git a/integration/avoid-import-conflicts/simple.ts b/integration/avoid-import-conflicts/simple.ts index 171c0456b..a108d960e 100644 --- a/integration/avoid-import-conflicts/simple.ts +++ b/integration/avoid-import-conflicts/simple.ts @@ -43,8 +43,9 @@ export function simpleEnumToJSON(object: SimpleEnum): string { return 'LOCAL_FOO'; case SimpleEnum.LOCAL_BAR: return 'LOCAL_BAR'; + case SimpleEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/avoid-import-conflicts/simple2.ts b/integration/avoid-import-conflicts/simple2.ts index 19efeba9a..d8d1807b2 100644 --- a/integration/avoid-import-conflicts/simple2.ts +++ b/integration/avoid-import-conflicts/simple2.ts @@ -37,8 +37,9 @@ export function simpleEnumToJSON(object: SimpleEnum): string { return 'IMPORT_FOO'; case SimpleEnum.IMPORT_BAR: return 'IMPORT_BAR'; + case SimpleEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/const-enum/const-enum.ts b/integration/const-enum/const-enum.ts index 64cb6b6fc..d7824c589 100644 --- a/integration/const-enum/const-enum.ts +++ b/integration/const-enum/const-enum.ts @@ -48,8 +48,9 @@ export function dividerData_DividerTypeToJSON(object: DividerData_DividerType): return 'DASHED'; case DividerData_DividerType.DOTTED: return 'DOTTED'; + case DividerData_DividerType.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -63,8 +64,9 @@ export function dividerData_DividerTypeToNumber(object: DividerData_DividerType) return 2; case DividerData_DividerType.DOTTED: return 3; + case DividerData_DividerType.UNRECOGNIZED: default: - return 0; + return -1; } } diff --git a/integration/enums-as-literals-with-string-enums/enums-as-literals-with-string-enums.ts b/integration/enums-as-literals-with-string-enums/enums-as-literals-with-string-enums.ts index 1bcc81d48..9fea70268 100644 --- a/integration/enums-as-literals-with-string-enums/enums-as-literals-with-string-enums.ts +++ b/integration/enums-as-literals-with-string-enums/enums-as-literals-with-string-enums.ts @@ -49,8 +49,9 @@ export function dividerData_DividerTypeToJSON(object: DividerData_DividerType): return 'DASHED'; case DividerData_DividerType.DOTTED: return 'DOTTED'; + case DividerData_DividerType.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -64,8 +65,9 @@ export function dividerData_DividerTypeToNumber(object: DividerData_DividerType) return 2; case DividerData_DividerType.DOTTED: return 3; + case DividerData_DividerType.UNRECOGNIZED: default: - return 0; + return -1; } } diff --git a/integration/enums-as-literals/enums-as-literals.ts b/integration/enums-as-literals/enums-as-literals.ts index 00373e612..c3d27c92e 100644 --- a/integration/enums-as-literals/enums-as-literals.ts +++ b/integration/enums-as-literals/enums-as-literals.ts @@ -49,8 +49,9 @@ export function dividerData_DividerTypeToJSON(object: DividerData_DividerType): return 'DASHED'; case DividerData_DividerType.DOTTED: return 'DOTTED'; + case DividerData_DividerType.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/file-suffix/child.pb.ts b/integration/file-suffix/child.pb.ts index 22c1b14d9..ae0e1607c 100644 --- a/integration/file-suffix/child.pb.ts +++ b/integration/file-suffix/child.pb.ts @@ -31,8 +31,9 @@ export function childEnumToJSON(object: ChildEnum): string { return 'DEFAULT'; case ChildEnum.FOO: return 'FOO'; + case ChildEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/grpc-js/google/protobuf/struct.ts b/integration/grpc-js/google/protobuf/struct.ts index 27c84f70c..df4825442 100644 --- a/integration/grpc-js/google/protobuf/struct.ts +++ b/integration/grpc-js/google/protobuf/struct.ts @@ -32,8 +32,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/grpc-web-go-server/example.ts b/integration/grpc-web-go-server/example.ts index 32877979a..aa5eaf406 100644 --- a/integration/grpc-web-go-server/example.ts +++ b/integration/grpc-web-go-server/example.ts @@ -50,8 +50,9 @@ export function dashFlash_TypeToJSON(object: DashFlash_Type): string { return 'Warn'; case DashFlash_Type.Error: return 'Error'; + case DashFlash_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/grpc-web-no-streaming-observable/example.ts b/integration/grpc-web-no-streaming-observable/example.ts index 4ba0524e9..7f0a75273 100644 --- a/integration/grpc-web-no-streaming-observable/example.ts +++ b/integration/grpc-web-no-streaming-observable/example.ts @@ -52,8 +52,9 @@ export function dashFlash_TypeToJSON(object: DashFlash_Type): string { return 'Warn'; case DashFlash_Type.Error: return 'Error'; + case DashFlash_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/grpc-web-no-streaming/example.ts b/integration/grpc-web-no-streaming/example.ts index 52c629788..b75f246e5 100644 --- a/integration/grpc-web-no-streaming/example.ts +++ b/integration/grpc-web-no-streaming/example.ts @@ -50,8 +50,9 @@ export function dashFlash_TypeToJSON(object: DashFlash_Type): string { return 'Warn'; case DashFlash_Type.Error: return 'Error'; + case DashFlash_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/grpc-web/example.ts b/integration/grpc-web/example.ts index 33a159660..da8dd9581 100644 --- a/integration/grpc-web/example.ts +++ b/integration/grpc-web/example.ts @@ -52,8 +52,9 @@ export function dashFlash_TypeToJSON(object: DashFlash_Type): string { return 'Warn'; case DashFlash_Type.Error: return 'Error'; + case DashFlash_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/nice-grpc/google/protobuf/struct.ts b/integration/nice-grpc/google/protobuf/struct.ts index 3e1c597ad..29a16fca1 100644 --- a/integration/nice-grpc/google/protobuf/struct.ts +++ b/integration/nice-grpc/google/protobuf/struct.ts @@ -32,8 +32,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/oneof-properties/oneof.ts b/integration/oneof-properties/oneof.ts index d937ae5e5..4bf89b448 100644 --- a/integration/oneof-properties/oneof.ts +++ b/integration/oneof-properties/oneof.ts @@ -63,8 +63,9 @@ export function pleaseChoose_StateEnumToJSON(object: PleaseChoose_StateEnum): st return 'ON'; case PleaseChoose_StateEnum.OFF: return 'OFF'; + case PleaseChoose_StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/oneof-unions/google/protobuf/struct.ts b/integration/oneof-unions/google/protobuf/struct.ts index 33212f88a..5bdacf388 100644 --- a/integration/oneof-unions/google/protobuf/struct.ts +++ b/integration/oneof-unions/google/protobuf/struct.ts @@ -32,8 +32,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/oneof-unions/oneof.ts b/integration/oneof-unions/oneof.ts index c76d68a4d..186457422 100644 --- a/integration/oneof-unions/oneof.ts +++ b/integration/oneof-unions/oneof.ts @@ -56,8 +56,9 @@ export function pleaseChoose_StateEnumToJSON(object: PleaseChoose_StateEnum): st return 'ON'; case PleaseChoose_StateEnum.OFF: return 'OFF'; + case PleaseChoose_StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/simple-optionals/simple.ts b/integration/simple-optionals/simple.ts index 1f18885b8..cd82b257d 100644 --- a/integration/simple-optionals/simple.ts +++ b/integration/simple-optionals/simple.ts @@ -45,8 +45,9 @@ export function stateEnumToJSON(object: StateEnum): string { return 'ON'; case StateEnum.OFF: return 'OFF'; + case StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -106,8 +107,9 @@ export function child_TypeToJSON(object: Child_Type): string { return 'GOOD'; case Child_Type.BAD: return 'BAD'; + case Child_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -150,8 +152,9 @@ export function nested_InnerEnumToJSON(object: Nested_InnerEnum): string { return 'GOOD'; case Nested_InnerEnum.BAD: return 'BAD'; + case Nested_InnerEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/simple-proto2/simple.ts b/integration/simple-proto2/simple.ts index 0fa06feb3..d8b9a60e0 100644 --- a/integration/simple-proto2/simple.ts +++ b/integration/simple-proto2/simple.ts @@ -31,8 +31,9 @@ export function enumWithoutZeroToJSON(object: EnumWithoutZero): string { return 'A'; case EnumWithoutZero.B: return 'B'; + case EnumWithoutZero.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/simple-prototype-defaults/simple.ts b/integration/simple-prototype-defaults/simple.ts index d1f431dfb..c62c070b7 100644 --- a/integration/simple-prototype-defaults/simple.ts +++ b/integration/simple-prototype-defaults/simple.ts @@ -46,8 +46,9 @@ export function stateEnumToJSON(object: StateEnum): string { return 'ON'; case StateEnum.OFF: return 'OFF'; + case StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -110,8 +111,9 @@ export function child_TypeToJSON(object: Child_Type): string { return 'GOOD'; case Child_Type.BAD: return 'BAD'; + case Child_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -154,8 +156,9 @@ export function nested_InnerEnumToJSON(object: Nested_InnerEnum): string { return 'GOOD'; case Nested_InnerEnum.BAD: return 'BAD'; + case Nested_InnerEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/simple-snake/simple.ts b/integration/simple-snake/simple.ts index 28d415e40..ed04acc4f 100644 --- a/integration/simple-snake/simple.ts +++ b/integration/simple-snake/simple.ts @@ -45,8 +45,9 @@ export function stateEnumToJSON(object: StateEnum): string { return 'ON'; case StateEnum.OFF: return 'OFF'; + case StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -106,8 +107,9 @@ export function child_TypeToJSON(object: Child_Type): string { return 'GOOD'; case Child_Type.BAD: return 'BAD'; + case Child_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -150,8 +152,9 @@ export function nested_InnerEnumToJSON(object: Nested_InnerEnum): string { return 'GOOD'; case Nested_InnerEnum.BAD: return 'BAD'; + case Nested_InnerEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/simple-string-enums/google/protobuf/struct.ts b/integration/simple-string-enums/google/protobuf/struct.ts index 90af94eab..98852c543 100644 --- a/integration/simple-string-enums/google/protobuf/struct.ts +++ b/integration/simple-string-enums/google/protobuf/struct.ts @@ -32,8 +32,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -41,8 +42,9 @@ export function nullValueToNumber(object: NullValue): number { switch (object) { case NullValue.NULL_VALUE: return 0; + case NullValue.UNRECOGNIZED: default: - return 0; + return -1; } } diff --git a/integration/simple-string-enums/simple.ts b/integration/simple-string-enums/simple.ts index b1c9f0e2c..42a34bf21 100644 --- a/integration/simple-string-enums/simple.ts +++ b/integration/simple-string-enums/simple.ts @@ -38,8 +38,9 @@ export function stateEnumToJSON(object: StateEnum): string { return 'ON'; case StateEnum.OFF: return 'OFF'; + case StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -51,8 +52,9 @@ export function stateEnumToNumber(object: StateEnum): number { return 2; case StateEnum.OFF: return 3; + case StateEnum.UNRECOGNIZED: default: - return 0; + return -1; } } diff --git a/integration/simple-unrecognized-enum/simple.ts b/integration/simple-unrecognized-enum/simple.ts index 303adbb3a..3dc4afc12 100644 --- a/integration/simple-unrecognized-enum/simple.ts +++ b/integration/simple-unrecognized-enum/simple.ts @@ -43,7 +43,7 @@ export function stateEnumToJSON(object: StateEnum): string { case StateEnum.OFF: return 'OFF'; default: - return 'UNKNOWN'; + throw new globalThis.Error('Unrecognized enum value ' + object + ' for enum StateEnum'); } } @@ -101,7 +101,7 @@ export function child_TypeToJSON(object: Child_Type): string { case Child_Type.BAD: return 'BAD'; default: - return 'UNKNOWN'; + throw new globalThis.Error('Unrecognized enum value ' + object + ' for enum Child_Type'); } } @@ -142,7 +142,7 @@ export function nested_InnerEnumToJSON(object: Nested_InnerEnum): string { case Nested_InnerEnum.BAD: return 'BAD'; default: - return 'UNKNOWN'; + throw new globalThis.Error('Unrecognized enum value ' + object + ' for enum Nested_InnerEnum'); } } diff --git a/integration/simple/simple.ts b/integration/simple/simple.ts index 278506635..cf4b12fb7 100644 --- a/integration/simple/simple.ts +++ b/integration/simple/simple.ts @@ -46,8 +46,9 @@ export function stateEnumToJSON(object: StateEnum): string { return 'ON'; case StateEnum.OFF: return 'OFF'; + case StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -110,8 +111,9 @@ export function child_TypeToJSON(object: Child_Type): string { return 'GOOD'; case Child_Type.BAD: return 'BAD'; + case Child_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -154,8 +156,9 @@ export function nested_InnerEnumToJSON(object: Nested_InnerEnum): string { return 'GOOD'; case Nested_InnerEnum.BAD: return 'BAD'; + case Nested_InnerEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/struct/google/protobuf/struct.ts b/integration/struct/google/protobuf/struct.ts index 27c84f70c..df4825442 100644 --- a/integration/struct/google/protobuf/struct.ts +++ b/integration/struct/google/protobuf/struct.ts @@ -32,8 +32,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/type-registry/google/protobuf/struct.ts b/integration/type-registry/google/protobuf/struct.ts index 361aa8936..1ae57045b 100644 --- a/integration/type-registry/google/protobuf/struct.ts +++ b/integration/type-registry/google/protobuf/struct.ts @@ -33,8 +33,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/use-optionals-all/test.ts b/integration/use-optionals-all/test.ts index 396e4ccd7..805535799 100644 --- a/integration/use-optionals-all/test.ts +++ b/integration/use-optionals-all/test.ts @@ -37,8 +37,9 @@ export function stateEnumToJSON(object: StateEnum): string { return 'ON'; case StateEnum.OFF: return 'OFF'; + case StateEnum.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/value/google/protobuf/struct.ts b/integration/value/google/protobuf/struct.ts index 27c84f70c..df4825442 100644 --- a/integration/value/google/protobuf/struct.ts +++ b/integration/value/google/protobuf/struct.ts @@ -32,8 +32,9 @@ export function nullValueToJSON(object: NullValue): string { switch (object) { case NullValue.NULL_VALUE: return 'NULL_VALUE'; + case NullValue.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/integration/vector-tile/vector_tile.ts b/integration/vector-tile/vector_tile.ts index 122834fc1..ef61a98a5 100644 --- a/integration/vector-tile/vector_tile.ts +++ b/integration/vector-tile/vector_tile.ts @@ -47,8 +47,9 @@ export function tile_GeomTypeToJSON(object: Tile_GeomType): string { return 'LINESTRING'; case Tile_GeomType.POLYGON: return 'POLYGON'; + case Tile_GeomType.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/protos/google/protobuf/compiler/plugin.ts b/protos/google/protobuf/compiler/plugin.ts index 756f60b02..91688ecfa 100644 --- a/protos/google/protobuf/compiler/plugin.ts +++ b/protos/google/protobuf/compiler/plugin.ts @@ -95,8 +95,9 @@ export function codeGeneratorResponse_FeatureToJSON(object: CodeGeneratorRespons return 'FEATURE_NONE'; case CodeGeneratorResponse_Feature.FEATURE_PROTO3_OPTIONAL: return 'FEATURE_PROTO3_OPTIONAL'; + case CodeGeneratorResponse_Feature.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/protos/google/protobuf/descriptor.ts b/protos/google/protobuf/descriptor.ts index 31a11b186..852014707 100644 --- a/protos/google/protobuf/descriptor.ts +++ b/protos/google/protobuf/descriptor.ts @@ -303,8 +303,9 @@ export function fieldDescriptorProto_TypeToJSON(object: FieldDescriptorProto_Typ return 'TYPE_SINT32'; case FieldDescriptorProto_Type.TYPE_SINT64: return 'TYPE_SINT64'; + case FieldDescriptorProto_Type.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -342,8 +343,9 @@ export function fieldDescriptorProto_LabelToJSON(object: FieldDescriptorProto_La return 'LABEL_REQUIRED'; case FieldDescriptorProto_Label.LABEL_REPEATED: return 'LABEL_REPEATED'; + case FieldDescriptorProto_Label.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -574,8 +576,9 @@ export function fileOptions_OptimizeModeToJSON(object: FileOptions_OptimizeMode) return 'CODE_SIZE'; case FileOptions_OptimizeMode.LITE_RUNTIME: return 'LITE_RUNTIME'; + case FileOptions_OptimizeMode.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -750,8 +753,9 @@ export function fieldOptions_CTypeToJSON(object: FieldOptions_CType): string { return 'CORD'; case FieldOptions_CType.STRING_PIECE: return 'STRING_PIECE'; + case FieldOptions_CType.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -791,8 +795,9 @@ export function fieldOptions_JSTypeToJSON(object: FieldOptions_JSType): string { return 'JS_STRING'; case FieldOptions_JSType.JS_NUMBER: return 'JS_NUMBER'; + case FieldOptions_JSType.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } @@ -895,8 +900,9 @@ export function methodOptions_IdempotencyLevelToJSON(object: MethodOptions_Idemp return 'NO_SIDE_EFFECTS'; case MethodOptions_IdempotencyLevel.IDEMPOTENT: return 'IDEMPOTENT'; + case MethodOptions_IdempotencyLevel.UNRECOGNIZED: default: - return 'UNKNOWN'; + return 'UNRECOGNIZED'; } } diff --git a/src/enums.ts b/src/enums.ts index 7cc079dbb..a1ad7620a 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -56,11 +56,11 @@ export function generateEnum( } if (options.outputJsonMethods) { chunks.push(code`\n`); - chunks.push(generateEnumToJson(fullName, enumDesc)); + chunks.push(generateEnumToJson(ctx, fullName, enumDesc)); } if (options.stringEnums && options.outputEncodeMethods) { chunks.push(code`\n`); - chunks.push(generateEnumToNumber(fullName, enumDesc)); + chunks.push(generateEnumToNumber(ctx, fullName, enumDesc)); } return joinCode(chunks, { on: '\n' }); @@ -104,7 +104,9 @@ export function generateEnumFromJson(ctx: Context, fullName: string, enumDesc: E } /** Generates a function with a big switch statement to encode our enum -> JSON. */ -export function generateEnumToJson(fullName: string, enumDesc: EnumDescriptorProto): Code { +export function generateEnumToJson(ctx: Context, fullName: string, enumDesc: EnumDescriptorProto): Code { + const { options, utils } = ctx; + const chunks: Code[] = []; const functionName = camelCase(fullName) + 'ToJSON'; @@ -114,7 +116,20 @@ export function generateEnumToJson(fullName: string, enumDesc: EnumDescriptorPro for (const valueDesc of enumDesc.value) { chunks.push(code`case ${fullName}.${valueDesc.name}: return "${valueDesc.name}";`); } - chunks.push(code`default: return "UNKNOWN";`); + + if (options.unrecognizedEnum) { + chunks.push(code` + case ${fullName}.${UNRECOGNIZED_ENUM_NAME}: + default: + return "${UNRECOGNIZED_ENUM_NAME}"; + `); + } else { + // We use globalThis to avoid conflicts on protobuf types named `Error`. + chunks.push(code` + default: + throw new ${utils.globalThis}.Error("Unrecognized enum value " + object + " for enum ${fullName}"); + `); + } chunks.push(code`}`); chunks.push(code`}`); @@ -122,7 +137,9 @@ export function generateEnumToJson(fullName: string, enumDesc: EnumDescriptorPro } /** Generates a function with a big switch statement to encode our string enum -> int value. */ -export function generateEnumToNumber(fullName: string, enumDesc: EnumDescriptorProto): Code { +export function generateEnumToNumber(ctx: Context, fullName: string, enumDesc: EnumDescriptorProto): Code { + const { options, utils } = ctx; + const chunks: Code[] = []; const functionName = camelCase(fullName) + 'ToNumber'; @@ -131,7 +148,21 @@ export function generateEnumToNumber(fullName: string, enumDesc: EnumDescriptorP for (const valueDesc of enumDesc.value) { chunks.push(code`case ${fullName}.${valueDesc.name}: return ${valueDesc.number};`); } - chunks.push(code`default: return 0;`); + + if (options.unrecognizedEnum) { + chunks.push(code` + case ${fullName}.${UNRECOGNIZED_ENUM_NAME}: + default: + return ${UNRECOGNIZED_ENUM_VALUE}; + `); + } else { + // We use globalThis to avoid conflicts on protobuf types named `Error`. + chunks.push(code` + default: + throw new ${utils.globalThis}.Error("Unrecognized enum value " + object + " for enum ${fullName}"); + `); + } + chunks.push(code`}`); chunks.push(code`}`); return joinCode(chunks, { on: '\n' });