@tinybirdco/sdk 0.0.3 → 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 +87 -14
- 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/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/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 +6 -4
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +95 -47
- 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 +9 -2
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +60 -31
- 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/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 +107 -11
- 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/local.test.ts +250 -0
- package/src/api/local.ts +270 -0
- package/src/api/resources.test.ts +332 -0
- package/src/api/resources.ts +554 -0
- package/src/cli/commands/build.ts +115 -53
- package/src/cli/commands/deploy.ts +126 -0
- package/src/cli/commands/dev.ts +81 -36
- package/src/cli/commands/init.test.ts +239 -30
- package/src/cli/commands/init.ts +243 -26
- package/src/cli/config.test.ts +47 -0
- package/src/cli/config.ts +20 -0
- package/src/cli/index.ts +120 -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,28 +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
|
-
|
|
178
|
+
tinybird dev
|
|
179
|
+
tinybird dev --local # Sync with local Tinybird container
|
|
180
|
+
tinybird dev --branch # Explicitly use Tinybird cloud with branches
|
|
177
181
|
```
|
|
178
182
|
|
|
179
|
-
|
|
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`
|
|
180
186
|
|
|
181
|
-
|
|
187
|
+
Build and push resources to a Tinybird branch (not main).
|
|
182
188
|
|
|
183
189
|
```bash
|
|
184
|
-
|
|
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
|
|
185
222
|
```
|
|
186
223
|
|
|
187
224
|
## Configuration
|
|
@@ -192,16 +229,52 @@ Create a `tinybird.json` in your project root:
|
|
|
192
229
|
{
|
|
193
230
|
"include": [
|
|
194
231
|
"src/tinybird/datasources.ts",
|
|
195
|
-
"src/tinybird/pipes.ts"
|
|
232
|
+
"src/tinybird/pipes.ts",
|
|
233
|
+
"src/tinybird/legacy.datasource",
|
|
234
|
+
"src/tinybird/legacy.pipe"
|
|
196
235
|
],
|
|
197
236
|
"token": "${TINYBIRD_TOKEN}",
|
|
198
|
-
"baseUrl": "https://api.tinybird.co"
|
|
237
|
+
"baseUrl": "https://api.tinybird.co",
|
|
238
|
+
"devMode": "branch"
|
|
199
239
|
}
|
|
200
240
|
```
|
|
201
241
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
242
|
+
You can mix TypeScript files with raw `.datasource` and `.pipe` files for incremental migration.
|
|
243
|
+
|
|
244
|
+
### Configuration Options
|
|
245
|
+
|
|
246
|
+
| Option | Type | Default | Description |
|
|
247
|
+
|--------|------|---------|-------------|
|
|
248
|
+
| `include` | `string[]` | *required* | Array of TypeScript files or raw `.datasource`/`.pipe` files to include |
|
|
249
|
+
| `token` | `string` | *required* | API token. Supports `${ENV_VAR}` interpolation for environment variables |
|
|
250
|
+
| `baseUrl` | `string` | `"https://api.tinybird.co"` | Tinybird API URL. Use `"https://api.us-east.tinybird.co"` for US region |
|
|
251
|
+
| `devMode` | `"branch"` \| `"local"` | `"branch"` | Development mode. `"branch"` uses Tinybird cloud with branches, `"local"` uses local Docker container |
|
|
252
|
+
|
|
253
|
+
### Local Development Mode
|
|
254
|
+
|
|
255
|
+
Use a local Tinybird container for development without affecting your cloud workspace:
|
|
256
|
+
|
|
257
|
+
1. Start the local container:
|
|
258
|
+
```bash
|
|
259
|
+
docker run -d -p 7181:7181 --name tinybird-local tinybirdco/tinybird-local:latest
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
2. Configure your project:
|
|
263
|
+
```json
|
|
264
|
+
{
|
|
265
|
+
"devMode": "local"
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Or use the CLI flag:
|
|
270
|
+
```bash
|
|
271
|
+
npx tinybird dev --local
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
In local mode:
|
|
275
|
+
- Tokens are automatically obtained from the local container
|
|
276
|
+
- A workspace is created per git branch
|
|
277
|
+
- No cloud authentication required
|
|
205
278
|
|
|
206
279
|
## Defining Resources
|
|
207
280
|
|
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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"}
|