@bufbuild/protobuf 0.0.1-alpha.1

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 (146) hide show
  1. package/README.md +6 -0
  2. package/dist/cjs/binary-encoding.js +434 -0
  3. package/dist/cjs/binary-format.js +2 -0
  4. package/dist/cjs/descriptor-registry.js +518 -0
  5. package/dist/cjs/descriptor-set.js +557 -0
  6. package/dist/cjs/enum.js +2 -0
  7. package/dist/cjs/field-list.js +2 -0
  8. package/dist/cjs/field.js +40 -0
  9. package/dist/cjs/google/protobuf/any_pb.js +280 -0
  10. package/dist/cjs/google/protobuf/api_pb.js +383 -0
  11. package/dist/cjs/google/protobuf/compiler/plugin_pb.js +334 -0
  12. package/dist/cjs/google/protobuf/descriptor_pb.js +2311 -0
  13. package/dist/cjs/google/protobuf/duration_pb.js +201 -0
  14. package/dist/cjs/google/protobuf/empty_pb.js +72 -0
  15. package/dist/cjs/google/protobuf/field_mask_pb.js +347 -0
  16. package/dist/cjs/google/protobuf/source_context_pb.js +74 -0
  17. package/dist/cjs/google/protobuf/struct_pb.js +288 -0
  18. package/dist/cjs/google/protobuf/timestamp_pb.js +271 -0
  19. package/dist/cjs/google/protobuf/type_pb.js +613 -0
  20. package/dist/cjs/google/protobuf/wrappers_pb.js +658 -0
  21. package/dist/cjs/google/varint.js +280 -0
  22. package/dist/cjs/index.js +148 -0
  23. package/dist/cjs/json-format.js +2 -0
  24. package/dist/cjs/message-type.js +2 -0
  25. package/dist/cjs/message.js +98 -0
  26. package/dist/cjs/private/assert.js +52 -0
  27. package/dist/cjs/private/base64.js +118 -0
  28. package/dist/cjs/private/binary-format-common.js +253 -0
  29. package/dist/cjs/private/binary-format-proto2.js +120 -0
  30. package/dist/cjs/private/binary-format-proto3.js +102 -0
  31. package/dist/cjs/private/enum.js +70 -0
  32. package/dist/cjs/private/field-list.js +62 -0
  33. package/dist/cjs/private/field-wrapper.js +25 -0
  34. package/dist/cjs/private/field.js +34 -0
  35. package/dist/cjs/private/json-format-common.js +482 -0
  36. package/dist/cjs/private/json-format-proto2.js +100 -0
  37. package/dist/cjs/private/json-format-proto3.js +103 -0
  38. package/dist/cjs/private/message-type.js +37 -0
  39. package/dist/cjs/private/names.js +101 -0
  40. package/dist/cjs/private/options-map.js +2 -0
  41. package/dist/cjs/private/proto-runtime.js +24 -0
  42. package/dist/cjs/private/scalars.js +138 -0
  43. package/dist/cjs/private/util-common.js +229 -0
  44. package/dist/cjs/private/util.js +2 -0
  45. package/dist/cjs/proto-int64.js +121 -0
  46. package/dist/cjs/proto2.js +86 -0
  47. package/dist/cjs/proto3.js +99 -0
  48. package/dist/cjs/service-type.js +43 -0
  49. package/dist/cjs/type-registry.js +42 -0
  50. package/dist/esm/binary-encoding.js +434 -0
  51. package/dist/esm/binary-format.js +1 -0
  52. package/dist/esm/descriptor-registry.js +521 -0
  53. package/dist/esm/descriptor-set.js +517 -0
  54. package/dist/esm/enum.js +1 -0
  55. package/dist/esm/field-list.js +1 -0
  56. package/dist/esm/field.js +37 -0
  57. package/dist/esm/google/protobuf/any_pb.js +276 -0
  58. package/dist/esm/google/protobuf/api_pb.js +350 -0
  59. package/dist/esm/google/protobuf/compiler/plugin_pb.js +318 -0
  60. package/dist/esm/google/protobuf/descriptor_pb.js +2213 -0
  61. package/dist/esm/google/protobuf/duration_pb.js +197 -0
  62. package/dist/esm/google/protobuf/empty_pb.js +68 -0
  63. package/dist/esm/google/protobuf/field_mask_pb.js +343 -0
  64. package/dist/esm/google/protobuf/source_context_pb.js +70 -0
  65. package/dist/esm/google/protobuf/struct_pb.js +282 -0
  66. package/dist/esm/google/protobuf/timestamp_pb.js +267 -0
  67. package/dist/esm/google/protobuf/type_pb.js +569 -0
  68. package/dist/esm/google/protobuf/wrappers_pb.js +574 -0
  69. package/dist/esm/google/varint.js +265 -0
  70. package/dist/esm/index.js +24 -0
  71. package/dist/esm/json-format.js +1 -0
  72. package/dist/esm/message-type.js +1 -0
  73. package/dist/esm/message.js +94 -0
  74. package/dist/esm/private/assert.js +41 -0
  75. package/dist/esm/private/base64.js +113 -0
  76. package/dist/esm/private/binary-format-common.js +243 -0
  77. package/dist/esm/private/binary-format-proto2.js +87 -0
  78. package/dist/esm/private/binary-format-proto3.js +74 -0
  79. package/dist/esm/private/enum.js +64 -0
  80. package/dist/esm/private/field-list.js +58 -0
  81. package/dist/esm/private/field-wrapper.js +20 -0
  82. package/dist/esm/private/field.js +27 -0
  83. package/dist/esm/private/json-format-common.js +473 -0
  84. package/dist/esm/private/json-format-proto2.js +90 -0
  85. package/dist/esm/private/json-format-proto3.js +89 -0
  86. package/dist/esm/private/message-type.js +33 -0
  87. package/dist/esm/private/names.js +90 -0
  88. package/dist/esm/private/options-map.js +1 -0
  89. package/dist/esm/private/proto-runtime.js +15 -0
  90. package/dist/esm/private/scalars.js +129 -0
  91. package/dist/esm/private/util-common.js +207 -0
  92. package/dist/esm/private/util.js +1 -0
  93. package/dist/esm/proto-int64.js +118 -0
  94. package/dist/esm/proto2.js +77 -0
  95. package/dist/esm/proto3.js +90 -0
  96. package/dist/esm/service-type.js +37 -0
  97. package/dist/esm/type-registry.js +38 -0
  98. package/dist/types/binary-encoding.d.ts +421 -0
  99. package/dist/types/binary-format.d.ts +109 -0
  100. package/dist/types/descriptor-registry.d.ts +42 -0
  101. package/dist/types/descriptor-set.d.ts +171 -0
  102. package/dist/types/enum.d.ts +31 -0
  103. package/dist/types/field-list.d.ts +27 -0
  104. package/dist/types/field.d.ts +295 -0
  105. package/dist/types/google/protobuf/any_pb.d.ts +167 -0
  106. package/dist/types/google/protobuf/api_pb.d.ts +296 -0
  107. package/dist/types/google/protobuf/compiler/plugin_pb.d.ts +294 -0
  108. package/dist/types/google/protobuf/descriptor_pb.d.ts +1959 -0
  109. package/dist/types/google/protobuf/duration_pb.d.ts +117 -0
  110. package/dist/types/google/protobuf/empty_pb.d.ts +44 -0
  111. package/dist/types/google/protobuf/field_mask_pb.d.ts +243 -0
  112. package/dist/types/google/protobuf/source_context_pb.d.ts +44 -0
  113. package/dist/types/google/protobuf/struct_pb.d.ts +205 -0
  114. package/dist/types/google/protobuf/timestamp_pb.d.ts +151 -0
  115. package/dist/types/google/protobuf/type_pb.d.ts +482 -0
  116. package/dist/types/google/protobuf/wrappers_pb.d.ts +379 -0
  117. package/dist/types/google/varint.d.ts +65 -0
  118. package/dist/types/index.d.ts +53 -0
  119. package/dist/types/json-format.d.ts +129 -0
  120. package/dist/types/message-type.d.ts +58 -0
  121. package/dist/types/message.d.ts +124 -0
  122. package/dist/types/private/assert.d.ts +19 -0
  123. package/dist/types/private/base64.d.ts +18 -0
  124. package/dist/types/private/binary-format-common.d.ts +38 -0
  125. package/dist/types/private/binary-format-proto2.d.ts +2 -0
  126. package/dist/types/private/binary-format-proto3.d.ts +2 -0
  127. package/dist/types/private/enum.d.ts +29 -0
  128. package/dist/types/private/field-list.d.ts +25 -0
  129. package/dist/types/private/field-wrapper.d.ts +27 -0
  130. package/dist/types/private/field.d.ts +15 -0
  131. package/dist/types/private/json-format-common.d.ts +30 -0
  132. package/dist/types/private/json-format-proto2.d.ts +2 -0
  133. package/dist/types/private/json-format-proto3.d.ts +2 -0
  134. package/dist/types/private/message-type.d.ts +15 -0
  135. package/dist/types/private/names.d.ts +19 -0
  136. package/dist/types/private/options-map.d.ts +7 -0
  137. package/dist/types/private/proto-runtime.d.ts +55 -0
  138. package/dist/types/private/scalars.d.ts +33 -0
  139. package/dist/types/private/util-common.d.ts +5 -0
  140. package/dist/types/private/util.d.ts +55 -0
  141. package/dist/types/proto-int64.d.ts +94 -0
  142. package/dist/types/proto2.d.ts +4 -0
  143. package/dist/types/proto3.d.ts +4 -0
  144. package/dist/types/service-type.d.ts +118 -0
  145. package/dist/types/type-registry.d.ts +37 -0
  146. package/package.json +31 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeJsonFormatProto2 = void 0;
4
+ const field_wrapper_js_1 = require("./field-wrapper.js");
5
+ const assert_js_1 = require("./assert.js");
6
+ const json_format_common_js_1 = require("./json-format-common.js");
7
+ /* eslint-disable no-case-declarations, @typescript-eslint/restrict-plus-operands,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-argument */
8
+ function makeJsonFormatProto2() {
9
+ return (0, json_format_common_js_1.makeJsonFormatCommon)(
10
+ (writeEnum, writeScalar) => {
11
+ return function writeField(field, value, options) {
12
+ if (field.kind == "map") {
13
+ const jsonObj = {};
14
+ switch (field.V.kind) {
15
+ case "scalar":
16
+ for (const [entryKey, entryValue] of Object.entries(value)) {
17
+ const val = writeScalar(field.V.T, entryValue, true);
18
+ (0, assert_js_1.assert)(val !== undefined);
19
+ jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
20
+ }
21
+ break;
22
+ case "message":
23
+ for (const [entryKey, entryValue] of Object.entries(value)) {
24
+ // JSON standard allows only (double quoted) string as property key
25
+ jsonObj[entryKey.toString()] = entryValue.toJson(options);
26
+ }
27
+ break;
28
+ case "enum":
29
+ const enumType = field.V.T;
30
+ for (const [entryKey, entryValue] of Object.entries(value)) {
31
+ (0, assert_js_1.assert)(
32
+ entryValue === undefined || typeof entryValue == "number"
33
+ );
34
+ const val = writeEnum(
35
+ enumType,
36
+ entryValue,
37
+ true,
38
+ options.enumAsInteger
39
+ );
40
+ (0, assert_js_1.assert)(val !== undefined);
41
+ jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
42
+ }
43
+ break;
44
+ }
45
+ return options.emitDefaultValues || Object.keys(jsonObj).length > 0
46
+ ? jsonObj
47
+ : undefined;
48
+ } else if (field.repeated) {
49
+ const jsonArr = [];
50
+ switch (field.kind) {
51
+ case "scalar":
52
+ for (let i = 0; i < value.length; i++) {
53
+ jsonArr.push(writeScalar(field.T, value[i], true));
54
+ }
55
+ break;
56
+ case "enum":
57
+ for (let i = 0; i < value.length; i++) {
58
+ jsonArr.push(
59
+ writeEnum(field.T, value[i], true, options.enumAsInteger)
60
+ );
61
+ }
62
+ break;
63
+ case "message":
64
+ for (let i = 0; i < value.length; i++) {
65
+ jsonArr.push(value[i].toJson(options));
66
+ }
67
+ break;
68
+ }
69
+ return options.emitDefaultValues || jsonArr.length > 0
70
+ ? jsonArr
71
+ : undefined;
72
+ } else {
73
+ // In contrast to proto3, we raise an error if a non-optional (proto2 required)
74
+ // field is missing a value.
75
+ if (value === undefined) {
76
+ if (!field.oneof && !field.opt) {
77
+ throw `required field not set`;
78
+ }
79
+ return undefined;
80
+ }
81
+ switch (field.kind) {
82
+ case "scalar":
83
+ // In contrast to proto3, we do not skip intrinsic default values.
84
+ // Explicit default values are not special cased either.
85
+ return writeScalar(field.T, value, true);
86
+ case "enum":
87
+ // In contrast to proto3, we do not skip intrinsic default values.
88
+ // Explicit default values are not special cased either.
89
+ return writeEnum(field.T, value, true, options.enumAsInteger);
90
+ case "message":
91
+ return (0, field_wrapper_js_1.wrapField)(field.T, value).toJson(
92
+ options
93
+ );
94
+ }
95
+ }
96
+ };
97
+ }
98
+ );
99
+ }
100
+ exports.makeJsonFormatProto2 = makeJsonFormatProto2;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeJsonFormatProto3 = void 0;
4
+ const field_wrapper_js_1 = require("./field-wrapper.js");
5
+ const assert_js_1 = require("./assert.js");
6
+ const json_format_common_js_1 = require("./json-format-common.js");
7
+ /* eslint-disable no-case-declarations, @typescript-eslint/restrict-plus-operands,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-argument */
8
+ function makeJsonFormatProto3() {
9
+ return (0, json_format_common_js_1.makeJsonFormatCommon)(
10
+ (writeEnum, writeScalar) => {
11
+ return function writeField(field, value, options) {
12
+ if (field.kind == "map") {
13
+ const jsonObj = {};
14
+ switch (field.V.kind) {
15
+ case "scalar":
16
+ for (const [entryKey, entryValue] of Object.entries(value)) {
17
+ const val = writeScalar(field.V.T, entryValue, true);
18
+ (0, assert_js_1.assert)(val !== undefined);
19
+ jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
20
+ }
21
+ break;
22
+ case "message":
23
+ for (const [entryKey, entryValue] of Object.entries(value)) {
24
+ // JSON standard allows only (double quoted) string as property key
25
+ jsonObj[entryKey.toString()] = entryValue.toJson(options);
26
+ }
27
+ break;
28
+ case "enum":
29
+ const enumType = field.V.T;
30
+ for (const [entryKey, entryValue] of Object.entries(value)) {
31
+ (0, assert_js_1.assert)(
32
+ entryValue === undefined || typeof entryValue == "number"
33
+ );
34
+ const val = writeEnum(
35
+ enumType,
36
+ entryValue,
37
+ true,
38
+ options.enumAsInteger
39
+ );
40
+ (0, assert_js_1.assert)(val !== undefined);
41
+ jsonObj[entryKey.toString()] = val; // JSON standard allows only (double quoted) string as property key
42
+ }
43
+ break;
44
+ }
45
+ return options.emitDefaultValues || Object.keys(jsonObj).length > 0
46
+ ? jsonObj
47
+ : undefined;
48
+ } else if (field.repeated) {
49
+ const jsonArr = [];
50
+ switch (field.kind) {
51
+ case "scalar":
52
+ for (let i = 0; i < value.length; i++) {
53
+ jsonArr.push(writeScalar(field.T, value[i], true));
54
+ }
55
+ break;
56
+ case "enum":
57
+ for (let i = 0; i < value.length; i++) {
58
+ jsonArr.push(
59
+ writeEnum(field.T, value[i], true, options.enumAsInteger)
60
+ );
61
+ }
62
+ break;
63
+ case "message":
64
+ for (let i = 0; i < value.length; i++) {
65
+ jsonArr.push(
66
+ (0, field_wrapper_js_1.wrapField)(field.T, value[i]).toJson(
67
+ options
68
+ )
69
+ );
70
+ }
71
+ break;
72
+ }
73
+ return options.emitDefaultValues || jsonArr.length > 0
74
+ ? jsonArr
75
+ : undefined;
76
+ } else {
77
+ switch (field.kind) {
78
+ case "scalar":
79
+ return writeScalar(
80
+ field.T,
81
+ value,
82
+ !!field.oneof || field.opt || options.emitDefaultValues
83
+ );
84
+ case "enum":
85
+ return writeEnum(
86
+ field.T,
87
+ value,
88
+ !!field.oneof || field.opt || options.emitDefaultValues,
89
+ options.enumAsInteger
90
+ );
91
+ case "message":
92
+ return value !== undefined
93
+ ? (0, field_wrapper_js_1.wrapField)(field.T, value).toJson(
94
+ options
95
+ )
96
+ : undefined;
97
+ }
98
+ }
99
+ };
100
+ }
101
+ );
102
+ }
103
+ exports.makeJsonFormatProto3 = makeJsonFormatProto3;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeMessageType = void 0;
4
+ const message_js_1 = require("../message.js");
5
+ /**
6
+ * Create a new message type using the given runtime.
7
+ */
8
+ function makeMessageType(runtime, typeName, fields, opt) {
9
+ const localName =
10
+ opt?.localName ?? typeName.substring(typeName.lastIndexOf(".") + 1);
11
+ const type = {
12
+ [localName]: function (data) {
13
+ runtime.util.initFields(this);
14
+ runtime.util.initPartial(data, this);
15
+ },
16
+ }[localName];
17
+ Object.setPrototypeOf(type.prototype, new message_js_1.Message());
18
+ Object.assign(type, {
19
+ runtime,
20
+ typeName,
21
+ fields: runtime.util.newFieldList(fields),
22
+ fromBinary(bytes, options) {
23
+ return new type().fromBinary(bytes, options);
24
+ },
25
+ fromJson(jsonValue, options) {
26
+ return new type().fromJson(jsonValue, options);
27
+ },
28
+ fromJsonString(jsonString, options) {
29
+ return new type().fromJsonString(jsonString, options);
30
+ },
31
+ equals(a, b) {
32
+ return runtime.util.equals(type, a, b);
33
+ },
34
+ });
35
+ return type;
36
+ }
37
+ exports.makeMessageType = makeMessageType;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeMethodName =
4
+ exports.makeOneofName =
5
+ exports.makeFieldName =
6
+ exports.makeJsonName =
7
+ void 0;
8
+ /**
9
+ * Returns the JSON name for a protobuf field, exactly like protoc does.
10
+ */
11
+ function makeJsonName(protoName) {
12
+ return protoCamelCase(protoName);
13
+ }
14
+ exports.makeJsonName = makeJsonName;
15
+ /**
16
+ * Returns the local name of a field, exactly like protoc-gen-es does.
17
+ */
18
+ function makeFieldName(protoName, inOneof) {
19
+ const n = protoCamelCase(protoName);
20
+ if (inOneof) {
21
+ return n;
22
+ }
23
+ return rProp[n] ? n + escapeChar : n;
24
+ }
25
+ exports.makeFieldName = makeFieldName;
26
+ /**
27
+ * Returns the local name of a oneof group, exactly like protoc-gen-es does.
28
+ */
29
+ function makeOneofName(protoName) {
30
+ return makeFieldName(protoName, false);
31
+ }
32
+ exports.makeOneofName = makeOneofName;
33
+ /**
34
+ * Returns the local name of a rpc, exactly like protoc-gen-es does.
35
+ */
36
+ function makeMethodName(protoName) {
37
+ if (protoName.length == 0) {
38
+ return protoName;
39
+ }
40
+ return protoName[0].toLowerCase() + protoName.substring(1);
41
+ }
42
+ exports.makeMethodName = makeMethodName;
43
+ // Converts snake_case to protoCamelCase according to the convention
44
+ // used by protoc to convert a field name to a JSON name.
45
+ function protoCamelCase(snakeCase) {
46
+ let capNext = false;
47
+ const b = [];
48
+ for (let i = 0; i < snakeCase.length; i++) {
49
+ let c = snakeCase.charAt(i);
50
+ switch (c) {
51
+ case "_":
52
+ capNext = true;
53
+ break;
54
+ case "0":
55
+ case "1":
56
+ case "2":
57
+ case "3":
58
+ case "4":
59
+ case "5":
60
+ case "6":
61
+ case "7":
62
+ case "8":
63
+ case "9":
64
+ b.push(c);
65
+ capNext = false;
66
+ break;
67
+ default:
68
+ if (capNext) {
69
+ capNext = false;
70
+ c = c.toUpperCase();
71
+ }
72
+ b.push(c);
73
+ break;
74
+ }
75
+ }
76
+ return b.join("");
77
+ }
78
+ // escapeChar must be appended to a reserved name.
79
+ // We choose '$' because it is invalid in proto identifiers.
80
+ const escapeChar = "$";
81
+ // Names that cannot be used for object properties.
82
+ // See buf_es/protoc-gen-es/internal/protoplugin/names.go
83
+ const rProp = {
84
+ // names reserved by JavaScript
85
+ constructor: true,
86
+ toString: true,
87
+ toJSON: true,
88
+ valueOf: true,
89
+ // names reserved by the runtime
90
+ getType: true,
91
+ clone: true,
92
+ equals: true,
93
+ fromBinary: true,
94
+ fromJson: true,
95
+ fromJsonString: true,
96
+ toBinary: true,
97
+ toJson: true,
98
+ toJsonString: true,
99
+ // names reserved by the runtime for the future
100
+ toObject: true,
101
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeProtoRuntime = void 0;
4
+ const enum_js_1 = require("./enum.js");
5
+ const message_type_js_1 = require("./message-type.js");
6
+ function makeProtoRuntime(syntax, json, bin, util) {
7
+ return {
8
+ syntax,
9
+ json,
10
+ bin,
11
+ util,
12
+ makeMessageType(typeName, fields, opt) {
13
+ return (0, message_type_js_1.makeMessageType)(
14
+ this,
15
+ typeName,
16
+ fields,
17
+ opt
18
+ );
19
+ },
20
+ makeEnumType: enum_js_1.makeEnumType,
21
+ getEnumType: enum_js_1.getEnumType,
22
+ };
23
+ }
24
+ exports.makeProtoRuntime = makeProtoRuntime;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scalarTypeInfo =
4
+ exports.scalarDefaultValue =
5
+ exports.scalarEquals =
6
+ void 0;
7
+ const field_js_1 = require("../field.js");
8
+ const binary_encoding_js_1 = require("../binary-encoding.js");
9
+ const proto_int64_js_1 = require("../proto-int64.js");
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+ /**
12
+ * Returns true if both scalar values are equal.
13
+ */
14
+ function scalarEquals(type, a, b) {
15
+ if (a === b) {
16
+ // This correctly matches equal values except BYTES and (possibly) 64-bit integers.
17
+ return true;
18
+ }
19
+ // Special case BYTES - we need to compare each byte individually
20
+ if (type == field_js_1.ScalarType.BYTES) {
21
+ if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) {
22
+ return false;
23
+ }
24
+ if (a.length !== b.length) {
25
+ return false;
26
+ }
27
+ for (let i = 0; i < a.length; i++) {
28
+ if (a[i] !== b[i]) {
29
+ return false;
30
+ }
31
+ }
32
+ return true;
33
+ }
34
+ // Special case 64-bit integers - we support number, string and bigint representation.
35
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
36
+ switch (type) {
37
+ case field_js_1.ScalarType.UINT64:
38
+ case field_js_1.ScalarType.FIXED64:
39
+ case field_js_1.ScalarType.INT64:
40
+ case field_js_1.ScalarType.SFIXED64:
41
+ case field_js_1.ScalarType.SINT64:
42
+ // Loose comparison will match between 0n, 0 and "0".
43
+ return a == b;
44
+ }
45
+ // Anything that hasn't been caught by strict comparison or special cased
46
+ // BYTES and 64-bit integers is not equal.
47
+ return false;
48
+ }
49
+ exports.scalarEquals = scalarEquals;
50
+ /**
51
+ * Returns the default value for the given scalar type, following
52
+ * proto3 semantics.
53
+ */
54
+ function scalarDefaultValue(type) {
55
+ switch (type) {
56
+ case field_js_1.ScalarType.BOOL:
57
+ return false;
58
+ case field_js_1.ScalarType.UINT64:
59
+ case field_js_1.ScalarType.FIXED64:
60
+ case field_js_1.ScalarType.INT64:
61
+ case field_js_1.ScalarType.SFIXED64:
62
+ case field_js_1.ScalarType.SINT64:
63
+ return proto_int64_js_1.protoInt64.zero;
64
+ case field_js_1.ScalarType.DOUBLE:
65
+ case field_js_1.ScalarType.FLOAT:
66
+ return 0.0;
67
+ case field_js_1.ScalarType.BYTES:
68
+ return new Uint8Array(0);
69
+ case field_js_1.ScalarType.STRING:
70
+ return "";
71
+ default:
72
+ // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.
73
+ // We do not use individual cases to save a few bytes code size.
74
+ return 0;
75
+ }
76
+ }
77
+ exports.scalarDefaultValue = scalarDefaultValue;
78
+ /**
79
+ * Get information for writing a scalar value.
80
+ *
81
+ * Returns tuple:
82
+ * [0]: appropriate WireType
83
+ * [1]: name of the appropriate method of IBinaryWriter
84
+ * [2]: whether the given value is a default value for proto3 semantics
85
+ *
86
+ * If argument `value` is omitted, [2] is always false.
87
+ */
88
+ function scalarTypeInfo(type, value) {
89
+ const isUndefined = value === undefined;
90
+ let wireType = binary_encoding_js_1.WireType.Varint;
91
+ let isIntrinsicDefault = value === 0;
92
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- INT32, UINT32, SINT32 are covered by the defaults
93
+ switch (type) {
94
+ case field_js_1.ScalarType.STRING:
95
+ isIntrinsicDefault = isUndefined || !value.length;
96
+ wireType = binary_encoding_js_1.WireType.LengthDelimited;
97
+ break;
98
+ case field_js_1.ScalarType.BOOL:
99
+ isIntrinsicDefault = value === false;
100
+ break;
101
+ case field_js_1.ScalarType.DOUBLE:
102
+ wireType = binary_encoding_js_1.WireType.Bit64;
103
+ break;
104
+ case field_js_1.ScalarType.FLOAT:
105
+ wireType = binary_encoding_js_1.WireType.Bit32;
106
+ break;
107
+ case field_js_1.ScalarType.INT64:
108
+ isIntrinsicDefault = isUndefined || value == 0;
109
+ break;
110
+ case field_js_1.ScalarType.UINT64:
111
+ isIntrinsicDefault = isUndefined || value == 0;
112
+ break;
113
+ case field_js_1.ScalarType.FIXED64:
114
+ isIntrinsicDefault = isUndefined || value == 0;
115
+ wireType = binary_encoding_js_1.WireType.Bit64;
116
+ break;
117
+ case field_js_1.ScalarType.BYTES:
118
+ isIntrinsicDefault = isUndefined || !value.byteLength;
119
+ wireType = binary_encoding_js_1.WireType.LengthDelimited;
120
+ break;
121
+ case field_js_1.ScalarType.FIXED32:
122
+ wireType = binary_encoding_js_1.WireType.Bit32;
123
+ break;
124
+ case field_js_1.ScalarType.SFIXED32:
125
+ wireType = binary_encoding_js_1.WireType.Bit32;
126
+ break;
127
+ case field_js_1.ScalarType.SFIXED64:
128
+ isIntrinsicDefault = isUndefined || value == 0;
129
+ wireType = binary_encoding_js_1.WireType.Bit64;
130
+ break;
131
+ case field_js_1.ScalarType.SINT64:
132
+ isIntrinsicDefault = isUndefined || value == 0;
133
+ break;
134
+ }
135
+ const method = field_js_1.ScalarType[type].toLowerCase();
136
+ return [wireType, method, isUndefined || isIntrinsicDefault];
137
+ }
138
+ exports.scalarTypeInfo = scalarTypeInfo;