@tinybirdco/sdk 0.0.35 → 0.0.37

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.
Files changed (67) hide show
  1. package/dist/api/api.d.ts +17 -1
  2. package/dist/api/api.d.ts.map +1 -1
  3. package/dist/api/api.js +91 -0
  4. package/dist/api/api.js.map +1 -1
  5. package/dist/api/api.test.js +160 -0
  6. package/dist/api/api.test.js.map +1 -1
  7. package/dist/api/regions.d.ts +33 -0
  8. package/dist/api/regions.d.ts.map +1 -0
  9. package/dist/api/regions.js +52 -0
  10. package/dist/api/regions.js.map +1 -0
  11. package/dist/api/regions.test.d.ts +2 -0
  12. package/dist/api/regions.test.d.ts.map +1 -0
  13. package/dist/api/regions.test.js +69 -0
  14. package/dist/api/regions.test.js.map +1 -0
  15. package/dist/cli/commands/init.d.ts +2 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -1
  17. package/dist/cli/commands/init.js +25 -11
  18. package/dist/cli/commands/init.js.map +1 -1
  19. package/dist/cli/commands/init.test.js +7 -0
  20. package/dist/cli/commands/init.test.js.map +1 -1
  21. package/dist/cli/commands/login.d.ts.map +1 -1
  22. package/dist/cli/commands/login.js +13 -3
  23. package/dist/cli/commands/login.js.map +1 -1
  24. package/dist/cli/commands/login.test.js +12 -1
  25. package/dist/cli/commands/login.test.js.map +1 -1
  26. package/dist/cli/region-selector.d.ts +39 -0
  27. package/dist/cli/region-selector.d.ts.map +1 -0
  28. package/dist/cli/region-selector.js +118 -0
  29. package/dist/cli/region-selector.js.map +1 -0
  30. package/dist/cli/region-selector.test.d.ts +2 -0
  31. package/dist/cli/region-selector.test.d.ts.map +1 -0
  32. package/dist/cli/region-selector.test.js +176 -0
  33. package/dist/cli/region-selector.test.js.map +1 -0
  34. package/dist/client/base.d.ts +26 -1
  35. package/dist/client/base.d.ts.map +1 -1
  36. package/dist/client/base.js +39 -0
  37. package/dist/client/base.js.map +1 -1
  38. package/dist/client/base.test.js +25 -0
  39. package/dist/client/base.test.js.map +1 -1
  40. package/dist/client/types.d.ts +49 -0
  41. package/dist/client/types.d.ts.map +1 -1
  42. package/dist/index.d.ts +2 -2
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/schema/project.d.ts +22 -3
  46. package/dist/schema/project.d.ts.map +1 -1
  47. package/dist/schema/project.js +12 -0
  48. package/dist/schema/project.js.map +1 -1
  49. package/dist/schema/project.test.js +52 -0
  50. package/dist/schema/project.test.js.map +1 -1
  51. package/package.json +1 -1
  52. package/src/api/api.test.ts +222 -0
  53. package/src/api/api.ts +117 -0
  54. package/src/api/regions.test.ts +89 -0
  55. package/src/api/regions.ts +75 -0
  56. package/src/cli/commands/init.test.ts +8 -0
  57. package/src/cli/commands/init.ts +30 -11
  58. package/src/cli/commands/login.test.ts +13 -1
  59. package/src/cli/commands/login.ts +14 -3
  60. package/src/cli/region-selector.test.ts +227 -0
  61. package/src/cli/region-selector.ts +151 -0
  62. package/src/client/base.test.ts +32 -0
  63. package/src/client/base.ts +48 -0
  64. package/src/client/types.ts +54 -0
  65. package/src/index.ts +5 -0
  66. package/src/schema/project.test.ts +64 -0
  67. package/src/schema/project.ts +42 -3
@@ -68,6 +68,31 @@ describe("Project Schema", () => {
68
68
  expect(typeof project.tinybird.ingest.events).toBe("function");
69
69
  expect(typeof project.tinybird.ingest.eventsBatch).toBe("function");
70
70
  });
71
+ it("creates datasource accessors with append method", () => {
72
+ const events = defineDatasource("events", {
73
+ schema: { timestamp: t.dateTime() },
74
+ });
75
+ const project = defineProject({
76
+ datasources: { events },
77
+ });
78
+ expect(project.tinybird.events).toBeDefined();
79
+ expect(typeof project.tinybird.events.append).toBe("function");
80
+ });
81
+ it("creates multiple datasource accessors", () => {
82
+ const events = defineDatasource("events", {
83
+ schema: { timestamp: t.dateTime() },
84
+ });
85
+ const pageViews = defineDatasource("page_views", {
86
+ schema: { pathname: t.string() },
87
+ });
88
+ const project = defineProject({
89
+ datasources: { events, pageViews },
90
+ });
91
+ expect(project.tinybird.events).toBeDefined();
92
+ expect(project.tinybird.pageViews).toBeDefined();
93
+ expect(typeof project.tinybird.events.append).toBe("function");
94
+ expect(typeof project.tinybird.pageViews.append).toBe("function");
95
+ });
71
96
  it("throws error when accessing client before initialization", () => {
72
97
  const project = defineProject({});
73
98
  expect(() => project.tinybird.client).toThrow("Client not initialized");
@@ -203,6 +228,33 @@ describe("Project Schema", () => {
203
228
  expect(typeof client.ingest.events).toBe("function");
204
229
  expect(typeof client.ingest.eventsBatch).toBe("function");
205
230
  });
231
+ it("creates datasource accessors with append method", () => {
232
+ const events = defineDatasource("events", {
233
+ schema: { id: t.string() },
234
+ });
235
+ const client = createTinybirdClient({
236
+ datasources: { events },
237
+ pipes: {},
238
+ });
239
+ expect(client.events).toBeDefined();
240
+ expect(typeof client.events.append).toBe("function");
241
+ });
242
+ it("creates multiple datasource accessors", () => {
243
+ const events = defineDatasource("events", {
244
+ schema: { id: t.string() },
245
+ });
246
+ const pageViews = defineDatasource("page_views", {
247
+ schema: { pathname: t.string() },
248
+ });
249
+ const client = createTinybirdClient({
250
+ datasources: { events, pageViews },
251
+ pipes: {},
252
+ });
253
+ expect(client.events).toBeDefined();
254
+ expect(client.pageViews).toBeDefined();
255
+ expect(typeof client.events.append).toBe("function");
256
+ expect(typeof client.pageViews.append).toBe("function");
257
+ });
206
258
  it("accepts devMode option", () => {
207
259
  const events = defineDatasource("events", {
208
260
  schema: { id: t.string() },
@@ -1 +1 @@
1
- {"version":3,"file":"project.test.js","sourceRoot":"","sources":["../../src/schema/project.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.test.js","sourceRoot":"","sources":["../../src/schema/project.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tinybirdco/sdk",
3
- "version": "0.0.35",
3
+ "version": "0.0.37",
4
4
  "description": "TypeScript SDK for Tinybird Forward - define datasources and pipes as TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -292,4 +292,226 @@ describe("TinybirdApi", () => {
292
292
  },
293
293
  });
294
294
  });
295
+
296
+ describe("appendDatasource", () => {
297
+ it("appends data from URL", async () => {
298
+ let datasourceName: string | null = null;
299
+ let modeParam: string | null = null;
300
+ let formatParam: string | null = null;
301
+ let contentType: string | null = null;
302
+ let requestBody: string | null = null;
303
+
304
+ server.use(
305
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
306
+ const url = new URL(request.url);
307
+ datasourceName = url.searchParams.get("name");
308
+ modeParam = url.searchParams.get("mode");
309
+ formatParam = url.searchParams.get("format");
310
+ contentType = request.headers.get("content-type");
311
+ requestBody = await request.text();
312
+
313
+ return HttpResponse.json({
314
+ successful_rows: 100,
315
+ quarantined_rows: 0,
316
+ import_id: "import_123",
317
+ });
318
+ })
319
+ );
320
+
321
+ const api = createTinybirdApi({
322
+ baseUrl: BASE_URL,
323
+ token: "p.default-token",
324
+ });
325
+
326
+ const result = await api.appendDatasource("events", {
327
+ url: "https://example.com/data.csv",
328
+ });
329
+
330
+ expect(result).toEqual({
331
+ successful_rows: 100,
332
+ quarantined_rows: 0,
333
+ import_id: "import_123",
334
+ });
335
+ expect(datasourceName).toBe("events");
336
+ expect(modeParam).toBe("append");
337
+ expect(formatParam).toBe("csv");
338
+ expect(contentType).toBe("application/x-www-form-urlencoded");
339
+ expect(requestBody).toBe("url=https%3A%2F%2Fexample.com%2Fdata.csv");
340
+ });
341
+
342
+ it("detects ndjson format from URL extension", async () => {
343
+ let formatParam: string | null = null;
344
+
345
+ server.use(
346
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
347
+ const url = new URL(request.url);
348
+ formatParam = url.searchParams.get("format");
349
+ return HttpResponse.json({ successful_rows: 1, quarantined_rows: 0 });
350
+ })
351
+ );
352
+
353
+ const api = createTinybirdApi({
354
+ baseUrl: BASE_URL,
355
+ token: "p.default-token",
356
+ });
357
+
358
+ await api.appendDatasource("events", {
359
+ url: "https://example.com/data.ndjson",
360
+ });
361
+
362
+ expect(formatParam).toBe("ndjson");
363
+ });
364
+
365
+ it("detects jsonl as ndjson format", async () => {
366
+ let formatParam: string | null = null;
367
+
368
+ server.use(
369
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
370
+ const url = new URL(request.url);
371
+ formatParam = url.searchParams.get("format");
372
+ return HttpResponse.json({ successful_rows: 1, quarantined_rows: 0 });
373
+ })
374
+ );
375
+
376
+ const api = createTinybirdApi({
377
+ baseUrl: BASE_URL,
378
+ token: "p.default-token",
379
+ });
380
+
381
+ await api.appendDatasource("events", {
382
+ url: "https://example.com/data.jsonl",
383
+ });
384
+
385
+ expect(formatParam).toBe("ndjson");
386
+ });
387
+
388
+ it("detects parquet format from URL extension", async () => {
389
+ let formatParam: string | null = null;
390
+
391
+ server.use(
392
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
393
+ const url = new URL(request.url);
394
+ formatParam = url.searchParams.get("format");
395
+ return HttpResponse.json({ successful_rows: 1, quarantined_rows: 0 });
396
+ })
397
+ );
398
+
399
+ const api = createTinybirdApi({
400
+ baseUrl: BASE_URL,
401
+ token: "p.default-token",
402
+ });
403
+
404
+ await api.appendDatasource("events", {
405
+ url: "https://example.com/data.parquet",
406
+ });
407
+
408
+ expect(formatParam).toBe("parquet");
409
+ });
410
+
411
+ it("strips query string when detecting format", async () => {
412
+ let formatParam: string | null = null;
413
+
414
+ server.use(
415
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
416
+ const url = new URL(request.url);
417
+ formatParam = url.searchParams.get("format");
418
+ return HttpResponse.json({ successful_rows: 1, quarantined_rows: 0 });
419
+ })
420
+ );
421
+
422
+ const api = createTinybirdApi({
423
+ baseUrl: BASE_URL,
424
+ token: "p.default-token",
425
+ });
426
+
427
+ await api.appendDatasource("events", {
428
+ url: "https://example.com/data.csv?token=abc",
429
+ });
430
+
431
+ expect(formatParam).toBe("csv");
432
+ });
433
+
434
+ it("includes CSV dialect options", async () => {
435
+ let delimiterParam: string | null = null;
436
+ let newLineParam: string | null = null;
437
+ let escapeCharParam: string | null = null;
438
+
439
+ server.use(
440
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
441
+ const url = new URL(request.url);
442
+ delimiterParam = url.searchParams.get("dialect_delimiter");
443
+ newLineParam = url.searchParams.get("dialect_new_line");
444
+ escapeCharParam = url.searchParams.get("dialect_escapechar");
445
+ return HttpResponse.json({ successful_rows: 1, quarantined_rows: 0 });
446
+ })
447
+ );
448
+
449
+ const api = createTinybirdApi({
450
+ baseUrl: BASE_URL,
451
+ token: "p.default-token",
452
+ });
453
+
454
+ await api.appendDatasource("events", {
455
+ url: "https://example.com/data.csv",
456
+ csvDialect: {
457
+ delimiter: ";",
458
+ newLine: "\r\n",
459
+ escapeChar: "\\",
460
+ },
461
+ });
462
+
463
+ expect(delimiterParam).toBe(";");
464
+ expect(newLineParam).toBe("\r\n");
465
+ expect(escapeCharParam).toBe("\\");
466
+ });
467
+
468
+ it("throws error when neither url nor file is provided", async () => {
469
+ const api = createTinybirdApi({
470
+ baseUrl: BASE_URL,
471
+ token: "p.default-token",
472
+ });
473
+
474
+ await expect(api.appendDatasource("events", {})).rejects.toThrow(
475
+ "Either 'url' or 'file' must be provided in options"
476
+ );
477
+ });
478
+
479
+ it("throws error when both url and file are provided", async () => {
480
+ const api = createTinybirdApi({
481
+ baseUrl: BASE_URL,
482
+ token: "p.default-token",
483
+ });
484
+
485
+ await expect(
486
+ api.appendDatasource("events", {
487
+ url: "https://example.com/data.csv",
488
+ file: "./data.csv",
489
+ })
490
+ ).rejects.toThrow("Only one of 'url' or 'file' can be provided, not both");
491
+ });
492
+
493
+ it("allows per-request token override", async () => {
494
+ let authorizationHeader: string | null = null;
495
+
496
+ server.use(
497
+ http.post(`${BASE_URL}/v0/datasources`, async ({ request }) => {
498
+ authorizationHeader = request.headers.get("Authorization");
499
+ return HttpResponse.json({ successful_rows: 1, quarantined_rows: 0 });
500
+ })
501
+ );
502
+
503
+ const api = createTinybirdApi({
504
+ baseUrl: BASE_URL,
505
+ token: "p.default-token",
506
+ });
507
+
508
+ await api.appendDatasource(
509
+ "events",
510
+ { url: "https://example.com/data.csv" },
511
+ { token: "p.override-token" }
512
+ );
513
+
514
+ expect(authorizationHeader).toBe("Bearer p.override-token");
515
+ });
516
+ });
295
517
  });
package/src/api/api.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { createTinybirdFetcher, type TinybirdFetch } from "./fetcher.js";
2
2
  import type {
3
+ AppendOptions,
4
+ AppendResult,
3
5
  IngestOptions,
4
6
  IngestResult,
5
7
  QueryOptions,
@@ -41,6 +43,11 @@ export interface TinybirdApiIngestOptions extends IngestOptions {
41
43
  token?: string;
42
44
  }
43
45
 
46
+ export interface TinybirdApiAppendOptions extends Omit<AppendOptions, 'url' | 'file'> {
47
+ /** Optional token override for this request */
48
+ token?: string;
49
+ }
50
+
44
51
  /**
45
52
  * Error thrown by TinybirdApi when a response is not OK
46
53
  */
@@ -242,6 +249,116 @@ export class TinybirdApi {
242
249
  return (await response.json()) as QueryResult<T>;
243
250
  }
244
251
 
252
+ /**
253
+ * Append data to a datasource from a URL or local file
254
+ */
255
+ async appendDatasource(
256
+ datasourceName: string,
257
+ options: AppendOptions,
258
+ apiOptions: TinybirdApiAppendOptions = {}
259
+ ): Promise<AppendResult> {
260
+ const { url: sourceUrl, file: filePath } = options;
261
+
262
+ if (!sourceUrl && !filePath) {
263
+ throw new Error("Either 'url' or 'file' must be provided in options");
264
+ }
265
+
266
+ if (sourceUrl && filePath) {
267
+ throw new Error("Only one of 'url' or 'file' can be provided, not both");
268
+ }
269
+
270
+ const url = new URL("/v0/datasources", `${this.baseUrl}/`);
271
+ url.searchParams.set("name", datasourceName);
272
+ url.searchParams.set("mode", "append");
273
+
274
+ // Auto-detect format from file/url extension
275
+ const format = this.detectFormat(sourceUrl ?? filePath!);
276
+ if (format) {
277
+ url.searchParams.set("format", format);
278
+ }
279
+
280
+ // Add CSV dialect options if applicable
281
+ if (options.csvDialect) {
282
+ if (options.csvDialect.delimiter) {
283
+ url.searchParams.set("dialect_delimiter", options.csvDialect.delimiter);
284
+ }
285
+ if (options.csvDialect.newLine) {
286
+ url.searchParams.set("dialect_new_line", options.csvDialect.newLine);
287
+ }
288
+ if (options.csvDialect.escapeChar) {
289
+ url.searchParams.set("dialect_escapechar", options.csvDialect.escapeChar);
290
+ }
291
+ }
292
+
293
+ let response: Response;
294
+
295
+ if (sourceUrl) {
296
+ // Remote URL: send as form-urlencoded with url parameter
297
+ response = await this.request(url.toString(), {
298
+ method: "POST",
299
+ token: apiOptions.token,
300
+ headers: {
301
+ "Content-Type": "application/x-www-form-urlencoded",
302
+ },
303
+ body: `url=${encodeURIComponent(sourceUrl)}`,
304
+ signal: this.createAbortSignal(options.timeout ?? apiOptions.timeout, options.signal ?? apiOptions.signal),
305
+ });
306
+ } else {
307
+ // Local file: send as multipart form data
308
+ const formData = await this.createFileFormData(filePath!);
309
+ response = await this.request(url.toString(), {
310
+ method: "POST",
311
+ token: apiOptions.token,
312
+ body: formData,
313
+ signal: this.createAbortSignal(options.timeout ?? apiOptions.timeout, options.signal ?? apiOptions.signal),
314
+ });
315
+ }
316
+
317
+ if (!response.ok) {
318
+ await this.handleErrorResponse(response);
319
+ }
320
+
321
+ return (await response.json()) as AppendResult;
322
+ }
323
+
324
+ /**
325
+ * Detect format from file path or URL extension
326
+ */
327
+ private detectFormat(source: string): "csv" | "ndjson" | "parquet" | undefined {
328
+ // Remove query string if present
329
+ const pathOnly = source.split("?")[0];
330
+ const extension = pathOnly.split(".").pop()?.toLowerCase();
331
+
332
+ switch (extension) {
333
+ case "csv":
334
+ return "csv";
335
+ case "ndjson":
336
+ case "jsonl":
337
+ return "ndjson";
338
+ case "parquet":
339
+ return "parquet";
340
+ default:
341
+ return undefined;
342
+ }
343
+ }
344
+
345
+ /**
346
+ * Create FormData for file upload
347
+ */
348
+ private async createFileFormData(filePath: string): Promise<FormData> {
349
+ // Dynamic import for Node.js fs module (browser-safe)
350
+ const fs = await import("node:fs");
351
+ const path = await import("node:path");
352
+
353
+ const fileContent = await fs.promises.readFile(filePath);
354
+ const fileName = path.basename(filePath);
355
+
356
+ const formData = new FormData();
357
+ formData.append("csv", new Blob([fileContent]), fileName);
358
+
359
+ return formData;
360
+ }
361
+
245
362
  private createAbortSignal(
246
363
  timeout?: number,
247
364
  existingSignal?: AbortSignal
@@ -0,0 +1,89 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { fetchRegions, RegionsApiError } from "./regions.js";
3
+
4
+ // Mock the fetcher module
5
+ vi.mock("./fetcher.js", () => ({
6
+ tinybirdFetch: vi.fn(),
7
+ }));
8
+
9
+ import { tinybirdFetch } from "./fetcher.js";
10
+
11
+ const mockedFetch = vi.mocked(tinybirdFetch);
12
+
13
+ describe("fetchRegions", () => {
14
+ beforeEach(() => {
15
+ vi.clearAllMocks();
16
+ });
17
+
18
+ it("returns regions from API", async () => {
19
+ mockedFetch.mockResolvedValue({
20
+ ok: true,
21
+ json: () =>
22
+ Promise.resolve({
23
+ regions: [
24
+ {
25
+ name: "EU (GCP)",
26
+ api_host: "https://api.europe-west2.gcp.tinybird.co",
27
+ provider: "gcp",
28
+ },
29
+ {
30
+ name: "US East (AWS)",
31
+ api_host: "https://api.us-east.aws.tinybird.co",
32
+ provider: "aws",
33
+ },
34
+ ],
35
+ }),
36
+ } as Response);
37
+
38
+ const regions = await fetchRegions();
39
+
40
+ expect(regions).toHaveLength(2);
41
+ expect(regions[0].name).toBe("EU (GCP)");
42
+ expect(regions[0].api_host).toBe("https://api.europe-west2.gcp.tinybird.co");
43
+ expect(regions[1].provider).toBe("aws");
44
+ });
45
+
46
+ it("calls the correct endpoint", async () => {
47
+ mockedFetch.mockResolvedValue({
48
+ ok: true,
49
+ json: () => Promise.resolve({ regions: [] }),
50
+ } as Response);
51
+
52
+ await fetchRegions();
53
+
54
+ expect(mockedFetch).toHaveBeenCalledWith(
55
+ "https://api.tinybird.co/v0/regions",
56
+ { method: "GET" }
57
+ );
58
+ });
59
+
60
+ it("throws RegionsApiError on non-ok response", async () => {
61
+ mockedFetch.mockResolvedValue({
62
+ ok: false,
63
+ status: 500,
64
+ statusText: "Internal Server Error",
65
+ text: () => Promise.resolve("Server error"),
66
+ } as Response);
67
+
68
+ await expect(fetchRegions()).rejects.toThrow(RegionsApiError);
69
+ await expect(fetchRegions()).rejects.toThrow("Failed to fetch regions: 500");
70
+ });
71
+
72
+ it("throws RegionsApiError on network error", async () => {
73
+ mockedFetch.mockRejectedValue(new Error("Network error"));
74
+
75
+ await expect(fetchRegions()).rejects.toThrow(RegionsApiError);
76
+ await expect(fetchRegions()).rejects.toThrow("Network error");
77
+ });
78
+
79
+ it("returns empty array when API returns empty regions", async () => {
80
+ mockedFetch.mockResolvedValue({
81
+ ok: true,
82
+ json: () => Promise.resolve({ regions: [] }),
83
+ } as Response);
84
+
85
+ const regions = await fetchRegions();
86
+
87
+ expect(regions).toEqual([]);
88
+ });
89
+ });
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Tinybird Regions API client
3
+ *
4
+ * Fetches available regions from the Tinybird API
5
+ */
6
+
7
+ import { tinybirdFetch } from "./fetcher.js";
8
+
9
+ /**
10
+ * Default API host used to fetch regions
11
+ * (regions endpoint is available from any host)
12
+ */
13
+ const DEFAULT_HOST = "https://api.tinybird.co";
14
+
15
+ /**
16
+ * Region information from Tinybird API
17
+ */
18
+ export interface TinybirdRegion {
19
+ /** Region name (e.g., "EU (GCP)") */
20
+ name: string;
21
+ /** API host URL (e.g., "https://api.europe-west2.gcp.tinybird.co") */
22
+ api_host: string;
23
+ /** Cloud provider (e.g., "gcp", "aws") */
24
+ provider: string;
25
+ }
26
+
27
+ /**
28
+ * Error thrown by regions API operations
29
+ */
30
+ export class RegionsApiError extends Error {
31
+ constructor(
32
+ message: string,
33
+ public readonly status?: number,
34
+ public readonly body?: unknown
35
+ ) {
36
+ super(message);
37
+ this.name = "RegionsApiError";
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Fetch available Tinybird regions
43
+ *
44
+ * Note: This endpoint doesn't require authentication.
45
+ *
46
+ * @returns Array of available regions
47
+ */
48
+ export async function fetchRegions(): Promise<TinybirdRegion[]> {
49
+ const url = new URL("/v0/regions", DEFAULT_HOST);
50
+
51
+ try {
52
+ const response = await tinybirdFetch(url.toString(), {
53
+ method: "GET",
54
+ });
55
+
56
+ if (!response.ok) {
57
+ const body = await response.text();
58
+ throw new RegionsApiError(
59
+ `Failed to fetch regions: ${response.status} ${response.statusText}`,
60
+ response.status,
61
+ body
62
+ );
63
+ }
64
+
65
+ const data = (await response.json()) as { regions: TinybirdRegion[] };
66
+ return data.regions;
67
+ } catch (error) {
68
+ if (error instanceof RegionsApiError) {
69
+ throw error;
70
+ }
71
+ throw new RegionsApiError(
72
+ `Failed to fetch regions: ${(error as Error).message}`
73
+ );
74
+ }
75
+ }
@@ -9,6 +9,14 @@ vi.mock("../auth.js", () => ({
9
9
  browserLogin: vi.fn().mockResolvedValue({ success: false }),
10
10
  }));
11
11
 
12
+ // Mock the region-selector module to avoid interactive prompts
13
+ vi.mock("../region-selector.js", () => ({
14
+ selectRegion: vi.fn().mockResolvedValue({
15
+ success: true,
16
+ apiHost: "https://api.tinybird.co",
17
+ }),
18
+ }));
19
+
12
20
  describe("Init Command", () => {
13
21
  let tempDir: string;
14
22