diff --git a/package.json b/package.json index 6e0832e..bfb1969 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@tinybirdco/sdk", - "version": "0.0.58", + "version": "0.0.59", "description": "TypeScript SDK for Tinybird Forward - define datasources and pipes as TypeScript", "type": "module", "main": "./dist/index.js", diff --git a/src/schema/datasource.test.ts b/src/schema/datasource.test.ts index e5d85c0..bca9594 100644 --- a/src/schema/datasource.test.ts +++ b/src/schema/datasource.test.ts @@ -7,7 +7,7 @@ import { getColumnNames, column, } from "./datasource.js"; -import { t } from "./types.js"; +import { t, type AnyTypeValidator } from "./types.js"; import { engine } from "./engines.js"; import { defineKafkaConnection, defineS3Connection, defineGCSConnection } from "./connection.js"; @@ -259,6 +259,20 @@ describe("Datasource Schema", () => { expect(result).toBeUndefined(); }); + it("never returns a function when validator branding is missing", () => { + const validator = t.string(); + // Simulate a validator-like object where isTypeValidator() fails by + // removing symbol keys (including the validator brand). + const unbrandedValidator = Object.fromEntries( + Object.entries(validator as unknown as Record) + ) as unknown as AnyTypeValidator; + + const result = getColumnJsonPath(unbrandedValidator); + + expect(result).toBeUndefined(); + expect(typeof result).not.toBe("function"); + }); + it("returns jsonPath from validator modifier", () => { const validator = t.string().jsonPath("$.user.id"); const result = getColumnJsonPath(validator); diff --git a/src/schema/datasource.ts b/src/schema/datasource.ts index 8748a44..5cc393d 100644 --- a/src/schema/datasource.ts +++ b/src/schema/datasource.ts @@ -272,7 +272,9 @@ export function getColumnJsonPath(column: AnyTypeValidator | ColumnDefinition): return getModifiers(column).jsonPath; } - if (column.jsonPath !== undefined) { + // Check typeof to avoid returning the jsonPath method from validators + // if isTypeValidator incorrectly returns false (e.g., cross-module Symbol issues) + if (typeof column.jsonPath === "string") { return column.jsonPath; }