Skip to content

Commit 4d90100

Browse files
authored
V2: Throw errors in ReflectMessage instead of returning them (#882)
1 parent a81603e commit 4d90100

File tree

10 files changed

+133
-151
lines changed

10 files changed

+133
-151
lines changed

packages/bundle-size/README.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ usually do. We repeat this for an increasing number of files.
1616
<!--- TABLE-START -->
1717
| code generator | files | bundle size | minified | compressed |
1818
|-----------------|----------|------------------------:|-----------------------:|-------------------:|
19-
| protobuf-es | 1 | 123,350 b | 64,136 b | 14,970 b |
20-
| protobuf-es | 4 | 125,545 b | 65,646 b | 15,662 b |
21-
| protobuf-es | 8 | 128,323 b | 67,417 b | 16,196 b |
22-
| protobuf-es | 16 | 138,831 b | 75,398 b | 18,504 b |
23-
| protobuf-es | 32 | 166,726 b | 97,413 b | 23,953 b |
19+
| protobuf-es | 1 | 123,305 b | 64,143 b | 15,010 b |
20+
| protobuf-es | 4 | 125,500 b | 65,653 b | 15,656 b |
21+
| protobuf-es | 8 | 128,278 b | 67,424 b | 16,182 b |
22+
| protobuf-es | 16 | 138,786 b | 75,405 b | 18,508 b |
23+
| protobuf-es | 32 | 166,681 b | 97,420 b | 23,963 b |
2424
| protobuf-javascript | 1 | 339,613 b | 255,820 b | 42,481 b |
2525
| protobuf-javascript | 4 | 366,281 b | 271,092 b | 43,912 b |
2626
| protobuf-javascript | 8 | 388,324 b | 283,409 b | 45,038 b |

packages/bundle-size/chart.svg

+6-6
Loading

packages/protobuf-test/src/helpers.ts

+12
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,20 @@ import { UpstreamProtobuf } from "upstream-protobuf";
1616
import { fromBinary, createFileRegistry } from "@bufbuild/protobuf";
1717
import type { FileDescriptorSet } from "@bufbuild/protobuf/wkt";
1818
import { FileDescriptorSetDesc } from "@bufbuild/protobuf/wkt";
19+
import { FieldError } from "@bufbuild/protobuf/reflect";
1920
import assert from "node:assert";
2021

22+
export function catchFieldError(fn: () => unknown): FieldError | undefined {
23+
try {
24+
fn();
25+
} catch (e) {
26+
if (e instanceof FieldError) {
27+
return e;
28+
}
29+
}
30+
return undefined;
31+
}
32+
2133
let upstreamProtobuf: UpstreamProtobuf | undefined;
2234

2335
export async function compileFileDescriptorSet(

packages/protobuf-test/src/reflect/reflect-list.test.ts

+27-25
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import * as proto3_ts from "../gen/ts/extra/proto3_pb.js";
2323
import { create, protoInt64 } from "@bufbuild/protobuf";
2424
import { UserDesc } from "../gen/ts/extra/example_pb.js";
2525
import assert from "node:assert";
26+
import { catchFieldError } from "../helpers.js";
2627

2728
describe("reflectList()", () => {
2829
test("creates ReflectList", () => {
@@ -95,87 +96,88 @@ describe("ReflectList", () => {
9596
test("adds item", () => {
9697
const local: unknown[] = ["a"];
9798
const list = reflectList(repeatedStringField, local);
98-
expect(list.add("b")).toBeUndefined();
99-
expect(list.add("c")).toBeUndefined();
99+
list.add("b");
100+
list.add("c");
100101
expect(local).toStrictEqual(["a", "b", "c"]);
101102
});
102103
test("adds items", () => {
103104
const local: unknown[] = [];
104105
const list = reflectList(repeatedStringField, local);
105-
expect(list.add("a", "b", "c")).toBeUndefined();
106+
list.add("a", "b", "c");
106107
expect(local).toStrictEqual(["a", "b", "c"]);
107108
});
108109
test("does not add any item if one of several items is invalid", () => {
109110
const local: unknown[] = [];
110111
const list = reflectList(repeatedStringField, local);
111-
expect(list.add("a", "b", true)).toBeDefined();
112+
const err = catchFieldError(() => list.add("a", "b", true));
113+
expect(err).toBeDefined();
112114
expect(local).toStrictEqual([]);
113115
});
114116
test("converts number, string, bigint to bigint for 64-bit integer field", () => {
115117
const local: unknown[] = [];
116118
const list = reflectList(repeatedInt64Field, local);
117-
expect(list.add(1)).toBeUndefined();
118-
expect(list.add("2")).toBeUndefined();
119-
expect(list.add(n3)).toBeUndefined();
119+
list.add(1);
120+
list.add("2");
121+
list.add(n3);
120122
expect(local).toStrictEqual([n1, n2, n3]);
121123
});
122124
test("converts number, string, bigint to string for 64-bit integer field with jstype=JS_STRING", () => {
123125
const local: unknown[] = [];
124126
const list = reflectList(repeatedInt64JsStringField, local);
125-
expect(list.add(1)).toBeUndefined();
126-
expect(list.add("2")).toBeUndefined();
127-
expect(list.add(n3)).toBeUndefined();
127+
list.add(1);
128+
list.add("2");
129+
list.add(n3);
128130
expect(local).toStrictEqual(["1", "2", "3"]);
129131
});
130132
test("returns error for wrong message type", () => {
131133
const list = reflectList(repeatedMessageField, []);
132-
const err = list.add(reflect(UserDesc));
134+
const err = catchFieldError(() => list.add(reflect(UserDesc)));
133135
expect(err?.message).toMatch(
134136
/^list item #1: expected ReflectMessage \(spec.Proto3Message\), got ReflectMessage \(docs.User\)$/,
135137
);
136138
});
137139
test("returns error for invalid scalar", () => {
138140
const list = reflectList(repeatedStringField, []);
139-
const err = list.add(true);
141+
const err = catchFieldError(() => list.add(true));
140142
expect(err?.message).toMatch(/^list item #1: expected string, got true$/);
141143
});
142144
});
143145
describe("set()", () => {
144146
test("replaces item at index", () => {
145147
const local: unknown[] = ["a", "b"];
146148
const list = reflectList(repeatedStringField, local);
147-
expect(list.set(0, "c")).toBeUndefined();
149+
list.set(0, "c");
148150
expect(local).toStrictEqual(["c", "b"]);
149151
});
150152
test("converts number, string, bigint to bigint for 64-bit integer field", () => {
151153
const local: unknown[] = [n0, n0, n0];
152154
const list = reflectList(repeatedInt64Field, local);
153-
expect(list.set(0, 1)).toBeUndefined();
154-
expect(list.set(1, "2")).toBeUndefined();
155-
expect(list.set(2, n3)).toBeUndefined();
155+
list.set(0, 1);
156+
list.set(1, "2");
157+
list.set(2, n3);
156158
expect(local).toStrictEqual([n1, n2, n3]);
157159
});
158160
test("converts number, string, bigint to string for 64-bit integer field with jstype=JS_STRING", () => {
159161
const local: unknown[] = ["0", "0", "0"];
160162
const list = reflectList(repeatedInt64JsStringField, local);
161-
expect(list.set(0, 1)).toBeUndefined();
162-
expect(list.set(1, "2")).toBeUndefined();
163-
expect(list.set(2, n3)).toBeUndefined();
163+
list.set(0, 1);
164+
list.set(1, "2");
165+
list.set(2, n3);
164166
expect(local).toStrictEqual(["1", "2", "3"]);
165167
});
166-
test("returns error if out of range", () => {
168+
test("throws error if out of range", () => {
167169
const list = reflectList(repeatedStringField, []);
168-
const err = list.set(0, "abc");
170+
const err = catchFieldError(() => list.set(0, "abc"));
169171
expect(err?.message).toMatch(/^list item #1: out of range$/);
170172
});
171-
test("returns error for invalid scalar", () => {
173+
test("throws error for invalid scalar", () => {
172174
const list = reflectList(repeatedStringField, [null]);
173-
const err = list.set(0, true);
175+
const err = catchFieldError(() => list.set(0, true));
174176
expect(err?.message).toMatch(/^list item #1: expected string, got true$/);
175177
});
176-
test("returns error for wrong message type", () => {
178+
test("throws error for wrong message type", () => {
177179
const list = reflectList(repeatedMessageField, [null]);
178-
const err = list.set(0, reflect(UserDesc));
180+
const err = catchFieldError(() => list.set(0, reflect(UserDesc)));
179181
expect(err?.message).toMatch(
180182
/^list item #1: expected ReflectMessage \(spec.Proto3Message\), got ReflectMessage \(docs.User\)$/,
181183
);

packages/protobuf-test/src/reflect/reflect-map.test.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { protoInt64 } from "@bufbuild/protobuf";
2424
import { UserDesc } from "../gen/ts/extra/example_pb.js";
2525
import { create } from "@bufbuild/protobuf";
2626
import assert from "node:assert";
27+
import { catchFieldError } from "../helpers.js";
2728

2829
describe("reflectMap()", () => {
2930
test("creates ReflectMap", () => {
@@ -166,15 +167,15 @@ describe("ReflectMap", () => {
166167
test("sets entry", () => {
167168
const local = {};
168169
const map = reflectMap(mapStringStringField, local);
169-
expect(map.set("a", "A")).toBeUndefined();
170+
map.set("a", "A");
170171
expect(local).toStrictEqual({ a: "A" });
171172
});
172173
test("converts key", () => {
173174
const local = {};
174175
const map = reflectMap(mapInt64Int64Field, local);
175-
expect(map.set(1, n11)).toBeUndefined();
176-
expect(map.set(n2, n22)).toBeUndefined();
177-
expect(map.set("3", n33)).toBeUndefined();
176+
map.set(1, n11);
177+
map.set(n2, n22);
178+
map.set("3", n33);
178179
expect(local).toStrictEqual({
179180
"1": n11,
180181
"2": n22,
@@ -184,32 +185,32 @@ describe("ReflectMap", () => {
184185
test("converts long value", () => {
185186
const local = {};
186187
const map = reflectMap(mapInt64Int64Field, local);
187-
expect(map.set(n1, n11)).toBeUndefined();
188-
expect(map.set(n2, 22)).toBeUndefined();
189-
expect(map.set(n3, "33")).toBeUndefined();
188+
map.set(n1, n11);
189+
map.set(n2, n22);
190+
map.set(n3, n33);
190191
expect(local).toStrictEqual({
191192
"1": n11,
192193
"2": n22,
193194
"3": n33,
194195
});
195196
});
196-
test("returns error for invalid key", () => {
197+
test("throws error for invalid key", () => {
197198
const map = reflectMap(mapInt32Int32Field, {});
198-
const err = map.set(true, "A");
199+
const err = catchFieldError(() => map.set(true, "A"));
199200
expect(err?.message).toMatch(
200201
/^invalid map key: expected number \(int32\), got true$/,
201202
);
202203
});
203-
test("returns error for invalid scalar value", () => {
204+
test("throws error for invalid scalar value", () => {
204205
const map = reflectMap(mapStringStringField, {});
205-
const err = map.set("a", true);
206+
const err = catchFieldError(() => map.set("a", true));
206207
expect(err?.message).toMatch(
207208
/^map entry "a": expected string, got true$/,
208209
);
209210
});
210-
test("returns error for wrong message type", () => {
211+
test("throws error for wrong message type", () => {
211212
const map = reflectMap(mapInt32MessageField, {});
212-
const err = map.set(1, reflect(UserDesc));
213+
const err = catchFieldError(() => map.set(1, reflect(UserDesc)));
213214
expect(err?.message).toMatch(
214215
/^map entry 1: expected ReflectMessage \(spec.Proto3Message\), got ReflectMessage \(docs.User\)$/,
215216
);

0 commit comments

Comments
 (0)