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