From 080dc12bf3aba35c12e8cc409e23a582d4979f47 Mon Sep 17 00:00:00 2001 From: bradleyshep Date: Thu, 24 Sep 2026 16:45:35 -0400 Subject: [PATCH] Type DbConnection.db with a merged interface instead of a declare field Generated TypeScript bindings narrowed `db` with `declare db: DbView;`. Babel rejects `declare` class fields unless `allowDeclareFields` is set, and babel-preset-expo does not set it, so React Native and Expo apps could not bundle generated bindings for any module with snake_case table accessor aliases. Declare the narrowed type on an interface merged into the class instead. It is type-only like before and emits nothing in any transpiler. Updated the codegen snapshot and the checked-in bindings to match. --- .../src/module_bindings/index.ts | 6 ++++-- .../test-app/src/module_bindings/index.ts | 6 ++++-- .../src/module_bindings/index.ts | 6 ++++-- .../test-solid-router/src/module_bindings/index.ts | 6 ++++-- crates/codegen/src/typescript.rs | 13 ++++++++++--- .../snapshots/codegen__codegen_typescript.snap | 6 ++++-- .../client-ts/src/module_bindings/index.ts | 6 ++++-- .../hangman-react-ts/src/module_bindings/index.ts | 6 ++++-- .../src/module_bindings/index.ts | 6 ++++-- 9 files changed, 42 insertions(+), 19 deletions(-) diff --git a/crates/bindings-typescript/case-conversion-test-client/src/module_bindings/index.ts b/crates/bindings-typescript/case-conversion-test-client/src/module_bindings/index.ts index 8fbf73d58d4..82ddf0cb52f 100644 --- a/crates/bindings-typescript/case-conversion-test-client/src/module_bindings/index.ts +++ b/crates/bindings-typescript/case-conversion-test-client/src/module_bindings/index.ts @@ -229,10 +229,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl< /** Builder class to configure a new database connection to the remote SpacetimeDB instance. */ export class DbConnectionBuilder extends __DbConnectionBuilder {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/crates/bindings-typescript/test-app/src/module_bindings/index.ts b/crates/bindings-typescript/test-app/src/module_bindings/index.ts index 5a5cc759b17..cf33870746c 100644 --- a/crates/bindings-typescript/test-app/src/module_bindings/index.ts +++ b/crates/bindings-typescript/test-app/src/module_bindings/index.ts @@ -249,10 +249,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl< /** Builder class to configure a new database connection to the remote SpacetimeDB instance. */ export class DbConnectionBuilder extends __DbConnectionBuilder {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/crates/bindings-typescript/test-react-router-app/src/module_bindings/index.ts b/crates/bindings-typescript/test-react-router-app/src/module_bindings/index.ts index 5a7a64d1e2b..dae611869c6 100644 --- a/crates/bindings-typescript/test-react-router-app/src/module_bindings/index.ts +++ b/crates/bindings-typescript/test-react-router-app/src/module_bindings/index.ts @@ -227,10 +227,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl< /** Builder class to configure a new database connection to the remote SpacetimeDB instance. */ export class DbConnectionBuilder extends __DbConnectionBuilder {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/crates/bindings-typescript/test-solid-router/src/module_bindings/index.ts b/crates/bindings-typescript/test-solid-router/src/module_bindings/index.ts index 5a7a64d1e2b..dae611869c6 100644 --- a/crates/bindings-typescript/test-solid-router/src/module_bindings/index.ts +++ b/crates/bindings-typescript/test-solid-router/src/module_bindings/index.ts @@ -227,10 +227,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl< /** Builder class to configure a new database connection to the remote SpacetimeDB instance. */ export class DbConnectionBuilder extends __DbConnectionBuilder {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/crates/codegen/src/typescript.rs b/crates/codegen/src/typescript.rs index 2706949d05b..226ecb0fcc8 100644 --- a/crates/codegen/src/typescript.rs +++ b/crates/codegen/src/typescript.rs @@ -759,6 +759,16 @@ impl Lang for TypeScript { ); writeln!(out); + if has_table_accessor_aliases { + // Narrow `db` by merging an interface into the class rather than with a + // `declare` field, which Babel (React Native, Expo) rejects by default. + writeln!(out, "export interface DbConnection {{"); + out.indent(1); + writeln!(out, "db: DbView;"); + out.dedent(1); + writeln!(out, "}}"); + writeln!(out); + } writeln!(out, "/** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */"); writeln!( out, @@ -766,9 +776,6 @@ impl Lang for TypeScript { ); out.indent(1); if has_table_accessor_aliases { - writeln!(out, "declare db: DbView;"); - - writeln!(out); writeln!( out, "constructor(config: __DbConnectionConfig) {{" diff --git a/crates/codegen/tests/snapshots/codegen__codegen_typescript.snap b/crates/codegen/tests/snapshots/codegen__codegen_typescript.snap index 80b88f79b73..e32448cbd40 100644 --- a/crates/codegen/tests/snapshots/codegen__codegen_typescript.snap +++ b/crates/codegen/tests/snapshots/codegen__codegen_typescript.snap @@ -409,10 +409,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/demo/Blackholio/client-ts/src/module_bindings/index.ts b/demo/Blackholio/client-ts/src/module_bindings/index.ts index 81afe450da0..0e7f3e8df74 100644 --- a/demo/Blackholio/client-ts/src/module_bindings/index.ts +++ b/demo/Blackholio/client-ts/src/module_bindings/index.ts @@ -219,10 +219,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/templates/hangman-react-ts/src/module_bindings/index.ts b/templates/hangman-react-ts/src/module_bindings/index.ts index 6852d40b6fe..625f44b14a7 100644 --- a/templates/hangman-react-ts/src/module_bindings/index.ts +++ b/templates/hangman-react-ts/src/module_bindings/index.ts @@ -259,10 +259,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl< /** Builder class to configure a new database connection to the remote SpacetimeDB instance. */ export class DbConnectionBuilder extends __DbConnectionBuilder {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView; diff --git a/templates/money-exchange-react-ts/src/module_bindings/index.ts b/templates/money-exchange-react-ts/src/module_bindings/index.ts index c4bf96e2c56..ee0cd17aa2f 100644 --- a/templates/money-exchange-react-ts/src/module_bindings/index.ts +++ b/templates/money-exchange-react-ts/src/module_bindings/index.ts @@ -229,10 +229,12 @@ export class SubscriptionBuilder extends __SubscriptionBuilderImpl< /** Builder class to configure a new database connection to the remote SpacetimeDB instance. */ export class DbConnectionBuilder extends __DbConnectionBuilder {} +export interface DbConnection { + db: DbView; +} + /** The typed database connection to manage connections to the remote SpacetimeDB instance. This class has type information specific to the generated module. */ export class DbConnection extends __DbConnectionImpl { - declare db: DbView; - constructor(config: __DbConnectionConfig) { super(config); this.db = __withTableAccessorAliases(this.db) as DbView;