Skip to content

Commit 8e826af

Browse files
dbrainsrikrsna-buf
andauthored
Remove incomplete plan from cache when compilation fails (#137)
Co-authored-by: Sri Krishna <93153132+srikrsna-buf@users.noreply.github.com>
1 parent 701f00f commit 8e826af

2 files changed

Lines changed: 26 additions & 5 deletions

File tree

packages/protovalidate/src/planner.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,16 @@ export class Planner {
9696
const messageRules = getOption(message, ext_message);
9797
const e = new EvalMany<ReflectMessage>();
9898
this.messageCache.set(message, e);
99-
e.add(this.fields(messageRules.oneof, message.fields));
100-
e.add(this.messageCel(messageRules));
101-
e.add(this.messageOneofs(message, messageRules.oneof));
102-
e.add(this.oneofs(message.oneofs));
103-
e.prune();
99+
try {
100+
e.add(this.fields(messageRules.oneof, message.fields));
101+
e.add(this.messageCel(messageRules));
102+
e.add(this.messageOneofs(message, messageRules.oneof));
103+
e.add(this.oneofs(message.oneofs));
104+
e.prune();
105+
} catch (err) {
106+
this.messageCache.delete(message);
107+
throw err;
108+
}
104109
return e;
105110
}
106111

packages/protovalidate/src/validator.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,22 @@ void suite("Validator", () => {
329329
);
330330
assert.ok(result.error instanceof CompilationError);
331331
});
332+
void test("unknown extension raises error on every call", () => {
333+
const validator = createValidator();
334+
const person = create(personSchema, {
335+
name: "Pauly Shore",
336+
});
337+
const result = validator.validate(personSchema, person);
338+
assert.equal(result.kind, "error", "first call should explode");
339+
assert.ok(result.error instanceof CompilationError);
340+
const retryResult = validator.validate(personSchema, person);
341+
assert.equal(
342+
retryResult.kind,
343+
"error",
344+
"second call should also explode",
345+
);
346+
assert.ok(retryResult.error instanceof CompilationError);
347+
});
332348
void test("registered extension validates", () => {
333349
const validator = createValidator({
334350
registry: createRegistry(ext_abc),

0 commit comments

Comments
 (0)