@keboola/api-fixtures 43.0.0 → 45.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
@@ -15,6 +15,7 @@ Current slices:
15
15
  responses a client's ready gate needs before it is usable. Reach for it in any test that builds a
16
16
  real client over MSW. `getStackInfo()` announces every service by default, which is what keeps a
17
17
  test's service clients from being dummies that throw `ServiceUnavailableError`.
18
+ - `storage.bucketSharing` — `getSharingTargets()`, the projects and users a bucket can be shared to.
18
19
  - `storage.tables` — `getTable()`, `listTables()`, `tableFixtures`
19
20
  - `apps.apps` / `apps.deployments` / `apps.runs` — the sandboxes-service `/v2` App Deployments
20
21
  surface. The three compose into one coherent app (an app's `production` names a deployment in
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @keboola/api-fixtures
2
2
 
3
+ ## 45.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies:
8
+ - @keboola/api-client@50.0.0
9
+
10
+ ## 44.0.0
11
+
12
+ ### Minor Changes
13
+
14
+ - `getSharingTargets()` (`fixtures.storage.bucketSharing`) is the body of `GET /v2/storage/sharing-targets`.
15
+
16
+ ### Patch Changes
17
+
18
+ - `App` carries `hasManagedGitRepo`: whether the app's code lives in a Keboola-managed Git repository.
19
+
20
+ - Updated dependencies:
21
+ - @keboola/api-client@49.0.0
22
+
3
23
  ## 43.0.0
4
24
 
5
25
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let _keboola_api_client_constants = require("@keboola/api-client/constants");
3
- //#region src/clients/apps/deployments.ts
3
+ // src/clients/apps/deployments.ts
4
4
  const APP_ID = "374811";
5
5
  const deploymentId = (suffix) => `019f1c3a-${suffix}-7c1e-b4a2-0d9f3e6a8c15`;
6
6
  const archivedDeployment = {
@@ -79,8 +79,7 @@ const listDeployments = () => [
79
79
  buildFailedDeployment,
80
80
  runFailedDeployment
81
81
  ];
82
- //#endregion
83
- //#region src/clients/apps/apps.ts
82
+ // src/clients/apps/apps.ts
84
83
  const base$1 = {
85
84
  id: APP_ID,
86
85
  projectId: "14",
@@ -88,7 +87,8 @@ const base$1 = {
88
87
  branchId: "6",
89
88
  configId: "01kz9kny4n49x3xk0e4k8ynpmq",
90
89
  type: "streamlit",
91
- url: "https://hello-dashboard-374811.hub.canary-orion.keboola.dev"
90
+ url: "https://hello-dashboard-374811.hub.canary-orion.keboola.dev",
91
+ hasManagedGitRepo: false
92
92
  };
93
93
  const production = (deployment) => ({
94
94
  desiredDeploymentId: deployment.id,
@@ -167,8 +167,7 @@ const listApps = () => [
167
167
  readdress(suspendedApp, "374812"),
168
168
  readdress(neverDeployedApp, "374813")
169
169
  ];
170
- //#endregion
171
- //#region src/clients/apps/runs.ts
170
+ // src/clients/apps/runs.ts
172
171
  const base = {
173
172
  appId: APP_ID,
174
173
  runtimeSize: "small",
@@ -254,8 +253,7 @@ const listAppRuns = () => [
254
253
  runningRun,
255
254
  finishedRun
256
255
  ];
257
- //#endregion
258
- //#region src/clients/developerPortal/apps.ts
256
+ // src/clients/developerPortal/apps.ts
259
257
  const keboolaVendor = {
260
258
  id: "keboola",
261
259
  name: "Keboola",
@@ -597,8 +595,7 @@ const developerPortalFixtures = {
597
595
  },
598
596
  changes: { single: appChange }
599
597
  };
600
- //#endregion
601
- //#region src/clients/management/applicationTokens.ts
598
+ // src/clients/management/applicationTokens.ts
602
599
  const usedToken = {
603
600
  id: 13702,
604
601
  description: "Sandboxes API",
@@ -662,8 +659,7 @@ const applicationTokenFixtures = {
662
659
  expiring: expiringToken,
663
660
  created: createdToken
664
661
  };
665
- //#endregion
666
- //#region src/clients/management/uiApps.ts
662
+ // src/clients/management/uiApps.ts
667
663
  const activeApp = {
668
664
  stringId: "kbc",
669
665
  name: "Keboola Connection UI",
@@ -718,8 +714,7 @@ const uiAppFixtures = {
718
714
  inactive: inactiveApp,
719
715
  detail: appDetail
720
716
  };
721
- //#endregion
722
- //#region src/clients/storage/bootstrap.ts
717
+ // src/clients/storage/bootstrap.ts
723
718
  /** The stack an MSW-backed test points its client at, unless a caller passes its own. */
724
719
  const DEFAULT_BASE_URL = "https://connection.test";
725
720
  /**
@@ -752,8 +747,8 @@ const getStackInfo = ({ baseUrl = DEFAULT_BASE_URL, services = Object.values(_ke
752
747
  /**
753
748
  * The verified master token `GET /v2/storage/tokens/verify` returns.
754
749
  *
755
- * - Complete on purpose: `api.context.project.sapiToken` is this object verbatim and hooks read deep
756
- * into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as
750
+ * - Complete on purpose: kbc-ui's `useProject().sapiToken` is this object verbatim and hooks read
751
+ * deep into it (`owner.id`, `admin.role`, `adminOwner.email`), so a partial body surfaces as
757
752
  * `undefined`s far from the test that caused them.
758
753
  * - Every permission flag is granted; a test needing a restricted token overrides the handler.
759
754
  */
@@ -843,8 +838,48 @@ const getDevBranches = () => [{
843
838
  created: "2024-01-01T00:00:00Z",
844
839
  creatorToken: []
845
840
  }];
846
- //#endregion
847
- //#region src/clients/storage/tables.ts
841
+ // src/clients/storage/bucketSharing.ts
842
+ /**
843
+ * The projects and users `GET /v2/storage/sharing-targets` returns.
844
+ *
845
+ * - Users come sorted by email, as Connection sorts them; their ids descend, so a list resorted by
846
+ * id shows the wrong order.
847
+ * - None is the admin behind `verifyStorageToken()`.
848
+ */
849
+ const getSharingTargets = () => ({
850
+ projects: [
851
+ {
852
+ id: 7,
853
+ name: "Linked project"
854
+ },
855
+ {
856
+ id: 12,
857
+ name: "Other project"
858
+ },
859
+ {
860
+ id: 100,
861
+ name: "Sales"
862
+ }
863
+ ],
864
+ users: [
865
+ {
866
+ id: 34,
867
+ name: "Adam",
868
+ email: "adam@keboola.com"
869
+ },
870
+ {
871
+ id: 21,
872
+ name: "Beata",
873
+ email: "beata@keboola.com"
874
+ },
875
+ {
876
+ id: 7,
877
+ name: "Cyril",
878
+ email: "cyril@keboola.com"
879
+ }
880
+ ]
881
+ });
882
+ // src/clients/storage/tables.ts
848
883
  const tableBase = {
849
884
  transactional: false,
850
885
  indexType: null,
@@ -997,8 +1032,7 @@ const tableFixtures = {
997
1032
  recentlyUpdated: recentlyUpdatedTable,
998
1033
  large: largeTable
999
1034
  };
1000
- //#endregion
1001
- //#region src/fixtures.ts
1035
+ // src/fixtures.ts
1002
1036
  const fixtures = {
1003
1037
  management: {
1004
1038
  applicationTokens: {
@@ -1018,6 +1052,7 @@ const fixtures = {
1018
1052
  verifyStorageToken,
1019
1053
  getDevBranches
1020
1054
  },
1055
+ bucketSharing: { getSharingTargets },
1021
1056
  tables: {
1022
1057
  getTable,
1023
1058
  listTables,
@@ -1054,7 +1089,6 @@ const fixtures = {
1054
1089
  fixtures: developerPortalFixtures
1055
1090
  }
1056
1091
  };
1057
- //#endregion
1058
1092
  exports.DEFAULT_BASE_URL = DEFAULT_BASE_URL;
1059
1093
  exports.appFixtures = appFixtures;
1060
1094
  exports.applicationTokenFixtures = applicationTokenFixtures;
@@ -1067,6 +1101,7 @@ exports.getApplicationToken = getApplicationToken;
1067
1101
  exports.getApplicationTokens = getApplicationTokens;
1068
1102
  exports.getDeployment = getDeployment;
1069
1103
  exports.getDevBranches = getDevBranches;
1104
+ exports.getSharingTargets = getSharingTargets;
1070
1105
  exports.getStackInfo = getStackInfo;
1071
1106
  exports.getTable = getTable;
1072
1107
  exports.getUiApp = getUiApp;
@@ -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/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: 'https://github.com/keboola/kbc-ui/actions/runs/1645',\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 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 timezone: null,\n isBYODB: false,\n usersCount: 1,\n },\n organization: { id: 'org-1', created: null },\n admin: {\n id: 100,\n name: 'Admin User',\n features: [],\n isOrganizationMember: true,\n role: 'admin',\n isActivated: true,\n },\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: 'KEBOOLA_1',\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',\n updated: '2024-06-01T09:00:00+0200',\n isLinkedBucket: false,\n bucketSharingAllowed: true,\n};\n\n// What every non-typed, non-alias Snowflake table carries besides its own identity and data.\nconst tableBase = {\n transactional: false,\n indexType: null,\n indexKey: [],\n distributionType: null,\n distributionKey: [],\n syntheticPrimaryKeyEnabled: false,\n isAliasable: true,\n isDescriptionSystemManaged: false,\n timestampType: 'MANAGED' as const,\n tableType: 'table',\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n};\n\n// A freshly created table with no imports yet (non-typed, non-alias variant).\nconst freshTable = {\n ...tableBase,\n uri: 'https://connection.keboola.com/v2/storage/tables/in.c-main.users',\n id: 'in.c-main.users',\n name: 'users',\n displayName: 'Users',\n path: 'KEBOOLA_1.c-main.users',\n primaryKey: ['id'],\n metadata: [],\n columns: ['id', 'email', 'name', 'created_at'],\n columnMetadata: {},\n created: '2024-06-01T09:00:00+0200',\n lastImportDate: null,\n lastChangeDate: null,\n rowsCount: 0,\n dataSizeBytes: 0,\n} satisfies TableDetail;\n\n// A recently updated table with a moderate size (non-typed, non-alias variant).\nconst recentlyUpdatedTable = {\n ...tableBase,\n uri: 'https://connection.keboola.com/v2/storage/tables/in.c-main.orders',\n id: 'in.c-main.orders',\n name: 'orders',\n displayName: 'Orders',\n path: 'KEBOOLA_1.c-main.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 created: '2024-01-15T10:00:00+0100',\n lastImportDate: '2024-06-01T09:00:00+0200',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n rowsCount: 24500,\n dataSizeBytes: 10485760,\n} satisfies TableDetail;\n\n// A large table with many rows representing high-volume data (non-typed, non-alias variant).\nconst largeTable = {\n ...tableBase,\n uri: 'https://connection.keboola.com/v2/storage/tables/in.c-main.events',\n id: 'in.c-main.events',\n name: 'events',\n displayName: 'Events',\n path: 'KEBOOLA_1.c-main.events',\n primaryKey: [],\n metadata: [],\n columns: ['event_id', 'user_id', 'event_type', 'properties', 'occurred_at'],\n columnMetadata: {},\n created: '2024-01-15T10:00:00+0100',\n lastImportDate: '2024-03-10T08:30:00+0100',\n lastChangeDate: '2024-03-10T08:30:00+0100',\n rowsCount: 125500,\n dataSizeBytes: 41943040,\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 a drift from `TableDetail` as a TypeScript error.\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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"}
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/bucketSharing.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 hasManagedGitRepo: false,\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: 'https://github.com/keboola/kbc-ui/actions/runs/1645',\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: kbc-ui's `useProject().sapiToken` is this object verbatim and hooks read\n * deep 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 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 timezone: null,\n isBYODB: false,\n usersCount: 1,\n },\n organization: { id: 'org-1', created: null },\n admin: {\n id: 100,\n name: 'Admin User',\n features: [],\n isOrganizationMember: true,\n role: 'admin',\n isActivated: true,\n },\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 { SharingTargets } from '@keboola/api-client/storage/types';\n\n/**\n * The projects and users `GET /v2/storage/sharing-targets` returns.\n *\n * - Users come sorted by email, as Connection sorts them; their ids descend, so a list resorted by\n * id shows the wrong order.\n * - None is the admin behind `verifyStorageToken()`.\n */\nexport const getSharingTargets = (): SharingTargets => ({\n projects: [\n { id: 7, name: 'Linked project' },\n { id: 12, name: 'Other project' },\n { id: 100, name: 'Sales' },\n ],\n users: [\n { id: 34, name: 'Adam', email: 'adam@keboola.com' },\n { id: 21, name: 'Beata', email: 'beata@keboola.com' },\n { id: 7, name: 'Cyril', email: 'cyril@keboola.com' },\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: 'KEBOOLA_1',\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',\n updated: '2024-06-01T09:00:00+0200',\n isLinkedBucket: false,\n bucketSharingAllowed: true,\n};\n\n// What every non-typed, non-alias Snowflake table carries besides its own identity and data.\nconst tableBase = {\n transactional: false,\n indexType: null,\n indexKey: [],\n distributionType: null,\n distributionKey: [],\n syntheticPrimaryKeyEnabled: false,\n isAliasable: true,\n isDescriptionSystemManaged: false,\n timestampType: 'MANAGED' as const,\n tableType: 'table',\n attributes: [],\n bucket,\n isTyped: false as const,\n isAlias: false as const,\n};\n\n// A freshly created table with no imports yet (non-typed, non-alias variant).\nconst freshTable = {\n ...tableBase,\n uri: 'https://connection.keboola.com/v2/storage/tables/in.c-main.users',\n id: 'in.c-main.users',\n name: 'users',\n displayName: 'Users',\n path: 'KEBOOLA_1.c-main.users',\n primaryKey: ['id'],\n metadata: [],\n columns: ['id', 'email', 'name', 'created_at'],\n columnMetadata: {},\n created: '2024-06-01T09:00:00+0200',\n lastImportDate: null,\n lastChangeDate: null,\n rowsCount: 0,\n dataSizeBytes: 0,\n} satisfies TableDetail;\n\n// A recently updated table with a moderate size (non-typed, non-alias variant).\nconst recentlyUpdatedTable = {\n ...tableBase,\n uri: 'https://connection.keboola.com/v2/storage/tables/in.c-main.orders',\n id: 'in.c-main.orders',\n name: 'orders',\n displayName: 'Orders',\n path: 'KEBOOLA_1.c-main.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 created: '2024-01-15T10:00:00+0100',\n lastImportDate: '2024-06-01T09:00:00+0200',\n lastChangeDate: '2024-06-01T09:00:00+0200',\n rowsCount: 24500,\n dataSizeBytes: 10485760,\n} satisfies TableDetail;\n\n// A large table with many rows representing high-volume data (non-typed, non-alias variant).\nconst largeTable = {\n ...tableBase,\n uri: 'https://connection.keboola.com/v2/storage/tables/in.c-main.events',\n id: 'in.c-main.events',\n name: 'events',\n displayName: 'Events',\n path: 'KEBOOLA_1.c-main.events',\n primaryKey: [],\n metadata: [],\n columns: ['event_id', 'user_id', 'event_type', 'properties', 'occurred_at'],\n columnMetadata: {},\n created: '2024-01-15T10:00:00+0100',\n lastImportDate: '2024-03-10T08:30:00+0100',\n lastChangeDate: '2024-03-10T08:30:00+0100',\n rowsCount: 125500,\n dataSizeBytes: 41943040,\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 a drift from `TableDetail` as a TypeScript error.\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 { getSharingTargets } from './clients/storage/bucketSharing';\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 bucketSharing: {\n getSharingTargets,\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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"}