@bufbuild/protobuf 0.0.1-alpha.1 → 0.0.2-alpha.2

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 (138) hide show
  1. package/dist/cjs/binary-encoding.js +414 -409
  2. package/dist/cjs/binary-format.js +13 -0
  3. package/dist/cjs/descriptor-registry.js +420 -449
  4. package/dist/cjs/descriptor-set.js +429 -513
  5. package/dist/cjs/enum.js +13 -0
  6. package/dist/cjs/field-list.js +13 -0
  7. package/dist/cjs/field.js +43 -30
  8. package/dist/cjs/google/protobuf/any_pb.js +122 -140
  9. package/dist/cjs/google/protobuf/api_pb.js +177 -224
  10. package/dist/cjs/google/protobuf/compiler/plugin_pb.js +125 -227
  11. package/dist/cjs/google/protobuf/descriptor_pb.js +1029 -1888
  12. package/dist/cjs/google/protobuf/duration_pb.js +72 -88
  13. package/dist/cjs/google/protobuf/empty_pb.js +17 -17
  14. package/dist/cjs/google/protobuf/field_mask_pb.js +77 -94
  15. package/dist/cjs/google/protobuf/source_context_pb.js +25 -25
  16. package/dist/cjs/google/protobuf/struct_pb.js +144 -181
  17. package/dist/cjs/google/protobuf/timestamp_pb.js +86 -123
  18. package/dist/cjs/google/protobuf/type_pb.js +406 -462
  19. package/dist/cjs/google/protobuf/wrappers_pb.js +407 -470
  20. package/dist/cjs/google/varint.js +166 -171
  21. package/dist/cjs/index.js +41 -122
  22. package/dist/cjs/json-format.js +13 -0
  23. package/dist/cjs/message-type.js +13 -0
  24. package/dist/cjs/message.js +89 -85
  25. package/dist/cjs/private/assert.js +33 -26
  26. package/dist/cjs/private/base64.js +93 -79
  27. package/dist/cjs/private/binary-format-common.js +208 -208
  28. package/dist/cjs/private/binary-format-proto2.js +88 -109
  29. package/dist/cjs/private/binary-format-proto3.js +70 -90
  30. package/dist/cjs/private/enum.js +77 -44
  31. package/dist/cjs/private/field-list.js +64 -50
  32. package/dist/cjs/private/field-wrapper.js +21 -10
  33. package/dist/cjs/private/field.js +35 -25
  34. package/dist/cjs/private/json-format-common.js +427 -440
  35. package/dist/cjs/private/json-format-proto2.js +91 -89
  36. package/dist/cjs/private/json-format-proto3.js +82 -93
  37. package/dist/cjs/private/message-type.js +39 -27
  38. package/dist/cjs/private/names.js +71 -62
  39. package/dist/cjs/private/options-map.js +13 -0
  40. package/dist/cjs/private/proto-runtime.js +25 -16
  41. package/dist/cjs/private/scalars.js +113 -103
  42. package/dist/cjs/private/util-common.js +193 -210
  43. package/dist/cjs/private/util.js +13 -0
  44. package/dist/cjs/proto-int64.js +123 -111
  45. package/dist/cjs/proto2.js +63 -63
  46. package/dist/cjs/proto3.js +74 -74
  47. package/dist/cjs/service-type.js +27 -17
  48. package/dist/cjs/type-registry.js +46 -31
  49. package/dist/esm/binary-encoding.js +414 -414
  50. package/dist/esm/binary-format.js +13 -0
  51. package/dist/esm/descriptor-registry.js +422 -458
  52. package/dist/esm/descriptor-set.js +430 -478
  53. package/dist/esm/enum.js +13 -0
  54. package/dist/esm/field-list.js +13 -0
  55. package/dist/esm/field.js +42 -29
  56. package/dist/esm/google/protobuf/any_pb.js +122 -140
  57. package/dist/esm/google/protobuf/api_pb.js +177 -197
  58. package/dist/esm/google/protobuf/compiler/plugin_pb.js +123 -216
  59. package/dist/esm/google/protobuf/descriptor_pb.js +1013 -1804
  60. package/dist/esm/google/protobuf/duration_pb.js +72 -88
  61. package/dist/esm/google/protobuf/empty_pb.js +17 -17
  62. package/dist/esm/google/protobuf/field_mask_pb.js +77 -94
  63. package/dist/esm/google/protobuf/source_context_pb.js +25 -25
  64. package/dist/esm/google/protobuf/struct_pb.js +143 -180
  65. package/dist/esm/google/protobuf/timestamp_pb.js +86 -123
  66. package/dist/esm/google/protobuf/type_pb.js +401 -421
  67. package/dist/esm/google/protobuf/wrappers_pb.js +406 -397
  68. package/dist/esm/google/varint.js +165 -164
  69. package/dist/esm/index.js +14 -1
  70. package/dist/esm/json-format.js +13 -0
  71. package/dist/esm/message-type.js +13 -0
  72. package/dist/esm/message.js +89 -85
  73. package/dist/esm/private/assert.js +32 -21
  74. package/dist/esm/private/base64.js +92 -78
  75. package/dist/esm/private/binary-format-common.js +209 -207
  76. package/dist/esm/private/binary-format-proto2.js +89 -81
  77. package/dist/esm/private/binary-format-proto3.js +71 -67
  78. package/dist/esm/private/enum.js +75 -43
  79. package/dist/esm/private/field-list.js +64 -50
  80. package/dist/esm/private/field-wrapper.js +21 -10
  81. package/dist/esm/private/field.js +35 -22
  82. package/dist/esm/private/json-format-common.js +427 -435
  83. package/dist/esm/private/json-format-proto2.js +89 -81
  84. package/dist/esm/private/json-format-proto3.js +79 -80
  85. package/dist/esm/private/message-type.js +40 -28
  86. package/dist/esm/private/names.js +70 -57
  87. package/dist/esm/private/options-map.js +13 -0
  88. package/dist/esm/private/proto-runtime.js +26 -12
  89. package/dist/esm/private/scalars.js +112 -99
  90. package/dist/esm/private/util-common.js +193 -192
  91. package/dist/esm/private/util.js +13 -0
  92. package/dist/esm/proto-int64.js +123 -111
  93. package/dist/esm/proto2.js +63 -57
  94. package/dist/esm/proto3.js +74 -68
  95. package/dist/esm/service-type.js +25 -12
  96. package/dist/esm/type-registry.js +46 -31
  97. package/dist/types/binary-encoding.d.ts +398 -398
  98. package/dist/types/binary-format.d.ts +69 -91
  99. package/dist/types/descriptor-registry.d.ts +23 -29
  100. package/dist/types/descriptor-set.d.ts +107 -128
  101. package/dist/types/enum.d.ts +21 -21
  102. package/dist/types/field-list.d.ts +21 -21
  103. package/dist/types/field.d.ts +191 -231
  104. package/dist/types/google/protobuf/any_pb.d.ts +56 -77
  105. package/dist/types/google/protobuf/api_pb.d.ts +144 -187
  106. package/dist/types/google/protobuf/compiler/plugin_pb.d.ts +195 -257
  107. package/dist/types/google/protobuf/descriptor_pb.d.ts +1360 -1737
  108. package/dist/types/google/protobuf/duration_pb.d.ts +30 -50
  109. package/dist/types/google/protobuf/empty_pb.d.ts +9 -28
  110. package/dist/types/google/protobuf/field_mask_pb.d.ts +17 -37
  111. package/dist/types/google/protobuf/source_context_pb.d.ts +16 -35
  112. package/dist/types/google/protobuf/struct_pb.d.ts +64 -115
  113. package/dist/types/google/protobuf/timestamp_pb.d.ts +31 -51
  114. package/dist/types/google/protobuf/type_pb.d.ts +355 -422
  115. package/dist/types/google/protobuf/wrappers_pb.d.ts +181 -297
  116. package/dist/types/google/varint.d.ts +6 -13
  117. package/dist/types/index.d.ts +4 -27
  118. package/dist/types/json-format.d.ts +70 -89
  119. package/dist/types/message-type.d.ts +37 -45
  120. package/dist/types/message.d.ts +62 -87
  121. package/dist/types/private/assert.d.ts +1 -4
  122. package/dist/types/private/binary-format-common.d.ts +6 -32
  123. package/dist/types/private/enum.d.ts +13 -11
  124. package/dist/types/private/field-list.d.ts +14 -21
  125. package/dist/types/private/field-wrapper.d.ts +4 -10
  126. package/dist/types/private/field.d.ts +12 -12
  127. package/dist/types/private/json-format-common.d.ts +5 -27
  128. package/dist/types/private/message-type.d.ts +12 -7
  129. package/dist/types/private/names.d.ts +1 -4
  130. package/dist/types/private/options-map.d.ts +1 -1
  131. package/dist/types/private/proto-runtime.d.ts +34 -42
  132. package/dist/types/private/scalars.d.ts +5 -12
  133. package/dist/types/private/util-common.d.ts +1 -4
  134. package/dist/types/private/util.d.ts +29 -41
  135. package/dist/types/proto-int64.d.ts +42 -42
  136. package/dist/types/service-type.d.ts +36 -56
  137. package/dist/types/type-registry.d.ts +13 -15
  138. package/package.json +2 -3
@@ -1,3 +1,16 @@
1
+ // Copyright 2021-2022 Buf Technologies, Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
1
14
  import { ScalarType } from "../field.js";
2
15
  import { WireType } from "../binary-encoding.js";
3
16
  import { protoInt64 } from "../proto-int64.js";
@@ -6,66 +19,66 @@ import { protoInt64 } from "../proto-int64.js";
6
19
  * Returns true if both scalar values are equal.
7
20
  */
8
21
  export function scalarEquals(type, a, b) {
9
- if (a === b) {
10
- // This correctly matches equal values except BYTES and (possibly) 64-bit integers.
11
- return true;
12
- }
13
- // Special case BYTES - we need to compare each byte individually
14
- if (type == ScalarType.BYTES) {
15
- if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) {
16
- return false;
22
+ if (a === b) {
23
+ // This correctly matches equal values except BYTES and (possibly) 64-bit integers.
24
+ return true;
17
25
  }
18
- if (a.length !== b.length) {
19
- return false;
26
+ // Special case BYTES - we need to compare each byte individually
27
+ if (type == ScalarType.BYTES) {
28
+ if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) {
29
+ return false;
30
+ }
31
+ if (a.length !== b.length) {
32
+ return false;
33
+ }
34
+ for (let i = 0; i < a.length; i++) {
35
+ if (a[i] !== b[i]) {
36
+ return false;
37
+ }
38
+ }
39
+ return true;
20
40
  }
21
- for (let i = 0; i < a.length; i++) {
22
- if (a[i] !== b[i]) {
23
- return false;
24
- }
41
+ // Special case 64-bit integers - we support number, string and bigint representation.
42
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
43
+ switch (type) {
44
+ case ScalarType.UINT64:
45
+ case ScalarType.FIXED64:
46
+ case ScalarType.INT64:
47
+ case ScalarType.SFIXED64:
48
+ case ScalarType.SINT64:
49
+ // Loose comparison will match between 0n, 0 and "0".
50
+ return a == b;
25
51
  }
26
- return true;
27
- }
28
- // Special case 64-bit integers - we support number, string and bigint representation.
29
- // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
30
- switch (type) {
31
- case ScalarType.UINT64:
32
- case ScalarType.FIXED64:
33
- case ScalarType.INT64:
34
- case ScalarType.SFIXED64:
35
- case ScalarType.SINT64:
36
- // Loose comparison will match between 0n, 0 and "0".
37
- return a == b;
38
- }
39
- // Anything that hasn't been caught by strict comparison or special cased
40
- // BYTES and 64-bit integers is not equal.
41
- return false;
52
+ // Anything that hasn't been caught by strict comparison or special cased
53
+ // BYTES and 64-bit integers is not equal.
54
+ return false;
42
55
  }
43
56
  /**
44
57
  * Returns the default value for the given scalar type, following
45
58
  * proto3 semantics.
46
59
  */
47
60
  export function scalarDefaultValue(type) {
48
- switch (type) {
49
- case ScalarType.BOOL:
50
- return false;
51
- case ScalarType.UINT64:
52
- case ScalarType.FIXED64:
53
- case ScalarType.INT64:
54
- case ScalarType.SFIXED64:
55
- case ScalarType.SINT64:
56
- return protoInt64.zero;
57
- case ScalarType.DOUBLE:
58
- case ScalarType.FLOAT:
59
- return 0.0;
60
- case ScalarType.BYTES:
61
- return new Uint8Array(0);
62
- case ScalarType.STRING:
63
- return "";
64
- default:
65
- // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.
66
- // We do not use individual cases to save a few bytes code size.
67
- return 0;
68
- }
61
+ switch (type) {
62
+ case ScalarType.BOOL:
63
+ return false;
64
+ case ScalarType.UINT64:
65
+ case ScalarType.FIXED64:
66
+ case ScalarType.INT64:
67
+ case ScalarType.SFIXED64:
68
+ case ScalarType.SINT64:
69
+ return protoInt64.zero;
70
+ case ScalarType.DOUBLE:
71
+ case ScalarType.FLOAT:
72
+ return 0.0;
73
+ case ScalarType.BYTES:
74
+ return new Uint8Array(0);
75
+ case ScalarType.STRING:
76
+ return "";
77
+ default:
78
+ // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.
79
+ // We do not use individual cases to save a few bytes code size.
80
+ return 0;
81
+ }
69
82
  }
70
83
  /**
71
84
  * Get information for writing a scalar value.
@@ -78,52 +91,52 @@ export function scalarDefaultValue(type) {
78
91
  * If argument `value` is omitted, [2] is always false.
79
92
  */
80
93
  export function scalarTypeInfo(type, value) {
81
- const isUndefined = value === undefined;
82
- let wireType = WireType.Varint;
83
- let isIntrinsicDefault = value === 0;
84
- // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- INT32, UINT32, SINT32 are covered by the defaults
85
- switch (type) {
86
- case ScalarType.STRING:
87
- isIntrinsicDefault = isUndefined || !value.length;
88
- wireType = WireType.LengthDelimited;
89
- break;
90
- case ScalarType.BOOL:
91
- isIntrinsicDefault = value === false;
92
- break;
93
- case ScalarType.DOUBLE:
94
- wireType = WireType.Bit64;
95
- break;
96
- case ScalarType.FLOAT:
97
- wireType = WireType.Bit32;
98
- break;
99
- case ScalarType.INT64:
100
- isIntrinsicDefault = isUndefined || value == 0;
101
- break;
102
- case ScalarType.UINT64:
103
- isIntrinsicDefault = isUndefined || value == 0;
104
- break;
105
- case ScalarType.FIXED64:
106
- isIntrinsicDefault = isUndefined || value == 0;
107
- wireType = WireType.Bit64;
108
- break;
109
- case ScalarType.BYTES:
110
- isIntrinsicDefault = isUndefined || !value.byteLength;
111
- wireType = WireType.LengthDelimited;
112
- break;
113
- case ScalarType.FIXED32:
114
- wireType = WireType.Bit32;
115
- break;
116
- case ScalarType.SFIXED32:
117
- wireType = WireType.Bit32;
118
- break;
119
- case ScalarType.SFIXED64:
120
- isIntrinsicDefault = isUndefined || value == 0;
121
- wireType = WireType.Bit64;
122
- break;
123
- case ScalarType.SINT64:
124
- isIntrinsicDefault = isUndefined || value == 0;
125
- break;
126
- }
127
- const method = ScalarType[type].toLowerCase();
128
- return [wireType, method, isUndefined || isIntrinsicDefault];
94
+ const isUndefined = value === undefined;
95
+ let wireType = WireType.Varint;
96
+ let isIntrinsicDefault = value === 0;
97
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- INT32, UINT32, SINT32 are covered by the defaults
98
+ switch (type) {
99
+ case ScalarType.STRING:
100
+ isIntrinsicDefault = isUndefined || !value.length;
101
+ wireType = WireType.LengthDelimited;
102
+ break;
103
+ case ScalarType.BOOL:
104
+ isIntrinsicDefault = value === false;
105
+ break;
106
+ case ScalarType.DOUBLE:
107
+ wireType = WireType.Bit64;
108
+ break;
109
+ case ScalarType.FLOAT:
110
+ wireType = WireType.Bit32;
111
+ break;
112
+ case ScalarType.INT64:
113
+ isIntrinsicDefault = isUndefined || value == 0;
114
+ break;
115
+ case ScalarType.UINT64:
116
+ isIntrinsicDefault = isUndefined || value == 0;
117
+ break;
118
+ case ScalarType.FIXED64:
119
+ isIntrinsicDefault = isUndefined || value == 0;
120
+ wireType = WireType.Bit64;
121
+ break;
122
+ case ScalarType.BYTES:
123
+ isIntrinsicDefault = isUndefined || !value.byteLength;
124
+ wireType = WireType.LengthDelimited;
125
+ break;
126
+ case ScalarType.FIXED32:
127
+ wireType = WireType.Bit32;
128
+ break;
129
+ case ScalarType.SFIXED32:
130
+ wireType = WireType.Bit32;
131
+ break;
132
+ case ScalarType.SFIXED64:
133
+ isIntrinsicDefault = isUndefined || value == 0;
134
+ wireType = WireType.Bit64;
135
+ break;
136
+ case ScalarType.SINT64:
137
+ isIntrinsicDefault = isUndefined || value == 0;
138
+ break;
139
+ }
140
+ const method = ScalarType[type].toLowerCase();
141
+ return [wireType, method, isUndefined || isIntrinsicDefault];
129
142
  }
@@ -1,207 +1,208 @@
1
+ // Copyright 2021-2022 Buf Technologies, Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
1
14
  import { setEnumType } from "./enum.js";
2
15
  import { ScalarType } from "../field.js";
3
16
  import { scalarEquals } from "./scalars.js";
4
17
  /* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument,no-case-declarations */
5
18
  export function makeUtilCommon() {
6
- return {
7
- setEnumType,
8
- initPartial(source, target) {
9
- if (source === undefined) {
10
- return;
11
- }
12
- const type = target.getType();
13
- for (const member of type.fields.byMember()) {
14
- const localName = member.localName,
15
- t = target,
16
- s = source;
17
- if (s[localName] === undefined) {
18
- continue;
19
- }
20
- switch (member.kind) {
21
- case "oneof":
22
- const sk = s[localName].case;
23
- if (sk === undefined) {
24
- continue;
19
+ return {
20
+ setEnumType,
21
+ initPartial(source, target) {
22
+ if (source === undefined) {
23
+ return;
25
24
  }
26
- const sourceField = member.findField(sk);
27
- let val = s[localName].value;
28
- if (
29
- sourceField &&
30
- sourceField.kind == "message" &&
31
- !(val instanceof sourceField.T)
32
- ) {
33
- val = new sourceField.T(val);
34
- }
35
- t[localName] = { case: sk, value: val };
36
- break;
37
- case "scalar":
38
- case "enum":
39
- t[localName] = s[localName];
40
- break;
41
- case "map":
42
- switch (member.V.kind) {
43
- case "scalar":
44
- case "enum":
45
- Object.assign(t[localName], s[localName]);
46
- break;
47
- case "message":
48
- const messageType = member.V.T;
49
- for (const k of Object.keys(s[localName])) {
50
- let val = s[localName][k];
51
- if (!messageType.fieldWrapper) {
52
- // We only take partial input for messages that are not a wrapper type.
53
- // For those messages, we recursively normalize the partial input.
54
- val = new messageType(val);
55
- }
56
- t[localName][k] = val;
25
+ const type = target.getType();
26
+ for (const member of type.fields.byMember()) {
27
+ const localName = member.localName, t = target, s = source;
28
+ if (s[localName] === undefined) {
29
+ continue;
30
+ }
31
+ switch (member.kind) {
32
+ case "oneof":
33
+ const sk = s[localName].case;
34
+ if (sk === undefined) {
35
+ continue;
36
+ }
37
+ const sourceField = member.findField(sk);
38
+ let val = s[localName].value;
39
+ if (sourceField &&
40
+ sourceField.kind == "message" &&
41
+ !(val instanceof sourceField.T)) {
42
+ val = new sourceField.T(val);
43
+ }
44
+ t[localName] = { case: sk, value: val };
45
+ break;
46
+ case "scalar":
47
+ case "enum":
48
+ t[localName] = s[localName];
49
+ break;
50
+ case "map":
51
+ switch (member.V.kind) {
52
+ case "scalar":
53
+ case "enum":
54
+ Object.assign(t[localName], s[localName]);
55
+ break;
56
+ case "message":
57
+ const messageType = member.V.T;
58
+ for (const k of Object.keys(s[localName])) {
59
+ let val = s[localName][k];
60
+ if (!messageType.fieldWrapper) {
61
+ // We only take partial input for messages that are not a wrapper type.
62
+ // For those messages, we recursively normalize the partial input.
63
+ val = new messageType(val);
64
+ }
65
+ t[localName][k] = val;
66
+ }
67
+ break;
68
+ }
69
+ break;
70
+ case "message":
71
+ const mt = member.T;
72
+ if (member.repeated) {
73
+ t[localName] = s[localName].map((val) => val instanceof mt ? val : new mt(val));
74
+ }
75
+ else if (s[localName] !== undefined) {
76
+ const val = s[localName];
77
+ if (mt.fieldWrapper) {
78
+ t[localName] = val;
79
+ }
80
+ else {
81
+ t[localName] = val instanceof mt ? mt : new mt(val);
82
+ }
83
+ }
84
+ break;
57
85
  }
58
- break;
59
- }
60
- break;
61
- case "message":
62
- const mt = member.T;
63
- if (member.repeated) {
64
- t[localName] = s[localName].map((val) =>
65
- val instanceof mt ? val : new mt(val)
66
- );
67
- } else if (s[localName] !== undefined) {
68
- const val = s[localName];
69
- if (mt.fieldWrapper) {
70
- t[localName] = val;
71
- } else {
72
- t[localName] = val instanceof mt ? mt : new mt(val);
73
- }
74
- }
75
- break;
76
- }
77
- }
78
- },
79
- equals(type, a, b) {
80
- if (a === b) {
81
- return true;
82
- }
83
- if (!a || !b) {
84
- return false;
85
- }
86
- return type.fields.byMember().every((m) => {
87
- const va = a[m.localName];
88
- const vb = b[m.localName];
89
- if (m.repeated) {
90
- if (va.length !== vb.length) {
91
- return false;
92
- }
93
- // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- repeated fields are never "map"
94
- switch (m.kind) {
95
- case "message":
96
- return va.every((a, i) => m.T.equals(a, vb[i]));
97
- case "scalar":
98
- return va.every((a, i) => scalarEquals(m.T, a, vb[i]));
99
- case "enum":
100
- return va.every((a, i) =>
101
- scalarEquals(ScalarType.INT32, a, vb[i])
102
- );
103
- }
104
- throw new Error(`repeated cannot contain ${m.kind}`);
105
- }
106
- switch (m.kind) {
107
- case "message":
108
- return m.T.equals(va, vb);
109
- case "enum":
110
- return scalarEquals(ScalarType.INT32, va, vb);
111
- case "scalar":
112
- return scalarEquals(m.T, va, vb);
113
- case "oneof":
114
- if (va.case !== vb.case) {
115
- return false;
116
- }
117
- const k = va.case,
118
- s = m.findField(k);
119
- if (s === undefined) {
120
- return true;
121
86
  }
122
- // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- oneof fields are never "map"
123
- switch (s.kind) {
124
- case "message":
125
- return s.T.equals(va[k], vb[k]);
126
- case "enum":
127
- return scalarEquals(ScalarType.INT32, va, vb);
128
- case "scalar":
129
- return scalarEquals(s.T, va, vb);
87
+ },
88
+ equals(type, a, b) {
89
+ if (a === b) {
90
+ return true;
130
91
  }
131
- throw new Error(`oneof cannot contain ${s.kind}`);
132
- case "map":
133
- const keys = Object.keys(va);
134
- if (keys.some((k) => vb[k] === undefined)) {
135
- return false;
92
+ if (!a || !b) {
93
+ return false;
136
94
  }
137
- switch (m.V.kind) {
138
- case "message":
139
- const messageType = m.V.T;
140
- return keys.every((k) => messageType.equals(va[k], vb[k]));
141
- case "enum":
142
- return keys.every((k) =>
143
- scalarEquals(ScalarType.INT32, va[k], vb[k])
144
- );
145
- case "scalar":
146
- const scalarType = m.V.T;
147
- return keys.every((k) =>
148
- scalarEquals(scalarType, va[k], vb[k])
149
- );
95
+ return type.fields.byMember().every((m) => {
96
+ const va = a[m.localName];
97
+ const vb = b[m.localName];
98
+ if (m.repeated) {
99
+ if (va.length !== vb.length) {
100
+ return false;
101
+ }
102
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- repeated fields are never "map"
103
+ switch (m.kind) {
104
+ case "message":
105
+ return va.every((a, i) => m.T.equals(a, vb[i]));
106
+ case "scalar":
107
+ return va.every((a, i) => scalarEquals(m.T, a, vb[i]));
108
+ case "enum":
109
+ return va.every((a, i) => scalarEquals(ScalarType.INT32, a, vb[i]));
110
+ }
111
+ throw new Error(`repeated cannot contain ${m.kind}`);
112
+ }
113
+ switch (m.kind) {
114
+ case "message":
115
+ return m.T.equals(va, vb);
116
+ case "enum":
117
+ return scalarEquals(ScalarType.INT32, va, vb);
118
+ case "scalar":
119
+ return scalarEquals(m.T, va, vb);
120
+ case "oneof":
121
+ if (va.case !== vb.case) {
122
+ return false;
123
+ }
124
+ const k = va.case, s = m.findField(k);
125
+ if (s === undefined) {
126
+ return true;
127
+ }
128
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- oneof fields are never "map"
129
+ switch (s.kind) {
130
+ case "message":
131
+ return s.T.equals(va[k], vb[k]);
132
+ case "enum":
133
+ return scalarEquals(ScalarType.INT32, va, vb);
134
+ case "scalar":
135
+ return scalarEquals(s.T, va, vb);
136
+ }
137
+ throw new Error(`oneof cannot contain ${s.kind}`);
138
+ case "map":
139
+ const keys = Object.keys(va);
140
+ if (keys.some((k) => vb[k] === undefined)) {
141
+ return false;
142
+ }
143
+ switch (m.V.kind) {
144
+ case "message":
145
+ const messageType = m.V.T;
146
+ return keys.every((k) => messageType.equals(va[k], vb[k]));
147
+ case "enum":
148
+ return keys.every((k) => scalarEquals(ScalarType.INT32, va[k], vb[k]));
149
+ case "scalar":
150
+ const scalarType = m.V.T;
151
+ return keys.every((k) => scalarEquals(scalarType, va[k], vb[k]));
152
+ }
153
+ break;
154
+ }
155
+ });
156
+ },
157
+ clone(message) {
158
+ const type = message.getType(), target = new type(), any = target;
159
+ for (const member of type.fields.byMember()) {
160
+ const source = message[member.localName];
161
+ let copy;
162
+ if (member.repeated) {
163
+ copy = source.map((e) => cloneSingularField(member, e));
164
+ }
165
+ else if (member.kind == "map") {
166
+ copy = any[member.localName];
167
+ for (const [key, v] of Object.entries(source)) {
168
+ copy[key] = cloneSingularField(member.V, v);
169
+ }
170
+ }
171
+ else if (member.kind == "oneof") {
172
+ const f = member.findField(source.case);
173
+ copy = f
174
+ ? { case: source.case, value: cloneSingularField(f, source.value) }
175
+ : { case: undefined };
176
+ }
177
+ else {
178
+ copy = cloneSingularField(member, source);
179
+ }
180
+ any[member.localName] = copy;
150
181
  }
151
- break;
152
- }
153
- });
154
- },
155
- clone(message) {
156
- const type = message.getType(),
157
- target = new type(),
158
- any = target;
159
- for (const member of type.fields.byMember()) {
160
- const source = message[member.localName];
161
- let copy;
162
- if (member.repeated) {
163
- copy = source.map((e) => cloneSingularField(member, e));
164
- } else if (member.kind == "map") {
165
- copy = any[member.localName];
166
- for (const [key, v] of Object.entries(source)) {
167
- copy[key] = cloneSingularField(member.V, v);
168
- }
169
- } else if (member.kind == "oneof") {
170
- const f = member.findField(source.case);
171
- copy = f
172
- ? { case: source.case, value: cloneSingularField(f, source.value) }
173
- : { case: undefined };
174
- } else {
175
- copy = cloneSingularField(member, source);
176
- }
177
- any[member.localName] = copy;
178
- }
179
- return target;
180
- },
181
- };
182
+ return target;
183
+ },
184
+ };
182
185
  }
183
186
  // clone a single field value - i.e. the element type of repeated fields, the value type of maps
184
187
  function cloneSingularField(field, value) {
185
- if (value === undefined) {
186
- return value;
187
- }
188
- // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- unmatched "map" is unsupported
189
- switch (field.kind) {
190
- case "enum":
191
- return value;
192
- case "scalar":
193
- if (field.T === ScalarType.BYTES) {
194
- const c = new Uint8Array(value.byteLength);
195
- c.set(value);
196
- return c;
197
- }
198
- return value;
199
- case "message":
200
- if (field.T.fieldWrapper) {
201
- return field.T.fieldWrapper.unwrapField(
202
- field.T.fieldWrapper.wrapField(value).clone()
203
- );
204
- }
205
- return value.clone();
206
- }
188
+ if (value === undefined) {
189
+ return value;
190
+ }
191
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- unmatched "map" is unsupported
192
+ switch (field.kind) {
193
+ case "enum":
194
+ return value;
195
+ case "scalar":
196
+ if (field.T === ScalarType.BYTES) {
197
+ const c = new Uint8Array(value.byteLength);
198
+ c.set(value);
199
+ return c;
200
+ }
201
+ return value;
202
+ case "message":
203
+ if (field.T.fieldWrapper) {
204
+ return field.T.fieldWrapper.unwrapField(field.T.fieldWrapper.wrapField(value).clone());
205
+ }
206
+ return value.clone();
207
+ }
207
208
  }
@@ -1 +1,14 @@
1
+ // Copyright 2021-2022 Buf Technologies, Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
1
14
  export {};