@keboola/api-fixtures 37.0.0 → 39.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/AGENTS.md CHANGED
@@ -20,9 +20,6 @@ Current slices:
20
20
  surface. The three compose into one coherent app (an app's `production` names a deployment in
21
21
  `listDeployments()`; runs name deployments that exist), so a fixture added here must keep that
22
22
  join intact — `apps.test.ts` is what enforces it.
23
- - `businessWorkspaceApi.dashboards` — `getBusinessWorkspaceDashboard()`, `listBusinessWorkspaceDashboards()`,
24
- `getBusinessWorkspaceDashboardInput()`; one per-user Business Workspace dashboard whose `spec.id`
25
- equals the row id, as the service enforces.
26
23
 
27
24
  ## When to use fixtures vs MSW vs real API
28
25
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @keboola/api-fixtures
2
2
 
3
+ ## 39.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - Remove the `businessWorkspaceApi` dashboard fixtures, together with the Business Workspace API client they described
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies:
12
+ - @keboola/api-client@44.0.0
13
+
14
+ ## 38.0.0
15
+
16
+ ### Patch Changes
17
+
18
+ - Regenerate the OpenAPI types of the services the weekly drift lane reported on 2026-09-29: `omnisearch`, `developerPortal`, `vault`, `dataScience`, `kaiAgent`, `scheduler`, `oauth`, `microsoftGraph`. The other three it reported (`storage`, `management`, `auth`) were already regenerated on `main`. No path or component schema is removed; the changes add operations and fields and tighten documented shapes.
19
+
20
+ `developerPortal` app changes now document every field: `id` (the app the change belongs to), `createdOn`, a nullable `createdBy`, and `attribute` / `oldValue` / `newValue` / `description` per change. The `listAppChanges` fixture carries `id` (it had `appId`, which no version of the spec names) and a `description` per change.
21
+
22
+ Developer Portal's component change log keys its rows apart instead of by the app id every row shares, and shows a change stored without an author without a trailing `· null`.
23
+
24
+ - Updated dependencies:
25
+ - @keboola/api-client@43.0.0
26
+
3
27
  ## 37.0.0
4
28
 
5
29
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -255,57 +255,6 @@ const listAppRuns = () => [
255
255
  finishedRun
256
256
  ];
257
257
  //#endregion
258
- //#region src/clients/businessWorkspaceApi/dashboards.ts
259
- const DASHBOARD_ID = "6f1b1e0a-8c2d-4f6e-9a3b-1c2d3e4f5a6b";
260
- const salesDashboard = {
261
- id: DASHBOARD_ID,
262
- ownerUserId: 7,
263
- primaryProjectId: 42,
264
- sourceProjectIds: [42, 43],
265
- title: "Sales overview",
266
- description: "Revenue and pipeline across regions",
267
- spec: {
268
- version: 1,
269
- id: DASHBOARD_ID,
270
- name: "Sales overview",
271
- description: "Revenue and pipeline across regions",
272
- columns: 12,
273
- widgets: [{
274
- id: "revenue",
275
- type: "metric",
276
- title: "Revenue",
277
- layout: {
278
- x: 0,
279
- y: 0,
280
- w: 4,
281
- h: 2
282
- },
283
- config: { metric: "revenue" }
284
- }]
285
- },
286
- createdAt: "2026-01-15T10:00:00.000Z",
287
- updatedAt: "2026-02-01T09:30:00.000Z"
288
- };
289
- const getBusinessWorkspaceDashboard = () => salesDashboard;
290
- const listBusinessWorkspaceDashboards = () => [{
291
- id: salesDashboard.id,
292
- ownerUserId: salesDashboard.ownerUserId,
293
- primaryProjectId: salesDashboard.primaryProjectId,
294
- sourceProjectIds: salesDashboard.sourceProjectIds,
295
- title: salesDashboard.title,
296
- description: salesDashboard.description,
297
- createdAt: salesDashboard.createdAt,
298
- updatedAt: salesDashboard.updatedAt
299
- }];
300
- const getBusinessWorkspaceDashboardInput = () => ({
301
- id: salesDashboard.id,
302
- title: salesDashboard.title,
303
- description: salesDashboard.description,
304
- spec: salesDashboard.spec,
305
- primaryProjectId: salesDashboard.primaryProjectId,
306
- sourceProjectIds: salesDashboard.sourceProjectIds
307
- });
308
- //#endregion
309
258
  //#region src/clients/developerPortal/apps.ts
310
259
  const keboolaVendor = {
311
260
  id: "keboola",
@@ -557,13 +506,14 @@ const existingServiceAccount = {
557
506
  createdOn: "2024-03-11T10:00:00+0100"
558
507
  };
559
508
  const appChange = {
560
- appId: "acme.wr-widgets",
509
+ id: "acme.wr-widgets",
561
510
  createdOn: "2024-05-20T14:12:00+0200",
562
511
  createdBy: "dev@acme.example",
563
512
  changes: [{
564
513
  attribute: "shortDescription",
565
514
  oldValue: "Writes widgets",
566
- newValue: "Write data to Widgets"
515
+ newValue: "Write data to Widgets",
516
+ description: "Attribute shortDescription changed"
567
517
  }, {
568
518
  attribute: "repository",
569
519
  oldValue: {
@@ -575,7 +525,8 @@ const appChange = {
575
525
  type: "quay",
576
526
  uri: "acme/wr-widgets",
577
527
  tag: "0.3.1"
578
- }
528
+ },
529
+ description: "Attribute repository changed"
579
530
  }]
580
531
  };
581
532
  /** The public catalog list: published, non-`other` apps only. */
@@ -1068,11 +1019,6 @@ const fixtures = {
1068
1019
  fixtures: runFixtures
1069
1020
  }
1070
1021
  },
1071
- businessWorkspaceApi: { dashboards: {
1072
- getDashboard: getBusinessWorkspaceDashboard,
1073
- listDashboards: listBusinessWorkspaceDashboards,
1074
- getDashboardInput: getBusinessWorkspaceDashboardInput
1075
- } },
1076
1022
  developerPortal: {
1077
1023
  listPublishedApps,
1078
1024
  listVendorApps,
@@ -1097,8 +1043,6 @@ exports.getApp = getApp;
1097
1043
  exports.getAppRun = getAppRun;
1098
1044
  exports.getApplicationToken = getApplicationToken;
1099
1045
  exports.getApplicationTokens = getApplicationTokens;
1100
- exports.getBusinessWorkspaceDashboard = getBusinessWorkspaceDashboard;
1101
- exports.getBusinessWorkspaceDashboardInput = getBusinessWorkspaceDashboardInput;
1102
1046
  exports.getDeployment = getDeployment;
1103
1047
  exports.getDevBranches = getDevBranches;
1104
1048
  exports.getStackInfo = getStackInfo;
@@ -1111,7 +1055,6 @@ exports.listAllVendors = listAllVendors;
1111
1055
  exports.listAppChanges = listAppChanges;
1112
1056
  exports.listAppRuns = listAppRuns;
1113
1057
  exports.listApps = listApps;
1114
- exports.listBusinessWorkspaceDashboards = listBusinessWorkspaceDashboards;
1115
1058
  exports.listDeployments = listDeployments;
1116
1059
  exports.listPublishedApps = listPublishedApps;
1117
1060
  exports.listServiceAccounts = listServiceAccounts;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["base","ServiceId"],"sources":["../src/clients/apps/deployments.ts","../src/clients/apps/apps.ts","../src/clients/apps/runs.ts","../src/clients/businessWorkspaceApi/dashboards.ts","../src/clients/developerPortal/apps.ts","../src/clients/management/applicationTokens.ts","../src/clients/management/uiApps.ts","../src/clients/storage/bootstrap.ts","../src/clients/storage/tables.ts","../src/fixtures.ts"],"sourcesContent":["import type { Deployment } from '@keboola/api-client/apps/types';\n\nexport const APP_ID = '374811';\n\n// UUIDv7: ids sort in creation order.\nconst deploymentId = (suffix: string) => `019f1c3a-${suffix}-7c1e-b4a2-0d9f3e6a8c15`;\n\n// Deleted: the row outlives its workload and stays in history.\nconst archivedDeployment = {\n id: deploymentId('0a41'),\n configVersion: '14',\n gitCommitSha: null,\n runtimeSize: 'tiny' as const,\n buildState: 'ready' as const,\n runState: 'stopped' as const,\n archived: true,\n archivedAt: '2026-08-15T11:03:02+00:00',\n createdAt: '2026-08-10T09:12:44+00:00',\n} satisfies Deployment;\n\n// Serving production — the one `appFixtures.running.production` points at.\nconst liveDeployment = {\n id: deploymentId('1b52'),\n configVersion: '16',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'running' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-15T11:02:58+00:00',\n} satisfies Deployment;\n\n// Created with `promote: false`: built, never started.\nconst stagedDeployment = {\n id: deploymentId('2c63'),\n configVersion: '18',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T08:41:19+00:00',\n} satisfies Deployment;\n\n// Can never run — distinct from a run failure. Unreachable today (deployments start from a\n// ready image); the headline table treats it as a contract.\nconst buildFailedDeployment = {\n id: deploymentId('3d74'),\n configVersion: '19',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'failed' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:05:33+00:00',\n} satisfies Deployment;\n\n// Built fine, crashed on every run — `getAppRuns` carries the cause.\nconst runFailedDeployment = {\n id: deploymentId('4e85'),\n configVersion: '20',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'failed' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:31:07+00:00',\n} satisfies Deployment;\n\nexport const deploymentFixtures = {\n archived: archivedDeployment,\n live: liveDeployment,\n staged: stagedDeployment,\n buildFailed: buildFailedDeployment,\n runFailed: runFailedDeployment,\n} satisfies Record<'archived' | 'live' | 'staged' | 'buildFailed' | 'runFailed', Deployment>;\n\nexport const getDeployment = (): Deployment => liveDeployment;\n\n/**\n * All deployments as one history.\n *\n * - Includes the failed ones: `runFixtures.failed` joins to the last.\n * - Oldest first on purpose: the endpoint specifies no order, so consumers must sort.\n */\nexport const listDeployments = (): Deployment[] => [\n archivedDeployment,\n liveDeployment,\n stagedDeployment,\n buildFailedDeployment,\n runFailedDeployment,\n];\n","import type { App } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst APP_URL = 'https://hello-dashboard-374811.hub.canary-orion.keboola.dev';\n\nconst base = {\n id: APP_ID,\n projectId: '14',\n componentId: 'keboola.data-apps',\n branchId: '6',\n configId: '01kz9kny4n49x3xk0e4k8ynpmq',\n type: 'streamlit' as const,\n url: APP_URL,\n};\n\nconst production = (deployment: (typeof deploymentFixtures)[keyof typeof deploymentFixtures]) => ({\n desiredDeploymentId: deployment.id,\n actualDeploymentId: deployment.id,\n});\n\nconst NOTHING_IN_PRODUCTION = { desiredDeploymentId: null, actualDeploymentId: null };\n\n// Created through `/v2`, nothing deployed yet: the URL is reserved and publicly 404s.\nconst neverDeployedApp = {\n ...base,\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n/**\n * An app created and started through `/v1`, serving real traffic (AJDA-3140, probe P1: HTTP 200,\n * 8340 B at the moment this was read), which `/v2` nonetheless reports as `notDeployed` with an\n * empty `production` because it was never adopted into the deployments model.\n *\n * The Builder must never read \"is this app serving\" off `state` alone — here that answer is\n * wrong in the most damaging direction.\n */\nconst legacyV1ServingApp = {\n ...base,\n id: '374899',\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n// Serving the live deployment.\nconst runningApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'running' as const,\n} satisfies App;\n\n/**\n * A blue/green promotion in flight: the staged deployment has been asked for, the live one is still\n * what traffic reaches. `state` stays `running` throughout — the rollout is only visible as\n * `desiredDeploymentId !== actualDeploymentId`.\n */\nconst promotingApp = {\n ...base,\n production: {\n desiredDeploymentId: deploymentFixtures.staged.id,\n actualDeploymentId: deploymentFixtures.live.id,\n },\n state: 'running' as const,\n} satisfies App;\n\n// Idle between visits and armed to wake on the next request — normal, not an outage.\nconst suspendedApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'suspended' as const,\n} satisfies App;\n\n// Stopped by a failure and will not auto-wake: a visitor sees the restart-disabled page until\n// someone starts it explicitly.\nconst disabledApp = {\n ...base,\n production: production(deploymentFixtures.runFailed),\n state: 'disabled' as const,\n} satisfies App;\n\nexport const appFixtures = {\n neverDeployed: neverDeployedApp,\n legacyV1Serving: legacyV1ServingApp,\n running: runningApp,\n promoting: promotingApp,\n suspended: suspendedApp,\n disabled: disabledApp,\n} satisfies Record<\n 'neverDeployed' | 'legacyV1Serving' | 'running' | 'promoting' | 'suspended' | 'disabled',\n App\n>;\n\nexport const getApp = (): App => runningApp;\n\n/**\n * The named fixtures above are all the *same* app in different states, which is what a detail\n * page shows. A listing shows different apps, so each entry past the first is re-addressed.\n */\nconst readdress = (app: App, id: string): App => ({\n ...app,\n id,\n url: `https://data-app-${id}.hub.canary-orion.keboola.dev`,\n});\n\nexport const listApps = (): App[] => [\n runningApp,\n readdress(suspendedApp, '374812'),\n readdress(neverDeployedApp, '374813'),\n];\n","import type { AppRun } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst base = {\n appId: APP_ID,\n runtimeSize: 'small',\n runtimeBackendType: 'streamlit',\n imageVersion: '1.14.2',\n mode: 'prod',\n};\n\nconst runningRun = {\n ...base,\n id: '4f2d8c1a-0b76-4e35-9a12-5c8e7d3b0f41',\n deploymentId: deploymentFixtures.live.id,\n configVersion: deploymentFixtures.live.configVersion,\n state: 'running' as const,\n createdAt: '2026-08-15T11:02:58+00:00',\n startedAt: '2026-08-15T11:03:41+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nconst finishedRun = {\n ...base,\n id: '9c0a7e42-31bd-4f88-b6d5-2ea41f907c3b',\n deploymentId: deploymentFixtures.archived.id,\n configVersion: deploymentFixtures.archived.configVersion,\n state: 'finished' as const,\n createdAt: '2026-08-10T09:12:44+00:00',\n startedAt: '2026-08-10T09:13:29+00:00',\n stoppedAt: '2026-08-15T11:03:02+00:00',\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\n/**\n * A classified failure transcribed from canary (AJDA-3140, probe P1). `startedAt` is `null`\n * even though a cause was attributed — the container executed but its startup probe never\n * passed, so a classified failure says nothing about how far the run got.\n */\nconst failedRun = {\n ...base,\n id: 'ba53f9d0-7c41-4a2e-8f16-d0b9e254a7c6',\n deploymentId: deploymentFixtures.runFailed.id,\n configVersion: deploymentFixtures.runFailed.configVersion,\n state: 'failed' as const,\n createdAt: '2026-08-17T09:31:07+00:00',\n startedAt: null,\n stoppedAt: '2026-08-17T09:33:52+00:00',\n startupLogs:\n '[INFO] Starting app\\n[ERROR] App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx\\n',\n failureReason: {\n reason: 'StartupProbeFailed',\n message: 'App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx',\n },\n} satisfies AppRun;\n\n/**\n * A run that belongs to the app itself rather than to a deployment — what every run of a\n * `/v1`-created app looks like. `deploymentId: null` is permanent for these, not drift.\n */\nconst legacyRun = {\n ...base,\n id: '1d7b4e05-8a92-4c63-b0f7-3e6a5c8192d4',\n deploymentId: null,\n configVersion: '2',\n state: 'running' as const,\n createdAt: '2026-08-17T10:02:11+00:00',\n startedAt: '2026-08-17T10:02:51+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nexport const runFixtures = {\n running: runningRun,\n finished: finishedRun,\n failed: failedRun,\n legacy: legacyRun,\n} satisfies Record<'running' | 'finished' | 'failed' | 'legacy', AppRun>;\n\nexport const getAppRun = (): AppRun => runningRun;\n\n/**\n * Every run this app has, newest first — the order the endpoint documents, so a consumer that\n * relies on it (`[latest] = runs`) is exercised against data that keeps the promise rather than\n * data that happens to contradict it.\n */\nexport const listAppRuns = (): AppRun[] => [legacyRun, failedRun, runningRun, finishedRun];\n","import type {\n BusinessWorkspaceDashboard,\n BusinessWorkspaceDashboardSummary,\n DashboardInput,\n} from '@keboola/api-client/businessWorkspaceApi/types';\n\nconst DASHBOARD_ID = '6f1b1e0a-8c2d-4f6e-9a3b-1c2d3e4f5a6b';\n\nconst salesDashboard = {\n id: DASHBOARD_ID,\n ownerUserId: 7,\n primaryProjectId: 42,\n sourceProjectIds: [42, 43],\n title: 'Sales overview',\n description: 'Revenue and pipeline across regions',\n spec: {\n version: 1,\n id: DASHBOARD_ID,\n name: 'Sales overview',\n description: 'Revenue and pipeline across regions',\n columns: 12,\n widgets: [\n {\n id: 'revenue',\n type: 'metric',\n title: 'Revenue',\n layout: { x: 0, y: 0, w: 4, h: 2 },\n config: { metric: 'revenue' },\n },\n ],\n },\n createdAt: '2026-01-15T10:00:00.000Z',\n updatedAt: '2026-02-01T09:30:00.000Z',\n} satisfies BusinessWorkspaceDashboard;\n\nexport const getBusinessWorkspaceDashboard = (): BusinessWorkspaceDashboard => salesDashboard;\n\nexport const listBusinessWorkspaceDashboards = (): BusinessWorkspaceDashboardSummary[] => [\n {\n id: salesDashboard.id,\n ownerUserId: salesDashboard.ownerUserId,\n primaryProjectId: salesDashboard.primaryProjectId,\n sourceProjectIds: salesDashboard.sourceProjectIds,\n title: salesDashboard.title,\n description: salesDashboard.description,\n createdAt: salesDashboard.createdAt,\n updatedAt: salesDashboard.updatedAt,\n },\n];\n\nexport const getBusinessWorkspaceDashboardInput = (): DashboardInput => ({\n id: salesDashboard.id,\n title: salesDashboard.title,\n description: salesDashboard.description,\n spec: salesDashboard.spec,\n primaryProjectId: salesDashboard.primaryProjectId,\n sourceProjectIds: salesDashboard.sourceProjectIds,\n});\n","import type {\n AdminVendor,\n App,\n AppChange,\n AppVendor,\n ServiceAccount,\n User,\n Vendor,\n VendorListItem,\n} from '@keboola/api-client/developerPortal/types';\n\n// `isTrusted` is the raw tinyint here and a boolean in `vendorDetail` below. That is not a fixture\n// inconsistency: `GET /vendors` returns the row unconverted, every other vendor endpoint runs it\n// through `publicGetVendor`. A fixture that smoothed it over would hide the difference consumers\n// have to handle.\n//\n// `type: 'keboola'` is what the public catalog's \"Supported by Keboola\" filter matches on — NOT\n// `id`, so a fixture that only set the id would silently fail to exercise that filter.\nconst keboolaVendor = {\n id: 'keboola',\n name: 'Keboola',\n email: 'support@keboola.com',\n address: 'Prague, Czech Republic',\n type: 'keboola',\n projectUrl: null,\n isTrusted: 1,\n} satisfies VendorListItem;\n\nconst thirdPartyVendor = {\n id: 'acme',\n name: 'Acme Co.',\n email: 'dev@acme.example',\n address: 'Springfield',\n projectUrl: 'https://connection.keboola.com/admin/projects/1234',\n type: 'other',\n isTrusted: 0,\n} satisfies VendorListItem;\n\n/** The same vendor as `GET /vendors/{vendor}` returns it — `isTrusted` converted to a boolean. */\nconst vendorDetail = {\n ...thirdPartyVendor,\n isTrusted: false,\n} satisfies Vendor;\n\n// A pending, self-registered vendor. The `_v` id prefix is the marker that keeps it out of the\n// user-selectable vendor list until an admin approves and renames it. Only `GET /admin/vendors`\n// returns it — the public list filters on `isApproved`, and is the only response carrying the flag.\nconst pendingVendor = {\n id: '_v1699999999999',\n name: 'Pending Startup',\n email: 'hello@pending.example',\n address: 'Berlin',\n type: 'other',\n projectUrl: null,\n isApproved: false,\n isPublic: false,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The two public vendors as `GET /admin/vendors` returns them: approved, and `isTrusted` converted\n// to a boolean. They exist so the admin list is not a single pending row — a test that only ever\n// sees `pendingVendor` never exercises the approved path the admin table mostly renders.\nconst keboolaAdminVendor = {\n ...keboolaVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: true,\n} satisfies AdminVendor;\n\nconst thirdPartyAdminVendor = {\n ...thirdPartyVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The vendor as it arrives joined onto an app: five columns, none of the flags.\nconst appVendor = (vendor: VendorListItem): AppVendor => ({\n id: vendor.id,\n name: vendor.name,\n address: vendor.address,\n email: vendor.email,\n type: vendor.type,\n});\n\n/** A published, fully-populated extractor — the shape that passes `hasAllFieldsForPublishing`. */\nconst publishedExtractor = {\n id: 'keboola.ex-db-snowflake',\n vendor: appVendor(keboolaVendor),\n name: 'Snowflake',\n type: 'extractor',\n shortDescription: 'Extract data from Snowflake',\n longDescription: '## Snowflake extractor\\n\\nExtracts tables from a Snowflake database.',\n licenseUrl: 'https://github.com/keboola/ex-db-snowflake/blob/master/LICENSE.md',\n documentationUrl: 'https://help.keboola.com/components/extractors/database/snowflake/',\n sourceCodeUrl: 'https://github.com/keboola/ex-db-snowflake',\n categories: ['Database'],\n complexity: 'easy',\n uiOptions: ['genericDockerUI'],\n defaultBucket: true,\n defaultBucketStage: 'in',\n stagingStorageInput: 'local',\n stagingStorageOutput: 'local',\n logger: 'standard',\n isPublic: true,\n isDeprecated: false,\n fees: false,\n repository: { type: 'ecr', uri: 'keboola/ex-db-snowflake', tag: '1.9.0' },\n // The 128 filename ends in a 13-digit millisecond timestamp, so `getIcon` uses it. A legacy\n // incremental filename here would make `getIcon` fall back to the 64px variant.\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/64/1699999999999.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/128/1699999999999.png',\n },\n version: 12,\n createdBy: 'support@keboola.com',\n updatedOn: '2024-06-01T09:00:00+0200',\n uri: 'docker/keboola.ex-db-snowflake',\n isPublished: true,\n publishedVersion: 12,\n publishingStatus: 'public',\n} satisfies App;\n\n/** A private third-party app with a pending publishing request. */\nconst requestedApp = {\n id: 'acme.wr-widgets',\n vendor: appVendor(thirdPartyVendor),\n name: 'Widget Writer',\n type: 'writer',\n shortDescription: 'Write data to Widgets',\n longDescription: 'Pushes tables into the Widgets API.',\n licenseUrl: 'https://acme.example/license',\n documentationUrl: 'https://acme.example/docs',\n uiOptions: ['genericDockerUI'],\n repository: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/64/1699999999998.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/128/1699999999998.png',\n },\n isPublic: false,\n isDeprecated: false,\n version: 3,\n createdBy: 'dev@acme.example',\n updatedOn: '2024-05-20T14:12:00+0200',\n uri: 'docker/acme.wr-widgets',\n isPublished: false,\n publishingStatus: 'requested',\n publishingRequest: { createdOn: '2024-05-20T14:12:00+0200', rejectionReason: null },\n} satisfies App;\n\n/** A rejected app — carries the reason the vendor sees on its detail page. */\nconst rejectedApp = {\n id: 'acme.app-analyzer',\n vendor: appVendor(thirdPartyVendor),\n name: 'Analyzer',\n type: 'application',\n shortDescription: 'Analyze things',\n isPublic: false,\n isDeprecated: false,\n version: 1,\n createdBy: 'dev@acme.example',\n uri: 'docker/acme.app-analyzer',\n isPublished: false,\n publishingStatus: 'rejected',\n publishingRequest: {\n createdOn: '2024-04-02T11:00:00+0200',\n rejectionReason: 'Documentation URL is missing and the icon is not 256×256.',\n },\n} satisfies App;\n\n/** A deprecated app with an expiry date and a suggested replacement. */\nconst deprecatedApp = {\n id: 'keboola.ex-legacy',\n vendor: appVendor(keboolaVendor),\n name: 'Legacy Extractor',\n type: 'extractor',\n shortDescription: 'Superseded',\n isPublic: true,\n isDeprecated: true,\n expiredOn: '2025-01-01',\n replacementApp: 'keboola.ex-db-snowflake',\n version: 40,\n uri: 'docker/keboola.ex-legacy',\n isPublished: true,\n publishedVersion: 38,\n publishingStatus: 'public',\n} satisfies App;\n\n/**\n * A `data-app`, the type whose edit form hides ~14 fields. Deliberately minimal: a fixture carrying\n * `configurationSchema` or `actions` here would misrepresent what the form can produce.\n */\nconst dataApp = {\n id: 'acme.data-app-dashboard',\n vendor: appVendor(thirdPartyVendor),\n name: 'Dashboard',\n type: 'data-app',\n shortDescription: 'A Streamlit dashboard',\n isPublic: false,\n isDeprecated: false,\n version: 2,\n uri: 'docker/acme.data-app-dashboard',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/** A `code-pattern`, whose `configurationSchema.supported_components` must be a non-empty array. */\nconst codePatternApp = {\n id: 'acme.code-pattern-etl',\n vendor: appVendor(thirdPartyVendor),\n name: 'ETL Pattern',\n type: 'code-pattern',\n shortDescription: 'Generates ETL code',\n actions: ['generate'],\n configurationSchema: { supported_components: ['keboola.snowflake-transformation'] },\n isPublic: false,\n version: 1,\n uri: 'docker/acme.code-pattern-etl',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/**\n * An app typed `other`. The public catalog excludes it entirely, so it exists to prove that\n * exclusion rather than to be rendered.\n */\nconst otherTypeApp = {\n id: 'acme.misc-thing',\n vendor: appVendor(thirdPartyVendor),\n name: 'Misc Thing',\n type: 'other',\n isPublic: true,\n version: 1,\n uri: 'docker/acme.misc-thing',\n isPublished: true,\n publishedVersion: 1,\n publishingStatus: 'public',\n} satisfies App;\n\n// `username` is the Cognito login, which is the user's email — the list endpoints return no\n// separate `email`, and no account state (`status`, `isEnabled`, `mfa`) either.\nconst humanUser = {\n username: 'dev@acme.example',\n name: 'Dev Eloper',\n vendors: ['acme'],\n createdOn: '2024-01-10T08:00:00+0100',\n} satisfies User;\n\n/** A recently added member, for a test that orders the list by `createdOn`. */\nconst newestUser = {\n username: 'new@acme.example',\n name: 'New Hire',\n vendors: ['acme'],\n createdOn: '2024-06-25T08:00:00+0200',\n} satisfies User;\n\n/** A member of no vendor — reachable only through the admin list. */\nconst vendorlessUser = {\n username: 'gone@acme.example',\n name: 'Alan Gone',\n vendors: [],\n createdOn: '2023-02-01T08:00:00+0100',\n} satisfies User;\n\n/** A Keboola staff member — eligible for \"make admin\" because they belong to the `keboola` vendor. */\nconst keboolaStaffUser = {\n username: 'staff@keboola.com',\n name: 'Kai Staff',\n vendors: ['keboola'],\n createdOn: '2023-09-14T08:00:00+0200',\n} satisfies User;\n\n/** A freshly created service account, including the one-time `password`. */\nconst newServiceAccount = {\n username: 'acme+ci',\n description: 'CI deploy pipeline',\n createdOn: '2024-07-01T10:00:00+0200',\n password: 'one-time-secret-shown-once',\n} satisfies ServiceAccount;\n\n/** The same account as later listed — note there is no `password`; it is unreadable after creation. */\nconst existingServiceAccount = {\n username: 'acme+release',\n description: 'Release automation',\n createdOn: '2024-03-11T10:00:00+0100',\n} satisfies ServiceAccount;\n\nconst appChange = {\n appId: 'acme.wr-widgets',\n createdOn: '2024-05-20T14:12:00+0200',\n createdBy: 'dev@acme.example',\n changes: [\n {\n attribute: 'shortDescription',\n oldValue: 'Writes widgets',\n newValue: 'Write data to Widgets',\n },\n {\n attribute: 'repository',\n oldValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.0' },\n newValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n },\n ],\n} satisfies AppChange;\n\n/** The public catalog list: published, non-`other` apps only. */\nexport const listPublishedApps = (): App[] => [publishedExtractor, deprecatedApp];\n\n/** A vendor's own apps, across every publishing state the table renders. */\nexport const listVendorApps = (): App[] => [requestedApp, rejectedApp, dataApp, codePatternApp];\n\n/** The admin list — every vendor, plus the `other`-typed app the public catalog drops. */\nexport const listAllApps = (): App[] => [\n publishedExtractor,\n requestedApp,\n rejectedApp,\n deprecatedApp,\n dataApp,\n codePatternApp,\n otherTypeApp,\n];\n\n/** `GET /vendors` — approved and public only, so the pending vendor cannot appear here. */\nexport const listVendors = (): VendorListItem[] => [keboolaVendor, thirdPartyVendor];\n\n/** `GET /vendors/{vendor}` — the converted shape. */\nexport const getVendor = (): Vendor => vendorDetail;\n\n/** `GET /admin/vendors` — every vendor, and the only response carrying the approval flags. */\nexport const listAllVendors = (): AdminVendor[] => [\n keboolaAdminVendor,\n thirdPartyAdminVendor,\n pendingVendor,\n];\n\nexport const listUsers = (): User[] => [humanUser, newestUser, vendorlessUser, keboolaStaffUser];\n\nexport const listServiceAccounts = (): ServiceAccount[] => [existingServiceAccount];\n\nexport const listAppChanges = (): AppChange[] => [appChange];\n\n/** Named fixtures, for a test that needs one specific state. */\nexport const developerPortalFixtures = {\n apps: {\n published: publishedExtractor,\n requested: requestedApp,\n rejected: rejectedApp,\n deprecated: deprecatedApp,\n dataApp,\n codePattern: codePatternApp,\n otherType: otherTypeApp,\n },\n vendors: {\n keboola: keboolaVendor,\n thirdParty: thirdPartyVendor,\n detail: vendorDetail,\n pending: pendingVendor,\n keboolaAdmin: keboolaAdminVendor,\n thirdPartyAdmin: thirdPartyAdminVendor,\n },\n users: {\n human: humanUser,\n newest: newestUser,\n vendorless: vendorlessUser,\n keboolaStaff: keboolaStaffUser,\n },\n serviceAccounts: {\n created: newServiceAccount,\n existing: existingServiceAccount,\n },\n changes: { single: appChange },\n};\n","import type {\n ApplicationToken,\n CreatedApplicationToken,\n} from '@keboola/api-client/management/types';\n\nconst usedToken = {\n id: 13702,\n description: 'Sandboxes API',\n created: '2021-06-28T22:27:28+02:00',\n lastUsed: '2026-09-20T09:14:02+02:00',\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: ['projects:read', 'manage:storage-tokens'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// Never used — the only signal an operator has that deleting it is safe.\nconst neverUsedToken = {\n id: 13703,\n description: 'Job Runner (staging)',\n created: '2026-02-01T10:00:00+01:00',\n lastUsed: null,\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: [],\n creator: { id: null, name: null },\n} satisfies ApplicationToken;\n\nconst expiringToken = {\n id: 13704,\n description: 'One-off migration',\n created: '2026-09-01T08:00:00+02:00',\n lastUsed: '2026-09-02T08:00:00+02:00',\n expires: '2026-10-01T08:00:00+02:00',\n isDisabled: false,\n isExpired: false,\n scopes: ['deleted-projects:read'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// The create response — the only moment the plaintext secret exists.\nconst createdToken = {\n ...usedToken,\n id: 13705,\n description: 'Newly issued',\n lastUsed: null,\n token: '13705-abcdef0123456789abcdef0123456789abcdef01',\n} satisfies CreatedApplicationToken;\n\n/** A token that has been used and never expires. */\nexport const getApplicationToken = (): ApplicationToken => usedToken;\n\n/** Used, never-used and expiring tokens — the three states the list must render. */\nexport const getApplicationTokens = (): ApplicationToken[] => [\n usedToken,\n neverUsedToken,\n expiringToken,\n];\n\nexport const applicationTokenFixtures = {\n used: usedToken,\n neverUsed: neverUsedToken,\n expiring: expiringToken,\n created: createdToken,\n} satisfies {\n used: ApplicationToken;\n neverUsed: ApplicationToken;\n expiring: ApplicationToken;\n created: CreatedApplicationToken;\n};\n\nexport type { ApplicationToken, CreatedApplicationToken };\n","import type { UiApp, UiAppDetail } from '@keboola/api-client/management/types';\n\nconst activeApp = {\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n version: '1.42.0',\n basePath: 'https://ui.keboola-assets.com/kbc/1.42.0/',\n type: 'text/javascript',\n scripts: ['https://ui.keboola-assets.com/kbc/1.42.0/scripts/main.js'],\n styles: ['https://ui.keboola-assets.com/kbc/1.42.0/styles/main.css'],\n isCritical: false,\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n} satisfies UiApp;\n\n// An app registered but never activated — only reachable through `includeInactive`.\nconst inactiveApp = {\n stringId: 'kbc.orphan',\n name: 'Orphaned build',\n version: null,\n basePath: null,\n type: null,\n scripts: [],\n styles: [],\n isCritical: false,\n commitSha: null,\n} satisfies UiApp;\n\nconst appDetail = {\n id: 41,\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n created: '2015-02-12 11:10:09',\n versions: [\n {\n id: 1646,\n version: '1.42.0',\n created: '2026-09-01 08:12:44',\n isActive: true,\n isCritical: false,\n buildUrl: 'https://github.com/keboola/kbc-ui/actions/runs/1646',\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n },\n {\n id: 1645,\n version: '1.41.0',\n created: '2026-08-25 14:02:10',\n isActive: false,\n isCritical: true,\n buildUrl: null,\n commitSha: null,\n },\n ],\n} satisfies UiAppDetail;\n\n/** One UI application detail with an active and a superseded version. */\nexport const getUiApp = (): UiAppDetail => appDetail;\n\n/** An active application and one with no active version, as `includeInactive` returns them. */\nexport const getUiApps = (): UiApp[] => [activeApp, inactiveApp];\n\nexport const uiAppFixtures = {\n active: activeApp,\n inactive: inactiveApp,\n detail: appDetail,\n} satisfies { active: UiApp; inactive: UiApp; detail: UiAppDetail };\n\nexport type { UiApp, UiAppDetail };\n","import { ServiceId } from '@keboola/api-client/constants';\nimport type { DevBranch, StackInfo, StorageToken } from '@keboola/api-client/storage/types';\n\n/** The stack an MSW-backed test points its client at, unless a caller passes its own. */\nexport const DEFAULT_BASE_URL = 'https://connection.test';\n\ntype StackInfoOptions = {\n /** Stack the fixture describes; its host is what the announced service URLs are built on. */\n baseUrl?: string;\n /** Services the stack announces. Narrow it to test what a client does without one. */\n services?: ServiceId[];\n};\n\ntype StorageTokenOptions = {\n /** Stack the token was issued by — its `uri`. */\n baseUrl?: string;\n /** Project features `hasFeature()` should report — the token's `owner.features`. */\n features?: string[];\n};\n\n/**\n * The stack index `GET /v2/storage` returns.\n *\n * - Announces every `ServiceId` by default, each on its own host, so no service client is a dummy\n * that throws `ServiceUnavailableError` — a test for a queue / data-science / vault hook only\n * adds its handler.\n * - Defaulting to `Object.values(ServiceId)` is what keeps that exhaustive: a service added to the\n * client arrives here without an edit.\n */\nexport const getStackInfo = ({\n baseUrl = DEFAULT_BASE_URL,\n services = Object.values(ServiceId),\n}: StackInfoOptions = {}): StackInfo => {\n const { host } = new URL(baseUrl);\n\n return {\n api: host,\n documentation: 'https://developers.keboola.com',\n host,\n revision: 'test-revision',\n stack: 'test-stack',\n version: 'test-version',\n urlTemplates: { orchestrationJob: '' },\n services: services.map((id) => ({ id, url: `https://${id}.${host}` })),\n components: [],\n features: [],\n };\n};\n\n/**\n * The verified master token `GET /v2/storage/tokens/verify` returns.\n *\n * - Complete on purpose: `api.context.project.sapiToken` is this object verbatim and hooks read deep\n * into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as\n * `undefined`s far from the test that caused them.\n * - Every permission flag is granted; a test needing a restricted token overrides the handler.\n */\nexport const verifyStorageToken = ({\n baseUrl = DEFAULT_BASE_URL,\n features = [],\n}: StorageTokenOptions = {}): StorageToken => ({\n id: 'token-1',\n created: '2024-01-01T00:00:00Z',\n refreshed: '2024-01-01T00:00:00Z',\n description: 'Test token',\n uri: baseUrl,\n isMasterToken: true,\n canManageBuckets: true,\n canManageTokens: true,\n canReadAllFileUploads: true,\n canPurgeTrash: true,\n canManageProtectedDefaultBranch: true,\n canCreateJobs: true,\n canReadAllProjectEvents: true,\n canManageDevBranches: true,\n creatorToken: { id: 42, description: 'Test token' },\n expires: null,\n isExpired: false,\n isDisabled: false,\n isBYODB: false,\n dailyCapacity: 1000,\n bucketPermissions: {},\n owner: {\n id: 42,\n name: 'Test Project',\n type: 'project',\n region: 'us-east-1',\n created: '2024-01-01T00:00:00Z',\n expires: null,\n features,\n dataSizeBytes: 0,\n rowsCount: 0,\n hasMysql: false,\n hasSynapse: false,\n hasRedshift: false,\n hasSnowflake: true,\n hasExasol: false,\n hasTeradata: false,\n hasBigquery: false,\n defaultBackend: 'snowflake',\n hasTryModeOn: 'false',\n limits: {},\n metrics: {},\n isDisabled: false,\n billedMonthlyPrice: null,\n dataRetentionTimeInDays: 30,\n assignedBackends: ['snowflake'],\n fileStorageProvider: 's3',\n },\n organization: { id: 'org-1' },\n admin: { id: 100, name: 'Admin User', features: [], isOrganizationMember: true, role: 'admin' },\n adminOwner: { id: 200, name: 'Owner User', email: 'owner@example.com' },\n});\n\n/**\n * The branch list `GET /v2/storage/dev-branches` returns — the default branch alone.\n *\n * - `context.defaultBranch` is read off it, so the entry must stay `isDefault: true`.\n * - The default branch has no creator, which `DevBranch` models as an empty `creatorToken`.\n */\nexport const getDevBranches = (): DevBranch[] => [\n {\n id: 1,\n name: 'Main',\n description: '',\n isDefault: true,\n created: '2024-01-01T00:00:00Z',\n creatorToken: [],\n },\n];\n","import type { Table, TableDetail } from '@keboola/api-client/storage/types';\n\nconst bucket = {\n id: 'in.c-main',\n name: 'c-main',\n displayName: 'Main',\n stage: 'in' as const,\n description: 'Main input bucket',\n created: '2024-01-15T10:00:00+0100',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n isMaintenance: false,\n isReadOnly: false,\n isSnowflakeSharedDatabase: false,\n hasExternalSchema: false,\n rowsCount: 150000,\n dataSizeBytes: 52428800,\n uri: 'https://connection.keboola.com/v2/storage/buckets/in.c-main',\n backend: 'snowflake' as const,\n backendPath: [],\n databaseName: null,\n color: null,\n idBranch: 0,\n owner: null,\n sharing: null,\n path: 'in.c-main',\n tables: 'https://connection.keboola.com/v2/storage/buckets/in.c-main/tables',\n updated: '2024-06-01T09:00:00+0200',\n isLinkedBucket: false,\n bucketSharingAllowed: true,\n};\n\n// A freshly created table with no imports yet (non-typed, non-alias variant).\nconst freshTable = {\n id: 'in.c-main.users',\n name: 'users',\n displayName: 'Users',\n primaryKey: ['id'],\n metadata: [],\n columns: ['id', 'email', 'name', 'created_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: null,\n lastChangeDate: null,\n rowsCount: 0,\n} satisfies TableDetail;\n\n// A recently updated table with a moderate size (non-typed, non-alias variant).\nconst recentlyUpdatedTable = {\n id: 'in.c-main.orders',\n name: 'orders',\n displayName: 'Orders',\n primaryKey: ['order_id'],\n metadata: [\n {\n id: 'mt1',\n key: 'KBC.createdBy.component.id',\n value: 'keboola.python-transformation',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n columns: ['order_id', 'user_id', 'total', 'status', 'created_at', 'updated_at'],\n columnMetadata: {\n order_id: [\n {\n id: 'm1',\n key: 'KBC.datatype.type',\n value: 'INTEGER',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n },\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-06-01T09:00:00+0200',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n rowsCount: 24500,\n} satisfies TableDetail;\n\n// A large table with many rows representing high-volume data (non-typed, non-alias variant).\nconst largeTable = {\n id: 'in.c-main.events',\n name: 'events',\n displayName: 'Events',\n primaryKey: [],\n metadata: [],\n columns: ['event_id', 'user_id', 'event_type', 'properties', 'occurred_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-03-10T08:30:00+0100',\n lastChangeDate: '2024-03-10T08:30:00+0100',\n rowsCount: 125500,\n} satisfies TableDetail;\n\n/**\n * Returns a single non-typed, non-alias `TableDetail` (fresh, no imports yet).\n *\n * The explicit return type surfaces any divergence from the hand-written `TableDetail` in\n * `@keboola/api-client` as a TypeScript error. That type is not derived from the OpenAPI\n * document, so this annotation and the `satisfies` above are the only mechanical check there is.\n */\nexport const getTable = (): TableDetail => freshTable;\n\n/**\n * Returns three TableDetail objects representing different lifecycle states:\n * 1. Fresh — just created, nothing loaded (`lastImportDate: null`, `rowsCount: 0`).\n * 2. Recently updated — 24 500 rows, imported June 2024.\n * 3. Large — 125 500 rows, imported March 2024.\n *\n * The three row counts add up to the shared bucket's own `rowsCount`, and the bucket's\n * `lastChangeDate` is the newest of theirs, as Storage reports it.\n */\nexport const listTables = (): TableDetail[] => [freshTable, recentlyUpdatedTable, largeTable];\n\n/**\n * Named fixtures for targeted access in tests.\n */\nexport const tableFixtures = {\n fresh: freshTable,\n recentlyUpdated: recentlyUpdatedTable,\n large: largeTable,\n} satisfies Record<'fresh' | 'recentlyUpdated' | 'large', TableDetail>;\n\nexport type { Table, TableDetail };\n","import { appFixtures, getApp, listApps } from './clients/apps/apps';\nimport { deploymentFixtures, getDeployment, listDeployments } from './clients/apps/deployments';\nimport { getAppRun, listAppRuns, runFixtures } from './clients/apps/runs';\nimport {\n getBusinessWorkspaceDashboard,\n getBusinessWorkspaceDashboardInput,\n listBusinessWorkspaceDashboards,\n} from './clients/businessWorkspaceApi/dashboards';\nimport {\n developerPortalFixtures,\n getVendor,\n listAllApps,\n listAllVendors,\n listAppChanges,\n listPublishedApps,\n listServiceAccounts,\n listUsers,\n listVendorApps,\n listVendors,\n} from './clients/developerPortal/apps';\nimport {\n applicationTokenFixtures,\n getApplicationToken,\n getApplicationTokens,\n} from './clients/management/applicationTokens';\nimport { getUiApp, getUiApps, uiAppFixtures } from './clients/management/uiApps';\nimport { getDevBranches, getStackInfo, verifyStorageToken } from './clients/storage/bootstrap';\nimport { getTable, listTables, tableFixtures } from './clients/storage/tables';\n\nexport const fixtures = {\n management: {\n applicationTokens: {\n getApplicationToken,\n getApplicationTokens,\n fixtures: applicationTokenFixtures,\n },\n uiApps: {\n getUiApp,\n getUiApps,\n fixtures: uiAppFixtures,\n },\n },\n storage: {\n bootstrap: {\n getStackInfo,\n verifyStorageToken,\n getDevBranches,\n },\n tables: {\n getTable,\n listTables,\n fixtures: tableFixtures,\n },\n },\n apps: {\n apps: {\n getApp,\n listApps,\n fixtures: appFixtures,\n },\n deployments: {\n getDeployment,\n listDeployments,\n fixtures: deploymentFixtures,\n },\n runs: {\n getAppRun,\n listAppRuns,\n fixtures: runFixtures,\n },\n },\n businessWorkspaceApi: {\n dashboards: {\n getDashboard: getBusinessWorkspaceDashboard,\n listDashboards: listBusinessWorkspaceDashboards,\n getDashboardInput: getBusinessWorkspaceDashboardInput,\n },\n },\n developerPortal: {\n listPublishedApps,\n listVendorApps,\n listAllApps,\n listAllVendors,\n getVendor,\n listVendors,\n listUsers,\n listServiceAccounts,\n listAppChanges,\n fixtures: developerPortalFixtures,\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["base","ServiceId"],"sources":["../src/clients/apps/deployments.ts","../src/clients/apps/apps.ts","../src/clients/apps/runs.ts","../src/clients/developerPortal/apps.ts","../src/clients/management/applicationTokens.ts","../src/clients/management/uiApps.ts","../src/clients/storage/bootstrap.ts","../src/clients/storage/tables.ts","../src/fixtures.ts"],"sourcesContent":["import type { Deployment } from '@keboola/api-client/apps/types';\n\nexport const APP_ID = '374811';\n\n// UUIDv7: ids sort in creation order.\nconst deploymentId = (suffix: string) => `019f1c3a-${suffix}-7c1e-b4a2-0d9f3e6a8c15`;\n\n// Deleted: the row outlives its workload and stays in history.\nconst archivedDeployment = {\n id: deploymentId('0a41'),\n configVersion: '14',\n gitCommitSha: null,\n runtimeSize: 'tiny' as const,\n buildState: 'ready' as const,\n runState: 'stopped' as const,\n archived: true,\n archivedAt: '2026-08-15T11:03:02+00:00',\n createdAt: '2026-08-10T09:12:44+00:00',\n} satisfies Deployment;\n\n// Serving production — the one `appFixtures.running.production` points at.\nconst liveDeployment = {\n id: deploymentId('1b52'),\n configVersion: '16',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'running' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-15T11:02:58+00:00',\n} satisfies Deployment;\n\n// Created with `promote: false`: built, never started.\nconst stagedDeployment = {\n id: deploymentId('2c63'),\n configVersion: '18',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T08:41:19+00:00',\n} satisfies Deployment;\n\n// Can never run — distinct from a run failure. Unreachable today (deployments start from a\n// ready image); the headline table treats it as a contract.\nconst buildFailedDeployment = {\n id: deploymentId('3d74'),\n configVersion: '19',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'failed' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:05:33+00:00',\n} satisfies Deployment;\n\n// Built fine, crashed on every run — `getAppRuns` carries the cause.\nconst runFailedDeployment = {\n id: deploymentId('4e85'),\n configVersion: '20',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'failed' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:31:07+00:00',\n} satisfies Deployment;\n\nexport const deploymentFixtures = {\n archived: archivedDeployment,\n live: liveDeployment,\n staged: stagedDeployment,\n buildFailed: buildFailedDeployment,\n runFailed: runFailedDeployment,\n} satisfies Record<'archived' | 'live' | 'staged' | 'buildFailed' | 'runFailed', Deployment>;\n\nexport const getDeployment = (): Deployment => liveDeployment;\n\n/**\n * All deployments as one history.\n *\n * - Includes the failed ones: `runFixtures.failed` joins to the last.\n * - Oldest first on purpose: the endpoint specifies no order, so consumers must sort.\n */\nexport const listDeployments = (): Deployment[] => [\n archivedDeployment,\n liveDeployment,\n stagedDeployment,\n buildFailedDeployment,\n runFailedDeployment,\n];\n","import type { App } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst APP_URL = 'https://hello-dashboard-374811.hub.canary-orion.keboola.dev';\n\nconst base = {\n id: APP_ID,\n projectId: '14',\n componentId: 'keboola.data-apps',\n branchId: '6',\n configId: '01kz9kny4n49x3xk0e4k8ynpmq',\n type: 'streamlit' as const,\n url: APP_URL,\n};\n\nconst production = (deployment: (typeof deploymentFixtures)[keyof typeof deploymentFixtures]) => ({\n desiredDeploymentId: deployment.id,\n actualDeploymentId: deployment.id,\n});\n\nconst NOTHING_IN_PRODUCTION = { desiredDeploymentId: null, actualDeploymentId: null };\n\n// Created through `/v2`, nothing deployed yet: the URL is reserved and publicly 404s.\nconst neverDeployedApp = {\n ...base,\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n/**\n * An app created and started through `/v1`, serving real traffic (AJDA-3140, probe P1: HTTP 200,\n * 8340 B at the moment this was read), which `/v2` nonetheless reports as `notDeployed` with an\n * empty `production` because it was never adopted into the deployments model.\n *\n * The Builder must never read \"is this app serving\" off `state` alone — here that answer is\n * wrong in the most damaging direction.\n */\nconst legacyV1ServingApp = {\n ...base,\n id: '374899',\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n// Serving the live deployment.\nconst runningApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'running' as const,\n} satisfies App;\n\n/**\n * A blue/green promotion in flight: the staged deployment has been asked for, the live one is still\n * what traffic reaches. `state` stays `running` throughout — the rollout is only visible as\n * `desiredDeploymentId !== actualDeploymentId`.\n */\nconst promotingApp = {\n ...base,\n production: {\n desiredDeploymentId: deploymentFixtures.staged.id,\n actualDeploymentId: deploymentFixtures.live.id,\n },\n state: 'running' as const,\n} satisfies App;\n\n// Idle between visits and armed to wake on the next request — normal, not an outage.\nconst suspendedApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'suspended' as const,\n} satisfies App;\n\n// Stopped by a failure and will not auto-wake: a visitor sees the restart-disabled page until\n// someone starts it explicitly.\nconst disabledApp = {\n ...base,\n production: production(deploymentFixtures.runFailed),\n state: 'disabled' as const,\n} satisfies App;\n\nexport const appFixtures = {\n neverDeployed: neverDeployedApp,\n legacyV1Serving: legacyV1ServingApp,\n running: runningApp,\n promoting: promotingApp,\n suspended: suspendedApp,\n disabled: disabledApp,\n} satisfies Record<\n 'neverDeployed' | 'legacyV1Serving' | 'running' | 'promoting' | 'suspended' | 'disabled',\n App\n>;\n\nexport const getApp = (): App => runningApp;\n\n/**\n * The named fixtures above are all the *same* app in different states, which is what a detail\n * page shows. A listing shows different apps, so each entry past the first is re-addressed.\n */\nconst readdress = (app: App, id: string): App => ({\n ...app,\n id,\n url: `https://data-app-${id}.hub.canary-orion.keboola.dev`,\n});\n\nexport const listApps = (): App[] => [\n runningApp,\n readdress(suspendedApp, '374812'),\n readdress(neverDeployedApp, '374813'),\n];\n","import type { AppRun } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst base = {\n appId: APP_ID,\n runtimeSize: 'small',\n runtimeBackendType: 'streamlit',\n imageVersion: '1.14.2',\n mode: 'prod',\n};\n\nconst runningRun = {\n ...base,\n id: '4f2d8c1a-0b76-4e35-9a12-5c8e7d3b0f41',\n deploymentId: deploymentFixtures.live.id,\n configVersion: deploymentFixtures.live.configVersion,\n state: 'running' as const,\n createdAt: '2026-08-15T11:02:58+00:00',\n startedAt: '2026-08-15T11:03:41+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nconst finishedRun = {\n ...base,\n id: '9c0a7e42-31bd-4f88-b6d5-2ea41f907c3b',\n deploymentId: deploymentFixtures.archived.id,\n configVersion: deploymentFixtures.archived.configVersion,\n state: 'finished' as const,\n createdAt: '2026-08-10T09:12:44+00:00',\n startedAt: '2026-08-10T09:13:29+00:00',\n stoppedAt: '2026-08-15T11:03:02+00:00',\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\n/**\n * A classified failure transcribed from canary (AJDA-3140, probe P1). `startedAt` is `null`\n * even though a cause was attributed — the container executed but its startup probe never\n * passed, so a classified failure says nothing about how far the run got.\n */\nconst failedRun = {\n ...base,\n id: 'ba53f9d0-7c41-4a2e-8f16-d0b9e254a7c6',\n deploymentId: deploymentFixtures.runFailed.id,\n configVersion: deploymentFixtures.runFailed.configVersion,\n state: 'failed' as const,\n createdAt: '2026-08-17T09:31:07+00:00',\n startedAt: null,\n stoppedAt: '2026-08-17T09:33:52+00:00',\n startupLogs:\n '[INFO] Starting app\\n[ERROR] App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx\\n',\n failureReason: {\n reason: 'StartupProbeFailed',\n message: 'App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx',\n },\n} satisfies AppRun;\n\n/**\n * A run that belongs to the app itself rather than to a deployment — what every run of a\n * `/v1`-created app looks like. `deploymentId: null` is permanent for these, not drift.\n */\nconst legacyRun = {\n ...base,\n id: '1d7b4e05-8a92-4c63-b0f7-3e6a5c8192d4',\n deploymentId: null,\n configVersion: '2',\n state: 'running' as const,\n createdAt: '2026-08-17T10:02:11+00:00',\n startedAt: '2026-08-17T10:02:51+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nexport const runFixtures = {\n running: runningRun,\n finished: finishedRun,\n failed: failedRun,\n legacy: legacyRun,\n} satisfies Record<'running' | 'finished' | 'failed' | 'legacy', AppRun>;\n\nexport const getAppRun = (): AppRun => runningRun;\n\n/**\n * Every run this app has, newest first — the order the endpoint documents, so a consumer that\n * relies on it (`[latest] = runs`) is exercised against data that keeps the promise rather than\n * data that happens to contradict it.\n */\nexport const listAppRuns = (): AppRun[] => [legacyRun, failedRun, runningRun, finishedRun];\n","import type {\n AdminVendor,\n App,\n AppChange,\n AppVendor,\n ServiceAccount,\n User,\n Vendor,\n VendorListItem,\n} from '@keboola/api-client/developerPortal/types';\n\n// `isTrusted` is the raw tinyint here and a boolean in `vendorDetail` below. That is not a fixture\n// inconsistency: `GET /vendors` returns the row unconverted, every other vendor endpoint runs it\n// through `publicGetVendor`. A fixture that smoothed it over would hide the difference consumers\n// have to handle.\n//\n// `type: 'keboola'` is what the public catalog's \"Supported by Keboola\" filter matches on — NOT\n// `id`, so a fixture that only set the id would silently fail to exercise that filter.\nconst keboolaVendor = {\n id: 'keboola',\n name: 'Keboola',\n email: 'support@keboola.com',\n address: 'Prague, Czech Republic',\n type: 'keboola',\n projectUrl: null,\n isTrusted: 1,\n} satisfies VendorListItem;\n\nconst thirdPartyVendor = {\n id: 'acme',\n name: 'Acme Co.',\n email: 'dev@acme.example',\n address: 'Springfield',\n projectUrl: 'https://connection.keboola.com/admin/projects/1234',\n type: 'other',\n isTrusted: 0,\n} satisfies VendorListItem;\n\n/** The same vendor as `GET /vendors/{vendor}` returns it — `isTrusted` converted to a boolean. */\nconst vendorDetail = {\n ...thirdPartyVendor,\n isTrusted: false,\n} satisfies Vendor;\n\n// A pending, self-registered vendor. The `_v` id prefix is the marker that keeps it out of the\n// user-selectable vendor list until an admin approves and renames it. Only `GET /admin/vendors`\n// returns it — the public list filters on `isApproved`, and is the only response carrying the flag.\nconst pendingVendor = {\n id: '_v1699999999999',\n name: 'Pending Startup',\n email: 'hello@pending.example',\n address: 'Berlin',\n type: 'other',\n projectUrl: null,\n isApproved: false,\n isPublic: false,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The two public vendors as `GET /admin/vendors` returns them: approved, and `isTrusted` converted\n// to a boolean. They exist so the admin list is not a single pending row — a test that only ever\n// sees `pendingVendor` never exercises the approved path the admin table mostly renders.\nconst keboolaAdminVendor = {\n ...keboolaVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: true,\n} satisfies AdminVendor;\n\nconst thirdPartyAdminVendor = {\n ...thirdPartyVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The vendor as it arrives joined onto an app: five columns, none of the flags.\nconst appVendor = (vendor: VendorListItem): AppVendor => ({\n id: vendor.id,\n name: vendor.name,\n address: vendor.address,\n email: vendor.email,\n type: vendor.type,\n});\n\n/** A published, fully-populated extractor — the shape that passes `hasAllFieldsForPublishing`. */\nconst publishedExtractor = {\n id: 'keboola.ex-db-snowflake',\n vendor: appVendor(keboolaVendor),\n name: 'Snowflake',\n type: 'extractor',\n shortDescription: 'Extract data from Snowflake',\n longDescription: '## Snowflake extractor\\n\\nExtracts tables from a Snowflake database.',\n licenseUrl: 'https://github.com/keboola/ex-db-snowflake/blob/master/LICENSE.md',\n documentationUrl: 'https://help.keboola.com/components/extractors/database/snowflake/',\n sourceCodeUrl: 'https://github.com/keboola/ex-db-snowflake',\n categories: ['Database'],\n complexity: 'easy',\n uiOptions: ['genericDockerUI'],\n defaultBucket: true,\n defaultBucketStage: 'in',\n stagingStorageInput: 'local',\n stagingStorageOutput: 'local',\n logger: 'standard',\n isPublic: true,\n isDeprecated: false,\n fees: false,\n repository: { type: 'ecr', uri: 'keboola/ex-db-snowflake', tag: '1.9.0' },\n // The 128 filename ends in a 13-digit millisecond timestamp, so `getIcon` uses it. A legacy\n // incremental filename here would make `getIcon` fall back to the 64px variant.\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/64/1699999999999.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/128/1699999999999.png',\n },\n version: 12,\n createdBy: 'support@keboola.com',\n updatedOn: '2024-06-01T09:00:00+0200',\n uri: 'docker/keboola.ex-db-snowflake',\n isPublished: true,\n publishedVersion: 12,\n publishingStatus: 'public',\n} satisfies App;\n\n/** A private third-party app with a pending publishing request. */\nconst requestedApp = {\n id: 'acme.wr-widgets',\n vendor: appVendor(thirdPartyVendor),\n name: 'Widget Writer',\n type: 'writer',\n shortDescription: 'Write data to Widgets',\n longDescription: 'Pushes tables into the Widgets API.',\n licenseUrl: 'https://acme.example/license',\n documentationUrl: 'https://acme.example/docs',\n uiOptions: ['genericDockerUI'],\n repository: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/64/1699999999998.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/128/1699999999998.png',\n },\n isPublic: false,\n isDeprecated: false,\n version: 3,\n createdBy: 'dev@acme.example',\n updatedOn: '2024-05-20T14:12:00+0200',\n uri: 'docker/acme.wr-widgets',\n isPublished: false,\n publishingStatus: 'requested',\n publishingRequest: { createdOn: '2024-05-20T14:12:00+0200', rejectionReason: null },\n} satisfies App;\n\n/** A rejected app — carries the reason the vendor sees on its detail page. */\nconst rejectedApp = {\n id: 'acme.app-analyzer',\n vendor: appVendor(thirdPartyVendor),\n name: 'Analyzer',\n type: 'application',\n shortDescription: 'Analyze things',\n isPublic: false,\n isDeprecated: false,\n version: 1,\n createdBy: 'dev@acme.example',\n uri: 'docker/acme.app-analyzer',\n isPublished: false,\n publishingStatus: 'rejected',\n publishingRequest: {\n createdOn: '2024-04-02T11:00:00+0200',\n rejectionReason: 'Documentation URL is missing and the icon is not 256×256.',\n },\n} satisfies App;\n\n/** A deprecated app with an expiry date and a suggested replacement. */\nconst deprecatedApp = {\n id: 'keboola.ex-legacy',\n vendor: appVendor(keboolaVendor),\n name: 'Legacy Extractor',\n type: 'extractor',\n shortDescription: 'Superseded',\n isPublic: true,\n isDeprecated: true,\n expiredOn: '2025-01-01',\n replacementApp: 'keboola.ex-db-snowflake',\n version: 40,\n uri: 'docker/keboola.ex-legacy',\n isPublished: true,\n publishedVersion: 38,\n publishingStatus: 'public',\n} satisfies App;\n\n/**\n * A `data-app`, the type whose edit form hides ~14 fields. Deliberately minimal: a fixture carrying\n * `configurationSchema` or `actions` here would misrepresent what the form can produce.\n */\nconst dataApp = {\n id: 'acme.data-app-dashboard',\n vendor: appVendor(thirdPartyVendor),\n name: 'Dashboard',\n type: 'data-app',\n shortDescription: 'A Streamlit dashboard',\n isPublic: false,\n isDeprecated: false,\n version: 2,\n uri: 'docker/acme.data-app-dashboard',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/** A `code-pattern`, whose `configurationSchema.supported_components` must be a non-empty array. */\nconst codePatternApp = {\n id: 'acme.code-pattern-etl',\n vendor: appVendor(thirdPartyVendor),\n name: 'ETL Pattern',\n type: 'code-pattern',\n shortDescription: 'Generates ETL code',\n actions: ['generate'],\n configurationSchema: { supported_components: ['keboola.snowflake-transformation'] },\n isPublic: false,\n version: 1,\n uri: 'docker/acme.code-pattern-etl',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/**\n * An app typed `other`. The public catalog excludes it entirely, so it exists to prove that\n * exclusion rather than to be rendered.\n */\nconst otherTypeApp = {\n id: 'acme.misc-thing',\n vendor: appVendor(thirdPartyVendor),\n name: 'Misc Thing',\n type: 'other',\n isPublic: true,\n version: 1,\n uri: 'docker/acme.misc-thing',\n isPublished: true,\n publishedVersion: 1,\n publishingStatus: 'public',\n} satisfies App;\n\n// `username` is the Cognito login, which is the user's email — the list endpoints return no\n// separate `email`, and no account state (`status`, `isEnabled`, `mfa`) either.\nconst humanUser = {\n username: 'dev@acme.example',\n name: 'Dev Eloper',\n vendors: ['acme'],\n createdOn: '2024-01-10T08:00:00+0100',\n} satisfies User;\n\n/** A recently added member, for a test that orders the list by `createdOn`. */\nconst newestUser = {\n username: 'new@acme.example',\n name: 'New Hire',\n vendors: ['acme'],\n createdOn: '2024-06-25T08:00:00+0200',\n} satisfies User;\n\n/** A member of no vendor — reachable only through the admin list. */\nconst vendorlessUser = {\n username: 'gone@acme.example',\n name: 'Alan Gone',\n vendors: [],\n createdOn: '2023-02-01T08:00:00+0100',\n} satisfies User;\n\n/** A Keboola staff member — eligible for \"make admin\" because they belong to the `keboola` vendor. */\nconst keboolaStaffUser = {\n username: 'staff@keboola.com',\n name: 'Kai Staff',\n vendors: ['keboola'],\n createdOn: '2023-09-14T08:00:00+0200',\n} satisfies User;\n\n/** A freshly created service account, including the one-time `password`. */\nconst newServiceAccount = {\n username: 'acme+ci',\n description: 'CI deploy pipeline',\n createdOn: '2024-07-01T10:00:00+0200',\n password: 'one-time-secret-shown-once',\n} satisfies ServiceAccount;\n\n/** The same account as later listed — note there is no `password`; it is unreadable after creation. */\nconst existingServiceAccount = {\n username: 'acme+release',\n description: 'Release automation',\n createdOn: '2024-03-11T10:00:00+0100',\n} satisfies ServiceAccount;\n\nconst appChange = {\n id: 'acme.wr-widgets',\n createdOn: '2024-05-20T14:12:00+0200',\n createdBy: 'dev@acme.example',\n changes: [\n {\n attribute: 'shortDescription',\n oldValue: 'Writes widgets',\n newValue: 'Write data to Widgets',\n description: 'Attribute shortDescription changed',\n },\n {\n attribute: 'repository',\n oldValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.0' },\n newValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n description: 'Attribute repository changed',\n },\n ],\n} satisfies AppChange;\n\n/** The public catalog list: published, non-`other` apps only. */\nexport const listPublishedApps = (): App[] => [publishedExtractor, deprecatedApp];\n\n/** A vendor's own apps, across every publishing state the table renders. */\nexport const listVendorApps = (): App[] => [requestedApp, rejectedApp, dataApp, codePatternApp];\n\n/** The admin list — every vendor, plus the `other`-typed app the public catalog drops. */\nexport const listAllApps = (): App[] => [\n publishedExtractor,\n requestedApp,\n rejectedApp,\n deprecatedApp,\n dataApp,\n codePatternApp,\n otherTypeApp,\n];\n\n/** `GET /vendors` — approved and public only, so the pending vendor cannot appear here. */\nexport const listVendors = (): VendorListItem[] => [keboolaVendor, thirdPartyVendor];\n\n/** `GET /vendors/{vendor}` — the converted shape. */\nexport const getVendor = (): Vendor => vendorDetail;\n\n/** `GET /admin/vendors` — every vendor, and the only response carrying the approval flags. */\nexport const listAllVendors = (): AdminVendor[] => [\n keboolaAdminVendor,\n thirdPartyAdminVendor,\n pendingVendor,\n];\n\nexport const listUsers = (): User[] => [humanUser, newestUser, vendorlessUser, keboolaStaffUser];\n\nexport const listServiceAccounts = (): ServiceAccount[] => [existingServiceAccount];\n\nexport const listAppChanges = (): AppChange[] => [appChange];\n\n/** Named fixtures, for a test that needs one specific state. */\nexport const developerPortalFixtures = {\n apps: {\n published: publishedExtractor,\n requested: requestedApp,\n rejected: rejectedApp,\n deprecated: deprecatedApp,\n dataApp,\n codePattern: codePatternApp,\n otherType: otherTypeApp,\n },\n vendors: {\n keboola: keboolaVendor,\n thirdParty: thirdPartyVendor,\n detail: vendorDetail,\n pending: pendingVendor,\n keboolaAdmin: keboolaAdminVendor,\n thirdPartyAdmin: thirdPartyAdminVendor,\n },\n users: {\n human: humanUser,\n newest: newestUser,\n vendorless: vendorlessUser,\n keboolaStaff: keboolaStaffUser,\n },\n serviceAccounts: {\n created: newServiceAccount,\n existing: existingServiceAccount,\n },\n changes: { single: appChange },\n};\n","import type {\n ApplicationToken,\n CreatedApplicationToken,\n} from '@keboola/api-client/management/types';\n\nconst usedToken = {\n id: 13702,\n description: 'Sandboxes API',\n created: '2021-06-28T22:27:28+02:00',\n lastUsed: '2026-09-20T09:14:02+02:00',\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: ['projects:read', 'manage:storage-tokens'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// Never used — the only signal an operator has that deleting it is safe.\nconst neverUsedToken = {\n id: 13703,\n description: 'Job Runner (staging)',\n created: '2026-02-01T10:00:00+01:00',\n lastUsed: null,\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: [],\n creator: { id: null, name: null },\n} satisfies ApplicationToken;\n\nconst expiringToken = {\n id: 13704,\n description: 'One-off migration',\n created: '2026-09-01T08:00:00+02:00',\n lastUsed: '2026-09-02T08:00:00+02:00',\n expires: '2026-10-01T08:00:00+02:00',\n isDisabled: false,\n isExpired: false,\n scopes: ['deleted-projects:read'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// The create response — the only moment the plaintext secret exists.\nconst createdToken = {\n ...usedToken,\n id: 13705,\n description: 'Newly issued',\n lastUsed: null,\n token: '13705-abcdef0123456789abcdef0123456789abcdef01',\n} satisfies CreatedApplicationToken;\n\n/** A token that has been used and never expires. */\nexport const getApplicationToken = (): ApplicationToken => usedToken;\n\n/** Used, never-used and expiring tokens — the three states the list must render. */\nexport const getApplicationTokens = (): ApplicationToken[] => [\n usedToken,\n neverUsedToken,\n expiringToken,\n];\n\nexport const applicationTokenFixtures = {\n used: usedToken,\n neverUsed: neverUsedToken,\n expiring: expiringToken,\n created: createdToken,\n} satisfies {\n used: ApplicationToken;\n neverUsed: ApplicationToken;\n expiring: ApplicationToken;\n created: CreatedApplicationToken;\n};\n\nexport type { ApplicationToken, CreatedApplicationToken };\n","import type { UiApp, UiAppDetail } from '@keboola/api-client/management/types';\n\nconst activeApp = {\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n version: '1.42.0',\n basePath: 'https://ui.keboola-assets.com/kbc/1.42.0/',\n type: 'text/javascript',\n scripts: ['https://ui.keboola-assets.com/kbc/1.42.0/scripts/main.js'],\n styles: ['https://ui.keboola-assets.com/kbc/1.42.0/styles/main.css'],\n isCritical: false,\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n} satisfies UiApp;\n\n// An app registered but never activated — only reachable through `includeInactive`.\nconst inactiveApp = {\n stringId: 'kbc.orphan',\n name: 'Orphaned build',\n version: null,\n basePath: null,\n type: null,\n scripts: [],\n styles: [],\n isCritical: false,\n commitSha: null,\n} satisfies UiApp;\n\nconst appDetail = {\n id: 41,\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n created: '2015-02-12 11:10:09',\n versions: [\n {\n id: 1646,\n version: '1.42.0',\n created: '2026-09-01 08:12:44',\n isActive: true,\n isCritical: false,\n buildUrl: 'https://github.com/keboola/kbc-ui/actions/runs/1646',\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n },\n {\n id: 1645,\n version: '1.41.0',\n created: '2026-08-25 14:02:10',\n isActive: false,\n isCritical: true,\n buildUrl: null,\n commitSha: null,\n },\n ],\n} satisfies UiAppDetail;\n\n/** One UI application detail with an active and a superseded version. */\nexport const getUiApp = (): UiAppDetail => appDetail;\n\n/** An active application and one with no active version, as `includeInactive` returns them. */\nexport const getUiApps = (): UiApp[] => [activeApp, inactiveApp];\n\nexport const uiAppFixtures = {\n active: activeApp,\n inactive: inactiveApp,\n detail: appDetail,\n} satisfies { active: UiApp; inactive: UiApp; detail: UiAppDetail };\n\nexport type { UiApp, UiAppDetail };\n","import { ServiceId } from '@keboola/api-client/constants';\nimport type { DevBranch, StackInfo, StorageToken } from '@keboola/api-client/storage/types';\n\n/** The stack an MSW-backed test points its client at, unless a caller passes its own. */\nexport const DEFAULT_BASE_URL = 'https://connection.test';\n\ntype StackInfoOptions = {\n /** Stack the fixture describes; its host is what the announced service URLs are built on. */\n baseUrl?: string;\n /** Services the stack announces. Narrow it to test what a client does without one. */\n services?: ServiceId[];\n};\n\ntype StorageTokenOptions = {\n /** Stack the token was issued by — its `uri`. */\n baseUrl?: string;\n /** Project features `hasFeature()` should report — the token's `owner.features`. */\n features?: string[];\n};\n\n/**\n * The stack index `GET /v2/storage` returns.\n *\n * - Announces every `ServiceId` by default, each on its own host, so no service client is a dummy\n * that throws `ServiceUnavailableError` — a test for a queue / data-science / vault hook only\n * adds its handler.\n * - Defaulting to `Object.values(ServiceId)` is what keeps that exhaustive: a service added to the\n * client arrives here without an edit.\n */\nexport const getStackInfo = ({\n baseUrl = DEFAULT_BASE_URL,\n services = Object.values(ServiceId),\n}: StackInfoOptions = {}): StackInfo => {\n const { host } = new URL(baseUrl);\n\n return {\n api: host,\n documentation: 'https://developers.keboola.com',\n host,\n revision: 'test-revision',\n stack: 'test-stack',\n version: 'test-version',\n urlTemplates: { orchestrationJob: '' },\n services: services.map((id) => ({ id, url: `https://${id}.${host}` })),\n components: [],\n features: [],\n };\n};\n\n/**\n * The verified master token `GET /v2/storage/tokens/verify` returns.\n *\n * - Complete on purpose: `api.context.project.sapiToken` is this object verbatim and hooks read deep\n * into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as\n * `undefined`s far from the test that caused them.\n * - Every permission flag is granted; a test needing a restricted token overrides the handler.\n */\nexport const verifyStorageToken = ({\n baseUrl = DEFAULT_BASE_URL,\n features = [],\n}: StorageTokenOptions = {}): StorageToken => ({\n id: 'token-1',\n created: '2024-01-01T00:00:00Z',\n refreshed: '2024-01-01T00:00:00Z',\n description: 'Test token',\n uri: baseUrl,\n isMasterToken: true,\n canManageBuckets: true,\n canManageTokens: true,\n canReadAllFileUploads: true,\n canPurgeTrash: true,\n canManageProtectedDefaultBranch: true,\n canCreateJobs: true,\n canReadAllProjectEvents: true,\n canManageDevBranches: true,\n creatorToken: { id: 42, description: 'Test token' },\n expires: null,\n isExpired: false,\n isDisabled: false,\n isBYODB: false,\n dailyCapacity: 1000,\n bucketPermissions: {},\n owner: {\n id: 42,\n name: 'Test Project',\n type: 'project',\n region: 'us-east-1',\n created: '2024-01-01T00:00:00Z',\n expires: null,\n features,\n dataSizeBytes: 0,\n rowsCount: 0,\n hasMysql: false,\n hasSynapse: false,\n hasRedshift: false,\n hasSnowflake: true,\n hasExasol: false,\n hasTeradata: false,\n hasBigquery: false,\n defaultBackend: 'snowflake',\n hasTryModeOn: 'false',\n limits: {},\n metrics: {},\n isDisabled: false,\n billedMonthlyPrice: null,\n dataRetentionTimeInDays: 30,\n assignedBackends: ['snowflake'],\n fileStorageProvider: 's3',\n },\n organization: { id: 'org-1' },\n admin: { id: 100, name: 'Admin User', features: [], isOrganizationMember: true, role: 'admin' },\n adminOwner: { id: 200, name: 'Owner User', email: 'owner@example.com' },\n});\n\n/**\n * The branch list `GET /v2/storage/dev-branches` returns — the default branch alone.\n *\n * - `context.defaultBranch` is read off it, so the entry must stay `isDefault: true`.\n * - The default branch has no creator, which `DevBranch` models as an empty `creatorToken`.\n */\nexport const getDevBranches = (): DevBranch[] => [\n {\n id: 1,\n name: 'Main',\n description: '',\n isDefault: true,\n created: '2024-01-01T00:00:00Z',\n creatorToken: [],\n },\n];\n","import type { Table, TableDetail } from '@keboola/api-client/storage/types';\n\nconst bucket = {\n id: 'in.c-main',\n name: 'c-main',\n displayName: 'Main',\n stage: 'in' as const,\n description: 'Main input bucket',\n created: '2024-01-15T10:00:00+0100',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n isMaintenance: false,\n isReadOnly: false,\n isSnowflakeSharedDatabase: false,\n hasExternalSchema: false,\n rowsCount: 150000,\n dataSizeBytes: 52428800,\n uri: 'https://connection.keboola.com/v2/storage/buckets/in.c-main',\n backend: 'snowflake' as const,\n backendPath: [],\n databaseName: null,\n color: null,\n idBranch: 0,\n owner: null,\n sharing: null,\n path: 'in.c-main',\n tables: 'https://connection.keboola.com/v2/storage/buckets/in.c-main/tables',\n updated: '2024-06-01T09:00:00+0200',\n isLinkedBucket: false,\n bucketSharingAllowed: true,\n};\n\n// A freshly created table with no imports yet (non-typed, non-alias variant).\nconst freshTable = {\n id: 'in.c-main.users',\n name: 'users',\n displayName: 'Users',\n primaryKey: ['id'],\n metadata: [],\n columns: ['id', 'email', 'name', 'created_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: null,\n lastChangeDate: null,\n rowsCount: 0,\n} satisfies TableDetail;\n\n// A recently updated table with a moderate size (non-typed, non-alias variant).\nconst recentlyUpdatedTable = {\n id: 'in.c-main.orders',\n name: 'orders',\n displayName: 'Orders',\n primaryKey: ['order_id'],\n metadata: [\n {\n id: 'mt1',\n key: 'KBC.createdBy.component.id',\n value: 'keboola.python-transformation',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n columns: ['order_id', 'user_id', 'total', 'status', 'created_at', 'updated_at'],\n columnMetadata: {\n order_id: [\n {\n id: 'm1',\n key: 'KBC.datatype.type',\n value: 'INTEGER',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n },\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-06-01T09:00:00+0200',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n rowsCount: 24500,\n} satisfies TableDetail;\n\n// A large table with many rows representing high-volume data (non-typed, non-alias variant).\nconst largeTable = {\n id: 'in.c-main.events',\n name: 'events',\n displayName: 'Events',\n primaryKey: [],\n metadata: [],\n columns: ['event_id', 'user_id', 'event_type', 'properties', 'occurred_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-03-10T08:30:00+0100',\n lastChangeDate: '2024-03-10T08:30:00+0100',\n rowsCount: 125500,\n} satisfies TableDetail;\n\n/**\n * Returns a single non-typed, non-alias `TableDetail` (fresh, no imports yet).\n *\n * The explicit return type surfaces any divergence from the hand-written `TableDetail` in\n * `@keboola/api-client` as a TypeScript error. That type is not derived from the OpenAPI\n * document, so this annotation and the `satisfies` above are the only mechanical check there is.\n */\nexport const getTable = (): TableDetail => freshTable;\n\n/**\n * Returns three TableDetail objects representing different lifecycle states:\n * 1. Fresh — just created, nothing loaded (`lastImportDate: null`, `rowsCount: 0`).\n * 2. Recently updated — 24 500 rows, imported June 2024.\n * 3. Large — 125 500 rows, imported March 2024.\n *\n * The three row counts add up to the shared bucket's own `rowsCount`, and the bucket's\n * `lastChangeDate` is the newest of theirs, as Storage reports it.\n */\nexport const listTables = (): TableDetail[] => [freshTable, recentlyUpdatedTable, largeTable];\n\n/**\n * Named fixtures for targeted access in tests.\n */\nexport const tableFixtures = {\n fresh: freshTable,\n recentlyUpdated: recentlyUpdatedTable,\n large: largeTable,\n} satisfies Record<'fresh' | 'recentlyUpdated' | 'large', TableDetail>;\n\nexport type { Table, TableDetail };\n","import { appFixtures, getApp, listApps } from './clients/apps/apps';\nimport { deploymentFixtures, getDeployment, listDeployments } from './clients/apps/deployments';\nimport { getAppRun, listAppRuns, runFixtures } from './clients/apps/runs';\nimport {\n developerPortalFixtures,\n getVendor,\n listAllApps,\n listAllVendors,\n listAppChanges,\n listPublishedApps,\n listServiceAccounts,\n listUsers,\n listVendorApps,\n listVendors,\n} from './clients/developerPortal/apps';\nimport {\n applicationTokenFixtures,\n getApplicationToken,\n getApplicationTokens,\n} from './clients/management/applicationTokens';\nimport { getUiApp, getUiApps, uiAppFixtures } from './clients/management/uiApps';\nimport { getDevBranches, getStackInfo, verifyStorageToken } from './clients/storage/bootstrap';\nimport { getTable, listTables, tableFixtures } from './clients/storage/tables';\n\nexport const fixtures = {\n management: {\n applicationTokens: {\n getApplicationToken,\n getApplicationTokens,\n fixtures: applicationTokenFixtures,\n },\n uiApps: {\n getUiApp,\n getUiApps,\n fixtures: uiAppFixtures,\n },\n },\n storage: {\n bootstrap: {\n getStackInfo,\n verifyStorageToken,\n getDevBranches,\n },\n tables: {\n getTable,\n listTables,\n fixtures: tableFixtures,\n },\n },\n apps: {\n apps: {\n getApp,\n listApps,\n fixtures: appFixtures,\n },\n deployments: {\n getDeployment,\n listDeployments,\n fixtures: deploymentFixtures,\n },\n runs: {\n getAppRun,\n listAppRuns,\n fixtures: runFixtures,\n },\n },\n developerPortal: {\n listPublishedApps,\n listVendorApps,\n listAllApps,\n listAllVendors,\n getVendor,\n listVendors,\n listUsers,\n listServiceAccounts,\n listAppChanges,\n fixtures: developerPortalFixtures,\n },\n};\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,4 @@
1
1
  import { App, AppRun, Deployment } from "@keboola/api-client/apps/types";
2
- import { BusinessWorkspaceDashboard, BusinessWorkspaceDashboardSummary, DashboardInput } from "@keboola/api-client/businessWorkspaceApi/types";
3
2
  import { AdminVendor, App as App$1, AppChange, ServiceAccount, User, Vendor, VendorListItem } from "@keboola/api-client/developerPortal/types";
4
3
  import { ApplicationToken, CreatedApplicationToken, UiApp, UiAppDetail } from "@keboola/api-client/management/types";
5
4
  import { ServiceId } from "@keboola/api-client/constants";
@@ -239,11 +238,6 @@ declare const getAppRun: () => AppRun;
239
238
  */
240
239
  declare const listAppRuns: () => AppRun[];
241
240
  //#endregion
242
- //#region src/clients/businessWorkspaceApi/dashboards.d.ts
243
- declare const getBusinessWorkspaceDashboard: () => BusinessWorkspaceDashboard;
244
- declare const listBusinessWorkspaceDashboards: () => BusinessWorkspaceDashboardSummary[];
245
- declare const getBusinessWorkspaceDashboardInput: () => DashboardInput;
246
- //#endregion
247
241
  //#region src/clients/developerPortal/apps.d.ts
248
242
  /** The public catalog list: published, non-`other` apps only. */
249
243
  declare const listPublishedApps: () => App$1[];
@@ -568,13 +562,14 @@ declare const developerPortalFixtures: {
568
562
  };
569
563
  changes: {
570
564
  single: {
571
- appId: string;
565
+ id: string;
572
566
  createdOn: string;
573
567
  createdBy: string;
574
568
  changes: ({
575
569
  attribute: string;
576
570
  oldValue: string;
577
571
  newValue: string;
572
+ description: string;
578
573
  } | {
579
574
  attribute: string;
580
575
  oldValue: {
@@ -587,6 +582,7 @@ declare const developerPortalFixtures: {
587
582
  uri: string;
588
583
  tag: string;
589
584
  };
585
+ description: string;
590
586
  })[];
591
587
  };
592
588
  };
@@ -1420,13 +1416,6 @@ declare const fixtures: {
1420
1416
  };
1421
1417
  };
1422
1418
  };
1423
- businessWorkspaceApi: {
1424
- dashboards: {
1425
- getDashboard: typeof getBusinessWorkspaceDashboard;
1426
- listDashboards: typeof listBusinessWorkspaceDashboards;
1427
- getDashboardInput: typeof getBusinessWorkspaceDashboardInput;
1428
- };
1429
- };
1430
1419
  developerPortal: {
1431
1420
  listPublishedApps: typeof listPublishedApps;
1432
1421
  listVendorApps: typeof listVendorApps;
@@ -1744,13 +1733,14 @@ declare const fixtures: {
1744
1733
  };
1745
1734
  changes: {
1746
1735
  single: {
1747
- appId: string;
1736
+ id: string;
1748
1737
  createdOn: string;
1749
1738
  createdBy: string;
1750
1739
  changes: ({
1751
1740
  attribute: string;
1752
1741
  oldValue: string;
1753
1742
  newValue: string;
1743
+ description: string;
1754
1744
  } | {
1755
1745
  attribute: string;
1756
1746
  oldValue: {
@@ -1763,6 +1753,7 @@ declare const fixtures: {
1763
1753
  uri: string;
1764
1754
  tag: string;
1765
1755
  };
1756
+ description: string;
1766
1757
  })[];
1767
1758
  };
1768
1759
  };
@@ -1770,5 +1761,5 @@ declare const fixtures: {
1770
1761
  };
1771
1762
  };
1772
1763
  //#endregion
1773
- export { type ApplicationToken, type CreatedApplicationToken, DEFAULT_BASE_URL, type Table, type TableDetail, type UiApp, type UiAppDetail, appFixtures, applicationTokenFixtures, deploymentFixtures, developerPortalFixtures, fixtures, getApp, getAppRun, getApplicationToken, getApplicationTokens, getBusinessWorkspaceDashboard, getBusinessWorkspaceDashboardInput, getDeployment, getDevBranches, getStackInfo, getTable, getUiApp, getUiApps, getVendor, listAllApps, listAllVendors, listAppChanges, listAppRuns, listApps, listBusinessWorkspaceDashboards, listDeployments, listPublishedApps, listServiceAccounts, listTables, listUsers, listVendorApps, listVendors, runFixtures, tableFixtures, uiAppFixtures, verifyStorageToken };
1764
+ export { type ApplicationToken, type CreatedApplicationToken, DEFAULT_BASE_URL, type Table, type TableDetail, type UiApp, type UiAppDetail, appFixtures, applicationTokenFixtures, deploymentFixtures, developerPortalFixtures, fixtures, getApp, getAppRun, getApplicationToken, getApplicationTokens, getDeployment, getDevBranches, getStackInfo, getTable, getUiApp, getUiApps, getVendor, listAllApps, listAllVendors, listAppChanges, listAppRuns, listApps, listDeployments, listPublishedApps, listServiceAccounts, listTables, listUsers, listVendorApps, listVendors, runFixtures, tableFixtures, uiAppFixtures, verifyStorageToken };
1774
1765
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { ServiceId } from "@keboola/api-client/constants";
2
2
  import { App, AppRun, Deployment } from "@keboola/api-client/apps/types";
3
- import { BusinessWorkspaceDashboard, BusinessWorkspaceDashboardSummary, DashboardInput } from "@keboola/api-client/businessWorkspaceApi/types";
4
3
  import { AdminVendor, App as App$1, AppChange, ServiceAccount, User, Vendor, VendorListItem } from "@keboola/api-client/developerPortal/types";
5
4
  import { ApplicationToken, CreatedApplicationToken, UiApp, UiAppDetail } from "@keboola/api-client/management/types";
6
5
  import { DevBranch, StackInfo, StorageToken, Table, TableDetail } from "@keboola/api-client/storage/types";
@@ -239,11 +238,6 @@ declare const getAppRun: () => AppRun;
239
238
  */
240
239
  declare const listAppRuns: () => AppRun[];
241
240
  //#endregion
242
- //#region src/clients/businessWorkspaceApi/dashboards.d.ts
243
- declare const getBusinessWorkspaceDashboard: () => BusinessWorkspaceDashboard;
244
- declare const listBusinessWorkspaceDashboards: () => BusinessWorkspaceDashboardSummary[];
245
- declare const getBusinessWorkspaceDashboardInput: () => DashboardInput;
246
- //#endregion
247
241
  //#region src/clients/developerPortal/apps.d.ts
248
242
  /** The public catalog list: published, non-`other` apps only. */
249
243
  declare const listPublishedApps: () => App$1[];
@@ -568,13 +562,14 @@ declare const developerPortalFixtures: {
568
562
  };
569
563
  changes: {
570
564
  single: {
571
- appId: string;
565
+ id: string;
572
566
  createdOn: string;
573
567
  createdBy: string;
574
568
  changes: ({
575
569
  attribute: string;
576
570
  oldValue: string;
577
571
  newValue: string;
572
+ description: string;
578
573
  } | {
579
574
  attribute: string;
580
575
  oldValue: {
@@ -587,6 +582,7 @@ declare const developerPortalFixtures: {
587
582
  uri: string;
588
583
  tag: string;
589
584
  };
585
+ description: string;
590
586
  })[];
591
587
  };
592
588
  };
@@ -1420,13 +1416,6 @@ declare const fixtures: {
1420
1416
  };
1421
1417
  };
1422
1418
  };
1423
- businessWorkspaceApi: {
1424
- dashboards: {
1425
- getDashboard: typeof getBusinessWorkspaceDashboard;
1426
- listDashboards: typeof listBusinessWorkspaceDashboards;
1427
- getDashboardInput: typeof getBusinessWorkspaceDashboardInput;
1428
- };
1429
- };
1430
1419
  developerPortal: {
1431
1420
  listPublishedApps: typeof listPublishedApps;
1432
1421
  listVendorApps: typeof listVendorApps;
@@ -1744,13 +1733,14 @@ declare const fixtures: {
1744
1733
  };
1745
1734
  changes: {
1746
1735
  single: {
1747
- appId: string;
1736
+ id: string;
1748
1737
  createdOn: string;
1749
1738
  createdBy: string;
1750
1739
  changes: ({
1751
1740
  attribute: string;
1752
1741
  oldValue: string;
1753
1742
  newValue: string;
1743
+ description: string;
1754
1744
  } | {
1755
1745
  attribute: string;
1756
1746
  oldValue: {
@@ -1763,6 +1753,7 @@ declare const fixtures: {
1763
1753
  uri: string;
1764
1754
  tag: string;
1765
1755
  };
1756
+ description: string;
1766
1757
  })[];
1767
1758
  };
1768
1759
  };
@@ -1770,5 +1761,5 @@ declare const fixtures: {
1770
1761
  };
1771
1762
  };
1772
1763
  //#endregion
1773
- export { type ApplicationToken, type CreatedApplicationToken, DEFAULT_BASE_URL, type Table, type TableDetail, type UiApp, type UiAppDetail, appFixtures, applicationTokenFixtures, deploymentFixtures, developerPortalFixtures, fixtures, getApp, getAppRun, getApplicationToken, getApplicationTokens, getBusinessWorkspaceDashboard, getBusinessWorkspaceDashboardInput, getDeployment, getDevBranches, getStackInfo, getTable, getUiApp, getUiApps, getVendor, listAllApps, listAllVendors, listAppChanges, listAppRuns, listApps, listBusinessWorkspaceDashboards, listDeployments, listPublishedApps, listServiceAccounts, listTables, listUsers, listVendorApps, listVendors, runFixtures, tableFixtures, uiAppFixtures, verifyStorageToken };
1764
+ export { type ApplicationToken, type CreatedApplicationToken, DEFAULT_BASE_URL, type Table, type TableDetail, type UiApp, type UiAppDetail, appFixtures, applicationTokenFixtures, deploymentFixtures, developerPortalFixtures, fixtures, getApp, getAppRun, getApplicationToken, getApplicationTokens, getDeployment, getDevBranches, getStackInfo, getTable, getUiApp, getUiApps, getVendor, listAllApps, listAllVendors, listAppChanges, listAppRuns, listApps, listDeployments, listPublishedApps, listServiceAccounts, listTables, listUsers, listVendorApps, listVendors, runFixtures, tableFixtures, uiAppFixtures, verifyStorageToken };
1774
1765
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -254,57 +254,6 @@ const listAppRuns = () => [
254
254
  finishedRun
255
255
  ];
256
256
  //#endregion
257
- //#region src/clients/businessWorkspaceApi/dashboards.ts
258
- const DASHBOARD_ID = "6f1b1e0a-8c2d-4f6e-9a3b-1c2d3e4f5a6b";
259
- const salesDashboard = {
260
- id: DASHBOARD_ID,
261
- ownerUserId: 7,
262
- primaryProjectId: 42,
263
- sourceProjectIds: [42, 43],
264
- title: "Sales overview",
265
- description: "Revenue and pipeline across regions",
266
- spec: {
267
- version: 1,
268
- id: DASHBOARD_ID,
269
- name: "Sales overview",
270
- description: "Revenue and pipeline across regions",
271
- columns: 12,
272
- widgets: [{
273
- id: "revenue",
274
- type: "metric",
275
- title: "Revenue",
276
- layout: {
277
- x: 0,
278
- y: 0,
279
- w: 4,
280
- h: 2
281
- },
282
- config: { metric: "revenue" }
283
- }]
284
- },
285
- createdAt: "2026-01-15T10:00:00.000Z",
286
- updatedAt: "2026-02-01T09:30:00.000Z"
287
- };
288
- const getBusinessWorkspaceDashboard = () => salesDashboard;
289
- const listBusinessWorkspaceDashboards = () => [{
290
- id: salesDashboard.id,
291
- ownerUserId: salesDashboard.ownerUserId,
292
- primaryProjectId: salesDashboard.primaryProjectId,
293
- sourceProjectIds: salesDashboard.sourceProjectIds,
294
- title: salesDashboard.title,
295
- description: salesDashboard.description,
296
- createdAt: salesDashboard.createdAt,
297
- updatedAt: salesDashboard.updatedAt
298
- }];
299
- const getBusinessWorkspaceDashboardInput = () => ({
300
- id: salesDashboard.id,
301
- title: salesDashboard.title,
302
- description: salesDashboard.description,
303
- spec: salesDashboard.spec,
304
- primaryProjectId: salesDashboard.primaryProjectId,
305
- sourceProjectIds: salesDashboard.sourceProjectIds
306
- });
307
- //#endregion
308
257
  //#region src/clients/developerPortal/apps.ts
309
258
  const keboolaVendor = {
310
259
  id: "keboola",
@@ -556,13 +505,14 @@ const existingServiceAccount = {
556
505
  createdOn: "2024-03-11T10:00:00+0100"
557
506
  };
558
507
  const appChange = {
559
- appId: "acme.wr-widgets",
508
+ id: "acme.wr-widgets",
560
509
  createdOn: "2024-05-20T14:12:00+0200",
561
510
  createdBy: "dev@acme.example",
562
511
  changes: [{
563
512
  attribute: "shortDescription",
564
513
  oldValue: "Writes widgets",
565
- newValue: "Write data to Widgets"
514
+ newValue: "Write data to Widgets",
515
+ description: "Attribute shortDescription changed"
566
516
  }, {
567
517
  attribute: "repository",
568
518
  oldValue: {
@@ -574,7 +524,8 @@ const appChange = {
574
524
  type: "quay",
575
525
  uri: "acme/wr-widgets",
576
526
  tag: "0.3.1"
577
- }
527
+ },
528
+ description: "Attribute repository changed"
578
529
  }]
579
530
  };
580
531
  /** The public catalog list: published, non-`other` apps only. */
@@ -1067,11 +1018,6 @@ const fixtures = {
1067
1018
  fixtures: runFixtures
1068
1019
  }
1069
1020
  },
1070
- businessWorkspaceApi: { dashboards: {
1071
- getDashboard: getBusinessWorkspaceDashboard,
1072
- listDashboards: listBusinessWorkspaceDashboards,
1073
- getDashboardInput: getBusinessWorkspaceDashboardInput
1074
- } },
1075
1021
  developerPortal: {
1076
1022
  listPublishedApps,
1077
1023
  listVendorApps,
@@ -1086,6 +1032,6 @@ const fixtures = {
1086
1032
  }
1087
1033
  };
1088
1034
  //#endregion
1089
- export { DEFAULT_BASE_URL, appFixtures, applicationTokenFixtures, deploymentFixtures, developerPortalFixtures, fixtures, getApp, getAppRun, getApplicationToken, getApplicationTokens, getBusinessWorkspaceDashboard, getBusinessWorkspaceDashboardInput, getDeployment, getDevBranches, getStackInfo, getTable, getUiApp, getUiApps, getVendor, listAllApps, listAllVendors, listAppChanges, listAppRuns, listApps, listBusinessWorkspaceDashboards, listDeployments, listPublishedApps, listServiceAccounts, listTables, listUsers, listVendorApps, listVendors, runFixtures, tableFixtures, uiAppFixtures, verifyStorageToken };
1035
+ export { DEFAULT_BASE_URL, appFixtures, applicationTokenFixtures, deploymentFixtures, developerPortalFixtures, fixtures, getApp, getAppRun, getApplicationToken, getApplicationTokens, getDeployment, getDevBranches, getStackInfo, getTable, getUiApp, getUiApps, getVendor, listAllApps, listAllVendors, listAppChanges, listAppRuns, listApps, listDeployments, listPublishedApps, listServiceAccounts, listTables, listUsers, listVendorApps, listVendors, runFixtures, tableFixtures, uiAppFixtures, verifyStorageToken };
1090
1036
 
1091
1037
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["base"],"sources":["../src/clients/apps/deployments.ts","../src/clients/apps/apps.ts","../src/clients/apps/runs.ts","../src/clients/businessWorkspaceApi/dashboards.ts","../src/clients/developerPortal/apps.ts","../src/clients/management/applicationTokens.ts","../src/clients/management/uiApps.ts","../src/clients/storage/bootstrap.ts","../src/clients/storage/tables.ts","../src/fixtures.ts"],"sourcesContent":["import type { Deployment } from '@keboola/api-client/apps/types';\n\nexport const APP_ID = '374811';\n\n// UUIDv7: ids sort in creation order.\nconst deploymentId = (suffix: string) => `019f1c3a-${suffix}-7c1e-b4a2-0d9f3e6a8c15`;\n\n// Deleted: the row outlives its workload and stays in history.\nconst archivedDeployment = {\n id: deploymentId('0a41'),\n configVersion: '14',\n gitCommitSha: null,\n runtimeSize: 'tiny' as const,\n buildState: 'ready' as const,\n runState: 'stopped' as const,\n archived: true,\n archivedAt: '2026-08-15T11:03:02+00:00',\n createdAt: '2026-08-10T09:12:44+00:00',\n} satisfies Deployment;\n\n// Serving production — the one `appFixtures.running.production` points at.\nconst liveDeployment = {\n id: deploymentId('1b52'),\n configVersion: '16',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'running' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-15T11:02:58+00:00',\n} satisfies Deployment;\n\n// Created with `promote: false`: built, never started.\nconst stagedDeployment = {\n id: deploymentId('2c63'),\n configVersion: '18',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T08:41:19+00:00',\n} satisfies Deployment;\n\n// Can never run — distinct from a run failure. Unreachable today (deployments start from a\n// ready image); the headline table treats it as a contract.\nconst buildFailedDeployment = {\n id: deploymentId('3d74'),\n configVersion: '19',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'failed' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:05:33+00:00',\n} satisfies Deployment;\n\n// Built fine, crashed on every run — `getAppRuns` carries the cause.\nconst runFailedDeployment = {\n id: deploymentId('4e85'),\n configVersion: '20',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'failed' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:31:07+00:00',\n} satisfies Deployment;\n\nexport const deploymentFixtures = {\n archived: archivedDeployment,\n live: liveDeployment,\n staged: stagedDeployment,\n buildFailed: buildFailedDeployment,\n runFailed: runFailedDeployment,\n} satisfies Record<'archived' | 'live' | 'staged' | 'buildFailed' | 'runFailed', Deployment>;\n\nexport const getDeployment = (): Deployment => liveDeployment;\n\n/**\n * All deployments as one history.\n *\n * - Includes the failed ones: `runFixtures.failed` joins to the last.\n * - Oldest first on purpose: the endpoint specifies no order, so consumers must sort.\n */\nexport const listDeployments = (): Deployment[] => [\n archivedDeployment,\n liveDeployment,\n stagedDeployment,\n buildFailedDeployment,\n runFailedDeployment,\n];\n","import type { App } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst APP_URL = 'https://hello-dashboard-374811.hub.canary-orion.keboola.dev';\n\nconst base = {\n id: APP_ID,\n projectId: '14',\n componentId: 'keboola.data-apps',\n branchId: '6',\n configId: '01kz9kny4n49x3xk0e4k8ynpmq',\n type: 'streamlit' as const,\n url: APP_URL,\n};\n\nconst production = (deployment: (typeof deploymentFixtures)[keyof typeof deploymentFixtures]) => ({\n desiredDeploymentId: deployment.id,\n actualDeploymentId: deployment.id,\n});\n\nconst NOTHING_IN_PRODUCTION = { desiredDeploymentId: null, actualDeploymentId: null };\n\n// Created through `/v2`, nothing deployed yet: the URL is reserved and publicly 404s.\nconst neverDeployedApp = {\n ...base,\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n/**\n * An app created and started through `/v1`, serving real traffic (AJDA-3140, probe P1: HTTP 200,\n * 8340 B at the moment this was read), which `/v2` nonetheless reports as `notDeployed` with an\n * empty `production` because it was never adopted into the deployments model.\n *\n * The Builder must never read \"is this app serving\" off `state` alone — here that answer is\n * wrong in the most damaging direction.\n */\nconst legacyV1ServingApp = {\n ...base,\n id: '374899',\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n// Serving the live deployment.\nconst runningApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'running' as const,\n} satisfies App;\n\n/**\n * A blue/green promotion in flight: the staged deployment has been asked for, the live one is still\n * what traffic reaches. `state` stays `running` throughout — the rollout is only visible as\n * `desiredDeploymentId !== actualDeploymentId`.\n */\nconst promotingApp = {\n ...base,\n production: {\n desiredDeploymentId: deploymentFixtures.staged.id,\n actualDeploymentId: deploymentFixtures.live.id,\n },\n state: 'running' as const,\n} satisfies App;\n\n// Idle between visits and armed to wake on the next request — normal, not an outage.\nconst suspendedApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'suspended' as const,\n} satisfies App;\n\n// Stopped by a failure and will not auto-wake: a visitor sees the restart-disabled page until\n// someone starts it explicitly.\nconst disabledApp = {\n ...base,\n production: production(deploymentFixtures.runFailed),\n state: 'disabled' as const,\n} satisfies App;\n\nexport const appFixtures = {\n neverDeployed: neverDeployedApp,\n legacyV1Serving: legacyV1ServingApp,\n running: runningApp,\n promoting: promotingApp,\n suspended: suspendedApp,\n disabled: disabledApp,\n} satisfies Record<\n 'neverDeployed' | 'legacyV1Serving' | 'running' | 'promoting' | 'suspended' | 'disabled',\n App\n>;\n\nexport const getApp = (): App => runningApp;\n\n/**\n * The named fixtures above are all the *same* app in different states, which is what a detail\n * page shows. A listing shows different apps, so each entry past the first is re-addressed.\n */\nconst readdress = (app: App, id: string): App => ({\n ...app,\n id,\n url: `https://data-app-${id}.hub.canary-orion.keboola.dev`,\n});\n\nexport const listApps = (): App[] => [\n runningApp,\n readdress(suspendedApp, '374812'),\n readdress(neverDeployedApp, '374813'),\n];\n","import type { AppRun } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst base = {\n appId: APP_ID,\n runtimeSize: 'small',\n runtimeBackendType: 'streamlit',\n imageVersion: '1.14.2',\n mode: 'prod',\n};\n\nconst runningRun = {\n ...base,\n id: '4f2d8c1a-0b76-4e35-9a12-5c8e7d3b0f41',\n deploymentId: deploymentFixtures.live.id,\n configVersion: deploymentFixtures.live.configVersion,\n state: 'running' as const,\n createdAt: '2026-08-15T11:02:58+00:00',\n startedAt: '2026-08-15T11:03:41+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nconst finishedRun = {\n ...base,\n id: '9c0a7e42-31bd-4f88-b6d5-2ea41f907c3b',\n deploymentId: deploymentFixtures.archived.id,\n configVersion: deploymentFixtures.archived.configVersion,\n state: 'finished' as const,\n createdAt: '2026-08-10T09:12:44+00:00',\n startedAt: '2026-08-10T09:13:29+00:00',\n stoppedAt: '2026-08-15T11:03:02+00:00',\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\n/**\n * A classified failure transcribed from canary (AJDA-3140, probe P1). `startedAt` is `null`\n * even though a cause was attributed — the container executed but its startup probe never\n * passed, so a classified failure says nothing about how far the run got.\n */\nconst failedRun = {\n ...base,\n id: 'ba53f9d0-7c41-4a2e-8f16-d0b9e254a7c6',\n deploymentId: deploymentFixtures.runFailed.id,\n configVersion: deploymentFixtures.runFailed.configVersion,\n state: 'failed' as const,\n createdAt: '2026-08-17T09:31:07+00:00',\n startedAt: null,\n stoppedAt: '2026-08-17T09:33:52+00:00',\n startupLogs:\n '[INFO] Starting app\\n[ERROR] App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx\\n',\n failureReason: {\n reason: 'StartupProbeFailed',\n message: 'App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx',\n },\n} satisfies AppRun;\n\n/**\n * A run that belongs to the app itself rather than to a deployment — what every run of a\n * `/v1`-created app looks like. `deploymentId: null` is permanent for these, not drift.\n */\nconst legacyRun = {\n ...base,\n id: '1d7b4e05-8a92-4c63-b0f7-3e6a5c8192d4',\n deploymentId: null,\n configVersion: '2',\n state: 'running' as const,\n createdAt: '2026-08-17T10:02:11+00:00',\n startedAt: '2026-08-17T10:02:51+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nexport const runFixtures = {\n running: runningRun,\n finished: finishedRun,\n failed: failedRun,\n legacy: legacyRun,\n} satisfies Record<'running' | 'finished' | 'failed' | 'legacy', AppRun>;\n\nexport const getAppRun = (): AppRun => runningRun;\n\n/**\n * Every run this app has, newest first — the order the endpoint documents, so a consumer that\n * relies on it (`[latest] = runs`) is exercised against data that keeps the promise rather than\n * data that happens to contradict it.\n */\nexport const listAppRuns = (): AppRun[] => [legacyRun, failedRun, runningRun, finishedRun];\n","import type {\n BusinessWorkspaceDashboard,\n BusinessWorkspaceDashboardSummary,\n DashboardInput,\n} from '@keboola/api-client/businessWorkspaceApi/types';\n\nconst DASHBOARD_ID = '6f1b1e0a-8c2d-4f6e-9a3b-1c2d3e4f5a6b';\n\nconst salesDashboard = {\n id: DASHBOARD_ID,\n ownerUserId: 7,\n primaryProjectId: 42,\n sourceProjectIds: [42, 43],\n title: 'Sales overview',\n description: 'Revenue and pipeline across regions',\n spec: {\n version: 1,\n id: DASHBOARD_ID,\n name: 'Sales overview',\n description: 'Revenue and pipeline across regions',\n columns: 12,\n widgets: [\n {\n id: 'revenue',\n type: 'metric',\n title: 'Revenue',\n layout: { x: 0, y: 0, w: 4, h: 2 },\n config: { metric: 'revenue' },\n },\n ],\n },\n createdAt: '2026-01-15T10:00:00.000Z',\n updatedAt: '2026-02-01T09:30:00.000Z',\n} satisfies BusinessWorkspaceDashboard;\n\nexport const getBusinessWorkspaceDashboard = (): BusinessWorkspaceDashboard => salesDashboard;\n\nexport const listBusinessWorkspaceDashboards = (): BusinessWorkspaceDashboardSummary[] => [\n {\n id: salesDashboard.id,\n ownerUserId: salesDashboard.ownerUserId,\n primaryProjectId: salesDashboard.primaryProjectId,\n sourceProjectIds: salesDashboard.sourceProjectIds,\n title: salesDashboard.title,\n description: salesDashboard.description,\n createdAt: salesDashboard.createdAt,\n updatedAt: salesDashboard.updatedAt,\n },\n];\n\nexport const getBusinessWorkspaceDashboardInput = (): DashboardInput => ({\n id: salesDashboard.id,\n title: salesDashboard.title,\n description: salesDashboard.description,\n spec: salesDashboard.spec,\n primaryProjectId: salesDashboard.primaryProjectId,\n sourceProjectIds: salesDashboard.sourceProjectIds,\n});\n","import type {\n AdminVendor,\n App,\n AppChange,\n AppVendor,\n ServiceAccount,\n User,\n Vendor,\n VendorListItem,\n} from '@keboola/api-client/developerPortal/types';\n\n// `isTrusted` is the raw tinyint here and a boolean in `vendorDetail` below. That is not a fixture\n// inconsistency: `GET /vendors` returns the row unconverted, every other vendor endpoint runs it\n// through `publicGetVendor`. A fixture that smoothed it over would hide the difference consumers\n// have to handle.\n//\n// `type: 'keboola'` is what the public catalog's \"Supported by Keboola\" filter matches on — NOT\n// `id`, so a fixture that only set the id would silently fail to exercise that filter.\nconst keboolaVendor = {\n id: 'keboola',\n name: 'Keboola',\n email: 'support@keboola.com',\n address: 'Prague, Czech Republic',\n type: 'keboola',\n projectUrl: null,\n isTrusted: 1,\n} satisfies VendorListItem;\n\nconst thirdPartyVendor = {\n id: 'acme',\n name: 'Acme Co.',\n email: 'dev@acme.example',\n address: 'Springfield',\n projectUrl: 'https://connection.keboola.com/admin/projects/1234',\n type: 'other',\n isTrusted: 0,\n} satisfies VendorListItem;\n\n/** The same vendor as `GET /vendors/{vendor}` returns it — `isTrusted` converted to a boolean. */\nconst vendorDetail = {\n ...thirdPartyVendor,\n isTrusted: false,\n} satisfies Vendor;\n\n// A pending, self-registered vendor. The `_v` id prefix is the marker that keeps it out of the\n// user-selectable vendor list until an admin approves and renames it. Only `GET /admin/vendors`\n// returns it — the public list filters on `isApproved`, and is the only response carrying the flag.\nconst pendingVendor = {\n id: '_v1699999999999',\n name: 'Pending Startup',\n email: 'hello@pending.example',\n address: 'Berlin',\n type: 'other',\n projectUrl: null,\n isApproved: false,\n isPublic: false,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The two public vendors as `GET /admin/vendors` returns them: approved, and `isTrusted` converted\n// to a boolean. They exist so the admin list is not a single pending row — a test that only ever\n// sees `pendingVendor` never exercises the approved path the admin table mostly renders.\nconst keboolaAdminVendor = {\n ...keboolaVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: true,\n} satisfies AdminVendor;\n\nconst thirdPartyAdminVendor = {\n ...thirdPartyVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The vendor as it arrives joined onto an app: five columns, none of the flags.\nconst appVendor = (vendor: VendorListItem): AppVendor => ({\n id: vendor.id,\n name: vendor.name,\n address: vendor.address,\n email: vendor.email,\n type: vendor.type,\n});\n\n/** A published, fully-populated extractor — the shape that passes `hasAllFieldsForPublishing`. */\nconst publishedExtractor = {\n id: 'keboola.ex-db-snowflake',\n vendor: appVendor(keboolaVendor),\n name: 'Snowflake',\n type: 'extractor',\n shortDescription: 'Extract data from Snowflake',\n longDescription: '## Snowflake extractor\\n\\nExtracts tables from a Snowflake database.',\n licenseUrl: 'https://github.com/keboola/ex-db-snowflake/blob/master/LICENSE.md',\n documentationUrl: 'https://help.keboola.com/components/extractors/database/snowflake/',\n sourceCodeUrl: 'https://github.com/keboola/ex-db-snowflake',\n categories: ['Database'],\n complexity: 'easy',\n uiOptions: ['genericDockerUI'],\n defaultBucket: true,\n defaultBucketStage: 'in',\n stagingStorageInput: 'local',\n stagingStorageOutput: 'local',\n logger: 'standard',\n isPublic: true,\n isDeprecated: false,\n fees: false,\n repository: { type: 'ecr', uri: 'keboola/ex-db-snowflake', tag: '1.9.0' },\n // The 128 filename ends in a 13-digit millisecond timestamp, so `getIcon` uses it. A legacy\n // incremental filename here would make `getIcon` fall back to the 64px variant.\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/64/1699999999999.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/128/1699999999999.png',\n },\n version: 12,\n createdBy: 'support@keboola.com',\n updatedOn: '2024-06-01T09:00:00+0200',\n uri: 'docker/keboola.ex-db-snowflake',\n isPublished: true,\n publishedVersion: 12,\n publishingStatus: 'public',\n} satisfies App;\n\n/** A private third-party app with a pending publishing request. */\nconst requestedApp = {\n id: 'acme.wr-widgets',\n vendor: appVendor(thirdPartyVendor),\n name: 'Widget Writer',\n type: 'writer',\n shortDescription: 'Write data to Widgets',\n longDescription: 'Pushes tables into the Widgets API.',\n licenseUrl: 'https://acme.example/license',\n documentationUrl: 'https://acme.example/docs',\n uiOptions: ['genericDockerUI'],\n repository: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/64/1699999999998.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/128/1699999999998.png',\n },\n isPublic: false,\n isDeprecated: false,\n version: 3,\n createdBy: 'dev@acme.example',\n updatedOn: '2024-05-20T14:12:00+0200',\n uri: 'docker/acme.wr-widgets',\n isPublished: false,\n publishingStatus: 'requested',\n publishingRequest: { createdOn: '2024-05-20T14:12:00+0200', rejectionReason: null },\n} satisfies App;\n\n/** A rejected app — carries the reason the vendor sees on its detail page. */\nconst rejectedApp = {\n id: 'acme.app-analyzer',\n vendor: appVendor(thirdPartyVendor),\n name: 'Analyzer',\n type: 'application',\n shortDescription: 'Analyze things',\n isPublic: false,\n isDeprecated: false,\n version: 1,\n createdBy: 'dev@acme.example',\n uri: 'docker/acme.app-analyzer',\n isPublished: false,\n publishingStatus: 'rejected',\n publishingRequest: {\n createdOn: '2024-04-02T11:00:00+0200',\n rejectionReason: 'Documentation URL is missing and the icon is not 256×256.',\n },\n} satisfies App;\n\n/** A deprecated app with an expiry date and a suggested replacement. */\nconst deprecatedApp = {\n id: 'keboola.ex-legacy',\n vendor: appVendor(keboolaVendor),\n name: 'Legacy Extractor',\n type: 'extractor',\n shortDescription: 'Superseded',\n isPublic: true,\n isDeprecated: true,\n expiredOn: '2025-01-01',\n replacementApp: 'keboola.ex-db-snowflake',\n version: 40,\n uri: 'docker/keboola.ex-legacy',\n isPublished: true,\n publishedVersion: 38,\n publishingStatus: 'public',\n} satisfies App;\n\n/**\n * A `data-app`, the type whose edit form hides ~14 fields. Deliberately minimal: a fixture carrying\n * `configurationSchema` or `actions` here would misrepresent what the form can produce.\n */\nconst dataApp = {\n id: 'acme.data-app-dashboard',\n vendor: appVendor(thirdPartyVendor),\n name: 'Dashboard',\n type: 'data-app',\n shortDescription: 'A Streamlit dashboard',\n isPublic: false,\n isDeprecated: false,\n version: 2,\n uri: 'docker/acme.data-app-dashboard',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/** A `code-pattern`, whose `configurationSchema.supported_components` must be a non-empty array. */\nconst codePatternApp = {\n id: 'acme.code-pattern-etl',\n vendor: appVendor(thirdPartyVendor),\n name: 'ETL Pattern',\n type: 'code-pattern',\n shortDescription: 'Generates ETL code',\n actions: ['generate'],\n configurationSchema: { supported_components: ['keboola.snowflake-transformation'] },\n isPublic: false,\n version: 1,\n uri: 'docker/acme.code-pattern-etl',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/**\n * An app typed `other`. The public catalog excludes it entirely, so it exists to prove that\n * exclusion rather than to be rendered.\n */\nconst otherTypeApp = {\n id: 'acme.misc-thing',\n vendor: appVendor(thirdPartyVendor),\n name: 'Misc Thing',\n type: 'other',\n isPublic: true,\n version: 1,\n uri: 'docker/acme.misc-thing',\n isPublished: true,\n publishedVersion: 1,\n publishingStatus: 'public',\n} satisfies App;\n\n// `username` is the Cognito login, which is the user's email — the list endpoints return no\n// separate `email`, and no account state (`status`, `isEnabled`, `mfa`) either.\nconst humanUser = {\n username: 'dev@acme.example',\n name: 'Dev Eloper',\n vendors: ['acme'],\n createdOn: '2024-01-10T08:00:00+0100',\n} satisfies User;\n\n/** A recently added member, for a test that orders the list by `createdOn`. */\nconst newestUser = {\n username: 'new@acme.example',\n name: 'New Hire',\n vendors: ['acme'],\n createdOn: '2024-06-25T08:00:00+0200',\n} satisfies User;\n\n/** A member of no vendor — reachable only through the admin list. */\nconst vendorlessUser = {\n username: 'gone@acme.example',\n name: 'Alan Gone',\n vendors: [],\n createdOn: '2023-02-01T08:00:00+0100',\n} satisfies User;\n\n/** A Keboola staff member — eligible for \"make admin\" because they belong to the `keboola` vendor. */\nconst keboolaStaffUser = {\n username: 'staff@keboola.com',\n name: 'Kai Staff',\n vendors: ['keboola'],\n createdOn: '2023-09-14T08:00:00+0200',\n} satisfies User;\n\n/** A freshly created service account, including the one-time `password`. */\nconst newServiceAccount = {\n username: 'acme+ci',\n description: 'CI deploy pipeline',\n createdOn: '2024-07-01T10:00:00+0200',\n password: 'one-time-secret-shown-once',\n} satisfies ServiceAccount;\n\n/** The same account as later listed — note there is no `password`; it is unreadable after creation. */\nconst existingServiceAccount = {\n username: 'acme+release',\n description: 'Release automation',\n createdOn: '2024-03-11T10:00:00+0100',\n} satisfies ServiceAccount;\n\nconst appChange = {\n appId: 'acme.wr-widgets',\n createdOn: '2024-05-20T14:12:00+0200',\n createdBy: 'dev@acme.example',\n changes: [\n {\n attribute: 'shortDescription',\n oldValue: 'Writes widgets',\n newValue: 'Write data to Widgets',\n },\n {\n attribute: 'repository',\n oldValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.0' },\n newValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n },\n ],\n} satisfies AppChange;\n\n/** The public catalog list: published, non-`other` apps only. */\nexport const listPublishedApps = (): App[] => [publishedExtractor, deprecatedApp];\n\n/** A vendor's own apps, across every publishing state the table renders. */\nexport const listVendorApps = (): App[] => [requestedApp, rejectedApp, dataApp, codePatternApp];\n\n/** The admin list — every vendor, plus the `other`-typed app the public catalog drops. */\nexport const listAllApps = (): App[] => [\n publishedExtractor,\n requestedApp,\n rejectedApp,\n deprecatedApp,\n dataApp,\n codePatternApp,\n otherTypeApp,\n];\n\n/** `GET /vendors` — approved and public only, so the pending vendor cannot appear here. */\nexport const listVendors = (): VendorListItem[] => [keboolaVendor, thirdPartyVendor];\n\n/** `GET /vendors/{vendor}` — the converted shape. */\nexport const getVendor = (): Vendor => vendorDetail;\n\n/** `GET /admin/vendors` — every vendor, and the only response carrying the approval flags. */\nexport const listAllVendors = (): AdminVendor[] => [\n keboolaAdminVendor,\n thirdPartyAdminVendor,\n pendingVendor,\n];\n\nexport const listUsers = (): User[] => [humanUser, newestUser, vendorlessUser, keboolaStaffUser];\n\nexport const listServiceAccounts = (): ServiceAccount[] => [existingServiceAccount];\n\nexport const listAppChanges = (): AppChange[] => [appChange];\n\n/** Named fixtures, for a test that needs one specific state. */\nexport const developerPortalFixtures = {\n apps: {\n published: publishedExtractor,\n requested: requestedApp,\n rejected: rejectedApp,\n deprecated: deprecatedApp,\n dataApp,\n codePattern: codePatternApp,\n otherType: otherTypeApp,\n },\n vendors: {\n keboola: keboolaVendor,\n thirdParty: thirdPartyVendor,\n detail: vendorDetail,\n pending: pendingVendor,\n keboolaAdmin: keboolaAdminVendor,\n thirdPartyAdmin: thirdPartyAdminVendor,\n },\n users: {\n human: humanUser,\n newest: newestUser,\n vendorless: vendorlessUser,\n keboolaStaff: keboolaStaffUser,\n },\n serviceAccounts: {\n created: newServiceAccount,\n existing: existingServiceAccount,\n },\n changes: { single: appChange },\n};\n","import type {\n ApplicationToken,\n CreatedApplicationToken,\n} from '@keboola/api-client/management/types';\n\nconst usedToken = {\n id: 13702,\n description: 'Sandboxes API',\n created: '2021-06-28T22:27:28+02:00',\n lastUsed: '2026-09-20T09:14:02+02:00',\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: ['projects:read', 'manage:storage-tokens'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// Never used — the only signal an operator has that deleting it is safe.\nconst neverUsedToken = {\n id: 13703,\n description: 'Job Runner (staging)',\n created: '2026-02-01T10:00:00+01:00',\n lastUsed: null,\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: [],\n creator: { id: null, name: null },\n} satisfies ApplicationToken;\n\nconst expiringToken = {\n id: 13704,\n description: 'One-off migration',\n created: '2026-09-01T08:00:00+02:00',\n lastUsed: '2026-09-02T08:00:00+02:00',\n expires: '2026-10-01T08:00:00+02:00',\n isDisabled: false,\n isExpired: false,\n scopes: ['deleted-projects:read'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// The create response — the only moment the plaintext secret exists.\nconst createdToken = {\n ...usedToken,\n id: 13705,\n description: 'Newly issued',\n lastUsed: null,\n token: '13705-abcdef0123456789abcdef0123456789abcdef01',\n} satisfies CreatedApplicationToken;\n\n/** A token that has been used and never expires. */\nexport const getApplicationToken = (): ApplicationToken => usedToken;\n\n/** Used, never-used and expiring tokens — the three states the list must render. */\nexport const getApplicationTokens = (): ApplicationToken[] => [\n usedToken,\n neverUsedToken,\n expiringToken,\n];\n\nexport const applicationTokenFixtures = {\n used: usedToken,\n neverUsed: neverUsedToken,\n expiring: expiringToken,\n created: createdToken,\n} satisfies {\n used: ApplicationToken;\n neverUsed: ApplicationToken;\n expiring: ApplicationToken;\n created: CreatedApplicationToken;\n};\n\nexport type { ApplicationToken, CreatedApplicationToken };\n","import type { UiApp, UiAppDetail } from '@keboola/api-client/management/types';\n\nconst activeApp = {\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n version: '1.42.0',\n basePath: 'https://ui.keboola-assets.com/kbc/1.42.0/',\n type: 'text/javascript',\n scripts: ['https://ui.keboola-assets.com/kbc/1.42.0/scripts/main.js'],\n styles: ['https://ui.keboola-assets.com/kbc/1.42.0/styles/main.css'],\n isCritical: false,\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n} satisfies UiApp;\n\n// An app registered but never activated — only reachable through `includeInactive`.\nconst inactiveApp = {\n stringId: 'kbc.orphan',\n name: 'Orphaned build',\n version: null,\n basePath: null,\n type: null,\n scripts: [],\n styles: [],\n isCritical: false,\n commitSha: null,\n} satisfies UiApp;\n\nconst appDetail = {\n id: 41,\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n created: '2015-02-12 11:10:09',\n versions: [\n {\n id: 1646,\n version: '1.42.0',\n created: '2026-09-01 08:12:44',\n isActive: true,\n isCritical: false,\n buildUrl: 'https://github.com/keboola/kbc-ui/actions/runs/1646',\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n },\n {\n id: 1645,\n version: '1.41.0',\n created: '2026-08-25 14:02:10',\n isActive: false,\n isCritical: true,\n buildUrl: null,\n commitSha: null,\n },\n ],\n} satisfies UiAppDetail;\n\n/** One UI application detail with an active and a superseded version. */\nexport const getUiApp = (): UiAppDetail => appDetail;\n\n/** An active application and one with no active version, as `includeInactive` returns them. */\nexport const getUiApps = (): UiApp[] => [activeApp, inactiveApp];\n\nexport const uiAppFixtures = {\n active: activeApp,\n inactive: inactiveApp,\n detail: appDetail,\n} satisfies { active: UiApp; inactive: UiApp; detail: UiAppDetail };\n\nexport type { UiApp, UiAppDetail };\n","import { ServiceId } from '@keboola/api-client/constants';\nimport type { DevBranch, StackInfo, StorageToken } from '@keboola/api-client/storage/types';\n\n/** The stack an MSW-backed test points its client at, unless a caller passes its own. */\nexport const DEFAULT_BASE_URL = 'https://connection.test';\n\ntype StackInfoOptions = {\n /** Stack the fixture describes; its host is what the announced service URLs are built on. */\n baseUrl?: string;\n /** Services the stack announces. Narrow it to test what a client does without one. */\n services?: ServiceId[];\n};\n\ntype StorageTokenOptions = {\n /** Stack the token was issued by — its `uri`. */\n baseUrl?: string;\n /** Project features `hasFeature()` should report — the token's `owner.features`. */\n features?: string[];\n};\n\n/**\n * The stack index `GET /v2/storage` returns.\n *\n * - Announces every `ServiceId` by default, each on its own host, so no service client is a dummy\n * that throws `ServiceUnavailableError` — a test for a queue / data-science / vault hook only\n * adds its handler.\n * - Defaulting to `Object.values(ServiceId)` is what keeps that exhaustive: a service added to the\n * client arrives here without an edit.\n */\nexport const getStackInfo = ({\n baseUrl = DEFAULT_BASE_URL,\n services = Object.values(ServiceId),\n}: StackInfoOptions = {}): StackInfo => {\n const { host } = new URL(baseUrl);\n\n return {\n api: host,\n documentation: 'https://developers.keboola.com',\n host,\n revision: 'test-revision',\n stack: 'test-stack',\n version: 'test-version',\n urlTemplates: { orchestrationJob: '' },\n services: services.map((id) => ({ id, url: `https://${id}.${host}` })),\n components: [],\n features: [],\n };\n};\n\n/**\n * The verified master token `GET /v2/storage/tokens/verify` returns.\n *\n * - Complete on purpose: `api.context.project.sapiToken` is this object verbatim and hooks read deep\n * into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as\n * `undefined`s far from the test that caused them.\n * - Every permission flag is granted; a test needing a restricted token overrides the handler.\n */\nexport const verifyStorageToken = ({\n baseUrl = DEFAULT_BASE_URL,\n features = [],\n}: StorageTokenOptions = {}): StorageToken => ({\n id: 'token-1',\n created: '2024-01-01T00:00:00Z',\n refreshed: '2024-01-01T00:00:00Z',\n description: 'Test token',\n uri: baseUrl,\n isMasterToken: true,\n canManageBuckets: true,\n canManageTokens: true,\n canReadAllFileUploads: true,\n canPurgeTrash: true,\n canManageProtectedDefaultBranch: true,\n canCreateJobs: true,\n canReadAllProjectEvents: true,\n canManageDevBranches: true,\n creatorToken: { id: 42, description: 'Test token' },\n expires: null,\n isExpired: false,\n isDisabled: false,\n isBYODB: false,\n dailyCapacity: 1000,\n bucketPermissions: {},\n owner: {\n id: 42,\n name: 'Test Project',\n type: 'project',\n region: 'us-east-1',\n created: '2024-01-01T00:00:00Z',\n expires: null,\n features,\n dataSizeBytes: 0,\n rowsCount: 0,\n hasMysql: false,\n hasSynapse: false,\n hasRedshift: false,\n hasSnowflake: true,\n hasExasol: false,\n hasTeradata: false,\n hasBigquery: false,\n defaultBackend: 'snowflake',\n hasTryModeOn: 'false',\n limits: {},\n metrics: {},\n isDisabled: false,\n billedMonthlyPrice: null,\n dataRetentionTimeInDays: 30,\n assignedBackends: ['snowflake'],\n fileStorageProvider: 's3',\n },\n organization: { id: 'org-1' },\n admin: { id: 100, name: 'Admin User', features: [], isOrganizationMember: true, role: 'admin' },\n adminOwner: { id: 200, name: 'Owner User', email: 'owner@example.com' },\n});\n\n/**\n * The branch list `GET /v2/storage/dev-branches` returns — the default branch alone.\n *\n * - `context.defaultBranch` is read off it, so the entry must stay `isDefault: true`.\n * - The default branch has no creator, which `DevBranch` models as an empty `creatorToken`.\n */\nexport const getDevBranches = (): DevBranch[] => [\n {\n id: 1,\n name: 'Main',\n description: '',\n isDefault: true,\n created: '2024-01-01T00:00:00Z',\n creatorToken: [],\n },\n];\n","import type { Table, TableDetail } from '@keboola/api-client/storage/types';\n\nconst bucket = {\n id: 'in.c-main',\n name: 'c-main',\n displayName: 'Main',\n stage: 'in' as const,\n description: 'Main input bucket',\n created: '2024-01-15T10:00:00+0100',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n isMaintenance: false,\n isReadOnly: false,\n isSnowflakeSharedDatabase: false,\n hasExternalSchema: false,\n rowsCount: 150000,\n dataSizeBytes: 52428800,\n uri: 'https://connection.keboola.com/v2/storage/buckets/in.c-main',\n backend: 'snowflake' as const,\n backendPath: [],\n databaseName: null,\n color: null,\n idBranch: 0,\n owner: null,\n sharing: null,\n path: 'in.c-main',\n tables: 'https://connection.keboola.com/v2/storage/buckets/in.c-main/tables',\n updated: '2024-06-01T09:00:00+0200',\n isLinkedBucket: false,\n bucketSharingAllowed: true,\n};\n\n// A freshly created table with no imports yet (non-typed, non-alias variant).\nconst freshTable = {\n id: 'in.c-main.users',\n name: 'users',\n displayName: 'Users',\n primaryKey: ['id'],\n metadata: [],\n columns: ['id', 'email', 'name', 'created_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: null,\n lastChangeDate: null,\n rowsCount: 0,\n} satisfies TableDetail;\n\n// A recently updated table with a moderate size (non-typed, non-alias variant).\nconst recentlyUpdatedTable = {\n id: 'in.c-main.orders',\n name: 'orders',\n displayName: 'Orders',\n primaryKey: ['order_id'],\n metadata: [\n {\n id: 'mt1',\n key: 'KBC.createdBy.component.id',\n value: 'keboola.python-transformation',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n columns: ['order_id', 'user_id', 'total', 'status', 'created_at', 'updated_at'],\n columnMetadata: {\n order_id: [\n {\n id: 'm1',\n key: 'KBC.datatype.type',\n value: 'INTEGER',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n },\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-06-01T09:00:00+0200',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n rowsCount: 24500,\n} satisfies TableDetail;\n\n// A large table with many rows representing high-volume data (non-typed, non-alias variant).\nconst largeTable = {\n id: 'in.c-main.events',\n name: 'events',\n displayName: 'Events',\n primaryKey: [],\n metadata: [],\n columns: ['event_id', 'user_id', 'event_type', 'properties', 'occurred_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-03-10T08:30:00+0100',\n lastChangeDate: '2024-03-10T08:30:00+0100',\n rowsCount: 125500,\n} satisfies TableDetail;\n\n/**\n * Returns a single non-typed, non-alias `TableDetail` (fresh, no imports yet).\n *\n * The explicit return type surfaces any divergence from the hand-written `TableDetail` in\n * `@keboola/api-client` as a TypeScript error. That type is not derived from the OpenAPI\n * document, so this annotation and the `satisfies` above are the only mechanical check there is.\n */\nexport const getTable = (): TableDetail => freshTable;\n\n/**\n * Returns three TableDetail objects representing different lifecycle states:\n * 1. Fresh — just created, nothing loaded (`lastImportDate: null`, `rowsCount: 0`).\n * 2. Recently updated — 24 500 rows, imported June 2024.\n * 3. Large — 125 500 rows, imported March 2024.\n *\n * The three row counts add up to the shared bucket's own `rowsCount`, and the bucket's\n * `lastChangeDate` is the newest of theirs, as Storage reports it.\n */\nexport const listTables = (): TableDetail[] => [freshTable, recentlyUpdatedTable, largeTable];\n\n/**\n * Named fixtures for targeted access in tests.\n */\nexport const tableFixtures = {\n fresh: freshTable,\n recentlyUpdated: recentlyUpdatedTable,\n large: largeTable,\n} satisfies Record<'fresh' | 'recentlyUpdated' | 'large', TableDetail>;\n\nexport type { Table, TableDetail };\n","import { appFixtures, getApp, listApps } from './clients/apps/apps';\nimport { deploymentFixtures, getDeployment, listDeployments } from './clients/apps/deployments';\nimport { getAppRun, listAppRuns, runFixtures } from './clients/apps/runs';\nimport {\n getBusinessWorkspaceDashboard,\n getBusinessWorkspaceDashboardInput,\n listBusinessWorkspaceDashboards,\n} from './clients/businessWorkspaceApi/dashboards';\nimport {\n developerPortalFixtures,\n getVendor,\n listAllApps,\n listAllVendors,\n listAppChanges,\n listPublishedApps,\n listServiceAccounts,\n listUsers,\n listVendorApps,\n listVendors,\n} from './clients/developerPortal/apps';\nimport {\n applicationTokenFixtures,\n getApplicationToken,\n getApplicationTokens,\n} from './clients/management/applicationTokens';\nimport { getUiApp, getUiApps, uiAppFixtures } from './clients/management/uiApps';\nimport { getDevBranches, getStackInfo, verifyStorageToken } from './clients/storage/bootstrap';\nimport { getTable, listTables, tableFixtures } from './clients/storage/tables';\n\nexport const fixtures = {\n management: {\n applicationTokens: {\n getApplicationToken,\n getApplicationTokens,\n fixtures: applicationTokenFixtures,\n },\n uiApps: {\n getUiApp,\n getUiApps,\n fixtures: uiAppFixtures,\n },\n },\n storage: {\n bootstrap: {\n getStackInfo,\n verifyStorageToken,\n getDevBranches,\n },\n tables: {\n getTable,\n listTables,\n fixtures: tableFixtures,\n },\n },\n apps: {\n apps: {\n getApp,\n listApps,\n fixtures: appFixtures,\n },\n deployments: {\n getDeployment,\n listDeployments,\n fixtures: deploymentFixtures,\n },\n runs: {\n getAppRun,\n listAppRuns,\n fixtures: runFixtures,\n },\n },\n businessWorkspaceApi: {\n dashboards: {\n getDashboard: getBusinessWorkspaceDashboard,\n listDashboards: listBusinessWorkspaceDashboards,\n getDashboardInput: getBusinessWorkspaceDashboardInput,\n },\n },\n developerPortal: {\n listPublishedApps,\n listVendorApps,\n listAllApps,\n listAllVendors,\n getVendor,\n listVendors,\n listUsers,\n listServiceAccounts,\n listAppChanges,\n fixtures: developerPortalFixtures,\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["base"],"sources":["../src/clients/apps/deployments.ts","../src/clients/apps/apps.ts","../src/clients/apps/runs.ts","../src/clients/developerPortal/apps.ts","../src/clients/management/applicationTokens.ts","../src/clients/management/uiApps.ts","../src/clients/storage/bootstrap.ts","../src/clients/storage/tables.ts","../src/fixtures.ts"],"sourcesContent":["import type { Deployment } from '@keboola/api-client/apps/types';\n\nexport const APP_ID = '374811';\n\n// UUIDv7: ids sort in creation order.\nconst deploymentId = (suffix: string) => `019f1c3a-${suffix}-7c1e-b4a2-0d9f3e6a8c15`;\n\n// Deleted: the row outlives its workload and stays in history.\nconst archivedDeployment = {\n id: deploymentId('0a41'),\n configVersion: '14',\n gitCommitSha: null,\n runtimeSize: 'tiny' as const,\n buildState: 'ready' as const,\n runState: 'stopped' as const,\n archived: true,\n archivedAt: '2026-08-15T11:03:02+00:00',\n createdAt: '2026-08-10T09:12:44+00:00',\n} satisfies Deployment;\n\n// Serving production — the one `appFixtures.running.production` points at.\nconst liveDeployment = {\n id: deploymentId('1b52'),\n configVersion: '16',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'running' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-15T11:02:58+00:00',\n} satisfies Deployment;\n\n// Created with `promote: false`: built, never started.\nconst stagedDeployment = {\n id: deploymentId('2c63'),\n configVersion: '18',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T08:41:19+00:00',\n} satisfies Deployment;\n\n// Can never run — distinct from a run failure. Unreachable today (deployments start from a\n// ready image); the headline table treats it as a contract.\nconst buildFailedDeployment = {\n id: deploymentId('3d74'),\n configVersion: '19',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'failed' as const,\n runState: 'neverRun' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:05:33+00:00',\n} satisfies Deployment;\n\n// Built fine, crashed on every run — `getAppRuns` carries the cause.\nconst runFailedDeployment = {\n id: deploymentId('4e85'),\n configVersion: '20',\n gitCommitSha: null,\n runtimeSize: 'small' as const,\n buildState: 'ready' as const,\n runState: 'failed' as const,\n archived: false,\n archivedAt: null,\n createdAt: '2026-08-17T09:31:07+00:00',\n} satisfies Deployment;\n\nexport const deploymentFixtures = {\n archived: archivedDeployment,\n live: liveDeployment,\n staged: stagedDeployment,\n buildFailed: buildFailedDeployment,\n runFailed: runFailedDeployment,\n} satisfies Record<'archived' | 'live' | 'staged' | 'buildFailed' | 'runFailed', Deployment>;\n\nexport const getDeployment = (): Deployment => liveDeployment;\n\n/**\n * All deployments as one history.\n *\n * - Includes the failed ones: `runFixtures.failed` joins to the last.\n * - Oldest first on purpose: the endpoint specifies no order, so consumers must sort.\n */\nexport const listDeployments = (): Deployment[] => [\n archivedDeployment,\n liveDeployment,\n stagedDeployment,\n buildFailedDeployment,\n runFailedDeployment,\n];\n","import type { App } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst APP_URL = 'https://hello-dashboard-374811.hub.canary-orion.keboola.dev';\n\nconst base = {\n id: APP_ID,\n projectId: '14',\n componentId: 'keboola.data-apps',\n branchId: '6',\n configId: '01kz9kny4n49x3xk0e4k8ynpmq',\n type: 'streamlit' as const,\n url: APP_URL,\n};\n\nconst production = (deployment: (typeof deploymentFixtures)[keyof typeof deploymentFixtures]) => ({\n desiredDeploymentId: deployment.id,\n actualDeploymentId: deployment.id,\n});\n\nconst NOTHING_IN_PRODUCTION = { desiredDeploymentId: null, actualDeploymentId: null };\n\n// Created through `/v2`, nothing deployed yet: the URL is reserved and publicly 404s.\nconst neverDeployedApp = {\n ...base,\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n/**\n * An app created and started through `/v1`, serving real traffic (AJDA-3140, probe P1: HTTP 200,\n * 8340 B at the moment this was read), which `/v2` nonetheless reports as `notDeployed` with an\n * empty `production` because it was never adopted into the deployments model.\n *\n * The Builder must never read \"is this app serving\" off `state` alone — here that answer is\n * wrong in the most damaging direction.\n */\nconst legacyV1ServingApp = {\n ...base,\n id: '374899',\n production: NOTHING_IN_PRODUCTION,\n state: 'notDeployed' as const,\n} satisfies App;\n\n// Serving the live deployment.\nconst runningApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'running' as const,\n} satisfies App;\n\n/**\n * A blue/green promotion in flight: the staged deployment has been asked for, the live one is still\n * what traffic reaches. `state` stays `running` throughout — the rollout is only visible as\n * `desiredDeploymentId !== actualDeploymentId`.\n */\nconst promotingApp = {\n ...base,\n production: {\n desiredDeploymentId: deploymentFixtures.staged.id,\n actualDeploymentId: deploymentFixtures.live.id,\n },\n state: 'running' as const,\n} satisfies App;\n\n// Idle between visits and armed to wake on the next request — normal, not an outage.\nconst suspendedApp = {\n ...base,\n production: production(deploymentFixtures.live),\n state: 'suspended' as const,\n} satisfies App;\n\n// Stopped by a failure and will not auto-wake: a visitor sees the restart-disabled page until\n// someone starts it explicitly.\nconst disabledApp = {\n ...base,\n production: production(deploymentFixtures.runFailed),\n state: 'disabled' as const,\n} satisfies App;\n\nexport const appFixtures = {\n neverDeployed: neverDeployedApp,\n legacyV1Serving: legacyV1ServingApp,\n running: runningApp,\n promoting: promotingApp,\n suspended: suspendedApp,\n disabled: disabledApp,\n} satisfies Record<\n 'neverDeployed' | 'legacyV1Serving' | 'running' | 'promoting' | 'suspended' | 'disabled',\n App\n>;\n\nexport const getApp = (): App => runningApp;\n\n/**\n * The named fixtures above are all the *same* app in different states, which is what a detail\n * page shows. A listing shows different apps, so each entry past the first is re-addressed.\n */\nconst readdress = (app: App, id: string): App => ({\n ...app,\n id,\n url: `https://data-app-${id}.hub.canary-orion.keboola.dev`,\n});\n\nexport const listApps = (): App[] => [\n runningApp,\n readdress(suspendedApp, '374812'),\n readdress(neverDeployedApp, '374813'),\n];\n","import type { AppRun } from '@keboola/api-client/apps/types';\n\nimport { APP_ID, deploymentFixtures } from './deployments';\n\nconst base = {\n appId: APP_ID,\n runtimeSize: 'small',\n runtimeBackendType: 'streamlit',\n imageVersion: '1.14.2',\n mode: 'prod',\n};\n\nconst runningRun = {\n ...base,\n id: '4f2d8c1a-0b76-4e35-9a12-5c8e7d3b0f41',\n deploymentId: deploymentFixtures.live.id,\n configVersion: deploymentFixtures.live.configVersion,\n state: 'running' as const,\n createdAt: '2026-08-15T11:02:58+00:00',\n startedAt: '2026-08-15T11:03:41+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nconst finishedRun = {\n ...base,\n id: '9c0a7e42-31bd-4f88-b6d5-2ea41f907c3b',\n deploymentId: deploymentFixtures.archived.id,\n configVersion: deploymentFixtures.archived.configVersion,\n state: 'finished' as const,\n createdAt: '2026-08-10T09:12:44+00:00',\n startedAt: '2026-08-10T09:13:29+00:00',\n stoppedAt: '2026-08-15T11:03:02+00:00',\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\n/**\n * A classified failure transcribed from canary (AJDA-3140, probe P1). `startedAt` is `null`\n * even though a cause was attributed — the container executed but its startup probe never\n * passed, so a classified failure says nothing about how far the run got.\n */\nconst failedRun = {\n ...base,\n id: 'ba53f9d0-7c41-4a2e-8f16-d0b9e254a7c6',\n deploymentId: deploymentFixtures.runFailed.id,\n configVersion: deploymentFixtures.runFailed.configVersion,\n state: 'failed' as const,\n createdAt: '2026-08-17T09:31:07+00:00',\n startedAt: null,\n stoppedAt: '2026-08-17T09:33:52+00:00',\n startupLogs:\n '[INFO] Starting app\\n[ERROR] App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx\\n',\n failureReason: {\n reason: 'StartupProbeFailed',\n message: 'App must have keboola-config/nginx/ directory. Missing: /app/keboola-config/nginx',\n },\n} satisfies AppRun;\n\n/**\n * A run that belongs to the app itself rather than to a deployment — what every run of a\n * `/v1`-created app looks like. `deploymentId: null` is permanent for these, not drift.\n */\nconst legacyRun = {\n ...base,\n id: '1d7b4e05-8a92-4c63-b0f7-3e6a5c8192d4',\n deploymentId: null,\n configVersion: '2',\n state: 'running' as const,\n createdAt: '2026-08-17T10:02:11+00:00',\n startedAt: '2026-08-17T10:02:51+00:00',\n stoppedAt: null,\n startupLogs: null,\n failureReason: null,\n} satisfies AppRun;\n\nexport const runFixtures = {\n running: runningRun,\n finished: finishedRun,\n failed: failedRun,\n legacy: legacyRun,\n} satisfies Record<'running' | 'finished' | 'failed' | 'legacy', AppRun>;\n\nexport const getAppRun = (): AppRun => runningRun;\n\n/**\n * Every run this app has, newest first — the order the endpoint documents, so a consumer that\n * relies on it (`[latest] = runs`) is exercised against data that keeps the promise rather than\n * data that happens to contradict it.\n */\nexport const listAppRuns = (): AppRun[] => [legacyRun, failedRun, runningRun, finishedRun];\n","import type {\n AdminVendor,\n App,\n AppChange,\n AppVendor,\n ServiceAccount,\n User,\n Vendor,\n VendorListItem,\n} from '@keboola/api-client/developerPortal/types';\n\n// `isTrusted` is the raw tinyint here and a boolean in `vendorDetail` below. That is not a fixture\n// inconsistency: `GET /vendors` returns the row unconverted, every other vendor endpoint runs it\n// through `publicGetVendor`. A fixture that smoothed it over would hide the difference consumers\n// have to handle.\n//\n// `type: 'keboola'` is what the public catalog's \"Supported by Keboola\" filter matches on — NOT\n// `id`, so a fixture that only set the id would silently fail to exercise that filter.\nconst keboolaVendor = {\n id: 'keboola',\n name: 'Keboola',\n email: 'support@keboola.com',\n address: 'Prague, Czech Republic',\n type: 'keboola',\n projectUrl: null,\n isTrusted: 1,\n} satisfies VendorListItem;\n\nconst thirdPartyVendor = {\n id: 'acme',\n name: 'Acme Co.',\n email: 'dev@acme.example',\n address: 'Springfield',\n projectUrl: 'https://connection.keboola.com/admin/projects/1234',\n type: 'other',\n isTrusted: 0,\n} satisfies VendorListItem;\n\n/** The same vendor as `GET /vendors/{vendor}` returns it — `isTrusted` converted to a boolean. */\nconst vendorDetail = {\n ...thirdPartyVendor,\n isTrusted: false,\n} satisfies Vendor;\n\n// A pending, self-registered vendor. The `_v` id prefix is the marker that keeps it out of the\n// user-selectable vendor list until an admin approves and renames it. Only `GET /admin/vendors`\n// returns it — the public list filters on `isApproved`, and is the only response carrying the flag.\nconst pendingVendor = {\n id: '_v1699999999999',\n name: 'Pending Startup',\n email: 'hello@pending.example',\n address: 'Berlin',\n type: 'other',\n projectUrl: null,\n isApproved: false,\n isPublic: false,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The two public vendors as `GET /admin/vendors` returns them: approved, and `isTrusted` converted\n// to a boolean. They exist so the admin list is not a single pending row — a test that only ever\n// sees `pendingVendor` never exercises the approved path the admin table mostly renders.\nconst keboolaAdminVendor = {\n ...keboolaVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: true,\n} satisfies AdminVendor;\n\nconst thirdPartyAdminVendor = {\n ...thirdPartyVendor,\n isApproved: true,\n isPublic: true,\n isTrusted: false,\n} satisfies AdminVendor;\n\n// The vendor as it arrives joined onto an app: five columns, none of the flags.\nconst appVendor = (vendor: VendorListItem): AppVendor => ({\n id: vendor.id,\n name: vendor.name,\n address: vendor.address,\n email: vendor.email,\n type: vendor.type,\n});\n\n/** A published, fully-populated extractor — the shape that passes `hasAllFieldsForPublishing`. */\nconst publishedExtractor = {\n id: 'keboola.ex-db-snowflake',\n vendor: appVendor(keboolaVendor),\n name: 'Snowflake',\n type: 'extractor',\n shortDescription: 'Extract data from Snowflake',\n longDescription: '## Snowflake extractor\\n\\nExtracts tables from a Snowflake database.',\n licenseUrl: 'https://github.com/keboola/ex-db-snowflake/blob/master/LICENSE.md',\n documentationUrl: 'https://help.keboola.com/components/extractors/database/snowflake/',\n sourceCodeUrl: 'https://github.com/keboola/ex-db-snowflake',\n categories: ['Database'],\n complexity: 'easy',\n uiOptions: ['genericDockerUI'],\n defaultBucket: true,\n defaultBucketStage: 'in',\n stagingStorageInput: 'local',\n stagingStorageOutput: 'local',\n logger: 'standard',\n isPublic: true,\n isDeprecated: false,\n fees: false,\n repository: { type: 'ecr', uri: 'keboola/ex-db-snowflake', tag: '1.9.0' },\n // The 128 filename ends in a 13-digit millisecond timestamp, so `getIcon` uses it. A legacy\n // incremental filename here would make `getIcon` fall back to the 64px variant.\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/64/1699999999999.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/keboola.ex-db-snowflake/128/1699999999999.png',\n },\n version: 12,\n createdBy: 'support@keboola.com',\n updatedOn: '2024-06-01T09:00:00+0200',\n uri: 'docker/keboola.ex-db-snowflake',\n isPublished: true,\n publishedVersion: 12,\n publishingStatus: 'public',\n} satisfies App;\n\n/** A private third-party app with a pending publishing request. */\nconst requestedApp = {\n id: 'acme.wr-widgets',\n vendor: appVendor(thirdPartyVendor),\n name: 'Widget Writer',\n type: 'writer',\n shortDescription: 'Write data to Widgets',\n longDescription: 'Pushes tables into the Widgets API.',\n licenseUrl: 'https://acme.example/license',\n documentationUrl: 'https://acme.example/docs',\n uiOptions: ['genericDockerUI'],\n repository: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n icon: {\n '64': 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/64/1699999999998.png',\n '128':\n 'https://ui.keboola-assets.com/developer-portal/icons/acme.wr-widgets/128/1699999999998.png',\n },\n isPublic: false,\n isDeprecated: false,\n version: 3,\n createdBy: 'dev@acme.example',\n updatedOn: '2024-05-20T14:12:00+0200',\n uri: 'docker/acme.wr-widgets',\n isPublished: false,\n publishingStatus: 'requested',\n publishingRequest: { createdOn: '2024-05-20T14:12:00+0200', rejectionReason: null },\n} satisfies App;\n\n/** A rejected app — carries the reason the vendor sees on its detail page. */\nconst rejectedApp = {\n id: 'acme.app-analyzer',\n vendor: appVendor(thirdPartyVendor),\n name: 'Analyzer',\n type: 'application',\n shortDescription: 'Analyze things',\n isPublic: false,\n isDeprecated: false,\n version: 1,\n createdBy: 'dev@acme.example',\n uri: 'docker/acme.app-analyzer',\n isPublished: false,\n publishingStatus: 'rejected',\n publishingRequest: {\n createdOn: '2024-04-02T11:00:00+0200',\n rejectionReason: 'Documentation URL is missing and the icon is not 256×256.',\n },\n} satisfies App;\n\n/** A deprecated app with an expiry date and a suggested replacement. */\nconst deprecatedApp = {\n id: 'keboola.ex-legacy',\n vendor: appVendor(keboolaVendor),\n name: 'Legacy Extractor',\n type: 'extractor',\n shortDescription: 'Superseded',\n isPublic: true,\n isDeprecated: true,\n expiredOn: '2025-01-01',\n replacementApp: 'keboola.ex-db-snowflake',\n version: 40,\n uri: 'docker/keboola.ex-legacy',\n isPublished: true,\n publishedVersion: 38,\n publishingStatus: 'public',\n} satisfies App;\n\n/**\n * A `data-app`, the type whose edit form hides ~14 fields. Deliberately minimal: a fixture carrying\n * `configurationSchema` or `actions` here would misrepresent what the form can produce.\n */\nconst dataApp = {\n id: 'acme.data-app-dashboard',\n vendor: appVendor(thirdPartyVendor),\n name: 'Dashboard',\n type: 'data-app',\n shortDescription: 'A Streamlit dashboard',\n isPublic: false,\n isDeprecated: false,\n version: 2,\n uri: 'docker/acme.data-app-dashboard',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/** A `code-pattern`, whose `configurationSchema.supported_components` must be a non-empty array. */\nconst codePatternApp = {\n id: 'acme.code-pattern-etl',\n vendor: appVendor(thirdPartyVendor),\n name: 'ETL Pattern',\n type: 'code-pattern',\n shortDescription: 'Generates ETL code',\n actions: ['generate'],\n configurationSchema: { supported_components: ['keboola.snowflake-transformation'] },\n isPublic: false,\n version: 1,\n uri: 'docker/acme.code-pattern-etl',\n isPublished: false,\n publishingStatus: 'private',\n} satisfies App;\n\n/**\n * An app typed `other`. The public catalog excludes it entirely, so it exists to prove that\n * exclusion rather than to be rendered.\n */\nconst otherTypeApp = {\n id: 'acme.misc-thing',\n vendor: appVendor(thirdPartyVendor),\n name: 'Misc Thing',\n type: 'other',\n isPublic: true,\n version: 1,\n uri: 'docker/acme.misc-thing',\n isPublished: true,\n publishedVersion: 1,\n publishingStatus: 'public',\n} satisfies App;\n\n// `username` is the Cognito login, which is the user's email — the list endpoints return no\n// separate `email`, and no account state (`status`, `isEnabled`, `mfa`) either.\nconst humanUser = {\n username: 'dev@acme.example',\n name: 'Dev Eloper',\n vendors: ['acme'],\n createdOn: '2024-01-10T08:00:00+0100',\n} satisfies User;\n\n/** A recently added member, for a test that orders the list by `createdOn`. */\nconst newestUser = {\n username: 'new@acme.example',\n name: 'New Hire',\n vendors: ['acme'],\n createdOn: '2024-06-25T08:00:00+0200',\n} satisfies User;\n\n/** A member of no vendor — reachable only through the admin list. */\nconst vendorlessUser = {\n username: 'gone@acme.example',\n name: 'Alan Gone',\n vendors: [],\n createdOn: '2023-02-01T08:00:00+0100',\n} satisfies User;\n\n/** A Keboola staff member — eligible for \"make admin\" because they belong to the `keboola` vendor. */\nconst keboolaStaffUser = {\n username: 'staff@keboola.com',\n name: 'Kai Staff',\n vendors: ['keboola'],\n createdOn: '2023-09-14T08:00:00+0200',\n} satisfies User;\n\n/** A freshly created service account, including the one-time `password`. */\nconst newServiceAccount = {\n username: 'acme+ci',\n description: 'CI deploy pipeline',\n createdOn: '2024-07-01T10:00:00+0200',\n password: 'one-time-secret-shown-once',\n} satisfies ServiceAccount;\n\n/** The same account as later listed — note there is no `password`; it is unreadable after creation. */\nconst existingServiceAccount = {\n username: 'acme+release',\n description: 'Release automation',\n createdOn: '2024-03-11T10:00:00+0100',\n} satisfies ServiceAccount;\n\nconst appChange = {\n id: 'acme.wr-widgets',\n createdOn: '2024-05-20T14:12:00+0200',\n createdBy: 'dev@acme.example',\n changes: [\n {\n attribute: 'shortDescription',\n oldValue: 'Writes widgets',\n newValue: 'Write data to Widgets',\n description: 'Attribute shortDescription changed',\n },\n {\n attribute: 'repository',\n oldValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.0' },\n newValue: { type: 'quay', uri: 'acme/wr-widgets', tag: '0.3.1' },\n description: 'Attribute repository changed',\n },\n ],\n} satisfies AppChange;\n\n/** The public catalog list: published, non-`other` apps only. */\nexport const listPublishedApps = (): App[] => [publishedExtractor, deprecatedApp];\n\n/** A vendor's own apps, across every publishing state the table renders. */\nexport const listVendorApps = (): App[] => [requestedApp, rejectedApp, dataApp, codePatternApp];\n\n/** The admin list — every vendor, plus the `other`-typed app the public catalog drops. */\nexport const listAllApps = (): App[] => [\n publishedExtractor,\n requestedApp,\n rejectedApp,\n deprecatedApp,\n dataApp,\n codePatternApp,\n otherTypeApp,\n];\n\n/** `GET /vendors` — approved and public only, so the pending vendor cannot appear here. */\nexport const listVendors = (): VendorListItem[] => [keboolaVendor, thirdPartyVendor];\n\n/** `GET /vendors/{vendor}` — the converted shape. */\nexport const getVendor = (): Vendor => vendorDetail;\n\n/** `GET /admin/vendors` — every vendor, and the only response carrying the approval flags. */\nexport const listAllVendors = (): AdminVendor[] => [\n keboolaAdminVendor,\n thirdPartyAdminVendor,\n pendingVendor,\n];\n\nexport const listUsers = (): User[] => [humanUser, newestUser, vendorlessUser, keboolaStaffUser];\n\nexport const listServiceAccounts = (): ServiceAccount[] => [existingServiceAccount];\n\nexport const listAppChanges = (): AppChange[] => [appChange];\n\n/** Named fixtures, for a test that needs one specific state. */\nexport const developerPortalFixtures = {\n apps: {\n published: publishedExtractor,\n requested: requestedApp,\n rejected: rejectedApp,\n deprecated: deprecatedApp,\n dataApp,\n codePattern: codePatternApp,\n otherType: otherTypeApp,\n },\n vendors: {\n keboola: keboolaVendor,\n thirdParty: thirdPartyVendor,\n detail: vendorDetail,\n pending: pendingVendor,\n keboolaAdmin: keboolaAdminVendor,\n thirdPartyAdmin: thirdPartyAdminVendor,\n },\n users: {\n human: humanUser,\n newest: newestUser,\n vendorless: vendorlessUser,\n keboolaStaff: keboolaStaffUser,\n },\n serviceAccounts: {\n created: newServiceAccount,\n existing: existingServiceAccount,\n },\n changes: { single: appChange },\n};\n","import type {\n ApplicationToken,\n CreatedApplicationToken,\n} from '@keboola/api-client/management/types';\n\nconst usedToken = {\n id: 13702,\n description: 'Sandboxes API',\n created: '2021-06-28T22:27:28+02:00',\n lastUsed: '2026-09-20T09:14:02+02:00',\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: ['projects:read', 'manage:storage-tokens'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// Never used — the only signal an operator has that deleting it is safe.\nconst neverUsedToken = {\n id: 13703,\n description: 'Job Runner (staging)',\n created: '2026-02-01T10:00:00+01:00',\n lastUsed: null,\n expires: null,\n isDisabled: false,\n isExpired: false,\n scopes: [],\n creator: { id: null, name: null },\n} satisfies ApplicationToken;\n\nconst expiringToken = {\n id: 13704,\n description: 'One-off migration',\n created: '2026-09-01T08:00:00+02:00',\n lastUsed: '2026-09-02T08:00:00+02:00',\n expires: '2026-10-01T08:00:00+02:00',\n isDisabled: false,\n isExpired: false,\n scopes: ['deleted-projects:read'],\n creator: { id: 7919, name: 'John Doe' },\n} satisfies ApplicationToken;\n\n// The create response — the only moment the plaintext secret exists.\nconst createdToken = {\n ...usedToken,\n id: 13705,\n description: 'Newly issued',\n lastUsed: null,\n token: '13705-abcdef0123456789abcdef0123456789abcdef01',\n} satisfies CreatedApplicationToken;\n\n/** A token that has been used and never expires. */\nexport const getApplicationToken = (): ApplicationToken => usedToken;\n\n/** Used, never-used and expiring tokens — the three states the list must render. */\nexport const getApplicationTokens = (): ApplicationToken[] => [\n usedToken,\n neverUsedToken,\n expiringToken,\n];\n\nexport const applicationTokenFixtures = {\n used: usedToken,\n neverUsed: neverUsedToken,\n expiring: expiringToken,\n created: createdToken,\n} satisfies {\n used: ApplicationToken;\n neverUsed: ApplicationToken;\n expiring: ApplicationToken;\n created: CreatedApplicationToken;\n};\n\nexport type { ApplicationToken, CreatedApplicationToken };\n","import type { UiApp, UiAppDetail } from '@keboola/api-client/management/types';\n\nconst activeApp = {\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n version: '1.42.0',\n basePath: 'https://ui.keboola-assets.com/kbc/1.42.0/',\n type: 'text/javascript',\n scripts: ['https://ui.keboola-assets.com/kbc/1.42.0/scripts/main.js'],\n styles: ['https://ui.keboola-assets.com/kbc/1.42.0/styles/main.css'],\n isCritical: false,\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n} satisfies UiApp;\n\n// An app registered but never activated — only reachable through `includeInactive`.\nconst inactiveApp = {\n stringId: 'kbc.orphan',\n name: 'Orphaned build',\n version: null,\n basePath: null,\n type: null,\n scripts: [],\n styles: [],\n isCritical: false,\n commitSha: null,\n} satisfies UiApp;\n\nconst appDetail = {\n id: 41,\n stringId: 'kbc',\n name: 'Keboola Connection UI',\n created: '2015-02-12 11:10:09',\n versions: [\n {\n id: 1646,\n version: '1.42.0',\n created: '2026-09-01 08:12:44',\n isActive: true,\n isCritical: false,\n buildUrl: 'https://github.com/keboola/kbc-ui/actions/runs/1646',\n commitSha: 'a6bc947f1e2d3c4b5a6bc947f1e2d3c4b5a6bc94',\n },\n {\n id: 1645,\n version: '1.41.0',\n created: '2026-08-25 14:02:10',\n isActive: false,\n isCritical: true,\n buildUrl: null,\n commitSha: null,\n },\n ],\n} satisfies UiAppDetail;\n\n/** One UI application detail with an active and a superseded version. */\nexport const getUiApp = (): UiAppDetail => appDetail;\n\n/** An active application and one with no active version, as `includeInactive` returns them. */\nexport const getUiApps = (): UiApp[] => [activeApp, inactiveApp];\n\nexport const uiAppFixtures = {\n active: activeApp,\n inactive: inactiveApp,\n detail: appDetail,\n} satisfies { active: UiApp; inactive: UiApp; detail: UiAppDetail };\n\nexport type { UiApp, UiAppDetail };\n","import { ServiceId } from '@keboola/api-client/constants';\nimport type { DevBranch, StackInfo, StorageToken } from '@keboola/api-client/storage/types';\n\n/** The stack an MSW-backed test points its client at, unless a caller passes its own. */\nexport const DEFAULT_BASE_URL = 'https://connection.test';\n\ntype StackInfoOptions = {\n /** Stack the fixture describes; its host is what the announced service URLs are built on. */\n baseUrl?: string;\n /** Services the stack announces. Narrow it to test what a client does without one. */\n services?: ServiceId[];\n};\n\ntype StorageTokenOptions = {\n /** Stack the token was issued by — its `uri`. */\n baseUrl?: string;\n /** Project features `hasFeature()` should report — the token's `owner.features`. */\n features?: string[];\n};\n\n/**\n * The stack index `GET /v2/storage` returns.\n *\n * - Announces every `ServiceId` by default, each on its own host, so no service client is a dummy\n * that throws `ServiceUnavailableError` — a test for a queue / data-science / vault hook only\n * adds its handler.\n * - Defaulting to `Object.values(ServiceId)` is what keeps that exhaustive: a service added to the\n * client arrives here without an edit.\n */\nexport const getStackInfo = ({\n baseUrl = DEFAULT_BASE_URL,\n services = Object.values(ServiceId),\n}: StackInfoOptions = {}): StackInfo => {\n const { host } = new URL(baseUrl);\n\n return {\n api: host,\n documentation: 'https://developers.keboola.com',\n host,\n revision: 'test-revision',\n stack: 'test-stack',\n version: 'test-version',\n urlTemplates: { orchestrationJob: '' },\n services: services.map((id) => ({ id, url: `https://${id}.${host}` })),\n components: [],\n features: [],\n };\n};\n\n/**\n * The verified master token `GET /v2/storage/tokens/verify` returns.\n *\n * - Complete on purpose: `api.context.project.sapiToken` is this object verbatim and hooks read deep\n * into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as\n * `undefined`s far from the test that caused them.\n * - Every permission flag is granted; a test needing a restricted token overrides the handler.\n */\nexport const verifyStorageToken = ({\n baseUrl = DEFAULT_BASE_URL,\n features = [],\n}: StorageTokenOptions = {}): StorageToken => ({\n id: 'token-1',\n created: '2024-01-01T00:00:00Z',\n refreshed: '2024-01-01T00:00:00Z',\n description: 'Test token',\n uri: baseUrl,\n isMasterToken: true,\n canManageBuckets: true,\n canManageTokens: true,\n canReadAllFileUploads: true,\n canPurgeTrash: true,\n canManageProtectedDefaultBranch: true,\n canCreateJobs: true,\n canReadAllProjectEvents: true,\n canManageDevBranches: true,\n creatorToken: { id: 42, description: 'Test token' },\n expires: null,\n isExpired: false,\n isDisabled: false,\n isBYODB: false,\n dailyCapacity: 1000,\n bucketPermissions: {},\n owner: {\n id: 42,\n name: 'Test Project',\n type: 'project',\n region: 'us-east-1',\n created: '2024-01-01T00:00:00Z',\n expires: null,\n features,\n dataSizeBytes: 0,\n rowsCount: 0,\n hasMysql: false,\n hasSynapse: false,\n hasRedshift: false,\n hasSnowflake: true,\n hasExasol: false,\n hasTeradata: false,\n hasBigquery: false,\n defaultBackend: 'snowflake',\n hasTryModeOn: 'false',\n limits: {},\n metrics: {},\n isDisabled: false,\n billedMonthlyPrice: null,\n dataRetentionTimeInDays: 30,\n assignedBackends: ['snowflake'],\n fileStorageProvider: 's3',\n },\n organization: { id: 'org-1' },\n admin: { id: 100, name: 'Admin User', features: [], isOrganizationMember: true, role: 'admin' },\n adminOwner: { id: 200, name: 'Owner User', email: 'owner@example.com' },\n});\n\n/**\n * The branch list `GET /v2/storage/dev-branches` returns — the default branch alone.\n *\n * - `context.defaultBranch` is read off it, so the entry must stay `isDefault: true`.\n * - The default branch has no creator, which `DevBranch` models as an empty `creatorToken`.\n */\nexport const getDevBranches = (): DevBranch[] => [\n {\n id: 1,\n name: 'Main',\n description: '',\n isDefault: true,\n created: '2024-01-01T00:00:00Z',\n creatorToken: [],\n },\n];\n","import type { Table, TableDetail } from '@keboola/api-client/storage/types';\n\nconst bucket = {\n id: 'in.c-main',\n name: 'c-main',\n displayName: 'Main',\n stage: 'in' as const,\n description: 'Main input bucket',\n created: '2024-01-15T10:00:00+0100',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n isMaintenance: false,\n isReadOnly: false,\n isSnowflakeSharedDatabase: false,\n hasExternalSchema: false,\n rowsCount: 150000,\n dataSizeBytes: 52428800,\n uri: 'https://connection.keboola.com/v2/storage/buckets/in.c-main',\n backend: 'snowflake' as const,\n backendPath: [],\n databaseName: null,\n color: null,\n idBranch: 0,\n owner: null,\n sharing: null,\n path: 'in.c-main',\n tables: 'https://connection.keboola.com/v2/storage/buckets/in.c-main/tables',\n updated: '2024-06-01T09:00:00+0200',\n isLinkedBucket: false,\n bucketSharingAllowed: true,\n};\n\n// A freshly created table with no imports yet (non-typed, non-alias variant).\nconst freshTable = {\n id: 'in.c-main.users',\n name: 'users',\n displayName: 'Users',\n primaryKey: ['id'],\n metadata: [],\n columns: ['id', 'email', 'name', 'created_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: null,\n lastChangeDate: null,\n rowsCount: 0,\n} satisfies TableDetail;\n\n// A recently updated table with a moderate size (non-typed, non-alias variant).\nconst recentlyUpdatedTable = {\n id: 'in.c-main.orders',\n name: 'orders',\n displayName: 'Orders',\n primaryKey: ['order_id'],\n metadata: [\n {\n id: 'mt1',\n key: 'KBC.createdBy.component.id',\n value: 'keboola.python-transformation',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n columns: ['order_id', 'user_id', 'total', 'status', 'created_at', 'updated_at'],\n columnMetadata: {\n order_id: [\n {\n id: 'm1',\n key: 'KBC.datatype.type',\n value: 'INTEGER',\n provider: 'keboola',\n timestamp: '2024-06-01T09:00:00+0200',\n },\n ],\n },\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-06-01T09:00:00+0200',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n rowsCount: 24500,\n} satisfies TableDetail;\n\n// A large table with many rows representing high-volume data (non-typed, non-alias variant).\nconst largeTable = {\n id: 'in.c-main.events',\n name: 'events',\n displayName: 'Events',\n primaryKey: [],\n metadata: [],\n columns: ['event_id', 'user_id', 'event_type', 'properties', 'occurred_at'],\n columnMetadata: {},\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n lastImportDate: '2024-03-10T08:30:00+0100',\n lastChangeDate: '2024-03-10T08:30:00+0100',\n rowsCount: 125500,\n} satisfies TableDetail;\n\n/**\n * Returns a single non-typed, non-alias `TableDetail` (fresh, no imports yet).\n *\n * The explicit return type surfaces any divergence from the hand-written `TableDetail` in\n * `@keboola/api-client` as a TypeScript error. That type is not derived from the OpenAPI\n * document, so this annotation and the `satisfies` above are the only mechanical check there is.\n */\nexport const getTable = (): TableDetail => freshTable;\n\n/**\n * Returns three TableDetail objects representing different lifecycle states:\n * 1. Fresh — just created, nothing loaded (`lastImportDate: null`, `rowsCount: 0`).\n * 2. Recently updated — 24 500 rows, imported June 2024.\n * 3. Large — 125 500 rows, imported March 2024.\n *\n * The three row counts add up to the shared bucket's own `rowsCount`, and the bucket's\n * `lastChangeDate` is the newest of theirs, as Storage reports it.\n */\nexport const listTables = (): TableDetail[] => [freshTable, recentlyUpdatedTable, largeTable];\n\n/**\n * Named fixtures for targeted access in tests.\n */\nexport const tableFixtures = {\n fresh: freshTable,\n recentlyUpdated: recentlyUpdatedTable,\n large: largeTable,\n} satisfies Record<'fresh' | 'recentlyUpdated' | 'large', TableDetail>;\n\nexport type { Table, TableDetail };\n","import { appFixtures, getApp, listApps } from './clients/apps/apps';\nimport { deploymentFixtures, getDeployment, listDeployments } from './clients/apps/deployments';\nimport { getAppRun, listAppRuns, runFixtures } from './clients/apps/runs';\nimport {\n developerPortalFixtures,\n getVendor,\n listAllApps,\n listAllVendors,\n listAppChanges,\n listPublishedApps,\n listServiceAccounts,\n listUsers,\n listVendorApps,\n listVendors,\n} from './clients/developerPortal/apps';\nimport {\n applicationTokenFixtures,\n getApplicationToken,\n getApplicationTokens,\n} from './clients/management/applicationTokens';\nimport { getUiApp, getUiApps, uiAppFixtures } from './clients/management/uiApps';\nimport { getDevBranches, getStackInfo, verifyStorageToken } from './clients/storage/bootstrap';\nimport { getTable, listTables, tableFixtures } from './clients/storage/tables';\n\nexport const fixtures = {\n management: {\n applicationTokens: {\n getApplicationToken,\n getApplicationTokens,\n fixtures: applicationTokenFixtures,\n },\n uiApps: {\n getUiApp,\n getUiApps,\n fixtures: uiAppFixtures,\n },\n },\n storage: {\n bootstrap: {\n getStackInfo,\n verifyStorageToken,\n getDevBranches,\n },\n tables: {\n getTable,\n listTables,\n fixtures: tableFixtures,\n },\n },\n apps: {\n apps: {\n getApp,\n listApps,\n fixtures: appFixtures,\n },\n deployments: {\n getDeployment,\n listDeployments,\n fixtures: deploymentFixtures,\n },\n runs: {\n getAppRun,\n listAppRuns,\n fixtures: runFixtures,\n },\n },\n developerPortal: {\n listPublishedApps,\n listVendorApps,\n listAllApps,\n listAllVendors,\n getVendor,\n listVendors,\n listUsers,\n listServiceAccounts,\n listAppChanges,\n fixtures: developerPortalFixtures,\n },\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keboola/api-fixtures",
3
- "version": "37.0.0",
3
+ "version": "39.0.0",
4
4
  "description": "Typed test fixtures keyed by Keboola API endpoint",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -49,11 +49,11 @@
49
49
  "typescript"
50
50
  ],
51
51
  "peerDependencies": {
52
- "@keboola/api-client": "^42.0.0"
52
+ "@keboola/api-client": "^44.0.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@arethetypeswrong/cli": "^0.18.2",
56
- "@keboola/api-client": "^42.0.0",
56
+ "@keboola/api-client": "^44.0.0",
57
57
  "@keboola/eslint-plugin-design": "^0.5.0",
58
58
  "@keboola/oxlint-config": "^10.2.0",
59
59
  "@keboola/tsconfig": "^0.2.1",