@tinybirdco/sdk 0.0.3 → 0.0.6

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 (122) hide show
  1. package/README.md +87 -14
  2. package/dist/api/deploy.d.ts +41 -3
  3. package/dist/api/deploy.d.ts.map +1 -1
  4. package/dist/api/deploy.js +141 -19
  5. package/dist/api/deploy.js.map +1 -1
  6. package/dist/api/deploy.test.js +77 -29
  7. package/dist/api/deploy.test.js.map +1 -1
  8. package/dist/api/local.d.ts +92 -0
  9. package/dist/api/local.d.ts.map +1 -0
  10. package/dist/api/local.js +176 -0
  11. package/dist/api/local.js.map +1 -0
  12. package/dist/api/local.test.d.ts +2 -0
  13. package/dist/api/local.test.d.ts.map +1 -0
  14. package/dist/api/local.test.js +182 -0
  15. package/dist/api/local.test.js.map +1 -0
  16. package/dist/api/resources.d.ts +178 -0
  17. package/dist/api/resources.d.ts.map +1 -0
  18. package/dist/api/resources.js +244 -0
  19. package/dist/api/resources.js.map +1 -0
  20. package/dist/api/resources.test.d.ts +2 -0
  21. package/dist/api/resources.test.d.ts.map +1 -0
  22. package/dist/api/resources.test.js +255 -0
  23. package/dist/api/resources.test.js.map +1 -0
  24. package/dist/cli/commands/build.d.ts +6 -4
  25. package/dist/cli/commands/build.d.ts.map +1 -1
  26. package/dist/cli/commands/build.js +95 -47
  27. package/dist/cli/commands/build.js.map +1 -1
  28. package/dist/cli/commands/deploy.d.ts +39 -0
  29. package/dist/cli/commands/deploy.d.ts.map +1 -0
  30. package/dist/cli/commands/deploy.js +90 -0
  31. package/dist/cli/commands/deploy.js.map +1 -0
  32. package/dist/cli/commands/dev.d.ts +9 -2
  33. package/dist/cli/commands/dev.d.ts.map +1 -1
  34. package/dist/cli/commands/dev.js +60 -31
  35. package/dist/cli/commands/dev.js.map +1 -1
  36. package/dist/cli/commands/init.d.ts +24 -1
  37. package/dist/cli/commands/init.d.ts.map +1 -1
  38. package/dist/cli/commands/init.js +174 -23
  39. package/dist/cli/commands/init.js.map +1 -1
  40. package/dist/cli/commands/init.test.js +190 -30
  41. package/dist/cli/commands/init.test.js.map +1 -1
  42. package/dist/cli/config.d.ts +14 -0
  43. package/dist/cli/config.d.ts.map +1 -1
  44. package/dist/cli/config.js +7 -0
  45. package/dist/cli/config.js.map +1 -1
  46. package/dist/cli/config.test.js +29 -0
  47. package/dist/cli/config.test.js.map +1 -1
  48. package/dist/cli/index.js +107 -11
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/utils/package-manager.d.ts +8 -0
  51. package/dist/cli/utils/package-manager.d.ts.map +1 -0
  52. package/dist/cli/utils/package-manager.js +45 -0
  53. package/dist/cli/utils/package-manager.js.map +1 -0
  54. package/dist/cli/utils/package-manager.test.d.ts +2 -0
  55. package/dist/cli/utils/package-manager.test.d.ts.map +1 -0
  56. package/dist/cli/utils/package-manager.test.js +85 -0
  57. package/dist/cli/utils/package-manager.test.js.map +1 -0
  58. package/dist/codegen/index.d.ts +39 -0
  59. package/dist/codegen/index.d.ts.map +1 -0
  60. package/dist/codegen/index.js +300 -0
  61. package/dist/codegen/index.js.map +1 -0
  62. package/dist/codegen/index.test.d.ts +2 -0
  63. package/dist/codegen/index.test.d.ts.map +1 -0
  64. package/dist/codegen/index.test.js +310 -0
  65. package/dist/codegen/index.test.js.map +1 -0
  66. package/dist/codegen/type-mapper.d.ts +20 -0
  67. package/dist/codegen/type-mapper.d.ts.map +1 -0
  68. package/dist/codegen/type-mapper.js +238 -0
  69. package/dist/codegen/type-mapper.js.map +1 -0
  70. package/dist/codegen/type-mapper.test.d.ts +2 -0
  71. package/dist/codegen/type-mapper.test.d.ts.map +1 -0
  72. package/dist/codegen/type-mapper.test.js +167 -0
  73. package/dist/codegen/type-mapper.test.js.map +1 -0
  74. package/dist/codegen/utils.d.ts +46 -0
  75. package/dist/codegen/utils.d.ts.map +1 -0
  76. package/dist/codegen/utils.js +141 -0
  77. package/dist/codegen/utils.js.map +1 -0
  78. package/dist/codegen/utils.test.d.ts +2 -0
  79. package/dist/codegen/utils.test.d.ts.map +1 -0
  80. package/dist/codegen/utils.test.js +178 -0
  81. package/dist/codegen/utils.test.js.map +1 -0
  82. package/dist/generator/index.d.ts +3 -0
  83. package/dist/generator/index.d.ts.map +1 -1
  84. package/dist/generator/index.js +17 -1
  85. package/dist/generator/index.js.map +1 -1
  86. package/dist/generator/index.test.js +104 -1
  87. package/dist/generator/index.test.js.map +1 -1
  88. package/dist/generator/loader.d.ts +15 -0
  89. package/dist/generator/loader.d.ts.map +1 -1
  90. package/dist/generator/loader.js +24 -0
  91. package/dist/generator/loader.js.map +1 -1
  92. package/dist/test/handlers.d.ts +49 -0
  93. package/dist/test/handlers.d.ts.map +1 -1
  94. package/dist/test/handlers.js +45 -0
  95. package/dist/test/handlers.js.map +1 -1
  96. package/package.json +4 -2
  97. package/src/api/deploy.test.ts +135 -34
  98. package/src/api/deploy.ts +203 -23
  99. package/src/api/local.test.ts +250 -0
  100. package/src/api/local.ts +270 -0
  101. package/src/api/resources.test.ts +332 -0
  102. package/src/api/resources.ts +554 -0
  103. package/src/cli/commands/build.ts +115 -53
  104. package/src/cli/commands/deploy.ts +126 -0
  105. package/src/cli/commands/dev.ts +81 -36
  106. package/src/cli/commands/init.test.ts +239 -30
  107. package/src/cli/commands/init.ts +243 -26
  108. package/src/cli/config.test.ts +47 -0
  109. package/src/cli/config.ts +20 -0
  110. package/src/cli/index.ts +120 -11
  111. package/src/cli/utils/package-manager.test.ts +118 -0
  112. package/src/cli/utils/package-manager.ts +44 -0
  113. package/src/codegen/index.test.ts +367 -0
  114. package/src/codegen/index.ts +379 -0
  115. package/src/codegen/type-mapper.test.ts +224 -0
  116. package/src/codegen/type-mapper.ts +265 -0
  117. package/src/codegen/utils.test.ts +221 -0
  118. package/src/codegen/utils.ts +174 -0
  119. package/src/generator/index.test.ts +121 -1
  120. package/src/generator/index.ts +19 -1
  121. package/src/generator/loader.ts +43 -0
  122. package/src/test/handlers.ts +58 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Local Tinybird container API client
3
+ * For use with tinybird-local Docker image
4
+ */
5
+ /**
6
+ * Tokens returned by the local /tokens endpoint
7
+ */
8
+ export interface LocalTokens {
9
+ /** User token for user-level operations */
10
+ user_token: string;
11
+ /** Admin token for admin operations like listing workspaces */
12
+ admin_token: string;
13
+ /** Default workspace admin token */
14
+ workspace_admin_token: string;
15
+ }
16
+ /**
17
+ * Workspace info from local Tinybird
18
+ */
19
+ export interface LocalWorkspace {
20
+ /** Workspace ID */
21
+ id: string;
22
+ /** Workspace name */
23
+ name: string;
24
+ /** Workspace token */
25
+ token: string;
26
+ }
27
+ /**
28
+ * Error thrown when local container is not running
29
+ */
30
+ export declare class LocalNotRunningError extends Error {
31
+ constructor();
32
+ }
33
+ /**
34
+ * Error thrown by local API operations
35
+ */
36
+ export declare class LocalApiError extends Error {
37
+ readonly status?: number | undefined;
38
+ readonly body?: unknown | undefined;
39
+ constructor(message: string, status?: number | undefined, body?: unknown | undefined);
40
+ }
41
+ /**
42
+ * Check if local Tinybird container is running
43
+ *
44
+ * @returns true if container is running and healthy
45
+ */
46
+ export declare function isLocalRunning(): Promise<boolean>;
47
+ /**
48
+ * Get tokens from local Tinybird container
49
+ *
50
+ * @returns Local tokens
51
+ * @throws LocalNotRunningError if container is not running
52
+ */
53
+ export declare function getLocalTokens(): Promise<LocalTokens>;
54
+ /**
55
+ * List workspaces in local Tinybird
56
+ *
57
+ * @param adminToken - Admin token from getLocalTokens()
58
+ * @returns List of workspaces with their info
59
+ */
60
+ export declare function listLocalWorkspaces(adminToken: string): Promise<{
61
+ workspaces: LocalWorkspace[];
62
+ organizationId?: string;
63
+ }>;
64
+ /**
65
+ * Create a workspace in local Tinybird
66
+ *
67
+ * @param userToken - User token from getLocalTokens()
68
+ * @param workspaceName - Name for the new workspace
69
+ * @param organizationId - Organization ID to assign workspace to
70
+ * @returns Created workspace info
71
+ */
72
+ export declare function createLocalWorkspace(userToken: string, workspaceName: string, organizationId?: string): Promise<LocalWorkspace>;
73
+ /**
74
+ * Get or create a workspace in local Tinybird
75
+ *
76
+ * @param tokens - Tokens from getLocalTokens()
77
+ * @param workspaceName - Name of the workspace to get or create
78
+ * @returns Workspace info and whether it was newly created
79
+ */
80
+ export declare function getOrCreateLocalWorkspace(tokens: LocalTokens, workspaceName: string): Promise<{
81
+ workspace: LocalWorkspace;
82
+ wasCreated: boolean;
83
+ }>;
84
+ /**
85
+ * Get workspace name for local mode based on git branch or path
86
+ *
87
+ * @param tinybirdBranch - Sanitized git branch name (or null if not in git)
88
+ * @param cwd - Current working directory (used for hash if no branch)
89
+ * @returns Workspace name to use
90
+ */
91
+ export declare function getLocalWorkspaceName(tinybirdBranch: string | null, cwd: string): string;
92
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/api/local.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAcD;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;;CAQ9C;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,MAAM,CAAC,EAAE,MAAM;aACf,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,IAAI,CAAC,EAAE,OAAO,YAAA;CAKjC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAUvD;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CA+B3D;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,UAAU,EAAE,cAAc,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BpE;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED;;;;;;GAMG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAAC,CA4B7D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,GAAG,EAAE,MAAM,GACV,MAAM,CAQR"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Local Tinybird container API client
3
+ * For use with tinybird-local Docker image
4
+ */
5
+ import * as crypto from "crypto";
6
+ import { LOCAL_BASE_URL } from "../cli/config.js";
7
+ /**
8
+ * Error thrown when local container is not running
9
+ */
10
+ export class LocalNotRunningError extends Error {
11
+ constructor() {
12
+ super(`Tinybird local is not running. Start it with:\n` +
13
+ `docker run -d -p 7181:7181 --name tinybird-local tinybirdco/tinybird-local:latest`);
14
+ this.name = "LocalNotRunningError";
15
+ }
16
+ }
17
+ /**
18
+ * Error thrown by local API operations
19
+ */
20
+ export class LocalApiError extends Error {
21
+ status;
22
+ body;
23
+ constructor(message, status, body) {
24
+ super(message);
25
+ this.status = status;
26
+ this.body = body;
27
+ this.name = "LocalApiError";
28
+ }
29
+ }
30
+ /**
31
+ * Check if local Tinybird container is running
32
+ *
33
+ * @returns true if container is running and healthy
34
+ */
35
+ export async function isLocalRunning() {
36
+ try {
37
+ const response = await fetch(`${LOCAL_BASE_URL}/tokens`, {
38
+ method: "GET",
39
+ signal: AbortSignal.timeout(5000),
40
+ });
41
+ return response.ok;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ /**
48
+ * Get tokens from local Tinybird container
49
+ *
50
+ * @returns Local tokens
51
+ * @throws LocalNotRunningError if container is not running
52
+ */
53
+ export async function getLocalTokens() {
54
+ try {
55
+ const response = await fetch(`${LOCAL_BASE_URL}/tokens`, {
56
+ method: "GET",
57
+ signal: AbortSignal.timeout(5000),
58
+ });
59
+ if (!response.ok) {
60
+ throw new LocalApiError(`Failed to get local tokens: ${response.status} ${response.statusText}`, response.status);
61
+ }
62
+ const tokens = (await response.json());
63
+ // Validate response structure
64
+ if (!tokens.user_token || !tokens.admin_token || !tokens.workspace_admin_token) {
65
+ throw new LocalApiError("Invalid tokens response from local Tinybird - missing required fields");
66
+ }
67
+ return tokens;
68
+ }
69
+ catch (error) {
70
+ if (error instanceof LocalApiError) {
71
+ throw error;
72
+ }
73
+ // Connection error - container not running
74
+ throw new LocalNotRunningError();
75
+ }
76
+ }
77
+ /**
78
+ * List workspaces in local Tinybird
79
+ *
80
+ * @param adminToken - Admin token from getLocalTokens()
81
+ * @returns List of workspaces with their info
82
+ */
83
+ export async function listLocalWorkspaces(adminToken) {
84
+ const url = `${LOCAL_BASE_URL}/v1/user/workspaces?with_organization=true&token=${adminToken}`;
85
+ const response = await fetch(url, {
86
+ method: "GET",
87
+ });
88
+ if (!response.ok) {
89
+ const body = await response.text();
90
+ throw new LocalApiError(`Failed to list local workspaces: ${response.status} ${response.statusText}`, response.status, body);
91
+ }
92
+ const data = (await response.json());
93
+ return {
94
+ workspaces: data.workspaces.map((ws) => ({
95
+ id: ws.id,
96
+ name: ws.name,
97
+ token: ws.token,
98
+ })),
99
+ organizationId: data.organization_id,
100
+ };
101
+ }
102
+ /**
103
+ * Create a workspace in local Tinybird
104
+ *
105
+ * @param userToken - User token from getLocalTokens()
106
+ * @param workspaceName - Name for the new workspace
107
+ * @param organizationId - Organization ID to assign workspace to
108
+ * @returns Created workspace info
109
+ */
110
+ export async function createLocalWorkspace(userToken, workspaceName, organizationId) {
111
+ const url = `${LOCAL_BASE_URL}/v1/workspaces`;
112
+ const formData = new URLSearchParams();
113
+ formData.append("name", workspaceName);
114
+ if (organizationId) {
115
+ formData.append("assign_to_organization_id", organizationId);
116
+ }
117
+ const response = await fetch(url, {
118
+ method: "POST",
119
+ headers: {
120
+ Authorization: `Bearer ${userToken}`,
121
+ "Content-Type": "application/x-www-form-urlencoded",
122
+ },
123
+ body: formData.toString(),
124
+ });
125
+ if (!response.ok) {
126
+ const responseBody = await response.text();
127
+ throw new LocalApiError(`Failed to create local workspace: ${response.status} ${response.statusText}`, response.status, responseBody);
128
+ }
129
+ const data = (await response.json());
130
+ return {
131
+ id: data.id,
132
+ name: data.name,
133
+ token: data.token,
134
+ };
135
+ }
136
+ /**
137
+ * Get or create a workspace in local Tinybird
138
+ *
139
+ * @param tokens - Tokens from getLocalTokens()
140
+ * @param workspaceName - Name of the workspace to get or create
141
+ * @returns Workspace info and whether it was newly created
142
+ */
143
+ export async function getOrCreateLocalWorkspace(tokens, workspaceName) {
144
+ // List existing workspaces
145
+ const { workspaces, organizationId } = await listLocalWorkspaces(tokens.admin_token);
146
+ // Check if workspace already exists
147
+ const existing = workspaces.find((ws) => ws.name === workspaceName);
148
+ if (existing) {
149
+ return { workspace: existing, wasCreated: false };
150
+ }
151
+ // Create new workspace
152
+ await createLocalWorkspace(tokens.user_token, workspaceName, organizationId);
153
+ // Fetch the workspace again to get the token (create response may not include it)
154
+ const { workspaces: updatedWorkspaces } = await listLocalWorkspaces(tokens.admin_token);
155
+ const newWorkspace = updatedWorkspaces.find((ws) => ws.name === workspaceName);
156
+ if (!newWorkspace) {
157
+ throw new LocalApiError(`Created workspace '${workspaceName}' but could not find it in workspace list`);
158
+ }
159
+ return { workspace: newWorkspace, wasCreated: true };
160
+ }
161
+ /**
162
+ * Get workspace name for local mode based on git branch or path
163
+ *
164
+ * @param tinybirdBranch - Sanitized git branch name (or null if not in git)
165
+ * @param cwd - Current working directory (used for hash if no branch)
166
+ * @returns Workspace name to use
167
+ */
168
+ export function getLocalWorkspaceName(tinybirdBranch, cwd) {
169
+ if (tinybirdBranch) {
170
+ return tinybirdBranch;
171
+ }
172
+ // No branch detected - use hash of path like Python implementation
173
+ const hash = crypto.createHash("sha256").update(cwd).digest("hex");
174
+ return `Build_${hash.substring(0, 16)}`;
175
+ }
176
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/api/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.test.d.ts","sourceRoot":"","sources":["../../src/api/local.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,182 @@
1
+ import { describe, it, expect, beforeAll, afterEach, afterAll } from "vitest";
2
+ import { setupServer } from "msw/node";
3
+ import { http, HttpResponse } from "msw";
4
+ import { getLocalTokens, listLocalWorkspaces, createLocalWorkspace, getOrCreateLocalWorkspace, isLocalRunning, getLocalWorkspaceName, LocalNotRunningError, LocalApiError, } from "./local.js";
5
+ import { LOCAL_BASE_URL } from "../cli/config.js";
6
+ const server = setupServer();
7
+ beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
8
+ afterEach(() => server.resetHandlers());
9
+ afterAll(() => server.close());
10
+ describe("Local API", () => {
11
+ describe("isLocalRunning", () => {
12
+ it("returns true when local container is running", async () => {
13
+ server.use(http.get(`${LOCAL_BASE_URL}/tokens`, () => {
14
+ return HttpResponse.json({
15
+ user_token: "user-token",
16
+ admin_token: "admin-token",
17
+ workspace_admin_token: "workspace-token",
18
+ });
19
+ }));
20
+ const result = await isLocalRunning();
21
+ expect(result).toBe(true);
22
+ });
23
+ it("returns false when local container is not running", async () => {
24
+ server.use(http.get(`${LOCAL_BASE_URL}/tokens`, () => {
25
+ return HttpResponse.error();
26
+ }));
27
+ const result = await isLocalRunning();
28
+ expect(result).toBe(false);
29
+ });
30
+ });
31
+ describe("getLocalTokens", () => {
32
+ it("returns tokens from local container", async () => {
33
+ server.use(http.get(`${LOCAL_BASE_URL}/tokens`, () => {
34
+ return HttpResponse.json({
35
+ user_token: "user-token-123",
36
+ admin_token: "admin-token-456",
37
+ workspace_admin_token: "workspace-token-789",
38
+ });
39
+ }));
40
+ const tokens = await getLocalTokens();
41
+ expect(tokens.user_token).toBe("user-token-123");
42
+ expect(tokens.admin_token).toBe("admin-token-456");
43
+ expect(tokens.workspace_admin_token).toBe("workspace-token-789");
44
+ });
45
+ it("throws LocalNotRunningError when container is not running", async () => {
46
+ server.use(http.get(`${LOCAL_BASE_URL}/tokens`, () => {
47
+ return HttpResponse.error();
48
+ }));
49
+ await expect(getLocalTokens()).rejects.toThrow(LocalNotRunningError);
50
+ });
51
+ it("throws LocalApiError when response is invalid", async () => {
52
+ server.use(http.get(`${LOCAL_BASE_URL}/tokens`, () => {
53
+ return HttpResponse.json({
54
+ // Missing required fields
55
+ user_token: "user-token",
56
+ });
57
+ }));
58
+ await expect(getLocalTokens()).rejects.toThrow(LocalApiError);
59
+ });
60
+ });
61
+ describe("listLocalWorkspaces", () => {
62
+ it("returns list of workspaces", async () => {
63
+ server.use(http.get(`${LOCAL_BASE_URL}/v1/user/workspaces`, () => {
64
+ return HttpResponse.json({
65
+ organization_id: "org-123",
66
+ workspaces: [
67
+ { id: "ws-1", name: "Workspace1", token: "token-1" },
68
+ { id: "ws-2", name: "Workspace2", token: "token-2" },
69
+ ],
70
+ });
71
+ }));
72
+ const result = await listLocalWorkspaces("admin-token");
73
+ expect(result.organizationId).toBe("org-123");
74
+ expect(result.workspaces).toHaveLength(2);
75
+ expect(result.workspaces[0]).toEqual({
76
+ id: "ws-1",
77
+ name: "Workspace1",
78
+ token: "token-1",
79
+ });
80
+ });
81
+ it("throws LocalApiError on failure", async () => {
82
+ server.use(http.get(`${LOCAL_BASE_URL}/v1/user/workspaces`, () => {
83
+ return new HttpResponse("Not found", { status: 404 });
84
+ }));
85
+ await expect(listLocalWorkspaces("admin-token")).rejects.toThrow(LocalApiError);
86
+ });
87
+ });
88
+ describe("createLocalWorkspace", () => {
89
+ it("creates a new workspace", async () => {
90
+ server.use(http.post(`${LOCAL_BASE_URL}/v1/workspaces`, async ({ request }) => {
91
+ const formData = await request.text();
92
+ const params = new URLSearchParams(formData);
93
+ return HttpResponse.json({
94
+ id: "new-ws-id",
95
+ name: params.get("name"),
96
+ token: "new-ws-token",
97
+ });
98
+ }));
99
+ const result = await createLocalWorkspace("user-token", "TestWorkspace");
100
+ expect(result.id).toBe("new-ws-id");
101
+ expect(result.name).toBe("TestWorkspace");
102
+ expect(result.token).toBe("new-ws-token");
103
+ });
104
+ it("throws LocalApiError on failure", async () => {
105
+ server.use(http.post(`${LOCAL_BASE_URL}/v1/workspaces`, () => {
106
+ return new HttpResponse("Server error", { status: 500 });
107
+ }));
108
+ await expect(createLocalWorkspace("user-token", "TestWorkspace")).rejects.toThrow(LocalApiError);
109
+ });
110
+ });
111
+ describe("getOrCreateLocalWorkspace", () => {
112
+ const tokens = {
113
+ user_token: "user-token",
114
+ admin_token: "admin-token",
115
+ workspace_admin_token: "default-token",
116
+ };
117
+ it("returns existing workspace if found", async () => {
118
+ server.use(http.get(`${LOCAL_BASE_URL}/v1/user/workspaces`, () => {
119
+ return HttpResponse.json({
120
+ organization_id: "org-123",
121
+ workspaces: [
122
+ { id: "existing-ws", name: "MyWorkspace", token: "existing-token" },
123
+ ],
124
+ });
125
+ }));
126
+ const result = await getOrCreateLocalWorkspace(tokens, "MyWorkspace");
127
+ expect(result.wasCreated).toBe(false);
128
+ expect(result.workspace.name).toBe("MyWorkspace");
129
+ expect(result.workspace.token).toBe("existing-token");
130
+ });
131
+ it("creates new workspace if not found", async () => {
132
+ let createCalled = false;
133
+ server.use(http.get(`${LOCAL_BASE_URL}/v1/user/workspaces`, () => {
134
+ // Return different response based on whether create was called
135
+ if (createCalled) {
136
+ return HttpResponse.json({
137
+ organization_id: "org-123",
138
+ workspaces: [
139
+ { id: "new-ws", name: "NewWorkspace", token: "new-token" },
140
+ ],
141
+ });
142
+ }
143
+ return HttpResponse.json({
144
+ organization_id: "org-123",
145
+ workspaces: [], // Empty initially
146
+ });
147
+ }), http.post(`${LOCAL_BASE_URL}/v1/workspaces`, () => {
148
+ createCalled = true;
149
+ return HttpResponse.json({
150
+ id: "new-ws",
151
+ name: "NewWorkspace",
152
+ token: "new-token",
153
+ });
154
+ }));
155
+ const result = await getOrCreateLocalWorkspace(tokens, "NewWorkspace");
156
+ expect(result.wasCreated).toBe(true);
157
+ expect(result.workspace.name).toBe("NewWorkspace");
158
+ expect(result.workspace.token).toBe("new-token");
159
+ });
160
+ });
161
+ describe("getLocalWorkspaceName", () => {
162
+ it("uses branch name when available", () => {
163
+ const name = getLocalWorkspaceName("feature_branch", "/some/path");
164
+ expect(name).toBe("feature_branch");
165
+ });
166
+ it("uses hash-based name when no branch", () => {
167
+ const name = getLocalWorkspaceName(null, "/some/path");
168
+ expect(name).toMatch(/^Build_[a-f0-9]{16}$/);
169
+ });
170
+ it("generates consistent hash for same path", () => {
171
+ const name1 = getLocalWorkspaceName(null, "/same/path");
172
+ const name2 = getLocalWorkspaceName(null, "/same/path");
173
+ expect(name1).toBe(name2);
174
+ });
175
+ it("generates different hash for different paths", () => {
176
+ const name1 = getLocalWorkspaceName(null, "/path/one");
177
+ const name2 = getLocalWorkspaceName(null, "/path/two");
178
+ expect(name1).not.toBe(name2);
179
+ });
180
+ });
181
+ });
182
+ //# sourceMappingURL=local.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.test.js","sourceRoot":"","sources":["../../src/api/local.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Tinybird Resources API client
3
+ * Functions to list and fetch datasources and pipes from a workspace
4
+ */
5
+ import type { WorkspaceApiConfig } from "./workspaces.js";
6
+ /**
7
+ * Error thrown by resource API operations
8
+ */
9
+ export declare class ResourceApiError extends Error {
10
+ readonly status: number;
11
+ readonly endpoint: string;
12
+ readonly body?: unknown | undefined;
13
+ constructor(message: string, status: number, endpoint: string, body?: unknown | undefined);
14
+ }
15
+ /**
16
+ * Column information from Tinybird API
17
+ */
18
+ export interface DatasourceColumn {
19
+ /** Column name */
20
+ name: string;
21
+ /** ClickHouse type (e.g., "String", "DateTime", "Nullable(String)") */
22
+ type: string;
23
+ /** JSON path for JSON extraction */
24
+ jsonpath?: string;
25
+ /** Default value expression */
26
+ default?: string;
27
+ /** Codec for compression */
28
+ codec?: string;
29
+ }
30
+ /**
31
+ * Engine information from Tinybird API
32
+ */
33
+ export interface DatasourceEngine {
34
+ /** Engine type (e.g., "MergeTree", "ReplacingMergeTree") */
35
+ type: string;
36
+ /** Sorting key columns */
37
+ sorting_key?: string;
38
+ /** Partition key expression */
39
+ partition_key?: string;
40
+ /** Primary key columns */
41
+ primary_key?: string;
42
+ /** TTL expression */
43
+ ttl?: string;
44
+ /** Version column (ReplacingMergeTree) */
45
+ ver?: string;
46
+ /** Sign column (CollapsingMergeTree) */
47
+ sign?: string;
48
+ /** Version column (VersionedCollapsingMergeTree) */
49
+ version?: string;
50
+ /** Summing columns (SummingMergeTree) */
51
+ summing_columns?: string;
52
+ }
53
+ /**
54
+ * Full datasource information from Tinybird API
55
+ */
56
+ export interface DatasourceInfo {
57
+ /** Datasource name */
58
+ name: string;
59
+ /** Human-readable description */
60
+ description?: string;
61
+ /** Column definitions */
62
+ columns: DatasourceColumn[];
63
+ /** Engine configuration */
64
+ engine: DatasourceEngine;
65
+ }
66
+ /**
67
+ * Node information from a pipe
68
+ */
69
+ export interface PipeNode {
70
+ /** Node name */
71
+ name: string;
72
+ /** SQL query */
73
+ sql: string;
74
+ /** Node description */
75
+ description?: string;
76
+ }
77
+ /**
78
+ * Parameter information from a pipe
79
+ */
80
+ export interface PipeParam {
81
+ /** Parameter name */
82
+ name: string;
83
+ /** ClickHouse type */
84
+ type: string;
85
+ /** Default value */
86
+ default?: string | number;
87
+ /** Whether the parameter is required */
88
+ required: boolean;
89
+ /** Parameter description */
90
+ description?: string;
91
+ }
92
+ /**
93
+ * Pipe type classification
94
+ */
95
+ export type PipeType = "endpoint" | "materialized" | "copy" | "pipe";
96
+ /**
97
+ * Full pipe information from Tinybird API
98
+ */
99
+ export interface PipeInfo {
100
+ /** Pipe name */
101
+ name: string;
102
+ /** Human-readable description */
103
+ description?: string;
104
+ /** Nodes in the pipe */
105
+ nodes: PipeNode[];
106
+ /** Query parameters */
107
+ params: PipeParam[];
108
+ /** Pipe type */
109
+ type: PipeType;
110
+ /** Endpoint configuration (if type is endpoint) */
111
+ endpoint?: {
112
+ enabled: boolean;
113
+ cache?: {
114
+ enabled: boolean;
115
+ ttl?: number;
116
+ };
117
+ };
118
+ /** Materialized view configuration (if type is materialized) */
119
+ materialized?: {
120
+ datasource: string;
121
+ };
122
+ /** Copy pipe configuration (if type is copy) */
123
+ copy?: {
124
+ target_datasource: string;
125
+ copy_schedule?: string;
126
+ copy_mode?: "append" | "replace";
127
+ };
128
+ /** Output column schema (for endpoints) */
129
+ output_columns: DatasourceColumn[];
130
+ }
131
+ /**
132
+ * List all datasources in the workspace
133
+ *
134
+ * @param config - API configuration
135
+ * @returns Array of datasource names
136
+ */
137
+ export declare function listDatasources(config: WorkspaceApiConfig): Promise<string[]>;
138
+ /**
139
+ * Get detailed information about a specific datasource
140
+ *
141
+ * @param config - API configuration
142
+ * @param name - Datasource name
143
+ * @returns Datasource information including schema and engine
144
+ */
145
+ export declare function getDatasource(config: WorkspaceApiConfig, name: string): Promise<DatasourceInfo>;
146
+ /**
147
+ * List all pipes in the workspace
148
+ *
149
+ * @param config - API configuration
150
+ * @returns Array of pipe names
151
+ */
152
+ export declare function listPipes(config: WorkspaceApiConfig): Promise<string[]>;
153
+ /**
154
+ * Get detailed information about a specific pipe
155
+ *
156
+ * @param config - API configuration
157
+ * @param name - Pipe name
158
+ * @returns Pipe information including nodes, params, and output schema
159
+ */
160
+ export declare function getPipe(config: WorkspaceApiConfig, name: string): Promise<PipeInfo>;
161
+ /**
162
+ * Fetch all resources from a workspace
163
+ *
164
+ * @param config - API configuration
165
+ * @returns All datasources and pipes with full details
166
+ */
167
+ export declare function fetchAllResources(config: WorkspaceApiConfig): Promise<{
168
+ datasources: DatasourceInfo[];
169
+ pipes: PipeInfo[];
170
+ }>;
171
+ /**
172
+ * Check if a workspace has any resources
173
+ *
174
+ * @param config - API configuration
175
+ * @returns True if the workspace has at least one datasource or pipe
176
+ */
177
+ export declare function hasResources(config: WorkspaceApiConfig): Promise<boolean>;
178
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../src/api/resources.ts"],"names":[],"mappings":"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"}