@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.
- package/README.md +38 -4
- package/dist/api/build.d.ts +2 -0
- package/dist/api/build.d.ts.map +1 -1
- package/dist/api/build.js +13 -0
- package/dist/api/build.js.map +1 -1
- package/dist/api/build.test.js +1 -0
- package/dist/api/build.test.js.map +1 -1
- package/dist/api/deploy.d.ts.map +1 -1
- package/dist/api/deploy.js +3 -0
- package/dist/api/deploy.js.map +1 -1
- package/dist/api/deploy.test.js +1 -0
- package/dist/api/deploy.test.js.map +1 -1
- package/dist/api/local.d.ts +92 -0
- package/dist/api/local.d.ts.map +1 -0
- package/dist/api/local.js +176 -0
- package/dist/api/local.js.map +1 -0
- package/dist/api/local.test.d.ts +2 -0
- package/dist/api/local.test.d.ts.map +1 -0
- package/dist/api/local.test.js +182 -0
- package/dist/api/local.test.js.map +1 -0
- package/dist/cli/commands/build.d.ts +3 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +97 -47
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/dev.d.ts +9 -2
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +56 -31
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/config.d.ts +14 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +7 -0
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/config.test.js +29 -0
- package/dist/cli/config.test.js.map +1 -1
- package/dist/cli/index.js +39 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/generator/connection.d.ts +49 -0
- package/dist/generator/connection.d.ts.map +1 -0
- package/dist/generator/connection.js +78 -0
- package/dist/generator/connection.js.map +1 -0
- package/dist/generator/connection.test.d.ts +2 -0
- package/dist/generator/connection.test.d.ts.map +1 -0
- package/dist/generator/connection.test.js +106 -0
- package/dist/generator/connection.test.js.map +1 -0
- package/dist/generator/datasource.d.ts.map +1 -1
- package/dist/generator/datasource.js +20 -0
- package/dist/generator/datasource.js.map +1 -1
- package/dist/generator/datasource.test.js +92 -0
- package/dist/generator/datasource.test.js.map +1 -1
- package/dist/generator/index.d.ts +8 -2
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +10 -3
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/loader.d.ts +8 -1
- package/dist/generator/loader.d.ts.map +1 -1
- package/dist/generator/loader.js +17 -2
- package/dist/generator/loader.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/schema/connection.d.ts +83 -0
- package/dist/schema/connection.d.ts.map +1 -0
- package/dist/schema/connection.js +61 -0
- package/dist/schema/connection.js.map +1 -0
- package/dist/schema/connection.test.d.ts +2 -0
- package/dist/schema/connection.test.d.ts.map +1 -0
- package/dist/schema/connection.test.js +117 -0
- package/dist/schema/connection.test.js.map +1 -0
- package/dist/schema/datasource.d.ts +16 -0
- package/dist/schema/datasource.d.ts.map +1 -1
- package/dist/schema/datasource.js.map +1 -1
- package/dist/schema/project.d.ts +12 -3
- package/dist/schema/project.d.ts.map +1 -1
- package/dist/schema/project.js +2 -0
- package/dist/schema/project.js.map +1 -1
- package/package.json +1 -1
- package/src/api/build.test.ts +1 -0
- package/src/api/build.ts +20 -0
- package/src/api/deploy.test.ts +1 -0
- package/src/api/deploy.ts +3 -0
- package/src/api/local.test.ts +250 -0
- package/src/api/local.ts +270 -0
- package/src/cli/commands/build.ts +120 -54
- package/src/cli/commands/dev.ts +76 -38
- package/src/cli/config.test.ts +47 -0
- package/src/cli/config.ts +20 -0
- package/src/cli/index.ts +39 -3
- package/src/generator/connection.test.ts +135 -0
- package/src/generator/connection.ts +104 -0
- package/src/generator/datasource.test.ts +108 -0
- package/src/generator/datasource.ts +27 -1
- package/src/generator/index.ts +16 -4
- package/src/generator/loader.ts +21 -3
- package/src/index.ts +12 -0
- package/src/schema/connection.test.ts +149 -0
- package/src/schema/connection.ts +123 -0
- package/src/schema/datasource.ts +17 -0
- 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;AAE7B,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAChE,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;AACxC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAE/B,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,EAAE,GAAG,EAAE;gBACxC,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,UAAU,EAAE,YAAY;oBACxB,WAAW,EAAE,aAAa;oBAC1B,qBAAqB,EAAE,iBAAiB;iBACzC,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,EAAE,GAAG,EAAE;gBACxC,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC;YAC9B,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,EAAE,GAAG,EAAE;gBACxC,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,UAAU,EAAE,gBAAgB;oBAC5B,WAAW,EAAE,iBAAiB;oBAC9B,qBAAqB,EAAE,qBAAqB;iBAC7C,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;YAEtC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,EAAE,GAAG,EAAE;gBACxC,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC;YAC9B,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,EAAE,GAAG,EAAE;gBACxC,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,0BAA0B;oBAC1B,UAAU,EAAE,YAAY;iBACzB,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,qBAAqB,EAAE,GAAG,EAAE;gBACpD,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,eAAe,EAAE,SAAS;oBAC1B,UAAU,EAAE;wBACV,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;wBACpD,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE;qBACrD;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAExD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnC,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,qBAAqB,EAAE,GAAG,EAAE;gBACpD,OAAO,IAAI,YAAY,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,gBAAgB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBACjE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAC7C,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,EAAE,EAAE,WAAW;oBACf,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;oBACxB,KAAK,EAAE,cAAc;iBACtB,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAEzE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,gBAAgB,EAAE,GAAG,EAAE;gBAChD,OAAO,IAAI,YAAY,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3D,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,CAAC,oBAAoB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/E,aAAa,CACd,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG;YACb,UAAU,EAAE,YAAY;YACxB,WAAW,EAAE,aAAa;YAC1B,qBAAqB,EAAE,eAAe;SACvC,CAAC;QAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,qBAAqB,EAAE,GAAG,EAAE;gBACpD,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,eAAe,EAAE,SAAS;oBAC1B,UAAU,EAAE;wBACV,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,gBAAgB,EAAE;qBACpE;iBACF,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YAEtE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,IAAI,YAAY,GAAG,KAAK,CAAC;YAEzB,MAAM,CAAC,GAAG,CACR,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,qBAAqB,EAAE,GAAG,EAAE;gBACpD,+DAA+D;gBAC/D,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,YAAY,CAAC,IAAI,CAAC;wBACvB,eAAe,EAAE,SAAS;wBAC1B,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE;yBAC3D;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,eAAe,EAAE,SAAS;oBAC1B,UAAU,EAAE,EAAE,EAAE,kBAAkB;iBACnC,CAAC,CAAC;YACL,CAAC,CAAC,EACF,IAAI,CAAC,IAAI,CAAC,GAAG,cAAc,gBAAgB,EAAE,GAAG,EAAE;gBAChD,YAAY,GAAG,IAAI,CAAC;gBACpB,OAAO,YAAY,CAAC,IAAI,CAAC;oBACvB,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAEvE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,IAAI,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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;
|
|
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
|
-
//
|
|
56
|
-
|
|
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]
|
|
63
|
-
console.log(`[debug] tinybirdBranch: ${config.tinybirdBranch}`);
|
|
64
|
-
console.log(`[debug] tokenOverride: ${!!options.tokenOverride}`);
|
|
60
|
+
console.log(`[debug] devMode: ${devMode}`);
|
|
65
61
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
62
|
+
let deployResult;
|
|
63
|
+
// Handle local mode
|
|
64
|
+
if (devMode === "local") {
|
|
70
65
|
try {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
75
|
-
|
|
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:
|
|
91
|
+
error: error.message,
|
|
80
92
|
durationMs: Date.now() - startTime,
|
|
81
93
|
};
|
|
82
94
|
}
|
|
83
|
-
|
|
84
|
-
|
|
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]
|
|
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: `
|
|
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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"}
|
package/dist/cli/commands/dev.js
CHANGED
|
@@ -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
|
-
//
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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,
|
|
88
|
-
isMainBranch: false,
|
|
89
|
-
|
|
90
|
-
|
|
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:
|
|
162
|
+
baseUrl: effectiveBaseUrl,
|
|
138
163
|
token: effectiveToken,
|
|
139
164
|
});
|
|
140
165
|
options.onSchemaValidation(validation);
|