@tinybirdco/sdk 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -13
- package/dist/api/deploy.d.ts +41 -3
- package/dist/api/deploy.d.ts.map +1 -1
- package/dist/api/deploy.js +141 -19
- package/dist/api/deploy.js.map +1 -1
- package/dist/api/deploy.test.js +77 -29
- package/dist/api/deploy.test.js.map +1 -1
- package/dist/api/resources.d.ts +178 -0
- package/dist/api/resources.d.ts.map +1 -0
- package/dist/api/resources.js +244 -0
- package/dist/api/resources.js.map +1 -0
- package/dist/api/resources.test.d.ts +2 -0
- package/dist/api/resources.test.d.ts.map +1 -0
- package/dist/api/resources.test.js +255 -0
- package/dist/api/resources.test.js.map +1 -0
- package/dist/cli/commands/build.d.ts +3 -4
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +23 -25
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/deploy.d.ts +39 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +90 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +7 -3
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/init.d.ts +24 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +174 -23
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +190 -30
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/index.js +72 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/package-manager.d.ts +8 -0
- package/dist/cli/utils/package-manager.d.ts.map +1 -0
- package/dist/cli/utils/package-manager.js +45 -0
- package/dist/cli/utils/package-manager.js.map +1 -0
- package/dist/cli/utils/package-manager.test.d.ts +2 -0
- package/dist/cli/utils/package-manager.test.d.ts.map +1 -0
- package/dist/cli/utils/package-manager.test.js +85 -0
- package/dist/cli/utils/package-manager.test.js.map +1 -0
- package/dist/codegen/index.d.ts +39 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +300 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/index.test.d.ts +2 -0
- package/dist/codegen/index.test.d.ts.map +1 -0
- package/dist/codegen/index.test.js +310 -0
- package/dist/codegen/index.test.js.map +1 -0
- package/dist/codegen/type-mapper.d.ts +20 -0
- package/dist/codegen/type-mapper.d.ts.map +1 -0
- package/dist/codegen/type-mapper.js +238 -0
- package/dist/codegen/type-mapper.js.map +1 -0
- package/dist/codegen/type-mapper.test.d.ts +2 -0
- package/dist/codegen/type-mapper.test.d.ts.map +1 -0
- package/dist/codegen/type-mapper.test.js +167 -0
- package/dist/codegen/type-mapper.test.js.map +1 -0
- package/dist/codegen/utils.d.ts +46 -0
- package/dist/codegen/utils.d.ts.map +1 -0
- package/dist/codegen/utils.js +141 -0
- package/dist/codegen/utils.js.map +1 -0
- package/dist/codegen/utils.test.d.ts +2 -0
- package/dist/codegen/utils.test.d.ts.map +1 -0
- package/dist/codegen/utils.test.js +178 -0
- package/dist/codegen/utils.test.js.map +1 -0
- package/dist/generator/index.d.ts +3 -0
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +17 -1
- package/dist/generator/index.js.map +1 -1
- package/dist/generator/index.test.js +104 -1
- package/dist/generator/index.test.js.map +1 -1
- package/dist/generator/loader.d.ts +15 -0
- package/dist/generator/loader.d.ts.map +1 -1
- package/dist/generator/loader.js +24 -0
- package/dist/generator/loader.js.map +1 -1
- package/dist/test/handlers.d.ts +49 -0
- package/dist/test/handlers.d.ts.map +1 -1
- package/dist/test/handlers.js +45 -0
- package/dist/test/handlers.js.map +1 -1
- package/package.json +4 -2
- package/src/api/deploy.test.ts +135 -34
- package/src/api/deploy.ts +203 -23
- package/src/api/resources.test.ts +332 -0
- package/src/api/resources.ts +554 -0
- package/src/cli/commands/build.ts +29 -33
- package/src/cli/commands/deploy.ts +126 -0
- package/src/cli/commands/dev.ts +10 -3
- package/src/cli/commands/init.test.ts +239 -30
- package/src/cli/commands/init.ts +243 -26
- package/src/cli/index.ts +84 -11
- package/src/cli/utils/package-manager.test.ts +118 -0
- package/src/cli/utils/package-manager.ts +44 -0
- package/src/codegen/index.test.ts +367 -0
- package/src/codegen/index.ts +379 -0
- package/src/codegen/type-mapper.test.ts +224 -0
- package/src/codegen/type-mapper.ts +265 -0
- package/src/codegen/utils.test.ts +221 -0
- package/src/codegen/utils.ts +174 -0
- package/src/generator/index.test.ts +121 -1
- package/src/generator/index.ts +19 -1
- package/src/generator/loader.ts +43 -0
- package/src/test/handlers.ts +58 -0
package/README.md
CHANGED
|
@@ -160,30 +160,65 @@ const result = await tinybird.query.topPages({
|
|
|
160
160
|
|
|
161
161
|
### `npx tinybird init`
|
|
162
162
|
|
|
163
|
-
Initialize a new Tinybird TypeScript project.
|
|
163
|
+
Initialize a new Tinybird TypeScript project. If you have existing `.datasource` and `.pipe` files in your repository, the CLI will detect them and ask if you want to include them in your configuration.
|
|
164
164
|
|
|
165
165
|
```bash
|
|
166
166
|
npx tinybird init
|
|
167
|
-
npx tinybird init --force
|
|
167
|
+
npx tinybird init --force # Overwrite existing files
|
|
168
|
+
npx tinybird init --skip-login # Skip browser login flow
|
|
168
169
|
```
|
|
169
170
|
|
|
170
|
-
|
|
171
|
+
This enables incremental migration for existing Tinybird projects - you can keep your `.datasource` and `.pipe` files alongside TypeScript definitions.
|
|
171
172
|
|
|
172
|
-
|
|
173
|
+
### `tinybird dev`
|
|
174
|
+
|
|
175
|
+
Watch for changes and sync with Tinybird automatically. Only works on feature branches (not main).
|
|
173
176
|
|
|
174
177
|
```bash
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
+
tinybird dev
|
|
179
|
+
tinybird dev --local # Sync with local Tinybird container
|
|
180
|
+
tinybird dev --branch # Explicitly use Tinybird cloud with branches
|
|
178
181
|
```
|
|
179
182
|
|
|
180
|
-
|
|
183
|
+
**Note:** `dev` mode is blocked on the main branch to prevent accidental production deployments. Use `tinybird deploy` for production, or switch to a feature branch.
|
|
184
|
+
|
|
185
|
+
### `tinybird build`
|
|
181
186
|
|
|
182
|
-
|
|
187
|
+
Build and push resources to a Tinybird branch (not main).
|
|
183
188
|
|
|
184
189
|
```bash
|
|
185
|
-
|
|
186
|
-
|
|
190
|
+
tinybird build
|
|
191
|
+
tinybird build --dry-run # Preview without pushing
|
|
192
|
+
tinybird build --local # Build to local Tinybird container
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Note:** `build` is blocked on the main branch. Use `tinybird deploy` for production deployments.
|
|
196
|
+
|
|
197
|
+
### `tinybird deploy`
|
|
198
|
+
|
|
199
|
+
Deploy resources to the main Tinybird workspace (production). This is the only way to deploy to main.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
tinybird deploy
|
|
203
|
+
tinybird deploy --dry-run # Preview without pushing
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### `tinybird login`
|
|
207
|
+
|
|
208
|
+
Authenticate with Tinybird via browser.
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
tinybird login
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### `tinybird branch`
|
|
215
|
+
|
|
216
|
+
Manage Tinybird branches.
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
tinybird branch list # List all branches
|
|
220
|
+
tinybird branch status # Show current branch status
|
|
221
|
+
tinybird branch delete <name> # Delete a branch
|
|
187
222
|
```
|
|
188
223
|
|
|
189
224
|
## Configuration
|
|
@@ -194,7 +229,9 @@ Create a `tinybird.json` in your project root:
|
|
|
194
229
|
{
|
|
195
230
|
"include": [
|
|
196
231
|
"src/tinybird/datasources.ts",
|
|
197
|
-
"src/tinybird/pipes.ts"
|
|
232
|
+
"src/tinybird/pipes.ts",
|
|
233
|
+
"src/tinybird/legacy.datasource",
|
|
234
|
+
"src/tinybird/legacy.pipe"
|
|
198
235
|
],
|
|
199
236
|
"token": "${TINYBIRD_TOKEN}",
|
|
200
237
|
"baseUrl": "https://api.tinybird.co",
|
|
@@ -202,11 +239,13 @@ Create a `tinybird.json` in your project root:
|
|
|
202
239
|
}
|
|
203
240
|
```
|
|
204
241
|
|
|
242
|
+
You can mix TypeScript files with raw `.datasource` and `.pipe` files for incremental migration.
|
|
243
|
+
|
|
205
244
|
### Configuration Options
|
|
206
245
|
|
|
207
246
|
| Option | Type | Default | Description |
|
|
208
247
|
|--------|------|---------|-------------|
|
|
209
|
-
| `include` | `string[]` | *required* | Array of TypeScript files
|
|
248
|
+
| `include` | `string[]` | *required* | Array of TypeScript files or raw `.datasource`/`.pipe` files to include |
|
|
210
249
|
| `token` | `string` | *required* | API token. Supports `${ENV_VAR}` interpolation for environment variables |
|
|
211
250
|
| `baseUrl` | `string` | `"https://api.tinybird.co"` | Tinybird API URL. Use `"https://api.us-east.tinybird.co"` for US region |
|
|
212
251
|
| `devMode` | `"branch"` \| `"local"` | `"branch"` | Development mode. `"branch"` uses Tinybird cloud with branches, `"local"` uses local Docker container |
|
package/dist/api/deploy.d.ts
CHANGED
|
@@ -1,15 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deploy resources to Tinybird main workspace
|
|
3
|
-
* Uses the /v1/deploy endpoint
|
|
3
|
+
* Uses the /v1/deploy endpoint to create a deployment, then sets it live
|
|
4
4
|
*/
|
|
5
5
|
import type { GeneratedResources } from "../generator/index.js";
|
|
6
6
|
import type { BuildConfig, BuildApiResult } from "./build.js";
|
|
7
|
+
/**
|
|
8
|
+
* Deployment object returned by the /v1/deploy endpoint
|
|
9
|
+
*/
|
|
10
|
+
export interface Deployment {
|
|
11
|
+
id: string;
|
|
12
|
+
status: string;
|
|
13
|
+
live?: boolean;
|
|
14
|
+
created_at?: string;
|
|
15
|
+
updated_at?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Response from /v1/deployments list endpoint
|
|
19
|
+
*/
|
|
20
|
+
export interface DeploymentsListResponse {
|
|
21
|
+
deployments: Deployment[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Response from /v1/deploy endpoint
|
|
25
|
+
*/
|
|
26
|
+
export interface DeployResponse {
|
|
27
|
+
result: "success" | "failed";
|
|
28
|
+
deployment?: Deployment;
|
|
29
|
+
error?: string;
|
|
30
|
+
errors?: Array<{
|
|
31
|
+
filename?: string;
|
|
32
|
+
error: string;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Response from /v1/deployments/{id} endpoint
|
|
37
|
+
*/
|
|
38
|
+
export interface DeploymentStatusResponse {
|
|
39
|
+
result: string;
|
|
40
|
+
deployment: Deployment;
|
|
41
|
+
}
|
|
7
42
|
/**
|
|
8
43
|
* Deploy generated resources to Tinybird main workspace
|
|
9
44
|
*
|
|
10
45
|
* Uses the /v1/deploy endpoint which accepts all resources in a single
|
|
11
|
-
* multipart form request.
|
|
12
|
-
* (
|
|
46
|
+
* multipart form request. After creating the deployment, this function:
|
|
47
|
+
* 1. Polls until the deployment is ready (status === 'data_ready')
|
|
48
|
+
* 2. Sets the deployment as live via /v1/deployments/{id}/set-live
|
|
13
49
|
*
|
|
14
50
|
* @param config - Build configuration with API URL and token
|
|
15
51
|
* @param resources - Generated resources to deploy
|
|
@@ -35,5 +71,7 @@ import type { BuildConfig, BuildApiResult } from "./build.js";
|
|
|
35
71
|
*/
|
|
36
72
|
export declare function deployToMain(config: BuildConfig, resources: GeneratedResources, options?: {
|
|
37
73
|
debug?: boolean;
|
|
74
|
+
pollIntervalMs?: number;
|
|
75
|
+
maxPollAttempts?: number;
|
|
38
76
|
}): Promise<BuildApiResult>;
|
|
39
77
|
//# sourceMappingURL=deploy.d.ts.map
|
package/dist/api/deploy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/E,OAAO,CAAC,cAAc,CAAC,CAoQzB"}
|
package/dist/api/deploy.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deploy resources to Tinybird main workspace
|
|
3
|
-
* Uses the /v1/deploy endpoint
|
|
3
|
+
* Uses the /v1/deploy endpoint to create a deployment, then sets it live
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* Deploy generated resources to Tinybird main workspace
|
|
7
7
|
*
|
|
8
8
|
* Uses the /v1/deploy endpoint which accepts all resources in a single
|
|
9
|
-
* multipart form request.
|
|
10
|
-
* (
|
|
9
|
+
* multipart form request. After creating the deployment, this function:
|
|
10
|
+
* 1. Polls until the deployment is ready (status === 'data_ready')
|
|
11
|
+
* 2. Sets the deployment as live via /v1/deployments/{id}/set-live
|
|
11
12
|
*
|
|
12
13
|
* @param config - Build configuration with API URL and token
|
|
13
14
|
* @param resources - Generated resources to deploy
|
|
@@ -33,6 +34,9 @@
|
|
|
33
34
|
*/
|
|
34
35
|
export async function deployToMain(config, resources, options) {
|
|
35
36
|
const debug = options?.debug ?? !!process.env.TINYBIRD_DEBUG;
|
|
37
|
+
const pollIntervalMs = options?.pollIntervalMs ?? 1000;
|
|
38
|
+
const maxPollAttempts = options?.maxPollAttempts ?? 120; // 2 minutes max
|
|
39
|
+
const baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
36
40
|
const formData = new FormData();
|
|
37
41
|
// Add datasources
|
|
38
42
|
for (const ds of resources.datasources) {
|
|
@@ -54,12 +58,42 @@ export async function deployToMain(config, resources, options) {
|
|
|
54
58
|
}
|
|
55
59
|
formData.append(fieldName, new Blob([pipe.content], { type: "text/plain" }), fileName);
|
|
56
60
|
}
|
|
57
|
-
//
|
|
58
|
-
|
|
61
|
+
// Step 0: Clean up any stale non-live deployments that might block the new deployment
|
|
62
|
+
try {
|
|
63
|
+
const deploymentsUrl = `${baseUrl}/v1/deployments`;
|
|
64
|
+
const deploymentsResponse = await fetch(deploymentsUrl, {
|
|
65
|
+
headers: {
|
|
66
|
+
Authorization: `Bearer ${config.token}`,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
if (deploymentsResponse.ok) {
|
|
70
|
+
const deploymentsBody = (await deploymentsResponse.json());
|
|
71
|
+
const staleDeployments = deploymentsBody.deployments.filter((d) => !d.live && d.status !== "live");
|
|
72
|
+
for (const stale of staleDeployments) {
|
|
73
|
+
if (debug) {
|
|
74
|
+
console.log(`[debug] Cleaning up stale deployment: ${stale.id} (status: ${stale.status})`);
|
|
75
|
+
}
|
|
76
|
+
await fetch(`${baseUrl}/v1/deployments/${stale.id}`, {
|
|
77
|
+
method: "DELETE",
|
|
78
|
+
headers: {
|
|
79
|
+
Authorization: `Bearer ${config.token}`,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
// Ignore errors during cleanup - we'll try to deploy anyway
|
|
87
|
+
if (debug) {
|
|
88
|
+
console.log(`[debug] Failed to clean up stale deployments: ${e}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Step 1: Create deployment via /v1/deploy
|
|
92
|
+
const deployUrl = `${baseUrl}/v1/deploy`;
|
|
59
93
|
if (debug) {
|
|
60
|
-
console.log(`[debug] POST ${
|
|
94
|
+
console.log(`[debug] POST ${deployUrl}`);
|
|
61
95
|
}
|
|
62
|
-
const response = await fetch(
|
|
96
|
+
const response = await fetch(deployUrl, {
|
|
63
97
|
method: "POST",
|
|
64
98
|
headers: {
|
|
65
99
|
Authorization: `Bearer ${config.token}`,
|
|
@@ -103,7 +137,7 @@ export async function deployToMain(config, resources, options) {
|
|
|
103
137
|
};
|
|
104
138
|
}
|
|
105
139
|
// Handle API result
|
|
106
|
-
if (body.result === "failed") {
|
|
140
|
+
if (body.result === "failed" || !body.deployment) {
|
|
107
141
|
return {
|
|
108
142
|
success: false,
|
|
109
143
|
result: "failed",
|
|
@@ -113,26 +147,114 @@ export async function deployToMain(config, resources, options) {
|
|
|
113
147
|
connectionCount: resources.connections?.length ?? 0,
|
|
114
148
|
};
|
|
115
149
|
}
|
|
150
|
+
const deploymentId = body.deployment.id;
|
|
151
|
+
if (debug) {
|
|
152
|
+
console.log(`[debug] Deployment created with ID: ${deploymentId}`);
|
|
153
|
+
}
|
|
154
|
+
// Step 2: Poll until deployment is ready
|
|
155
|
+
let deployment = body.deployment;
|
|
156
|
+
let attempts = 0;
|
|
157
|
+
while (deployment.status !== "data_ready" && attempts < maxPollAttempts) {
|
|
158
|
+
await sleep(pollIntervalMs);
|
|
159
|
+
attempts++;
|
|
160
|
+
if (debug) {
|
|
161
|
+
console.log(`[debug] Polling deployment status (attempt ${attempts})...`);
|
|
162
|
+
}
|
|
163
|
+
const statusUrl = `${baseUrl}/v1/deployments/${deploymentId}`;
|
|
164
|
+
const statusResponse = await fetch(statusUrl, {
|
|
165
|
+
headers: {
|
|
166
|
+
Authorization: `Bearer ${config.token}`,
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
if (!statusResponse.ok) {
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
result: "failed",
|
|
173
|
+
error: `Failed to check deployment status: ${statusResponse.status} ${statusResponse.statusText}`,
|
|
174
|
+
datasourceCount: resources.datasources.length,
|
|
175
|
+
pipeCount: resources.pipes.length,
|
|
176
|
+
connectionCount: resources.connections?.length ?? 0,
|
|
177
|
+
buildId: deploymentId,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const statusBody = (await statusResponse.json());
|
|
181
|
+
deployment = statusBody.deployment;
|
|
182
|
+
if (debug) {
|
|
183
|
+
console.log(`[debug] Deployment status: ${deployment.status}`);
|
|
184
|
+
}
|
|
185
|
+
// Check for failed status
|
|
186
|
+
if (deployment.status === "failed" || deployment.status === "error") {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
result: "failed",
|
|
190
|
+
error: `Deployment failed with status: ${deployment.status}`,
|
|
191
|
+
datasourceCount: resources.datasources.length,
|
|
192
|
+
pipeCount: resources.pipes.length,
|
|
193
|
+
connectionCount: resources.connections?.length ?? 0,
|
|
194
|
+
buildId: deploymentId,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (deployment.status !== "data_ready") {
|
|
199
|
+
return {
|
|
200
|
+
success: false,
|
|
201
|
+
result: "failed",
|
|
202
|
+
error: `Deployment timed out after ${maxPollAttempts} attempts. Last status: ${deployment.status}`,
|
|
203
|
+
datasourceCount: resources.datasources.length,
|
|
204
|
+
pipeCount: resources.pipes.length,
|
|
205
|
+
connectionCount: resources.connections?.length ?? 0,
|
|
206
|
+
buildId: deploymentId,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
// Step 3: Set the deployment as live
|
|
210
|
+
const setLiveUrl = `${baseUrl}/v1/deployments/${deploymentId}/set-live`;
|
|
211
|
+
if (debug) {
|
|
212
|
+
console.log(`[debug] POST ${setLiveUrl}`);
|
|
213
|
+
}
|
|
214
|
+
const setLiveResponse = await fetch(setLiveUrl, {
|
|
215
|
+
method: "POST",
|
|
216
|
+
headers: {
|
|
217
|
+
Authorization: `Bearer ${config.token}`,
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
if (!setLiveResponse.ok) {
|
|
221
|
+
const setLiveBody = await setLiveResponse.text();
|
|
222
|
+
return {
|
|
223
|
+
success: false,
|
|
224
|
+
result: "failed",
|
|
225
|
+
error: `Failed to set deployment as live: ${setLiveResponse.status} ${setLiveResponse.statusText}\n${setLiveBody}`,
|
|
226
|
+
datasourceCount: resources.datasources.length,
|
|
227
|
+
pipeCount: resources.pipes.length,
|
|
228
|
+
connectionCount: resources.connections?.length ?? 0,
|
|
229
|
+
buildId: deploymentId,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (debug) {
|
|
233
|
+
console.log(`[debug] Deployment ${deploymentId} is now live`);
|
|
234
|
+
}
|
|
116
235
|
return {
|
|
117
236
|
success: true,
|
|
118
|
-
result:
|
|
237
|
+
result: "success",
|
|
119
238
|
datasourceCount: resources.datasources.length,
|
|
120
239
|
pipeCount: resources.pipes.length,
|
|
121
240
|
connectionCount: resources.connections?.length ?? 0,
|
|
122
|
-
buildId:
|
|
241
|
+
buildId: deploymentId,
|
|
123
242
|
pipes: {
|
|
124
|
-
changed:
|
|
125
|
-
created:
|
|
126
|
-
deleted:
|
|
243
|
+
changed: [],
|
|
244
|
+
created: [],
|
|
245
|
+
deleted: [],
|
|
127
246
|
},
|
|
128
247
|
datasources: {
|
|
129
|
-
changed:
|
|
130
|
-
created:
|
|
131
|
-
deleted:
|
|
248
|
+
changed: [],
|
|
249
|
+
created: [],
|
|
250
|
+
deleted: [],
|
|
132
251
|
},
|
|
133
|
-
// Keep deprecated fields for backwards compatibility
|
|
134
|
-
changedPipeNames: body.build?.changed_pipe_names ?? [],
|
|
135
|
-
newPipeNames: body.build?.new_pipe_names ?? [],
|
|
136
252
|
};
|
|
137
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Helper function to sleep for a given number of milliseconds
|
|
256
|
+
*/
|
|
257
|
+
function sleep(ms) {
|
|
258
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
259
|
+
}
|
|
138
260
|
//# sourceMappingURL=deploy.js.map
|
package/dist/api/deploy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"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"}
|
package/dist/api/deploy.test.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll, afterEach, afterAll } from "vitest";
|
|
1
|
+
import { describe, it, expect, beforeAll, beforeEach, afterEach, afterAll } from "vitest";
|
|
2
2
|
import { setupServer } from "msw/node";
|
|
3
3
|
import { http, HttpResponse } from "msw";
|
|
4
4
|
import { deployToMain } from "./deploy.js";
|
|
5
|
-
import { BASE_URL,
|
|
5
|
+
import { BASE_URL, createDeploySuccessResponse, createDeploymentStatusResponse, createSetLiveSuccessResponse, createBuildFailureResponse, createBuildMultipleErrorsResponse, createDeploymentsListResponse, } from "../test/handlers.js";
|
|
6
6
|
const server = setupServer();
|
|
7
7
|
beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
// Set up default handler for deployments list (used by stale deployment cleanup)
|
|
10
|
+
server.use(http.get(`${BASE_URL}/v1/deployments`, () => {
|
|
11
|
+
return HttpResponse.json(createDeploymentsListResponse());
|
|
12
|
+
}));
|
|
13
|
+
});
|
|
8
14
|
afterEach(() => server.resetHandlers());
|
|
9
15
|
afterAll(() => server.close());
|
|
10
16
|
describe("Deploy API", () => {
|
|
@@ -21,31 +27,41 @@ describe("Deploy API", () => {
|
|
|
21
27
|
],
|
|
22
28
|
connections: [],
|
|
23
29
|
};
|
|
30
|
+
// Helper to set up successful deploy flow
|
|
31
|
+
function setupSuccessfulDeployFlow(deploymentId = "deploy-abc") {
|
|
32
|
+
server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
|
|
33
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId, status: "pending" }));
|
|
34
|
+
}), http.get(`${BASE_URL}/v1/deployments/${deploymentId}`, () => {
|
|
35
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId, status: "data_ready" }));
|
|
36
|
+
}), http.post(`${BASE_URL}/v1/deployments/${deploymentId}/set-live`, () => {
|
|
37
|
+
return HttpResponse.json(createSetLiveSuccessResponse());
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
24
40
|
describe("deployToMain", () => {
|
|
25
|
-
it("successfully deploys resources", async () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
buildId: "deploy-abc",
|
|
29
|
-
newPipes: ["top_events"],
|
|
30
|
-
newDatasources: ["events"],
|
|
31
|
-
}));
|
|
32
|
-
}));
|
|
33
|
-
const result = await deployToMain(config, resources);
|
|
41
|
+
it("successfully deploys resources with full flow", async () => {
|
|
42
|
+
setupSuccessfulDeployFlow("deploy-abc");
|
|
43
|
+
const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
|
|
34
44
|
expect(result.success).toBe(true);
|
|
35
45
|
expect(result.result).toBe("success");
|
|
36
46
|
expect(result.buildId).toBe("deploy-abc");
|
|
37
47
|
expect(result.datasourceCount).toBe(1);
|
|
38
48
|
expect(result.pipeCount).toBe(1);
|
|
39
|
-
expect(result.pipes?.created).toEqual(["top_events"]);
|
|
40
|
-
expect(result.datasources?.created).toEqual(["events"]);
|
|
41
49
|
});
|
|
42
|
-
it("
|
|
50
|
+
it("polls until deployment is ready", async () => {
|
|
51
|
+
let pollCount = 0;
|
|
43
52
|
server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
|
|
44
|
-
return HttpResponse.json(
|
|
53
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-poll", status: "pending" }));
|
|
54
|
+
}), http.get(`${BASE_URL}/v1/deployments/deploy-poll`, () => {
|
|
55
|
+
pollCount++;
|
|
56
|
+
// Return pending for first 2 polls, then data_ready
|
|
57
|
+
const status = pollCount < 3 ? "pending" : "data_ready";
|
|
58
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-poll", status }));
|
|
59
|
+
}), http.post(`${BASE_URL}/v1/deployments/deploy-poll/set-live`, () => {
|
|
60
|
+
return HttpResponse.json(createSetLiveSuccessResponse());
|
|
45
61
|
}));
|
|
46
|
-
const result = await deployToMain(config, resources);
|
|
62
|
+
const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
|
|
47
63
|
expect(result.success).toBe(true);
|
|
48
|
-
expect(
|
|
64
|
+
expect(pollCount).toBe(3);
|
|
49
65
|
});
|
|
50
66
|
it("handles deploy failure with single error", async () => {
|
|
51
67
|
server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
|
|
@@ -89,31 +105,63 @@ describe("Deploy API", () => {
|
|
|
89
105
|
let capturedUrl = null;
|
|
90
106
|
server.use(http.post(`${BASE_URL}/v1/deploy`, ({ request }) => {
|
|
91
107
|
capturedUrl = request.url;
|
|
92
|
-
return HttpResponse.json(
|
|
108
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-url-test" }));
|
|
109
|
+
}), http.get(`${BASE_URL}/v1/deployments/deploy-url-test`, () => {
|
|
110
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-url-test", status: "data_ready" }));
|
|
111
|
+
}), http.post(`${BASE_URL}/v1/deployments/deploy-url-test/set-live`, () => {
|
|
112
|
+
return HttpResponse.json(createSetLiveSuccessResponse());
|
|
93
113
|
}));
|
|
94
|
-
await deployToMain(config, resources);
|
|
114
|
+
await deployToMain(config, resources, { pollIntervalMs: 1 });
|
|
95
115
|
expect(capturedUrl).toBe(`${BASE_URL}/v1/deploy`);
|
|
96
116
|
});
|
|
97
|
-
it("
|
|
117
|
+
it("handles failed deployment status", async () => {
|
|
98
118
|
server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
|
|
99
|
-
return HttpResponse.json(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}));
|
|
119
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-fail", status: "pending" }));
|
|
120
|
+
}), http.get(`${BASE_URL}/v1/deployments/deploy-fail`, () => {
|
|
121
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-fail", status: "failed" }));
|
|
103
122
|
}));
|
|
104
|
-
const result = await deployToMain(config, resources);
|
|
105
|
-
expect(result.
|
|
106
|
-
expect(result.
|
|
123
|
+
const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
|
|
124
|
+
expect(result.success).toBe(false);
|
|
125
|
+
expect(result.error).toContain("Deployment failed with status: failed");
|
|
126
|
+
});
|
|
127
|
+
it("handles set-live failure", async () => {
|
|
128
|
+
server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
|
|
129
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-setlive-fail" }));
|
|
130
|
+
}), http.get(`${BASE_URL}/v1/deployments/deploy-setlive-fail`, () => {
|
|
131
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-setlive-fail", status: "data_ready" }));
|
|
132
|
+
}), http.post(`${BASE_URL}/v1/deployments/deploy-setlive-fail/set-live`, () => {
|
|
133
|
+
return HttpResponse.json({ error: "Set live failed" }, { status: 500 });
|
|
134
|
+
}));
|
|
135
|
+
const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
|
|
136
|
+
expect(result.success).toBe(false);
|
|
137
|
+
expect(result.error).toContain("Failed to set deployment as live");
|
|
107
138
|
});
|
|
108
139
|
it("normalizes baseUrl with trailing slash", async () => {
|
|
109
140
|
let capturedUrl = null;
|
|
110
141
|
server.use(http.post(`${BASE_URL}/v1/deploy`, ({ request }) => {
|
|
111
142
|
capturedUrl = request.url;
|
|
112
|
-
return HttpResponse.json(
|
|
143
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-slash" }));
|
|
144
|
+
}), http.get(`${BASE_URL}/v1/deployments/deploy-slash`, () => {
|
|
145
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-slash", status: "data_ready" }));
|
|
146
|
+
}), http.post(`${BASE_URL}/v1/deployments/deploy-slash/set-live`, () => {
|
|
147
|
+
return HttpResponse.json(createSetLiveSuccessResponse());
|
|
113
148
|
}));
|
|
114
|
-
await deployToMain({ ...config, baseUrl: `${BASE_URL}/` }, resources);
|
|
149
|
+
await deployToMain({ ...config, baseUrl: `${BASE_URL}/` }, resources, { pollIntervalMs: 1 });
|
|
115
150
|
expect(capturedUrl).toBe(`${BASE_URL}/v1/deploy`);
|
|
116
151
|
});
|
|
152
|
+
it("times out when deployment never becomes ready", async () => {
|
|
153
|
+
server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
|
|
154
|
+
return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-timeout", status: "pending" }));
|
|
155
|
+
}), http.get(`${BASE_URL}/v1/deployments/deploy-timeout`, () => {
|
|
156
|
+
return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-timeout", status: "pending" }));
|
|
157
|
+
}));
|
|
158
|
+
const result = await deployToMain(config, resources, {
|
|
159
|
+
pollIntervalMs: 1,
|
|
160
|
+
maxPollAttempts: 3,
|
|
161
|
+
});
|
|
162
|
+
expect(result.success).toBe(false);
|
|
163
|
+
expect(result.error).toContain("Deployment timed out");
|
|
164
|
+
});
|
|
117
165
|
});
|
|
118
166
|
});
|
|
119
167
|
//# sourceMappingURL=deploy.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.test.js","sourceRoot":"","sources":["../../src/api/deploy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy.test.js","sourceRoot":"","sources":["../../src/api/deploy.test.ts"],"names":[],"mappings":"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"}
|