@tinybirdco/sdk 0.0.24 → 0.0.26

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
@@ -271,12 +271,19 @@ tinybird deploy --dry-run # Preview without pushing
271
271
 
272
272
  ### `tinybird login`
273
273
 
274
- Authenticate with Tinybird via browser.
274
+ Authenticate with Tinybird via browser. Use this to set up credentials for an existing project without reinitializing.
275
275
 
276
276
  ```bash
277
277
  tinybird login
278
278
  ```
279
279
 
280
+ This is useful when:
281
+ - You cloned an existing project that has `tinybird.json` but no credentials
282
+ - Your token has expired or needs to be refreshed
283
+ - You're switching to a different Tinybird workspace
284
+
285
+ The command saves your token to `.env.local` and updates the `baseUrl` in `tinybird.json` if you select a different region.
286
+
280
287
  ### `tinybird branch`
281
288
 
282
289
  Manage Tinybird branches.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=login.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,249 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as os from "os";
5
+ import { runLogin } from "./login.js";
6
+ // Mock the auth module to avoid browser login
7
+ vi.mock("../auth.js", () => ({
8
+ browserLogin: vi.fn(),
9
+ }));
10
+ // Import the mocked function
11
+ import { browserLogin } from "../auth.js";
12
+ const mockedBrowserLogin = vi.mocked(browserLogin);
13
+ describe("Login Command", () => {
14
+ let tempDir;
15
+ beforeEach(() => {
16
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-login-test-"));
17
+ vi.clearAllMocks();
18
+ });
19
+ afterEach(() => {
20
+ try {
21
+ fs.rmSync(tempDir, { recursive: true });
22
+ }
23
+ catch {
24
+ // Ignore cleanup errors
25
+ }
26
+ });
27
+ describe("config file requirement", () => {
28
+ it("fails when no tinybird.json exists", async () => {
29
+ const result = await runLogin({ cwd: tempDir });
30
+ expect(result.success).toBe(false);
31
+ expect(result.error).toContain("No tinybird.json found");
32
+ expect(result.error).toContain("npx tinybird init");
33
+ });
34
+ it("succeeds when tinybird.json exists", async () => {
35
+ // Create a tinybird.json config
36
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
37
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
38
+ mockedBrowserLogin.mockResolvedValue({
39
+ success: true,
40
+ token: "test-token",
41
+ baseUrl: "https://api.tinybird.co",
42
+ workspaceName: "test-workspace",
43
+ userEmail: "user@example.com",
44
+ });
45
+ const result = await runLogin({ cwd: tempDir });
46
+ expect(result.success).toBe(true);
47
+ expect(result.workspaceName).toBe("test-workspace");
48
+ expect(result.userEmail).toBe("user@example.com");
49
+ expect(result.baseUrl).toBe("https://api.tinybird.co");
50
+ });
51
+ it("finds tinybird.json in parent directory (monorepo support)", async () => {
52
+ // Create nested directory structure
53
+ const nestedDir = path.join(tempDir, "packages", "app");
54
+ fs.mkdirSync(nestedDir, { recursive: true });
55
+ // Create tinybird.json in root
56
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
57
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
58
+ mockedBrowserLogin.mockResolvedValue({
59
+ success: true,
60
+ token: "test-token",
61
+ baseUrl: "https://api.tinybird.co",
62
+ workspaceName: "test-workspace",
63
+ userEmail: "user@example.com",
64
+ });
65
+ const result = await runLogin({ cwd: nestedDir });
66
+ expect(result.success).toBe(true);
67
+ });
68
+ });
69
+ describe("authentication flow", () => {
70
+ beforeEach(() => {
71
+ // Create a tinybird.json config
72
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
73
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
74
+ });
75
+ it("returns error when browser login fails", async () => {
76
+ mockedBrowserLogin.mockResolvedValue({
77
+ success: false,
78
+ error: "Authentication timed out",
79
+ });
80
+ const result = await runLogin({ cwd: tempDir });
81
+ expect(result.success).toBe(false);
82
+ expect(result.error).toBe("Authentication timed out");
83
+ });
84
+ it("returns error when token is missing from auth result", async () => {
85
+ mockedBrowserLogin.mockResolvedValue({
86
+ success: true,
87
+ // No token provided
88
+ });
89
+ const result = await runLogin({ cwd: tempDir });
90
+ expect(result.success).toBe(false);
91
+ expect(result.error).toBe("Login failed");
92
+ });
93
+ it("passes apiHost option to browserLogin", async () => {
94
+ mockedBrowserLogin.mockResolvedValue({
95
+ success: true,
96
+ token: "test-token",
97
+ baseUrl: "https://api.us-east.tinybird.co",
98
+ workspaceName: "test-workspace",
99
+ });
100
+ await runLogin({ cwd: tempDir, apiHost: "https://api.us-east.tinybird.co" });
101
+ expect(mockedBrowserLogin).toHaveBeenCalledWith({
102
+ apiHost: "https://api.us-east.tinybird.co",
103
+ });
104
+ });
105
+ });
106
+ describe("token storage", () => {
107
+ beforeEach(() => {
108
+ // Create a tinybird.json config
109
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
110
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
111
+ });
112
+ it("creates .env.local with token", async () => {
113
+ mockedBrowserLogin.mockResolvedValue({
114
+ success: true,
115
+ token: "new-token-123",
116
+ baseUrl: "https://api.tinybird.co",
117
+ workspaceName: "test-workspace",
118
+ });
119
+ const result = await runLogin({ cwd: tempDir });
120
+ expect(result.success).toBe(true);
121
+ const envContent = fs.readFileSync(path.join(tempDir, ".env.local"), "utf-8");
122
+ expect(envContent).toContain("TINYBIRD_TOKEN=new-token-123");
123
+ });
124
+ it("updates existing token in .env.local", async () => {
125
+ // Create existing .env.local with old token
126
+ fs.writeFileSync(path.join(tempDir, ".env.local"), "TINYBIRD_TOKEN=old-token\nOTHER_VAR=value\n");
127
+ mockedBrowserLogin.mockResolvedValue({
128
+ success: true,
129
+ token: "new-token-456",
130
+ baseUrl: "https://api.tinybird.co",
131
+ workspaceName: "test-workspace",
132
+ });
133
+ const result = await runLogin({ cwd: tempDir });
134
+ expect(result.success).toBe(true);
135
+ const envContent = fs.readFileSync(path.join(tempDir, ".env.local"), "utf-8");
136
+ expect(envContent).toContain("TINYBIRD_TOKEN=new-token-456");
137
+ expect(envContent).toContain("OTHER_VAR=value");
138
+ expect(envContent).not.toContain("old-token");
139
+ });
140
+ it("appends token to existing .env.local without TINYBIRD_TOKEN", async () => {
141
+ // Create existing .env.local without token
142
+ fs.writeFileSync(path.join(tempDir, ".env.local"), "OTHER_VAR=value\n");
143
+ mockedBrowserLogin.mockResolvedValue({
144
+ success: true,
145
+ token: "new-token-789",
146
+ baseUrl: "https://api.tinybird.co",
147
+ workspaceName: "test-workspace",
148
+ });
149
+ const result = await runLogin({ cwd: tempDir });
150
+ expect(result.success).toBe(true);
151
+ const envContent = fs.readFileSync(path.join(tempDir, ".env.local"), "utf-8");
152
+ expect(envContent).toContain("OTHER_VAR=value");
153
+ expect(envContent).toContain("TINYBIRD_TOKEN=new-token-789");
154
+ });
155
+ it("saves .env.local in same directory as tinybird.json (monorepo)", async () => {
156
+ // Create nested directory structure
157
+ const nestedDir = path.join(tempDir, "packages", "app");
158
+ fs.mkdirSync(nestedDir, { recursive: true });
159
+ // Move tinybird.json to root
160
+ fs.unlinkSync(path.join(tempDir, "tinybird.json"));
161
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
162
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
163
+ mockedBrowserLogin.mockResolvedValue({
164
+ success: true,
165
+ token: "test-token",
166
+ baseUrl: "https://api.tinybird.co",
167
+ workspaceName: "test-workspace",
168
+ });
169
+ const result = await runLogin({ cwd: nestedDir });
170
+ expect(result.success).toBe(true);
171
+ // .env.local should be in the root (same as tinybird.json), not in nested dir
172
+ expect(fs.existsSync(path.join(tempDir, ".env.local"))).toBe(true);
173
+ expect(fs.existsSync(path.join(nestedDir, ".env.local"))).toBe(false);
174
+ });
175
+ });
176
+ describe("baseUrl update", () => {
177
+ beforeEach(() => {
178
+ // Create a tinybird.json config
179
+ const config = {
180
+ include: ["lib/tinybird.ts"],
181
+ token: "${TINYBIRD_TOKEN}",
182
+ baseUrl: "https://api.tinybird.co",
183
+ };
184
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config, null, 2));
185
+ });
186
+ it("updates baseUrl in tinybird.json when region changes", async () => {
187
+ mockedBrowserLogin.mockResolvedValue({
188
+ success: true,
189
+ token: "test-token",
190
+ baseUrl: "https://api.us-east.tinybird.co",
191
+ workspaceName: "test-workspace",
192
+ });
193
+ const result = await runLogin({ cwd: tempDir });
194
+ expect(result.success).toBe(true);
195
+ const config = JSON.parse(fs.readFileSync(path.join(tempDir, "tinybird.json"), "utf-8"));
196
+ expect(config.baseUrl).toBe("https://api.us-east.tinybird.co");
197
+ });
198
+ it("does not modify tinybird.json when baseUrl is not provided", async () => {
199
+ mockedBrowserLogin.mockResolvedValue({
200
+ success: true,
201
+ token: "test-token",
202
+ // No baseUrl
203
+ workspaceName: "test-workspace",
204
+ });
205
+ const result = await runLogin({ cwd: tempDir });
206
+ expect(result.success).toBe(true);
207
+ const config = JSON.parse(fs.readFileSync(path.join(tempDir, "tinybird.json"), "utf-8"));
208
+ // Original baseUrl preserved
209
+ expect(config.baseUrl).toBe("https://api.tinybird.co");
210
+ });
211
+ });
212
+ describe("return values", () => {
213
+ beforeEach(() => {
214
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
215
+ fs.writeFileSync(path.join(tempDir, "tinybird.json"), JSON.stringify(config));
216
+ });
217
+ it("returns workspace name from auth result", async () => {
218
+ mockedBrowserLogin.mockResolvedValue({
219
+ success: true,
220
+ token: "test-token",
221
+ workspaceName: "my-workspace",
222
+ });
223
+ const result = await runLogin({ cwd: tempDir });
224
+ expect(result.success).toBe(true);
225
+ expect(result.workspaceName).toBe("my-workspace");
226
+ });
227
+ it("returns user email from auth result", async () => {
228
+ mockedBrowserLogin.mockResolvedValue({
229
+ success: true,
230
+ token: "test-token",
231
+ userEmail: "developer@example.com",
232
+ });
233
+ const result = await runLogin({ cwd: tempDir });
234
+ expect(result.success).toBe(true);
235
+ expect(result.userEmail).toBe("developer@example.com");
236
+ });
237
+ it("returns baseUrl from auth result", async () => {
238
+ mockedBrowserLogin.mockResolvedValue({
239
+ success: true,
240
+ token: "test-token",
241
+ baseUrl: "https://api.eu-central.tinybird.co",
242
+ });
243
+ const result = await runLogin({ cwd: tempDir });
244
+ expect(result.success).toBe(true);
245
+ expect(result.baseUrl).toBe("https://api.eu-central.tinybird.co");
246
+ });
247
+ });
248
+ });
249
+ //# sourceMappingURL=login.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../../src/cli/commands/login.test.ts"],"names":[],"mappings":"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"}
@@ -46,7 +46,10 @@ export interface PreviewCommandResult {
46
46
  durationMs: number;
47
47
  }
48
48
  /**
49
- * Generate preview branch name with format: tmp_ci_${branch}_${timestamp}
49
+ * Generate preview branch name with format: tmp_ci_${branch}
50
+ *
51
+ * Uses a deterministic name based on the git branch so that Vercel preview
52
+ * deployments can find the branch by name.
50
53
  *
51
54
  * @param gitBranch - Current git branch name (or null)
52
55
  * @returns Preview branch name
@@ -1 +1 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/preview.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmD,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAa7F;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,uBAAuB;IACvB,KAAK,CAAC,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,oBAAoB;IACpB,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAI1E;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqOnG"}
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/preview.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmD,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAa7F;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,yBAAyB;IACzB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,uBAAuB;IACvB,KAAK,CAAC,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,oBAAoB;IACpB,MAAM,CAAC,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAG1E;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAuPnG"}
@@ -3,21 +3,23 @@
3
3
  */
4
4
  import { loadConfig, LOCAL_BASE_URL } from "../config.js";
5
5
  import { buildFromInclude } from "../../generator/index.js";
6
- import { createBranch } from "../../api/branches.js";
6
+ import { createBranch, deleteBranch, getBranch } from "../../api/branches.js";
7
7
  import { deployToMain } from "../../api/deploy.js";
8
8
  import { buildToTinybird } from "../../api/build.js";
9
9
  import { getLocalTokens, getOrCreateLocalWorkspace, LocalNotRunningError, } from "../../api/local.js";
10
10
  import { sanitizeBranchName, getCurrentGitBranch } from "../git.js";
11
11
  /**
12
- * Generate preview branch name with format: tmp_ci_${branch}_${timestamp}
12
+ * Generate preview branch name with format: tmp_ci_${branch}
13
+ *
14
+ * Uses a deterministic name based on the git branch so that Vercel preview
15
+ * deployments can find the branch by name.
13
16
  *
14
17
  * @param gitBranch - Current git branch name (or null)
15
18
  * @returns Preview branch name
16
19
  */
17
20
  export function generatePreviewBranchName(gitBranch) {
18
- const timestamp = Math.floor(Date.now() / 1000);
19
21
  const branchPart = gitBranch ? sanitizeBranchName(gitBranch) : "unknown";
20
- return `tmp_ci_${branchPart}_${timestamp}`;
22
+ return `tmp_ci_${branchPart}`;
21
23
  }
22
24
  /**
23
25
  * Run the preview command
@@ -152,13 +154,33 @@ export async function runPreview(options = {}) {
152
154
  };
153
155
  }
154
156
  }
155
- // Cloud mode - create branch and deploy using /v1/deploy
157
+ // Cloud mode - delete existing branch if it exists, then create fresh and deploy
156
158
  let branch;
157
159
  try {
160
+ const apiConfig = { baseUrl: config.baseUrl, token: config.token };
161
+ // Check if branch already exists and delete it for a fresh start
162
+ try {
163
+ const existingBranch = await getBranch(apiConfig, previewBranchName);
164
+ if (existingBranch) {
165
+ if (debug) {
166
+ console.log(`[debug] Deleting existing preview branch: ${previewBranchName}`);
167
+ }
168
+ await deleteBranch(apiConfig, previewBranchName);
169
+ if (debug) {
170
+ console.log(`[debug] Existing branch deleted`);
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ // Branch doesn't exist, that's fine
176
+ if (debug) {
177
+ console.log(`[debug] No existing branch to delete`);
178
+ }
179
+ }
158
180
  if (debug) {
159
181
  console.log(`[debug] Creating preview branch: ${previewBranchName}`);
160
182
  }
161
- branch = await createBranch({ baseUrl: config.baseUrl, token: config.token }, previewBranchName);
183
+ branch = await createBranch(apiConfig, previewBranchName);
162
184
  if (debug) {
163
185
  console.log(`[debug] Branch created: ${branch.name} (${branch.id})`);
164
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/commands/preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,31 @@
1
- import { describe, it, expect, beforeEach, vi } from "vitest";
1
+ import { describe, it, expect } from "vitest";
2
2
  import { generatePreviewBranchName } from "./preview.js";
3
3
  describe("Preview command", () => {
4
4
  describe("generatePreviewBranchName", () => {
5
- beforeEach(() => {
6
- vi.useFakeTimers();
7
- vi.setSystemTime(new Date("2024-02-06T12:00:00Z"));
8
- });
9
- it("generates name with branch and timestamp", () => {
5
+ it("generates name with tmp_ci prefix", () => {
10
6
  const result = generatePreviewBranchName("feature-branch");
11
- expect(result).toBe("tmp_ci_feature_branch_1707220800");
7
+ expect(result).toBe("tmp_ci_feature_branch");
12
8
  });
13
9
  it("sanitizes branch name with slashes", () => {
14
10
  const result = generatePreviewBranchName("feature/add-login");
15
- expect(result).toBe("tmp_ci_feature_add_login_1707220800");
11
+ expect(result).toBe("tmp_ci_feature_add_login");
16
12
  });
17
13
  it("sanitizes branch name with dots", () => {
18
14
  const result = generatePreviewBranchName("release.1.0");
19
- expect(result).toBe("tmp_ci_release_1_0_1707220800");
15
+ expect(result).toBe("tmp_ci_release_1_0");
20
16
  });
21
17
  it("handles complex branch names", () => {
22
18
  const result = generatePreviewBranchName("feature/JIRA-123/add-user-auth");
23
- expect(result).toBe("tmp_ci_feature_JIRA_123_add_user_auth_1707220800");
19
+ expect(result).toBe("tmp_ci_feature_JIRA_123_add_user_auth");
24
20
  });
25
21
  it("uses 'unknown' when branch is null", () => {
26
22
  const result = generatePreviewBranchName(null);
27
- expect(result).toBe("tmp_ci_unknown_1707220800");
23
+ expect(result).toBe("tmp_ci_unknown");
28
24
  });
29
- it("uses unix timestamp in seconds", () => {
30
- // 1707220800 is 2024-02-06T12:00:00Z in seconds
31
- const result = generatePreviewBranchName("test");
32
- expect(result).toMatch(/_1707220800$/);
25
+ it("produces deterministic names for same branch", () => {
26
+ const result1 = generatePreviewBranchName("test-branch");
27
+ const result2 = generatePreviewBranchName("test-branch");
28
+ expect(result1).toBe(result2);
33
29
  });
34
30
  });
35
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"preview.test.js","sourceRoot":"","sources":["../../../src/cli/commands/preview.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,aAAa,EAAE,CAAC;YACnB,EAAE,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,MAAM,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,yBAAyB,CAAC,gCAAgC,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,gDAAgD;YAChD,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"preview.test.js","sourceRoot":"","sources":["../../../src/cli/commands/preview.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,MAAM,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,MAAM,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,yBAAyB,CAAC,gCAAgC,CAAC,CAAC;YAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/cli/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkDH;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAkBnD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAUnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAS1C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAMrD"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/cli/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuDH;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAkBnD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAUnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAS1C;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,IAAI,CAMrD"}
package/dist/cli/git.js CHANGED
@@ -7,6 +7,10 @@ import { execSync } from "child_process";
7
7
  * Returns null if not in a known CI environment
8
8
  */
9
9
  function getBranchFromCIEnv() {
10
+ // Vercel
11
+ if (process.env.VERCEL_GIT_COMMIT_REF) {
12
+ return process.env.VERCEL_GIT_COMMIT_REF;
13
+ }
10
14
  // GitHub Actions
11
15
  // GITHUB_HEAD_REF is set for pull requests, GITHUB_REF_NAME for pushes
12
16
  const githubBranch = process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME;
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/cli/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/cli/git.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/client/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,eAAe,CAA8B;gBAEzC,MAAM,EAAE,YAAY;IAgBhC;;OAEG;YACW,QAAQ;IAKtB;;;OAGG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;YACW,oBAAoB;IA0ClC;;;;;;;OAOG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAU1B;;;;;;;OAOG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;IAIxB;;;;;;;OAOG;IACG,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjD,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,CAAC,EAAE,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;IAUxB;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAU1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAI1C,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,eAAe;CAWxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAEjE"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/client/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,eAAe,CAA8B;gBAEzC,MAAM,EAAE,YAAY;IAgBhC;;OAEG;YACW,QAAQ;IAKtB;;;OAGG;YACW,cAAc;IAwB5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;YACW,oBAAoB;IA4DlC;;;;;;;OAOG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAU1B;;;;;;;OAOG;IACG,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;IAIxB;;;;;;;OAOG;IACG,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjD,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,CAAC,EAAE,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;IAUxB;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAU1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAI1C,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,eAAe;CAWxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAEjE"}
@@ -103,6 +103,23 @@ export class TinybirdClient {
103
103
  // out of the client bundle when not using dev mode
104
104
  const { loadConfig } = await import("../cli/config.js");
105
105
  const { getOrCreateBranch } = await import("../api/branches.js");
106
+ const { isPreviewEnvironment, getPreviewBranchName } = await import("./preview.js");
107
+ // In preview environments (Vercel preview, CI), the token was already resolved
108
+ // by resolveToken() in project.ts - skip branch creation to avoid conflicts
109
+ if (isPreviewEnvironment()) {
110
+ const gitBranchName = getPreviewBranchName();
111
+ // Preview branches use the tmp_ci_ prefix (matches what tinybird preview creates)
112
+ const sanitized = gitBranchName
113
+ ? gitBranchName.replace(/[^a-zA-Z0-9_]/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "")
114
+ : undefined;
115
+ const tinybirdBranchName = sanitized ? `tmp_ci_${sanitized}` : undefined;
116
+ return this.buildContext({
117
+ token: this.config.token,
118
+ isBranchToken: !!tinybirdBranchName,
119
+ branchName: tinybirdBranchName,
120
+ gitBranch: gitBranchName ?? undefined,
121
+ });
122
+ }
106
123
  // Use configDir if provided (important for monorepo setups where process.cwd()
107
124
  // may not be in the same directory tree as tinybird.json)
108
125
  const config = loadConfig(this.config.configDir);
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/client/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/client/base.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/client/preview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAW9C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CA+CpD;AA8CD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDlB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/client/preview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAW9C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CA+CpD;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiDlB;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
@@ -79,10 +79,13 @@ function sanitizeBranchName(branchName) {
79
79
  }
80
80
  /**
81
81
  * Fetch branch token from Tinybird API
82
+ * Looks for branches with the tmp_ci_ prefix (created by tinybird preview)
82
83
  */
83
84
  async function fetchBranchToken(baseUrl, workspaceToken, branchName) {
84
85
  const sanitizedName = sanitizeBranchName(branchName);
85
- const url = new URL(`/v0/environments/${encodeURIComponent(sanitizedName)}`, baseUrl);
86
+ // Look for the preview branch with tmp_ci_ prefix (matches what tinybird preview creates)
87
+ const previewBranchName = `tmp_ci_${sanitizedName}`;
88
+ const url = new URL(`/v0/environments/${encodeURIComponent(previewBranchName)}`, baseUrl);
86
89
  url.searchParams.set("with_token", "true");
87
90
  try {
88
91
  const response = await tinybirdFetch(url.toString(), {
@@ -143,7 +146,8 @@ export async function resolveToken(options) {
143
146
  }
144
147
  // Branch doesn't exist - fall back to workspace token
145
148
  // This allows the app to still work, just using main workspace
146
- console.warn(`[tinybird] Preview branch "${branchName}" not found. ` +
149
+ const expectedBranchName = `tmp_ci_${sanitizeBranchName(branchName)}`;
150
+ console.warn(`[tinybird] Preview branch "${expectedBranchName}" not found. ` +
147
151
  `Run "tinybird preview" to create it. Falling back to workspace token.`);
148
152
  }
149
153
  }
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/client/preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/client/preview.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.24",
3
+ "version": "0.0.26",
4
4
  "description": "TypeScript SDK for Tinybird Forward - define datasources and pipes as TypeScript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,354 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as os from "os";
5
+ import { runLogin } from "./login.js";
6
+
7
+ // Mock the auth module to avoid browser login
8
+ vi.mock("../auth.js", () => ({
9
+ browserLogin: vi.fn(),
10
+ }));
11
+
12
+ // Import the mocked function
13
+ import { browserLogin } from "../auth.js";
14
+
15
+ const mockedBrowserLogin = vi.mocked(browserLogin);
16
+
17
+ describe("Login Command", () => {
18
+ let tempDir: string;
19
+
20
+ beforeEach(() => {
21
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "tinybird-login-test-"));
22
+ vi.clearAllMocks();
23
+ });
24
+
25
+ afterEach(() => {
26
+ try {
27
+ fs.rmSync(tempDir, { recursive: true });
28
+ } catch {
29
+ // Ignore cleanup errors
30
+ }
31
+ });
32
+
33
+ describe("config file requirement", () => {
34
+ it("fails when no tinybird.json exists", async () => {
35
+ const result = await runLogin({ cwd: tempDir });
36
+
37
+ expect(result.success).toBe(false);
38
+ expect(result.error).toContain("No tinybird.json found");
39
+ expect(result.error).toContain("npx tinybird init");
40
+ });
41
+
42
+ it("succeeds when tinybird.json exists", async () => {
43
+ // Create a tinybird.json config
44
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
45
+ fs.writeFileSync(
46
+ path.join(tempDir, "tinybird.json"),
47
+ JSON.stringify(config)
48
+ );
49
+
50
+ mockedBrowserLogin.mockResolvedValue({
51
+ success: true,
52
+ token: "test-token",
53
+ baseUrl: "https://api.tinybird.co",
54
+ workspaceName: "test-workspace",
55
+ userEmail: "user@example.com",
56
+ });
57
+
58
+ const result = await runLogin({ cwd: tempDir });
59
+
60
+ expect(result.success).toBe(true);
61
+ expect(result.workspaceName).toBe("test-workspace");
62
+ expect(result.userEmail).toBe("user@example.com");
63
+ expect(result.baseUrl).toBe("https://api.tinybird.co");
64
+ });
65
+
66
+ it("finds tinybird.json in parent directory (monorepo support)", async () => {
67
+ // Create nested directory structure
68
+ const nestedDir = path.join(tempDir, "packages", "app");
69
+ fs.mkdirSync(nestedDir, { recursive: true });
70
+
71
+ // Create tinybird.json in root
72
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
73
+ fs.writeFileSync(
74
+ path.join(tempDir, "tinybird.json"),
75
+ JSON.stringify(config)
76
+ );
77
+
78
+ mockedBrowserLogin.mockResolvedValue({
79
+ success: true,
80
+ token: "test-token",
81
+ baseUrl: "https://api.tinybird.co",
82
+ workspaceName: "test-workspace",
83
+ userEmail: "user@example.com",
84
+ });
85
+
86
+ const result = await runLogin({ cwd: nestedDir });
87
+
88
+ expect(result.success).toBe(true);
89
+ });
90
+ });
91
+
92
+ describe("authentication flow", () => {
93
+ beforeEach(() => {
94
+ // Create a tinybird.json config
95
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
96
+ fs.writeFileSync(
97
+ path.join(tempDir, "tinybird.json"),
98
+ JSON.stringify(config)
99
+ );
100
+ });
101
+
102
+ it("returns error when browser login fails", async () => {
103
+ mockedBrowserLogin.mockResolvedValue({
104
+ success: false,
105
+ error: "Authentication timed out",
106
+ });
107
+
108
+ const result = await runLogin({ cwd: tempDir });
109
+
110
+ expect(result.success).toBe(false);
111
+ expect(result.error).toBe("Authentication timed out");
112
+ });
113
+
114
+ it("returns error when token is missing from auth result", async () => {
115
+ mockedBrowserLogin.mockResolvedValue({
116
+ success: true,
117
+ // No token provided
118
+ });
119
+
120
+ const result = await runLogin({ cwd: tempDir });
121
+
122
+ expect(result.success).toBe(false);
123
+ expect(result.error).toBe("Login failed");
124
+ });
125
+
126
+ it("passes apiHost option to browserLogin", async () => {
127
+ mockedBrowserLogin.mockResolvedValue({
128
+ success: true,
129
+ token: "test-token",
130
+ baseUrl: "https://api.us-east.tinybird.co",
131
+ workspaceName: "test-workspace",
132
+ });
133
+
134
+ await runLogin({ cwd: tempDir, apiHost: "https://api.us-east.tinybird.co" });
135
+
136
+ expect(mockedBrowserLogin).toHaveBeenCalledWith({
137
+ apiHost: "https://api.us-east.tinybird.co",
138
+ });
139
+ });
140
+ });
141
+
142
+ describe("token storage", () => {
143
+ beforeEach(() => {
144
+ // Create a tinybird.json config
145
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
146
+ fs.writeFileSync(
147
+ path.join(tempDir, "tinybird.json"),
148
+ JSON.stringify(config)
149
+ );
150
+ });
151
+
152
+ it("creates .env.local with token", async () => {
153
+ mockedBrowserLogin.mockResolvedValue({
154
+ success: true,
155
+ token: "new-token-123",
156
+ baseUrl: "https://api.tinybird.co",
157
+ workspaceName: "test-workspace",
158
+ });
159
+
160
+ const result = await runLogin({ cwd: tempDir });
161
+
162
+ expect(result.success).toBe(true);
163
+
164
+ const envContent = fs.readFileSync(
165
+ path.join(tempDir, ".env.local"),
166
+ "utf-8"
167
+ );
168
+ expect(envContent).toContain("TINYBIRD_TOKEN=new-token-123");
169
+ });
170
+
171
+ it("updates existing token in .env.local", async () => {
172
+ // Create existing .env.local with old token
173
+ fs.writeFileSync(
174
+ path.join(tempDir, ".env.local"),
175
+ "TINYBIRD_TOKEN=old-token\nOTHER_VAR=value\n"
176
+ );
177
+
178
+ mockedBrowserLogin.mockResolvedValue({
179
+ success: true,
180
+ token: "new-token-456",
181
+ baseUrl: "https://api.tinybird.co",
182
+ workspaceName: "test-workspace",
183
+ });
184
+
185
+ const result = await runLogin({ cwd: tempDir });
186
+
187
+ expect(result.success).toBe(true);
188
+
189
+ const envContent = fs.readFileSync(
190
+ path.join(tempDir, ".env.local"),
191
+ "utf-8"
192
+ );
193
+ expect(envContent).toContain("TINYBIRD_TOKEN=new-token-456");
194
+ expect(envContent).toContain("OTHER_VAR=value");
195
+ expect(envContent).not.toContain("old-token");
196
+ });
197
+
198
+ it("appends token to existing .env.local without TINYBIRD_TOKEN", async () => {
199
+ // Create existing .env.local without token
200
+ fs.writeFileSync(
201
+ path.join(tempDir, ".env.local"),
202
+ "OTHER_VAR=value\n"
203
+ );
204
+
205
+ mockedBrowserLogin.mockResolvedValue({
206
+ success: true,
207
+ token: "new-token-789",
208
+ baseUrl: "https://api.tinybird.co",
209
+ workspaceName: "test-workspace",
210
+ });
211
+
212
+ const result = await runLogin({ cwd: tempDir });
213
+
214
+ expect(result.success).toBe(true);
215
+
216
+ const envContent = fs.readFileSync(
217
+ path.join(tempDir, ".env.local"),
218
+ "utf-8"
219
+ );
220
+ expect(envContent).toContain("OTHER_VAR=value");
221
+ expect(envContent).toContain("TINYBIRD_TOKEN=new-token-789");
222
+ });
223
+
224
+ it("saves .env.local in same directory as tinybird.json (monorepo)", async () => {
225
+ // Create nested directory structure
226
+ const nestedDir = path.join(tempDir, "packages", "app");
227
+ fs.mkdirSync(nestedDir, { recursive: true });
228
+
229
+ // Move tinybird.json to root
230
+ fs.unlinkSync(path.join(tempDir, "tinybird.json"));
231
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
232
+ fs.writeFileSync(
233
+ path.join(tempDir, "tinybird.json"),
234
+ JSON.stringify(config)
235
+ );
236
+
237
+ mockedBrowserLogin.mockResolvedValue({
238
+ success: true,
239
+ token: "test-token",
240
+ baseUrl: "https://api.tinybird.co",
241
+ workspaceName: "test-workspace",
242
+ });
243
+
244
+ const result = await runLogin({ cwd: nestedDir });
245
+
246
+ expect(result.success).toBe(true);
247
+
248
+ // .env.local should be in the root (same as tinybird.json), not in nested dir
249
+ expect(fs.existsSync(path.join(tempDir, ".env.local"))).toBe(true);
250
+ expect(fs.existsSync(path.join(nestedDir, ".env.local"))).toBe(false);
251
+ });
252
+ });
253
+
254
+ describe("baseUrl update", () => {
255
+ beforeEach(() => {
256
+ // Create a tinybird.json config
257
+ const config = {
258
+ include: ["lib/tinybird.ts"],
259
+ token: "${TINYBIRD_TOKEN}",
260
+ baseUrl: "https://api.tinybird.co",
261
+ };
262
+ fs.writeFileSync(
263
+ path.join(tempDir, "tinybird.json"),
264
+ JSON.stringify(config, null, 2)
265
+ );
266
+ });
267
+
268
+ it("updates baseUrl in tinybird.json when region changes", async () => {
269
+ mockedBrowserLogin.mockResolvedValue({
270
+ success: true,
271
+ token: "test-token",
272
+ baseUrl: "https://api.us-east.tinybird.co",
273
+ workspaceName: "test-workspace",
274
+ });
275
+
276
+ const result = await runLogin({ cwd: tempDir });
277
+
278
+ expect(result.success).toBe(true);
279
+
280
+ const config = JSON.parse(
281
+ fs.readFileSync(path.join(tempDir, "tinybird.json"), "utf-8")
282
+ );
283
+ expect(config.baseUrl).toBe("https://api.us-east.tinybird.co");
284
+ });
285
+
286
+ it("does not modify tinybird.json when baseUrl is not provided", async () => {
287
+ mockedBrowserLogin.mockResolvedValue({
288
+ success: true,
289
+ token: "test-token",
290
+ // No baseUrl
291
+ workspaceName: "test-workspace",
292
+ });
293
+
294
+ const result = await runLogin({ cwd: tempDir });
295
+
296
+ expect(result.success).toBe(true);
297
+
298
+ const config = JSON.parse(
299
+ fs.readFileSync(path.join(tempDir, "tinybird.json"), "utf-8")
300
+ );
301
+ // Original baseUrl preserved
302
+ expect(config.baseUrl).toBe("https://api.tinybird.co");
303
+ });
304
+ });
305
+
306
+ describe("return values", () => {
307
+ beforeEach(() => {
308
+ const config = { include: ["lib/tinybird.ts"], token: "${TINYBIRD_TOKEN}" };
309
+ fs.writeFileSync(
310
+ path.join(tempDir, "tinybird.json"),
311
+ JSON.stringify(config)
312
+ );
313
+ });
314
+
315
+ it("returns workspace name from auth result", async () => {
316
+ mockedBrowserLogin.mockResolvedValue({
317
+ success: true,
318
+ token: "test-token",
319
+ workspaceName: "my-workspace",
320
+ });
321
+
322
+ const result = await runLogin({ cwd: tempDir });
323
+
324
+ expect(result.success).toBe(true);
325
+ expect(result.workspaceName).toBe("my-workspace");
326
+ });
327
+
328
+ it("returns user email from auth result", async () => {
329
+ mockedBrowserLogin.mockResolvedValue({
330
+ success: true,
331
+ token: "test-token",
332
+ userEmail: "developer@example.com",
333
+ });
334
+
335
+ const result = await runLogin({ cwd: tempDir });
336
+
337
+ expect(result.success).toBe(true);
338
+ expect(result.userEmail).toBe("developer@example.com");
339
+ });
340
+
341
+ it("returns baseUrl from auth result", async () => {
342
+ mockedBrowserLogin.mockResolvedValue({
343
+ success: true,
344
+ token: "test-token",
345
+ baseUrl: "https://api.eu-central.tinybird.co",
346
+ });
347
+
348
+ const result = await runLogin({ cwd: tempDir });
349
+
350
+ expect(result.success).toBe(true);
351
+ expect(result.baseUrl).toBe("https://api.eu-central.tinybird.co");
352
+ });
353
+ });
354
+ });
@@ -1,42 +1,37 @@
1
- import { describe, it, expect, beforeEach, vi } from "vitest";
1
+ import { describe, it, expect } from "vitest";
2
2
  import { generatePreviewBranchName } from "./preview.js";
3
3
 
4
4
  describe("Preview command", () => {
5
5
  describe("generatePreviewBranchName", () => {
6
- beforeEach(() => {
7
- vi.useFakeTimers();
8
- vi.setSystemTime(new Date("2024-02-06T12:00:00Z"));
9
- });
10
-
11
- it("generates name with branch and timestamp", () => {
6
+ it("generates name with tmp_ci prefix", () => {
12
7
  const result = generatePreviewBranchName("feature-branch");
13
- expect(result).toBe("tmp_ci_feature_branch_1707220800");
8
+ expect(result).toBe("tmp_ci_feature_branch");
14
9
  });
15
10
 
16
11
  it("sanitizes branch name with slashes", () => {
17
12
  const result = generatePreviewBranchName("feature/add-login");
18
- expect(result).toBe("tmp_ci_feature_add_login_1707220800");
13
+ expect(result).toBe("tmp_ci_feature_add_login");
19
14
  });
20
15
 
21
16
  it("sanitizes branch name with dots", () => {
22
17
  const result = generatePreviewBranchName("release.1.0");
23
- expect(result).toBe("tmp_ci_release_1_0_1707220800");
18
+ expect(result).toBe("tmp_ci_release_1_0");
24
19
  });
25
20
 
26
21
  it("handles complex branch names", () => {
27
22
  const result = generatePreviewBranchName("feature/JIRA-123/add-user-auth");
28
- expect(result).toBe("tmp_ci_feature_JIRA_123_add_user_auth_1707220800");
23
+ expect(result).toBe("tmp_ci_feature_JIRA_123_add_user_auth");
29
24
  });
30
25
 
31
26
  it("uses 'unknown' when branch is null", () => {
32
27
  const result = generatePreviewBranchName(null);
33
- expect(result).toBe("tmp_ci_unknown_1707220800");
28
+ expect(result).toBe("tmp_ci_unknown");
34
29
  });
35
30
 
36
- it("uses unix timestamp in seconds", () => {
37
- // 1707220800 is 2024-02-06T12:00:00Z in seconds
38
- const result = generatePreviewBranchName("test");
39
- expect(result).toMatch(/_1707220800$/);
31
+ it("produces deterministic names for same branch", () => {
32
+ const result1 = generatePreviewBranchName("test-branch");
33
+ const result2 = generatePreviewBranchName("test-branch");
34
+ expect(result1).toBe(result2);
40
35
  });
41
36
  });
42
37
  });
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { loadConfig, LOCAL_BASE_URL, type ResolvedConfig, type DevMode } from "../config.js";
6
6
  import { buildFromInclude, type BuildFromIncludeResult } from "../../generator/index.js";
7
- import { createBranch, type TinybirdBranch } from "../../api/branches.js";
7
+ import { createBranch, deleteBranch, getBranch, type TinybirdBranch } from "../../api/branches.js";
8
8
  import { deployToMain } from "../../api/deploy.js";
9
9
  import { buildToTinybird } from "../../api/build.js";
10
10
  import {
@@ -61,15 +61,17 @@ export interface PreviewCommandResult {
61
61
  }
62
62
 
63
63
  /**
64
- * Generate preview branch name with format: tmp_ci_${branch}_${timestamp}
64
+ * Generate preview branch name with format: tmp_ci_${branch}
65
+ *
66
+ * Uses a deterministic name based on the git branch so that Vercel preview
67
+ * deployments can find the branch by name.
65
68
  *
66
69
  * @param gitBranch - Current git branch name (or null)
67
70
  * @returns Preview branch name
68
71
  */
69
72
  export function generatePreviewBranchName(gitBranch: string | null): string {
70
- const timestamp = Math.floor(Date.now() / 1000);
71
73
  const branchPart = gitBranch ? sanitizeBranchName(gitBranch) : "unknown";
72
- return `tmp_ci_${branchPart}_${timestamp}`;
74
+ return `tmp_ci_${branchPart}`;
73
75
  }
74
76
 
75
77
  /**
@@ -220,17 +222,35 @@ export async function runPreview(options: PreviewCommandOptions = {}): Promise<P
220
222
  }
221
223
  }
222
224
 
223
- // Cloud mode - create branch and deploy using /v1/deploy
225
+ // Cloud mode - delete existing branch if it exists, then create fresh and deploy
224
226
  let branch: TinybirdBranch;
225
227
  try {
228
+ const apiConfig = { baseUrl: config.baseUrl, token: config.token };
229
+
230
+ // Check if branch already exists and delete it for a fresh start
231
+ try {
232
+ const existingBranch = await getBranch(apiConfig, previewBranchName);
233
+ if (existingBranch) {
234
+ if (debug) {
235
+ console.log(`[debug] Deleting existing preview branch: ${previewBranchName}`);
236
+ }
237
+ await deleteBranch(apiConfig, previewBranchName);
238
+ if (debug) {
239
+ console.log(`[debug] Existing branch deleted`);
240
+ }
241
+ }
242
+ } catch {
243
+ // Branch doesn't exist, that's fine
244
+ if (debug) {
245
+ console.log(`[debug] No existing branch to delete`);
246
+ }
247
+ }
248
+
226
249
  if (debug) {
227
250
  console.log(`[debug] Creating preview branch: ${previewBranchName}`);
228
251
  }
229
252
 
230
- branch = await createBranch(
231
- { baseUrl: config.baseUrl, token: config.token },
232
- previewBranchName
233
- );
253
+ branch = await createBranch(apiConfig, previewBranchName);
234
254
 
235
255
  if (debug) {
236
256
  console.log(`[debug] Branch created: ${branch.name} (${branch.id})`);
package/src/cli/git.ts CHANGED
@@ -9,6 +9,11 @@ import { execSync } from "child_process";
9
9
  * Returns null if not in a known CI environment
10
10
  */
11
11
  function getBranchFromCIEnv(): string | null {
12
+ // Vercel
13
+ if (process.env.VERCEL_GIT_COMMIT_REF) {
14
+ return process.env.VERCEL_GIT_COMMIT_REF;
15
+ }
16
+
12
17
  // GitHub Actions
13
18
  // GITHUB_HEAD_REF is set for pull requests, GITHUB_REF_NAME for pushes
14
19
  const githubBranch = process.env.GITHUB_HEAD_REF || process.env.GITHUB_REF_NAME;
@@ -132,6 +132,24 @@ export class TinybirdClient {
132
132
  // out of the client bundle when not using dev mode
133
133
  const { loadConfig } = await import("../cli/config.js");
134
134
  const { getOrCreateBranch } = await import("../api/branches.js");
135
+ const { isPreviewEnvironment, getPreviewBranchName } = await import("./preview.js");
136
+
137
+ // In preview environments (Vercel preview, CI), the token was already resolved
138
+ // by resolveToken() in project.ts - skip branch creation to avoid conflicts
139
+ if (isPreviewEnvironment()) {
140
+ const gitBranchName = getPreviewBranchName();
141
+ // Preview branches use the tmp_ci_ prefix (matches what tinybird preview creates)
142
+ const sanitized = gitBranchName
143
+ ? gitBranchName.replace(/[^a-zA-Z0-9_]/g, "_").replace(/_+/g, "_").replace(/^_|_$/g, "")
144
+ : undefined;
145
+ const tinybirdBranchName = sanitized ? `tmp_ci_${sanitized}` : undefined;
146
+ return this.buildContext({
147
+ token: this.config.token,
148
+ isBranchToken: !!tinybirdBranchName,
149
+ branchName: tinybirdBranchName,
150
+ gitBranch: gitBranchName ?? undefined,
151
+ });
152
+ }
135
153
 
136
154
  // Use configDir if provided (important for monorepo setups where process.cwd()
137
155
  // may not be in the same directory tree as tinybird.json)
@@ -105,6 +105,7 @@ function sanitizeBranchName(branchName: string): string {
105
105
 
106
106
  /**
107
107
  * Fetch branch token from Tinybird API
108
+ * Looks for branches with the tmp_ci_ prefix (created by tinybird preview)
108
109
  */
109
110
  async function fetchBranchToken(
110
111
  baseUrl: string,
@@ -112,7 +113,9 @@ async function fetchBranchToken(
112
113
  branchName: string
113
114
  ): Promise<string | null> {
114
115
  const sanitizedName = sanitizeBranchName(branchName);
115
- const url = new URL(`/v0/environments/${encodeURIComponent(sanitizedName)}`, baseUrl);
116
+ // Look for the preview branch with tmp_ci_ prefix (matches what tinybird preview creates)
117
+ const previewBranchName = `tmp_ci_${sanitizedName}`;
118
+ const url = new URL(`/v0/environments/${encodeURIComponent(previewBranchName)}`, baseUrl);
116
119
  url.searchParams.set("with_token", "true");
117
120
 
118
121
  try {
@@ -189,8 +192,9 @@ export async function resolveToken(options?: {
189
192
 
190
193
  // Branch doesn't exist - fall back to workspace token
191
194
  // This allows the app to still work, just using main workspace
195
+ const expectedBranchName = `tmp_ci_${sanitizeBranchName(branchName)}`;
192
196
  console.warn(
193
- `[tinybird] Preview branch "${branchName}" not found. ` +
197
+ `[tinybird] Preview branch "${expectedBranchName}" not found. ` +
194
198
  `Run "tinybird preview" to create it. Falling back to workspace token.`
195
199
  );
196
200
  }