UNPKG

@protobuf-ts/runtime

Version:

Runtime library for code generated by the protoc plugin "protobuf-ts"

420 lines (419 loc) 11.9 kB
import type { IMessageType } from "./message-type-contract"; import type { JsonValue } from "./json-typings"; /** * Describes a protobuf enum for runtime reflection. * * The tuple consists of: * * * [0] the protobuf type name * * The type name follows the same rules as message type names. * See `MessageInfo` for details. * * * [1] the enum object generated by Typescript * * We generate standard Typescript enums for protobuf enums. They are compiled * to lookup objects that map from numerical value to name strings and vice * versa and can also contain alias names. * * See https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings * * We use this lookup feature to when encoding / decoding JSON format. The * enum is guaranteed to have a value for 0. We generate an entry for 0 if * none was declared in .proto because we would need to support custom default * values if we didn't. * * * [2] the prefix shared by all original enum values (optional) * * If all values of a protobuf enum share a prefix, it is dropped in the * generated enum. For example, the protobuf enum `enum My { MY_FOO, MY_BAR }` * becomes the typescript enum `enum My { FOO, BAR }`. * * Because the JSON format requires the original value name, we store the * dropped prefix here, so that the JSON format implementation can restore * the original value names. */ export declare type EnumInfo = readonly [ /** * The protobuf type name of the enum */ string, /** * The enum object generated by Typescript */ { [key: number]: string; [k: string]: number | string; }, /** * The prefix shared by all original enum values */ string?]; /** * Describes a protobuf message for runtime reflection. */ export interface MessageInfo { /** * The protobuf type name of the message, including package and * parent types if present. * * If the .proto file included a `package` statement, the type name * starts with '.'. * * Examples: * 'MyNamespaceLessMessage' * '.my_package.MyMessage' * '.my_package.ParentMessage.ChildMessage' */ readonly typeName: string; /** * Simple information for each message field, in the order * of declaration in the source .proto. */ readonly fields: readonly FieldInfo[]; /** * Contains custom message options from the .proto source in JSON format. */ readonly options: { [extensionName: string]: JsonValue; }; } /** * Version of `MessageInfo` that allows the following properties * to be omitted: * - "fields": omitting means the message has no fields * - "options": omitting means the message has no options */ export declare type PartialMessageInfo = PartialPartial<MessageInfo, "fields" | "options">; declare type PartialPartial<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>; /** * Describes a field of a protobuf message for runtime * reflection. We distinguish between the following * kinds of fields: * * "scalar": string, bool, float, int32, etc. * See https://developers.google.com/protocol-buffers/docs/proto3#scalar * * "enum": field was declared with an enum type. * * "message": field was declared with a message type. * * "map": field was declared with map<K,V>. * * * Every field, regardless of it's kind, always has the following properties: * * "no": The field number of the .proto field. * "name": The original name of the .proto field. * "localName": The name of the field as used in generated code. * "jsonName": The name for JSON serialization / deserialization. * "options": Custom field options from the .proto source in JSON format. * * * Other properties: * * - Fields of kind "scalar", "enum" and "message" can have a "repeat" type. * - Fields of kind "scalar" and "enum" can have a "repeat" type. * - Fields of kind "scalar", "enum" and "message" can be member of a "oneof". * * A field can be only have one of the above properties set. * * Options for "scalar" fields: * * - 64 bit integral types can provide "L" - the JavaScript representation * type. * */ export declare type FieldInfo = fiRules<fiScalar> | fiRules<fiEnum> | fiRules<fiMessage> | fiRules<fiMap>; /** * Version of `FieldInfo` that allows the following properties * to be omitted: * - "localName", "jsonName": can be omitted if equal to lowerCamelCase(name) * - "opt": can be omitted if false * - "repeat", can be omitted if RepeatType.NO * * Use `normalizeFieldInfo()` to fill the omitted fields with * their standard values. */ export declare type PartialFieldInfo = fiPartialRules<fiScalar> | fiPartialRules<fiEnum> | fiPartialRules<fiMessage> | fiPartialRules<fiMap>; interface fiShared { /** * The field number of the .proto field. */ no: number; /** * The original name of the .proto field. */ name: string; /** * The name of the field as used in generated code. */ localName: string; /** * The name for JSON serialization / deserialization. */ jsonName: string; /** * The name of the `oneof` group, if this field belongs to one. */ oneof: string | undefined; /** * Contains custom field options from the .proto source in JSON format. */ options?: { [extensionName: string]: JsonValue; }; } interface fiScalar extends fiShared { kind: 'scalar'; /** * Scalar type of the field. */ T: ScalarType; /** * Representation of 64 bit integral types (int64, uint64, sint64, * fixed64, sfixed64). * * If this option is set for other scalar types, it is ignored. * Omitting this option is equivalent to `STRING`. */ L?: LongType; /** * Is the field repeated? */ repeat: RepeatType; /** * Is the field optional? */ opt: boolean; } interface fiMessage extends fiShared { kind: 'message'; /** * Message handler for the field. */ T: () => IMessageType<any>; /** * Is the field repeated? */ repeat: RepeatType; } interface fiEnum extends fiShared { kind: 'enum'; /** * Enum type information for the field. */ T: () => EnumInfo; /** * Is the field repeated? */ repeat: RepeatType; /** * Is the field optional? */ opt: boolean; } interface fiMap extends fiShared { kind: 'map'; /** * Map key type. * * The key_type can be any integral or string type * (so, any scalar type except for floating point * types and bytes) */ K: Exclude<ScalarType, ScalarType.FLOAT | ScalarType.DOUBLE | ScalarType.BYTES>; /** * Map value type. Can be a `ScalarType`, enum type information, * or type handler for a message. */ V: { kind: 'scalar'; T: ScalarType; L?: LongType; } | { kind: 'enum'; T: () => EnumInfo; } | { kind: 'message'; T: () => IMessageType<any>; }; } declare type fiRules<T> = Omit<T, 'oneof' | 'repeat' | 'opt'> & ({ repeat: RepeatType.NO; opt: false; oneof: undefined; } | { repeat: RepeatType.NO; opt: true; oneof: undefined; } | { repeat: RepeatType.PACKED | RepeatType.UNPACKED; opt: false; oneof: undefined; } | { repeat: RepeatType.NO; opt: false; oneof: string; }); declare type fiPartialRules<T> = Omit<T, 'jsonName' | 'localName' | 'oneof' | 'repeat' | 'opt'> & ({ localName?: string; jsonName?: string; repeat?: RepeatType.NO; opt?: false; oneof?: undefined; } | { localName?: string; jsonName?: string; repeat?: RepeatType.NO; opt: true; oneof?: undefined; } | { localName?: string; jsonName?: string; repeat: RepeatType.PACKED | RepeatType.UNPACKED; opt?: false; oneof?: undefined; } | { localName?: string; jsonName?: string; repeat?: RepeatType.NO; opt?: false; oneof: string; }); /** * Scalar value types. This is a subset of field types declared by protobuf * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE * are omitted, but the numerical values are identical. */ export declare enum ScalarType { DOUBLE = 1, FLOAT = 2, INT64 = 3, UINT64 = 4, INT32 = 5, FIXED64 = 6, FIXED32 = 7, BOOL = 8, STRING = 9, BYTES = 12, UINT32 = 13, SFIXED32 = 15, SFIXED64 = 16, SINT32 = 17, SINT64 = 18 } /** * JavaScript representation of 64 bit integral types. Equivalent to the * field option "jstype". * * By default, protobuf-ts represents 64 bit types as `bigint`. * * You can change the default behaviour by enabling the plugin parameter * `long_type_string`, which will represent 64 bit types as `string`. * * Alternatively, you can change the behaviour for individual fields * with the field option "jstype": * * ```protobuf * uint64 my_field = 1 [jstype = JS_STRING]; * uint64 other_field = 2 [jstype = JS_NUMBER]; * ``` */ export declare enum LongType { /** * Use JavaScript `bigint`. * * Field option `[jstype = JS_NORMAL]`. */ BIGINT = 0, /** * Use JavaScript `string`. * * Field option `[jstype = JS_STRING]`. */ STRING = 1, /** * Use JavaScript `number`. * * Large values will loose precision. * * Field option `[jstype = JS_NUMBER]`. */ NUMBER = 2 } /** * Protobuf 2.1.0 introduced packed repeated fields. * Setting the field option `[packed = true]` enables packing. * * In proto3, all repeated fields are packed by default. * Setting the field option `[packed = false]` disables packing. * * Packed repeated fields are encoded with a single tag, * then a length-delimiter, then the element values. * * Unpacked repeated fields are encoded with a tag and * value for each element. * * `bytes` and `string` cannot be packed. */ export declare enum RepeatType { /** * The field is not repeated. */ NO = 0, /** * The field is repeated and should be packed. * Invalid for `bytes` and `string`, they cannot be packed. */ PACKED = 1, /** * The field is repeated but should not be packed. * The only valid repeat type for repeated `bytes` and `string`. */ UNPACKED = 2 } /** * Turns PartialFieldInfo into FieldInfo. */ export declare function normalizeFieldInfo(field: PartialFieldInfo): FieldInfo; /** * Read custom field options from a generated message type. * * @deprecated use readFieldOption() */ export declare function readFieldOptions<T extends object>(messageType: MessageInfo, fieldName: string | number, extensionName: string, extensionType: IMessageType<T>): T | undefined; /** * Read a custom field option. * * ```proto * message MyMessage { * int32 my_field = 1 [(acme.field_opt) = true]; * } * ``` * * ```typescript * let val = readFieldOption(MyMessage, 'myField', 'acme.field_opt') * ``` */ export declare function readFieldOption<T extends object>(messageType: MessageInfo, fieldName: string | number, extensionName: string): JsonValue | undefined; export declare function readFieldOption<T extends object>(messageType: MessageInfo, fieldName: string | number, extensionName: string, extensionType: IMessageType<T>): T | undefined; /** * Read a custom message option. * * ```proto * message MyMessage { * option acme.message_opt = true; * } * ``` * * ```typescript * let val = readMessageOption(MyMessage, 'acme.message_opt') * ``` */ export declare function readMessageOption<T extends object>(messageType: MessageInfo, extensionName: string): JsonValue | undefined; export declare function readMessageOption<T extends object>(messageType: MessageInfo, extensionName: string, extensionType: IMessageType<T>): T | undefined; export {};