@tinybirdco/sdk 0.0.19 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -175,6 +175,53 @@ const result = await tinybird.query.topPages({
175
175
  // result.data is fully typed: { pathname: string, views: bigint }[]
176
176
  ```
177
177
 
178
+ ## Public Tinybird API (Optional)
179
+
180
+ If you want a low-level API wrapper that is decoupled from the typed client layer,
181
+ you can use `createTinybirdApi()` directly with just `baseUrl` and `token`:
182
+
183
+ ```typescript
184
+ import { createTinybirdApi } from "@tinybirdco/sdk";
185
+
186
+ const api = createTinybirdApi({
187
+ baseUrl: "https://api.tinybird.co",
188
+ token: process.env.TINYBIRD_TOKEN!,
189
+ });
190
+
191
+ // Query endpoint pipe (with optional type parameters)
192
+ interface TopPagesRow { pathname: string; visits: number }
193
+ interface TopPagesParams { start_date: string; end_date: string; limit?: number }
194
+
195
+ const topPages = await api.query<TopPagesRow, TopPagesParams>("top_pages", {
196
+ start_date: "2024-01-01",
197
+ end_date: "2024-01-31",
198
+ limit: 5,
199
+ });
200
+
201
+ // Ingest one row into datasource (with optional type parameter)
202
+ interface EventRow { timestamp: Date; event_name: string; pathname: string }
203
+
204
+ await api.ingest<EventRow>("events", {
205
+ timestamp: new Date(),
206
+ event_name: "page_view",
207
+ pathname: "/home",
208
+ });
209
+
210
+ // Execute raw SQL (with optional type parameter)
211
+ interface CountResult { total: number }
212
+
213
+ const sqlResult = await api.sql<CountResult>("SELECT count() AS total FROM events");
214
+
215
+ // Optional per-request token override
216
+ await api.request("/v1/workspace", {
217
+ token: process.env.TINYBIRD_BRANCH_TOKEN,
218
+ });
219
+ ```
220
+
221
+ This Tinybird API is standalone and can be used without `createClient()` or `createTinybirdClient()`.
222
+ It is intended for cases where you want a simple public API that remains
223
+ decoupled from the higher-level typed client APIs.
224
+
178
225
  ## CLI Commands
179
226
 
180
227
  ### `npx tinybird init`
@@ -0,0 +1,89 @@
1
+ import type { IngestOptions, IngestResult, QueryOptions, QueryResult, TinybirdErrorResponse } from "../client/types.js";
2
+ /**
3
+ * Public, decoupled Tinybird API wrapper configuration
4
+ */
5
+ export interface TinybirdApiConfig {
6
+ /** Tinybird API base URL (e.g. https://api.tinybird.co) */
7
+ baseUrl: string;
8
+ /** Tinybird token used for Authorization bearer header */
9
+ token: string;
10
+ /** Custom fetch implementation (optional) */
11
+ fetch?: typeof fetch;
12
+ /** Default timeout in milliseconds (optional) */
13
+ timeout?: number;
14
+ }
15
+ /**
16
+ * Request options for the API layer
17
+ */
18
+ export interface TinybirdApiRequestInit extends RequestInit {
19
+ /** Optional token override for a specific request */
20
+ token?: string;
21
+ }
22
+ export interface TinybirdApiQueryOptions extends QueryOptions {
23
+ /** Optional token override for this request */
24
+ token?: string;
25
+ }
26
+ export interface TinybirdApiIngestOptions extends IngestOptions {
27
+ /** Optional token override for this request */
28
+ token?: string;
29
+ }
30
+ /**
31
+ * Error thrown by TinybirdApi when a response is not OK
32
+ */
33
+ export declare class TinybirdApiError extends Error {
34
+ readonly statusCode: number;
35
+ readonly responseBody?: string;
36
+ readonly response?: TinybirdErrorResponse;
37
+ constructor(message: string, statusCode: number, responseBody?: string, response?: TinybirdErrorResponse);
38
+ }
39
+ /**
40
+ * Low-level Tinybird API wrapper.
41
+ *
42
+ * This layer is intentionally decoupled from the typed TinybirdClient layer
43
+ * so it can be used standalone with just baseUrl + token.
44
+ */
45
+ export declare class TinybirdApi {
46
+ private readonly config;
47
+ private readonly baseUrl;
48
+ private readonly defaultToken;
49
+ private readonly fetchFn;
50
+ constructor(config: TinybirdApiConfig);
51
+ /**
52
+ * Execute a request against Tinybird API.
53
+ */
54
+ request(path: string, init?: TinybirdApiRequestInit): Promise<Response>;
55
+ /**
56
+ * Execute a request and parse JSON response.
57
+ */
58
+ requestJson<T = unknown>(path: string, init?: TinybirdApiRequestInit): Promise<T>;
59
+ /**
60
+ * Query a Tinybird endpoint
61
+ */
62
+ query<T = unknown, P extends Record<string, unknown> = Record<string, unknown>>(endpointName: string, params?: P, options?: TinybirdApiQueryOptions): Promise<QueryResult<T>>;
63
+ /**
64
+ * Ingest a single row into a datasource
65
+ */
66
+ ingest<T extends Record<string, unknown>>(datasourceName: string, event: T, options?: TinybirdApiIngestOptions): Promise<IngestResult>;
67
+ /**
68
+ * Ingest a batch of rows into a datasource
69
+ */
70
+ ingestBatch<T extends Record<string, unknown>>(datasourceName: string, events: T[], options?: TinybirdApiIngestOptions): Promise<IngestResult>;
71
+ /**
72
+ * Execute raw SQL against Tinybird
73
+ */
74
+ sql<T = unknown>(sql: string, options?: TinybirdApiQueryOptions): Promise<QueryResult<T>>;
75
+ private createAbortSignal;
76
+ private serializeEvent;
77
+ private serializeValue;
78
+ private handleErrorResponse;
79
+ private resolveUrl;
80
+ }
81
+ /**
82
+ * Create a decoupled Tinybird API wrapper.
83
+ */
84
+ export declare function createTinybirdApi(config: TinybirdApiConfig): TinybirdApi;
85
+ /**
86
+ * Alias for teams that prefer "wrapper" naming.
87
+ */
88
+ export declare const createTinybirdApiWrapper: typeof createTinybirdApi;
89
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,218 @@
1
+ import { createTinybirdFetcher } from "./fetcher.js";
2
+ const DEFAULT_TIMEOUT = 30000;
3
+ /**
4
+ * Error thrown by TinybirdApi when a response is not OK
5
+ */
6
+ export class TinybirdApiError extends Error {
7
+ statusCode;
8
+ responseBody;
9
+ response;
10
+ constructor(message, statusCode, responseBody, response) {
11
+ super(message);
12
+ this.name = "TinybirdApiError";
13
+ this.statusCode = statusCode;
14
+ this.responseBody = responseBody;
15
+ this.response = response;
16
+ }
17
+ }
18
+ /**
19
+ * Low-level Tinybird API wrapper.
20
+ *
21
+ * This layer is intentionally decoupled from the typed TinybirdClient layer
22
+ * so it can be used standalone with just baseUrl + token.
23
+ */
24
+ export class TinybirdApi {
25
+ config;
26
+ baseUrl;
27
+ defaultToken;
28
+ fetchFn;
29
+ constructor(config) {
30
+ if (!config.baseUrl) {
31
+ throw new Error("baseUrl is required");
32
+ }
33
+ if (!config.token) {
34
+ throw new Error("token is required");
35
+ }
36
+ this.config = config;
37
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
38
+ this.defaultToken = config.token;
39
+ this.fetchFn = createTinybirdFetcher(config.fetch ?? globalThis.fetch);
40
+ }
41
+ /**
42
+ * Execute a request against Tinybird API.
43
+ */
44
+ request(path, init = {}) {
45
+ const { token, headers, ...requestInit } = init;
46
+ const authToken = token ?? this.defaultToken;
47
+ const requestHeaders = new Headers(headers);
48
+ if (!requestHeaders.has("Authorization")) {
49
+ requestHeaders.set("Authorization", `Bearer ${authToken}`);
50
+ }
51
+ return this.fetchFn(this.resolveUrl(path), {
52
+ ...requestInit,
53
+ headers: requestHeaders,
54
+ });
55
+ }
56
+ /**
57
+ * Execute a request and parse JSON response.
58
+ */
59
+ async requestJson(path, init = {}) {
60
+ const response = await this.request(path, init);
61
+ if (!response.ok) {
62
+ await this.handleErrorResponse(response);
63
+ }
64
+ return (await response.json());
65
+ }
66
+ /**
67
+ * Query a Tinybird endpoint
68
+ */
69
+ async query(endpointName, params = {}, options = {}) {
70
+ const url = new URL(`/v0/pipes/${endpointName}.json`, `${this.baseUrl}/`);
71
+ for (const [key, value] of Object.entries(params)) {
72
+ if (value === undefined || value === null) {
73
+ continue;
74
+ }
75
+ if (Array.isArray(value)) {
76
+ for (const item of value) {
77
+ url.searchParams.append(key, String(item));
78
+ }
79
+ continue;
80
+ }
81
+ if (value instanceof Date) {
82
+ url.searchParams.set(key, value.toISOString());
83
+ continue;
84
+ }
85
+ url.searchParams.set(key, String(value));
86
+ }
87
+ const response = await this.request(url.toString(), {
88
+ method: "GET",
89
+ token: options.token,
90
+ signal: this.createAbortSignal(options.timeout, options.signal),
91
+ });
92
+ if (!response.ok) {
93
+ await this.handleErrorResponse(response);
94
+ }
95
+ return (await response.json());
96
+ }
97
+ /**
98
+ * Ingest a single row into a datasource
99
+ */
100
+ async ingest(datasourceName, event, options = {}) {
101
+ return this.ingestBatch(datasourceName, [event], options);
102
+ }
103
+ /**
104
+ * Ingest a batch of rows into a datasource
105
+ */
106
+ async ingestBatch(datasourceName, events, options = {}) {
107
+ if (events.length === 0) {
108
+ return { successful_rows: 0, quarantined_rows: 0 };
109
+ }
110
+ const url = new URL("/v0/events", `${this.baseUrl}/`);
111
+ url.searchParams.set("name", datasourceName);
112
+ if (options.wait !== false) {
113
+ url.searchParams.set("wait", "true");
114
+ }
115
+ const ndjson = events
116
+ .map((event) => JSON.stringify(this.serializeEvent(event)))
117
+ .join("\n");
118
+ const response = await this.request(url.toString(), {
119
+ method: "POST",
120
+ token: options.token,
121
+ headers: {
122
+ "Content-Type": "application/x-ndjson",
123
+ },
124
+ body: ndjson,
125
+ signal: this.createAbortSignal(options.timeout, options.signal),
126
+ });
127
+ if (!response.ok) {
128
+ await this.handleErrorResponse(response);
129
+ }
130
+ return (await response.json());
131
+ }
132
+ /**
133
+ * Execute raw SQL against Tinybird
134
+ */
135
+ async sql(sql, options = {}) {
136
+ const response = await this.request("/v0/sql", {
137
+ method: "POST",
138
+ token: options.token,
139
+ headers: {
140
+ "Content-Type": "text/plain",
141
+ },
142
+ body: sql,
143
+ signal: this.createAbortSignal(options.timeout, options.signal),
144
+ });
145
+ if (!response.ok) {
146
+ await this.handleErrorResponse(response);
147
+ }
148
+ return (await response.json());
149
+ }
150
+ createAbortSignal(timeout, existingSignal) {
151
+ const timeoutMs = timeout ?? this.config.timeout ?? DEFAULT_TIMEOUT;
152
+ if (!timeoutMs && !existingSignal) {
153
+ return undefined;
154
+ }
155
+ if (!timeoutMs && existingSignal) {
156
+ return existingSignal;
157
+ }
158
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
159
+ if (!existingSignal) {
160
+ return timeoutSignal;
161
+ }
162
+ return AbortSignal.any([timeoutSignal, existingSignal]);
163
+ }
164
+ serializeEvent(event) {
165
+ const serialized = {};
166
+ for (const [key, value] of Object.entries(event)) {
167
+ serialized[key] = this.serializeValue(value);
168
+ }
169
+ return serialized;
170
+ }
171
+ serializeValue(value) {
172
+ if (value instanceof Date) {
173
+ return value.toISOString();
174
+ }
175
+ if (value instanceof Map) {
176
+ return Object.fromEntries(value);
177
+ }
178
+ if (typeof value === "bigint") {
179
+ return value.toString();
180
+ }
181
+ if (Array.isArray(value)) {
182
+ return value.map((item) => this.serializeValue(item));
183
+ }
184
+ if (typeof value === "object" && value !== null) {
185
+ return this.serializeEvent(value);
186
+ }
187
+ return value;
188
+ }
189
+ async handleErrorResponse(response) {
190
+ const rawBody = await response.text();
191
+ let errorResponse;
192
+ try {
193
+ errorResponse = JSON.parse(rawBody);
194
+ }
195
+ catch {
196
+ // ignore parse error and keep raw body
197
+ }
198
+ const message = errorResponse?.error ??
199
+ (rawBody
200
+ ? `Request failed with status ${response.status}: ${rawBody}`
201
+ : `Request failed with status ${response.status}`);
202
+ throw new TinybirdApiError(message, response.status, rawBody || undefined, errorResponse);
203
+ }
204
+ resolveUrl(path) {
205
+ return new URL(path, `${this.baseUrl}/`).toString();
206
+ }
207
+ }
208
+ /**
209
+ * Create a decoupled Tinybird API wrapper.
210
+ */
211
+ export function createTinybirdApi(config) {
212
+ return new TinybirdApi(config);
213
+ }
214
+ /**
215
+ * Alias for teams that prefer "wrapper" naming.
216
+ */
217
+ export const createTinybirdApiWrapper = createTinybirdApi;
218
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/api/api.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,226 @@
1
+ import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest";
2
+ import { setupServer } from "msw/node";
3
+ import { http, HttpResponse } from "msw";
4
+ import { createTinybirdApi } from "./api.js";
5
+ import { TINYBIRD_FROM_PARAM } from "./fetcher.js";
6
+ import { BASE_URL } from "../test/handlers.js";
7
+ const server = setupServer();
8
+ beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
9
+ afterEach(() => server.resetHandlers());
10
+ afterAll(() => server.close());
11
+ describe("TinybirdApi", () => {
12
+ it("sends authorization header and from=ts-sdk param", async () => {
13
+ let authorizationHeader = null;
14
+ let fromParam = null;
15
+ server.use(http.get(`${BASE_URL}/v1/workspace`, ({ request }) => {
16
+ authorizationHeader = request.headers.get("Authorization");
17
+ const url = new URL(request.url);
18
+ fromParam = url.searchParams.get("from");
19
+ return HttpResponse.json({ ok: true });
20
+ }));
21
+ const api = createTinybirdApi({
22
+ baseUrl: BASE_URL,
23
+ token: "p.default-token",
24
+ });
25
+ await api.request("/v1/workspace");
26
+ expect(authorizationHeader).toBe("Bearer p.default-token");
27
+ expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
28
+ });
29
+ it("resolves relative paths and preserves query params", async () => {
30
+ let fooParam = null;
31
+ let fromParam = null;
32
+ server.use(http.get(`${BASE_URL}/v1/build`, ({ request }) => {
33
+ const url = new URL(request.url);
34
+ fooParam = url.searchParams.get("foo");
35
+ fromParam = url.searchParams.get("from");
36
+ return HttpResponse.json({ ok: true });
37
+ }));
38
+ const api = createTinybirdApi({
39
+ baseUrl: `${BASE_URL}/`,
40
+ token: "p.default-token",
41
+ });
42
+ await api.request("v1/build?foo=bar");
43
+ expect(fooParam).toBe("bar");
44
+ expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
45
+ });
46
+ it("allows per-request token override", async () => {
47
+ let authorizationHeader = null;
48
+ server.use(http.get(`${BASE_URL}/v1/workspace`, ({ request }) => {
49
+ authorizationHeader = request.headers.get("Authorization");
50
+ return HttpResponse.json({ ok: true });
51
+ }));
52
+ const api = createTinybirdApi({
53
+ baseUrl: BASE_URL,
54
+ token: "p.default-token",
55
+ });
56
+ await api.request("/v1/workspace", { token: "p.override-token" });
57
+ expect(authorizationHeader).toBe("Bearer p.override-token");
58
+ });
59
+ it("queries endpoint params via tinybirdApi.query", async () => {
60
+ let fromParam = null;
61
+ let startDateParam = null;
62
+ let limitParam = null;
63
+ let tagsParams = [];
64
+ server.use(http.get(`${BASE_URL}/v0/pipes/top_pages.json`, ({ request }) => {
65
+ const url = new URL(request.url);
66
+ fromParam = url.searchParams.get("from");
67
+ startDateParam = url.searchParams.get("start_date");
68
+ limitParam = url.searchParams.get("limit");
69
+ tagsParams = url.searchParams.getAll("tags");
70
+ return HttpResponse.json({
71
+ data: [{ pathname: "/", views: 1 }],
72
+ meta: [
73
+ { name: "pathname", type: "String" },
74
+ { name: "views", type: "UInt64" },
75
+ ],
76
+ rows: 1,
77
+ statistics: {
78
+ elapsed: 0.001,
79
+ rows_read: 1,
80
+ bytes_read: 10,
81
+ },
82
+ });
83
+ }));
84
+ const api = createTinybirdApi({
85
+ baseUrl: BASE_URL,
86
+ token: "p.default-token",
87
+ });
88
+ const result = await api.query("top_pages", {
89
+ start_date: new Date("2024-01-01T00:00:00.000Z"),
90
+ limit: 5,
91
+ tags: ["a", "b"],
92
+ });
93
+ expect(result.rows).toBe(1);
94
+ expect(result.data[0]).toEqual({ pathname: "/", views: 1 });
95
+ expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
96
+ expect(startDateParam).toBe("2024-01-01T00:00:00.000Z");
97
+ expect(limitParam).toBe("5");
98
+ expect(tagsParams).toEqual(["a", "b"]);
99
+ });
100
+ it("ingests rows via tinybirdApi.ingest", async () => {
101
+ let datasourceName = null;
102
+ let waitParam = null;
103
+ let fromParam = null;
104
+ let contentType = null;
105
+ let parsedBody = null;
106
+ server.use(http.post(`${BASE_URL}/v0/events`, async ({ request }) => {
107
+ const url = new URL(request.url);
108
+ datasourceName = url.searchParams.get("name");
109
+ waitParam = url.searchParams.get("wait");
110
+ fromParam = url.searchParams.get("from");
111
+ contentType = request.headers.get("content-type");
112
+ const rawBody = await request.text();
113
+ parsedBody = JSON.parse(rawBody);
114
+ return HttpResponse.json({
115
+ successful_rows: 1,
116
+ quarantined_rows: 0,
117
+ });
118
+ }));
119
+ const api = createTinybirdApi({
120
+ baseUrl: BASE_URL,
121
+ token: "p.default-token",
122
+ });
123
+ const result = await api.ingest("events", {
124
+ timestamp: new Date("2024-01-01T00:00:00.000Z"),
125
+ count: 10n,
126
+ payload: new Map([["k", "v"]]),
127
+ nested: {
128
+ when: new Date("2024-01-02T00:00:00.000Z"),
129
+ },
130
+ });
131
+ expect(result).toEqual({ successful_rows: 1, quarantined_rows: 0 });
132
+ expect(datasourceName).toBe("events");
133
+ expect(waitParam).toBe("true");
134
+ expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
135
+ expect(contentType).toBe("application/x-ndjson");
136
+ expect(parsedBody).toEqual({
137
+ timestamp: "2024-01-01T00:00:00.000Z",
138
+ count: "10",
139
+ payload: { k: "v" },
140
+ nested: { when: "2024-01-02T00:00:00.000Z" },
141
+ });
142
+ });
143
+ it("executes raw SQL via tinybirdApi.sql", async () => {
144
+ let rawSql = null;
145
+ let contentType = null;
146
+ server.use(http.post(`${BASE_URL}/v0/sql`, async ({ request }) => {
147
+ contentType = request.headers.get("content-type");
148
+ rawSql = await request.text();
149
+ return HttpResponse.json({
150
+ data: [{ value: 1 }],
151
+ meta: [{ name: "value", type: "UInt8" }],
152
+ rows: 1,
153
+ statistics: {
154
+ elapsed: 0.001,
155
+ rows_read: 1,
156
+ bytes_read: 1,
157
+ },
158
+ });
159
+ }));
160
+ const api = createTinybirdApi({
161
+ baseUrl: BASE_URL,
162
+ token: "p.default-token",
163
+ });
164
+ const result = await api.sql("SELECT 1 AS value");
165
+ expect(result.data[0]?.value).toBe(1);
166
+ expect(contentType).toBe("text/plain");
167
+ expect(rawSql).toBe("SELECT 1 AS value");
168
+ });
169
+ it("returns zero counts for empty ingest batches", async () => {
170
+ const api = createTinybirdApi({
171
+ baseUrl: BASE_URL,
172
+ token: "p.default-token",
173
+ });
174
+ const result = await api.ingestBatch("events", []);
175
+ expect(result).toEqual({ successful_rows: 0, quarantined_rows: 0 });
176
+ });
177
+ it("parses JSON responses", async () => {
178
+ server.use(http.get(`${BASE_URL}/v1/workspace`, () => {
179
+ return HttpResponse.json({ id: "ws_123", name: "main" });
180
+ }));
181
+ const api = createTinybirdApi({
182
+ baseUrl: BASE_URL,
183
+ token: "p.default-token",
184
+ });
185
+ const result = await api.requestJson("/v1/workspace");
186
+ expect(result.id).toBe("ws_123");
187
+ expect(result.name).toBe("main");
188
+ });
189
+ it("throws TinybirdApiError for non-OK responses", async () => {
190
+ server.use(http.get(`${BASE_URL}/v1/workspace`, () => {
191
+ return new HttpResponse("Unauthorized", { status: 401 });
192
+ }));
193
+ const api = createTinybirdApi({
194
+ baseUrl: BASE_URL,
195
+ token: "p.default-token",
196
+ });
197
+ await expect(api.requestJson("/v1/workspace")).rejects.toMatchObject({
198
+ name: "TinybirdApiError",
199
+ statusCode: 401,
200
+ responseBody: "Unauthorized",
201
+ });
202
+ });
203
+ it("throws TinybirdApiError with parsed API details", async () => {
204
+ server.use(http.get(`${BASE_URL}/v0/pipes/broken.json`, () => {
205
+ return HttpResponse.json({
206
+ error: "Invalid query",
207
+ status: 400,
208
+ documentation: "https://www.tinybird.co/docs",
209
+ }, { status: 400 });
210
+ }));
211
+ const api = createTinybirdApi({
212
+ baseUrl: BASE_URL,
213
+ token: "p.default-token",
214
+ });
215
+ await expect(api.query("broken")).rejects.toMatchObject({
216
+ name: "TinybirdApiError",
217
+ statusCode: 400,
218
+ message: "Invalid query",
219
+ response: {
220
+ error: "Invalid query",
221
+ status: 400,
222
+ },
223
+ });
224
+ });
225
+ });
226
+ //# sourceMappingURL=api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/api/api.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;AAE7B,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAChE,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;AACxC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAE/B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,IAAI,mBAAmB,GAAkB,IAAI,CAAC;QAC9C,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACnD,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAEnC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACvC,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,GAAG,QAAQ,GAAG;YACvB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEtC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,IAAI,mBAAmB,GAAkB,IAAI,CAAC;QAE9C,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACnD,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC3D,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAElE,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,UAAU,GAAa,EAAE,CAAC;QAE9B,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,0BAA0B,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACpD,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,UAAU,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE7C,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,EAAE;oBACJ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAClC;gBACD,IAAI,EAAE,CAAC;gBACP,UAAU,EAAE;oBACV,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,EAAE;iBACf;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAsC,WAAW,EAAE;YAC/E,UAAU,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;YAChD,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxD,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,IAAI,cAAc,GAAkB,IAAI,CAAC;QACzC,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,UAAU,GAAmC,IAAI,CAAC;QAEtD,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,YAAY,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC9C,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACzC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAElD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjC,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxC,SAAS,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;YAC/C,KAAK,EAAE,GAAG;YACV,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9B,MAAM,EAAE;gBACN,IAAI,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;aAC3C;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;YACzB,SAAS,EAAE,0BAA0B;YACrC,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE;YACnB,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;SAC7C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,WAAW,GAAkB,IAAI,CAAC;QAEtC,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACpD,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAClD,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAE9B,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBACpB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACxC,IAAI,EAAE,CAAC;gBACP,UAAU,EAAE;oBACV,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC;iBACd;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAoB,mBAAmB,CAAC,CAAC;QAErE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,eAAe,EAAE,GAAG,EAAE;YACxC,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAA+B,eAAe,CAAC,CAAC;QAEpF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,eAAe,EAAE,GAAG,EAAE;YACxC,OAAO,IAAI,YAAY,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACnE,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,GAAG;YACf,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,uBAAuB,EAAE,GAAG,EAAE;YAChD,OAAO,YAAY,CAAC,IAAI,CACtB;gBACE,KAAK,EAAE,eAAe;gBACtB,MAAM,EAAE,GAAG;gBACX,aAAa,EAAE,8BAA8B;aAC9C,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC5B,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,iBAAiB;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACtD,IAAI,EAAE,kBAAkB;YACxB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE;gBACR,KAAK,EAAE,eAAe;gBACtB,MAAM,EAAE,GAAG;aACZ;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -32,7 +32,7 @@ import type { ClientConfig, QueryResult, IngestResult, QueryOptions, IngestOptio
32
32
  */
33
33
  export declare class TinybirdClient {
34
34
  private readonly config;
35
- private readonly fetchFn;
35
+ private readonly apisByToken;
36
36
  private tokenPromise;
37
37
  private resolvedToken;
38
38
  constructor(config: ClientConfig);
@@ -79,22 +79,8 @@ export declare class TinybirdClient {
79
79
  * @returns Query result
80
80
  */
81
81
  sql<T = unknown>(sql: string, options?: QueryOptions): Promise<QueryResult<T>>;
82
- /**
83
- * Serialize an event for ingestion, handling Date objects and other special types
84
- */
85
- private serializeEvent;
86
- /**
87
- * Create an AbortSignal with timeout
88
- */
89
- private createAbortSignal;
90
- /**
91
- * Handle error responses from the API
92
- */
93
- private handleErrorResponse;
94
- /**
95
- * Internal fetch wrapper
96
- */
97
- private fetch;
82
+ private getApi;
83
+ private rethrowApiError;
98
84
  }
99
85
  /**
100
86
  * Create a Tinybird client