@tinybirdco/sdk 0.0.2 → 0.0.4

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 (99) hide show
  1. package/README.md +38 -4
  2. package/dist/api/build.d.ts +2 -0
  3. package/dist/api/build.d.ts.map +1 -1
  4. package/dist/api/build.js +13 -0
  5. package/dist/api/build.js.map +1 -1
  6. package/dist/api/build.test.js +1 -0
  7. package/dist/api/build.test.js.map +1 -1
  8. package/dist/api/deploy.d.ts.map +1 -1
  9. package/dist/api/deploy.js +3 -0
  10. package/dist/api/deploy.js.map +1 -1
  11. package/dist/api/deploy.test.js +1 -0
  12. package/dist/api/deploy.test.js.map +1 -1
  13. package/dist/api/local.d.ts +92 -0
  14. package/dist/api/local.d.ts.map +1 -0
  15. package/dist/api/local.js +176 -0
  16. package/dist/api/local.js.map +1 -0
  17. package/dist/api/local.test.d.ts +2 -0
  18. package/dist/api/local.test.d.ts.map +1 -0
  19. package/dist/api/local.test.js +182 -0
  20. package/dist/api/local.test.js.map +1 -0
  21. package/dist/cli/commands/build.d.ts +3 -0
  22. package/dist/cli/commands/build.d.ts.map +1 -1
  23. package/dist/cli/commands/build.js +97 -47
  24. package/dist/cli/commands/build.js.map +1 -1
  25. package/dist/cli/commands/dev.d.ts +9 -2
  26. package/dist/cli/commands/dev.d.ts.map +1 -1
  27. package/dist/cli/commands/dev.js +56 -31
  28. package/dist/cli/commands/dev.js.map +1 -1
  29. package/dist/cli/config.d.ts +14 -0
  30. package/dist/cli/config.d.ts.map +1 -1
  31. package/dist/cli/config.js +7 -0
  32. package/dist/cli/config.js.map +1 -1
  33. package/dist/cli/config.test.js +29 -0
  34. package/dist/cli/config.test.js.map +1 -1
  35. package/dist/cli/index.js +39 -3
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/generator/connection.d.ts +49 -0
  38. package/dist/generator/connection.d.ts.map +1 -0
  39. package/dist/generator/connection.js +78 -0
  40. package/dist/generator/connection.js.map +1 -0
  41. package/dist/generator/connection.test.d.ts +2 -0
  42. package/dist/generator/connection.test.d.ts.map +1 -0
  43. package/dist/generator/connection.test.js +106 -0
  44. package/dist/generator/connection.test.js.map +1 -0
  45. package/dist/generator/datasource.d.ts.map +1 -1
  46. package/dist/generator/datasource.js +20 -0
  47. package/dist/generator/datasource.js.map +1 -1
  48. package/dist/generator/datasource.test.js +92 -0
  49. package/dist/generator/datasource.test.js.map +1 -1
  50. package/dist/generator/index.d.ts +8 -2
  51. package/dist/generator/index.d.ts.map +1 -1
  52. package/dist/generator/index.js +10 -3
  53. package/dist/generator/index.js.map +1 -1
  54. package/dist/generator/loader.d.ts +8 -1
  55. package/dist/generator/loader.d.ts.map +1 -1
  56. package/dist/generator/loader.js +17 -2
  57. package/dist/generator/loader.js.map +1 -1
  58. package/dist/index.d.ts +4 -2
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +2 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/schema/connection.d.ts +83 -0
  63. package/dist/schema/connection.d.ts.map +1 -0
  64. package/dist/schema/connection.js +61 -0
  65. package/dist/schema/connection.js.map +1 -0
  66. package/dist/schema/connection.test.d.ts +2 -0
  67. package/dist/schema/connection.test.d.ts.map +1 -0
  68. package/dist/schema/connection.test.js +117 -0
  69. package/dist/schema/connection.test.js.map +1 -0
  70. package/dist/schema/datasource.d.ts +16 -0
  71. package/dist/schema/datasource.d.ts.map +1 -1
  72. package/dist/schema/datasource.js.map +1 -1
  73. package/dist/schema/project.d.ts +12 -3
  74. package/dist/schema/project.d.ts.map +1 -1
  75. package/dist/schema/project.js +2 -0
  76. package/dist/schema/project.js.map +1 -1
  77. package/package.json +1 -1
  78. package/src/api/build.test.ts +1 -0
  79. package/src/api/build.ts +20 -0
  80. package/src/api/deploy.test.ts +1 -0
  81. package/src/api/deploy.ts +3 -0
  82. package/src/api/local.test.ts +250 -0
  83. package/src/api/local.ts +270 -0
  84. package/src/cli/commands/build.ts +120 -54
  85. package/src/cli/commands/dev.ts +76 -38
  86. package/src/cli/config.test.ts +47 -0
  87. package/src/cli/config.ts +20 -0
  88. package/src/cli/index.ts +39 -3
  89. package/src/generator/connection.test.ts +135 -0
  90. package/src/generator/connection.ts +104 -0
  91. package/src/generator/datasource.test.ts +108 -0
  92. package/src/generator/datasource.ts +27 -1
  93. package/src/generator/index.ts +16 -4
  94. package/src/generator/loader.ts +21 -3
  95. package/src/index.ts +12 -0
  96. package/src/schema/connection.test.ts +149 -0
  97. package/src/schema/connection.ts +123 -0
  98. package/src/schema/datasource.ts +17 -0
  99. package/src/schema/project.ts +20 -5
@@ -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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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Build command - generates and pushes resources to Tinybird
3
3
  */
4
+ import { type DevMode } from "../config.js";
4
5
  import { type BuildFromIncludeResult } from "../../generator/index.js";
5
6
  import { type BuildApiResult } from "../../api/build.js";
6
7
  /**
@@ -15,6 +16,8 @@ export interface BuildCommandOptions {
15
16
  tokenOverride?: string;
16
17
  /** Use /v1/deploy instead of /v1/build (for main branch) */
17
18
  useDeployEndpoint?: boolean;
19
+ /** Override the devMode from config */
20
+ devModeOverride?: DevMode;
18
21
  }
19
22
  /**
20
23
  * Build command result
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAI1E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,wCAAwC;IACxC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsI7F"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAmD,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAoB,KAAK,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAU1E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,wCAAwC;IACxC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgM7F"}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Build command - generates and pushes resources to Tinybird
3
3
  */
4
- import { loadConfig } from "../config.js";
4
+ import { loadConfig, LOCAL_BASE_URL } from "../config.js";
5
5
  import { buildFromInclude } from "../../generator/index.js";
6
6
  import { buildToTinybird } from "../../api/build.js";
7
7
  import { deployToMain } from "../../api/deploy.js";
8
8
  import { getOrCreateBranch } from "../../api/branches.js";
9
+ import { getLocalTokens, getOrCreateLocalWorkspace, getLocalWorkspaceName, LocalNotRunningError, } from "../../api/local.js";
9
10
  /**
10
11
  * Run the build command
11
12
  *
@@ -52,73 +53,122 @@ export async function runBuild(options = {}) {
52
53
  durationMs: Date.now() - startTime,
53
54
  };
54
55
  }
55
- // Deploy to Tinybird
56
- // Determine token and endpoint based on git branch
57
- let effectiveToken = options.tokenOverride ?? config.token;
58
- let useDeployEndpoint = options.useDeployEndpoint ?? config.isMainBranch;
59
- // For feature branches, get or create the Tinybird branch and use its token
56
+ // Determine devMode
57
+ const devMode = options.devModeOverride ?? config.devMode;
60
58
  const debug = !!process.env.TINYBIRD_DEBUG;
61
59
  if (debug) {
62
- console.log(`[debug] isMainBranch: ${config.isMainBranch}`);
63
- console.log(`[debug] tinybirdBranch: ${config.tinybirdBranch}`);
64
- console.log(`[debug] tokenOverride: ${!!options.tokenOverride}`);
60
+ console.log(`[debug] devMode: ${devMode}`);
65
61
  }
66
- if (!config.isMainBranch && config.tinybirdBranch && !options.tokenOverride) {
67
- if (debug) {
68
- console.log(`[debug] Getting/creating Tinybird branch: ${config.tinybirdBranch}`);
69
- }
62
+ let deployResult;
63
+ // Handle local mode
64
+ if (devMode === "local") {
70
65
  try {
71
- const tinybirdBranch = await getOrCreateBranch({
72
- baseUrl: config.baseUrl,
73
- token: config.token,
74
- }, config.tinybirdBranch);
75
- if (!tinybirdBranch.token) {
66
+ // Get tokens from local container
67
+ if (debug) {
68
+ console.log(`[debug] Getting local tokens from ${LOCAL_BASE_URL}/tokens`);
69
+ }
70
+ const localTokens = await getLocalTokens();
71
+ // Get or create workspace based on branch name
72
+ const workspaceName = getLocalWorkspaceName(config.tinybirdBranch, config.cwd);
73
+ if (debug) {
74
+ console.log(`[debug] Using local workspace: ${workspaceName}`);
75
+ }
76
+ const { workspace, wasCreated } = await getOrCreateLocalWorkspace(localTokens, workspaceName);
77
+ if (debug) {
78
+ console.log(`[debug] Workspace ${wasCreated ? "created" : "found"}: ${workspace.name}`);
79
+ }
80
+ // Always use /v1/build for local (no deploy endpoint)
81
+ deployResult = await buildToTinybird({
82
+ baseUrl: LOCAL_BASE_URL,
83
+ token: workspace.token,
84
+ }, buildResult.resources);
85
+ }
86
+ catch (error) {
87
+ if (error instanceof LocalNotRunningError) {
76
88
  return {
77
89
  success: false,
78
90
  build: buildResult,
79
- error: `Branch '${config.tinybirdBranch}' was created but no token was returned.`,
91
+ error: error.message,
80
92
  durationMs: Date.now() - startTime,
81
93
  };
82
94
  }
83
- effectiveToken = tinybirdBranch.token;
84
- useDeployEndpoint = false; // Always use /v1/build for branches
95
+ return {
96
+ success: false,
97
+ build: buildResult,
98
+ error: `Local build failed: ${error.message}`,
99
+ durationMs: Date.now() - startTime,
100
+ };
101
+ }
102
+ }
103
+ else {
104
+ // Branch mode (default) - existing logic
105
+ // Deploy to Tinybird
106
+ // Determine token and endpoint based on git branch
107
+ let effectiveToken = options.tokenOverride ?? config.token;
108
+ // Use deploy endpoint if on main branch OR if no branch can be detected
109
+ let useDeployEndpoint = options.useDeployEndpoint ?? (config.isMainBranch || !config.tinybirdBranch);
110
+ if (debug) {
111
+ console.log(`[debug] isMainBranch: ${config.isMainBranch}`);
112
+ console.log(`[debug] tinybirdBranch: ${config.tinybirdBranch}`);
113
+ console.log(`[debug] tokenOverride: ${!!options.tokenOverride}`);
114
+ }
115
+ // For feature branches, get or create the Tinybird branch and use its token
116
+ if (!config.isMainBranch && config.tinybirdBranch && !options.tokenOverride) {
85
117
  if (debug) {
86
- console.log(`[debug] Using branch token for branch: ${config.tinybirdBranch}`);
118
+ console.log(`[debug] Getting/creating Tinybird branch: ${config.tinybirdBranch}`);
119
+ }
120
+ try {
121
+ const tinybirdBranch = await getOrCreateBranch({
122
+ baseUrl: config.baseUrl,
123
+ token: config.token,
124
+ }, config.tinybirdBranch);
125
+ if (!tinybirdBranch.token) {
126
+ return {
127
+ success: false,
128
+ build: buildResult,
129
+ error: `Branch '${config.tinybirdBranch}' was created but no token was returned.`,
130
+ durationMs: Date.now() - startTime,
131
+ };
132
+ }
133
+ effectiveToken = tinybirdBranch.token;
134
+ useDeployEndpoint = false; // Always use /v1/build for branches
135
+ if (debug) {
136
+ console.log(`[debug] Using branch token for branch: ${config.tinybirdBranch}`);
137
+ }
138
+ }
139
+ catch (error) {
140
+ return {
141
+ success: false,
142
+ build: buildResult,
143
+ error: `Failed to get/create branch: ${error.message}`,
144
+ durationMs: Date.now() - startTime,
145
+ };
146
+ }
147
+ }
148
+ try {
149
+ // Use /v1/deploy for main branch, /v1/build for feature branches
150
+ if (useDeployEndpoint) {
151
+ deployResult = await deployToMain({
152
+ baseUrl: config.baseUrl,
153
+ token: effectiveToken,
154
+ }, buildResult.resources);
155
+ }
156
+ else {
157
+ deployResult = await buildToTinybird({
158
+ baseUrl: config.baseUrl,
159
+ token: effectiveToken,
160
+ }, buildResult.resources);
87
161
  }
88
162
  }
89
163
  catch (error) {
90
164
  return {
91
165
  success: false,
92
166
  build: buildResult,
93
- error: `Failed to get/create branch: ${error.message}`,
167
+ error: `Deploy failed: ${error.message}`,
94
168
  durationMs: Date.now() - startTime,
95
169
  };
96
170
  }
97
171
  }
98
- let deployResult;
99
- try {
100
- // Use /v1/deploy for main branch, /v1/build for feature branches
101
- if (useDeployEndpoint) {
102
- deployResult = await deployToMain({
103
- baseUrl: config.baseUrl,
104
- token: effectiveToken,
105
- }, buildResult.resources);
106
- }
107
- else {
108
- deployResult = await buildToTinybird({
109
- baseUrl: config.baseUrl,
110
- token: effectiveToken,
111
- }, buildResult.resources);
112
- }
113
- }
114
- catch (error) {
115
- return {
116
- success: false,
117
- build: buildResult,
118
- error: `Deploy failed: ${error.message}`,
119
- durationMs: Date.now() - startTime,
120
- };
121
- }
122
172
  if (!deployResult.success) {
123
173
  return {
124
174
  success: false,
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAqC,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAA+B,MAAM,0BAA0B,CAAC;AACzF,OAAO,EAAE,eAAe,EAAuB,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAkC5B;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAA+B,EAAE;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEzC,cAAc;IACd,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAG,KAAe,CAAC,OAAO;YAC/B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAI,WAAmC,CAAC;IACxC,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,gBAAgB,CAAC;YACnC,YAAY,EAAE,MAAM,CAAC,OAAO;YAC5B,GAAG,EAAE,MAAM,CAAC,GAAG;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iBAAkB,KAAe,CAAC,OAAO,EAAE;YAClD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC;IAC1D,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE3C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,YAA4B,CAAC;IAEjC,oBAAoB;IACpB,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,kCAAkC;YAClC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,qCAAqC,cAAc,SAAS,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAE3C,+CAA+C;YAC/C,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/E,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,kCAAkC,aAAa,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,yBAAyB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAC9F,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1F,CAAC;YAED,sDAAsD;YACtD,YAAY,GAAG,MAAM,eAAe,CAClC;gBACE,OAAO,EAAE,cAAc;gBACvB,KAAK,EAAE,SAAS,CAAC,KAAK;aACvB,EACD,WAAW,CAAC,SAAS,CACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,KAAK,CAAC,OAAO;oBACpB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,uBAAwB,KAAe,CAAC,OAAO,EAAE;gBACxD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACnC,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,yCAAyC;QACzC,qBAAqB;QACrB,mDAAmD;QACnD,IAAI,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,KAAK,CAAC;QAC3D,wEAAwE;QACxE,IAAI,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAErG,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,4EAA4E;QAC5E,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC5E,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,6CAA6C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,EACD,MAAM,CAAC,cAAc,CACtB,CAAC;gBAEF,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;oBAC1B,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,WAAW;wBAClB,KAAK,EAAE,WAAW,MAAM,CAAC,cAAc,0CAA0C;wBACjF,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;qBACnC,CAAC;gBACJ,CAAC;gBAED,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC;gBACtC,iBAAiB,GAAG,KAAK,CAAC,CAAC,oCAAoC;gBAC/D,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,0CAA0C,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,gCAAiC,KAAe,CAAC,OAAO,EAAE;oBACjE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,iEAAiE;YACjE,IAAI,iBAAiB,EAAE,CAAC;gBACtB,YAAY,GAAG,MAAM,YAAY,CAC/B;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,cAAc;iBACtB,EACD,WAAW,CAAC,SAAS,CACtB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,MAAM,eAAe,CAClC;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,cAAc;iBACtB,EACD,WAAW,CAAC,SAAS,CACtB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,WAAW;gBAClB,KAAK,EAAE,kBAAmB,KAAe,CAAC,OAAO,EAAE;gBACnD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,WAAW;YAClB,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,WAAW;QAClB,MAAM,EAAE,YAAY;QACpB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACnC,CAAC;AACJ,CAAC"}
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Dev command - watch mode with automatic sync
3
3
  */
4
- import { type ResolvedConfig } from "../config.js";
4
+ import { type ResolvedConfig, type DevMode } from "../config.js";
5
5
  import { type BuildCommandResult } from "./build.js";
6
6
  import { type TinybirdBranch } from "../../api/branches.js";
7
7
  import { type SchemaValidationResult } from "../utils/schema-validation.js";
8
+ import { type LocalWorkspace } from "../../api/local.js";
8
9
  /**
9
10
  * Login result info
10
11
  */
@@ -34,6 +35,8 @@ export interface DevCommandOptions {
34
35
  onLoginComplete?: (info: LoginInfo) => void;
35
36
  /** Callback when schema validation completes */
36
37
  onSchemaValidation?: (result: SchemaValidationResult) => void;
38
+ /** Override the devMode from config */
39
+ devModeOverride?: DevMode;
37
40
  }
38
41
  /**
39
42
  * Information about the branch being used
@@ -43,10 +46,14 @@ export interface BranchReadyInfo {
43
46
  gitBranch: string | null;
44
47
  /** Whether we're on the main branch */
45
48
  isMainBranch: boolean;
46
- /** Tinybird branch info (null if on main) */
49
+ /** Tinybird branch info (null if on main or local mode) */
47
50
  tinybirdBranch?: TinybirdBranch;
48
51
  /** Whether the branch was newly created */
49
52
  wasCreated?: boolean;
53
+ /** Whether using local mode */
54
+ isLocal?: boolean;
55
+ /** Local workspace info (only in local mode) */
56
+ localWorkspace?: LocalWorkspace;
50
57
  }
51
58
  /**
52
59
  * Dev command controller
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAyE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1H,OAAO,EAAY,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG/E,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,oCAAoC;IACpC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACvD,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,+CAA+C;IAC/C,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,kDAAkD;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5C,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uCAAuC;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3C,mCAAmC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB;IAClB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoPpF"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAyF,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AACxJ,OAAO,EAAY,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG/E,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,oCAAoC;IACpC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACvD,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,+CAA+C;IAC/C,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,kDAAkD;IAClD,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5C,gDAAgD;IAChD,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC9D,uCAAuC;IACvC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uCAAuC;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,+BAA+B;IAC/B,OAAO,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3C,mCAAmC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB;IAClB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8QpF"}
@@ -3,12 +3,13 @@
3
3
  */
4
4
  import * as path from "path";
5
5
  import { watch } from "chokidar";
6
- import { loadConfig, configExists, findConfigFile, hasValidToken, updateConfig } from "../config.js";
6
+ import { loadConfig, configExists, findConfigFile, hasValidToken, updateConfig, LOCAL_BASE_URL } from "../config.js";
7
7
  import { runBuild } from "./build.js";
8
8
  import { getOrCreateBranch } from "../../api/branches.js";
9
9
  import { browserLogin } from "../auth.js";
10
10
  import { saveTinybirdToken } from "../env.js";
11
11
  import { validatePipeSchemas, } from "../utils/schema-validation.js";
12
+ import { getLocalTokens, getOrCreateLocalWorkspace, getLocalWorkspaceName, } from "../../api/local.js";
12
13
  /**
13
14
  * Run the dev command
14
15
  *
@@ -27,8 +28,18 @@ export async function runDev(options = {}) {
27
28
  if (!configExists(cwd)) {
28
29
  throw new Error("No tinybird.json found. Run 'npx tinybird init' to initialize a project.");
29
30
  }
30
- // Check if authentication is set up, if not trigger login
31
- if (!hasValidToken(cwd)) {
31
+ // Load config first to determine devMode
32
+ let config;
33
+ try {
34
+ config = loadConfig(cwd);
35
+ }
36
+ catch (error) {
37
+ throw error;
38
+ }
39
+ // Determine devMode
40
+ const devMode = options.devModeOverride ?? config.devMode;
41
+ // Check if authentication is set up, if not trigger login (skip for local mode)
42
+ if (devMode !== "local" && !hasValidToken(cwd)) {
32
43
  console.log("No authentication found. Starting login flow...\n");
33
44
  const authResult = await browserLogin();
34
45
  if (!authResult.success || !authResult.token) {
@@ -54,42 +65,55 @@ export async function runDev(options = {}) {
54
65
  workspaceName: authResult.workspaceName,
55
66
  userEmail: authResult.userEmail,
56
67
  });
57
- }
58
- // Load config (now should have valid token)
59
- let config;
60
- try {
68
+ // Reload config after login
61
69
  config = loadConfig(cwd);
62
70
  }
63
- catch (error) {
64
- throw error;
65
- }
66
- // Determine effective token based on git branch
71
+ // Determine effective token and branch info based on devMode
67
72
  let effectiveToken = config.token;
73
+ let effectiveBaseUrl = config.baseUrl;
68
74
  let branchInfo = {
69
75
  gitBranch: config.gitBranch,
70
76
  isMainBranch: config.isMainBranch,
71
77
  };
72
- // If we're on a feature branch, get or create the Tinybird branch
73
- // Use tinybirdBranch (sanitized name) for Tinybird API, gitBranch for display
74
- if (!config.isMainBranch && config.tinybirdBranch) {
75
- const branchName = config.tinybirdBranch; // Sanitized name for Tinybird
76
- // Always fetch fresh from API to avoid stale cache issues
77
- const tinybirdBranch = await getOrCreateBranch({
78
- baseUrl: config.baseUrl,
79
- token: config.token,
80
- }, branchName);
81
- if (!tinybirdBranch.token) {
82
- throw new Error(`Branch '${branchName}' was created but no token was returned. ` +
83
- `This may be an API issue.`);
84
- }
85
- effectiveToken = tinybirdBranch.token;
78
+ if (devMode === "local") {
79
+ // Local mode: get tokens from local container and set up workspace
80
+ const localTokens = await getLocalTokens();
81
+ const workspaceName = getLocalWorkspaceName(config.tinybirdBranch, config.cwd);
82
+ const { workspace, wasCreated } = await getOrCreateLocalWorkspace(localTokens, workspaceName);
83
+ effectiveToken = workspace.token;
84
+ effectiveBaseUrl = LOCAL_BASE_URL;
86
85
  branchInfo = {
87
- gitBranch: config.gitBranch, // Original git branch name for display
88
- isMainBranch: false,
89
- tinybirdBranch,
90
- wasCreated: tinybirdBranch.wasCreated ?? false,
86
+ gitBranch: config.gitBranch,
87
+ isMainBranch: false, // Local mode always uses build, not deploy
88
+ isLocal: true,
89
+ localWorkspace: workspace,
90
+ wasCreated,
91
91
  };
92
92
  }
93
+ else {
94
+ // Branch mode: use Tinybird cloud with branches
95
+ // If we're on a feature branch, get or create the Tinybird branch
96
+ // Use tinybirdBranch (sanitized name) for Tinybird API, gitBranch for display
97
+ if (!config.isMainBranch && config.tinybirdBranch) {
98
+ const branchName = config.tinybirdBranch; // Sanitized name for Tinybird
99
+ // Always fetch fresh from API to avoid stale cache issues
100
+ const tinybirdBranch = await getOrCreateBranch({
101
+ baseUrl: config.baseUrl,
102
+ token: config.token,
103
+ }, branchName);
104
+ if (!tinybirdBranch.token) {
105
+ throw new Error(`Branch '${branchName}' was created but no token was returned. ` +
106
+ `This may be an API issue.`);
107
+ }
108
+ effectiveToken = tinybirdBranch.token;
109
+ branchInfo = {
110
+ gitBranch: config.gitBranch, // Original git branch name for display
111
+ isMainBranch: false,
112
+ tinybirdBranch,
113
+ wasCreated: tinybirdBranch.wasCreated ?? false,
114
+ };
115
+ }
116
+ }
93
117
  // Notify about branch readiness
94
118
  options.onBranchReady?.(branchInfo);
95
119
  // Get directories to watch from include paths
@@ -116,7 +140,8 @@ export async function runDev(options = {}) {
116
140
  const result = await runBuild({
117
141
  cwd: config.cwd,
118
142
  tokenOverride: effectiveToken,
119
- useDeployEndpoint: config.isMainBranch,
143
+ useDeployEndpoint: devMode !== "local" && config.isMainBranch,
144
+ devModeOverride: devMode,
120
145
  });
121
146
  options.onBuildComplete?.(result);
122
147
  // Validate pipe schemas after successful deploy
@@ -134,7 +159,7 @@ export async function runDev(options = {}) {
134
159
  const validation = await validatePipeSchemas({
135
160
  entities: result.build.entities,
136
161
  pipeNames: changedPipes,
137
- baseUrl: config.baseUrl,
162
+ baseUrl: effectiveBaseUrl,
138
163
  token: effectiveToken,
139
164
  });
140
165
  options.onSchemaValidation(validation);