Skip to content

Commit b44156d

Browse files
Ludv1gLclaudebfops
authored
fix(ts-sdk): Add primaryKey() and index() to SumBuilderImpl and SumColumnBuilder (#4389)
## Summary - Codegen unconditionally emits `.primaryKey()` on all primary key columns, including enum types - `SumBuilderImpl` (used for **all** object-form enums via `__t.enum("Name", { ... })`) only implemented `Defaultable` and `Nameable` — not `PrimaryKeyable` or `Indexable` - This causes a runtime `TypeError: SC.primaryKey is not a function` whenever an enum type is used as a primary key column ## Fix Add `Indexable` and `PrimaryKeyable` interfaces and their methods to: - `SumBuilderImpl` (the base class for all enum type builders) - `SumColumnBuilder` (the column builder returned by `SumBuilderImpl` methods) This matches the existing pattern already present in `SimpleSumBuilderImpl` and `SimpleSumColumnBuilder`. ## Why SumBuilderImpl and not just SimpleSumBuilderImpl? Codegen always generates object-form enums: ```typescript export const PlatformModuleType = __t.enum("PlatformModuleType", { Standard: __t.unit, Control: __t.unit, }); ``` The runtime dispatch in `type_builders.ts` (line ~3656) routes object-form enums to `SumBuilder` (backed by `SumBuilderImpl`), never to `SimpleSumBuilder`. So `SimpleSumBuilderImpl`'s existing `primaryKey()`/`index()` methods are effectively dead code for codegen output. ## Test plan - [x] Verify enum types used as primary keys no longer throw `TypeError: SC.primaryKey is not a function` - [ ] Verify existing `SimpleSumBuilderImpl`/`SimpleSumColumnBuilder` behavior is unchanged (subclass overrides still work) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Zeke Foppa <196249+bfops@users.noreply.github.com>
1 parent cda345a commit b44156d

1 file changed

Lines changed: 60 additions & 2 deletions

File tree

crates/bindings-typescript/src/lib/type_builders.ts

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,7 +1568,9 @@ class SumBuilderImpl<Variants extends VariantsObj>
15681568
extends TypeBuilder<EnumType<Variants>, VariantsToSumType<Variants>>
15691569
implements
15701570
Defaultable<EnumType<Variants>, VariantsToSumType<Variants>>,
1571-
Nameable<EnumType<Variants>, VariantsToSumType<Variants>>
1571+
Nameable<EnumType<Variants>, VariantsToSumType<Variants>>,
1572+
Indexable<EnumType<Variants>, VariantsToSumType<Variants>>,
1573+
PrimaryKeyable<EnumType<Variants>, VariantsToSumType<Variants>>
15721574
{
15731575
readonly variants: Variants;
15741576
readonly typeName: string | undefined;
@@ -1673,6 +1675,33 @@ class SumBuilderImpl<Variants extends VariantsObj>
16731675
): SumColumnBuilder<Variants, SetField<DefaultMetadata, 'name', Name>> {
16741676
return new SumColumnBuilder(this, set(defaultMetadata, { name }));
16751677
}
1678+
index(): SumColumnBuilder<
1679+
Variants,
1680+
SetField<DefaultMetadata, 'indexType', 'btree'>
1681+
>;
1682+
index<N extends NonNullable<IndexTypes>>(
1683+
algorithm: N
1684+
): SumColumnBuilder<Variants, SetField<DefaultMetadata, 'indexType', N>>;
1685+
index(
1686+
algorithm: IndexTypes = 'btree'
1687+
): SumColumnBuilder<
1688+
Variants,
1689+
SetField<DefaultMetadata, 'indexType', IndexTypes>
1690+
> {
1691+
return new SumColumnBuilder(
1692+
this,
1693+
set(defaultMetadata, { indexType: algorithm })
1694+
);
1695+
}
1696+
primaryKey(): SumColumnBuilder<
1697+
Variants,
1698+
SetField<DefaultMetadata, 'isPrimaryKey', true>
1699+
> {
1700+
return new SumColumnBuilder(
1701+
this,
1702+
set(defaultMetadata, { isPrimaryKey: true })
1703+
);
1704+
}
16761705
}
16771706

16781707
export const SumBuilder: {
@@ -3273,7 +3302,9 @@ export class SumColumnBuilder<
32733302
extends ColumnBuilder<EnumType<Variants>, VariantsToSumType<Variants>, M>
32743303
implements
32753304
Defaultable<EnumType<Variants>, VariantsToSumType<Variants>>,
3276-
Nameable<EnumType<Variants>, VariantsToSumType<Variants>>
3305+
Nameable<EnumType<Variants>, VariantsToSumType<Variants>>,
3306+
Indexable<EnumType<Variants>, VariantsToSumType<Variants>>,
3307+
PrimaryKeyable<EnumType<Variants>, VariantsToSumType<Variants>>
32773308
{
32783309
default(
32793310
value: EnumType<Variants>
@@ -3294,6 +3325,33 @@ export class SumColumnBuilder<
32943325
set(this.columnMetadata, { name })
32953326
);
32963327
}
3328+
index(): SumColumnBuilder<
3329+
Variants,
3330+
SetField<DefaultMetadata, 'indexType', 'btree'>
3331+
>;
3332+
index<N extends NonNullable<IndexTypes>>(
3333+
algorithm: N
3334+
): SumColumnBuilder<Variants, SetField<DefaultMetadata, 'indexType', N>>;
3335+
index(
3336+
algorithm: IndexTypes = 'btree'
3337+
): SumColumnBuilder<
3338+
Variants,
3339+
SetField<DefaultMetadata, 'indexType', IndexTypes>
3340+
> {
3341+
return new SumColumnBuilder(
3342+
this.typeBuilder,
3343+
set(this.columnMetadata, { indexType: algorithm })
3344+
);
3345+
}
3346+
primaryKey(): SumColumnBuilder<
3347+
Variants,
3348+
SetField<DefaultMetadata, 'isPrimaryKey', true>
3349+
> {
3350+
return new SumColumnBuilder(
3351+
this.typeBuilder,
3352+
set(this.columnMetadata, { isPrimaryKey: true })
3353+
);
3354+
}
32973355
}
32983356

32993357
export class SimpleSumColumnBuilder<

0 commit comments

Comments
 (0)