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