@tinybirdco/sdk 0.0.51 → 0.0.53

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 CHANGED
@@ -393,8 +393,13 @@ Deploy resources to the main Tinybird workspace (production). This is the only w
393
393
  ```bash
394
394
  tinybird deploy
395
395
  tinybird deploy --dry-run # Preview without pushing
396
+ tinybird deploy --check # Validate with the API without applying changes
397
+ tinybird deploy --allow-destructive-operations # Allow deletes in main deploy
396
398
  ```
397
399
 
400
+ Use `--allow-destructive-operations` only when your deploy intentionally removes
401
+ existing datasources, pipes, or connections from the main workspace.
402
+
398
403
  ### `tinybird pull`
399
404
 
400
405
  Download all cloud resources as native Tinybird datafiles (`.datasource`, `.pipe`, `.connection`).
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Deploy resources to Tinybird main workspace
3
- * Uses the /v1/deploy endpoint to create a deployment, then sets it live
3
+ * Uses the /v1/deploy endpoint with auto-promotion enabled
4
4
  */
5
5
  import type { GeneratedResources } from "../generator/index.js";
6
6
  import type { BuildConfig, BuildApiResult } from "./build.js";
@@ -23,12 +23,6 @@ export interface Deployment {
23
23
  updated_at?: string;
24
24
  feedback?: DeploymentFeedback[];
25
25
  }
26
- /**
27
- * Response from /v1/deployments list endpoint
28
- */
29
- export interface DeploymentsListResponse {
30
- deployments: Deployment[];
31
- }
32
26
  /**
33
27
  * Response from /v1/deploy endpoint
34
28
  */
@@ -41,6 +35,13 @@ export interface DeployResponse {
41
35
  error: string;
42
36
  }>;
43
37
  }
38
+ /**
39
+ * Response from /v1/deployments/{id} endpoint
40
+ */
41
+ export interface DeploymentStatusResponse {
42
+ result: string;
43
+ deployment: Deployment;
44
+ }
44
45
  /**
45
46
  * Detailed deployment information with resource changes
46
47
  */
@@ -69,20 +70,11 @@ export interface DeploymentDetails extends Deployment {
69
70
  error: string;
70
71
  }>;
71
72
  }
72
- /**
73
- * Response from /v1/deployments/{id} endpoint
74
- */
75
- export interface DeploymentStatusResponse {
76
- result: string;
77
- deployment: Deployment;
78
- }
79
73
  /**
80
74
  * Deploy generated resources to Tinybird main workspace
81
75
  *
82
76
  * Uses the /v1/deploy endpoint which accepts all resources in a single
83
- * multipart form request. After creating the deployment, this function:
84
- * 1. Polls until the deployment is ready (status === 'data_ready')
85
- * 2. Sets the deployment as live via /v1/deployments/{id}/set-live
77
+ * multipart form request.
86
78
  *
87
79
  * @param config - Build configuration with API URL and token
88
80
  * @param resources - Generated resources to deploy
@@ -150,6 +142,7 @@ export declare function deployToMain(config: BuildConfig, resources: GeneratedRe
150
142
  pollIntervalMs?: number;
151
143
  maxPollAttempts?: number;
152
144
  check?: boolean;
145
+ autoPromote?: boolean;
153
146
  allowDestructiveOperations?: boolean;
154
147
  callbacks?: DeployCallbacks;
155
148
  }): Promise<BuildApiResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"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"}
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;AAM9D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;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;IACpB,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC5C,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,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;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,yCAAyC;IACzC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,mCAAmC;IACnC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,mCAAmC;IACnC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B;IAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,6BAA6B;IAC7B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,yCAAyC;IACzC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,mCAAmC;IACnC,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;IACxC,mCAAmC;IACnC,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;IACxC,wBAAwB;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH;;GAEG;AACH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,WAAW,EAAE;QACX,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,yCAAyC;IACzC,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,kBAAkB,EAC7B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B,GACA,OAAO,CAAC,cAAc,CAAC,CAuWzB"}
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Deploy resources to Tinybird main workspace
3
- * Uses the /v1/deploy endpoint to create a deployment, then sets it live
3
+ * Uses the /v1/deploy endpoint with auto-promotion enabled
4
4
  */
5
5
  import { tinybirdFetch } from "./fetcher.js";
6
+ const FORWARD_CLASSIC_GUIDANCE = "Use the Tinybird Classic CLI (`tb`) from a Tinybird Classic workspace for this operation.";
6
7
  export async function deployToMain(config, resources, options) {
7
8
  const debug = options?.debug ?? !!process.env.TINYBIRD_DEBUG;
8
9
  const pollIntervalMs = options?.pollIntervalMs ?? 1000;
9
- const maxPollAttempts = options?.maxPollAttempts ?? 120; // 2 minutes max
10
+ const maxPollAttempts = options?.maxPollAttempts ?? 120;
10
11
  const baseUrl = config.baseUrl.replace(/\/$/, "");
11
12
  const formData = new FormData();
12
13
  // Add datasources
@@ -29,42 +30,17 @@ export async function deployToMain(config, resources, options) {
29
30
  }
30
31
  formData.append(fieldName, new Blob([pipe.content], { type: "text/plain" }), fileName);
31
32
  }
32
- // Step 0: Clean up any stale non-live deployments that might block the new deployment
33
- try {
34
- const deploymentsUrl = `${baseUrl}/v1/deployments`;
35
- const deploymentsResponse = await tinybirdFetch(deploymentsUrl, {
36
- headers: {
37
- Authorization: `Bearer ${config.token}`,
38
- },
39
- });
40
- if (deploymentsResponse.ok) {
41
- const deploymentsBody = (await deploymentsResponse.json());
42
- const staleDeployments = deploymentsBody.deployments.filter((d) => !d.live && d.status !== "live");
43
- for (const stale of staleDeployments) {
44
- if (debug) {
45
- console.log(`[debug] Cleaning up stale deployment: ${stale.id} (status: ${stale.status})`);
46
- }
47
- await tinybirdFetch(`${baseUrl}/v1/deployments/${stale.id}`, {
48
- method: "DELETE",
49
- headers: {
50
- Authorization: `Bearer ${config.token}`,
51
- },
52
- });
53
- }
54
- }
55
- }
56
- catch (e) {
57
- // Ignore errors during cleanup - we'll try to deploy anyway
58
- if (debug) {
59
- console.log(`[debug] Failed to clean up stale deployments: ${e}`);
60
- }
61
- }
62
- // Step 1: Create deployment via /v1/deploy
33
+ // Create deployment via /v1/deploy.
34
+ // `auto_promote=true` makes the API promote the deployment automatically.
63
35
  const deployUrlBase = `${baseUrl}/v1/deploy`;
64
36
  const urlParams = new URLSearchParams();
65
37
  if (options?.check) {
66
38
  urlParams.set("check", "true");
67
39
  }
40
+ const autoPromote = options?.autoPromote ?? !options?.check;
41
+ if (autoPromote) {
42
+ urlParams.set("auto_promote", "true");
43
+ }
68
44
  if (options?.allowDestructiveOperations) {
69
45
  urlParams.set("allow_destructive_operations", "true");
70
46
  }
@@ -99,7 +75,7 @@ export async function deployToMain(config, resources, options) {
99
75
  .map((f) => {
100
76
  // Extract just the filename from "Datasource events.datasource" format
101
77
  const resourceName = f.resource.split(" ").pop() ?? f.resource;
102
- return `${resourceName}: ${f.message}`;
78
+ return `${resourceName}: ${normalizeDeployErrorMessage(f.message)}`;
103
79
  })
104
80
  .join("\n");
105
81
  };
@@ -116,12 +92,12 @@ export async function deployToMain(config, resources, options) {
116
92
  return body.errors
117
93
  .map((e) => {
118
94
  const prefix = e.filename ? `[${e.filename}] ` : "";
119
- return `${prefix}${e.error}`;
95
+ return `${prefix}${normalizeDeployErrorMessage(e.error)}`;
120
96
  })
121
97
  .join("\n");
122
98
  }
123
99
  if (body.error) {
124
- return body.error;
100
+ return normalizeDeployErrorMessage(body.error);
125
101
  }
126
102
  // Include raw response body for debugging when no structured error is available
127
103
  return `HTTP ${response.status}: ${response.statusText}\nResponse: ${rawBody}`;
@@ -213,15 +189,17 @@ export async function deployToMain(config, resources, options) {
213
189
  },
214
190
  });
215
191
  }
216
- // Step 2: Poll until deployment is ready
217
- let deployment = body.deployment;
218
- let attempts = 0;
192
+ let deployment = deploymentDetails;
193
+ let statusAttempts = 0;
219
194
  options?.callbacks?.onWaitingForReady?.();
220
- while (deployment.status !== "data_ready" && attempts < maxPollAttempts) {
195
+ while (deployment.status !== "data_ready" &&
196
+ deployment.status !== "failed" &&
197
+ deployment.status !== "error" &&
198
+ statusAttempts < maxPollAttempts) {
221
199
  await sleep(pollIntervalMs);
222
- attempts++;
200
+ statusAttempts++;
223
201
  if (debug) {
224
- console.log(`[debug] Polling deployment status (attempt ${attempts})...`);
202
+ console.log(`[debug] Polling deployment status (attempt ${statusAttempts})...`);
225
203
  }
226
204
  const statusUrl = `${baseUrl}/v1/deployments/${deploymentId}`;
227
205
  const statusResponse = await tinybirdFetch(statusUrl, {
@@ -242,61 +220,79 @@ export async function deployToMain(config, resources, options) {
242
220
  }
243
221
  const statusBody = (await statusResponse.json());
244
222
  deployment = statusBody.deployment;
245
- if (debug) {
246
- console.log(`[debug] Deployment status: ${deployment.status}`);
247
- }
248
- // Check for failed status
249
- if (deployment.status === "failed" || deployment.status === "error") {
250
- return {
251
- success: false,
252
- result: "failed",
253
- error: `Deployment failed with status: ${deployment.status}`,
254
- datasourceCount: resources.datasources.length,
255
- pipeCount: resources.pipes.length,
256
- connectionCount: resources.connections?.length ?? 0,
257
- buildId: deploymentId,
258
- };
259
- }
260
223
  }
261
- if (deployment.status !== "data_ready") {
224
+ if (deployment.status === "failed" || deployment.status === "error") {
262
225
  return {
263
226
  success: false,
264
227
  result: "failed",
265
- error: `Deployment timed out after ${maxPollAttempts} attempts. Last status: ${deployment.status}`,
228
+ error: `Deployment failed with status: ${deployment.status}`,
266
229
  datasourceCount: resources.datasources.length,
267
230
  pipeCount: resources.pipes.length,
268
231
  connectionCount: resources.connections?.length ?? 0,
269
232
  buildId: deploymentId,
270
233
  };
271
234
  }
272
- options?.callbacks?.onDeploymentReady?.();
273
- // Step 3: Set the deployment as live
274
- const setLiveUrl = `${baseUrl}/v1/deployments/${deploymentId}/set-live`;
275
- if (debug) {
276
- console.log(`[debug] POST ${setLiveUrl}`);
277
- }
278
- const setLiveResponse = await tinybirdFetch(setLiveUrl, {
279
- method: "POST",
280
- headers: {
281
- Authorization: `Bearer ${config.token}`,
282
- },
283
- });
284
- if (!setLiveResponse.ok) {
285
- const setLiveBody = await setLiveResponse.text();
235
+ if (deployment.status !== "data_ready") {
286
236
  return {
287
237
  success: false,
288
238
  result: "failed",
289
- error: `Failed to set deployment as live: ${setLiveResponse.status} ${setLiveResponse.statusText}\n${setLiveBody}`,
239
+ error: `Deployment timed out after ${maxPollAttempts} attempts. Last status: ${deployment.status}`,
290
240
  datasourceCount: resources.datasources.length,
291
241
  pipeCount: resources.pipes.length,
292
242
  connectionCount: resources.connections?.length ?? 0,
293
243
  buildId: deploymentId,
294
244
  };
295
245
  }
246
+ options?.callbacks?.onDeploymentReady?.();
247
+ if (autoPromote && !deployment.live) {
248
+ let promotionAttempts = 0;
249
+ options?.callbacks?.onWaitingForPromote?.();
250
+ while (!deployment.live && promotionAttempts < maxPollAttempts) {
251
+ await sleep(pollIntervalMs);
252
+ promotionAttempts++;
253
+ if (debug) {
254
+ console.log(`[debug] Polling auto-promote status (attempt ${promotionAttempts})...`);
255
+ }
256
+ const statusUrl = `${baseUrl}/v1/deployments/${deploymentId}`;
257
+ const statusResponse = await tinybirdFetch(statusUrl, {
258
+ headers: {
259
+ Authorization: `Bearer ${config.token}`,
260
+ },
261
+ });
262
+ if (!statusResponse.ok) {
263
+ return {
264
+ success: false,
265
+ result: "failed",
266
+ error: `Failed to check deployment status: ${statusResponse.status} ${statusResponse.statusText}`,
267
+ datasourceCount: resources.datasources.length,
268
+ pipeCount: resources.pipes.length,
269
+ connectionCount: resources.connections?.length ?? 0,
270
+ buildId: deploymentId,
271
+ };
272
+ }
273
+ const statusBody = (await statusResponse.json());
274
+ deployment = statusBody.deployment;
275
+ }
276
+ if (!deployment.live) {
277
+ return {
278
+ success: false,
279
+ result: "failed",
280
+ error: `Deployment reached data_ready but auto-promote did not complete after ${maxPollAttempts} attempts`,
281
+ datasourceCount: resources.datasources.length,
282
+ pipeCount: resources.pipes.length,
283
+ connectionCount: resources.connections?.length ?? 0,
284
+ buildId: deploymentId,
285
+ };
286
+ }
287
+ options?.callbacks?.onDeploymentPromoted?.();
288
+ }
296
289
  if (debug) {
297
- console.log(`[debug] Deployment ${deploymentId} is now live`);
290
+ const stateLabel = deployment.live ? "live" : "ready";
291
+ console.log(`[debug] Deployment ${deploymentId} is now ${stateLabel}`);
292
+ }
293
+ if (deployment.live) {
294
+ options?.callbacks?.onDeploymentLive?.(deploymentId);
298
295
  }
299
- options?.callbacks?.onDeploymentLive?.(deploymentId);
300
296
  return {
301
297
  success: true,
302
298
  result: "success",
@@ -316,10 +312,16 @@ export async function deployToMain(config, resources, options) {
316
312
  },
317
313
  };
318
314
  }
319
- /**
320
- * Helper function to sleep for a given number of milliseconds
321
- */
322
315
  function sleep(ms) {
323
316
  return new Promise((resolve) => setTimeout(resolve, ms));
324
317
  }
318
+ function normalizeDeployErrorMessage(message) {
319
+ const trimmedMessage = message.trim();
320
+ const isForwardClassicError = trimmedMessage.includes("Tinybird Forward workspace") &&
321
+ trimmedMessage.includes("Tinybird Classic workspaces");
322
+ if (!isForwardClassicError || trimmedMessage.includes(FORWARD_CLASSIC_GUIDANCE)) {
323
+ return message;
324
+ }
325
+ return `${trimmedMessage}\n${FORWARD_CLASSIC_GUIDANCE}`;
326
+ }
325
327
  //# sourceMappingURL=deploy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/api/deploy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,wBAAwB,GAC5B,2FAA2F,CAAC;AAwI9F,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAmB,EACnB,SAA6B,EAC7B,OAQC;IAED,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7D,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC;IACvD,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,GAAG,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAEhC,kBAAkB;IAClB,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,iBAAiB,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,8BAA8B,SAAS,eAAe,QAAQ,GAAG,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,OAAO,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,QAAQ,CAAC,MAAM,CACb,SAAS,EACT,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAC9C,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,iBAAiB,CAAC;QACpC,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,eAAe,QAAQ,GAAG,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,QAAQ,CAAC,MAAM,CACb,SAAS,EACT,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAChD,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,0EAA0E;IAC1E,MAAM,aAAa,GAAG,GAAG,OAAO,YAAY,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;IAC5D,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,EAAE,0BAA0B,EAAE,CAAC;QACxC,SAAS,CAAC,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;IAElF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE;QAC9C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;SACxC;QACD,IAAI,EAAE,QAAQ;KACf,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,IAAoB,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEtC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+CAA+C,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,WAAW,OAAO,EAAE,CAC1G,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,cAAc,GAAG,CAAC,QAA8B,EAAU,EAAE;QAChE,OAAO,QAAQ;aACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,uEAAuE;YACvE,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC;YAC/D,OAAO,GAAG,YAAY,KAAK,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACtE,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,0BAA0B;IAC1B,MAAM,YAAY,GAAG,GAAW,EAAE;QAChC,8DAA8D;QAC9D,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;YAC3E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,MAAM;iBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,OAAO,GAAG,MAAM,GAAG,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,gFAAgF;QAChF,OAAO,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,eAAe,OAAO,EAAE,CAAC;IACjF,CAAC,CAAC;IAEF,0BAA0B;IAC1B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,YAAY,EAAE;YACrB,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;YAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC;QAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,YAAY,EAAE;gBACrB,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;gBAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;gBACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;aACpD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;YAChC,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;YAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,YAAY;YACpB,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;YAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;YACnD,KAAK,EAAE;gBACL,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;aACZ;YACD,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE,EAAE;aACZ;SACF,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACjD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,YAAY,EAAE;YACrB,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;YAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IACxC,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC;IAE1C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,+DAA+D;IAC/D,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;YAC1B,WAAW,EAAE;gBACX,OAAO,EAAE,iBAAiB,CAAC,oBAAoB,IAAI,EAAE;gBACrD,OAAO,EAAE,iBAAiB,CAAC,wBAAwB,IAAI,EAAE;gBACzD,OAAO,EAAE,iBAAiB,CAAC,wBAAwB,IAAI,EAAE;aAC1D;YACD,KAAK,EAAE;gBACL,OAAO,EAAE,iBAAiB,CAAC,cAAc,IAAI,EAAE;gBAC/C,OAAO,EAAE,iBAAiB,CAAC,kBAAkB,IAAI,EAAE;gBACnD,OAAO,EAAE,iBAAiB,CAAC,kBAAkB,IAAI,EAAE;aACpD;YACD,WAAW,EAAE;gBACX,OAAO,EAAE,iBAAiB,CAAC,wBAAwB,IAAI,EAAE;gBACzD,OAAO,EAAE,iBAAiB,CAAC,4BAA4B,IAAI,EAAE;gBAC7D,OAAO,EAAE,iBAAiB,CAAC,4BAA4B,IAAI,EAAE;aAC9D;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,UAAU,GAAG,iBAAiB,CAAC;IACnC,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAE1C,OACE,UAAU,CAAC,MAAM,KAAK,YAAY;QAClC,UAAU,CAAC,MAAM,KAAK,QAAQ;QAC9B,UAAU,CAAC,MAAM,KAAK,OAAO;QAC7B,cAAc,GAAG,eAAe,EAChC,CAAC;QACD,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;QAC5B,cAAc,EAAE,CAAC;QAEjB,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,8CAA8C,cAAc,MAAM,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,OAAO,mBAAmB,YAAY,EAAE,CAAC;QAC9D,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE;YACpD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;aACxC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,sCAAsC,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE;gBACjG,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;gBAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;gBACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;gBACnD,OAAO,EAAE,YAAY;aACtB,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAA6B,CAAC;QAC7E,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;IACrC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,kCAAkC,UAAU,CAAC,MAAM,EAAE;YAC5D,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;YAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;YACnD,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,8BAA8B,eAAe,2BAA2B,UAAU,CAAC,MAAM,EAAE;YAClG,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;YAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;YACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;YACnD,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,CAAC;IAE1C,IAAI,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,CAAC;QAE5C,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,iBAAiB,GAAG,eAAe,EAAE,CAAC;YAC/D,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;YAC5B,iBAAiB,EAAE,CAAC;YAEpB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,gDAAgD,iBAAiB,MAAM,CAAC,CAAC;YACvF,CAAC;YAED,MAAM,SAAS,GAAG,GAAG,OAAO,mBAAmB,YAAY,EAAE,CAAC;YAC9D,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE;gBACpD,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;iBACxC;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,sCAAsC,cAAc,CAAC,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE;oBACjG,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;oBAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;oBACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;oBACnD,OAAO,EAAE,YAAY;iBACtB,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,CAA6B,CAAC;YAC7E,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,yEAAyE,eAAe,WAAW;gBAC1G,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;gBAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;gBACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;gBACnD,OAAO,EAAE,YAAY;aACtB,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,YAAY,WAAW,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,SAAS;QACjB,eAAe,EAAE,SAAS,CAAC,WAAW,CAAC,MAAM;QAC7C,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM;QACjC,eAAe,EAAE,SAAS,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;QACnD,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE;YACL,OAAO,EAAE,iBAAiB,CAAC,kBAAkB,IAAI,EAAE;YACnD,OAAO,EAAE,iBAAiB,CAAC,cAAc,IAAI,EAAE;YAC/C,OAAO,EAAE,iBAAiB,CAAC,kBAAkB,IAAI,EAAE;SACpD;QACD,WAAW,EAAE;YACX,OAAO,EAAE,iBAAiB,CAAC,wBAAwB,IAAI,EAAE;YACzD,OAAO,EAAE,iBAAiB,CAAC,oBAAoB,IAAI,EAAE;YACrD,OAAO,EAAE,iBAAiB,CAAC,wBAAwB,IAAI,EAAE;SAC1D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,qBAAqB,GACzB,cAAc,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACrD,cAAc,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC;IAEzD,IAAI,CAAC,qBAAqB,IAAI,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAChF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,GAAG,cAAc,KAAK,wBAAwB,EAAE,CAAC;AAC1D,CAAC"}
@@ -1,16 +1,10 @@
1
- import { describe, it, expect, beforeAll, beforeEach, afterEach, afterAll } from "vitest";
1
+ import { describe, it, expect, beforeAll, afterEach, afterAll, vi } 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, createDeploySuccessResponse, createDeploymentStatusResponse, createSetLiveSuccessResponse, createBuildFailureResponse, createBuildMultipleErrorsResponse, createDeploymentsListResponse, } from "../test/handlers.js";
5
+ import { BASE_URL, createDeploySuccessResponse, createBuildFailureResponse, createBuildMultipleErrorsResponse, } 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
- });
14
8
  afterEach(() => server.resetHandlers());
15
9
  afterAll(() => server.close());
16
10
  describe("Deploy API", () => {
@@ -19,53 +13,44 @@ describe("Deploy API", () => {
19
13
  token: "p.test-token",
20
14
  };
21
15
  const resources = {
22
- datasources: [
23
- { name: "events", content: "SCHEMA > timestamp DateTime" },
24
- ],
25
- pipes: [
26
- { name: "top_events", content: "NODE main\nSQL > SELECT * FROM events" },
27
- ],
16
+ datasources: [{ name: "events", content: "SCHEMA > timestamp DateTime" }],
17
+ pipes: [{ name: "top_events", content: "NODE main\nSQL > SELECT * FROM events" }],
28
18
  connections: [],
29
19
  };
30
- // Helper to set up successful deploy flow
31
- function setupSuccessfulDeployFlow(deploymentId = "deploy-abc") {
20
+ function setupAutoPromoteSuccessFlow(deploymentId = "deploy-abc") {
32
21
  server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
33
22
  return HttpResponse.json(createDeploySuccessResponse({ deploymentId, status: "pending" }));
34
23
  }), 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());
24
+ return HttpResponse.json({
25
+ result: "success",
26
+ deployment: {
27
+ id: deploymentId,
28
+ status: "data_ready",
29
+ live: true,
30
+ },
31
+ });
38
32
  }));
39
33
  }
40
34
  describe("deployToMain", () => {
41
- it("successfully deploys resources with full flow", async () => {
42
- setupSuccessfulDeployFlow("deploy-abc");
43
- const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
35
+ it("successfully deploys resources with auto-promote flow", async () => {
36
+ setupAutoPromoteSuccessFlow("deploy-abc");
37
+ const onDeploymentLive = vi.fn();
38
+ const result = await deployToMain(config, resources, {
39
+ pollIntervalMs: 1,
40
+ callbacks: { onDeploymentLive },
41
+ });
44
42
  expect(result.success).toBe(true);
45
43
  expect(result.result).toBe("success");
46
44
  expect(result.buildId).toBe("deploy-abc");
47
45
  expect(result.datasourceCount).toBe(1);
48
46
  expect(result.pipeCount).toBe(1);
49
- });
50
- it("polls until deployment is ready", async () => {
51
- let pollCount = 0;
52
- server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
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());
61
- }));
62
- const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
63
- expect(result.success).toBe(true);
64
- expect(pollCount).toBe(3);
47
+ expect(onDeploymentLive).toHaveBeenCalledWith("deploy-abc");
65
48
  });
66
49
  it("handles deploy failure with single error", async () => {
67
50
  server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
68
- return HttpResponse.json(createBuildFailureResponse("Permission denied"), { status: 200 });
51
+ return HttpResponse.json(createBuildFailureResponse("Permission denied"), {
52
+ status: 200,
53
+ });
69
54
  }));
70
55
  const result = await deployToMain(config, resources);
71
56
  expect(result.success).toBe(false);
@@ -101,70 +86,82 @@ describe("Deploy API", () => {
101
86
  }));
102
87
  await expect(deployToMain(config, resources)).rejects.toThrow("Failed to parse response");
103
88
  });
104
- it("uses /v1/deploy endpoint (not /v1/build)", async () => {
89
+ it("uses /v1/deploy endpoint and sends auto_promote by default", async () => {
105
90
  let capturedUrl = null;
106
91
  server.use(http.post(`${BASE_URL}/v1/deploy`, ({ request }) => {
107
92
  capturedUrl = request.url;
108
- return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-url-test" }));
93
+ return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-url-test", status: "pending" }));
109
94
  }), 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());
95
+ return HttpResponse.json({
96
+ result: "success",
97
+ deployment: { id: "deploy-url-test", status: "data_ready", live: true },
98
+ });
113
99
  }));
114
100
  await deployToMain(config, resources, { pollIntervalMs: 1 });
115
101
  const parsed = new URL(capturedUrl ?? "");
116
102
  expect(parsed.pathname).toBe("/v1/deploy");
117
103
  expect(parsed.searchParams.get("from")).toBe("ts-sdk");
104
+ expect(parsed.searchParams.get("auto_promote")).toBe("true");
118
105
  });
119
- it("handles failed deployment status", async () => {
120
- server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
121
- return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-fail", status: "pending" }));
122
- }), http.get(`${BASE_URL}/v1/deployments/deploy-fail`, () => {
123
- return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-fail", status: "failed" }));
106
+ it("passes allow_destructive_operations when explicitly enabled", async () => {
107
+ let capturedUrl = null;
108
+ server.use(http.post(`${BASE_URL}/v1/deploy`, ({ request }) => {
109
+ capturedUrl = request.url;
110
+ return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-destructive", status: "pending" }));
111
+ }), http.get(`${BASE_URL}/v1/deployments/deploy-destructive`, () => {
112
+ return HttpResponse.json({
113
+ result: "success",
114
+ deployment: { id: "deploy-destructive", status: "data_ready", live: true },
115
+ });
124
116
  }));
125
- const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
126
- expect(result.success).toBe(false);
127
- expect(result.error).toContain("Deployment failed with status: failed");
117
+ await deployToMain(config, resources, {
118
+ pollIntervalMs: 1,
119
+ allowDestructiveOperations: true,
120
+ });
121
+ const parsed = new URL(capturedUrl ?? "");
122
+ expect(parsed.searchParams.get("allow_destructive_operations")).toBe("true");
123
+ expect(parsed.searchParams.get("auto_promote")).toBe("true");
124
+ });
125
+ it("does not send auto_promote in check mode", async () => {
126
+ let capturedUrl = null;
127
+ server.use(http.post(`${BASE_URL}/v1/deploy`, ({ request }) => {
128
+ capturedUrl = request.url;
129
+ return HttpResponse.json({ result: "success" });
130
+ }));
131
+ const result = await deployToMain(config, resources, { check: true });
132
+ expect(result.success).toBe(true);
133
+ const parsed = new URL(capturedUrl ?? "");
134
+ expect(parsed.searchParams.get("check")).toBe("true");
135
+ expect(parsed.searchParams.get("auto_promote")).toBeNull();
128
136
  });
129
- it("handles set-live failure", async () => {
137
+ it("adds actionable guidance to Forward/Classic workspace errors", async () => {
130
138
  server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
131
- return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-setlive-fail" }));
132
- }), http.get(`${BASE_URL}/v1/deployments/deploy-setlive-fail`, () => {
133
- return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-setlive-fail", status: "data_ready" }));
134
- }), http.post(`${BASE_URL}/v1/deployments/deploy-setlive-fail/set-live`, () => {
135
- return HttpResponse.json({ error: "Set live failed" }, { status: 500 });
139
+ return HttpResponse.json({
140
+ result: "failed",
141
+ error: "This is a Tinybird Forward workspace, and this operation is only available for Tinybird Classic workspaces.",
142
+ }, { status: 400 });
136
143
  }));
137
- const result = await deployToMain(config, resources, { pollIntervalMs: 1 });
144
+ const result = await deployToMain(config, resources);
138
145
  expect(result.success).toBe(false);
139
- expect(result.error).toContain("Failed to set deployment as live");
146
+ expect(result.error).toContain("Tinybird Forward workspace");
147
+ expect(result.error).toContain("Use the Tinybird Classic CLI (`tb`) from a Tinybird Classic workspace for this operation.");
140
148
  });
141
149
  it("normalizes baseUrl with trailing slash", async () => {
142
150
  let capturedUrl = null;
143
151
  server.use(http.post(`${BASE_URL}/v1/deploy`, ({ request }) => {
144
152
  capturedUrl = request.url;
145
- return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-slash" }));
153
+ return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-slash", status: "pending" }));
146
154
  }), http.get(`${BASE_URL}/v1/deployments/deploy-slash`, () => {
147
- return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-slash", status: "data_ready" }));
148
- }), http.post(`${BASE_URL}/v1/deployments/deploy-slash/set-live`, () => {
149
- return HttpResponse.json(createSetLiveSuccessResponse());
155
+ return HttpResponse.json({
156
+ result: "success",
157
+ deployment: { id: "deploy-slash", status: "data_ready", live: true },
158
+ });
150
159
  }));
151
160
  await deployToMain({ ...config, baseUrl: `${BASE_URL}/` }, resources, { pollIntervalMs: 1 });
152
161
  const parsed = new URL(capturedUrl ?? "");
153
162
  expect(parsed.pathname).toBe("/v1/deploy");
154
163
  expect(parsed.searchParams.get("from")).toBe("ts-sdk");
155
- });
156
- it("times out when deployment never becomes ready", async () => {
157
- server.use(http.post(`${BASE_URL}/v1/deploy`, () => {
158
- return HttpResponse.json(createDeploySuccessResponse({ deploymentId: "deploy-timeout", status: "pending" }));
159
- }), http.get(`${BASE_URL}/v1/deployments/deploy-timeout`, () => {
160
- return HttpResponse.json(createDeploymentStatusResponse({ deploymentId: "deploy-timeout", status: "pending" }));
161
- }));
162
- const result = await deployToMain(config, resources, {
163
- pollIntervalMs: 1,
164
- maxPollAttempts: 3,
165
- });
166
- expect(result.success).toBe(false);
167
- expect(result.error).toContain("Deployment timed out");
164
+ expect(parsed.searchParams.get("auto_promote")).toBe("true");
168
165
  });
169
166
  });
170
167
  });