@keboola/api-client 36.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 +12 -3
- package/API-SURFACE.md +14 -1
- package/CHANGELOG.md +74 -0
- package/README.md +19 -17
- package/dist/{ManagementClientAuthError-ey-f03vy.js → ManagementClientAuthError-Cr9IOsnJ.js} +3 -2
- package/dist/{ManagementClientAuthError-ey-f03vy.js.map → ManagementClientAuthError-Cr9IOsnJ.js.map} +1 -1
- package/dist/{ManagementClientAuthError-DD4u0EU7.cjs → ManagementClientAuthError-FcfMJNhr.cjs} +3 -2
- package/dist/{ManagementClientAuthError-DD4u0EU7.cjs.map → ManagementClientAuthError-FcfMJNhr.cjs.map} +1 -1
- package/dist/ai/index.cjs +2 -2
- package/dist/ai/index.js +2 -2
- package/dist/{appLogs-BjfUoWzs.cjs → appLogs-C_zP0lpv.cjs} +2 -2
- package/dist/{appLogs-BjfUoWzs.cjs.map → appLogs-C_zP0lpv.cjs.map} +1 -1
- package/dist/{appLogs-xsVkTriU.js → appLogs-Cl7Q_MR9.js} +2 -2
- package/dist/{appLogs-xsVkTriU.js.map → appLogs-Cl7Q_MR9.js.map} +1 -1
- package/dist/apps/index.cjs +3 -3
- package/dist/apps/index.js +3 -3
- package/dist/assets/index.cjs +1 -1
- package/dist/assets/index.js +1 -1
- package/dist/auth/index.cjs +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/{auth-aItmDu45.js → auth-BjmkFOgd.js} +2 -2
- package/dist/{auth-aItmDu45.js.map → auth-BjmkFOgd.js.map} +1 -1
- package/dist/{auth-JQ33o3nU.cjs → auth-DLWnl18b.cjs} +2 -2
- package/dist/{auth-JQ33o3nU.cjs.map → auth-DLWnl18b.cjs.map} +1 -1
- package/dist/{authClient-_PpvGgZJ.cjs → authClient-8yU1last.cjs} +5 -5
- package/dist/{authClient-_PpvGgZJ.cjs.map → authClient-8yU1last.cjs.map} +1 -1
- package/dist/{authClient-D7W9vWPR.js → authClient-BTo4Afm6.js} +5 -5
- package/dist/{authClient-D7W9vWPR.js.map → authClient-BTo4Afm6.js.map} +1 -1
- package/dist/billing/index.cjs +2 -2
- package/dist/billing/index.js +2 -2
- package/dist/businessWorkspaceApi/index.cjs +3 -0
- package/dist/businessWorkspaceApi/index.d.cts +2 -0
- package/dist/businessWorkspaceApi/index.d.ts +2 -0
- package/dist/businessWorkspaceApi/index.js +2 -0
- package/dist/businessWorkspaceApi/types.cjs +0 -0
- package/dist/businessWorkspaceApi/types.d.cts +2 -0
- package/dist/businessWorkspaceApi/types.d.ts +2 -0
- package/dist/businessWorkspaceApi/types.js +1 -0
- package/dist/businessWorkspaceApi-BD-iUj07.js +61 -0
- package/dist/businessWorkspaceApi-BD-iUj07.js.map +1 -0
- package/dist/businessWorkspaceApi-wyBdbpIJ.cjs +66 -0
- package/dist/businessWorkspaceApi-wyBdbpIJ.cjs.map +1 -0
- package/dist/businessWorkspaceApiClient-C2WyWN3b.d.ts +529 -0
- package/dist/businessWorkspaceApiClient-CRM1U8b-.d.cts +529 -0
- package/dist/chat/index.cjs +5 -5
- package/dist/chat/index.cjs.map +1 -1
- package/dist/chat/index.d.cts +1 -1
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +5 -5
- package/dist/chat/index.js.map +1 -1
- package/dist/constants/index.cjs +1 -1
- package/dist/constants/index.d.cts +2 -2
- package/dist/constants/index.d.ts +2 -2
- package/dist/constants/index.js +1 -1
- package/dist/{constants-wfbFsqqN.js → constants-C2tYAJSj.js} +10 -1
- package/dist/constants-C2tYAJSj.js.map +1 -0
- package/dist/{constants-C4DlsF_M.cjs → constants-C6xku_Vx.cjs} +10 -1
- package/dist/constants-C6xku_Vx.cjs.map +1 -0
- package/dist/{createFetchClient-DgMiqTJ8.cjs → createFetchClient-BlgPbjFj.cjs} +14 -2
- package/dist/createFetchClient-BlgPbjFj.cjs.map +1 -0
- package/dist/{createFetchClient-U-ZrwPl2.js → createFetchClient-C-cadpBx.js} +14 -2
- package/dist/createFetchClient-C-cadpBx.js.map +1 -0
- package/dist/{createGenericFetchClient-rxvUUbap.js → createGenericFetchClient-Bnf1QK9W.js} +2 -2
- package/dist/{createGenericFetchClient-rxvUUbap.js.map → createGenericFetchClient-Bnf1QK9W.js.map} +1 -1
- package/dist/{createGenericFetchClient-o3cPJeRn.cjs → createGenericFetchClient-lcozzwk2.cjs} +2 -2
- package/dist/{createGenericFetchClient-o3cPJeRn.cjs.map → createGenericFetchClient-lcozzwk2.cjs.map} +1 -1
- package/dist/{createOpenapiFetchClient-DhUU3M1W.cjs → createOpenapiFetchClient-C3UmDXpe.cjs} +2 -2
- package/dist/{createOpenapiFetchClient-DhUU3M1W.cjs.map → createOpenapiFetchClient-C3UmDXpe.cjs.map} +1 -1
- package/dist/{createOpenapiFetchClient-BVSc9ibR.js → createOpenapiFetchClient-COaPeeQ0.js} +2 -2
- package/dist/{createOpenapiFetchClient-BVSc9ibR.js.map → createOpenapiFetchClient-COaPeeQ0.js.map} +1 -1
- package/dist/{credential-DVWvJFJs.cjs → credential-CAulvfZ-.cjs} +2 -2
- package/dist/{credential-DVWvJFJs.cjs.map → credential-CAulvfZ-.cjs.map} +1 -1
- package/dist/{credential-CihSf_xs.js → credential-DWXbo4IX.js} +2 -2
- package/dist/{credential-CihSf_xs.js.map → credential-DWXbo4IX.js.map} +1 -1
- package/dist/dataScience/index.cjs +2 -2
- package/dist/dataScience/index.js +2 -2
- package/dist/{dataScience-C1gO5zUn.js → dataScience-B_BmnB1m.js} +5 -5
- package/dist/{dataScience-C1gO5zUn.js.map → dataScience-B_BmnB1m.js.map} +1 -1
- package/dist/{dataScience-0Rl_EuV_.cjs → dataScience-D-hyc4GY.cjs} +5 -5
- package/dist/{dataScience-0Rl_EuV_.cjs.map → dataScience-D-hyc4GY.cjs.map} +1 -1
- package/dist/developerPortal/index.cjs +1 -1
- package/dist/developerPortal/index.js +1 -1
- package/dist/{developerPortalClient-ki0XS_OD.cjs → developerPortalClient-CutPqoAa.cjs} +3 -3
- package/dist/{developerPortalClient-ki0XS_OD.cjs.map → developerPortalClient-CutPqoAa.cjs.map} +1 -1
- package/dist/{developerPortalClient-C_48z8BN.js → developerPortalClient-yHFTkKPb.js} +3 -3
- package/dist/{developerPortalClient-C_48z8BN.js.map → developerPortalClient-yHFTkKPb.js.map} +1 -1
- package/dist/domain/permissions/index.d.cts +2 -2
- package/dist/domain/permissions/index.d.ts +2 -2
- package/dist/editor/index.cjs +2 -2
- package/dist/editor/index.js +2 -2
- package/dist/encryption/index.cjs +1 -1
- package/dist/encryption/index.d.cts +1 -1
- package/dist/encryption/index.d.ts +1 -1
- package/dist/encryption/index.js +1 -1
- package/dist/encryption/types.d.cts +1 -1
- package/dist/encryption/types.d.ts +1 -1
- package/dist/import/index.cjs +1 -1
- package/dist/import/index.js +1 -1
- package/dist/{import-C83w7BKz.cjs → import-7YyyD_U_.cjs} +3 -3
- package/dist/{import-C83w7BKz.cjs.map → import-7YyyD_U_.cjs.map} +1 -1
- package/dist/{import-CROEK82b.js → import-xliONVib.js} +3 -3
- package/dist/{import-CROEK82b.js.map → import-xliONVib.js.map} +1 -1
- package/dist/{index-D8rcUbnk.d.ts → index-1r_CskjU.d.ts} +2 -2
- package/dist/{index-BXF-bs2d.d.ts → index-BK-qHT39.d.ts} +8 -4
- package/dist/{index-DIAyi-EZ.d.cts → index-CHXnJQ9s.d.cts} +92 -14
- package/dist/{index-BDG-LKXj.d.cts → index-CWoEnDJ_.d.cts} +8 -4
- package/dist/{index-NaYLwG_h.d.ts → index-DBklbaTp.d.cts} +9 -1
- package/dist/{index-NaYLwG_h.d.cts → index-DBklbaTp.d.ts} +9 -1
- package/dist/{index-BgLnWTZU.d.cts → index-DVw4Av4b.d.cts} +4 -4
- package/dist/{index-DR4QqItd.d.cts → index-DWf6FXOr.d.cts} +2 -2
- package/dist/{index-CqgtL2NU.d.ts → index-De5qUWhp.d.ts} +4 -4
- package/dist/{index-2JM0gyAf.d.ts → index-GfKzh267.d.ts} +92 -14
- package/dist/index.cjs +30 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +30 -20
- package/dist/index.js.map +1 -1
- package/dist/{isLoginPageRedirect-B0EmRsHr.cjs → isLoginPageRedirect-Cm6Pn8Pj.cjs} +2 -2
- package/dist/{isLoginPageRedirect-B0EmRsHr.cjs.map → isLoginPageRedirect-Cm6Pn8Pj.cjs.map} +1 -1
- package/dist/{isLoginPageRedirect-BTTAedW-.js → isLoginPageRedirect-hyPqyWNX.js} +2 -2
- package/dist/{isLoginPageRedirect-BTTAedW-.js.map → isLoginPageRedirect-hyPqyWNX.js.map} +1 -1
- package/dist/kaiAgent/index.cjs +1 -1
- package/dist/kaiAgent/index.d.cts +1 -1
- package/dist/kaiAgent/index.d.ts +1 -1
- package/dist/kaiAgent/index.js +1 -1
- package/dist/kaiAgent/types.d.cts +2 -2
- package/dist/kaiAgent/types.d.ts +2 -2
- package/dist/{kaiAgent-8LNzGhZc.js → kaiAgent-CcT2oNip.js} +41 -6
- package/dist/kaiAgent-CcT2oNip.js.map +1 -0
- package/dist/{kaiAgent-B_TaUPRt.cjs → kaiAgent-DaB6UCsh.cjs} +41 -6
- package/dist/kaiAgent-DaB6UCsh.cjs.map +1 -0
- package/dist/{kaiAgentClient-BJj_2aqt.d.ts → kaiAgentClient-B5L4gbQ1.d.ts} +8 -3
- package/dist/{kaiAgentClient-DhTaM3GC.d.cts → kaiAgentClient-CHpULyeG.d.cts} +8 -3
- package/dist/management/index.cjs +1 -1
- package/dist/management/index.d.cts +2 -2
- package/dist/management/index.d.ts +2 -2
- package/dist/management/index.js +1 -1
- package/dist/management/types.d.cts +2 -2
- package/dist/management/types.d.ts +2 -2
- package/dist/{management-BoxlRNg2.cjs → management-DeZiQSlw.cjs} +41 -8
- package/dist/management-DeZiQSlw.cjs.map +1 -0
- package/dist/{management-Bp440RsV.js → management-ckdnu1dA.js} +41 -8
- package/dist/management-ckdnu1dA.js.map +1 -0
- package/dist/metastore/index.cjs +1 -1
- package/dist/metastore/index.js +1 -1
- package/dist/{metastore-BYYWTb3m.cjs → metastore-9AGrwjmN.cjs} +4 -4
- package/dist/{metastore-BYYWTb3m.cjs.map → metastore-9AGrwjmN.cjs.map} +1 -1
- package/dist/{metastore-VCDRVhUT.js → metastore-B0PolCjQ.js} +4 -4
- package/dist/{metastore-VCDRVhUT.js.map → metastore-B0PolCjQ.js.map} +1 -1
- package/dist/microsoftGraph/index.cjs +2 -2
- package/dist/microsoftGraph/index.js +2 -2
- package/dist/notifications/index.cjs +3 -3
- package/dist/notifications/index.js +3 -3
- package/dist/oauth/index.cjs +1 -1
- package/dist/oauth/index.js +1 -1
- package/dist/{oauth--asfePw-.js → oauth-BnHVf4cB.js} +5 -5
- package/dist/{oauth--asfePw-.js.map → oauth-BnHVf4cB.js.map} +1 -1
- package/dist/{oauth-B8yqG6Sy.cjs → oauth-DNtv4Ihb.cjs} +5 -5
- package/dist/{oauth-B8yqG6Sy.cjs.map → oauth-DNtv4Ihb.cjs.map} +1 -1
- package/dist/omnisearch/index.cjs +2 -2
- package/dist/omnisearch/index.js +2 -2
- package/dist/{project-hePfzUY0.d.cts → project-BRpzv3yE.d.cts} +2 -2
- package/dist/{project-C2wvX0xZ.d.ts → project-DCHOxRWd.d.ts} +2 -2
- package/dist/queryService/index.cjs +1 -1
- package/dist/queryService/index.d.cts +1 -1
- package/dist/queryService/index.d.ts +1 -1
- package/dist/queryService/index.js +1 -1
- package/dist/{queryService-BVtjkXy1.cjs → queryService-BVwD6Vmc.cjs} +5 -5
- package/dist/{queryService-BVtjkXy1.cjs.map → queryService-BVwD6Vmc.cjs.map} +1 -1
- package/dist/{queryService-Ca65E5KH.js → queryService-j3XZ2mX6.js} +5 -5
- package/dist/{queryService-Ca65E5KH.js.map → queryService-j3XZ2mX6.js.map} +1 -1
- package/dist/queue/index.cjs +1 -1
- package/dist/queue/index.d.cts +1 -1
- package/dist/queue/index.d.ts +1 -1
- package/dist/queue/index.js +1 -1
- package/dist/{queue-DyotLFJi.js → queue-Dagl0sdP.js} +4 -4
- package/dist/{queue-DyotLFJi.js.map → queue-Dagl0sdP.js.map} +1 -1
- package/dist/{queue-OJJUUqc2.cjs → queue-e3rMWbmK.cjs} +4 -4
- package/dist/{queue-OJJUUqc2.cjs.map → queue-e3rMWbmK.cjs.map} +1 -1
- package/dist/scheduler/index.cjs +3 -3
- package/dist/scheduler/index.js +3 -3
- package/dist/sdk/configurations/index.d.cts +4 -4
- package/dist/sdk/configurations/index.d.ts +4 -4
- package/dist/sdk/developerPortal/index.cjs +3 -3
- package/dist/sdk/developerPortal/index.js +3 -3
- package/dist/sdk/queryService/index.d.cts +1 -1
- package/dist/sdk/queryService/index.d.ts +1 -1
- package/dist/sdk/semanticLayer/index.cjs +1 -1
- package/dist/sdk/semanticLayer/index.js +1 -1
- package/dist/sdk/storage/index.d.cts +1 -1
- package/dist/sdk/storage/index.d.ts +1 -1
- package/dist/sdk/vault/index.d.cts +1 -1
- package/dist/sdk/vault/index.d.ts +1 -1
- package/dist/{semanticLayer-CSqmtHRo.js → semanticLayer-6_gtFxDu.js} +38 -5
- package/dist/semanticLayer-6_gtFxDu.js.map +1 -0
- package/dist/{semanticLayer-E0Vilu8u.cjs → semanticLayer-9uTaU7UT.cjs} +38 -5
- package/dist/semanticLayer-9uTaU7UT.cjs.map +1 -0
- package/dist/{serviceIds-DRcoTnSd.d.ts → serviceIds-DC-H6ZD9.d.cts} +2 -1
- package/dist/{serviceIds-DRcoTnSd.d.cts → serviceIds-DC-H6ZD9.d.ts} +2 -1
- package/dist/status/index.cjs +1 -1
- package/dist/status/index.js +1 -1
- package/dist/storage/index.cjs +5 -4
- package/dist/storage/index.d.cts +2 -2
- package/dist/storage/index.d.ts +2 -2
- package/dist/storage/index.js +5 -5
- package/dist/storage/types.d.cts +3 -3
- package/dist/storage/types.d.ts +3 -3
- package/dist/{storage-BKm7cztt.cjs → storage-HFUdEy7P.cjs} +43 -6
- package/dist/storage-HFUdEy7P.cjs.map +1 -0
- package/dist/{storage-LYwFQPNO.js → storage-Ob1LUIDq.js} +38 -7
- package/dist/storage-Ob1LUIDq.js.map +1 -0
- package/dist/stream/index.cjs +3 -3
- package/dist/stream/index.js +3 -3
- package/dist/syncActions/index.cjs +1 -1
- package/dist/syncActions/index.js +1 -1
- package/dist/{syncActions-QeBhIVhG.js → syncActions-B3NS5a0g.js} +5 -5
- package/dist/{syncActions-QeBhIVhG.js.map → syncActions-B3NS5a0g.js.map} +1 -1
- package/dist/{syncActions-OEZdVffK.cjs → syncActions-D2DhY6pP.cjs} +5 -5
- package/dist/{syncActions-OEZdVffK.cjs.map → syncActions-D2DhY6pP.cjs.map} +1 -1
- package/dist/telemetry/index.cjs +3 -3
- package/dist/telemetry/index.js +3 -3
- package/dist/{types-CzsnuPFh.d.cts → types-B-P4vQe0.d.cts} +35 -2
- package/dist/{types-DEc55spK.d.ts → types-B95uNQ9o.d.ts} +3 -3
- package/dist/{types-BQsOHNI0.d.ts → types-BrPlv-NS.d.ts} +3 -3
- package/dist/{types-DjrRmQUe.d.cts → types-CmF3pR2n.d.cts} +3 -3
- package/dist/{types-f8W_j6qD.d.cts → types-Crhy0c9m.d.cts} +657 -199
- package/dist/{types-DPS8nwkV.d.cts → types-DOyNe7oe.d.cts} +2 -1
- package/dist/{types-BuqxXXYP.d.ts → types-DPl8pZsY.d.ts} +35 -2
- package/dist/{types-CaYtinmA.d.cts → types-D_j2Uq5X.d.cts} +3 -3
- package/dist/{types-BupPADSm.d.ts → types-DrqKICcK.d.ts} +657 -199
- package/dist/{types-DBOSvWtD.d.ts → types-gi4Eay19.d.ts} +2 -1
- package/dist/{validateConnectionStatus-olE2sQ3U.js → validateConnectionStatus-828HV8WL.js} +4 -3
- package/dist/validateConnectionStatus-828HV8WL.js.map +1 -0
- package/dist/{validateConnectionStatus-CsvYmCOI.cjs → validateConnectionStatus-CvBKyeDO.cjs} +4 -3
- package/dist/validateConnectionStatus-CvBKyeDO.cjs.map +1 -0
- package/dist/vault/index.cjs +4 -4
- package/dist/vault/index.js +4 -4
- package/package.json +28 -2
- package/surface/businessWorkspaceApi.md +12 -0
- package/surface/chat.md +1 -1
- package/surface/kaiAgent.md +5 -2
- package/surface/management.md +4 -0
- package/dist/constants-C4DlsF_M.cjs.map +0 -1
- package/dist/constants-wfbFsqqN.js.map +0 -1
- package/dist/createFetchClient-DgMiqTJ8.cjs.map +0 -1
- package/dist/createFetchClient-U-ZrwPl2.js.map +0 -1
- package/dist/kaiAgent-8LNzGhZc.js.map +0 -1
- package/dist/kaiAgent-B_TaUPRt.cjs.map +0 -1
- package/dist/management-BoxlRNg2.cjs.map +0 -1
- package/dist/management-Bp440RsV.js.map +0 -1
- package/dist/semanticLayer-CSqmtHRo.js.map +0 -1
- package/dist/semanticLayer-E0Vilu8u.cjs.map +0 -1
- package/dist/storage-BKm7cztt.cjs.map +0 -1
- package/dist/storage-LYwFQPNO.js.map +0 -1
- package/dist/validateConnectionStatus-CsvYmCOI.cjs.map +0 -1
- package/dist/validateConnectionStatus-olE2sQ3U.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"semanticLayer-E0Vilu8u.cjs","names":["z","z","formatValidationIssues","generateUUID","parseOrThrow","z","formatValidationIssues","concurrent"],"sources":["../src/sdks/semanticLayer/errorMessage.ts","../src/sdks/semanticLayer/vocabulary.ts","../src/sdks/semanticLayer/schemas.ts","../src/sdks/semanticLayer/readSchemas.ts","../src/sdks/semanticLayer/semanticLayerSdk.ts"],"sourcesContent":["/**\n * The message out of a metastore error body.\n *\n * - The metastore reports what is actually wrong with a write only inside `errors[].message`\n * (`missing property 'fqn'`). The HTTP status and the response's own message say no more than\n * \"Validation failed\", so a caller that renders those alone tells a user nothing actionable.\n * - Every shape that is not that envelope returns `undefined` rather than a placeholder, so the\n * caller keeps its own fallback (`?? error.message`) instead of rendering a stand-in for one.\n * - Only the first error: the metastore reports fields one at a time, so a list would be a list\n * of one.\n */\nexport const metastoreErrorMessage = (data: unknown): string | undefined => {\n if (typeof data !== 'object' || data === null) return undefined;\n const errors = (data as { errors?: unknown }).errors;\n if (!Array.isArray(errors)) return undefined;\n const first = errors[0];\n if (typeof first !== 'object' || first === null) return undefined;\n const message = (first as { message?: unknown }).message;\n return typeof message === 'string' && message ? message : undefined;\n};\n","/**\n * The closed value sets the metastore accepts inside a semantic object's `data`.\n *\n * - Each one is the single runtime source for a union in `./types`, which derives the type from\n * the array here. A value cannot exist in the type and be missing from the list a dropdown or\n * a validator is built from.\n * - The addressing vocabulary (`SEMANTIC_OBJECT_TYPE`, `MODEL_CHILD_OBJECT_TYPES`) is a\n * different axis — which object a call targets, not what may sit inside one — and stays beside\n * the SDK methods that take it.\n * - This file imports nothing: `./types` reads it, never the reverse.\n */\n\n/**\n * The dialects the metastore accepts, exactly as it spells them. A lowercase value is\n * rejected with `422 value must be one of 'Snowflake', 'BigQuery'`, which surfaces only as a\n * generic \"Validation failed\" — so callers need the real set rather than a bare `string`.\n *\n * `SemanticModelData.sql_dialect` stays `string` for now: narrowing it would break any caller\n * passing a `string` variable, which is a major bump. Validate against this instead.\n */\nexport const SQL_DIALECTS = ['Snowflake', 'BigQuery'] as const;\n\n/** The metastore's constraint kinds. */\nexport const CONSTRAINT_TYPES = [\n 'inequality',\n 'equality',\n 'range',\n 'composition',\n 'exclusion',\n 'temporal',\n 'conditional',\n] as const;\n\n/**\n * What a dataset field is for.\n *\n * - Enumerated, unlike a field's `type`: the metastore takes any type string, but only these\n * four roles.\n */\nexport const FIELD_ROLES = ['key', 'dimension', 'measure', 'timestamp'] as const;\n\n/**\n * How loudly a violated constraint reports.\n *\n * - An unset severity is stored as `warning`, so a reader renders that rather than nothing.\n */\nexport const CONSTRAINT_SEVERITIES = ['error', 'warning', 'info'] as const;\n\n/**\n * What a constraint's rule is evaluated per.\n *\n * - An unset scope is stored as `global`.\n */\nexport const CONSTRAINT_SCOPES = ['global', 'per_location', 'per_date', 'per_category'] as const;\n\n/** The comparisons a constraint's `ruleExpression` can make. */\nexport const RULE_OPERATORS = [\n '<',\n '<=',\n '=',\n '>=',\n '>',\n '!=',\n 'between',\n 'in',\n 'sum_equals',\n 'ratio_between',\n] as const;\n\n/** The join a relationship stands for. */\nexport const RELATIONSHIP_JOIN_TYPES = ['left', 'inner'] as const;\n","import { z } from 'zod';\n\nimport { CONSTRAINT_TYPES, SQL_DIALECTS } from './vocabulary';\n\n/**\n * Runtime validators for the semantic-layer payload shapes.\n *\n * These exist because the metastore's validation errors are opaque — a missing or misspelled\n * field surfaces only as a generic \"Validation failed\", and a wrong `sql_dialect` casing as a\n * 422 that names neither the field nor the accepted values. Parsing first turns those into a\n * message that says what is wrong.\n *\n * **Only the fields the SDK types mark as required are declared.** The metastore owns each\n * object type's full schema, so every schema is a `looseObject`: unknown fields pass through\n * untouched rather than being stripped or rejected. Re-declaring the optional fields here\n * would create a second source of truth that silently drops whatever the metastore adds next.\n *\n * The SDK does **not** parse on its own writes — these are for callers that accept untrusted\n * or hand-authored input (an agent's tool call, a form submission) and want to fail early.\n * `modelUUID` is omitted throughout: the SDK injects it, so callers never supply it.\n */\n\nexport const semanticModelSchema = z.looseObject({\n name: z.string().min(1),\n sql_dialect: z.enum(SQL_DIALECTS),\n});\n\nexport const semanticDatasetSchema = z.looseObject({\n name: z.string().min(1),\n tableId: z.string().min(1),\n fqn: z.string().min(1),\n});\n\nexport const semanticMetricSchema = z.looseObject({\n name: z.string().min(1),\n sql: z.string().min(1),\n});\n\nexport const semanticRelationshipSchema = z.looseObject({\n from: z.string().min(1),\n to: z.string().min(1),\n on: z.string().min(1),\n});\n\nexport const semanticGlossarySchema = z.looseObject({\n term: z.string().min(1),\n definition: z.string().min(1),\n});\n\nexport const semanticConstraintSchema = z.looseObject({\n name: z.string().min(1),\n constraintType: z.enum(CONSTRAINT_TYPES),\n metrics: z.array(z.string()),\n rule: z.string().min(1),\n});\n\n/** Keyed by object type so a caller can pick the schema from a `SemanticChildObjectType`. */\nexport const SEMANTIC_CHILD_OBJECT_SCHEMAS = {\n 'semantic-dataset': semanticDatasetSchema,\n 'semantic-metric': semanticMetricSchema,\n 'semantic-relationship': semanticRelationshipSchema,\n 'semantic-glossary': semanticGlossarySchema,\n 'semantic-constraint': semanticConstraintSchema,\n} as const;\n","import { z } from 'zod';\n\nimport { formatValidationIssues } from '../../errors';\n\nimport type {\n SemanticAiMetadata,\n SemanticChildObjectDataMap,\n SemanticChildObjectType,\n SemanticConstraintData,\n SemanticDatasetData,\n SemanticFieldData,\n SemanticGlossaryData,\n SemanticMetricData,\n SemanticModelData,\n SemanticObjectMeta,\n SemanticRelationshipData,\n SemanticRuleExpression,\n SemanticValidationQuery,\n} from './types';\nimport {\n CONSTRAINT_SCOPES,\n CONSTRAINT_SEVERITIES,\n CONSTRAINT_TYPES,\n FIELD_ROLES,\n RELATIONSHIP_JOIN_TYPES,\n RULE_OPERATORS,\n} from './vocabulary';\n\n/**\n * What a read of the metastore is allowed to hand back, per object type.\n *\n * - Every schema is annotated with the type it must produce, so the compiler rejects a schema that\n * omits a field `./types` declares or makes a required one optional. The declared type and the\n * parser cannot drift apart.\n * - `looseObject` throughout: a field the metastore adds still reaches a caller at runtime, exactly\n * as it did when this boundary asserted instead of parsing.\n * - The metastore validates each object type on write — that is where its opaque \"Validation\n * failed\" and `sql_dialect` 422s come from — so a stored object already satisfies these. Parsing\n * is the net under that, for an object written before a schema version tightened and for the\n * day the two schemas disagree.\n * - An **optional** enum that arrives with a value outside the list reads as absent rather than\n * taking its object down: a new `role` the metastore starts issuing must not delete the dataset\n * carrying it. A **required** enum has no such reading — `constraintType` decides what a\n * constraint means — so an unknown value drops the object.\n */\n\nconst aiMetadataSchema: z.ZodType<SemanticAiMetadata, unknown> = z.looseObject({\n synonyms: z.array(z.string()).optional(),\n keywords: z.array(z.string()).optional(),\n antiKeywords: z.array(z.string()).optional(),\n hints: z.array(z.string()).optional(),\n warnings: z.array(z.string()).optional(),\n});\n\nconst fieldSchema: z.ZodType<SemanticFieldData, unknown> = z.looseObject({\n name: z.string(),\n description: z.string().optional(),\n type: z.string().optional(),\n role: z.enum(FIELD_ROLES).optional().catch(undefined),\n values: z.array(z.string()).optional(),\n ai: aiMetadataSchema.optional(),\n});\n\n/**\n * A dataset's `fields`, where a malformed column is dropped rather than the whole dataset.\n *\n * - `name` is required and `schemas.ts` does not validate `fields` on write, so this SDK can\n * store a nameless column that a strict read would then hide the entire table over.\n * - The same rule as the collection one level up: a drop never takes its container with it.\n */\nconst datasetFieldsSchema = z.array(z.unknown()).transform((items) =>\n items.flatMap((element, index) => {\n const result = fieldSchema.safeParse(element);\n if (result.success) return [result.data];\n\n console.warn(\n `semanticLayerSdk: dropped field #${index} from a semantic-dataset, it does not match ` +\n `its declared shape`,\n formatValidationIssues(result.error.issues),\n );\n return [];\n }),\n);\n\nconst ruleExpressionSchema: z.ZodType<SemanticRuleExpression, unknown> = z.looseObject({\n operator: z.enum(RULE_OPERATORS).optional().catch(undefined),\n left: z.string().optional(),\n right: z.string().optional(),\n bounds: z\n .looseObject({\n min: z.number().optional(),\n max: z.number().optional(),\n })\n .optional(),\n});\n\nconst validationQuerySchema: z.ZodType<SemanticValidationQuery, unknown> = z.looseObject({\n default: z.string().optional(),\n snowflake: z.string().optional(),\n bigquery: z.string().optional(),\n});\n\nexport const semanticModelReadSchema: z.ZodType<SemanticModelData, unknown> = z.looseObject({\n name: z.string(),\n description: z.string().optional(),\n sql_dialect: z.string(),\n});\n\nconst semanticDatasetReadSchema: z.ZodType<SemanticDatasetData, unknown> = z.looseObject({\n modelUUID: z.string(),\n name: z.string(),\n tableId: z.string(),\n fqn: z.string(),\n description: z.string().optional(),\n grain: z.string().optional(),\n primaryKey: z.array(z.string()).optional(),\n fields: datasetFieldsSchema.optional(),\n ai: aiMetadataSchema.optional(),\n});\n\nconst semanticMetricReadSchema: z.ZodType<SemanticMetricData, unknown> = z.looseObject({\n modelUUID: z.string(),\n name: z.string(),\n sql: z.string(),\n dataset: z.string().optional(),\n description: z.string().optional(),\n});\n\nconst semanticRelationshipReadSchema: z.ZodType<SemanticRelationshipData, unknown> = z.looseObject({\n modelUUID: z.string(),\n name: z.string().optional(),\n from: z.string(),\n to: z.string(),\n on: z.string(),\n type: z.enum(RELATIONSHIP_JOIN_TYPES).optional().catch(undefined),\n});\n\nconst semanticGlossaryReadSchema: z.ZodType<SemanticGlossaryData, unknown> = z.looseObject({\n modelUUID: z.string(),\n term: z.string(),\n definition: z.string(),\n seeAlso: z.array(z.string()).optional(),\n});\n\nconst semanticConstraintReadSchema: z.ZodType<SemanticConstraintData, unknown> = z.looseObject({\n modelUUID: z.string(),\n name: z.string(),\n displayName: z.string().optional(),\n description: z.string().optional(),\n constraintType: z.enum(CONSTRAINT_TYPES),\n metrics: z.array(z.string()),\n datasets: z.array(z.string()).optional(),\n rule: z.string(),\n ruleExpression: ruleExpressionSchema.optional(),\n validationQuery: validationQuerySchema.optional(),\n severity: z.enum(CONSTRAINT_SEVERITIES).optional().catch(undefined),\n errorMessage: z.string().optional(),\n remediation: z.string().optional(),\n isActive: z.boolean().optional(),\n scope: z.enum(CONSTRAINT_SCOPES).optional().catch(undefined),\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n});\n\n/** Keyed by object type so a read can pick the schema from a `SemanticChildObjectType`. */\nexport const SEMANTIC_CHILD_OBJECT_READ_SCHEMAS: {\n [T in SemanticChildObjectType]: z.ZodType<SemanticChildObjectDataMap[T], unknown>;\n} = {\n 'semantic-dataset': semanticDatasetReadSchema,\n 'semantic-metric': semanticMetricReadSchema,\n 'semantic-relationship': semanticRelationshipReadSchema,\n 'semantic-glossary': semanticGlossaryReadSchema,\n 'semantic-constraint': semanticConstraintReadSchema,\n};\n\nconst semanticObjectMetaSchema: z.ZodType<SemanticObjectMeta, unknown> = z.looseObject({\n name: z.string().optional(),\n branch: z.string().optional(),\n projectId: z.number().optional(),\n organizationId: z.string().optional(),\n revision: z.number().optional(),\n schemaVersion: z.string().optional(),\n createdAt: z.string().optional(),\n lastUpdated: z.string().optional(),\n revisionCreatedAt: z.string().optional(),\n});\n\n/**\n * The envelope every read comes wrapped in, mapped to the `SemanticObject` the SDK returns.\n *\n * `meta` is absent on nothing we have seen, but every field inside it is optional, so an envelope\n * that omits it is a normalization rather than a failure — the alternative is dropping an object\n * over audit fields no caller requires. `null` normalizes the same way: a serializer that writes\n * an absent object as `null` must not be a different outcome from one that omits the key.\n */\nexport const semanticObjectReadSchema = <TData>(dataSchema: z.ZodType<TData, unknown>) =>\n z\n .object({\n id: z.string(),\n attributes: dataSchema,\n meta: semanticObjectMetaSchema.nullish(),\n })\n .transform(({ id, attributes, meta }) => ({ uuid: id, data: attributes, meta: meta ?? {} }));\n","import { z } from 'zod';\n\nimport { formatValidationIssues, parseOrThrow } from '../../errors';\nimport { concurrent, generateUUID } from '../../utils';\n\nimport {\n SEMANTIC_CHILD_OBJECT_READ_SCHEMAS,\n semanticModelReadSchema,\n semanticObjectReadSchema,\n} from './readSchemas';\nimport type {\n CreateSemanticObjectMeta,\n MetastoreClient,\n SemanticChildObjectDataMap,\n SemanticChildObjectType,\n SemanticModelChildDeleteFailure,\n SemanticModelChildRef,\n SemanticModelData,\n SemanticObject,\n SemanticObjectMeta,\n SemanticObjectType,\n SemanticUnreadableObjectRef,\n UpdateSemanticObjectMeta,\n} from './types';\n\n/**\n * Thrown by `deleteModel` when the child cascade partially fails. Every child delete has\n * settled by the time this is thrown — nothing keeps deleting in the background — and the\n * model itself was kept, so the exact remaining state is knowable: `deletedChildren` are gone,\n * `failedChildren` (and the model) still exist. `errors` carries the per-child rejection\n * reasons, AggregateError-style.\n */\nexport class SemanticLayerCascadeDeleteError extends AggregateError {\n readonly modelUUID: string;\n readonly deletedChildren: SemanticModelChildRef[];\n readonly failedChildren: SemanticModelChildDeleteFailure[];\n\n constructor({\n modelUUID,\n deletedChildren,\n failedChildren,\n }: {\n modelUUID: string;\n deletedChildren: SemanticModelChildRef[];\n failedChildren: SemanticModelChildDeleteFailure[];\n }) {\n const total = deletedChildren.length + failedChildren.length;\n super(\n failedChildren.map((failure) => failure.error),\n `The model was kept because ${failedChildren.length} of its ${total} child objects ` +\n `could not be deleted (${deletedChildren.length} deleted).`,\n );\n this.name = 'SemanticLayerCascadeDeleteError';\n this.modelUUID = modelUUID;\n this.deletedChildren = deletedChildren;\n this.failedChildren = failedChildren;\n }\n}\n\n/**\n * Thrown by `listModelChildren` when a read that has to be complete was not.\n *\n * - A dropped object is invisible to the caller, and two of this SDK's answers cannot survive\n * that: what a delete would destroy, and whether a model still has children.\n * - So this one read fails closed where a display read degrades. `deleteModel` calls it before\n * the cascade starts, so nothing is deleted when it throws.\n * - `unreadable` lists what could not be parsed. `modelUUID` is `null` when that field is itself\n * part of what failed — an object that cannot name its model is counted against every model,\n * because the alternative is deleting the model it turns out to belong to.\n */\nexport class SemanticLayerUnreadableChildrenError extends Error {\n readonly modelUUID: string;\n readonly unreadable: SemanticUnreadableObjectRef[];\n\n constructor({\n modelUUID,\n unreadable,\n }: {\n modelUUID: string;\n unreadable: SemanticUnreadableObjectRef[];\n }) {\n super(\n `${unreadable.length} child object(s) of the model could not be read, so what it holds ` +\n `is unknown and nothing was deleted.`,\n );\n this.name = 'SemanticLayerUnreadableChildrenError';\n this.modelUUID = modelUUID;\n this.unreadable = unreadable;\n }\n}\n\nexport const SEMANTIC_OBJECT_TYPE = {\n MODEL: 'semantic-model',\n DATASET: 'semantic-dataset',\n METRIC: 'semantic-metric',\n RELATIONSHIP: 'semantic-relationship',\n GLOSSARY: 'semantic-glossary',\n CONSTRAINT: 'semantic-constraint',\n} as const satisfies Record<string, SemanticObjectType>;\n\n/**\n * `readonly` because this drives `createModelTree`, `listModelChildren` and `deleteModel` —\n * a consumer-side `.push()` would silently change what a cascade delete touches.\n */\nexport const MODEL_CHILD_OBJECT_TYPES: readonly SemanticChildObjectType[] = [\n SEMANTIC_OBJECT_TYPE.DATASET,\n SEMANTIC_OBJECT_TYPE.METRIC,\n SEMANTIC_OBJECT_TYPE.RELATIONSHIP,\n SEMANTIC_OBJECT_TYPE.GLOSSARY,\n SEMANTIC_OBJECT_TYPE.CONSTRAINT,\n] as const;\n\nconst DEFAULT_BRANCH = 'main';\n\n// The metastore has no bulk endpoint; large semantic-layer inits are written as\n// concurrent single POSTs (the same approach the ai-kit sl-toolkit importer uses).\nconst WRITE_CONCURRENCY = 5;\n\n/**\n * The live metastore envelope.\n *\n * - `attributes` carries the object's data payload directly, the UUID is the top-level `id`, and\n * revision/branch/audit fields live in `meta`.\n * - The legacy wrapper types in clients/metastore/repository/types.ts do not match this shape.\n * - Reads parse into it (`./readSchemas`); this type is what a **write** asserts, where the\n * metastore is echoing back the object it has just validated and stored.\n */\ntype RawSemanticObject<TData> = {\n type: string;\n id: string;\n attributes: TData;\n meta: SemanticObjectMeta;\n};\n\nconst mapObject = <TData>(item: RawSemanticObject<TData>): SemanticObject<TData> => ({\n uuid: item.id,\n data: item.attributes,\n meta: item.meta,\n});\n\n/**\n * The UUID of an envelope that failed to parse, read off the raw value.\n *\n * There is no parse result to read it from. `null` — no `id`, not a string, or not an object at\n * all — means the object is unaddressable: nothing can fetch, fix or delete it by UUID.\n */\nconst envelopeId = (value: unknown): string | null => {\n if (typeof value !== 'object' || value === null) return null;\n const { id } = value as { id?: unknown };\n return typeof id === 'string' && id !== '' ? id : null;\n};\n\n/**\n * The model a *dropped* envelope claims, read off the raw value.\n *\n * `listObjects` scopes a collection by the parsed `data.modelUUID`, which an object that failed\n * to parse has none of. `null` — the field is missing, not a string, or the envelope is not an\n * object — means \"cannot be attributed\", and every caller here treats that as \"could be this\n * model's\".\n */\nconst envelopeModelUUID = (value: unknown): string | null => {\n if (typeof value !== 'object' || value === null) return null;\n const { attributes } = value as { attributes?: unknown };\n if (typeof attributes !== 'object' || attributes === null) return null;\n const { modelUUID } = attributes as { modelUUID?: unknown };\n return typeof modelUUID === 'string' && modelUUID !== '' ? modelUUID : null;\n};\n\nconst deriveOptionalObjectName = (data: Record<string, unknown>): string | undefined => {\n if (typeof data.name === 'string') return data.name;\n if (typeof data.term === 'string') return data.term;\n return undefined;\n};\n\nconst deriveObjectName = (data: Record<string, unknown>) =>\n deriveOptionalObjectName(data) ?? generateUUID();\n\n/**\n * The label a UI shows for an object, as opposed to the identifier it is addressed by.\n *\n * Constraints carry an optional `displayName`; kbc-ui's constraint tables already render\n * `displayName ?? name`, so a confirmation listing what a cascade delete would destroy has to\n * agree with them or it names objects the user can't find on screen.\n *\n * Deliberately **not** used for lookup: `displayName` is optional and not unique, so matching on\n * it would make `findObjectsByName` ambiguous for callers that resolve a write target by name.\n */\nconst deriveObjectLabel = (data: Record<string, unknown>): string | undefined => {\n if (typeof data.displayName === 'string' && data.displayName !== '') return data.displayName;\n return deriveOptionalObjectName(data);\n};\n\ntype Options = {\n metastoreClient: MetastoreClient;\n};\n\nexport const createSemanticLayerSdk = ({ metastoreClient }: Options) => {\n /**\n * Every object of one type, parsed rather than asserted.\n *\n * - Each element is validated against the shape `./types` declares for it, so a caller that\n * reads a field the type marks required gets a string and not a `TypeError` in render.\n * - An element that does not match is dropped and the reason logged — the metastore validates\n * these on write, so one that fails here is genuinely broken, and a half-formed object is\n * worse to hand a caller than no object.\n * - A drop never takes the collection with it: a model with one malformed metric still lists\n * the other nine.\n * - A response that is not a collection at all is a different failure and throws, because\n * reading it as an empty list would render \"this project has no metrics\".\n */\n const _listObjects = async <TData>(\n objectType: SemanticObjectType,\n dataSchema: z.ZodType<TData, unknown>,\n signal?: AbortSignal,\n ): Promise<{ objects: SemanticObject<TData>[]; unreadable: SemanticUnreadableObjectRef[] }> => {\n const response = await metastoreClient.repository.getMetaObjects({ objectType }, signal);\n const items = parseOrThrow(z.array(z.unknown()), response.data);\n const schema = semanticObjectReadSchema(dataSchema);\n\n const objects: SemanticObject<TData>[] = [];\n const unreadable: SemanticUnreadableObjectRef[] = [];\n\n for (const item of items) {\n const result = schema.safeParse(item);\n if (result.success) {\n objects.push(result.data);\n continue;\n }\n\n unreadable.push({\n objectType,\n objectUUID: envelopeId(item),\n modelUUID: envelopeModelUUID(item),\n });\n\n // The object type, the UUID and the failing field, never the payload: a model's\n // vocabulary and its SQL are the customer's and do not belong in a console.\n console.warn(\n `semanticLayerSdk: dropped ${objectType} \"${envelopeId(item) ?? '<no id>'}\" from the ` +\n `metastore response, it does not match its declared shape`,\n formatValidationIssues(result.error.issues),\n );\n }\n\n return { objects, unreadable };\n };\n\n const listModels = async (signal?: AbortSignal) =>\n (await _listObjects(SEMANTIC_OBJECT_TYPE.MODEL, semanticModelReadSchema, signal)).objects;\n\n const createModel = async (data: SemanticModelData, meta: CreateSemanticObjectMeta = {}) => {\n const response = await metastoreClient.repository.createMetaObject<SemanticModelData>({\n objectType: SEMANTIC_OBJECT_TYPE.MODEL,\n data,\n branch: DEFAULT_BRANCH,\n ...meta,\n // Derived name wins over meta so the metastore name stays in sync with the payload.\n name: data.name,\n });\n\n return mapObject(response.data as unknown as RawSemanticObject<SemanticModelData>);\n };\n\n const updateModel = async (\n modelUUID: string,\n data: Partial<SemanticModelData>,\n meta: UpdateSemanticObjectMeta = {},\n ) => {\n const response = await metastoreClient.repository.updateMetaObject<SemanticModelData>({\n objectType: SEMANTIC_OBJECT_TYPE.MODEL,\n UUID: modelUUID,\n data,\n ...meta,\n // Derived rename wins over meta so the metastore name stays in sync with the payload.\n ...(data.name ? { name: data.name } : {}),\n });\n\n return mapObject(response.data as unknown as RawSemanticObject<SemanticModelData>);\n };\n\n /**\n * One child collection, scoped to a model, with what the scoping could not account for.\n *\n * - An object that parsed is this model's when its `modelUUID` matches.\n * - An object that did not parse is this model's when the raw envelope says so — and also when\n * the envelope cannot say, since a dropped object that names no model could be anyone's.\n */\n const _listChildObjects = async <T extends SemanticChildObjectType>(\n objectType: T,\n modelUUID: string,\n signal?: AbortSignal,\n ) => {\n const { objects, unreadable } = await _listObjects(\n objectType,\n SEMANTIC_CHILD_OBJECT_READ_SCHEMAS[objectType],\n signal,\n );\n\n return {\n objects: objects.filter((object) => object.data.modelUUID === modelUUID),\n unreadable: unreadable.filter((ref) => ref.modelUUID === null || ref.modelUUID === modelUUID),\n };\n };\n\n const listObjects = async <T extends SemanticChildObjectType>(\n objectType: T,\n modelUUID: string,\n signal?: AbortSignal,\n ) => (await _listChildObjects(objectType, modelUUID, signal)).objects;\n\n /**\n * Find a model's child objects by their user-facing name.\n *\n * Returns every match rather than resolving to one, because a name is not unique: the caller\n * decides whether that's an error (an agent needs an unambiguous target) or a choice to offer\n * (a UI can render a picker). Glossary entries key on `term`, so both are matched.\n */\n const findObjectsByName = async <T extends SemanticChildObjectType>(\n objectType: T,\n name: string,\n modelUUID: string,\n signal?: AbortSignal,\n ) => {\n const objects = await listObjects(objectType, modelUUID, signal);\n return objects.filter((object) => deriveOptionalObjectName(object.data) === name);\n };\n\n const createObject = async <T extends SemanticChildObjectType>(\n objectType: T,\n data: SemanticChildObjectDataMap[T],\n meta: CreateSemanticObjectMeta = {},\n ) => {\n const response = await metastoreClient.repository.createMetaObject<\n SemanticChildObjectDataMap[T]\n >({\n objectType,\n data,\n branch: DEFAULT_BRANCH,\n ...meta,\n // Derived name wins over meta so the metastore name stays in sync with the payload.\n name: deriveObjectName(data),\n });\n\n return mapObject(response.data as unknown as RawSemanticObject<SemanticChildObjectDataMap[T]>);\n };\n\n const createObjects = async <T extends SemanticChildObjectType>(\n objectType: T,\n items: SemanticChildObjectDataMap[T][],\n meta: CreateSemanticObjectMeta = {},\n ) =>\n concurrent({\n items,\n process: async (data) => createObject(objectType, data, meta),\n concurrency: WRITE_CONCURRENCY,\n });\n\n // Create a model and all its child objects in one call: the model first (so its\n // UUID exists), then every child concurrently with the modelUUID injected.\n const createModelTree = async (\n model: SemanticModelData,\n children: Partial<{\n [T in SemanticChildObjectType]: Omit<SemanticChildObjectDataMap[T], 'modelUUID'>[];\n }>,\n meta: CreateSemanticObjectMeta = {},\n ) => {\n const createdModel = await createModel(model, meta);\n\n const items = MODEL_CHILD_OBJECT_TYPES.flatMap((objectType) =>\n (children[objectType] ?? []).map((data) => ({\n objectType,\n data: {\n ...data,\n modelUUID: createdModel.uuid,\n } satisfies SemanticChildObjectDataMap[typeof objectType],\n })),\n );\n\n const createdChildren = await concurrent({\n items,\n process: async ({ objectType, data }) => createObject(objectType, data, meta),\n concurrency: WRITE_CONCURRENCY,\n });\n\n return { model: createdModel, children: createdChildren };\n };\n\n const updateObject = async <T extends SemanticChildObjectType>(\n objectType: T,\n objectUUID: string,\n data: Partial<SemanticChildObjectDataMap[T]>,\n meta: UpdateSemanticObjectMeta = {},\n ) => {\n const name = deriveOptionalObjectName(data);\n const response = await metastoreClient.repository.updateMetaObject<\n SemanticChildObjectDataMap[T]\n >({\n objectType,\n UUID: objectUUID,\n data,\n ...meta,\n // Derived rename wins over meta so the metastore name stays in sync with the payload.\n ...(name ? { name } : {}),\n });\n\n return mapObject(response.data as unknown as RawSemanticObject<SemanticChildObjectDataMap[T]>);\n };\n\n const deleteObject = async (objectType: SemanticChildObjectType, objectUUID: string) => {\n await metastoreClient.repository.deleteMetaObject({\n objectType,\n UUID: objectUUID,\n });\n };\n\n /**\n * Every child object of a model, across all five types, flattened.\n *\n * `deleteModel` uses this to find what to remove; callers can use it to say what a delete\n * would destroy *before* asking the user to confirm. Each entry's `name` is the object's\n * display label (a constraint's `displayName` in preference to its `name`, matching what the\n * SL tables render), so a confirmation lists objects as the user sees them on screen.\n *\n * Costs five list requests: the metastore has no per-model filter, so the collections are\n * fetched whole and filtered client-side.\n *\n * **Throws `SemanticLayerUnreadableChildrenError` rather than degrading.** The list reads\n * degrade — one malformed metric does not hide the other nine — but this answer is what\n * `deleteModel` and every \"what would this destroy?\" confirmation is built on, and a short\n * list there deletes the object it left out. An unreadable child is counted against the model\n * whenever the raw envelope names it, and against every model when it cannot.\n */\n const listModelChildren = async (\n modelUUID: string,\n signal?: AbortSignal,\n ): Promise<SemanticModelChildRef[]> => {\n const perType = await Promise.all(\n MODEL_CHILD_OBJECT_TYPES.map(async (objectType) => {\n const { objects, unreadable } = await _listChildObjects(objectType, modelUUID, signal);\n return {\n children: objects.map((object) => ({\n objectType,\n objectUUID: object.uuid,\n name: deriveObjectLabel(object.data),\n })),\n unreadable,\n };\n }),\n );\n\n const unreadable = perType.flatMap((result) => result.unreadable);\n if (unreadable.length > 0) {\n throw new SemanticLayerUnreadableChildrenError({ modelUUID, unreadable });\n }\n\n return perType.flatMap((result) => result.children);\n };\n\n /**\n * Cascade delete: every child object first, the model itself only once its whole tree is\n * gone. Child deletes all settle — a failing child never aborts the others, so no delete\n * runs on detached after this rejects — and a partial failure surfaces as\n * `SemanticLayerCascadeDeleteError`, which says exactly which children were deleted and\n * which survived. The model is kept on any child failure so it never orphans children.\n *\n * The same holds for a child that could not be *read*: `listModelChildren` throws before the\n * cascade starts, so an object the read boundary dropped keeps the model alive rather than\n * being silently left behind pointing at a model that no longer exists.\n */\n const deleteModel = async (modelUUID: string) => {\n const children = await listModelChildren(modelUUID);\n\n const outcomes = await concurrent({\n items: children,\n process: async (child) => {\n try {\n await deleteObject(child.objectType, child.objectUUID);\n return { ok: true as const, child };\n } catch (error) {\n return { ok: false as const, child, error };\n }\n },\n concurrency: WRITE_CONCURRENCY,\n });\n\n const deletedChildren: SemanticModelChildRef[] = [];\n const failedChildren: SemanticModelChildDeleteFailure[] = [];\n for (const outcome of outcomes) {\n if (outcome.ok) deletedChildren.push(outcome.child);\n else failedChildren.push({ ...outcome.child, error: outcome.error });\n }\n\n if (failedChildren.length > 0) {\n throw new SemanticLayerCascadeDeleteError({ modelUUID, deletedChildren, failedChildren });\n }\n\n await metastoreClient.repository.deleteMetaObject({\n objectType: SEMANTIC_OBJECT_TYPE.MODEL,\n UUID: modelUUID,\n });\n };\n\n /**\n * Replace the sibling projects granted GET/consumption access to a `targeted`-scope object.\n *\n * Passing an empty array clears every grant, leaving the object visible to its owning project\n * only. A grant conveys read access alone — the target projects can consume the definition but\n * never edit it, which is enforced metastore-side rather than here.\n */\n const replaceTargetProjects = async (\n objectType: SemanticObjectType,\n objectUUID: string,\n targetProjectIds: number[],\n ) => {\n await metastoreClient.repository.replaceTargetProjects({\n objectType,\n UUID: objectUUID,\n targetProjectIds,\n });\n };\n\n /**\n * Step a project-scoped object up to the organization scope, in place.\n *\n * The object keeps its UUID and revision history; the step-up writes a new revision whose\n * `project_id` is null. Requires the caller to hold the organization-admin role for the target\n * organization — a project-admin gets 403 from the metastore, which callers should surface\n * rather than pre-empt (the same person is often both).\n */\n const promoteToOrganizationScope = async (objectType: SemanticObjectType, objectUUID: string) => {\n // Scope ONLY. No `data`, not even `{}`: the metastore's step-up guard rejects a PATCH that\n // also carries name or data, and `Data *JSONData` treats `{}` as present — which 400s with\n // \"A scope change cannot be combined with name or data changes\".\n const response = await metastoreClient.repository.updateMetaObject({\n objectType,\n UUID: objectUUID,\n scope: 'organization',\n });\n\n return mapObject(response.data as unknown as RawSemanticObject<Record<string, unknown>>);\n };\n\n return {\n // models\n listModels,\n createModel,\n updateModel,\n deleteModel,\n listModelChildren,\n\n // child objects (datasets, metrics, relationships, glossary, constraints)\n listObjects,\n findObjectsByName,\n createObject,\n createObjects,\n createModelTree,\n updateObject,\n deleteObject,\n\n // scoping / sharing\n replaceTargetProjects,\n promoteToOrganizationScope,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAWA,MAAa,yBAAyB,SAAsC;CAC1E,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM,OAAO,KAAA;CACtD,MAAM,SAAU,KAA8B;CAC9C,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO,KAAA;CACnC,MAAM,QAAQ,OAAO;CACrB,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO,KAAA;CACxD,MAAM,UAAW,MAAgC;CACjD,OAAO,OAAO,YAAY,YAAY,UAAU,UAAU,KAAA;AAC5D;;;;;;;;;;;;;;;;;;;;;;ACCA,MAAa,eAAe,CAAC,aAAa,UAAU;;AAGpD,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;AAQA,MAAa,cAAc;CAAC;CAAO;CAAa;CAAW;AAAW;;;;;;AAOtE,MAAa,wBAAwB;CAAC;CAAS;CAAW;AAAM;;;;;;AAOhE,MAAa,oBAAoB;CAAC;CAAU;CAAgB;CAAY;AAAc;;AAGtF,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,0BAA0B,CAAC,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;AChDvD,MAAa,sBAAsBA,IAAAA,EAAE,YAAY;CAC/C,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,aAAaA,IAAAA,EAAE,KAAK,YAAY;AAClC,CAAC;AAED,MAAa,wBAAwBA,IAAAA,EAAE,YAAY;CACjD,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,SAASA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACzB,KAAKA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAa,uBAAuBA,IAAAA,EAAE,YAAY;CAChD,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,KAAKA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAa,6BAA6BA,IAAAA,EAAE,YAAY;CACtD,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,IAAIA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACpB,IAAIA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,MAAa,yBAAyBA,IAAAA,EAAE,YAAY;CAClD,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,YAAYA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED,MAAa,2BAA2BA,IAAAA,EAAE,YAAY;CACpD,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,gBAAgBA,IAAAA,EAAE,KAAK,gBAAgB;CACvC,SAASA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC;CAC3B,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AACxB,CAAC;;AAGD,MAAa,gCAAgC;CAC3C,oBAAoB;CACpB,mBAAmB;CACnB,yBAAyB;CACzB,qBAAqB;CACrB,uBAAuB;AACzB;;;;;;;;;;;;;;;;;;;;ACjBA,MAAM,mBAA2DC,IAAAA,EAAE,YAAY;CAC7E,UAAUA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACvC,UAAUA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACvC,cAAcA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CAC3C,OAAOA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACpC,UAAUA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;AACzC,CAAC;AAED,MAAM,cAAqDA,IAAAA,EAAE,YAAY;CACvE,MAAMA,IAAAA,EAAE,OAAO;CACf,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,MAAMA,IAAAA,EAAE,KAAK,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CACpD,QAAQA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACrC,IAAI,iBAAiB,SAAS;AAChC,CAAC;;;;;;;;AASD,MAAM,sBAAsBA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,UAC1D,MAAM,SAAS,SAAS,UAAU;CAChC,MAAM,SAAS,YAAY,UAAU,OAAO;CAC5C,IAAI,OAAO,SAAS,OAAO,CAAC,OAAO,IAAI;CAEvC,QAAQ,KACN,oCAAoC,MAAM,iEAE1CC,wBAAAA,uBAAuB,OAAO,MAAM,MAAM,CAC5C;CACA,OAAO,CAAC;AACV,CAAC,CACH;AAEA,MAAM,uBAAmED,IAAAA,EAAE,YAAY;CACrF,UAAUA,IAAAA,EAAE,KAAK,cAAc,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAC3D,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,OAAOA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,QAAQA,IAAAA,EACL,YAAY;EACX,KAAKA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACzB,KAAKA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,CAAC,CAAC,CACD,SAAS;AACd,CAAC;AAED,MAAM,wBAAqEA,IAAAA,EAAE,YAAY;CACvF,SAASA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC7B,WAAWA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,UAAUA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AAChC,CAAC;AAED,MAAa,0BAAiEA,IAAAA,EAAE,YAAY;CAC1F,MAAMA,IAAAA,EAAE,OAAO;CACf,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,aAAaA,IAAAA,EAAE,OAAO;AACxB,CAAC;;AA2DD,MAAa,qCAET;CACF,oBA5DyEA,IAAAA,EAAE,YAAY;EACvF,WAAWA,IAAAA,EAAE,OAAO;EACpB,MAAMA,IAAAA,EAAE,OAAO;EACf,SAASA,IAAAA,EAAE,OAAO;EAClB,KAAKA,IAAAA,EAAE,OAAO;EACd,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACjC,OAAOA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EAC3B,YAAYA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;EACzC,QAAQ,oBAAoB,SAAS;EACrC,IAAI,iBAAiB,SAAS;CAChC,CAkDsB;CACpB,mBAjDuEA,IAAAA,EAAE,YAAY;EACrF,WAAWA,IAAAA,EAAE,OAAO;EACpB,MAAMA,IAAAA,EAAE,OAAO;EACf,KAAKA,IAAAA,EAAE,OAAO;EACd,SAASA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EAC7B,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACnC,CA2CqB;CACnB,yBA1CmFA,IAAAA,EAAE,YAAY;EACjG,WAAWA,IAAAA,EAAE,OAAO;EACpB,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EAC1B,MAAMA,IAAAA,EAAE,OAAO;EACf,IAAIA,IAAAA,EAAE,OAAO;EACb,IAAIA,IAAAA,EAAE,OAAO;EACb,MAAMA,IAAAA,EAAE,KAAK,uBAAuB,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;CAClE,CAmC2B;CACzB,qBAlC2EA,IAAAA,EAAE,YAAY;EACzF,WAAWA,IAAAA,EAAE,OAAO;EACpB,MAAMA,IAAAA,EAAE,OAAO;EACf,YAAYA,IAAAA,EAAE,OAAO;EACrB,SAASA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACxC,CA6BuB;CACrB,uBA5B+EA,IAAAA,EAAE,YAAY;EAC7F,WAAWA,IAAAA,EAAE,OAAO;EACpB,MAAMA,IAAAA,EAAE,OAAO;EACf,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACjC,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACjC,gBAAgBA,IAAAA,EAAE,KAAK,gBAAgB;EACvC,SAASA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC;EAC3B,UAAUA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;EACvC,MAAMA,IAAAA,EAAE,OAAO;EACf,gBAAgB,qBAAqB,SAAS;EAC9C,iBAAiB,sBAAsB,SAAS;EAChD,UAAUA,IAAAA,EAAE,KAAK,qBAAqB,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;EAClE,cAAcA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EAClC,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EACjC,UAAUA,IAAAA,EAAE,QAAQ,CAAC,CAAC,SAAS;EAC/B,OAAOA,IAAAA,EAAE,KAAK,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAA,CAAS;EAC3D,OAAOA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;EAC3B,MAAMA,IAAAA,EAAE,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACrC,CAUyB;AACzB;AAEA,MAAM,2BAAmEA,IAAAA,EAAE,YAAY;CACrF,MAAMA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,QAAQA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC5B,WAAWA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,gBAAgBA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACpC,UAAUA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,eAAeA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACnC,WAAWA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CAC/B,aAAaA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,mBAAmBA,IAAAA,EAAE,OAAO,CAAC,CAAC,SAAS;AACzC,CAAC;;;;;;;;;AAUD,MAAa,4BAAmC,eAC9CA,IAAAA,EACG,OAAO;CACN,IAAIA,IAAAA,EAAE,OAAO;CACb,YAAY;CACZ,MAAM,yBAAyB,QAAQ;AACzC,CAAC,CAAC,CACD,WAAW,EAAE,IAAI,YAAY,YAAY;CAAE,MAAM;CAAI,MAAM;CAAY,MAAM,QAAQ,CAAC;AAAE,EAAE;;;;;;;;;;AC1K/F,IAAa,kCAAb,cAAqD,eAAe;CAClE;CACA;CACA;CAEA,YAAY,EACV,WACA,iBACA,kBAKC;EACD,MAAM,QAAQ,gBAAgB,SAAS,eAAe;EACtD,MACE,eAAe,KAAK,YAAY,QAAQ,KAAK,GAC7C,8BAA8B,eAAe,OAAO,UAAU,MAAM,uCACzC,gBAAgB,OAAO,WACpD;EACA,KAAK,OAAO;EACZ,KAAK,YAAY;EACjB,KAAK,kBAAkB;EACvB,KAAK,iBAAiB;CACxB;AACF;;;;;;;;;;;;AAaA,IAAa,uCAAb,cAA0D,MAAM;CAC9D;CACA;CAEA,YAAY,EACV,WACA,cAIC;EACD,MACE,GAAG,WAAW,OAAO,sGAEvB;EACA,KAAK,OAAO;EACZ,KAAK,YAAY;EACjB,KAAK,aAAa;CACpB;AACF;AAEA,MAAa,uBAAuB;CAClC,OAAO;CACP,SAAS;CACT,QAAQ;CACR,cAAc;CACd,UAAU;CACV,YAAY;AACd;;;;;AAMA,MAAa,2BAA+D;CAC1E,qBAAqB;CACrB,qBAAqB;CACrB,qBAAqB;CACrB,qBAAqB;CACrB,qBAAqB;AACvB;AAEA,MAAM,iBAAiB;AAIvB,MAAM,oBAAoB;AAkB1B,MAAM,aAAoB,UAA2D;CACnF,MAAM,KAAK;CACX,MAAM,KAAK;CACX,MAAM,KAAK;AACb;;;;;;;AAQA,MAAM,cAAc,UAAkC;CACpD,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,EAAE,OAAO;CACf,OAAO,OAAO,OAAO,YAAY,OAAO,KAAK,KAAK;AACpD;;;;;;;;;AAUA,MAAM,qBAAqB,UAAkC;CAC3D,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM,OAAO;CACxD,MAAM,EAAE,eAAe;CACvB,IAAI,OAAO,eAAe,YAAY,eAAe,MAAM,OAAO;CAClE,MAAM,EAAE,cAAc;CACtB,OAAO,OAAO,cAAc,YAAY,cAAc,KAAK,YAAY;AACzE;AAEA,MAAM,4BAA4B,SAAsD;CACtF,IAAI,OAAO,KAAK,SAAS,UAAU,OAAO,KAAK;CAC/C,IAAI,OAAO,KAAK,SAAS,UAAU,OAAO,KAAK;AAEjD;AAEA,MAAM,oBAAoB,SACxB,yBAAyB,IAAI,KAAKE,qBAAAA,aAAa;;;;;;;;;;;AAYjD,MAAM,qBAAqB,SAAsD;CAC/E,IAAI,OAAO,KAAK,gBAAgB,YAAY,KAAK,gBAAgB,IAAI,OAAO,KAAK;CACjF,OAAO,yBAAyB,IAAI;AACtC;AAMA,MAAa,0BAA0B,EAAE,sBAA+B;;;;;;;;;;;;;;CActE,MAAM,eAAe,OACnB,YACA,YACA,WAC6F;EAC7F,MAAM,WAAW,MAAM,gBAAgB,WAAW,eAAe,EAAE,WAAW,GAAG,MAAM;EACvF,MAAM,QAAQC,wBAAAA,aAAaC,IAAAA,EAAE,MAAMA,IAAAA,EAAE,QAAQ,CAAC,GAAG,SAAS,IAAI;EAC9D,MAAM,SAAS,yBAAyB,UAAU;EAElD,MAAM,UAAmC,CAAC;EAC1C,MAAM,aAA4C,CAAC;EAEnD,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,OAAO,UAAU,IAAI;GACpC,IAAI,OAAO,SAAS;IAClB,QAAQ,KAAK,OAAO,IAAI;IACxB;GACF;GAEA,WAAW,KAAK;IACd;IACA,YAAY,WAAW,IAAI;IAC3B,WAAW,kBAAkB,IAAI;GACnC,CAAC;GAID,QAAQ,KACN,6BAA6B,WAAW,IAAI,WAAW,IAAI,KAAK,UAAU,sEAE1EC,wBAAAA,uBAAuB,OAAO,MAAM,MAAM,CAC5C;EACF;EAEA,OAAO;GAAE;GAAS;EAAW;CAC/B;CAEA,MAAM,aAAa,OAAO,YACvB,MAAM,aAAa,qBAAqB,OAAO,yBAAyB,MAAM,EAAA,CAAG;CAEpF,MAAM,cAAc,OAAO,MAAyB,OAAiC,CAAC,MAAM;EAC1F,MAAM,WAAW,MAAM,gBAAgB,WAAW,iBAAoC;GACpF,YAAY,qBAAqB;GACjC;GACA,QAAQ;GACR,GAAG;GAEH,MAAM,KAAK;EACb,CAAC;EAED,OAAO,UAAU,SAAS,IAAuD;CACnF;CAEA,MAAM,cAAc,OAClB,WACA,MACA,OAAiC,CAAC,MAC/B;EACH,MAAM,WAAW,MAAM,gBAAgB,WAAW,iBAAoC;GACpF,YAAY,qBAAqB;GACjC,MAAM;GACN;GACA,GAAG;GAEH,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;EACzC,CAAC;EAED,OAAO,UAAU,SAAS,IAAuD;CACnF;;;;;;;;CASA,MAAM,oBAAoB,OACxB,YACA,WACA,WACG;EACH,MAAM,EAAE,SAAS,eAAe,MAAM,aACpC,YACA,mCAAmC,aACnC,MACF;EAEA,OAAO;GACL,SAAS,QAAQ,QAAQ,WAAW,OAAO,KAAK,cAAc,SAAS;GACvE,YAAY,WAAW,QAAQ,QAAQ,IAAI,cAAc,QAAQ,IAAI,cAAc,SAAS;EAC9F;CACF;CAEA,MAAM,cAAc,OAClB,YACA,WACA,YACI,MAAM,kBAAkB,YAAY,WAAW,MAAM,EAAA,CAAG;;;;;;;;CAS9D,MAAM,oBAAoB,OACxB,YACA,MACA,WACA,WACG;EAEH,QAAO,MADe,YAAY,YAAY,WAAW,MAAM,EAAA,CAChD,QAAQ,WAAW,yBAAyB,OAAO,IAAI,MAAM,IAAI;CAClF;CAEA,MAAM,eAAe,OACnB,YACA,MACA,OAAiC,CAAC,MAC/B;EACH,MAAM,WAAW,MAAM,gBAAgB,WAAW,iBAEhD;GACA;GACA;GACA,QAAQ;GACR,GAAG;GAEH,MAAM,iBAAiB,IAAI;EAC7B,CAAC;EAED,OAAO,UAAU,SAAS,IAAmE;CAC/F;CAEA,MAAM,gBAAgB,OACpB,YACA,OACA,OAAiC,CAAC,MAElCC,mBAAAA,WAAW;EACT;EACA,SAAS,OAAO,SAAS,aAAa,YAAY,MAAM,IAAI;EAC5D,aAAa;CACf,CAAC;CAIH,MAAM,kBAAkB,OACtB,OACA,UAGA,OAAiC,CAAC,MAC/B;EACH,MAAM,eAAe,MAAM,YAAY,OAAO,IAAI;EAElD,MAAM,QAAQ,yBAAyB,SAAS,gBAC7C,SAAS,eAAe,CAAC,EAAA,CAAG,KAAK,UAAU;GAC1C;GACA,MAAM;IACJ,GAAG;IACH,WAAW,aAAa;GAC1B;EACF,EAAE,CACJ;EAQA,OAAO;GAAE,OAAO;GAAc,UAAU,MANVA,mBAAAA,WAAW;IACvC;IACA,SAAS,OAAO,EAAE,YAAY,WAAW,aAAa,YAAY,MAAM,IAAI;IAC5E,aAAa;GACf,CAAC;EAEuD;CAC1D;CAEA,MAAM,eAAe,OACnB,YACA,YACA,MACA,OAAiC,CAAC,MAC/B;EACH,MAAM,OAAO,yBAAyB,IAAI;EAC1C,MAAM,WAAW,MAAM,gBAAgB,WAAW,iBAEhD;GACA;GACA,MAAM;GACN;GACA,GAAG;GAEH,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;EACzB,CAAC;EAED,OAAO,UAAU,SAAS,IAAmE;CAC/F;CAEA,MAAM,eAAe,OAAO,YAAqC,eAAuB;EACtF,MAAM,gBAAgB,WAAW,iBAAiB;GAChD;GACA,MAAM;EACR,CAAC;CACH;;;;;;;;;;;;;;;;;;CAmBA,MAAM,oBAAoB,OACxB,WACA,WACqC;EACrC,MAAM,UAAU,MAAM,QAAQ,IAC5B,yBAAyB,IAAI,OAAO,eAAe;GACjD,MAAM,EAAE,SAAS,eAAe,MAAM,kBAAkB,YAAY,WAAW,MAAM;GACrF,OAAO;IACL,UAAU,QAAQ,KAAK,YAAY;KACjC;KACA,YAAY,OAAO;KACnB,MAAM,kBAAkB,OAAO,IAAI;IACrC,EAAE;IACF;GACF;EACF,CAAC,CACH;EAEA,MAAM,aAAa,QAAQ,SAAS,WAAW,OAAO,UAAU;EAChE,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,qCAAqC;GAAE;GAAW;EAAW,CAAC;EAG1E,OAAO,QAAQ,SAAS,WAAW,OAAO,QAAQ;CACpD;;;;;;;;;;;;CAaA,MAAM,cAAc,OAAO,cAAsB;EAC/C,MAAM,WAAW,MAAM,kBAAkB,SAAS;EAElD,MAAM,WAAW,MAAMA,mBAAAA,WAAW;GAChC,OAAO;GACP,SAAS,OAAO,UAAU;IACxB,IAAI;KACF,MAAM,aAAa,MAAM,YAAY,MAAM,UAAU;KACrD,OAAO;MAAE,IAAI;MAAe;KAAM;IACpC,SAAS,OAAO;KACd,OAAO;MAAE,IAAI;MAAgB;MAAO;KAAM;IAC5C;GACF;GACA,aAAa;EACf,CAAC;EAED,MAAM,kBAA2C,CAAC;EAClD,MAAM,iBAAoD,CAAC;EAC3D,KAAK,MAAM,WAAW,UACpB,IAAI,QAAQ,IAAI,gBAAgB,KAAK,QAAQ,KAAK;OAC7C,eAAe,KAAK;GAAE,GAAG,QAAQ;GAAO,OAAO,QAAQ;EAAM,CAAC;EAGrE,IAAI,eAAe,SAAS,GAC1B,MAAM,IAAI,gCAAgC;GAAE;GAAW;GAAiB;EAAe,CAAC;EAG1F,MAAM,gBAAgB,WAAW,iBAAiB;GAChD,YAAY,qBAAqB;GACjC,MAAM;EACR,CAAC;CACH;;;;;;;;CASA,MAAM,wBAAwB,OAC5B,YACA,YACA,qBACG;EACH,MAAM,gBAAgB,WAAW,sBAAsB;GACrD;GACA,MAAM;GACN;EACF,CAAC;CACH;;;;;;;;;CAUA,MAAM,6BAA6B,OAAO,YAAgC,eAAuB;EAI/F,MAAM,WAAW,MAAM,gBAAgB,WAAW,iBAAiB;GACjE;GACA,MAAM;GACN,OAAO;EACT,CAAC;EAED,OAAO,UAAU,SAAS,IAA6D;CACzF;CAEA,OAAO;EAEL;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;CACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage-BKm7cztt.cjs","names":["concurrent","isApiError","concurrent","HttpHeader","KeboolaHttpHeader","concurrent","poller","jobStatus","KeboolaHttpHeader","concurrent","concurrent","createAuthHeaders","createGenericFetchClient","validateConnectionStatus","createOpenapiFetchClient"],"sources":["../src/utils/async/series.ts","../src/errors/ServiceUnavailableError.ts","../src/clients/storage/mergeRequests/mergeRequests.ts","../src/clients/storage/branches/branches.ts","../src/clients/storage/bucketExternal/bucketExternal.ts","../src/clients/storage/bucketListings/utils.ts","../src/clients/storage/bucketListings/bucketListings.ts","../src/clients/storage/buckets/buckets.ts","../src/clients/storage/bucketSharing/bucketSharing.ts","../src/clients/storage/columns/columns.ts","../src/clients/storage/components/components.ts","../src/clients/storage/configurationMetadata/configurationMetadata.ts","../src/clients/storage/configurationRows/configurationRows.ts","../src/clients/storage/configurations/utils.ts","../src/clients/storage/configurations/configurations.ts","../src/clients/storage/configurationVersions/configurationVersions.ts","../src/clients/storage/configurationWorkspaces/configurationWorkspaces.ts","../src/clients/storage/events/events.ts","../src/clients/storage/files/files.ts","../src/clients/storage/jobs/jobs.ts","../src/clients/storage/poller.ts","../src/clients/storage/refreshTokenMiddleware.ts","../src/clients/storage/search/search.ts","../src/clients/storage/snapshots/snapshots.ts","../src/clients/storage/stats/stats.ts","../src/clients/storage/tables/tables.ts","../src/clients/storage/tokens/tokens.ts","../src/clients/storage/triggers/triggers.ts","../src/clients/storage/workspaces/workspaces.ts","../src/clients/storage/storageClient.ts"],"sourcesContent":["import type { ConcurrentOptions } from './concurrent';\nimport { concurrent } from './concurrent';\n\n/**\n * Executes a callback function on an array of items in series (one at a time).\n * It behaves similarly to Promise.all(), failing on the first rejected promise.\n * The order of the results matches the order of the promises.\n * Resolves with the mapped results, not with the original items.\n */\nexport const series = async <T, R>(\n options: Omit<ConcurrentOptions<T, R>, 'concurrency'>,\n): Promise<R[]> =>\n concurrent({\n ...options,\n concurrency: 1,\n });\n","export class ServiceUnavailableError extends Error {\n constructor(serviceId: string, path: string[], clientName: string) {\n super(\n `Service \"${serviceId}\" is not available in this stack. Caused by: ${clientName}.${path.join('.')}()`,\n );\n this.name = 'ServiceUnavailableError';\n Object.setPrototypeOf(this, ServiceUnavailableError.prototype);\n }\n}\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateMergeRequestBody,\n CreateMergeRequestSchemaBody,\n MergeRequestDetail,\n MergeRequestDetailWithActivityLog,\n UpdateMergeRequestInput,\n UpdateMergeRequestSchemaBody,\n} from './types';\n\n/**\n * Both write bodies are asserted in: the spec declares every field of them required and nullable,\n * while the API defaults the ones a caller omits — and an explicit `null` is not the same request as\n * an absent key. `./types` narrows each body to what a caller really has to send.\n */\nexport const createMergeRequests = (client: StorageOpenApiFetchClient) => {\n const getMergeRequests = async (signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/merge-request', {}, { signal });\n return data;\n };\n\n const getMergeRequest = async (id: number, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/merge-request/{id}',\n { path: { id } },\n { signal },\n );\n // Schema types changeLog as Record<string, never>; cast to the real shape.\n return data as MergeRequestDetail;\n };\n\n const getMergeRequestWithActivityLog = async (id: number, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/merge-request/{id}',\n { path: { id }, query: { include: 'activityLog' } },\n { signal },\n );\n return data as MergeRequestDetailWithActivityLog;\n };\n\n const createMergeRequest = async (body: CreateMergeRequestBody) => {\n const { data } = await client.post('/v2/storage/merge-request', {\n body: body as CreateMergeRequestSchemaBody,\n });\n return data;\n };\n\n const updateMergeRequest = async ({ id, ...body }: UpdateMergeRequestInput) => {\n const { data } = await client.put('/v2/storage/merge-request/{id}', {\n path: { id },\n body: body as UpdateMergeRequestSchemaBody,\n });\n return data;\n };\n\n const requestReview = async (id: number) => {\n const { data } = await client.put('/v2/storage/merge-request/{id}/request-review', {\n path: { id },\n });\n return data;\n };\n\n const approveMergeRequest = async (id: number) => {\n const { data } = await client.put('/v2/storage/merge-request/{id}/approve', {\n path: { id },\n });\n return data;\n };\n\n const requestChangesMergeRequest = async (id: number, reason?: string) => {\n const { data } = await client.put('/v2/storage/merge-request/{id}/request-changes', {\n path: { id },\n body: reason ? { reason } : undefined,\n });\n return data;\n };\n\n /**\n * Merges an approved merge request. The endpoint is async — it returns the created merge job.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/merge-requests/PUT/v2/storage/merge-request/{id}/merge\n */\n const mergeMergeRequest = async (id: number) => {\n const { data } = await client.put('/v2/storage/merge-request/{id}/merge', {\n path: { id },\n });\n return data;\n };\n\n const getMergeRequestConflicts = async (id: number, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/merge-request/{id}/conflicts',\n { path: { id } },\n { signal },\n );\n return data;\n };\n\n return {\n getMergeRequests,\n getMergeRequest,\n getMergeRequestWithActivityLog,\n createMergeRequest,\n updateMergeRequest,\n requestReview,\n approveMergeRequest,\n requestChangesMergeRequest,\n mergeMergeRequest,\n getMergeRequestConflicts,\n };\n};\n","import type { Job } from '../jobs/types';\nimport type { StorageJobPoller, StorageJobPollOptions } from '../poller';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateDevBranchBody,\n CreateDevBranchSchemaBody,\n DeleteDevBranchMetadataPath,\n DevBranch,\n SaveDevBranchMetadataInput,\n UpdateDevBranchInput,\n UpdateDevBranchSchemaBody,\n} from './types';\n\n/**\n * The `/v2/storage/dev-branches` contract is spec-derived; three defects remain.\n *\n * - `creatorToken` is a bare `object`, so `DevBranch` re-types it and the two reads are asserted.\n * - The create and delete answer `JobResponse` — flat, with `status: string` — where `Job<T>` is a\n * discriminated union over `status`, so both jobs are asserted.\n * - Duplicate: the create is also declared on `/dev-branches/` (trailing slash); drop it.\n */\nexport const createBranches = (client: StorageOpenApiFetchClient, poller: StorageJobPoller) => {\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/dev-branches/GET/v2/storage/dev-branches\n */\n const getDevBranches = async (signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/dev-branches', {}, { signal });\n\n return data as DevBranch[];\n };\n\n /**\n * Creates a development branch. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/dev-branches/POST/v2/storage/dev-branches\n */\n const createDevBranchAsync = async (body: CreateDevBranchBody) => {\n const { data } = await client.post('/v2/storage/dev-branches', {\n body: body as CreateDevBranchSchemaBody,\n });\n\n return data as unknown as Job<'devBranchCreate'>;\n };\n\n /**\n * Creates a development branch and waits for the job to finish.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/dev-branches/POST/v2/storage/dev-branches\n */\n const createDevBranchAndWait = async (\n body: CreateDevBranchBody,\n options?: StorageJobPollOptions,\n ) => {\n const job = await createDevBranchAsync(body);\n const p = poller<'devBranchCreate'>(job, options);\n return p.start();\n };\n\n /**\n * Renames a development branch or changes its description.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/dev-branches/PUT/v2/storage/dev-branches/{id}\n */\n const updateDevBranch = async ({ id, name, description }: UpdateDevBranchInput) => {\n const { data } = await client.put('/v2/storage/dev-branches/{id}', {\n path: { id },\n body: { name, description } as UpdateDevBranchSchemaBody,\n });\n\n return data as DevBranch;\n };\n\n /**\n * Deletes a development branch. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/dev-branches/DELETE/v2/storage/dev-branches/{id}\n */\n const deleteDevBranchAsync = async (id: number) => {\n const { data } = await client.delete('/v2/storage/dev-branches/{id}', {\n path: { id },\n });\n\n return data as unknown as Job<'devBranchDelete'>;\n };\n\n /**\n * Deletes a development branch and waits for the job to finish.\n *\n * - Resolves with how the wait ended, so nothing throws: `done` carries the finished\n * `devBranchDelete` job.\n * - A job that ended as `error` is a `done` wait carrying a failed job — it finished. `timedOut`,\n * `exhausted`, `aborted` and `errored` are the endings with no job to read.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/dev-branches/DELETE/v2/storage/dev-branches/{id}\n */\n const deleteDevBranchAndWait = async (id: number, options?: StorageJobPollOptions) => {\n const job = await deleteDevBranchAsync(id);\n\n return poller<'devBranchDelete'>(job, options).start();\n };\n\n /**\n * Returns every metadata record on a branch. The branch is the object here, so `branchId` is the\n * thing being addressed rather than the branch a request is scoped to.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/metadata/GET/v2/storage/branch/{branchId}/metadata\n */\n const getDevBranchMetadata = async (branchId: string, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/metadata',\n { path: { branchId } },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Adds or updates metadata on a branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/metadata/POST/v2/storage/branch/{branchId}/metadata\n */\n const saveDevBranchMetadata = async (\n { branchId, metadata }: SaveDevBranchMetadataInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/metadata',\n { path: { branchId }, body: { metadata } },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Deletes a single metadata entry from a branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/metadata/DELETE/v2/storage/branch/{branchId}/metadata/{metadataId}\n */\n const deleteDevBranchMetadata = async (\n { branchId, metadataId }: DeleteDevBranchMetadataPath,\n signal?: AbortSignal,\n ) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/metadata/{metadataId}',\n { path: { branchId, metadataId } },\n { signal },\n );\n };\n\n return {\n getDevBranches,\n updateDevBranch,\n\n createDevBranchAsync,\n createDevBranchAndWait,\n deleteDevBranchAsync,\n deleteDevBranchAndWait,\n\n getDevBranchMetadata,\n saveDevBranchMetadata,\n deleteDevBranchMetadata,\n };\n};\n","import type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n BucketRegistrationGuideQuery,\n BucketRegistrationGuideSchemaQuery,\n CreateScheduledRefreshInput,\n RefreshExternalBucketInput,\n RegisterBucketBody,\n RegisteredBucketQuery,\n ScheduledTask,\n} from './types';\n\n/**\n * An external bucket wraps a schema that already exists in the project's backend (Snowflake or\n * BigQuery) rather than one Keboola created. Registering it is what makes the rest of this namespace\n * apply: only an external bucket needs its table metadata refreshed, manually or on a cron.\n *\n * Two spec mismatches recur and account for the assertions below:\n * - **jobs** — the spec's `JobResponse` is a flat shape with `status: string`, while `Job<T>` is a\n * discriminated union over `status` carrying typed `results`. Every job return is asserted, whether\n * the operation declares a `JobResponse` or no body at all.\n * - **`async` query** — `registerBucketAsync` is invoked with `async: true` but declares\n * `query: never`.\n *\n * What the Storage spec needs, per operation:\n *\n * - `POST /buckets/register` (`BucketRegisterAction`)\n * - query: `never` → really accepts `async`\n * - response: contentless `default` → really a `bucketRegister` job\n * - `PUT /buckets/{bucketId}/refresh` (`BucketRefreshAction`)\n * - response: 202 `JobResponse` → really a `bucketRefresh` job\n * `GET /buckets/register-guide` and the scheduled-task create are the operations whose spec is\n * already right — their bodies, queries and responses are generated, not asserted.\n */\nexport const createBucketExternal = (client: StorageOpenApiFetchClient) => {\n /**\n * Registers an external bucket. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/POST/v2/storage/buckets/register\n */\n const registerBucketAsync = async (body: RegisterBucketBody, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/buckets/register',\n {\n query: { async: true } as unknown as RegisteredBucketQuery,\n body,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketRegister'>;\n };\n\n /**\n * Returns a markdown guide for registering an external bucket.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/GET/v2/storage/buckets/register-guide\n */\n const getBucketRegistrationGuide = async (\n query: BucketRegistrationGuideQuery,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/buckets/register-guide',\n // `brackets` appends the `[]` the API wants, so `path` stays unbracketed at the call site. The\n // default `indices` would send `path[0]=…&path[1]=…`, which the API rejects with a 400 (\"This\n // value should be of type string\").\n { query: query as unknown as BucketRegistrationGuideSchemaQuery },\n { signal, queryArrayFormat: 'brackets' },\n );\n\n return data;\n };\n\n /**\n * Refreshes an external bucket's table metadata. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/PUT/v2/storage/buckets/{bucketId}/refresh\n */\n const refreshExternalBucketAsync = async (\n { bucketId, ...query }: RefreshExternalBucketInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.put(\n '/v2/storage/buckets/{bucketId}/refresh',\n { path: { bucketId }, query },\n { signal },\n );\n\n return data as unknown as Job<'bucketRefresh'>;\n };\n\n const createScheduledRefresh = async ({\n branchId,\n bucketId,\n ...body\n }: CreateScheduledRefreshInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/scheduled-tasks/refresh',\n { path: { branchId, bucketId }, body },\n );\n\n return data as unknown as ScheduledTask;\n };\n\n // Lives here because scheduled bucket refresh is the only thing that creates a scheduled task\n // today — but neither the endpoint nor the resource is bucket-specific: `DELETE\n // /scheduled-tasks/{taskId}` is top-level, and `ScheduledTask` points at its subject through a\n // polymorphic `relatedEntity` / `relatedId` pair. Move this out the moment a second producer\n // appears; the backend's model already expects one.\n const deleteScheduledTask = async (taskId: string) => {\n await client.delete('/v2/storage/scheduled-tasks/{taskId}', { path: { taskId } });\n };\n\n return {\n registerBucketAsync,\n getBucketRegistrationGuide,\n refreshExternalBucketAsync,\n createScheduledRefresh,\n deleteScheduledTask,\n };\n};\n","import type { Subscriber, UpdateBucketListingBody } from './types';\n\n/**\n * The two halves of the `bigquery.subscribers` wire format: a GCP IAM principal, which the Storage\n * spec documents as \"prefixed with `user:` or `group:`\". The write path uses `toBackendSubscribers`;\n * reads hand back the raw `string[]`, so a consumer that renders or edits subscribers decodes with\n * `fromBackendSubscribers` rather than re-deriving the prefix rule.\n */\nexport const toBackendSubscribers = (subscribers: Subscriber[]): string[] =>\n subscribers.map((s) => `${s.type}:${s.email}`);\n\n// Forward-compatible: skips rows with an unknown prefix or a missing email rather than throwing, so\n// a principal type we don't model yet (`serviceAccount:`) reads as absent instead of breaking the\n// whole decode. A caller that needs to know something was dropped must compare lengths.\nexport const fromBackendSubscribers = (raw: string[]): Subscriber[] => {\n const result: Subscriber[] = [];\n for (const entry of raw) {\n const colon = entry.indexOf(':');\n if (colon === -1) continue;\n const prefix = entry.slice(0, colon);\n const email = entry.slice(colon + 1);\n if (prefix !== 'user' && prefix !== 'group') continue;\n if (email.length === 0) continue;\n result.push({ type: prefix, email });\n }\n return result;\n};\n\n// PATCH /buckets/{id}/listing uses `exposureName` / `exposureDescription`\n// while POST uses `listingName` / `listingDescription` (see createListingAsync).\ntype UpdateBucketListingRequestBody = {\n exposureName?: string;\n exposureDescription?: string | null;\n bigquery?: { subscribers: string[] };\n};\n\n/**\n * Builds the PATCH body for a listing update.\n *\n * Every field is copied only when the caller actually supplied it, because `description` carries\n * three distinct meanings: absent means \"leave it alone\", `null` means \"clear it\", and a string\n * means \"set it\". Evaluating the coercion unconditionally would turn an omitted description into a\n * `null` and silently clear it.\n *\n * Throws when nothing was supplied: the backend answers an empty PATCH with a job that lands in\n * `success` without changing anything, so a caller would poll it and report a save that never\n * happened. Gate the call on the form's \"dirty\" state rather than relying on this.\n *\n * Do not \"normalize\" the `exposure*` names without coordinating with the bucket-listing backend\n * owner.\n */\nexport const toUpdateListingBody = (input: UpdateBucketListingBody) => {\n const body: UpdateBucketListingRequestBody = {};\n if (input.name !== undefined) body.exposureName = input.name;\n if (input.description !== undefined) {\n body.exposureDescription = input.description?.trim() || null;\n }\n if (input.subscribers !== undefined) {\n body.bigquery = { subscribers: toBackendSubscribers(input.subscribers) };\n }\n if (Object.keys(body).length === 0) {\n throw new Error('updateListingAsync requires at least one field');\n }\n\n return body;\n};\n","import { isApiError } from '../../../fetchClient';\nimport type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateBucketListingInput,\n CreateBucketListingSchemaBody,\n UpdateBucketListingInput,\n UpdateBucketListingSchemaBody,\n} from './types';\nimport { toBackendSubscribers, toUpdateListingBody } from './utils';\n\n/**\n * A bucket listing (exposure) publishes a bucket to a marketplace — BigQuery Analytics Hub is the\n * only backend today, which is why every write carries a `bigquery` key.\n *\n * What the Storage spec needs, per operation:\n *\n * - `POST` / `PATCH` / `DELETE /buckets/{bucketId}/listing`\n * - response: 202 `JobResponse` → really `bucketListingCreate` / `bucketListingUpdate` /\n * `bucketListingDelete` jobs. The spec's `JobResponse` is a flat shape with `status: string`,\n * while `Job<T>` is a discriminated union over `status` carrying typed `results`, so each is\n * asserted.\n *\n * `GET /buckets/{bucketId}/listing` and `GET /listings` are the operations whose specs are already\n * right — their query and response types are generated, not asserted.\n */\nexport const createBucketListings = (openApiClient: StorageOpenApiFetchClient) => {\n /**\n * Reads a bucket's listing, or `null` when the bucket has none (the endpoint 404s for both \"no\n * bucket\" and \"no listing\"). The response is the spec shape: `bigquery` is optional there — it is\n * present only for a BigQuery bucket, the only backend today — and `subscribers` inside it are the\n * raw `user:`/`group:`-prefixed principals, which `fromBackendSubscribers` decodes.\n */\n const getListing = async (bucketId: string, signal?: AbortSignal) => {\n try {\n const { data } = await openApiClient.get(\n '/v2/storage/buckets/{bucketId}/listing',\n { path: { bucketId } },\n { signal },\n );\n return data;\n } catch (error) {\n if (isApiError(error) && error.response.status === 404) return null;\n throw error;\n }\n };\n\n const createListingAsync = async (\n { bucketId, ...input }: CreateBucketListingInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.post(\n '/v2/storage/buckets/{bucketId}/listing',\n {\n path: { bucketId },\n body: {\n listingName: input.name,\n listingDescription: input.description?.trim() || null,\n bigquery: {\n listingId: input.listingId,\n subscribers: toBackendSubscribers(input.subscribers),\n },\n } as CreateBucketListingSchemaBody,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketListingCreate'>;\n };\n\n /**\n * Update a bucket exposure. At least one of `name`, `description`, or\n * `subscribers` must be provided — the SDK throws synchronously if all three\n * are absent, since the backend would otherwise no-op a PATCH with an empty\n * body and we'd return a job that's already in `success` with no actual\n * change. Callers should gate the call against the form's \"dirty\" state.\n */\n const updateListingAsync = async (\n { bucketId, ...input }: UpdateBucketListingInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.patch(\n '/v2/storage/buckets/{bucketId}/listing',\n {\n path: { bucketId },\n body: toUpdateListingBody(input) as UpdateBucketListingSchemaBody,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketListingUpdate'>;\n };\n\n const deleteListingAsync = async (bucketId: string, signal?: AbortSignal) => {\n const { data } = await openApiClient.delete(\n '/v2/storage/buckets/{bucketId}/listing',\n { path: { bucketId } },\n { signal },\n );\n\n return data as unknown as Job<'bucketListingDelete'>;\n };\n\n /** Every listing the token can manage. Rows carry `bucketId`, unlike the detail response. */\n const getListings = async (signal?: AbortSignal) => {\n const { data } = await openApiClient.get('/v2/storage/listings', {}, { signal });\n\n return data;\n };\n\n return {\n getListing,\n createListingAsync,\n updateListingAsync,\n deleteListingAsync,\n getListings,\n };\n};\n","import type { Job } from '../jobs/types';\nimport type { GenericFetchClient, StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n Bucket,\n BucketDetail,\n CreateBucketBody,\n CreateBucketSchemaBody,\n DeleteBucketAsyncInput,\n DeleteBucketMetadataInput,\n GetBucketInput,\n GetBucketOwnerInput,\n GetBucketsInput,\n GetBucketsSchemaQuery,\n SaveBucketMetadataInput,\n UpdateBucketBody,\n UpdateBucketInput,\n UpdateBucketOwnerInput,\n UpdateBucketOwnerSchemaBody,\n} from './types';\n\n/**\n * Everything here runs through the OpenAPI client except `updateBucket`, which cannot: the spec\n * declares no `put` on `/v2/storage/buckets/{bucketId}` (nor on the branch variant), so the operation\n * is missing outright rather than mistyped. That one keeps the generic client, which is why this\n * factory still takes both.\n *\n * One mismatch recurs: the spec's `JobResponse` is a flat shape with `status: string`, while `Job<T>`\n * is a discriminated union over `status` carrying typed `results`, so every job return is asserted.\n *\n * What the Storage spec needs, per operation:\n *\n * - `PUT /buckets/{bucketId}` — **operation missing entirely**; really takes `UpdateBucketBody`\n * (`displayName` / `description` / `color`) and answers a bucket detail\n * - `GET /branch/{branchId}/buckets` (`BucketsListAction`)\n * - query: `include` is a `string` → really a repeatable list, sent comma-joined\n * - response: `BucketCreateResponse[]` → really `Bucket[]` (a listing row, not a create result)\n * - `POST /buckets` (`BucketCreateAction`)\n * - response: 201 `BucketCreateResponse` → really a bucket detail\n * - `DELETE /buckets/{bucketId}` (`BucketDeleteAction`)\n * - response: 204 wins over the 202 `JobResponse` in success-code precedence, so the async variant's\n * job is asserted\n * - `POST /buckets/{bucketId}/owner` (`BucketOwnerUpdateAction`)\n * - body: `BucketOwnerUpdateRequest` is stubbed → really `{ email } | { id }`\n * */\nexport const createBuckets = (\n openApiClient: StorageOpenApiFetchClient,\n client: GenericFetchClient,\n) => {\n const getBuckets = async ({ branchId, ...query }: GetBucketsInput, signal?: AbortSignal) => {\n const { data } = await openApiClient.get(\n '/v2/storage/branch/{branchId}/buckets',\n { path: { branchId }, query: query as GetBucketsSchemaQuery },\n { signal, queryArrayFormat: 'comma' },\n );\n\n return data as unknown as Bucket[];\n };\n\n /**\n * Returns a bucket from the given branch. A dev branch only contains the buckets created or\n * pulled into it, so a production bucket must be read with the default branch id.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/GET/v2/storage/branch/{branchId}/buckets/{bucketId}\n */\n const getBucket = async (\n { branchId, bucketId, include }: GetBucketInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.get(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}',\n { path: { branchId, bucketId }, query: { include: include?.join(',') } },\n { signal },\n );\n\n // The schema types `metadata`, `linkedBy` and `tables` as `Record<string, never>[]`,\n // and has no `scheduledTasks` at all.\n return data as unknown as BucketDetail;\n };\n\n const createBucket = async (body: CreateBucketBody) => {\n const { data } = await openApiClient.post('/v2/storage/buckets', {\n body: body as CreateBucketSchemaBody,\n });\n\n return data as unknown as BucketDetail;\n };\n\n // The spec declares no `put` on this path, so this is the one method still on the generic client.\n const updateBucket = async ({ bucketId, ...body }: UpdateBucketInput) => {\n const { data } = await client.put<BucketDetail, { id: string }, never, UpdateBucketBody>(\n `/v2/storage/buckets/{id}`,\n { path: { id: bucketId }, body },\n );\n\n return data;\n };\n\n /**\n * Deletes a bucket synchronously.\n *\n * Refused outright on the stacks we test against (`400 storage.buckets.syncDeleteDisabled`,\n * \"Synchronous drop is not supported, use async call\") — prefer `deleteBucketAsync` below.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/DELETE/v2/storage/buckets/{bucketId}\n */\n const deleteBucket = async (id: string) => {\n await openApiClient.delete('/v2/storage/buckets/{bucketId}', { path: { bucketId: id } });\n };\n\n /**\n * Deletes a bucket asynchronously and returns a job to poll.\n * Required on GCP stacks where synchronous bucket deletion is not supported.\n *\n * `force` deletes all tables inside the bucket before removing it.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/DELETE/v2/storage/buckets/{bucketId}\n */\n const deleteBucketAsync = async ({ bucketId, ...query }: DeleteBucketAsyncInput) => {\n const { data } = await openApiClient.delete('/v2/storage/buckets/{bucketId}', {\n path: { bucketId },\n query: { async: true, ...query },\n });\n\n return data as unknown as Job<'bucketDelete'>;\n };\n\n /**\n * Returns the owner of a bucket in the given branch.\n *\n * A bucket has no owner until one is assigned — reading it on a fresh bucket answers\n * `404 storage.bucket.ownerNotFound`, so call `updateBucketOwner` first (or handle the 404 as\n * \"unassigned\" rather than as a missing bucket).\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/GET/v2/storage/branch/{branchId}/buckets/{bucketId}/owner\n */\n const getBucketOwner = async (\n { branchId, bucketId }: GetBucketOwnerInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.get(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/owner',\n { path: { branchId, bucketId } },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Changes the owner of a bucket (by `id` or `email`).\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/POST/v2/storage/buckets/{bucketId}/owner\n */\n const updateBucketOwner = async (\n { bucketId, ...body }: UpdateBucketOwnerInput,\n signal?: AbortSignal,\n ) => {\n await openApiClient.post(\n '/v2/storage/buckets/{bucketId}/owner',\n { path: { bucketId }, body: body as UpdateBucketOwnerSchemaBody },\n { signal },\n );\n };\n\n /**\n * Adds or updates metadata on a bucket in the given branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/POST/v2/storage/branch/{branchId}/buckets/{bucketId}/metadata\n */\n const saveBucketMetadata = async (\n { branchId, bucketId, ...body }: SaveBucketMetadataInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/metadata',\n { path: { branchId, bucketId }, body },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Deletes a single metadata entry from a bucket in the given branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/DELETE/v2/storage/branch/{branchId}/buckets/{bucketId}/metadata/{metadataId}\n */\n const deleteBucketMetadata = async (\n { branchId, bucketId, metadataId }: DeleteBucketMetadataInput,\n signal?: AbortSignal,\n ) => {\n await openApiClient.delete(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/metadata/{metadataId}',\n { path: { branchId, bucketId, metadataId } },\n { signal },\n );\n };\n\n return {\n getBuckets,\n getBucket,\n createBucket,\n updateBucket,\n deleteBucket,\n deleteBucketAsync,\n getBucketOwner,\n updateBucketOwner,\n saveBucketMetadata,\n deleteBucketMetadata,\n };\n};\n","import type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n ForceUnlinkBucketInput,\n ForceUnlinkBucketSchemaPath,\n ForceUnlinkBucketSchemaQuery,\n LinkBucketBody,\n ShareBucketToOrganizationInput,\n ShareBucketToOrganizationProjectInput,\n ShareBucketToOrganizationProjectSchemaQuery,\n ShareBucketToOrganizationSchemaQuery,\n ShareBucketToProjectsInput,\n ShareBucketToProjectsSchemaBody,\n ShareBucketToProjectsSchemaQuery,\n ShareBucketToUsersInput,\n ShareBucketToUsersSchemaBody,\n ShareBucketToUsersSchemaQuery,\n SharedBucketsQuery,\n UnshareBucketInput,\n UnshareBucketSchemaQuery,\n} from './types';\n\n/**\n * Two spec mismatches recur here and account for every assertion below:\n * - **jobs** — the spec's `JobResponse` is a flat shape with `status: string`, while `Job<T>` is a\n * discriminated union over `status` carrying typed `results`. Every job return is asserted, whether\n * the operation declares a `JobResponse` or no body at all.\n * - **`async` query** — all six share/unshare operations are invoked with `async: true` but declare\n * `query: never`.\n *\n * What the Storage spec needs, per operation:\n *\n * - `POST /branch/{branchId}/buckets/{bucketId}/share-organization` / `-organization-project`\n * - query: `never` → really accepts `async`\n * - response: `BucketShareOrganizationResponse` / `…ProjectResponse` → really share jobs\n * - `POST /branch/{branchId}/buckets/{bucketId}/share-to-projects` / `-to-users`\n * - query: `never` → really accepts `async`\n * - body: `CreateBucketSharingToProjectsRequest` / `…ToUsersRequest` are stubbed\n * (`Record<string, never>`) → really `{ targetProjectIds }` / `{ targetUsers }`\n * - response: contentless `default` → really `bucketShareToProjects` / `bucketShareToAdmins` jobs\n * - `DELETE /branch/{branchId}/buckets/{bucketId}/share` (`BucketShareDeleteAction`)\n * - query: `never` → really accepts `async`\n * - response: `BucketShareDeleteResponse` → really a `bucketRemoveShare` job\n * - `DELETE /branch/{branchId}/buckets/{bucketId}/links/{linkedProjectId}` (`BucketForceUnlinkAction`)\n * - query: `never` → really accepts `async`\n * - path: `linkedProjectId` is a `number` → really a string\n * - response: 202 `JobResponse` → really a `bucketForceUnlink` job\n * - `POST /buckets` (`BucketCreateAction`) — the link half of a create-or-link endpoint\n * - response: the 201 \"created or linked synchronously\" wins over the 202 in success-code\n * precedence, so the async variant's `bucketLink` job is asserted\n * - `GET /shared-buckets` (`SharedBucketsListAction`)\n * - response: `Record<string, never>[]` → really a shared-bucket listing. This one is *not*\n * asserted, so `SharedBuckets` is currently an empty-object array and callers get nothing useful.\n */\nexport const createBucketSharing = (openApiClient: StorageOpenApiFetchClient) => {\n /**\n * Shares a bucket with everyone in the organization. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/POST/v2/storage/branch/{branchId}/buckets/{bucketId}/share-organization\n */\n const shareBucketToOrganizationAsync = async (\n { branchId, bucketId }: ShareBucketToOrganizationInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/share-organization',\n {\n path: { branchId, bucketId },\n query: { async: true } as unknown as ShareBucketToOrganizationSchemaQuery,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketShareToOrganization'>;\n };\n\n /**\n * Shares a bucket with every project in the organization. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/POST/v2/storage/branch/{branchId}/buckets/{bucketId}/share-organization-project\n */\n const shareBucketToOrganizationProjectAsync = async (\n { branchId, bucketId }: ShareBucketToOrganizationProjectInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/share-organization-project',\n {\n path: { branchId, bucketId },\n query: { async: true } as unknown as ShareBucketToOrganizationProjectSchemaQuery,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketShareToOrganizationProject'>;\n };\n\n /**\n * Shares a bucket with specific projects. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/POST/v2/storage/branch/{branchId}/buckets/{bucketId}/share-to-projects\n */\n const shareBucketToProjectsAsync = async (\n { branchId, bucketId, ...body }: ShareBucketToProjectsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/share-to-projects',\n {\n path: { branchId, bucketId },\n query: { async: true } as unknown as ShareBucketToProjectsSchemaQuery,\n body: body as unknown as ShareBucketToProjectsSchemaBody,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketShareToProjects'>;\n };\n\n /**\n * Shares a bucket with specific users (by ID or e-mail). Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/POST/v2/storage/branch/{branchId}/buckets/{bucketId}/share-to-users\n */\n const shareBucketToUsersAsync = async (\n { branchId, bucketId, ...body }: ShareBucketToUsersInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/share-to-users',\n {\n path: { branchId, bucketId },\n query: { async: true } as unknown as ShareBucketToUsersSchemaQuery,\n body: body as unknown as ShareBucketToUsersSchemaBody,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketShareToAdmins'>;\n };\n\n /**\n * Stops sharing a bucket. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/DELETE/v2/storage/branch/{branchId}/buckets/{bucketId}/share\n */\n const unshareBucketAsync = async (\n { branchId, bucketId }: UnshareBucketInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.delete(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/share',\n {\n path: { branchId, bucketId },\n query: { async: true } as unknown as UnshareBucketSchemaQuery,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketRemoveShare'>;\n };\n\n /**\n * Force-unlinks a bucket from a linked project. Async — returns a job to poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/DELETE/v2/storage/branch/{branchId}/buckets/{bucketId}/links/{linkedProjectId}\n */\n const forceUnlinkBucketAsync = async (\n { branchId, bucketId, linkedProjectId }: ForceUnlinkBucketInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.delete(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/links/{linkedProjectId}',\n {\n path: { branchId, bucketId, linkedProjectId } as unknown as ForceUnlinkBucketSchemaPath,\n query: { async: true } as unknown as ForceUnlinkBucketSchemaQuery,\n },\n { signal },\n );\n\n return data as unknown as Job<'bucketForceUnlink'>;\n };\n\n /**\n * Links a bucket shared with this project into it. Async — returns a job to poll, whose `results`\n * is the new bucket.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/POST/v2/storage/buckets\n */\n const linkBucketAsync = async (body: LinkBucketBody, signal?: AbortSignal) => {\n const { data } = await openApiClient.post(\n '/v2/storage/buckets',\n { query: { async: true }, body },\n { signal },\n );\n\n return data as unknown as Job<'bucketLink'>;\n };\n\n /**\n * Lists buckets shared with the current project.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/shared-buckets/GET/v2/storage/shared-buckets\n */\n const sharedBuckets = async (query?: SharedBucketsQuery, signal?: AbortSignal) => {\n const { data } = await openApiClient.get('/v2/storage/shared-buckets', { query }, { signal });\n\n return data;\n };\n\n return {\n shareBucketToOrganizationAsync,\n shareBucketToOrganizationProjectAsync,\n shareBucketToProjectsAsync,\n shareBucketToUsersAsync,\n unshareBucketAsync,\n forceUnlinkBucketAsync,\n linkBucketAsync,\n sharedBuckets,\n };\n};\n","import type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n AddTableColumnInput,\n AddTableColumnSchemaBody,\n CreateTablePrimaryKeyInput,\n CreateTablePrimaryKeySchemaBody,\n DeleteColumnMetadataInput,\n DeleteTableColumnInput,\n RemoveTablePrimaryKeyInput,\n SaveColumnMetadataInput,\n} from './types';\n\n/**\n * Every job return below is asserted in: the spec's `JobResponse` is a flat shape with\n * `status: string`, while `Job<T>` is a discriminated union over `status` carrying typed `results`.\n * That mismatch applies to both operations that declare a `JobResponse` and those that declare no\n * response body at all. What the Storage spec needs, per operation:\n *\n * - `POST /branch/{branchId}/tables/{id}/columns` (`ColumnCreateAction`)\n * - body: none of `ColumnCreateRequest` / `SnowflakeAddColumnToTableRequest` /\n * `BigqueryAddColumnToTableRequest` declares `basetype`, and they type `definition.length` as a\n * `number` → really a string (a decimal length is sent as `'38,0'`)\n * - response: 202 is contentless → really a `tableColumnAdd` job\n * - `DELETE /branch/{branchId}/tables/{tableId}/columns/{columnName}` (`ColumnDeleteAction`)\n * - response: 202 declares `JobResponse` → really a `tableColumnDelete` job\n * - `POST /branch/{branchId}/tables/{tableId}/primary-key` (`PrimaryKeyCreateAction`)\n * - body: `CreatePrimaryKeyRequest.skipDuplicatesCheck` is required → really optional (it has a\n * documented `@default false`, so a caller omitting it is valid)\n * - response: 202 is contentless → really a `tablePrimaryKeyAdd` job\n * - `DELETE /branch/{branchId}/tables/{tableId}/primary-key` (`PrimaryKeyDeleteAction`)\n * - response: 202 declares `JobResponse` → really a `tablePrimaryKeyDelete` job\n */\nexport const createColumns = (client: StorageOpenApiFetchClient) => {\n /**\n * Adds a column to a table. Async — returns a job.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/columns/POST/v2/storage/branch/{branchId}/tables/{id}/columns\n */\n const addTableColumnAsync = async (\n { branchId, id, ...body }: AddTableColumnInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/tables/{id}/columns',\n { path: { branchId, id }, body: body as AddTableColumnSchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tableColumnAdd'>;\n };\n\n /**\n * Drops a column from a table. Async — returns a job.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/columns/DELETE/v2/storage/branch/{branchId}/tables/{tableId}/columns/{columnName}\n */\n const deleteTableColumnAsync = async (\n { branchId, tableId, columnName, ...query }: DeleteTableColumnInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.delete(\n '/v2/storage/branch/{branchId}/tables/{tableId}/columns/{columnName}',\n { path: { branchId, tableId, columnName }, query },\n { signal },\n );\n\n return data as unknown as Job<'tableColumnDelete'>;\n };\n\n /**\n * Sets the primary key of a table. Async — returns a job.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/POST/v2/storage/branch/{branchId}/tables/{tableId}/primary-key\n */\n const createTablePrimaryKeyAsync = async (\n { branchId, tableId, ...body }: CreateTablePrimaryKeyInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/tables/{tableId}/primary-key',\n { path: { branchId, tableId }, body: body as CreateTablePrimaryKeySchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tablePrimaryKeyAdd'>;\n };\n\n /**\n * Removes the primary key of a table. Async — returns a job.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/DELETE/v2/storage/branch/{branchId}/tables/{tableId}/primary-key\n */\n const removeTablePrimaryKeyAsync = async (\n { branchId, tableId }: RemoveTablePrimaryKeyInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.delete(\n '/v2/storage/branch/{branchId}/tables/{tableId}/primary-key',\n { path: { branchId, tableId } },\n { signal },\n );\n\n return data as unknown as Job<'tablePrimaryKeyDelete'>;\n };\n\n /**\n * Adds or updates metadata on a column in the given branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/columns/POST/v2/storage/branch/{branchId}/columns/{id}/metadata\n */\n const saveColumnMetadata = async (\n { branchId, columnId, ...body }: SaveColumnMetadataInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/columns/{id}/metadata',\n { path: { branchId, id: columnId }, body },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Deletes a single metadata entry from a column in the given branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/columns/DELETE/v2/storage/branch/{branchId}/columns/{id}/metadata/{metadataId}\n */\n const deleteColumnMetadata = async (\n { branchId, columnId, metadataId }: DeleteColumnMetadataInput,\n signal?: AbortSignal,\n ) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/columns/{id}/metadata/{metadataId}',\n { path: { branchId, id: columnId, metadataId } },\n { signal },\n );\n };\n\n return {\n addTableColumnAsync,\n deleteTableColumnAsync,\n createTablePrimaryKeyAsync,\n removeTablePrimaryKeyAsync,\n saveColumnMetadata,\n deleteColumnMetadata,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n Component,\n GetComponentPath,\n GetComponentsInput,\n GetComponentsSchemaQuery,\n} from './types';\n\nexport const createComponents = (client: StorageOpenApiFetchClient) => {\n const getComponent = async (\n { componentId, branchId }: GetComponentPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}',\n { path: { componentId, branchId } },\n { signal },\n );\n\n return data as Component;\n };\n\n const getComponents = async (\n { branchId, ...query }: GetComponentsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components',\n { path: { branchId }, query: query as GetComponentsSchemaQuery },\n { signal, queryArrayFormat: 'comma' },\n );\n\n return data as unknown as Component[];\n };\n\n return {\n getComponent,\n getComponents,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n DeleteConfigurationMetadataPath,\n GetConfigurationMetadataPath,\n SaveConfigurationMetadataInput,\n} from './types';\n\nexport const createConfigurationMetadata = (client: StorageOpenApiFetchClient) => {\n const getConfigurationMetadata = async (\n path: GetConfigurationMetadataPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/metadata',\n { path },\n { signal },\n );\n\n return data;\n };\n\n /** Create or update configuration metadata (e.g. `KBC.configuration.folderName`). */\n const saveConfigurationMetadata = async ({\n branchId,\n componentId,\n configurationId,\n ...body\n }: SaveConfigurationMetadataInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/metadata',\n {\n path: { branchId, componentId, configurationId },\n body,\n },\n );\n\n return data;\n };\n\n /** Only available on the default branch — a dev branch answers 501. */\n const deleteConfigurationMetadata = async (\n path: DeleteConfigurationMetadataPath,\n signal?: AbortSignal,\n ) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/metadata/{metadataId}',\n {\n path,\n },\n { signal },\n );\n };\n\n return { getConfigurationMetadata, saveConfigurationMetadata, deleteConfigurationMetadata };\n};\n","import type { MiddlewareFn } from '../../../utils';\nimport { concurrent, series } from '../../../utils';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateConfigurationRowBody,\n CreateConfigurationRowInput,\n CreateConfigurationRowSchemaBody,\n CreateConfigurationRowsInput,\n DeleteConfigurationRowInput,\n DeleteConfigurationRowSchemaBody,\n DeleteConfigurationRowsInput,\n GetConfigurationRowInput,\n Row,\n UpdateConfigurationRowInput,\n UpdateConfigurationRowSchemaBody,\n UpdateConfigurationRowStateInput,\n UpdateConfigurationRowStateSchemaBody,\n} from './types';\n\nexport const createConfigurationRows = (client: StorageOpenApiFetchClient) => {\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/POST/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows\n */\n const createConfigurationRow = async ({\n branchId,\n componentId,\n configurationId,\n ...body\n }: CreateConfigurationRowInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows',\n {\n path: { branchId, componentId, configurationId },\n body: body as CreateConfigurationRowSchemaBody,\n },\n );\n\n return data as Row;\n };\n\n /**\n * NOTE: Do not run this method concurrently; BE will return 500 server errors under load due to a BE bottleneck with IDs allocation.\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/POST/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows\n */\n const createConfigurationRows = async (\n { branchId, componentId, configurationId, data }: CreateConfigurationRowsInput,\n options?: { middlewares: MiddlewareFn<CreateConfigurationRowBody, Row>[] },\n ) => {\n return series({\n items: data,\n process: (rowBody) => {\n return createConfigurationRow({\n branchId,\n componentId,\n configurationId,\n ...rowBody,\n });\n },\n middlewares: options?.middlewares,\n });\n };\n\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/GET/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}\n */\n const getConfigurationRow = async (\n { branchId, ...path }: GetConfigurationRowInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}',\n { path: { branchId, ...path } },\n { signal },\n );\n\n return data as Row;\n };\n\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/PUT/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}\n */\n const updateConfigurationRow = async (\n { branchId, componentId, configurationId, rowId, ...body }: UpdateConfigurationRowInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.put(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}',\n {\n path: { branchId, componentId, configurationId, rowId },\n body: body as UpdateConfigurationRowSchemaBody,\n },\n { signal },\n );\n\n return data as Row;\n };\n\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/PUT/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}/state\n */\n const updateConfigurationRowState = async (\n { branchId, componentId, configurationId, rowId, ...body }: UpdateConfigurationRowStateInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.put(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}/state',\n {\n path: { branchId, componentId, configurationId, rowId },\n body: body as UpdateConfigurationRowStateSchemaBody,\n },\n { signal },\n );\n\n return data as Row;\n };\n\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/DELETE/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}\n */\n const deleteConfigurationRow = async ({\n changeDescription,\n ...path\n }: DeleteConfigurationRowInput) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}',\n { path, body: { changeDescription } as DeleteConfigurationRowSchemaBody },\n );\n };\n\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configuration-rows/DELETE/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}\n */\n const deleteConfigurationRows = async (\n { rowIds, changeDescription, ...input }: DeleteConfigurationRowsInput,\n options?: { middlewares: MiddlewareFn<string, void>[] },\n ) => {\n await concurrent({\n items: rowIds,\n process: (rowId) => {\n const resolvedDescription =\n typeof changeDescription === 'string' ? changeDescription : changeDescription?.(rowId);\n\n return deleteConfigurationRow({\n rowId,\n changeDescription: resolvedDescription,\n ...input,\n });\n },\n concurrency: 5,\n middlewares: options?.middlewares,\n });\n };\n\n return {\n createConfigurationRow,\n createConfigurationRows,\n getConfigurationRow,\n updateConfigurationRow,\n updateConfigurationRowState,\n deleteConfigurationRow,\n deleteConfigurationRows,\n };\n};\n","import { HttpHeader } from '../../../fetchClient';\nimport { KeboolaHttpHeader } from '../../../internal';\n\n/**\n * `expectedVersion` is the `version` field of the configuration the caller read, sent back as the\n * `If-Match` header so the write is conditional on nothing having changed since. What Storage does\n * with it:\n *\n * 1. Header omitted (`{}`) — no precondition, the write applies whatever the current version is.\n * `purgeConfiguration` is the exception and answers 428, which is why its `expectedVersion` is\n * required rather than optional.\n * 2. Version still current — the write applies.\n * 3. Version moved on since it was read — 412, and nothing is written.\n * 4. Value unusable — 400. Storage wants a strong entity tag, so the quotes are part of the value;\n * a bare number, a weak validator or a tag list are all rejected.\n */\nexport const createVersionPrecondition = (expectedVersion?: number) =>\n expectedVersion === undefined ? {} : { [HttpHeader.IF_MATCH]: `\"${expectedVersion}\"` };\n\n/**\n * The `workspaceOutputMappingSync` job a configuration update enqueued.\n *\n * - Storage reports it in a header, not in the response body.\n * - `null` means there is no job to wait for, not that the write failed.\n * - Components outside Storage's allow-list get no job — `workspaceId` is ignored for them.\n */\nexport const parseSyncJobId = (headers: Headers) => {\n const jobId = Number(headers.get(KeboolaHttpHeader.STORAGE_API_JOB_ID));\n\n // A missing header and an empty one both coerce to 0, 'abc' to NaN — none of them a job to poll.\n return Number.isInteger(jobId) && jobId > 0 ? jobId : null;\n};\n","import { concurrent } from '../../../utils';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n ComponentConfig,\n ConfigType,\n ConfigurationDiff,\n ConfigurationDiffPath,\n ConfigurationPath,\n CreateConfigurationInput,\n CreateConfigurationSchemaBody,\n DeleteConfigurationInput,\n GetConfigurationsPath,\n PurgeConfigurationInput,\n PurgeConfigurationsInput,\n RebaseConfigurationInput,\n RebaseConfigurationSchemaBody,\n RebaseConfigurationToDeletedInput,\n SearchComponentConfiguration,\n SearchComponentConfigurationsInput,\n SearchComponentConfigurationsSchemaQuery,\n UpdateConfigurationBody,\n UpdateConfigurationInput,\n UpdateConfigurationResult,\n UpdateConfigurationSchemaBody,\n UpdateConfigurationStateInput,\n UpdateConfigurationStateSchemaBody,\n} from './types';\nimport { createVersionPrecondition, parseSyncJobId } from './utils';\n\n/**\n * Every configuration read is bridged to `ComponentConfig<T>` with `as unknown as`.\n *\n * - `BaseComponentConfig` re-tightens four fields the spec marks nullable and re-types the two\n * free-form JSON ones, so the generated shape and the target never fully overlap.\n * - `ComponentConfig<T>` is a conditional over an unresolved `T`, which TypeScript will not check a\n * direct conversion against either.\n */\nexport const createConfigurations = (client: StorageOpenApiFetchClient) => {\n const getConfiguration = async <T extends ConfigType = 'unknown'>(\n { componentId, configId, branchId }: ConfigurationPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}',\n { path: { componentId, configurationId: configId, branchId } },\n { signal },\n );\n\n return data as unknown as ComponentConfig<T>;\n };\n\n const getConfigurationDiff = async (\n { componentId, configId, branchId }: ConfigurationDiffPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/diff',\n { path: { componentId, configurationId: configId, branchId } },\n { signal },\n );\n\n return data as unknown as ConfigurationDiff;\n };\n\n const rebaseConfiguration = async ({\n branchId,\n componentId,\n configId,\n ...body\n }: RebaseConfigurationInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rebase',\n {\n path: { branchId, componentId, configurationId: configId },\n body: body as unknown as RebaseConfigurationSchemaBody,\n },\n );\n\n return data as ComponentConfig;\n };\n\n /**\n * Resolve a merge conflict by deleting the configuration — the same rebase\n * endpoint as `rebaseConfiguration`, but with an empty `diff` envelope. The\n * dev-branch configuration is re-anchored onto the given default-branch\n * `version` and its head version becomes a tombstone (soft delete). Returns\n * the deleted configuration.\n */\n const rebaseConfigurationToDeleted = async ({\n branchId,\n componentId,\n configId,\n version,\n }: RebaseConfigurationToDeletedInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rebase',\n {\n path: { branchId, componentId, configurationId: configId },\n body: { version, diff: {} } as unknown as RebaseConfigurationSchemaBody,\n },\n );\n\n return data as ComponentConfig;\n };\n\n const createConfiguration = async ({\n branchId,\n componentId,\n ...body\n }: CreateConfigurationInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs',\n {\n path: { branchId, componentId },\n body: body as unknown as CreateConfigurationSchemaBody,\n },\n );\n\n return data as ComponentConfig;\n };\n\n /**\n * Updates an existing configuration. Only the fields provided are sent.\n *\n * - Resolves once the configuration is written.\n * - Sending `workspaceId` also asks Storage to sync that workspace's output mapping against the\n * saved configuration. That part runs as a job: poll `syncJobId` through `jobs.getJob` when it\n * has to land before the caller reports success.\n * - A `workspaceId` not linked to this component and configuration is rejected with 400, before\n * the configuration is written.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configurations/PUT/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}\n */\n const updateConfiguration = async <T extends ConfigType = 'unknown'>(\n {\n branchId,\n componentId,\n configId,\n configuration,\n workspaceId,\n ...rest\n }: UpdateConfigurationInput,\n signal?: AbortSignal,\n ): Promise<UpdateConfigurationResult<T>> => {\n const body: UpdateConfigurationBody = {\n ...rest,\n configuration,\n };\n\n const { data, response } = await client.put(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}',\n {\n path: { branchId, componentId, configurationId: configId },\n query: { workspaceId },\n body: body as UpdateConfigurationSchemaBody,\n },\n { signal },\n );\n\n return {\n configuration: data as unknown as ComponentConfig<T>,\n syncJobId: parseSyncJobId(response.headers),\n };\n };\n\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configurations/PUT/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/state\n */\n const updateConfigurationState = async <T extends ConfigType = 'unknown'>(\n { branchId, componentId, configId, ...body }: UpdateConfigurationStateInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.put(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/state',\n {\n path: { branchId, componentId, configurationId: configId },\n body: body as unknown as UpdateConfigurationStateSchemaBody,\n },\n { signal },\n );\n\n return data as unknown as ComponentConfig<T>;\n };\n\n /**\n * Move a configuration to the trash — or, when it is in the trash already, purge it\n * permanently. Pass `expectedVersion` to pin the version the delete was decided on;\n * prefer `purgeConfiguration` when the permanent removal is the intent.\n */\n const deleteConfiguration = async ({\n branchId,\n componentId,\n configId,\n expectedVersion,\n }: DeleteConfigurationInput) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}',\n { path: { branchId, componentId, configurationId: configId } },\n { headers: { ...createVersionPrecondition(expectedVersion) } },\n );\n };\n\n /**\n * Permanently remove a trashed configuration, including its versions, rows and metadata.\n * Unlike a second `deleteConfiguration`, this never falls back to a soft delete: purging a\n * live configuration is rejected (400 `notInTrash`) rather than trashing it. Default branch\n * only, and the token needs `canPurgeTrash`.\n */\n const purgeConfiguration = async ({\n branchId,\n componentId,\n configId,\n expectedVersion,\n }: PurgeConfigurationInput) => {\n await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/purge',\n { path: { branchId, componentId, configurationId: configId } },\n { headers: { ...createVersionPrecondition(expectedVersion) } },\n );\n };\n\n /**\n * Purge configurations across components in one bounded fan-out. Like every `concurrent` caller\n * it stops at the first rejection, and here that is a case to plan for rather than an edge: a\n * stale `expectedVersion` (412) abandons the rest of the queue, so re-read the trash before\n * offering another attempt.\n *\n * Emptying a trash is the whole-collection case this exists for, which `concurrent`'s default of\n * 2 would walk through two configurations at a time.\n */\n const purgeConfigurations = async ({ branchId, configs }: PurgeConfigurationsInput) => {\n await concurrent({\n items: configs,\n concurrency: 10,\n process: (config) => purgeConfiguration({ branchId, ...config }),\n });\n };\n\n /** Restore a trashed configuration. */\n const restoreConfiguration = async ({ branchId, componentId, configId }: ConfigurationPath) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/restore',\n { path: { branchId, componentId, configurationId: configId } },\n );\n\n return data as unknown as ComponentConfig;\n };\n\n /**\n * Reset a dev-branch configuration back to its default-branch (production) version.\n *\n * The spec is right: the endpoint answers with an empty body, confirmed against the live API by\n * the nightly smoke (`integration/storageConfigurationLifecycle.smoke.ts`). It used to be typed as\n * resolving to the configuration, so every caller reading a field off the result was reading\n * `undefined`. Re-read the configuration to observe the reset.\n *\n * Dev-branch only — the API answers 501 on `default`.\n */\n const resetConfigurationToDefault = async ({\n branchId,\n componentId,\n configId,\n }: ConfigurationPath): Promise<void> => {\n await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/reset-to-default',\n { path: { branchId, componentId, configurationId: configId } },\n );\n };\n\n const deleteConfigurations = async ({\n configIds,\n ...rest\n }: Required<Omit<ConfigurationPath, 'configId'>> & {\n configIds: string[];\n }) => {\n await concurrent({\n items: configIds,\n process: async (configId) => deleteConfiguration({ ...rest, configId }),\n });\n };\n\n const getConfigurations = async <T extends ConfigType = 'unknown'>(\n { componentId, branchId }: GetConfigurationsPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs',\n { path: { componentId, branchId } },\n { signal },\n );\n\n return data as unknown as ComponentConfig<T>[];\n };\n\n const searchComponentConfigurations = async (\n { branchId, include, ...query }: SearchComponentConfigurationsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/search/component-configurations',\n {\n path: { branchId },\n // `include` is comma-separated on the wire (the spec types it `include?: string`), so it is\n // joined here rather than pinning the whole query to `queryArrayFormat: 'comma'` — that pin\n // is what used to break `metadataKeys`, which the API wants as a real array. Guard on\n // `length`, not truthiness: `[]` is truthy and would send a bare `include=`, which is a\n // different request from omitting the parameter.\n //\n // The component filter is `idComponent`, not `componentId`: the API rejects the latter with\n // \"This field was not expected\" (the live nightly caught it, and kbc-ui's legacy client has\n // always sent `idComponent` in production), so the previous divergence from the spec was a\n // bug rather than a deliberate choice.\n query: {\n ...query,\n ...(include?.length && { include: include.join(',') }),\n } as unknown as SearchComponentConfigurationsSchemaQuery,\n },\n { signal },\n );\n\n return data as SearchComponentConfiguration[];\n };\n\n return {\n createConfiguration,\n updateConfiguration,\n updateConfigurationState,\n getConfiguration,\n getConfigurationDiff,\n rebaseConfiguration,\n rebaseConfigurationToDeleted,\n deleteConfiguration,\n deleteConfigurations,\n purgeConfiguration,\n purgeConfigurations,\n getConfigurations,\n restoreConfiguration,\n resetConfigurationToDefault,\n searchComponentConfigurations,\n };\n};\n","import type { Row } from '../configurationRows/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n ConfigurationRowVersion,\n ConfigurationRowVersionDetail,\n ConfigurationRowVersionDetailPath,\n ConfigurationRowVersionPath,\n ConfigurationVersion,\n ConfigurationVersionDetail,\n ConfigurationVersionDetailPath,\n ConfigurationVersionPath,\n CopyConfigurationFromVersionInput,\n CopyConfigurationRowFromVersionInput,\n CopyConfigurationRowFromVersionSchemaBody,\n RollbackConfigurationRowToVersionInput,\n RollbackConfigurationRowToVersionSchemaBody,\n RollbackConfigurationToVersionInput,\n} from './types';\n\nexport const createConfigurationVersions = (client: StorageOpenApiFetchClient) => {\n const getConfigurationVersions = async (\n { branchId, componentId, configurationId }: ConfigurationVersionPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/versions',\n { path: { branchId, componentId, configurationId } },\n { signal },\n );\n\n return data as unknown as ConfigurationVersion[];\n };\n\n const getConfigurationVersion = async (\n { branchId, componentId, configurationId, versionId }: ConfigurationVersionDetailPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/versions/{versionId}',\n {\n path: {\n branchId,\n componentId,\n configurationId,\n versionId,\n },\n },\n { signal },\n );\n\n return data as unknown as ConfigurationVersionDetail;\n };\n\n /**\n * Roll a configuration back to one of its versions.\n *\n * A rollback is itself a new version, not a rewind of the history, and the endpoint answers with\n * only that number — no configuration body. Re-read the configuration to observe the result.\n */\n const rollbackConfigurationToVersion = async ({\n branchId,\n componentId,\n configurationId,\n versionId,\n }: RollbackConfigurationToVersionInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/versions/{versionId}/rollback',\n {\n path: {\n branchId,\n componentId,\n configurationId,\n versionId,\n },\n // Spec declares the body required; every field in it is optional and an empty object is\n // dropped before the request is built.\n body: {},\n },\n );\n\n return data;\n };\n\n /**\n * Server-side copy of a configuration from one of its versions. Preserves the\n * full configuration including rows — unlike a read-then-create, which would\n * only carry the top-level config body.\n *\n * The endpoint answers with only the new configuration's id; read it back for the body.\n */\n const copyConfigurationFromVersion = async ({\n branchId,\n componentId,\n configurationId,\n versionId,\n ...body\n }: CopyConfigurationFromVersionInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/versions/{versionId}/create',\n {\n path: {\n branchId,\n componentId,\n configurationId,\n versionId,\n },\n body,\n },\n );\n\n return data;\n };\n\n const getConfigurationRowVersions = async (\n { branchId, componentId, configurationId, rowId }: ConfigurationRowVersionPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}/versions',\n { path: { branchId, componentId, configurationId, rowId } },\n { signal },\n );\n\n return data as unknown as ConfigurationRowVersion[];\n };\n\n const getConfigurationRowVersion = async (\n { branchId, componentId, configurationId, rowId, versionId }: ConfigurationRowVersionDetailPath,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}/versions/{versionId}',\n {\n path: {\n branchId,\n componentId,\n configurationId,\n rowId,\n versionId,\n },\n },\n { signal },\n );\n\n return data as unknown as ConfigurationRowVersionDetail;\n };\n\n /** Roll a configuration row back to one of its versions. */\n const rollbackConfigurationRowToVersion = async ({\n branchId,\n componentId,\n configurationId,\n rowId,\n versionId,\n }: RollbackConfigurationRowToVersionInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}/versions/{versionId}/rollback',\n {\n path: {\n branchId,\n componentId,\n configurationId,\n rowId,\n versionId,\n },\n // Spec marks `changeDescription` required on the row rollback; the endpoint takes no body,\n // and an empty object is dropped before the request is built.\n body: {} as RollbackConfigurationRowToVersionSchemaBody,\n },\n );\n\n return data as unknown as Row;\n };\n\n /**\n * Server-side copy of a row from one of its versions into the same configuration.\n * The endpoint takes no body, so the copy's name is the backend's to choose — a\n * caller that wants a specific one follows up with a row update.\n */\n const copyConfigurationRowFromVersion = async ({\n branchId,\n componentId,\n configurationId,\n rowId,\n versionId,\n }: CopyConfigurationRowFromVersionInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/rows/{rowId}/versions/{versionId}/create',\n {\n path: {\n branchId,\n componentId,\n configurationId,\n rowId,\n versionId,\n },\n // Spec marks `targetConfigId` and `changeDescription` required on the row copy; the\n // endpoint takes no body, and an empty object is dropped before the request is built.\n body: {} as CopyConfigurationRowFromVersionSchemaBody,\n },\n );\n\n return data as unknown as Row;\n };\n\n return {\n getConfigurationVersions,\n getConfigurationVersion,\n rollbackConfigurationToVersion,\n copyConfigurationFromVersion,\n getConfigurationRowVersions,\n getConfigurationRowVersion,\n rollbackConfigurationRowToVersion,\n copyConfigurationRowFromVersion,\n };\n};\n","import type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\nimport type { Workspace } from '../workspaces/types';\n\nimport type { CreateConfigurationWorkspaceInput, GetConfigurationWorkspacesPath } from './types';\n\nexport const createConfigurationWorkspaces = (client: StorageOpenApiFetchClient) => {\n /**\n * @link https://api.keboola.com/?service=storage#storage/tag/component-configurations/GET/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/workspaces\n */\n const getConfigurationWorkspaces = async ({\n componentId,\n branchId,\n configurationId,\n }: GetConfigurationWorkspacesPath) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/workspaces',\n { path: { componentId, branchId, configurationId } },\n );\n\n return data as Workspace[];\n };\n\n const createConfigurationWorkspace = async ({\n componentId,\n branchId,\n configurationId,\n ...body\n }: CreateConfigurationWorkspaceInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/workspaces',\n { path: { componentId, branchId, configurationId }, body },\n );\n\n return data as Workspace;\n };\n\n const createConfigurationWorkspaceJob = async ({\n componentId,\n branchId,\n configurationId,\n ...body\n }: CreateConfigurationWorkspaceInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/components/{componentId}/configs/{configurationId}/workspaces',\n {\n path: { componentId, branchId, configurationId },\n body,\n query: { async: true },\n },\n );\n\n return data as unknown as Job<'workspaceCreate'>;\n };\n\n return {\n createConfigurationWorkspace,\n createConfigurationWorkspaceJob,\n getConfigurationWorkspaces,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreatedEvent,\n CreateEventInput,\n CreateEventSchemaBody,\n GetBucketEventsInput,\n GetEventPath,\n GetEventsInput,\n GetTableEventsInput,\n StorageEvent,\n} from './types';\n\n/**\n * Every endpoint here is the branched variant, and `branchId` is the caller's to supply.\n *\n * - The unbranched twins (`/v2/storage/events`, `/v2/storage/events/{eventId}`) answer the same\n * payloads; addressing one branch is the narrower request and the one every caller wants.\n * - Each response is asserted in. The spec declares the shape now, but types `params`, `results` and\n * `performance` as bare objects, and `StorageEvent` re-tightens the fields the table feed marks\n * required that the project feed and the detail read cannot be checked against.\n */\nexport const createEvents = (client: StorageOpenApiFetchClient) => {\n /**\n * Event feed of a branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/events/GET/v2/storage/branch/{branchId}/events\n */\n const getEvents = async ({ branchId, ...query }: GetEventsInput, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/events',\n { path: { branchId }, query },\n { signal },\n );\n\n return data as unknown as StorageEvent[];\n };\n\n /**\n * A single event. Ids are `uuid`s — the `id` a create answers with does not resolve here.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/events/GET/v2/storage/branch/{branchId}/events/{eventId}\n */\n const getEvent = async ({ branchId, eventId }: GetEventPath, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/events/{eventId}',\n { path: { branchId, eventId } },\n { signal },\n );\n\n return data as unknown as StorageEvent;\n };\n\n /**\n * Event feed of a table in the given branch. A dev branch only contains the tables created or\n * pulled into it, so a production table's events must be read with the default branch id.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/events/GET/v2/storage/branch/{branchId}/tables/{tableId}/events\n */\n const getTableEvents = async (\n { branchId, tableId, ...query }: GetTableEventsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/tables/{tableId}/events',\n { path: { branchId, tableId }, query },\n { signal },\n );\n\n return data as unknown as StorageEvent[];\n };\n\n /**\n * Event feed of a bucket in the given branch. Same payload as the table feed.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/events/GET/v2/storage/branch/{branchId}/buckets/{bucketId}/events\n */\n const getBucketEvents = async (\n { branchId, bucketId, ...query }: GetBucketEventsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/events',\n { path: { branchId, bucketId }, query },\n { signal },\n );\n\n return data as unknown as StorageEvent[];\n };\n\n /**\n * Writes an event into a branch's feed.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/events/POST/v2/storage/branch/{branchId}/events\n */\n const createEvent = async ({ branchId, ...body }: CreateEventInput, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/events',\n { path: { branchId }, body: body as unknown as CreateEventSchemaBody },\n { signal },\n );\n\n return data as unknown as CreatedEvent;\n };\n\n return {\n getEvents,\n getEvent,\n getTableEvents,\n getBucketEvents,\n createEvent,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n AddFileTagInput,\n DeleteFilePath,\n DeleteFileTagPath,\n File,\n GetFileContentPath,\n GetFilePath,\n GetFilesQuery,\n GetFilesSchemaParams,\n PrepareFileBody,\n PrepareFileSchemaBody,\n} from './types';\n\n/**\n * The reads are spec-derived; two defects remain.\n *\n * - `File` adds `isExpired`, which Storage never sends — hence the assertion on the two reads.\n * - The list is a GET the spec gives a required `ListFilesRequest` body; the API reads the query\n * instead, so its parameters object is asserted in.\n */\nexport const createFiles = (client: StorageOpenApiFetchClient) => {\n const getFile = async (fileId: GetFilePath['fileId'], signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/files/{fileId}',\n { path: { fileId } },\n { signal },\n );\n\n return data as File;\n };\n\n const getFiles = async (query?: GetFilesQuery, signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/files', { query } as GetFilesSchemaParams, {\n signal,\n queryArrayFormat: 'brackets',\n });\n\n return data as File[];\n };\n\n const deleteFile = async (fileId: DeleteFilePath['fileId']) => {\n await client.delete('/v2/storage/files/{fileId}', { path: { fileId } });\n };\n\n const addFileTag = async ({ fileId, ...body }: AddFileTagInput) => {\n await client.post('/v2/storage/files/{fileId}/tags', {\n path: { fileId },\n body,\n });\n };\n\n /**\n * Reads a file's bytes as text.\n *\n * - Storage serves the *stored* file's `Content-Type` (`FileContentService::guessContentType` maps\n * the extension), so a `.json` file arrives as `application/json`. `parseAs: 'text'` keeps the\n * client from parsing it — the exact bytes are the point of a preview, and a malformed `.json`\n * file must render rather than throw a `SyntaxError`.\n * - The spec declares the 200 contentless, so the string is asserted in.\n */\n const getFileContent = async (fileId: GetFileContentPath['fileId'], signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/files/{fileId}/content',\n { path: { fileId } },\n { signal, parseAs: 'text' },\n );\n\n return data as unknown as string;\n };\n\n const deleteFileTag = async (path: DeleteFileTagPath) => {\n await client.delete('/v2/storage/files/{fileId}/tags/{tagName}', { path });\n };\n\n const prepareFile = async (body: PrepareFileBody, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/files/prepare',\n { body: body as PrepareFileSchemaBody },\n { signal },\n );\n\n return data;\n };\n\n return {\n getFile,\n getFileContent,\n getFiles,\n deleteFile,\n addFileTag,\n deleteFileTag,\n prepareFile,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type { GetJobPath, GetJobsQuery, GetJobsSchemaQuery, Job, JobOperation } from './types';\n\n/**\n * The job read, declared rather than inferred.\n *\n * - `poller.ts` types the read it needs as this same alias, so the two are one declaration. Restating\n * the signature over there gives TypeScript two generic signatures to compare and it answers TS2590\n * — the operation union is too wide to expand twice.\n */\nexport type GetJob = <T extends JobOperation | string = string>(\n jobId: GetJobPath['jobId'],\n signal?: AbortSignal,\n) => Promise<Job<T>>;\n\n/**\n * Both returns are asserted in, and `Job<T>` is the contract to trust.\n *\n * - The spec's `JobResponse` is a flat shape with `status: string`; `Job<T>` is a discriminated union\n * over `status` whose `results` is typed per operation, and `operationParams`/`results` are bare\n * objects there.\n */\nexport const createJobs = (openApiClient: StorageOpenApiFetchClient) => {\n // The annotation carries the operation type, so the body has no `T` to name — hence `never`, which\n // satisfies whatever the caller asked for.\n const getJob: GetJob = async (jobId, signal) => {\n const { data } = await openApiClient.get(\n '/v2/storage/jobs/{jobId}',\n { path: { jobId } },\n { signal },\n );\n\n return data as unknown as never;\n };\n\n const getJobs = async <T extends JobOperation | string = string>(\n query?: GetJobsQuery,\n signal?: AbortSignal,\n ) => {\n const { data } = await openApiClient.get(\n '/v2/storage/jobs',\n { query: query as GetJobsSchemaQuery },\n { signal, queryArrayFormat: 'brackets' },\n );\n\n return data as unknown as Job<T>[];\n };\n\n return { getJob, getJobs };\n};\n","import { jobStatus } from '../../domain/jobStatus';\nimport { poller } from '../../utils/async';\n\nimport type { GetJob } from './jobs/jobs';\nimport type { GetJobPath, JobOperation } from './jobs/types';\n\nconst DEFAULT_POLL_INTERVAL = 2000;\n\nexport type StorageJobPollOptions = {\n interval?: number;\n maxAttempts?: number;\n timeout?: number;\n signal?: AbortSignal;\n};\n\nexport type StorageJobPoller = ReturnType<typeof createJobPoller>;\n\nexport const createJobPoller =\n ({ getJob }: { getJob: GetJob }) =>\n <Operation extends JobOperation | string = string>(\n { id, operationName }: { id: GetJobPath['jobId']; operationName: string },\n { interval, maxAttempts, timeout, signal }: StorageJobPollOptions = {},\n ) =>\n poller({\n pollKey: ['storage.job', { jobId: id, operation: operationName }] as const,\n pollFn: ({ pollKey: [, params], signal: pollSignal }) =>\n getJob<Operation>(params.jobId, pollSignal),\n until: ({ data }) => jobStatus.storage.isTerminal(data.status),\n backoff: { type: 'constant', interval: interval ?? DEFAULT_POLL_INTERVAL },\n maxAttempts,\n timeout,\n signal,\n });\n","import type { MiddlewareFn } from '../../fetchClient';\nimport { KeboolaHttpHeader } from '../../internal';\n\nconst isTokenRefreshEndpoint = (request: Request): boolean => {\n const url = new URL(request.url);\n return request.method === 'POST' && /\\/tokens\\/[^/]+\\/refresh$/.test(url.pathname);\n};\n\nconst tryParseNewToken = (data: unknown): string | null => {\n if (data === null || typeof data !== 'object') return null;\n const token = (data as Record<string, unknown>).token;\n return typeof token === 'string' ? token : null;\n};\n\ntype Options = {\n accessToken: string;\n onRefresh?: (newToken: string) => void;\n};\n\nexport const createRefreshTokenMiddlware = ({ accessToken, onRefresh }: Options): MiddlewareFn => {\n let current = accessToken;\n\n return (next) => async (request) => {\n request.request.headers.set(KeboolaHttpHeader.STORAGE_API_TOKEN, current);\n\n if (!isTokenRefreshEndpoint(request.request)) return next(request);\n\n const response = await next(request);\n const newToken = tryParseNewToken(response.data);\n if (newToken === null) return response;\n\n current = newToken;\n onRefresh?.(current);\n\n return response;\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\nimport type { Table } from '../tables/types';\n\nimport type {\n GlobalSearchQuery,\n GlobalSearchResponse,\n GlobalSearchSchemaQuery,\n SearchTablesQuery,\n SearchTablesSchemaQuery,\n} from './types';\n\n/**\n * Both responses are asserted in, because the spec stubs them:\n *\n * - `GET /v2/storage/global-search` (`SearchAction`) declares its 200 as `Record<string, never>` →\n * really `{ all, items, byType, byProject }`\n * - `GET /v2/storage/search/tables` (`SearchTablesAction`) declares a contentless 200 → really\n * `Table[]`\n *\n * Both query casts are type-only, so each query object reaches the wire exactly as the caller wrote\n * it. That matters for `global-search`: the spec names its repeatable filters `types[]` / `projectIds[]`\n * / `branchTypes[]` / `branchIds[]`, but this endpoint has always been called with the bare names,\n * which `qs` serializes as `types[0]=bucket&types[1]=table` — also an array to the backend. Renaming\n * the fields to satisfy the document would change what Storage receives, and no test would catch it.\n */\nexport const createSearch = (client: StorageOpenApiFetchClient) => {\n /**\n * Project- and organization-wide search across buckets, tables, configurations, flows, ….\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/global-search/GET/v2/storage/global-search\n */\n const globalSearch = async (query: GlobalSearchQuery, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/global-search',\n { query: query as unknown as GlobalSearchSchemaQuery },\n { signal },\n );\n\n return data as unknown as GlobalSearchResponse;\n };\n\n /**\n * Finds tables by a metadata key, value or provider, across the whole project.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/search/GET/v2/storage/search/tables\n */\n const searchTables = async (query: SearchTablesQuery, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/search/tables',\n { query: query as unknown as SearchTablesSchemaQuery },\n { signal, queryArrayFormat: 'comma' },\n );\n\n return data as unknown as Table[];\n };\n\n return { globalSearch, searchTables };\n};\n","import type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type { CreateSnapshotInput, GetTableSnapshotsInput, Snapshot } from './types';\n\nexport const createSnapshots = (client: StorageOpenApiFetchClient) => {\n /**\n * Creates a snapshot of a table in the given branch. Async — returns a job.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/POST/v2/storage/branch/{branchId}/tables/{id}/snapshots\n */\n const createSnapshotAsync = async (\n { branchId, tableId, ...body }: CreateSnapshotInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/tables/{id}/snapshots',\n { path: { branchId, id: tableId }, body },\n { signal },\n );\n\n // The schema types every job the same way (`id` as a string, `operationName` as a plain\n // string); narrow to the discriminated job the rest of the client and `sdk.storage` expect.\n return data as unknown as Job<'tableSnapshotCreate'>;\n };\n\n /**\n * Reads a single snapshot. Not branch-scoped — a snapshot id is unique across branches.\n *\n * Spec now declares the response, but names the timestamp `createdTime` where `Snapshot` says\n * `created`, so the shape is still asserted in. It is the same `Snapshot` the table listing returns.\n *\n * @link https://api.keboola.com/?service=storage#storage/GET/v2/storage/snapshots/{snapshotId}\n */\n const getSnapshot = async (snapshotId: string, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/snapshots/{snapshotId}',\n // Spec types this segment an integer while `Snapshot['id']` — the value a caller has — is a\n // string, so the id read off a snapshot cannot be passed without this bridge.\n { path: { snapshotId: snapshotId as unknown as number } },\n { signal },\n );\n\n return data as unknown as Snapshot;\n };\n\n /**\n * Deletes a snapshot, returning the storage job that performs it (`null` when the backend answers\n * with no content). The endpoint is not branch-scoped — a snapshot id is unique across branches, so\n * there is no `/branch/{branchId}/snapshots/{snapshotId}` variant.\n *\n * Spec declares the 202 as a `JobResponse` — flat, with `status: string` — where `Job` is a\n * discriminated union over `status`, and says nothing about the no-content answer, so both are\n * asserted in.\n *\n * @link https://api.keboola.com/?service=storage#storage/DELETE/v2/storage/snapshots/{snapshotId}\n */\n const deleteSnapshotAsync = async (snapshotId: string, signal?: AbortSignal) => {\n const { data } = await client.delete(\n '/v2/storage/snapshots/{snapshotId}',\n // Same integer-vs-string mismatch as the read above.\n { path: { snapshotId: snapshotId as unknown as number } },\n { signal },\n );\n\n return data as unknown as Job | null;\n };\n\n /**\n * Lists the snapshots of a table in the given branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/GET/v2/storage/branch/{branchId}/tables/{id}/snapshots\n */\n const getTableSnapshots = async (\n { branchId, tableId, ...query }: GetTableSnapshotsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/tables/{id}/snapshots',\n { path: { branchId, id: tableId }, query },\n { signal },\n );\n\n // Schema types the items as `Record<string, never>`; cast to the real shape.\n return data as unknown as Snapshot[];\n };\n\n return {\n createSnapshotAsync,\n deleteSnapshotAsync,\n getSnapshot,\n getTableSnapshots,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type { RunIdStats } from './types';\n\n/**\n * `GET /v2/storage/stats` (`StatsListAction`) declares a single contentless `default` response, so the\n * generated return type is the response envelope (`{ headers, content?: never }`) rather than a\n * payload — hence the assertion to the hand-authored `RunIdStats`. The `runId` query is spec-derived.\n */\nexport const createStats = (client: StorageOpenApiFetchClient) => {\n /**\n * Returns import/export table stats for a job run, identified by its runId.\n *\n * @link https://api.keboola.com/?service=storage#storage/GET/v2/storage/stats\n */\n const getRunIdStats = async (runId: string, signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/stats', { query: { runId } }, { signal });\n\n return data as unknown as RunIdStats;\n };\n\n return { getRunIdStats };\n};\n","import { concurrent } from '../../../utils';\nimport type { Job } from '../jobs/types';\nimport type { GenericFetchClient, StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateAliasTableBody,\n CreateAliasTableInput,\n CreateTableAsyncInput,\n CreateTableAsyncSchemaBody,\n CreateTableDefinitionInput,\n CreateTableDefinitionSchemaBody,\n DeleteTableInput,\n DeleteTableMetadataInput,\n DeleteTableRowsInput,\n DeleteTableRowsSchemaQuery,\n DeleteTablesInput,\n ExportAsyncInput,\n GetDataPreviewInput,\n GetDataPreviewSchemaQuery,\n GetTableInput,\n GetTablesInput,\n GetTablesSchemaQuery,\n ImportAsyncInput,\n PreviewData,\n PullTableAsyncInput,\n SaveTableMetadataInput,\n SaveTableMetadataSchemaBody,\n SetAliasTableFilterInput,\n SetAliasTableFilterSchemaBody,\n Table,\n TableDetail,\n TableExportAsyncSchemaBody,\n TableImportAsyncSchemaBody,\n UpdateTableBody,\n UpdateTableDefinitionInput,\n UpdateTableDefinitionSchemaBody,\n UpdateTableInput,\n} from './types';\n\nexport const createTables = (\n client: StorageOpenApiFetchClient,\n genericClient: GenericFetchClient,\n) => {\n /**\n * Returns every table in the given branch. Filter client-side by\n * `table.bucket?.id` (requires `include: ['buckets']`) or by the\n * `{bucketId}.` prefix in `table.id` (IDs use `{bucketId}.{tableName}`,\n * e.g. `in.c-main.users`).\n *\n * @link https://api.keboola.com/?service=storage#storage/GET/v2/storage/branch/{branchId}/tables\n */\n const getTables = async (\n { branchId, include = [], ...query }: GetTablesInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/tables',\n { path: { branchId }, query: { include, ...query } as unknown as GetTablesSchemaQuery },\n { signal, queryArrayFormat: 'comma' },\n );\n\n return data as unknown as Table[];\n };\n\n /**\n * Returns a table from the given branch. A dev branch only contains the tables created or pulled\n * into it, so a production table must be read with the default branch id.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/GET/v2/storage/branch/{branchId}/tables/{id}\n */\n const getTable = async ({ branchId, id }: GetTableInput, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/tables/{id}',\n { path: { branchId, id } },\n { signal },\n );\n\n // `TableDetail` is the real shape, and hand-written — see its own doc block for what the\n // schema loses and what has to be tracked by hand.\n return data as unknown as TableDetail;\n };\n\n /**\n * Deletes a table (synchronous). `force` also drops the aliases and links pointing at it, which\n * the API otherwise refuses.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/DELETE/v2/storage/branch/{branchId}/tables/{id}\n */\n const deleteTable = async (\n { branchId, id, ...query }: DeleteTableInput,\n signal?: AbortSignal,\n ) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/tables/{id}',\n { path: { branchId, id }, query },\n { signal },\n );\n };\n\n const deleteTables = async ({ branchId, ids, force }: DeleteTablesInput) => {\n await concurrent({\n items: ids,\n process: (id) => deleteTable({ branchId, id, force }),\n });\n };\n\n const deleteTableRows = async (\n { branchId, id, ...query }: DeleteTableRowsInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.delete(\n '/v2/storage/branch/{branchId}/tables/{id}/rows',\n {\n path: { branchId, id },\n query: query as unknown as DeleteTableRowsSchemaQuery,\n },\n { signal },\n );\n\n return data as unknown as Job<'tableRowsDelete'>;\n };\n\n /**\n * Returns the first rows of a table in the given branch.\n *\n * The swagger declares `query?: never` here, so it cannot express `limit` / `whereFilters` /\n * `orderBy` / `fulltextSearch`, all of which the endpoint accepts — hence the hand-authored\n * `GetDataPreviewQuery` and the asserted query.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/GET/v2/storage/branch/{branchId}/tables/{tableId}/data-preview\n */\n const getDataPreview = async (\n { branchId, tableId, ...query }: GetDataPreviewInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/tables/{tableId}/data-preview',\n {\n path: { branchId, tableId },\n query: { format: 'json', ...query } as unknown as GetDataPreviewSchemaQuery,\n },\n { signal },\n );\n\n return data as unknown as PreviewData;\n };\n\n /**\n * Exports a table to a file. Async — returns a job.\n *\n * Unbranched, though the document also declares\n * `/v2/storage/branch/{branchId}/tables/{tableId}/export-async`: export was outside the scope of\n * the table migration (UT-4785), so switching it would change behaviour for a flow that migration\n * did not touch. It is the one remaining branch-capable method here that does not take a\n * `branchId`, and moving it is a clean follow-up.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/POST/v2/storage/tables/{tableId}/export-async\n */\n const exportAsync = async ({ tableId, ...body }: ExportAsyncInput, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/tables/{tableId}/export-async',\n { path: { tableId }, body: body as TableExportAsyncSchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tableExport'>;\n };\n\n const createTableAsync = async (\n { branchId, id, ...body }: CreateTableAsyncInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/buckets/{id}/tables-async',\n // `CreateTableAsyncBody` corrects the document per variant — notably `primaryKey` is a\n // comma-separated string, not `string[]` — so the two do not overlap directly.\n { path: { branchId, id }, body: body as unknown as CreateTableAsyncSchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tableCreate'>;\n };\n\n /**\n * Creates a typed table from an explicit column definition (no data) in the given bucket.\n * The endpoint is async: it returns a `tableDefinitionCreate` storage job the caller can poll.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/buckets/POST/v2/storage/branch/{branchId}/buckets/{bucketId}/tables-definition\n */\n const createTableDefinitionAsync = async (\n { branchId, bucketId, ...body }: CreateTableDefinitionInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/buckets/{bucketId}/tables-definition',\n { path: { branchId, bucketId }, body: body as unknown as CreateTableDefinitionSchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tableDefinitionCreate'>;\n };\n\n const importAsync = async ({ branchId, id, ...body }: ImportAsyncInput, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/tables/{id}/import-async',\n // `TableImportAsyncBody` relaxes the fields the document marks required but the endpoint\n // defaults; see its definition.\n { path: { branchId, id }, body: body as TableImportAsyncSchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tableImport'>;\n };\n\n /**\n * Updates a table's definition in place — `displayName`, `description`,\n * `isDescriptionSystemManaged`, and per-column\n * `length`/`nullable`/`default`/`description`. The endpoint is async: it\n * returns a `tableDefinitionUpdate` storage job that the caller can poll.\n *\n * Send only the fields being changed; at least one is required. Description\n * patches apply to non-typed tables too, so a description-only edit needs\n * neither `displayName` nor `columns`.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/PUT/v2/storage/branch/{branchId}/tables/{tableId}/definition\n */\n const updateTableDefinition = async (\n { branchId, tableId, ...body }: UpdateTableDefinitionInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.put(\n '/v2/storage/branch/{branchId}/tables/{tableId}/definition',\n { path: { branchId, tableId }, body: body as unknown as UpdateTableDefinitionSchemaBody },\n { signal },\n );\n\n return data as unknown as Job<'tableDefinitionUpdate'>;\n };\n\n /**\n * Updates a table's display name (synchronous). For typed-table column/definition changes use\n * `updateTableDefinition` instead.\n *\n * On the generic client and unbranched, unlike its siblings — but only because of where the\n * endpoint lives, not because of what it supports. It is still `Storage_TablesController::putAction`\n * in connection's legacy Zend app, and the Storage document is generated from the `#[OA\\...]`\n * attributes on the migrated Symfony controllers, so no annotation fix closes this gap; the\n * controller has to move first. The action does take a `DevBranch`, and `put` is in the\n * branch-implemented route list, so `/branch/{branchId}/tables/{id}` works — there is simply no\n * `paths` entry to derive it from, and the branch prefix is left to the caller's middleware.\n *\n * The synchronous form this calls is deprecated backend-side (`DEPRECATION_SYNC_UPDATE_TABLE` is\n * logged per request); `?async=true` returns a `tableUpdate` job instead. Switching means polling,\n * so it belongs with the caller that renames tables, not here.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables\n */\n const updateTable = async ({ tableId, ...body }: UpdateTableInput, signal?: AbortSignal) => {\n const { data } = await genericClient.put<Table, { id: string }, never, UpdateTableBody>(\n '/v2/storage/tables/{id}',\n { path: { id: tableId }, body },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Pulls a table from the default branch into the given dev branch.\n *\n * The path is branch-scoped: the unbranched `/v2/storage/tables/{id}/pull` this used to call is\n * absent from the Storage document and 404s for every table (the live nightly caught it), because\n * nothing in it says which branch to pull into.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables\n */\n const pullTableAsync = async ({ branchId, id }: PullTableAsyncInput, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/tables/{id}/pull',\n { path: { branchId: branchId as unknown as number, id } },\n { signal },\n );\n\n return data as unknown as Job<'devBranchTablePull'>;\n };\n\n /**\n * Creates an alias table in the given bucket. Usually returns the created alias `Table`\n * synchronously; for BigQuery VIEW-persisted aliases the API instead returns an `aliasCreate`\n * storage job, so the response is typed as a union — narrow on `operationName` before use.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables\n */\n const createAliasTable = async (\n { bucketId, ...body }: CreateAliasTableInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await genericClient.post<\n Table | Job<'aliasCreate'>,\n { bucketId: string },\n never,\n CreateAliasTableBody\n >('/v2/storage/buckets/{bucketId}/table-aliases', { path: { bucketId }, body }, { signal });\n\n return data;\n };\n\n /**\n * Sets (replaces) the filter of an alias table (synchronous).\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables\n */\n const setAliasTableFilter = async (\n { tableId, ...body }: SetAliasTableFilterInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/tables/{tableId}/alias-filter',\n { path: { tableId }, body: body as SetAliasTableFilterSchemaBody },\n { signal },\n );\n\n return data as unknown as Table;\n };\n\n /**\n * Removes the filter of an alias table (synchronous).\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables\n */\n const removeAliasTableFilter = async (tableId: string, signal?: AbortSignal) => {\n await client.delete(\n '/v2/storage/tables/{tableId}/alias-filter',\n { path: { tableId } },\n { signal },\n );\n };\n\n /**\n * Adds or updates metadata on a table in the given branch, and on its columns when the payload\n * names any — which is why the response carries `columnsMetadata` alongside `metadata`.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/POST/v2/storage/branch/{branchId}/tables/{id}/metadata\n */\n const saveTableMetadata = async (\n { branchId, id, ...body }: SaveTableMetadataInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/tables/{id}/metadata',\n // `CreateTableMetadataRequest` declares `provider` and `metadata` — which `SaveMetadataBody`\n // carries — plus a required `columnsMetadata` the API defaults and no caller sends.\n { path: { branchId, id }, body: body as unknown as SaveTableMetadataSchemaBody },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Deletes a single metadata entry from a table in the given branch.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tables/DELETE/v2/storage/branch/{branchId}/tables/{id}/metadata/{metadataId}\n */\n const deleteTableMetadata = async (\n { branchId, id, metadataId }: DeleteTableMetadataInput,\n signal?: AbortSignal,\n ) => {\n await client.delete(\n '/v2/storage/branch/{branchId}/tables/{id}/metadata/{metadataId}',\n { path: { branchId, id, metadataId } },\n { signal },\n );\n };\n\n return {\n getTables,\n getTable,\n getDataPreview,\n deleteTable,\n deleteTables,\n deleteTableRows,\n exportAsync,\n createTableAsync,\n createTableDefinitionAsync,\n importAsync,\n updateTableDefinition,\n updateTable,\n pullTableAsync,\n createAliasTable,\n setAliasTableFilter,\n removeAliasTableFilter,\n saveTableMetadata,\n deleteTableMetadata,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateTokenBody,\n CreateTokenSchemaBody,\n GetTokenEventsInput,\n ShareTokenInput,\n ShareTokenSchemaBody,\n StorageToken,\n UpdateTokenInput,\n UpdateTokenSchemaBody,\n} from './types';\n\n/**\n * The `as` casts below work around a broken generated schema, not our own types:\n *\n * - id path params typed `number`; every id the API returns is a `string`\n * - `UpdateTokenRequest` / `ShareTokenRequest` modelled as empty objects\n * - update `200` declares no body, but returns the updated token\n * - create body marks fields required that the API defaults\n *\n * `./types` holds the real contracts. Drop each cast as the backend fixes the schema.\n */\nexport const createTokens = (client: StorageOpenApiFetchClient) => {\n const verify = async (signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/tokens/verify', {}, { signal });\n\n return data as unknown as StorageToken;\n };\n\n const refresh = async (id: string, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/tokens/{id}/refresh',\n { path: { id: id as unknown as number } },\n { signal },\n );\n\n return data as unknown as StorageToken;\n };\n\n /**\n * Lists storage tokens accessible by the current token.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tokens/GET/v2/storage/tokens\n */\n const getTokens = async (signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/tokens', {}, { signal });\n\n return data;\n };\n\n /**\n * Creates a new storage token. The response includes the freshly issued `token` secret.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tokens/POST/v2/storage/tokens\n */\n const createToken = async (body: CreateTokenBody, signal?: AbortSignal) => {\n const { data } = await client.post(\n '/v2/storage/tokens',\n { body: body as CreateTokenSchemaBody },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Updates an existing storage token (description, permissions, expiration, …).\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tokens/PUT/v2/storage/tokens/{id}\n */\n const updateToken = async ({ id, ...body }: UpdateTokenInput, signal?: AbortSignal) => {\n const { data } = await client.put(\n '/v2/storage/tokens/{id}',\n { path: { id: id as unknown as number }, body: body as UpdateTokenSchemaBody },\n { signal },\n );\n\n return data as unknown as StorageToken;\n };\n\n /**\n * Deletes a storage token.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tokens/DELETE/v2/storage/tokens/{id}\n */\n const deleteToken = async (id: string, signal?: AbortSignal) => {\n await client.delete(\n '/v2/storage/tokens/{id}',\n { path: { id: id as unknown as number } },\n { signal },\n );\n };\n\n /**\n * Shares a storage token with another user by email.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tokens/POST/v2/storage/tokens/{id}/share\n */\n const shareToken = async ({ id, ...body }: ShareTokenInput, signal?: AbortSignal) => {\n await client.post(\n '/v2/storage/tokens/{id}/share',\n { path: { id: id as unknown as number }, body: body as unknown as ShareTokenSchemaBody },\n { signal },\n );\n };\n\n /**\n * Event feed of a single token — what that token did, not what happened to it.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/tokens/GET/v2/storage/tokens/{id}/events\n */\n const getTokenEvents = async ({ id, ...query }: GetTokenEventsInput, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/tokens/{id}/events',\n { path: { id: id as unknown as number }, query },\n { signal },\n );\n\n return data;\n };\n\n return {\n verify,\n refresh,\n getTokens,\n createToken,\n updateToken,\n deleteToken,\n shareToken,\n getTokenEvents,\n };\n};\n","import type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n CreateTriggerBody,\n GetTriggersQuery,\n Trigger,\n UpdateTriggerInput,\n UpdateTriggerRequest,\n} from './types';\n\nexport const createTriggers = (client: StorageOpenApiFetchClient) => {\n /**\n * Lists triggers in the project, optionally filtered by component / configuration.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/triggers/GET/v2/storage/triggers\n */\n const getTriggers = async (query?: GetTriggersQuery, signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage/triggers', { query }, { signal });\n\n return data;\n };\n\n /**\n * Creates a new trigger for a component configuration.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/triggers/POST/v2/storage/triggers\n */\n const createTrigger = async (body: CreateTriggerBody, signal?: AbortSignal) => {\n const { data } = await client.post('/v2/storage/triggers', { body }, { signal });\n\n return data;\n };\n\n /**\n * Updates an existing trigger, patching only the fields the input carries.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/triggers/PUT/v2/storage/triggers/{triggerId}\n */\n const updateTrigger = async (\n { triggerId, ...body }: UpdateTriggerInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.put(\n '/v2/storage/triggers/{triggerId}',\n {\n path: { triggerId } as unknown as { triggerId: number },\n body: body as UpdateTriggerRequest,\n },\n { signal },\n );\n\n return data;\n };\n\n /**\n * Deletes a trigger.\n *\n * @link https://api.keboola.com/?service=storage#storage/tag/triggers/DELETE/v2/storage/triggers/{triggerId}\n */\n const deleteTrigger = async (triggerId: Trigger['id'], signal?: AbortSignal) => {\n await client.delete(\n '/v2/storage/triggers/{triggerId}',\n { path: { triggerId } as unknown as { triggerId: number } },\n { signal },\n );\n };\n\n return {\n getTriggers,\n createTrigger,\n updateTrigger,\n deleteTrigger,\n };\n};\n","import { concurrent } from '../../../utils';\nimport type { Job } from '../jobs/types';\nimport type { StorageOpenApiFetchClient } from '../storageClient';\n\nimport type {\n DeleteWorkspaceObjectInput,\n DeleteWorkspacePath,\n DeleteWorkspacesInput,\n GetWorkspaceObjectsPath,\n GetWorkspacePath,\n GetWorkspaceSaml2LoginPath,\n GetWorkspacesPath,\n ResetWorkspacePassword,\n ResetWorkspacePasswordPath,\n SetWorkspacePublicInput,\n UnloadWorkspaceInput,\n Workspace,\n WorkspaceInputMappingLoadPreviewInput,\n WorkspaceSaml2Login,\n} from './types';\n\n/**\n * Paths, queries and bodies come from the spec; only the returns are asserted in.\n *\n * - `WorkspaceDetailResponse` describes a narrower connection than callers get, so `Workspace` is\n * hand-authored (see `./types`) — that covers the list, detail and public-key returns.\n * - The password, SSO and delete operations answer a contentless `default`.\n * - `JobResponse` is a flat shape with `status: string`, while `Job<T>` is a discriminated union over\n * `status` carrying typed `results`.\n *\n * `workspaceId` is a `number` in every input; the operations whose spec segment is a `string` take\n * `String(workspaceId)` here rather than pushing the spec's inconsistency onto callers.\n */\nexport const createWorkspaces = (client: StorageOpenApiFetchClient) => {\n const getWorkspaces = async (path: GetWorkspacesPath, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/workspaces',\n { path },\n { signal },\n );\n\n return data as Workspace[];\n };\n\n const getWorkspace = async (path: GetWorkspacePath, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}',\n { path },\n { signal },\n );\n\n return data as Workspace;\n };\n\n const deleteWorkspace = async ({ branchId, workspaceId }: DeleteWorkspacePath) => {\n await client.delete('/v2/storage/branch/{branchId}/workspaces/{workspaceId}', {\n path: { branchId, workspaceId },\n });\n };\n\n const deleteWorkspaces = async ({ workspaceIds, branchId }: DeleteWorkspacesInput) => {\n await concurrent({\n items: workspaceIds,\n process: async (workspaceId) => deleteWorkspace({ branchId, workspaceId }),\n concurrency: 5,\n });\n };\n\n const deleteWorkspaceAsync = async ({ branchId, workspaceId }: DeleteWorkspacePath) => {\n const { data } = await client.delete('/v2/storage/branch/{branchId}/workspaces/{workspaceId}', {\n path: { branchId, workspaceId },\n query: { async: true },\n });\n\n return data as unknown as Job<'workspaceDrop'>;\n };\n\n const resetWorkspacePassword = async ({ branchId, workspaceId }: ResetWorkspacePasswordPath) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}/password',\n { path: { branchId, workspaceId } },\n );\n\n return data as unknown as ResetWorkspacePassword;\n };\n\n const getWorkspaceSaml2Login = async (path: GetWorkspaceSaml2LoginPath, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}/saml2-login',\n { path },\n { signal },\n );\n\n return data as unknown as WorkspaceSaml2Login;\n };\n\n /**\n * Set the public key for the workspace user, or migrate workspace from password to key auth.\n * Supported only on Snowflake.\n * When called, either a new key is created, or the older one is replaced.\n */\n const setWorkspacePublicKey = async ({\n branchId,\n workspaceId,\n ...body\n }: SetWorkspacePublicInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}/public-key',\n { path: { branchId, workspaceId }, body },\n );\n\n return data as Workspace;\n };\n\n const getWorkspaceObjects = async (path: GetWorkspaceObjectsPath, signal?: AbortSignal) => {\n const { data } = await client.get(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}/objects',\n { path },\n { signal },\n );\n\n return data;\n };\n\n const deleteWorkspaceObjectsAsync = async ({\n branchId,\n workspaceId,\n ...body\n }: DeleteWorkspaceObjectInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}/objects/batch-delete',\n { path: { branchId, workspaceId }, body },\n );\n\n return data as unknown as Job<'workspaceBatchDeleteObjects'>;\n };\n\n const unloadWorkspace = async ({ branchId, workspaceId, ...query }: UnloadWorkspaceInput) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/workspaces/{workspaceId}/unload',\n {\n path: { branchId, workspaceId },\n query,\n },\n );\n\n return data;\n };\n\n /**\n * Preview the resolved load types for a component-style input-mapping config without a workspace.\n * Returns the preferred load type plus the possible load types per table for the resolved backend,\n * without creating a job. The backend is resolved per item from the item `backend` field, then the\n * `backend` argument, then the project default.\n */\n const inputMappingLoadPreview = async (\n { branchId, body, backend }: WorkspaceInputMappingLoadPreviewInput,\n signal?: AbortSignal,\n ) => {\n const { data } = await client.post(\n '/v2/storage/branch/{branchId}/input-mapping-load/preview',\n {\n path: { branchId },\n query: backend ? { backend } : undefined,\n body,\n },\n { signal },\n );\n\n return data;\n };\n\n return {\n getWorkspace,\n getWorkspaces,\n deleteWorkspace,\n resetWorkspacePassword,\n deleteWorkspaces,\n deleteWorkspaceAsync,\n setWorkspacePublicKey,\n getWorkspaceSaml2Login,\n getWorkspaceObjects,\n deleteWorkspaceObjectsAsync,\n unloadWorkspace,\n inputMappingLoadPreview,\n };\n};\n","import { type MiddlewareFn } from '../../fetchClient';\nimport { createGenericFetchClient, createOpenapiFetchClient } from '../../fetchClient';\nimport { createAuthHeaders } from '../auth';\nimport type { ClientInitOptions } from '../types';\nimport { validateConnectionStatus } from '../validateConnectionStatus';\n\nimport type { paths } from './__generated__/schema';\nimport { createMergeRequests } from './mergeRequests/mergeRequests';\nimport { createBranches } from './branches';\nimport { createBucketExternal } from './bucketExternal';\nimport { createBucketListings } from './bucketListings';\nimport { createBuckets } from './buckets';\nimport { createBucketSharing } from './bucketSharing';\nimport { createColumns } from './columns';\nimport { createComponents } from './components';\nimport { createConfigurationMetadata } from './configurationMetadata';\nimport { createConfigurationRows } from './configurationRows';\nimport { createConfigurations } from './configurations';\nimport { createConfigurationVersions } from './configurationVersions';\nimport { createConfigurationWorkspaces } from './configurationWorkspaces';\nimport { createEvents } from './events';\nimport { createFiles } from './files';\nimport { createJobs } from './jobs';\nimport { createJobPoller } from './poller';\nimport { createRefreshTokenMiddlware } from './refreshTokenMiddleware';\nimport { createSearch } from './search';\nimport { createSnapshots } from './snapshots';\nimport { createStats } from './stats';\nimport { createTables } from './tables';\nimport { createTokens } from './tokens';\nimport { createTriggers } from './triggers';\nimport type { GetStackInfoQuery, GetStackInfoSchemaParams, StackInfo } from './types';\nimport { createWorkspaces } from './workspaces';\n\nexport type GenericFetchClient = ReturnType<typeof createGenericFetchClient>;\nexport type StorageOpenApiFetchClient = ReturnType<typeof createOpenapiFetchClient<paths>>;\n\ntype StorageClientInitOptions = Omit<ClientInitOptions, 'middlewares'> & {\n middlewares?: MiddlewareFn[];\n onRefreshToken?: (newToken: string) => void;\n};\n\nexport const createStorageClient = ({\n baseUrl,\n auth,\n middlewares = [],\n onRefreshToken,\n}: StorageClientInitOptions) => {\n const headers = createAuthHeaders(auth);\n\n // Token-rotation tracking only matters on the client that calls the refresh\n // endpoint. A reader (no `onRefreshToken`) keeps its token fresh via a caller-\n // supplied token-sync middleware instead, so the refresh middleware must not\n // tag along — it would set the header from its stale private `current`.\n // SAPI in-band token rotation only applies to a project-bound storage token. Bearer carries no\n // storage token (its session middleware sets the Authorization header), so it never rotates here.\n const allMiddlewares =\n onRefreshToken && auth.type === 'sapi-token'\n ? [\n ...middlewares,\n createRefreshTokenMiddlware({ accessToken: auth.token, onRefresh: onRefreshToken }),\n ]\n : middlewares;\n\n const genericClient = createGenericFetchClient({\n baseUrl,\n middlewares: allMiddlewares,\n headers,\n validateStatus: validateConnectionStatus,\n });\n\n const client = createOpenapiFetchClient<paths>({\n baseUrl,\n middlewares: allMiddlewares,\n headers,\n validateStatus: validateConnectionStatus,\n });\n\n const getStackInfo = async (query?: GetStackInfoQuery, signal?: AbortSignal) => {\n const { data } = await client.get('/v2/storage', { query } as GetStackInfoSchemaParams, {\n signal,\n });\n\n return data as StackInfo;\n };\n\n // Host-level: Connection serves the storage, management and auth APIs off one baseUrl, so this\n // probes the host, not this API's prefix — `/v2/storage/health-check`, `/manage/health-check`\n // and `/v1/auth/health-check` all 404.\n const healthCheck = async (signal?: AbortSignal) => {\n const { data } = await genericClient.get('/health-check', {}, { signal });\n return data;\n };\n\n const jobs = createJobs(client);\n const poller = createJobPoller({ getJob: jobs.getJob });\n\n return {\n poller,\n healthCheck,\n getStackInfo,\n jobs,\n\n buckets: createBuckets(client, genericClient),\n bucketSharing: createBucketSharing(client),\n bucketListings: createBucketListings(client),\n bucketExternal: createBucketExternal(client),\n tables: createTables(client, genericClient),\n columns: createColumns(client),\n snapshots: createSnapshots(client),\n\n branches: createBranches(client, poller),\n mergeRequests: createMergeRequests(client),\n\n events: createEvents(client),\n files: createFiles(client),\n workspaces: createWorkspaces(client),\n tokens: createTokens(client),\n triggers: createTriggers(client),\n search: createSearch(client),\n stats: createStats(client),\n\n components: createComponents(client),\n configurations: createConfigurations(client),\n configurationRows: createConfigurationRows(client),\n configurationWorkspaces: createConfigurationWorkspaces(client),\n configurationMetadata: createConfigurationMetadata(client),\n configurationVersions: createConfigurationVersions(client),\n };\n};\n"],"mappings":"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"}
|