@keboola/api-fixtures 22.0.0 → 27.0.0

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/dist/index.cjs CHANGED
@@ -1,394 +1,974 @@
1
- 'use strict';
2
-
3
- // src/clients/apps/deployments.ts
4
- var APP_ID = "374811";
5
- var deploymentId = (hash) => `app-${APP_ID}-dpl-${hash}`;
6
- var archivedDeployment = {
7
- id: deploymentId("350e2cf5287c5665"),
8
- number: 1,
9
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
10
- configVersion: "14",
11
- gitCommitSha: null,
12
- size: "tiny",
13
- buildState: "PREBUILT",
14
- runState: "STOPPED",
15
- archived: true,
16
- archivedAt: "2026-08-15T11:03:02+00:00",
17
- createdAt: "2026-08-10T09:12:44+00:00"
18
- };
19
- var liveDeployment = {
20
- id: deploymentId("7a4c1b9e0d3f2a81"),
21
- number: 2,
22
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
23
- configVersion: "16",
24
- gitCommitSha: null,
25
- size: "small",
26
- buildState: "PREBUILT",
27
- runState: "RUNNING",
28
- archived: false,
29
- archivedAt: null,
30
- createdAt: "2026-08-15T11:02:58+00:00"
31
- };
32
- var stagedDeployment = {
33
- id: deploymentId("c5e83f17b204de96"),
34
- number: 3,
35
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
36
- configVersion: "18",
37
- gitCommitSha: null,
38
- size: "small",
39
- buildState: "PREBUILT",
40
- runState: "NEVER_RUN",
41
- archived: false,
42
- archivedAt: null,
43
- createdAt: "2026-08-17T08:41:19+00:00"
44
- };
45
- var buildFailedDeployment = {
46
- id: deploymentId("e91d47a8c6b02f35"),
47
- number: 4,
48
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
49
- configVersion: "19",
50
- gitCommitSha: null,
51
- size: "small",
52
- buildState: "FAILED",
53
- runState: "NEVER_RUN",
54
- archived: false,
55
- archivedAt: null,
56
- createdAt: "2026-08-17T09:05:33+00:00"
57
- };
58
- var runFailedDeployment = {
59
- id: deploymentId("2b6f0a94e7d51c83"),
60
- number: 5,
61
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
62
- configVersion: "20",
63
- gitCommitSha: null,
64
- size: "small",
65
- buildState: "PREBUILT",
66
- runState: "FAILED",
67
- archived: false,
68
- archivedAt: null,
69
- createdAt: "2026-08-17T09:31:07+00:00"
70
- };
71
- var deploymentFixtures = {
72
- archived: archivedDeployment,
73
- live: liveDeployment,
74
- staged: stagedDeployment,
75
- buildFailed: buildFailedDeployment,
76
- runFailed: runFailedDeployment
77
- };
78
- var getDeployment = () => liveDeployment;
79
- var listDeployments = () => [
80
- archivedDeployment,
81
- liveDeployment,
82
- stagedDeployment,
83
- buildFailedDeployment,
84
- runFailedDeployment
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _keboola_api_client_constants = require("@keboola/api-client/constants");
3
+ //#region src/clients/apps/deployments.ts
4
+ /**
5
+ * Deployment ids are the deterministic Kubernetes CR name — `app-{appId}-dpl-{hash}` —
6
+ * so they are reproduced in that shape rather than as opaque strings.
7
+ */
8
+ const APP_ID = "374811";
9
+ const deploymentId = (hash) => `app-${APP_ID}-dpl-${hash}`;
10
+ const archivedDeployment = {
11
+ id: deploymentId("350e2cf5287c5665"),
12
+ number: 1,
13
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
14
+ configVersion: "14",
15
+ gitCommitSha: null,
16
+ size: "tiny",
17
+ buildState: "PREBUILT",
18
+ runState: "STOPPED",
19
+ archived: true,
20
+ archivedAt: "2026-08-15T11:03:02+00:00",
21
+ createdAt: "2026-08-10T09:12:44+00:00"
22
+ };
23
+ const liveDeployment = {
24
+ id: deploymentId("7a4c1b9e0d3f2a81"),
25
+ number: 2,
26
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
27
+ configVersion: "16",
28
+ gitCommitSha: null,
29
+ size: "small",
30
+ buildState: "PREBUILT",
31
+ runState: "RUNNING",
32
+ archived: false,
33
+ archivedAt: null,
34
+ createdAt: "2026-08-15T11:02:58+00:00"
35
+ };
36
+ const stagedDeployment = {
37
+ id: deploymentId("c5e83f17b204de96"),
38
+ number: 3,
39
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
40
+ configVersion: "18",
41
+ gitCommitSha: null,
42
+ size: "small",
43
+ buildState: "PREBUILT",
44
+ runState: "NEVER_RUN",
45
+ archived: false,
46
+ archivedAt: null,
47
+ createdAt: "2026-08-17T08:41:19+00:00"
48
+ };
49
+ const buildFailedDeployment = {
50
+ id: deploymentId("e91d47a8c6b02f35"),
51
+ number: 4,
52
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
53
+ configVersion: "19",
54
+ gitCommitSha: null,
55
+ size: "small",
56
+ buildState: "FAILED",
57
+ runState: "NEVER_RUN",
58
+ archived: false,
59
+ archivedAt: null,
60
+ createdAt: "2026-08-17T09:05:33+00:00"
61
+ };
62
+ const runFailedDeployment = {
63
+ id: deploymentId("2b6f0a94e7d51c83"),
64
+ number: 5,
65
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
66
+ configVersion: "20",
67
+ gitCommitSha: null,
68
+ size: "small",
69
+ buildState: "PREBUILT",
70
+ runState: "FAILED",
71
+ archived: false,
72
+ archivedAt: null,
73
+ createdAt: "2026-08-17T09:31:07+00:00"
74
+ };
75
+ const deploymentFixtures = {
76
+ archived: archivedDeployment,
77
+ live: liveDeployment,
78
+ staged: stagedDeployment,
79
+ buildFailed: buildFailedDeployment,
80
+ runFailed: runFailedDeployment
81
+ };
82
+ const getDeployment = () => liveDeployment;
83
+ /**
84
+ * One continuous history: #1 retired, #2 serving, #3 staged, #4 failed to build, #5 built but its
85
+ * run failed.
86
+ *
87
+ * All five, because `runFixtures.failed` names #5 as its deployment — a list that left the failed
88
+ * ones out could not be joined to the runs, which is the join a timeline is built from.
89
+ *
90
+ * Returned in ascending `number` order. The endpoint does not specify an order, so consumers must
91
+ * sort for themselves — this order is a fixture convention, not a contract to rely on, and it is
92
+ * ascending on purpose: a consumer that assumes newest-first gets the wrong answer here rather
93
+ * than in production.
94
+ */
95
+ const listDeployments = () => [
96
+ archivedDeployment,
97
+ liveDeployment,
98
+ stagedDeployment,
99
+ buildFailedDeployment,
100
+ runFailedDeployment
85
101
  ];
86
-
87
- // src/clients/apps/apps.ts
88
- var APP_URL = "https://hello-dashboard-374811.hub.canary-orion.keboola.dev";
89
- var base = {
90
- id: APP_ID,
91
- projectId: "14",
92
- componentId: "keboola.data-apps",
93
- branchId: "6",
94
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
95
- type: "streamlit",
96
- mode: "prod",
97
- url: APP_URL
98
- };
99
- var production = (deployment) => ({
100
- desiredNumber: deployment.number,
101
- desiredId: deployment.id,
102
- actualNumber: deployment.number,
103
- actualId: deployment.id
102
+ //#endregion
103
+ //#region src/clients/apps/apps.ts
104
+ const APP_URL = "https://hello-dashboard-374811.hub.canary-orion.keboola.dev";
105
+ const base$1 = {
106
+ id: APP_ID,
107
+ projectId: "14",
108
+ componentId: "keboola.data-apps",
109
+ branchId: "6",
110
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
111
+ type: "streamlit",
112
+ mode: "prod",
113
+ url: APP_URL
114
+ };
115
+ const production = (deployment) => ({
116
+ desiredNumber: deployment.number,
117
+ desiredId: deployment.id,
118
+ actualNumber: deployment.number,
119
+ actualId: deployment.id
104
120
  });
105
- var neverDeployedApp = {
106
- ...base,
107
- configVersion: "1",
108
- production: { desiredNumber: null, desiredId: null, actualNumber: null, actualId: null },
109
- undeployedChanges: false,
110
- state: "NOT_DEPLOYED"
111
- };
112
- var legacyV1ServingApp = {
113
- id: "374811",
114
- projectId: "14",
115
- componentId: "keboola.data-apps",
116
- branchId: "6",
117
- configId: "01kz9kny4n49x3xk0e4k8ynpmq",
118
- configVersion: "2",
119
- type: "streamlit",
120
- mode: "dev",
121
- url: APP_URL,
122
- production: { desiredNumber: null, desiredId: null, actualNumber: null, actualId: null },
123
- undeployedChanges: false,
124
- state: "NOT_DEPLOYED"
125
- };
126
- var runningApp = {
127
- ...base,
128
- configVersion: deploymentFixtures.live.configVersion,
129
- production: production(deploymentFixtures.live),
130
- undeployedChanges: false,
131
- state: "RUNNING"
132
- };
133
- var appWithUndeployedChanges = {
134
- ...base,
135
- configVersion: deploymentFixtures.staged.configVersion,
136
- production: production(deploymentFixtures.live),
137
- undeployedChanges: true,
138
- state: "RUNNING"
139
- };
140
- var promotingApp = {
141
- ...base,
142
- configVersion: deploymentFixtures.staged.configVersion,
143
- production: {
144
- desiredNumber: deploymentFixtures.staged.number,
145
- desiredId: deploymentFixtures.staged.id,
146
- actualNumber: deploymentFixtures.live.number,
147
- actualId: deploymentFixtures.live.id
148
- },
149
- undeployedChanges: true,
150
- state: "RUNNING"
151
- };
152
- var sleepingApp = {
153
- ...base,
154
- configVersion: deploymentFixtures.live.configVersion,
155
- production: production(deploymentFixtures.live),
156
- undeployedChanges: false,
157
- state: "SLEEPING"
158
- };
159
- var suspendedApp = {
160
- ...base,
161
- configVersion: deploymentFixtures.live.configVersion,
162
- production: production(deploymentFixtures.live),
163
- undeployedChanges: false,
164
- state: "SUSPENDED"
165
- };
166
- var appFixtures = {
167
- neverDeployed: neverDeployedApp,
168
- legacyV1Serving: legacyV1ServingApp,
169
- running: runningApp,
170
- undeployedChanges: appWithUndeployedChanges,
171
- promoting: promotingApp,
172
- sleeping: sleepingApp,
173
- suspended: suspendedApp
174
- };
175
- var getApp = () => runningApp;
176
- var readdress = (app, id) => ({
177
- ...app,
178
- id,
179
- url: `https://data-app-${id}.hub.canary-orion.keboola.dev`,
180
- production: {
181
- ...app.production,
182
- desiredId: app.production.desiredId?.replace(APP_ID, id) ?? null,
183
- actualId: app.production.actualId?.replace(APP_ID, id) ?? null
184
- }
121
+ const neverDeployedApp = {
122
+ ...base$1,
123
+ configVersion: "1",
124
+ production: {
125
+ desiredNumber: null,
126
+ desiredId: null,
127
+ actualNumber: null,
128
+ actualId: null
129
+ },
130
+ undeployedChanges: false,
131
+ state: "NOT_DEPLOYED"
132
+ };
133
+ /**
134
+ * Transcribed verbatim from canary on 17 Aug 2026 (AJDA-3140, probe P1): an app created and
135
+ * started through `/v1`, serving real traffic (HTTP 200, 8340 B) at the moment this was read,
136
+ * which `/v2` nonetheless reports as `NOT_DEPLOYED` with an empty `production` because it was
137
+ * never adopted into the deployments model.
138
+ *
139
+ * The Builder must never read "is this app serving" off `state` alone — here that answer is
140
+ * wrong in the most damaging direction.
141
+ */
142
+ const legacyV1ServingApp = {
143
+ id: "374811",
144
+ projectId: "14",
145
+ componentId: "keboola.data-apps",
146
+ branchId: "6",
147
+ configId: "01kz9kny4n49x3xk0e4k8ynpmq",
148
+ configVersion: "2",
149
+ type: "streamlit",
150
+ mode: "dev",
151
+ url: APP_URL,
152
+ production: {
153
+ desiredNumber: null,
154
+ desiredId: null,
155
+ actualNumber: null,
156
+ actualId: null
157
+ },
158
+ undeployedChanges: false,
159
+ state: "NOT_DEPLOYED"
160
+ };
161
+ const runningApp = {
162
+ ...base$1,
163
+ configVersion: deploymentFixtures.live.configVersion,
164
+ production: production(deploymentFixtures.live),
165
+ undeployedChanges: false,
166
+ state: "RUNNING"
167
+ };
168
+ const appWithUndeployedChanges = {
169
+ ...base$1,
170
+ configVersion: deploymentFixtures.staged.configVersion,
171
+ production: production(deploymentFixtures.live),
172
+ undeployedChanges: true,
173
+ state: "RUNNING"
174
+ };
175
+ const appFixtures = {
176
+ neverDeployed: neverDeployedApp,
177
+ legacyV1Serving: legacyV1ServingApp,
178
+ running: runningApp,
179
+ undeployedChanges: appWithUndeployedChanges,
180
+ promoting: {
181
+ ...base$1,
182
+ configVersion: deploymentFixtures.staged.configVersion,
183
+ production: {
184
+ desiredNumber: deploymentFixtures.staged.number,
185
+ desiredId: deploymentFixtures.staged.id,
186
+ actualNumber: deploymentFixtures.live.number,
187
+ actualId: deploymentFixtures.live.id
188
+ },
189
+ undeployedChanges: true,
190
+ state: "RUNNING"
191
+ },
192
+ sleeping: {
193
+ ...base$1,
194
+ configVersion: deploymentFixtures.live.configVersion,
195
+ production: production(deploymentFixtures.live),
196
+ undeployedChanges: false,
197
+ state: "SLEEPING"
198
+ },
199
+ suspended: {
200
+ ...base$1,
201
+ configVersion: deploymentFixtures.live.configVersion,
202
+ production: production(deploymentFixtures.live),
203
+ undeployedChanges: false,
204
+ state: "SUSPENDED"
205
+ }
206
+ };
207
+ const getApp = () => runningApp;
208
+ /**
209
+ * The named fixtures above are all the *same* app in different states, which is what a detail
210
+ * page shows. A listing shows different apps, so each entry past the first is re-addressed —
211
+ * including the deployment ids inside `production`, which embed the app id.
212
+ */
213
+ const readdress = (app, id) => ({
214
+ ...app,
215
+ id,
216
+ url: `https://data-app-${id}.hub.canary-orion.keboola.dev`,
217
+ production: {
218
+ ...app.production,
219
+ desiredId: app.production.desiredId?.replace("374811", id) ?? null,
220
+ actualId: app.production.actualId?.replace("374811", id) ?? null
221
+ }
185
222
  });
186
- var listApps = () => [
187
- runningApp,
188
- readdress(appWithUndeployedChanges, "374812"),
189
- readdress(neverDeployedApp, "374813")
223
+ const listApps = () => [
224
+ runningApp,
225
+ readdress(appWithUndeployedChanges, "374812"),
226
+ readdress(neverDeployedApp, "374813")
190
227
  ];
191
-
192
- // src/clients/apps/runs.ts
193
- var base2 = {
194
- appId: APP_ID,
195
- runtimeSize: "small",
196
- runtimeBackendType: "streamlit",
197
- imageVersion: "1.14.2",
198
- mode: "prod"
199
- };
200
- var runningRun = {
201
- ...base2,
202
- id: "4f2d8c1a-0b76-4e35-9a12-5c8e7d3b0f41",
203
- deploymentId: deploymentFixtures.live.id,
204
- configVersion: deploymentFixtures.live.configVersion,
205
- state: "running",
206
- createdAt: "2026-08-15T11:02:58+00:00",
207
- startedAt: "2026-08-15T11:03:41+00:00",
208
- stoppedAt: null,
209
- startupLogs: null,
210
- failureReason: null
211
- };
212
- var finishedRun = {
213
- ...base2,
214
- id: "9c0a7e42-31bd-4f88-b6d5-2ea41f907c3b",
215
- deploymentId: deploymentFixtures.archived.id,
216
- configVersion: deploymentFixtures.archived.configVersion,
217
- state: "finished",
218
- createdAt: "2026-08-10T09:12:44+00:00",
219
- startedAt: "2026-08-10T09:13:29+00:00",
220
- stoppedAt: "2026-08-15T11:03:02+00:00",
221
- startupLogs: null,
222
- failureReason: null
223
- };
224
- var failedRun = {
225
- ...base2,
226
- id: "ba53f9d0-7c41-4a2e-8f16-d0b9e254a7c6",
227
- deploymentId: deploymentFixtures.runFailed.id,
228
- configVersion: deploymentFixtures.runFailed.configVersion,
229
- state: "failed",
230
- createdAt: "2026-08-17T09:31:07+00:00",
231
- startedAt: null,
232
- stoppedAt: "2026-08-17T09:33:52+00:00",
233
- startupLogs: "[INFO] Starting app\n[ERROR] App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx\n",
234
- failureReason: {
235
- reason: "StartupProbeFailed",
236
- message: "App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx"
237
- }
238
- };
239
- var legacyRun = {
240
- ...base2,
241
- id: "1d7b4e05-8a92-4c63-b0f7-3e6a5c8192d4",
242
- deploymentId: null,
243
- configVersion: "2",
244
- state: "running",
245
- createdAt: "2026-08-17T10:02:11+00:00",
246
- startedAt: "2026-08-17T10:02:51+00:00",
247
- stoppedAt: null,
248
- startupLogs: null,
249
- failureReason: null
250
- };
251
- var runFixtures = {
252
- running: runningRun,
253
- finished: finishedRun,
254
- failed: failedRun,
255
- legacy: legacyRun
256
- };
257
- var getAppRun = () => runningRun;
258
- var listAppRuns = () => [legacyRun, failedRun, runningRun, finishedRun];
259
-
260
- // src/clients/storage/tables.ts
261
- var bucket = {
262
- id: "in.c-main",
263
- name: "c-main",
264
- displayName: "Main",
265
- stage: "in",
266
- description: "Main input bucket",
267
- created: "2024-01-15T10:00:00+0100",
268
- lastChangeDate: "2024-03-10T08:30:00+0100",
269
- isMaintenance: false,
270
- isReadOnly: false,
271
- isSnowflakeSharedDatabase: false,
272
- hasExternalSchema: false,
273
- rowsCount: 15e4,
274
- dataSizeBytes: 52428800,
275
- uri: "https://connection.keboola.com/v2/storage/buckets/in.c-main",
276
- backend: "snowflake",
277
- backendPath: [],
278
- databaseName: null,
279
- color: null,
280
- idBranch: 0,
281
- owner: null,
282
- sharing: null,
283
- path: "in.c-main",
284
- tables: "https://connection.keboola.com/v2/storage/buckets/in.c-main/tables",
285
- updated: "2024-03-10T08:30:00+0100"
286
- };
287
- var freshTable = {
288
- id: "in.c-main.users",
289
- name: "users",
290
- displayName: "Users",
291
- primaryKey: ["id"],
292
- metadata: [],
293
- columns: ["id", "email", "name", "created_at"],
294
- columnMetadata: {},
295
- attributes: [],
296
- bucket,
297
- isTyped: false,
298
- isAlias: false
299
- };
300
- var recentlyUpdatedTable = {
301
- id: "in.c-main.orders",
302
- name: "orders",
303
- displayName: "Orders",
304
- primaryKey: ["order_id"],
305
- metadata: [
306
- {
307
- id: "mt1",
308
- key: "KBC.createdBy.component.id",
309
- value: "keboola.python-transformation",
310
- provider: "keboola",
311
- timestamp: "2024-06-01T09:00:00+0200"
312
- }
313
- ],
314
- columns: ["order_id", "user_id", "total", "status", "created_at", "updated_at"],
315
- columnMetadata: {
316
- order_id: [
317
- {
318
- id: "m1",
319
- key: "KBC.datatype.type",
320
- value: "INTEGER",
321
- provider: "keboola",
322
- timestamp: "2024-06-01T09:00:00+0200"
323
- }
324
- ]
325
- },
326
- attributes: [],
327
- bucket,
328
- isTyped: false,
329
- isAlias: false
330
- };
331
- var largeTable = {
332
- id: "in.c-main.events",
333
- name: "events",
334
- displayName: "Events",
335
- primaryKey: [],
336
- metadata: [],
337
- columns: ["event_id", "user_id", "event_type", "properties", "occurred_at"],
338
- columnMetadata: {},
339
- attributes: [],
340
- bucket,
341
- isTyped: false,
342
- isAlias: false
343
- };
344
- var getTable = () => freshTable;
345
- var listTables = () => [freshTable, recentlyUpdatedTable, largeTable];
346
- var tableFixtures = {
347
- fresh: freshTable,
348
- recentlyUpdated: recentlyUpdatedTable,
349
- large: largeTable
228
+ //#endregion
229
+ //#region src/clients/apps/runs.ts
230
+ const base = {
231
+ appId: APP_ID,
232
+ runtimeSize: "small",
233
+ runtimeBackendType: "streamlit",
234
+ imageVersion: "1.14.2",
235
+ mode: "prod"
350
236
  };
351
-
352
- // src/fixtures.ts
353
- var fixtures = {
354
- storage: {
355
- tables: {
356
- getTable,
357
- listTables,
358
- fixtures: tableFixtures
359
- }
360
- },
361
- apps: {
362
- apps: {
363
- getApp,
364
- listApps,
365
- fixtures: appFixtures
366
- },
367
- deployments: {
368
- getDeployment,
369
- listDeployments,
370
- fixtures: deploymentFixtures
371
- },
372
- runs: {
373
- getAppRun,
374
- listAppRuns,
375
- fixtures: runFixtures
376
- }
377
- }
237
+ const runningRun = {
238
+ ...base,
239
+ id: "4f2d8c1a-0b76-4e35-9a12-5c8e7d3b0f41",
240
+ deploymentId: deploymentFixtures.live.id,
241
+ configVersion: deploymentFixtures.live.configVersion,
242
+ state: "running",
243
+ createdAt: "2026-08-15T11:02:58+00:00",
244
+ startedAt: "2026-08-15T11:03:41+00:00",
245
+ stoppedAt: null,
246
+ startupLogs: null,
247
+ failureReason: null
378
248
  };
379
-
249
+ const finishedRun = {
250
+ ...base,
251
+ id: "9c0a7e42-31bd-4f88-b6d5-2ea41f907c3b",
252
+ deploymentId: deploymentFixtures.archived.id,
253
+ configVersion: deploymentFixtures.archived.configVersion,
254
+ state: "finished",
255
+ createdAt: "2026-08-10T09:12:44+00:00",
256
+ startedAt: "2026-08-10T09:13:29+00:00",
257
+ stoppedAt: "2026-08-15T11:03:02+00:00",
258
+ startupLogs: null,
259
+ failureReason: null
260
+ };
261
+ /**
262
+ * A classified failure transcribed from canary (AJDA-3140, probe P1). `startedAt` is `null`
263
+ * even though a cause was attributed — the container executed but its startup probe never
264
+ * passed, so a classified failure says nothing about how far the run got.
265
+ */
266
+ const failedRun = {
267
+ ...base,
268
+ id: "ba53f9d0-7c41-4a2e-8f16-d0b9e254a7c6",
269
+ deploymentId: deploymentFixtures.runFailed.id,
270
+ configVersion: deploymentFixtures.runFailed.configVersion,
271
+ state: "failed",
272
+ createdAt: "2026-08-17T09:31:07+00:00",
273
+ startedAt: null,
274
+ stoppedAt: "2026-08-17T09:33:52+00:00",
275
+ startupLogs: "[INFO] Starting app\n[ERROR] App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx\n",
276
+ failureReason: {
277
+ reason: "StartupProbeFailed",
278
+ message: "App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx"
279
+ }
280
+ };
281
+ /**
282
+ * A run that belongs to the app itself rather than to a deployment — what every run of a
283
+ * `/v1`-created app looks like. `deploymentId: null` is permanent for these, not drift.
284
+ */
285
+ const legacyRun = {
286
+ ...base,
287
+ id: "1d7b4e05-8a92-4c63-b0f7-3e6a5c8192d4",
288
+ deploymentId: null,
289
+ configVersion: "2",
290
+ state: "running",
291
+ createdAt: "2026-08-17T10:02:11+00:00",
292
+ startedAt: "2026-08-17T10:02:51+00:00",
293
+ stoppedAt: null,
294
+ startupLogs: null,
295
+ failureReason: null
296
+ };
297
+ const runFixtures = {
298
+ running: runningRun,
299
+ finished: finishedRun,
300
+ failed: failedRun,
301
+ legacy: legacyRun
302
+ };
303
+ const getAppRun = () => runningRun;
304
+ /**
305
+ * Every run this app has, newest first — the order the endpoint documents, so a consumer that
306
+ * relies on it (`[latest] = runs`) is exercised against data that keeps the promise rather than
307
+ * data that happens to contradict it.
308
+ */
309
+ const listAppRuns = () => [
310
+ legacyRun,
311
+ failedRun,
312
+ runningRun,
313
+ finishedRun
314
+ ];
315
+ //#endregion
316
+ //#region src/clients/developerPortal/apps.ts
317
+ const keboolaVendor = {
318
+ id: "keboola",
319
+ name: "Keboola",
320
+ email: "support@keboola.com",
321
+ address: "Prague, Czech Republic",
322
+ type: "keboola",
323
+ projectUrl: null,
324
+ isTrusted: 1
325
+ };
326
+ const thirdPartyVendor = {
327
+ id: "acme",
328
+ name: "Acme Co.",
329
+ email: "dev@acme.example",
330
+ address: "Springfield",
331
+ projectUrl: "https://connection.keboola.com/admin/projects/1234",
332
+ type: "other",
333
+ isTrusted: 0
334
+ };
335
+ /** The same vendor as `GET /vendors/{vendor}` returns it — `isTrusted` converted to a boolean. */
336
+ const vendorDetail = {
337
+ ...thirdPartyVendor,
338
+ isTrusted: false
339
+ };
340
+ const pendingVendor = {
341
+ id: "_v1699999999999",
342
+ name: "Pending Startup",
343
+ email: "hello@pending.example",
344
+ address: "Berlin",
345
+ type: "other",
346
+ projectUrl: null,
347
+ isApproved: false,
348
+ isPublic: false,
349
+ isTrusted: false
350
+ };
351
+ const keboolaAdminVendor = {
352
+ ...keboolaVendor,
353
+ isApproved: true,
354
+ isPublic: true,
355
+ isTrusted: true
356
+ };
357
+ const thirdPartyAdminVendor = {
358
+ ...thirdPartyVendor,
359
+ isApproved: true,
360
+ isPublic: true,
361
+ isTrusted: false
362
+ };
363
+ const appVendor = (vendor) => ({
364
+ id: vendor.id,
365
+ name: vendor.name,
366
+ address: vendor.address,
367
+ email: vendor.email,
368
+ type: vendor.type
369
+ });
370
+ /** A published, fully-populated extractor — the shape that passes `hasAllFieldsForPublishing`. */
371
+ const publishedExtractor = {
372
+ id: "keboola.ex-db-snowflake",
373
+ vendor: appVendor(keboolaVendor),
374
+ name: "Snowflake",
375
+ type: "extractor",
376
+ shortDescription: "Extract data from Snowflake",
377
+ longDescription: "## Snowflake extractor\n\nExtracts tables from a Snowflake database.",
378
+ licenseUrl: "https://github.com/keboola/ex-db-snowflake/blob/master/LICENSE.md",
379
+ documentationUrl: "https://help.keboola.com/components/extractors/database/snowflake/",
380
+ sourceCodeUrl: "https://github.com/keboola/ex-db-snowflake",
381
+ categories: ["Database"],
382
+ complexity: "easy",
383
+ uiOptions: ["genericDockerUI"],
384
+ defaultBucket: true,
385
+ defaultBucketStage: "in",
386
+ stagingStorageInput: "local",
387
+ stagingStorageOutput: "local",
388
+ logger: "standard",
389
+ isPublic: true,
390
+ isDeprecated: false,
391
+ fees: false,
392
+ repository: {
393
+ type: "ecr",
394
+ uri: "keboola/ex-db-snowflake",
395
+ tag: "1.9.0"
396
+ },
397
+ icon: {
398
+ "64": "https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/64/1699999999999.png",
399
+ "128": "https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/128/1699999999999.png"
400
+ },
401
+ version: 12,
402
+ createdBy: "support@keboola.com",
403
+ updatedOn: "2024-06-01T09:00:00+0200",
404
+ uri: "docker/keboola.ex-db-snowflake",
405
+ isPublished: true,
406
+ publishedVersion: 12,
407
+ publishingStatus: "public"
408
+ };
409
+ /** A private third-party app with a pending publishing request. */
410
+ const requestedApp = {
411
+ id: "acme.wr-widgets",
412
+ vendor: appVendor(thirdPartyVendor),
413
+ name: "Widget Writer",
414
+ type: "writer",
415
+ shortDescription: "Write data to Widgets",
416
+ longDescription: "Pushes tables into the Widgets API.",
417
+ licenseUrl: "https://acme.example/license",
418
+ documentationUrl: "https://acme.example/docs",
419
+ uiOptions: ["genericDockerUI"],
420
+ repository: {
421
+ type: "quay",
422
+ uri: "acme/wr-widgets",
423
+ tag: "0.3.1"
424
+ },
425
+ icon: {
426
+ "64": "https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/64/1699999999998.png",
427
+ "128": "https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/128/1699999999998.png"
428
+ },
429
+ isPublic: false,
430
+ isDeprecated: false,
431
+ version: 3,
432
+ createdBy: "dev@acme.example",
433
+ updatedOn: "2024-05-20T14:12:00+0200",
434
+ uri: "docker/acme.wr-widgets",
435
+ isPublished: false,
436
+ publishingStatus: "requested",
437
+ publishingRequest: {
438
+ createdOn: "2024-05-20T14:12:00+0200",
439
+ rejectionReason: null
440
+ }
441
+ };
442
+ /** A rejected app — carries the reason the vendor sees on its detail page. */
443
+ const rejectedApp = {
444
+ id: "acme.app-analyzer",
445
+ vendor: appVendor(thirdPartyVendor),
446
+ name: "Analyzer",
447
+ type: "application",
448
+ shortDescription: "Analyze things",
449
+ isPublic: false,
450
+ isDeprecated: false,
451
+ version: 1,
452
+ createdBy: "dev@acme.example",
453
+ uri: "docker/acme.app-analyzer",
454
+ isPublished: false,
455
+ publishingStatus: "rejected",
456
+ publishingRequest: {
457
+ createdOn: "2024-04-02T11:00:00+0200",
458
+ rejectionReason: "Documentation URL is missing and the icon is not 256×256."
459
+ }
460
+ };
461
+ /** A deprecated app with an expiry date and a suggested replacement. */
462
+ const deprecatedApp = {
463
+ id: "keboola.ex-legacy",
464
+ vendor: appVendor(keboolaVendor),
465
+ name: "Legacy Extractor",
466
+ type: "extractor",
467
+ shortDescription: "Superseded",
468
+ isPublic: true,
469
+ isDeprecated: true,
470
+ expiredOn: "2025-01-01",
471
+ replacementApp: "keboola.ex-db-snowflake",
472
+ version: 40,
473
+ uri: "docker/keboola.ex-legacy",
474
+ isPublished: true,
475
+ publishedVersion: 38,
476
+ publishingStatus: "public"
477
+ };
478
+ /**
479
+ * A `data-app`, the type whose edit form hides ~14 fields. Deliberately minimal: a fixture carrying
480
+ * `configurationSchema` or `actions` here would misrepresent what the form can produce.
481
+ */
482
+ const dataApp = {
483
+ id: "acme.data-app-dashboard",
484
+ vendor: appVendor(thirdPartyVendor),
485
+ name: "Dashboard",
486
+ type: "data-app",
487
+ shortDescription: "A Streamlit dashboard",
488
+ isPublic: false,
489
+ isDeprecated: false,
490
+ version: 2,
491
+ uri: "docker/acme.data-app-dashboard",
492
+ isPublished: false,
493
+ publishingStatus: "private"
494
+ };
495
+ /** A `code-pattern`, whose `configurationSchema.supported_components` must be a non-empty array. */
496
+ const codePatternApp = {
497
+ id: "acme.code-pattern-etl",
498
+ vendor: appVendor(thirdPartyVendor),
499
+ name: "ETL Pattern",
500
+ type: "code-pattern",
501
+ shortDescription: "Generates ETL code",
502
+ actions: ["generate"],
503
+ configurationSchema: { supported_components: ["keboola.snowflake-transformation"] },
504
+ isPublic: false,
505
+ version: 1,
506
+ uri: "docker/acme.code-pattern-etl",
507
+ isPublished: false,
508
+ publishingStatus: "private"
509
+ };
510
+ /**
511
+ * An app typed `other`. The public catalog excludes it entirely, so it exists to prove that
512
+ * exclusion rather than to be rendered.
513
+ */
514
+ const otherTypeApp = {
515
+ id: "acme.misc-thing",
516
+ vendor: appVendor(thirdPartyVendor),
517
+ name: "Misc Thing",
518
+ type: "other",
519
+ isPublic: true,
520
+ version: 1,
521
+ uri: "docker/acme.misc-thing",
522
+ isPublished: true,
523
+ publishedVersion: 1,
524
+ publishingStatus: "public"
525
+ };
526
+ const humanUser = {
527
+ username: "dev@acme.example",
528
+ name: "Dev Eloper",
529
+ vendors: ["acme"],
530
+ createdOn: "2024-01-10T08:00:00+0100"
531
+ };
532
+ /** A recently added member, for a test that orders the list by `createdOn`. */
533
+ const newestUser = {
534
+ username: "new@acme.example",
535
+ name: "New Hire",
536
+ vendors: ["acme"],
537
+ createdOn: "2024-06-25T08:00:00+0200"
538
+ };
539
+ /** A member of no vendor — reachable only through the admin list. */
540
+ const vendorlessUser = {
541
+ username: "gone@acme.example",
542
+ name: "Alan Gone",
543
+ vendors: [],
544
+ createdOn: "2023-02-01T08:00:00+0100"
545
+ };
546
+ /** A Keboola staff member — eligible for "make admin" because they belong to the `keboola` vendor. */
547
+ const keboolaStaffUser = {
548
+ username: "staff@keboola.com",
549
+ name: "Kai Staff",
550
+ vendors: ["keboola"],
551
+ createdOn: "2023-09-14T08:00:00+0200"
552
+ };
553
+ /** A freshly created service account, including the one-time `password`. */
554
+ const newServiceAccount = {
555
+ username: "acme+ci",
556
+ description: "CI deploy pipeline",
557
+ createdOn: "2024-07-01T10:00:00+0200",
558
+ password: "one-time-secret-shown-once"
559
+ };
560
+ /** The same account as later listed — note there is no `password`; it is unreadable after creation. */
561
+ const existingServiceAccount = {
562
+ username: "acme+release",
563
+ description: "Release automation",
564
+ createdOn: "2024-03-11T10:00:00+0100"
565
+ };
566
+ const appChange = {
567
+ appId: "acme.wr-widgets",
568
+ createdOn: "2024-05-20T14:12:00+0200",
569
+ createdBy: "dev@acme.example",
570
+ changes: [{
571
+ attribute: "shortDescription",
572
+ oldValue: "Writes widgets",
573
+ newValue: "Write data to Widgets"
574
+ }, {
575
+ attribute: "repository",
576
+ oldValue: {
577
+ type: "quay",
578
+ uri: "acme/wr-widgets",
579
+ tag: "0.3.0"
580
+ },
581
+ newValue: {
582
+ type: "quay",
583
+ uri: "acme/wr-widgets",
584
+ tag: "0.3.1"
585
+ }
586
+ }]
587
+ };
588
+ /** The public catalog list: published, non-`other` apps only. */
589
+ const listPublishedApps = () => [publishedExtractor, deprecatedApp];
590
+ /** A vendor's own apps, across every publishing state the table renders. */
591
+ const listVendorApps = () => [
592
+ requestedApp,
593
+ rejectedApp,
594
+ dataApp,
595
+ codePatternApp
596
+ ];
597
+ /** The admin list — every vendor, plus the `other`-typed app the public catalog drops. */
598
+ const listAllApps = () => [
599
+ publishedExtractor,
600
+ requestedApp,
601
+ rejectedApp,
602
+ deprecatedApp,
603
+ dataApp,
604
+ codePatternApp,
605
+ otherTypeApp
606
+ ];
607
+ /** `GET /vendors` — approved and public only, so the pending vendor cannot appear here. */
608
+ const listVendors = () => [keboolaVendor, thirdPartyVendor];
609
+ /** `GET /vendors/{vendor}` — the converted shape. */
610
+ const getVendor = () => vendorDetail;
611
+ /** `GET /admin/vendors` — every vendor, and the only response carrying the approval flags. */
612
+ const listAllVendors = () => [
613
+ keboolaAdminVendor,
614
+ thirdPartyAdminVendor,
615
+ pendingVendor
616
+ ];
617
+ const listUsers = () => [
618
+ humanUser,
619
+ newestUser,
620
+ vendorlessUser,
621
+ keboolaStaffUser
622
+ ];
623
+ const listServiceAccounts = () => [existingServiceAccount];
624
+ const listAppChanges = () => [appChange];
625
+ /** Named fixtures, for a test that needs one specific state. */
626
+ const developerPortalFixtures = {
627
+ apps: {
628
+ published: publishedExtractor,
629
+ requested: requestedApp,
630
+ rejected: rejectedApp,
631
+ deprecated: deprecatedApp,
632
+ dataApp,
633
+ codePattern: codePatternApp,
634
+ otherType: otherTypeApp
635
+ },
636
+ vendors: {
637
+ keboola: keboolaVendor,
638
+ thirdParty: thirdPartyVendor,
639
+ detail: vendorDetail,
640
+ pending: pendingVendor,
641
+ keboolaAdmin: keboolaAdminVendor,
642
+ thirdPartyAdmin: thirdPartyAdminVendor
643
+ },
644
+ users: {
645
+ human: humanUser,
646
+ newest: newestUser,
647
+ vendorless: vendorlessUser,
648
+ keboolaStaff: keboolaStaffUser
649
+ },
650
+ serviceAccounts: {
651
+ created: newServiceAccount,
652
+ existing: existingServiceAccount
653
+ },
654
+ changes: { single: appChange }
655
+ };
656
+ //#endregion
657
+ //#region src/clients/storage/bootstrap.ts
658
+ /** The stack an MSW-backed test points its client at, unless a caller passes its own. */
659
+ const DEFAULT_BASE_URL = "https://connection.test";
660
+ /**
661
+ * The stack index `GET /v2/storage` returns.
662
+ *
663
+ * - Announces every `ServiceId` by default, each on its own host, so no service client is a dummy
664
+ * that throws `ServiceUnavailableError` — a test for a queue / data-science / vault hook only
665
+ * adds its handler.
666
+ * - Defaulting to `Object.values(ServiceId)` is what keeps that exhaustive: a service added to the
667
+ * client arrives here without an edit.
668
+ */
669
+ const getStackInfo = ({ baseUrl = DEFAULT_BASE_URL, services = Object.values(_keboola_api_client_constants.ServiceId) } = {}) => {
670
+ const { host } = new URL(baseUrl);
671
+ return {
672
+ api: host,
673
+ documentation: "https://developers.keboola.com",
674
+ host,
675
+ revision: "test-revision",
676
+ stack: "test-stack",
677
+ version: "test-version",
678
+ urlTemplates: { orchestrationJob: "" },
679
+ services: services.map((id) => ({
680
+ id,
681
+ url: `https://${id}.${host}`
682
+ })),
683
+ components: [],
684
+ features: []
685
+ };
686
+ };
687
+ /**
688
+ * The verified master token `GET /v2/storage/tokens/verify` returns.
689
+ *
690
+ * - Complete on purpose: `api.context.project.sapiToken` is this object verbatim and hooks read deep
691
+ * into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as
692
+ * `undefined`s far from the test that caused them.
693
+ * - Every permission flag is granted; a test needing a restricted token overrides the handler.
694
+ */
695
+ const verifyStorageToken = ({ baseUrl = DEFAULT_BASE_URL, features = [] } = {}) => ({
696
+ id: "token-1",
697
+ created: "2024-01-01T00:00:00Z",
698
+ refreshed: "2024-01-01T00:00:00Z",
699
+ description: "Test token",
700
+ uri: baseUrl,
701
+ isMasterToken: true,
702
+ canManageBuckets: true,
703
+ canManageTokens: true,
704
+ canReadAllFileUploads: true,
705
+ canPurgeTrash: true,
706
+ canManageProtectedDefaultBranch: true,
707
+ canCreateJobs: true,
708
+ canReadAllProjectEvents: true,
709
+ canManageDevBranches: true,
710
+ creatorToken: {
711
+ id: 42,
712
+ description: "Test token"
713
+ },
714
+ expires: null,
715
+ isExpired: false,
716
+ isDisabled: false,
717
+ isBYODB: false,
718
+ dailyCapacity: 1e3,
719
+ bucketPermissions: {},
720
+ owner: {
721
+ id: 42,
722
+ name: "Test Project",
723
+ type: "project",
724
+ region: "us-east-1",
725
+ created: "2024-01-01T00:00:00Z",
726
+ expires: null,
727
+ features,
728
+ dataSizeBytes: 0,
729
+ rowsCount: 0,
730
+ hasMysql: false,
731
+ hasSynapse: false,
732
+ hasRedshift: false,
733
+ hasSnowflake: true,
734
+ hasExasol: false,
735
+ hasTeradata: false,
736
+ hasBigquery: false,
737
+ defaultBackend: "snowflake",
738
+ hasTryModeOn: "false",
739
+ limits: {},
740
+ metrics: {},
741
+ isDisabled: false,
742
+ billedMonthlyPrice: null,
743
+ dataRetentionTimeInDays: 30,
744
+ assignedBackends: ["snowflake"],
745
+ fileStorageProvider: "s3"
746
+ },
747
+ organization: { id: "org-1" },
748
+ admin: {
749
+ id: 100,
750
+ name: "Admin User",
751
+ features: [],
752
+ isOrganizationMember: true,
753
+ role: "admin"
754
+ },
755
+ adminOwner: {
756
+ id: 200,
757
+ name: "Owner User",
758
+ email: "owner@example.com"
759
+ }
760
+ });
761
+ /**
762
+ * The branch list `GET /v2/storage/dev-branches` returns — the default branch alone.
763
+ *
764
+ * - `context.defaultBranch` is read off it, so the entry must stay `isDefault: true`.
765
+ * - The default branch has no creator, which `DevBranch` models as an empty `creatorToken`.
766
+ */
767
+ const getDevBranches = () => [{
768
+ id: 1,
769
+ name: "Main",
770
+ description: "",
771
+ isDefault: true,
772
+ created: "2024-01-01T00:00:00Z",
773
+ creatorToken: []
774
+ }];
775
+ //#endregion
776
+ //#region src/clients/storage/tables.ts
777
+ const bucket = {
778
+ id: "in.c-main",
779
+ name: "c-main",
780
+ displayName: "Main",
781
+ stage: "in",
782
+ description: "Main input bucket",
783
+ created: "2024-01-15T10:00:00+0100",
784
+ lastChangeDate: "2024-03-10T08:30:00+0100",
785
+ isMaintenance: false,
786
+ isReadOnly: false,
787
+ isSnowflakeSharedDatabase: false,
788
+ hasExternalSchema: false,
789
+ rowsCount: 15e4,
790
+ dataSizeBytes: 52428800,
791
+ uri: "https://connection.keboola.com/v2/storage/buckets/in.c-main",
792
+ backend: "snowflake",
793
+ backendPath: [],
794
+ databaseName: null,
795
+ color: null,
796
+ idBranch: 0,
797
+ owner: null,
798
+ sharing: null,
799
+ path: "in.c-main",
800
+ tables: "https://connection.keboola.com/v2/storage/buckets/in.c-main/tables",
801
+ updated: "2024-03-10T08:30:00+0100",
802
+ isLinkedBucket: false,
803
+ bucketSharingAllowed: true
804
+ };
805
+ const freshTable = {
806
+ id: "in.c-main.users",
807
+ name: "users",
808
+ displayName: "Users",
809
+ primaryKey: ["id"],
810
+ metadata: [],
811
+ columns: [
812
+ "id",
813
+ "email",
814
+ "name",
815
+ "created_at"
816
+ ],
817
+ columnMetadata: {},
818
+ attributes: [],
819
+ bucket,
820
+ isTyped: false,
821
+ isAlias: false
822
+ };
823
+ const recentlyUpdatedTable = {
824
+ id: "in.c-main.orders",
825
+ name: "orders",
826
+ displayName: "Orders",
827
+ primaryKey: ["order_id"],
828
+ metadata: [{
829
+ id: "mt1",
830
+ key: "KBC.createdBy.component.id",
831
+ value: "keboola.python-transformation",
832
+ provider: "keboola",
833
+ timestamp: "2024-06-01T09:00:00+0200"
834
+ }],
835
+ columns: [
836
+ "order_id",
837
+ "user_id",
838
+ "total",
839
+ "status",
840
+ "created_at",
841
+ "updated_at"
842
+ ],
843
+ columnMetadata: { order_id: [{
844
+ id: "m1",
845
+ key: "KBC.datatype.type",
846
+ value: "INTEGER",
847
+ provider: "keboola",
848
+ timestamp: "2024-06-01T09:00:00+0200"
849
+ }] },
850
+ attributes: [],
851
+ bucket,
852
+ isTyped: false,
853
+ isAlias: false
854
+ };
855
+ const largeTable = {
856
+ id: "in.c-main.events",
857
+ name: "events",
858
+ displayName: "Events",
859
+ primaryKey: [],
860
+ metadata: [],
861
+ columns: [
862
+ "event_id",
863
+ "user_id",
864
+ "event_type",
865
+ "properties",
866
+ "occurred_at"
867
+ ],
868
+ columnMetadata: {},
869
+ attributes: [],
870
+ bucket,
871
+ isTyped: false,
872
+ isAlias: false
873
+ };
874
+ /**
875
+ * Returns a single realistic typed TableDetail (fresh, no imports yet).
876
+ *
877
+ * The explicit return type ensures any divergence from the OpenAPI-derived
878
+ * `TableDetail` in `@keboola/api-client` surfaces as a TypeScript error.
879
+ */
880
+ const getTable = () => freshTable;
881
+ /**
882
+ * Returns three TableDetail objects representing different lifecycle states:
883
+ * 1. Fresh — just created, no data imported.
884
+ * 2. Recently updated — moderate size, recent import.
885
+ * 3. Large — high row count, large byte size.
886
+ */
887
+ const listTables = () => [
888
+ freshTable,
889
+ recentlyUpdatedTable,
890
+ largeTable
891
+ ];
892
+ /**
893
+ * Named fixtures for targeted access in tests.
894
+ */
895
+ const tableFixtures = {
896
+ fresh: freshTable,
897
+ recentlyUpdated: recentlyUpdatedTable,
898
+ large: largeTable
899
+ };
900
+ //#endregion
901
+ //#region src/fixtures.ts
902
+ const fixtures = {
903
+ storage: {
904
+ bootstrap: {
905
+ getStackInfo,
906
+ verifyStorageToken,
907
+ getDevBranches
908
+ },
909
+ tables: {
910
+ getTable,
911
+ listTables,
912
+ fixtures: tableFixtures
913
+ }
914
+ },
915
+ apps: {
916
+ apps: {
917
+ getApp,
918
+ listApps,
919
+ fixtures: appFixtures
920
+ },
921
+ deployments: {
922
+ getDeployment,
923
+ listDeployments,
924
+ fixtures: deploymentFixtures
925
+ },
926
+ runs: {
927
+ getAppRun,
928
+ listAppRuns,
929
+ fixtures: runFixtures
930
+ }
931
+ },
932
+ developerPortal: {
933
+ listPublishedApps,
934
+ listVendorApps,
935
+ listAllApps,
936
+ listAllVendors,
937
+ getVendor,
938
+ listVendors,
939
+ listUsers,
940
+ listServiceAccounts,
941
+ listAppChanges,
942
+ fixtures: developerPortalFixtures
943
+ }
944
+ };
945
+ //#endregion
946
+ exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
380
947
  exports.appFixtures = appFixtures;
381
948
  exports.deploymentFixtures = deploymentFixtures;
949
+ exports.developerPortalFixtures = developerPortalFixtures;
382
950
  exports.fixtures = fixtures;
383
951
  exports.getApp = getApp;
384
952
  exports.getAppRun = getAppRun;
385
953
  exports.getDeployment = getDeployment;
954
+ exports.getDevBranches = getDevBranches;
955
+ exports.getStackInfo = getStackInfo;
386
956
  exports.getTable = getTable;
957
+ exports.getVendor = getVendor;
958
+ exports.listAllApps = listAllApps;
959
+ exports.listAllVendors = listAllVendors;
960
+ exports.listAppChanges = listAppChanges;
387
961
  exports.listAppRuns = listAppRuns;
388
962
  exports.listApps = listApps;
389
963
  exports.listDeployments = listDeployments;
964
+ exports.listPublishedApps = listPublishedApps;
965
+ exports.listServiceAccounts = listServiceAccounts;
390
966
  exports.listTables = listTables;
967
+ exports.listUsers = listUsers;
968
+ exports.listVendorApps = listVendorApps;
969
+ exports.listVendors = listVendors;
391
970
  exports.runFixtures = runFixtures;
392
971
  exports.tableFixtures = tableFixtures;
393
- //# sourceMappingURL=index.cjs.map
972
+ exports.verifyStorageToken = verifyStorageToken;
973
+
394
974
  //# sourceMappingURL=index.cjs.map