From a9031c7d896e8eea7322acc91c6b9966662ed233 Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 9 Mar 2026 17:44:04 -0400 Subject: [PATCH] Fix Bool deserialized as number in TS SDK fast path (#4591) The isFixedSizeProduct fast-path deserializer used view.getUint8() for Bool fields, which returns a number (0 or 1) instead of a boolean. The slow path (reader.readBool()) correctly uses !== 0. Fix: special-case Bool in the fast path to emit: result.foo = view.getUint8(reader.offset) !== 0; instead of: result.foo = view.getUint8(reader.offset); This caused useTable to return {foo: 1} instead of {foo: true} for products containing only fixed-size primitives. --- crates/bindings-typescript/src/lib/algebraic_type.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/bindings-typescript/src/lib/algebraic_type.ts b/crates/bindings-typescript/src/lib/algebraic_type.ts index 7ddd3f93d66..c325797af75 100644 --- a/crates/bindings-typescript/src/lib/algebraic_type.ts +++ b/crates/bindings-typescript/src/lib/algebraic_type.ts @@ -535,7 +535,11 @@ const view = reader.view; ${ty.elements .map(({ name, algebraicType: { tag } }) => tag in primitiveJSName - ? `\ + ? tag === 'Bool' + ? `\ +result.${name} = view.getUint8(reader.offset) !== 0; +reader.offset += 1;` + : `\ result.${name} = view.get${primitiveJSName[tag as JSPrimitives]}(reader.offset, ${primitiveSizes[tag] > 1 ? 'true' : ''}); reader.offset += ${primitiveSizes[tag]};` : `result.${name} = reader.read${tag}();`