@tinybirdco/sdk 0.0.1

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 (258) hide show
  1. package/README.md +518 -0
  2. package/bin/tinybird.js +7 -0
  3. package/dist/api/branches.d.ts +98 -0
  4. package/dist/api/branches.d.ts.map +1 -0
  5. package/dist/api/branches.js +203 -0
  6. package/dist/api/branches.js.map +1 -0
  7. package/dist/api/branches.test.d.ts +2 -0
  8. package/dist/api/branches.test.d.ts.map +1 -0
  9. package/dist/api/branches.test.js +286 -0
  10. package/dist/api/branches.test.js.map +1 -0
  11. package/dist/api/build.d.ts +130 -0
  12. package/dist/api/build.d.ts.map +1 -0
  13. package/dist/api/build.js +143 -0
  14. package/dist/api/build.js.map +1 -0
  15. package/dist/api/build.test.d.ts +2 -0
  16. package/dist/api/build.test.d.ts.map +1 -0
  17. package/dist/api/build.test.js +138 -0
  18. package/dist/api/build.test.js.map +1 -0
  19. package/dist/api/deploy.d.ts +39 -0
  20. package/dist/api/deploy.d.ts.map +1 -0
  21. package/dist/api/deploy.js +135 -0
  22. package/dist/api/deploy.js.map +1 -0
  23. package/dist/api/deploy.test.d.ts +2 -0
  24. package/dist/api/deploy.test.d.ts.map +1 -0
  25. package/dist/api/deploy.test.js +118 -0
  26. package/dist/api/deploy.test.js.map +1 -0
  27. package/dist/api/workspaces.d.ts +46 -0
  28. package/dist/api/workspaces.d.ts.map +1 -0
  29. package/dist/api/workspaces.js +39 -0
  30. package/dist/api/workspaces.js.map +1 -0
  31. package/dist/api/workspaces.test.d.ts +2 -0
  32. package/dist/api/workspaces.test.d.ts.map +1 -0
  33. package/dist/api/workspaces.test.js +65 -0
  34. package/dist/api/workspaces.test.js.map +1 -0
  35. package/dist/cli/auth.d.ts +86 -0
  36. package/dist/cli/auth.d.ts.map +1 -0
  37. package/dist/cli/auth.js +284 -0
  38. package/dist/cli/auth.js.map +1 -0
  39. package/dist/cli/branch-store.d.ts +53 -0
  40. package/dist/cli/branch-store.d.ts.map +1 -0
  41. package/dist/cli/branch-store.js +91 -0
  42. package/dist/cli/branch-store.js.map +1 -0
  43. package/dist/cli/branch-store.test.d.ts +2 -0
  44. package/dist/cli/branch-store.test.d.ts.map +1 -0
  45. package/dist/cli/branch-store.test.js +115 -0
  46. package/dist/cli/branch-store.test.js.map +1 -0
  47. package/dist/cli/commands/branch.d.ts +82 -0
  48. package/dist/cli/commands/branch.d.ts.map +1 -0
  49. package/dist/cli/commands/branch.js +215 -0
  50. package/dist/cli/commands/branch.js.map +1 -0
  51. package/dist/cli/commands/build.d.ts +43 -0
  52. package/dist/cli/commands/build.d.ts.map +1 -0
  53. package/dist/cli/commands/build.js +138 -0
  54. package/dist/cli/commands/build.js.map +1 -0
  55. package/dist/cli/commands/dev.d.ts +78 -0
  56. package/dist/cli/commands/dev.d.ts.map +1 -0
  57. package/dist/cli/commands/dev.js +226 -0
  58. package/dist/cli/commands/dev.js.map +1 -0
  59. package/dist/cli/commands/init.d.ts +45 -0
  60. package/dist/cli/commands/init.d.ts.map +1 -0
  61. package/dist/cli/commands/init.js +277 -0
  62. package/dist/cli/commands/init.js.map +1 -0
  63. package/dist/cli/commands/init.test.d.ts +2 -0
  64. package/dist/cli/commands/init.test.d.ts.map +1 -0
  65. package/dist/cli/commands/init.test.js +158 -0
  66. package/dist/cli/commands/init.test.js.map +1 -0
  67. package/dist/cli/commands/login.d.ts +37 -0
  68. package/dist/cli/commands/login.d.ts.map +1 -0
  69. package/dist/cli/commands/login.js +64 -0
  70. package/dist/cli/commands/login.js.map +1 -0
  71. package/dist/cli/config.d.ts +114 -0
  72. package/dist/cli/config.d.ts.map +1 -0
  73. package/dist/cli/config.js +258 -0
  74. package/dist/cli/config.js.map +1 -0
  75. package/dist/cli/config.test.d.ts +2 -0
  76. package/dist/cli/config.test.d.ts.map +1 -0
  77. package/dist/cli/config.test.js +243 -0
  78. package/dist/cli/config.test.js.map +1 -0
  79. package/dist/cli/env.d.ts +29 -0
  80. package/dist/cli/env.d.ts.map +1 -0
  81. package/dist/cli/env.js +66 -0
  82. package/dist/cli/env.js.map +1 -0
  83. package/dist/cli/git.d.ts +29 -0
  84. package/dist/cli/git.d.ts.map +1 -0
  85. package/dist/cli/git.js +114 -0
  86. package/dist/cli/git.js.map +1 -0
  87. package/dist/cli/git.test.d.ts +2 -0
  88. package/dist/cli/git.test.d.ts.map +1 -0
  89. package/dist/cli/git.test.js +125 -0
  90. package/dist/cli/git.test.js.map +1 -0
  91. package/dist/cli/index.d.ts +7 -0
  92. package/dist/cli/index.d.ts.map +1 -0
  93. package/dist/cli/index.js +337 -0
  94. package/dist/cli/index.js.map +1 -0
  95. package/dist/cli/utils/schema-validation.d.ts +95 -0
  96. package/dist/cli/utils/schema-validation.d.ts.map +1 -0
  97. package/dist/cli/utils/schema-validation.js +175 -0
  98. package/dist/cli/utils/schema-validation.js.map +1 -0
  99. package/dist/cli/utils/schema-validation.test.d.ts +5 -0
  100. package/dist/cli/utils/schema-validation.test.d.ts.map +1 -0
  101. package/dist/cli/utils/schema-validation.test.js +173 -0
  102. package/dist/cli/utils/schema-validation.test.js.map +1 -0
  103. package/dist/client/base.d.ts +116 -0
  104. package/dist/client/base.d.ts.map +1 -0
  105. package/dist/client/base.js +328 -0
  106. package/dist/client/base.js.map +1 -0
  107. package/dist/client/types.d.ts +137 -0
  108. package/dist/client/types.d.ts.map +1 -0
  109. package/dist/client/types.js +43 -0
  110. package/dist/client/types.js.map +1 -0
  111. package/dist/generator/client.d.ts +44 -0
  112. package/dist/generator/client.d.ts.map +1 -0
  113. package/dist/generator/client.js +144 -0
  114. package/dist/generator/client.js.map +1 -0
  115. package/dist/generator/datasource.d.ts +57 -0
  116. package/dist/generator/datasource.d.ts.map +1 -0
  117. package/dist/generator/datasource.js +169 -0
  118. package/dist/generator/datasource.js.map +1 -0
  119. package/dist/generator/datasource.test.d.ts +2 -0
  120. package/dist/generator/datasource.test.d.ts.map +1 -0
  121. package/dist/generator/datasource.test.js +254 -0
  122. package/dist/generator/datasource.test.js.map +1 -0
  123. package/dist/generator/index.d.ts +131 -0
  124. package/dist/generator/index.d.ts.map +1 -0
  125. package/dist/generator/index.js +121 -0
  126. package/dist/generator/index.js.map +1 -0
  127. package/dist/generator/index.test.d.ts +2 -0
  128. package/dist/generator/index.test.d.ts.map +1 -0
  129. package/dist/generator/index.test.js +175 -0
  130. package/dist/generator/index.test.js.map +1 -0
  131. package/dist/generator/loader.d.ts +156 -0
  132. package/dist/generator/loader.d.ts.map +1 -0
  133. package/dist/generator/loader.js +295 -0
  134. package/dist/generator/loader.js.map +1 -0
  135. package/dist/generator/pipe.d.ts +72 -0
  136. package/dist/generator/pipe.d.ts.map +1 -0
  137. package/dist/generator/pipe.js +174 -0
  138. package/dist/generator/pipe.js.map +1 -0
  139. package/dist/generator/pipe.test.d.ts +2 -0
  140. package/dist/generator/pipe.test.d.ts.map +1 -0
  141. package/dist/generator/pipe.test.js +393 -0
  142. package/dist/generator/pipe.test.js.map +1 -0
  143. package/dist/index.d.ts +74 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +73 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/infer/index.d.ts +202 -0
  148. package/dist/infer/index.d.ts.map +1 -0
  149. package/dist/infer/index.js +5 -0
  150. package/dist/infer/index.js.map +1 -0
  151. package/dist/schema/datasource.d.ts +135 -0
  152. package/dist/schema/datasource.d.ts.map +1 -0
  153. package/dist/schema/datasource.js +105 -0
  154. package/dist/schema/datasource.js.map +1 -0
  155. package/dist/schema/datasource.test.d.ts +2 -0
  156. package/dist/schema/datasource.test.d.ts.map +1 -0
  157. package/dist/schema/datasource.test.js +142 -0
  158. package/dist/schema/datasource.test.js.map +1 -0
  159. package/dist/schema/engines.d.ts +157 -0
  160. package/dist/schema/engines.d.ts.map +1 -0
  161. package/dist/schema/engines.js +155 -0
  162. package/dist/schema/engines.js.map +1 -0
  163. package/dist/schema/engines.test.d.ts +2 -0
  164. package/dist/schema/engines.test.d.ts.map +1 -0
  165. package/dist/schema/engines.test.js +221 -0
  166. package/dist/schema/engines.test.js.map +1 -0
  167. package/dist/schema/params.d.ts +106 -0
  168. package/dist/schema/params.d.ts.map +1 -0
  169. package/dist/schema/params.js +138 -0
  170. package/dist/schema/params.js.map +1 -0
  171. package/dist/schema/params.test.d.ts +2 -0
  172. package/dist/schema/params.test.d.ts.map +1 -0
  173. package/dist/schema/params.test.js +175 -0
  174. package/dist/schema/params.test.js.map +1 -0
  175. package/dist/schema/pipe.d.ts +436 -0
  176. package/dist/schema/pipe.d.ts.map +1 -0
  177. package/dist/schema/pipe.js +484 -0
  178. package/dist/schema/pipe.js.map +1 -0
  179. package/dist/schema/pipe.test.d.ts +2 -0
  180. package/dist/schema/pipe.test.d.ts.map +1 -0
  181. package/dist/schema/pipe.test.js +488 -0
  182. package/dist/schema/pipe.test.js.map +1 -0
  183. package/dist/schema/project.d.ts +202 -0
  184. package/dist/schema/project.d.ts.map +1 -0
  185. package/dist/schema/project.js +188 -0
  186. package/dist/schema/project.js.map +1 -0
  187. package/dist/schema/project.test.d.ts +2 -0
  188. package/dist/schema/project.test.d.ts.map +1 -0
  189. package/dist/schema/project.test.js +180 -0
  190. package/dist/schema/project.test.js.map +1 -0
  191. package/dist/schema/types.d.ts +140 -0
  192. package/dist/schema/types.d.ts.map +1 -0
  193. package/dist/schema/types.js +174 -0
  194. package/dist/schema/types.js.map +1 -0
  195. package/dist/schema/types.test.d.ts +2 -0
  196. package/dist/schema/types.test.d.ts.map +1 -0
  197. package/dist/schema/types.test.js +176 -0
  198. package/dist/schema/types.test.js.map +1 -0
  199. package/dist/test/handlers.d.ts +58 -0
  200. package/dist/test/handlers.d.ts.map +1 -0
  201. package/dist/test/handlers.js +62 -0
  202. package/dist/test/handlers.js.map +1 -0
  203. package/dist/test/setup.d.ts +5 -0
  204. package/dist/test/setup.d.ts.map +1 -0
  205. package/dist/test/setup.js +11 -0
  206. package/dist/test/setup.js.map +1 -0
  207. package/package.json +57 -0
  208. package/src/api/branches.test.ts +377 -0
  209. package/src/api/branches.ts +334 -0
  210. package/src/api/build.test.ts +216 -0
  211. package/src/api/build.ts +266 -0
  212. package/src/api/deploy.test.ts +193 -0
  213. package/src/api/deploy.ts +163 -0
  214. package/src/api/workspaces.test.ts +81 -0
  215. package/src/api/workspaces.ts +77 -0
  216. package/src/cli/auth.ts +358 -0
  217. package/src/cli/branch-store.test.ts +139 -0
  218. package/src/cli/branch-store.ts +137 -0
  219. package/src/cli/commands/branch.ts +306 -0
  220. package/src/cli/commands/build.ts +183 -0
  221. package/src/cli/commands/dev.ts +334 -0
  222. package/src/cli/commands/init.test.ts +249 -0
  223. package/src/cli/commands/init.ts +323 -0
  224. package/src/cli/commands/login.ts +98 -0
  225. package/src/cli/config.test.ts +359 -0
  226. package/src/cli/config.ts +335 -0
  227. package/src/cli/env.ts +86 -0
  228. package/src/cli/git.test.ts +147 -0
  229. package/src/cli/git.ts +125 -0
  230. package/src/cli/index.ts +382 -0
  231. package/src/cli/utils/schema-validation.test.ts +222 -0
  232. package/src/cli/utils/schema-validation.ts +272 -0
  233. package/src/client/base.ts +414 -0
  234. package/src/client/types.ts +165 -0
  235. package/src/generator/client.ts +194 -0
  236. package/src/generator/datasource.test.ts +297 -0
  237. package/src/generator/datasource.ts +217 -0
  238. package/src/generator/index.test.ts +209 -0
  239. package/src/generator/index.ts +203 -0
  240. package/src/generator/loader.ts +406 -0
  241. package/src/generator/pipe.test.ts +441 -0
  242. package/src/generator/pipe.ts +220 -0
  243. package/src/index.ts +191 -0
  244. package/src/infer/index.ts +247 -0
  245. package/src/schema/datasource.test.ts +187 -0
  246. package/src/schema/datasource.ts +195 -0
  247. package/src/schema/engines.test.ts +247 -0
  248. package/src/schema/engines.ts +271 -0
  249. package/src/schema/params.test.ts +208 -0
  250. package/src/schema/params.ts +249 -0
  251. package/src/schema/pipe.test.ts +588 -0
  252. package/src/schema/pipe.ts +832 -0
  253. package/src/schema/project.test.ts +236 -0
  254. package/src/schema/project.ts +394 -0
  255. package/src/schema/types.test.ts +212 -0
  256. package/src/schema/types.ts +366 -0
  257. package/src/test/handlers.ts +79 -0
  258. package/src/test/setup.ts +13 -0
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Tinybird Workspace API client
3
+ */
4
+ /**
5
+ * Workspace information from Tinybird API
6
+ */
7
+ export interface TinybirdWorkspace {
8
+ /** Workspace ID (UUID) */
9
+ id: string;
10
+ /** Workspace name */
11
+ name: string;
12
+ /** User ID of the workspace owner */
13
+ user_id: string;
14
+ /** Email of the workspace owner */
15
+ user_email: string;
16
+ /** Workspace scope */
17
+ scope: string;
18
+ /** Main branch (null for main workspace) */
19
+ main: string | null;
20
+ }
21
+ /**
22
+ * API configuration for workspace operations
23
+ */
24
+ export interface WorkspaceApiConfig {
25
+ /** Tinybird API base URL */
26
+ baseUrl: string;
27
+ /** Workspace token */
28
+ token: string;
29
+ }
30
+ /**
31
+ * Error thrown by workspace API operations
32
+ */
33
+ export declare class WorkspaceApiError extends Error {
34
+ readonly status: number;
35
+ readonly body?: unknown | undefined;
36
+ constructor(message: string, status: number, body?: unknown | undefined);
37
+ }
38
+ /**
39
+ * Get workspace information
40
+ * GET /v1/workspace
41
+ *
42
+ * @param config - API configuration
43
+ * @returns Workspace information
44
+ */
45
+ export declare function getWorkspace(config: WorkspaceApiConfig): Promise<TinybirdWorkspace>;
46
+ //# sourceMappingURL=workspaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../src/api/workspaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,MAAM,EAAE,MAAM;aACd,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,YAAA;CAKjC;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAqB5B"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Tinybird Workspace API client
3
+ */
4
+ /**
5
+ * Error thrown by workspace API operations
6
+ */
7
+ export class WorkspaceApiError extends Error {
8
+ status;
9
+ body;
10
+ constructor(message, status, body) {
11
+ super(message);
12
+ this.status = status;
13
+ this.body = body;
14
+ this.name = "WorkspaceApiError";
15
+ }
16
+ }
17
+ /**
18
+ * Get workspace information
19
+ * GET /v1/workspace
20
+ *
21
+ * @param config - API configuration
22
+ * @returns Workspace information
23
+ */
24
+ export async function getWorkspace(config) {
25
+ const url = new URL("/v1/workspace", config.baseUrl);
26
+ const response = await fetch(url.toString(), {
27
+ method: "GET",
28
+ headers: {
29
+ Authorization: `Bearer ${config.token}`,
30
+ },
31
+ });
32
+ if (!response.ok) {
33
+ const body = await response.text();
34
+ throw new WorkspaceApiError(`Failed to get workspace: ${response.status} ${response.statusText}`, response.status, body);
35
+ }
36
+ const data = (await response.json());
37
+ return data;
38
+ }
39
+ //# sourceMappingURL=workspaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../src/api/workspaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AA8BH;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAGxB;IACA;IAHlB,YACE,OAAe,EACC,MAAc,EACd,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAU;QAG9B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAA0B;IAE1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;SACxC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,iBAAiB,CACzB,4BAA4B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EACpE,QAAQ,CAAC,MAAM,EACf,IAAI,CACL,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=workspaces.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.test.d.ts","sourceRoot":"","sources":["../../src/api/workspaces.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { getWorkspace, WorkspaceApiError, } from "./workspaces.js";
3
+ // Mock fetch globally
4
+ const mockFetch = vi.fn();
5
+ global.fetch = mockFetch;
6
+ describe("Workspace API client", () => {
7
+ const config = {
8
+ baseUrl: "https://api.tinybird.co",
9
+ token: "p.test-token",
10
+ };
11
+ beforeEach(() => {
12
+ mockFetch.mockReset();
13
+ });
14
+ describe("getWorkspace", () => {
15
+ it("returns workspace information", async () => {
16
+ const mockWorkspace = {
17
+ id: "9f42135e-3434-4d89-a90f-cb9cf74ce311",
18
+ name: "ts_client",
19
+ releases: [],
20
+ user_id: "412571dd-d2e6-4b3c-87b5-b29320414e22",
21
+ user_email: "user@example.com",
22
+ scope: "user",
23
+ main: null,
24
+ };
25
+ mockFetch.mockResolvedValueOnce({
26
+ ok: true,
27
+ json: () => Promise.resolve(mockWorkspace),
28
+ });
29
+ const result = await getWorkspace(config);
30
+ expect(mockFetch).toHaveBeenCalledWith("https://api.tinybird.co/v1/workspace", {
31
+ method: "GET",
32
+ headers: {
33
+ Authorization: "Bearer p.test-token",
34
+ },
35
+ });
36
+ expect(result).toEqual(mockWorkspace);
37
+ });
38
+ it("throws WorkspaceApiError on failure", async () => {
39
+ mockFetch.mockResolvedValueOnce({
40
+ ok: false,
41
+ status: 401,
42
+ statusText: "Unauthorized",
43
+ text: () => Promise.resolve("Invalid token"),
44
+ });
45
+ await expect(getWorkspace(config)).rejects.toThrow(WorkspaceApiError);
46
+ });
47
+ it("includes status code in error", async () => {
48
+ mockFetch.mockResolvedValueOnce({
49
+ ok: false,
50
+ status: 403,
51
+ statusText: "Forbidden",
52
+ text: () => Promise.resolve("Access denied"),
53
+ });
54
+ try {
55
+ await getWorkspace(config);
56
+ expect.fail("Should have thrown");
57
+ }
58
+ catch (error) {
59
+ expect(error).toBeInstanceOf(WorkspaceApiError);
60
+ expect(error.status).toBe(403);
61
+ }
62
+ });
63
+ });
64
+ });
65
+ //# sourceMappingURL=workspaces.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaces.test.js","sourceRoot":"","sources":["../../src/api/workspaces.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EACL,YAAY,EACZ,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AAEzB,sBAAsB;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;AAEzB,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,MAAM,GAAuB;QACjC,OAAO,EAAE,yBAAyB;QAClC,KAAK,EAAE,cAAc;KACtB,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,CAAC,SAAS,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,aAAa,GAAG;gBACpB,EAAE,EAAE,sCAAsC;gBAC1C,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,sCAAsC;gBAC/C,UAAU,EAAE,kBAAkB;gBAC9B,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,IAAI;aACX,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC3C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,sCAAsC,EACtC;gBACE,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,aAAa,EAAE,qBAAqB;iBACrC;aACF,CACF,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,cAAc;gBAC1B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,WAAW;gBACvB,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC;aAC7C,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;gBAChD,MAAM,CAAE,KAA2B,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Browser-based authentication for Tinybird CLI
3
+ *
4
+ * Implements OAuth flow via local HTTP server callback
5
+ */
6
+ /**
7
+ * Port for the local OAuth callback server
8
+ */
9
+ export declare const AUTH_SERVER_PORT = 49160;
10
+ /**
11
+ * Default auth host (Tinybird cloud)
12
+ */
13
+ export declare const DEFAULT_AUTH_HOST = "https://cloud.tinybird.co";
14
+ /**
15
+ * Default API host (EU region)
16
+ */
17
+ export declare const DEFAULT_API_HOST = "https://api.tinybird.co";
18
+ /**
19
+ * Maximum time to wait for authentication (in seconds)
20
+ */
21
+ export declare const SERVER_MAX_WAIT_TIME = 180;
22
+ /**
23
+ * Get the auth host from environment or use default
24
+ */
25
+ export declare function getAuthHost(): string;
26
+ /**
27
+ * Result of a login attempt
28
+ */
29
+ export interface AuthResult {
30
+ success: boolean;
31
+ token?: string;
32
+ baseUrl?: string;
33
+ workspaceName?: string;
34
+ userEmail?: string;
35
+ error?: string;
36
+ }
37
+ /**
38
+ * Options for the browser login flow
39
+ */
40
+ export interface LoginOptions {
41
+ /** Override the default auth host */
42
+ authHost?: string;
43
+ /** Override the API host (region) */
44
+ apiHost?: string;
45
+ }
46
+ /**
47
+ * Token response from Tinybird auth API
48
+ */
49
+ interface TokenResponse {
50
+ workspace_token: string;
51
+ user_token: string;
52
+ api_host: string;
53
+ workspace_name?: string;
54
+ user_email?: string;
55
+ }
56
+ /**
57
+ * Open a URL in the user's default browser
58
+ *
59
+ * Cross-platform support for macOS, Linux, and Windows
60
+ *
61
+ * @param url - URL to open
62
+ * @returns Promise that resolves to true if browser was opened successfully
63
+ */
64
+ export declare function openBrowser(url: string): Promise<boolean>;
65
+ /**
66
+ * Exchange an authorization code for tokens
67
+ *
68
+ * @param code - Authorization code from OAuth callback
69
+ * @param authHost - Auth host URL
70
+ * @returns Promise that resolves to token response
71
+ */
72
+ export declare function exchangeCodeForTokens(code: string, authHost: string): Promise<TokenResponse>;
73
+ /**
74
+ * Perform browser-based login flow
75
+ *
76
+ * 1. Starts a local HTTP server for OAuth callback
77
+ * 2. Opens the user's browser to the auth URL
78
+ * 3. Waits for the callback with auth code
79
+ * 4. Exchanges the code for tokens
80
+ *
81
+ * @param options - Login options
82
+ * @returns Promise that resolves to auth result
83
+ */
84
+ export declare function browserLogin(options?: LoginOptions): Promise<AuthResult>;
85
+ export {};
86
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,iBAAiB,8BAA8B,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA+HD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyC/D;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAcxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,UAAU,CAAC,CAuErB"}
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Browser-based authentication for Tinybird CLI
3
+ *
4
+ * Implements OAuth flow via local HTTP server callback
5
+ */
6
+ import * as http from "node:http";
7
+ import { spawn } from "node:child_process";
8
+ import { platform } from "node:os";
9
+ import { URL } from "node:url";
10
+ /**
11
+ * Port for the local OAuth callback server
12
+ */
13
+ export const AUTH_SERVER_PORT = 49160;
14
+ /**
15
+ * Default auth host (Tinybird cloud)
16
+ */
17
+ export const DEFAULT_AUTH_HOST = "https://cloud.tinybird.co";
18
+ /**
19
+ * Default API host (EU region)
20
+ */
21
+ export const DEFAULT_API_HOST = "https://api.tinybird.co";
22
+ /**
23
+ * Maximum time to wait for authentication (in seconds)
24
+ */
25
+ export const SERVER_MAX_WAIT_TIME = 180;
26
+ /**
27
+ * Get the auth host from environment or use default
28
+ */
29
+ export function getAuthHost() {
30
+ return process.env.TINYBIRD_AUTH_HOST ?? DEFAULT_AUTH_HOST;
31
+ }
32
+ /**
33
+ * Generate the HTML callback page served by the local server
34
+ *
35
+ * This page extracts the code from the query string and POSTs it back to the server
36
+ *
37
+ * NOTE: State parameter validation is disabled until Tinybird backend supports it.
38
+ * TODO: Re-enable state validation once /api/cli-login echoes back the state parameter.
39
+ */
40
+ function getCallbackHtml(authHost) {
41
+ return `<!DOCTYPE html>
42
+ <html>
43
+ <head>
44
+ <style>
45
+ body {
46
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
47
+ background: #f5f5f5;
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: center;
51
+ height: 100vh;
52
+ margin: 0;
53
+ }
54
+ .container {
55
+ text-align: center;
56
+ padding: 2rem;
57
+ }
58
+ .spinner {
59
+ border: 3px solid #e0e0e0;
60
+ border-top: 3px solid #333;
61
+ border-radius: 50%;
62
+ width: 30px;
63
+ height: 30px;
64
+ animation: spin 1s linear infinite;
65
+ margin: 0 auto 1rem;
66
+ }
67
+ @keyframes spin {
68
+ 0% { transform: rotate(0deg); }
69
+ 100% { transform: rotate(360deg); }
70
+ }
71
+ </style>
72
+ </head>
73
+ <body>
74
+ <div class="container">
75
+ <div class="spinner"></div>
76
+ <p>Completing authentication...</p>
77
+ </div>
78
+ <script>
79
+ const searchParams = new URLSearchParams(window.location.search);
80
+ const code = searchParams.get('code');
81
+ const workspace = searchParams.get('workspace');
82
+ const region = searchParams.get('region');
83
+ const provider = searchParams.get('provider');
84
+ const host = "${authHost}";
85
+
86
+ if (!code) {
87
+ document.querySelector('.container').innerHTML = '<p>Missing authentication code. Please try again.</p>';
88
+ } else {
89
+ fetch('/?code=' + encodeURIComponent(code), { method: 'POST' })
90
+ .then(() => {
91
+ if (provider && region && workspace) {
92
+ window.location.href = host + "/" + provider + "/" + region + "/cli-login?workspace=" + workspace;
93
+ } else {
94
+ document.querySelector('.container').innerHTML = '<p>Authentication successful! You can close this tab.</p>';
95
+ }
96
+ })
97
+ .catch(() => {
98
+ document.querySelector('.container').innerHTML = '<p>Authentication failed. Please try again.</p>';
99
+ });
100
+ }
101
+ </script>
102
+ </body>
103
+ </html>`;
104
+ }
105
+ /**
106
+ * Start a local HTTP server to receive the OAuth callback
107
+ *
108
+ * @param onCode - Callback invoked when auth code is received
109
+ * @param authHost - Auth host for redirect URL in HTML
110
+ * @returns Promise that resolves to the server instance
111
+ *
112
+ * NOTE: State parameter validation is disabled until Tinybird backend supports it.
113
+ */
114
+ function startAuthServer(onCode, authHost) {
115
+ return new Promise((resolve, reject) => {
116
+ const server = http.createServer((req, res) => {
117
+ const url = new URL(req.url ?? "/", `http://localhost:${AUTH_SERVER_PORT}`);
118
+ if (req.method === "GET") {
119
+ // Serve the callback HTML page
120
+ res.writeHead(200, { "Content-Type": "text/html" });
121
+ res.end(getCallbackHtml(authHost));
122
+ }
123
+ else if (req.method === "POST") {
124
+ // Receive the auth code
125
+ const code = url.searchParams.get("code");
126
+ if (!code) {
127
+ res.writeHead(400);
128
+ res.end("Missing code parameter");
129
+ return;
130
+ }
131
+ onCode(code);
132
+ res.writeHead(200);
133
+ res.end();
134
+ }
135
+ else {
136
+ res.writeHead(405);
137
+ res.end("Method not allowed");
138
+ }
139
+ });
140
+ server.on("error", (err) => {
141
+ reject(new Error(`Failed to start auth server: ${err.message}`));
142
+ });
143
+ // Bind to localhost only for security (prevents network access)
144
+ server.listen(AUTH_SERVER_PORT, "127.0.0.1", () => {
145
+ resolve(server);
146
+ });
147
+ });
148
+ }
149
+ /**
150
+ * Open a URL in the user's default browser
151
+ *
152
+ * Cross-platform support for macOS, Linux, and Windows
153
+ *
154
+ * @param url - URL to open
155
+ * @returns Promise that resolves to true if browser was opened successfully
156
+ */
157
+ export async function openBrowser(url) {
158
+ const os = platform();
159
+ let command;
160
+ let args;
161
+ switch (os) {
162
+ case "darwin":
163
+ command = "open";
164
+ args = [url];
165
+ break;
166
+ case "win32":
167
+ command = "cmd";
168
+ args = ["/c", "start", "", url];
169
+ break;
170
+ default:
171
+ // Linux and others
172
+ command = "xdg-open";
173
+ args = [url];
174
+ break;
175
+ }
176
+ return new Promise((resolve) => {
177
+ try {
178
+ const child = spawn(command, args, {
179
+ detached: true,
180
+ stdio: "ignore",
181
+ });
182
+ child.unref();
183
+ child.on("error", () => {
184
+ resolve(false);
185
+ });
186
+ // Give it a moment to potentially fail
187
+ setTimeout(() => resolve(true), 500);
188
+ }
189
+ catch {
190
+ resolve(false);
191
+ }
192
+ });
193
+ }
194
+ /**
195
+ * Exchange an authorization code for tokens
196
+ *
197
+ * @param code - Authorization code from OAuth callback
198
+ * @param authHost - Auth host URL
199
+ * @returns Promise that resolves to token response
200
+ */
201
+ export async function exchangeCodeForTokens(code, authHost) {
202
+ const url = new URL("/api/cli-login", authHost);
203
+ url.searchParams.set("code", code);
204
+ const response = await fetch(url.toString());
205
+ if (!response.ok) {
206
+ const body = await response.text();
207
+ throw new Error(`Token exchange failed: ${response.status} ${response.statusText}\n${body}`);
208
+ }
209
+ return (await response.json());
210
+ }
211
+ /**
212
+ * Perform browser-based login flow
213
+ *
214
+ * 1. Starts a local HTTP server for OAuth callback
215
+ * 2. Opens the user's browser to the auth URL
216
+ * 3. Waits for the callback with auth code
217
+ * 4. Exchanges the code for tokens
218
+ *
219
+ * @param options - Login options
220
+ * @returns Promise that resolves to auth result
221
+ */
222
+ export async function browserLogin(options = {}) {
223
+ const authHost = options.authHost ?? getAuthHost();
224
+ const apiHost = options.apiHost ?? DEFAULT_API_HOST;
225
+ let server = null;
226
+ let timeoutId = null;
227
+ try {
228
+ // Start the server first
229
+ const serverPromise = new Promise((resolve, reject) => {
230
+ // Set up timeout
231
+ timeoutId = setTimeout(() => {
232
+ reject(new Error("Authentication timed out after 180 seconds"));
233
+ }, SERVER_MAX_WAIT_TIME * 1000);
234
+ startAuthServer((code) => {
235
+ if (timeoutId)
236
+ clearTimeout(timeoutId);
237
+ if (server) {
238
+ resolve({ server, code });
239
+ }
240
+ }, authHost)
241
+ .then((srv) => {
242
+ server = srv;
243
+ })
244
+ .catch(reject);
245
+ });
246
+ // Wait for server to start
247
+ await new Promise((resolve) => setTimeout(resolve, 100));
248
+ // Build auth URL
249
+ const authUrl = new URL("/api/cli-login", authHost);
250
+ authUrl.searchParams.set("apiHost", apiHost);
251
+ console.log("Opening browser for authentication...");
252
+ // Open browser
253
+ await openBrowser(authUrl.toString());
254
+ console.log("\nIf the browser doesn't open, please visit:");
255
+ console.log(authUrl.toString());
256
+ // Wait for auth code
257
+ const { code } = await serverPromise;
258
+ // Exchange code for tokens
259
+ console.log("\nExchanging code for tokens...");
260
+ const tokens = await exchangeCodeForTokens(code, authHost);
261
+ return {
262
+ success: true,
263
+ token: tokens.workspace_token,
264
+ baseUrl: tokens.api_host,
265
+ workspaceName: tokens.workspace_name,
266
+ userEmail: tokens.user_email,
267
+ };
268
+ }
269
+ catch (error) {
270
+ return {
271
+ success: false,
272
+ error: error.message,
273
+ };
274
+ }
275
+ finally {
276
+ // Clean up
277
+ if (timeoutId)
278
+ clearTimeout(timeoutId);
279
+ if (server) {
280
+ server.close();
281
+ }
282
+ }
283
+ }
284
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Branch token storage in ~/.tinybird/branches.json
3
+ */
4
+ /**
5
+ * Information about a cached branch
6
+ */
7
+ export interface BranchInfo {
8
+ /** Branch ID from Tinybird */
9
+ id: string;
10
+ /** Branch token for API access */
11
+ token: string;
12
+ /** When the branch was created/cached */
13
+ createdAt: string;
14
+ }
15
+ /**
16
+ * Structure of the branches.json file
17
+ */
18
+ export interface BranchStore {
19
+ workspaces: Record<string, {
20
+ branches: Record<string, BranchInfo>;
21
+ }>;
22
+ }
23
+ /**
24
+ * Get the path to the branches.json file
25
+ */
26
+ export declare function getBranchStorePath(): string;
27
+ /**
28
+ * Load the branch store from disk
29
+ * Returns an empty store if the file doesn't exist
30
+ */
31
+ export declare function loadBranchStore(): BranchStore;
32
+ /**
33
+ * Save the branch store to disk
34
+ */
35
+ export declare function saveBranchStore(store: BranchStore): void;
36
+ /**
37
+ * Get a cached branch token
38
+ * Returns null if not cached
39
+ */
40
+ export declare function getBranchToken(workspaceId: string, branchName: string): BranchInfo | null;
41
+ /**
42
+ * Cache a branch token
43
+ */
44
+ export declare function setBranchToken(workspaceId: string, branchName: string, info: BranchInfo): void;
45
+ /**
46
+ * Remove a cached branch
47
+ */
48
+ export declare function removeBranch(workspaceId: string, branchName: string): void;
49
+ /**
50
+ * List all cached branches for a workspace
51
+ */
52
+ export declare function listCachedBranches(workspaceId: string): Record<string, BranchInfo>;
53
+ //# sourceMappingURL=branch-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-store.d.ts","sourceRoot":"","sources":["../../src/cli/branch-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAChB,MAAM,EACN;QACE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KACtC,CACF,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAoBD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAc7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAIxD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,UAAU,GAAG,IAAI,CAGnB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,UAAU,GACf,IAAI,CASN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAO1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAG5B"}