From 17931a23cb1bcaf10277409f11d552ddc53c1884 Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 4 May 2026 12:53:28 -0400 Subject: [PATCH 1/3] Fix TypeScript optional row keys --- crates/bindings-typescript/package.json | 2 +- .../src/lib/type_builders.test-d.ts | 2 ++ .../src/lib/type_builders.ts | 21 ++++++++++++++++--- .../src/sdk/table_cache.ts | 3 ++- .../bindings-typescript/src/server/views.ts | 7 +++++-- .../tsconfig.typecheck.json | 16 ++------------ crates/bindings-typescript/vitest.config.ts | 2 +- 7 files changed, 31 insertions(+), 22 deletions(-) diff --git a/crates/bindings-typescript/package.json b/crates/bindings-typescript/package.json index c7bef474278..17d6acd070d 100644 --- a/crates/bindings-typescript/package.json +++ b/crates/bindings-typescript/package.json @@ -29,7 +29,7 @@ "format": "prettier . --write --ignore-path ../../.prettierignore", "lint": "eslint . && prettier . --check --ignore-path ../../.prettierignore", "test": "vitest run", - "test:typecheck": "vitest typecheck --run", + "test:typecheck": "tsc -p tsconfig.typecheck.json --noEmit", "coverage": "vitest run --coverage", "brotli-size": "brotli-size dist/index.js", "size": "pnpm -s build && size-limit", diff --git a/crates/bindings-typescript/src/lib/type_builders.test-d.ts b/crates/bindings-typescript/src/lib/type_builders.test-d.ts index d0595f25829..bae3089e145 100644 --- a/crates/bindings-typescript/src/lib/type_builders.test-d.ts +++ b/crates/bindings-typescript/src/lib/type_builders.test-d.ts @@ -35,6 +35,8 @@ const rowOptionOptional = { }; type RowOptionOptional = InferTypeOfRow; // eslint-disable-next-line @typescript-eslint/no-unused-vars +const _rowOptionOptionalOmitted: RowOptionOptional = {}; +// eslint-disable-next-line @typescript-eslint/no-unused-vars const _rowOptionOptionalNone: RowOptionOptional = { foo: undefined, }; diff --git a/crates/bindings-typescript/src/lib/type_builders.ts b/crates/bindings-typescript/src/lib/type_builders.ts index 6bf8ae1ec99..3d4e7232292 100644 --- a/crates/bindings-typescript/src/lib/type_builders.ts +++ b/crates/bindings-typescript/src/lib/type_builders.ts @@ -39,9 +39,24 @@ export type Infer = T extends RowObj /** * Helper type to extract the type of a row from an object. */ -export type InferTypeOfRow = { - [K in keyof T & string]: InferTypeOfTypeBuilder>; -}; +type OptionalRowKeys = { + [K in keyof T & string]-?: CollapseColumn extends OptionBuilder + ? K + : never; +}[keyof T & string]; + +type RequiredRowKeys = Exclude< + keyof T & string, + OptionalRowKeys +>; + +export type InferTypeOfRow = Prettify< + { + [K in RequiredRowKeys]: InferTypeOfTypeBuilder>; + } & { + [K in OptionalRowKeys]?: InferTypeOfTypeBuilder>; + } +>; /** * Helper type to extract the type of a row from an object. diff --git a/crates/bindings-typescript/src/sdk/table_cache.ts b/crates/bindings-typescript/src/sdk/table_cache.ts index 42645daaecf..543d3fb78ed 100644 --- a/crates/bindings-typescript/src/sdk/table_cache.ts +++ b/crates/bindings-typescript/src/sdk/table_cache.ts @@ -123,7 +123,8 @@ export class TableCacheImpl< const columns = idx.columns; // Extract the tuple key for this btree index (column order preserved) - const getKey = (row: Row): readonly unknown[] => columns.map(c => row[c]); + const getKey = (row: Row): readonly unknown[] => + columns.map(c => (row as Record)[c]); // The server’s ranged scan fixes all prefix cols to equality and applies // the bound only to the *last* term. We mirror that. diff --git a/crates/bindings-typescript/src/server/views.ts b/crates/bindings-typescript/src/server/views.ts index accd0c92563..02949da6f86 100644 --- a/crates/bindings-typescript/src/server/views.ts +++ b/crates/bindings-typescript/src/server/views.ts @@ -200,8 +200,11 @@ type ViewInfo = { returnTypeBaseSize: number; }; -export type Views = ViewInfo>[]; -export type AnonViews = ViewInfo>[]; +type AnyViewFn = (ctx: ViewCtx, params: any) => any; +type AnyAnonymousViewFn = (ctx: AnonymousViewCtx, params: any) => any; + +export type Views = ViewInfo[]; +export type AnonViews = ViewInfo[]; // A helper to get the product type out of a type builder. // This is only non-never if the type builder is an array. diff --git a/crates/bindings-typescript/tsconfig.typecheck.json b/crates/bindings-typescript/tsconfig.typecheck.json index 4ff6d6ca220..d908d6db47d 100644 --- a/crates/bindings-typescript/tsconfig.typecheck.json +++ b/crates/bindings-typescript/tsconfig.typecheck.json @@ -3,18 +3,6 @@ "compilerOptions": { "jsx": "react-jsx" }, - "include": [ - "tests/**/*", - "src/lib/**/*", - "src/sdk/**/*", - "src/react/**/*", - "test-app/**/*" - ], - "exclude": [ - "node_modules", - "dist/**/*", - "src/svelte/**/*", - "src/vue/**/*", - "src/server/**/*" - ] + "include": ["src/**/*.test-d.ts", "src/server/sys.d.ts"], + "exclude": ["node_modules", "dist/**/*", "src/svelte/**/*", "src/vue/**/*"] } diff --git a/crates/bindings-typescript/vitest.config.ts b/crates/bindings-typescript/vitest.config.ts index 56dd6752bb9..44134dda93b 100644 --- a/crates/bindings-typescript/vitest.config.ts +++ b/crates/bindings-typescript/vitest.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ globals: true, environment: 'node', typecheck: { - include: ['tests/**/*.test.ts'], + include: ['src/**/*.test-d.ts'], tsconfig: './tsconfig.typecheck.json', }, }, From 7ddb11c679dc3c6220678d7268b20cf0b5f58472 Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 4 May 2026 13:32:17 -0400 Subject: [PATCH 2/3] Keep existing TS typecheck coverage --- crates/bindings-typescript/package.json | 2 +- .../tsconfig.typecheck.dts.json | 8 ++++++++ .../bindings-typescript/tsconfig.typecheck.json | 16 ++++++++++++++-- crates/bindings-typescript/vitest.config.ts | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 crates/bindings-typescript/tsconfig.typecheck.dts.json diff --git a/crates/bindings-typescript/package.json b/crates/bindings-typescript/package.json index 17d6acd070d..34499dd4029 100644 --- a/crates/bindings-typescript/package.json +++ b/crates/bindings-typescript/package.json @@ -29,7 +29,7 @@ "format": "prettier . --write --ignore-path ../../.prettierignore", "lint": "eslint . && prettier . --check --ignore-path ../../.prettierignore", "test": "vitest run", - "test:typecheck": "tsc -p tsconfig.typecheck.json --noEmit", + "test:typecheck": "tsc -p tsconfig.typecheck.dts.json --noEmit", "coverage": "vitest run --coverage", "brotli-size": "brotli-size dist/index.js", "size": "pnpm -s build && size-limit", diff --git a/crates/bindings-typescript/tsconfig.typecheck.dts.json b/crates/bindings-typescript/tsconfig.typecheck.dts.json new file mode 100644 index 00000000000..d908d6db47d --- /dev/null +++ b/crates/bindings-typescript/tsconfig.typecheck.dts.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx" + }, + "include": ["src/**/*.test-d.ts", "src/server/sys.d.ts"], + "exclude": ["node_modules", "dist/**/*", "src/svelte/**/*", "src/vue/**/*"] +} diff --git a/crates/bindings-typescript/tsconfig.typecheck.json b/crates/bindings-typescript/tsconfig.typecheck.json index d908d6db47d..4ff6d6ca220 100644 --- a/crates/bindings-typescript/tsconfig.typecheck.json +++ b/crates/bindings-typescript/tsconfig.typecheck.json @@ -3,6 +3,18 @@ "compilerOptions": { "jsx": "react-jsx" }, - "include": ["src/**/*.test-d.ts", "src/server/sys.d.ts"], - "exclude": ["node_modules", "dist/**/*", "src/svelte/**/*", "src/vue/**/*"] + "include": [ + "tests/**/*", + "src/lib/**/*", + "src/sdk/**/*", + "src/react/**/*", + "test-app/**/*" + ], + "exclude": [ + "node_modules", + "dist/**/*", + "src/svelte/**/*", + "src/vue/**/*", + "src/server/**/*" + ] } diff --git a/crates/bindings-typescript/vitest.config.ts b/crates/bindings-typescript/vitest.config.ts index 44134dda93b..56dd6752bb9 100644 --- a/crates/bindings-typescript/vitest.config.ts +++ b/crates/bindings-typescript/vitest.config.ts @@ -7,7 +7,7 @@ export default defineConfig({ globals: true, environment: 'node', typecheck: { - include: ['src/**/*.test-d.ts'], + include: ['tests/**/*.test.ts'], tsconfig: './tsconfig.typecheck.json', }, }, From 52b61112b60dd885b97611ade31bf974a4f37d04 Mon Sep 17 00:00:00 2001 From: clockwork-labs-bot Date: Mon, 4 May 2026 13:40:40 -0400 Subject: [PATCH 3/3] Restore test:typecheck script --- crates/bindings-typescript/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/bindings-typescript/package.json b/crates/bindings-typescript/package.json index 34499dd4029..c294fc5e6c6 100644 --- a/crates/bindings-typescript/package.json +++ b/crates/bindings-typescript/package.json @@ -29,7 +29,8 @@ "format": "prettier . --write --ignore-path ../../.prettierignore", "lint": "eslint . && prettier . --check --ignore-path ../../.prettierignore", "test": "vitest run", - "test:typecheck": "tsc -p tsconfig.typecheck.dts.json --noEmit", + "test:typecheck": "vitest typecheck --run", + "test:typecheck:dts": "tsc -p tsconfig.typecheck.dts.json --noEmit", "coverage": "vitest run --coverage", "brotli-size": "brotli-size dist/index.js", "size": "pnpm -s build && size-limit",