{"version":3,"file":"shared-assets.cjs","names":["resolveSpaceId","uploadToS3"],"sources":["../../src/resources/shared-assets.ts"],"sourcesContent":["import * as mapi from \"../generated/mapi/sdk.gen\";\nimport type {\n  CreateSpaceSharedAssetData,\n  CreateSpaceSharedAssetResponses,\n  ListSpaceSharedAssetsData,\n  ListSpaceSharedAssetsResponses,\n} from \"../generated/mapi/types.gen\";\nimport type { Asset, AssetUpdate } from \"../generated/mapi/types-aliased.gen\";\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from \"../client\";\nimport { uploadToS3 } from \"./assets\";\nimport { resolveSpaceId, type SpaceIdPathOverride } from \"./shared\";\n\n/**\n * Query params accepted by `POST /v1/spaces/{space_id}/shared_assets` (the\n * sign call that starts an upload).\n *\n * Two behaviors of this endpoint are absent from the OpenAPI spec, so they are\n * modelled here: passing `id` re-signs an upload for an *existing* shared\n * asset (how `update()` replaces a file in place), and `asset_folder_id` may\n * then be omitted because the folder is taken from that asset. Every other\n * field stays as the spec defines it.\n */\ntype SignSharedAssetQuery = Omit<CreateSpaceSharedAssetData[\"query\"], \"asset_folder_id\"> & {\n  asset_folder_id?: number;\n  id?: number;\n};\n\n/**\n * Fields for initiating a shared (org-level) asset upload. Mirrors the local\n * asset upload request; `short_filename` maps to the server's `filename`.\n */\nexport type SharedAssetUploadRequest = {\n  /** The desired filename for the asset (e.g. `\"hero.png\"`). */\n  short_filename: string;\n} & Partial<Omit<SignSharedAssetQuery, \"filename\">>;\n\n/** Input for `create()`. Combines upload fields with writable metadata. */\nexport type SharedAssetCreate = AssetUpdate & SharedAssetUploadRequest;\n\nexport type SharedAssetListQuery = NonNullable<ListSpaceSharedAssetsData[\"query\"]>;\n\n/**\n * Return shape of `list()`.\n *\n * The list endpoint serializes rows with MAPI's `IndexAsset` serializer, which\n * is NOT identical to the `ShowAsset` (= `Asset`) shape returned by `get()`.\n * As in `ListAssetsResult` (see `./assets`), list rows are deliberately\n * surfaced as `Asset` so consumers work against a single asset type.\n */\nexport type SharedAssetListResponse = Omit<ListSpaceSharedAssetsResponses[200], \"assets\"> & {\n  assets: Array<Asset>;\n};\n\n/**\n * Shared (organization-level) assets. The active space must have read\n * (list/get) or write (create/update/delete) access to the library.\n */\nexport function createSharedAssetsResource<DefaultThrowOnError extends boolean = false>(\n  deps: MapiResourceDeps<DefaultThrowOnError>,\n) {\n  const { client, spaceId, wrapRequest } = deps;\n  const getSpaceId = (path?: SpaceIdPathOverride[\"path\"]) => resolveSpaceId(spaceId, path);\n  const kyOpts = (fetchOptions?: FetchOptions) =>\n    fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n  const maybeThrow = (throwOnError?: boolean) =>\n    throwOnError === undefined ? {} : { throwOnError };\n  /** Narrows a widened sign query back to the generated (stricter) query type. See `SignSharedAssetQuery`. */\n  const signQuery = (query: SignSharedAssetQuery) => query as CreateSpaceSharedAssetData[\"query\"];\n\n  return {\n    list<ThrowOnError extends boolean = false>(\n      options: {\n        query?: SharedAssetListQuery;\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): Promise<ApiResponse<SharedAssetListResponse, ThrowOnError>> {\n      const { query, signal, path, throwOnError, fetchOptions } = options;\n      return wrapRequest<SharedAssetListResponse, ThrowOnError>(\n        () =>\n          mapi.listSpaceSharedAssets({\n            client,\n            path: { space_id: getSpaceId(path) },\n            query: query && { ...query },\n            signal,\n            ...maybeThrow(throwOnError),\n            ...kyOpts(fetchOptions),\n          }),\n        throwOnError,\n      );\n    },\n    get<ThrowOnError extends boolean = false>(\n      assetId: number,\n      options: {\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): Promise<ApiResponse<Asset, ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      return wrapRequest<Asset, ThrowOnError>(\n        () =>\n          mapi.getSpaceSharedAsset({\n            client,\n            path: { space_id: getSpaceId(path), id: assetId },\n            signal,\n            ...maybeThrow(throwOnError),\n            ...kyOpts(fetchOptions),\n          }),\n        throwOnError,\n      );\n    },\n    /** Uploads a file to a shared library (sign → S3 → finish_upload → get). */\n    async upload(\n      options: {\n        body: SharedAssetUploadRequest;\n        file: Blob | ArrayBuffer;\n        signal?: AbortSignal;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride,\n    ): Promise<Asset> {\n      const { body, file, signal, path, fetchOptions } = options;\n      const { short_filename, ...rest } = body;\n      const resolvedSpaceId = getSpaceId(path);\n      const opts = kyOpts(fetchOptions);\n\n      const signResult = await wrapRequest<CreateSpaceSharedAssetResponses[200], true>(\n        () =>\n          mapi.createSpaceSharedAsset({\n            client,\n            path: { space_id: resolvedSpaceId },\n            query: signQuery({ filename: short_filename, ...rest }),\n            signal,\n            throwOnError: true,\n            ...opts,\n          }),\n        true,\n      );\n      if (!signResult.data.id) {\n        throw new Error(\"Invalid signed response: missing id\");\n      }\n      const assetId = signResult.data.id;\n\n      await uploadToS3(signResult.data, file, short_filename);\n\n      await wrapRequest<unknown, true>(\n        () =>\n          mapi.finishSpaceSharedAssetUpload({\n            client,\n            path: { space_id: resolvedSpaceId, id: assetId },\n            signal,\n            throwOnError: true,\n            ...opts,\n          }),\n        true,\n      );\n\n      const getResult = await wrapRequest<Asset, true>(\n        () =>\n          mapi.getSpaceSharedAsset({\n            client,\n            path: { space_id: resolvedSpaceId, id: assetId },\n            signal,\n            throwOnError: true,\n            ...opts,\n          }),\n        true,\n      );\n      return getResult.data;\n    },\n    /** Creates a shared asset (upload + metadata). Returns the resulting `Asset`. */\n    async create(\n      options: {\n        body: SharedAssetCreate;\n        file: Blob | ArrayBuffer;\n        signal?: AbortSignal;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride,\n    ): Promise<Asset> {\n      const { body, file, signal, path, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      const opts = kyOpts(fetchOptions);\n\n      const asset = await this.upload({\n        body: {\n          short_filename: body.short_filename,\n          asset_folder_id: body.asset_folder_id,\n          is_private: body.is_private,\n        },\n        file,\n        signal,\n        path: { space_id: resolvedSpaceId },\n        fetchOptions,\n      });\n\n      const { short_filename, asset_folder_id, is_private, size, validate_upload, ...metadata } =\n        body;\n      const hasMetadata = Object.values(metadata).some((v) => v !== undefined && v !== null);\n      if (hasMetadata) {\n        await wrapRequest<void, true>(\n          () =>\n            mapi.updateSpaceSharedAsset({\n              client,\n              path: { space_id: resolvedSpaceId, id: asset.id },\n              body: { asset: { ...metadata, asset_folder_id } },\n              signal,\n              throwOnError: true,\n              ...opts,\n            }),\n          true,\n        );\n        const updated = await wrapRequest<Asset, true>(\n          () =>\n            mapi.getSpaceSharedAsset({\n              client,\n              path: { space_id: resolvedSpaceId, id: asset.id },\n              signal,\n              throwOnError: true,\n              ...opts,\n            }),\n          true,\n        );\n        return updated.data;\n      }\n      return asset;\n    },\n    /** Updates a shared asset's metadata, optionally replacing the file. */\n    async update(\n      assetId: number,\n      options: (\n        | { body: { asset: AssetUpdate }; file?: undefined }\n        | { body: { asset: AssetUpdate; short_filename: string }; file: Blob | ArrayBuffer }\n      ) & { signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n    ): Promise<void> {\n      const { body, file, signal, path, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      const opts = kyOpts(fetchOptions);\n\n      if (file !== undefined) {\n        const { short_filename, ...assetBody } = body as {\n          short_filename: string;\n          asset: AssetUpdate;\n        };\n        const signResult = await wrapRequest<CreateSpaceSharedAssetResponses[200], true>(\n          () =>\n            mapi.createSpaceSharedAsset({\n              client,\n              path: { space_id: resolvedSpaceId },\n              query: signQuery({ filename: short_filename, id: assetId }),\n              signal,\n              throwOnError: true,\n              ...opts,\n            }),\n          true,\n        );\n        if (!signResult.data.id) {\n          throw new Error(\"Invalid signed response: missing id\");\n        }\n        await uploadToS3(signResult.data, file, short_filename);\n        await wrapRequest<unknown, true>(\n          () =>\n            mapi.finishSpaceSharedAssetUpload({\n              client,\n              path: { space_id: resolvedSpaceId, id: signResult.data.id },\n              signal,\n              throwOnError: true,\n              ...opts,\n            }),\n          true,\n        );\n        if (assetBody.asset && Object.keys(assetBody.asset).length > 0) {\n          await wrapRequest<void, true>(\n            () =>\n              mapi.updateSpaceSharedAsset({\n                client,\n                path: { space_id: resolvedSpaceId, id: assetId },\n                body: assetBody,\n                signal,\n                throwOnError: true,\n                ...opts,\n              }),\n            true,\n          );\n        }\n      } else {\n        await wrapRequest<void, true>(\n          () =>\n            mapi.updateSpaceSharedAsset({\n              client,\n              path: { space_id: resolvedSpaceId, id: assetId },\n              body,\n              signal,\n              throwOnError: true,\n              ...opts,\n            }),\n          true,\n        );\n      }\n    },\n    delete<ThrowOnError extends boolean = false>(\n      assetId: number,\n      options: {\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): Promise<ApiResponse<Asset, ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      return wrapRequest<Asset, ThrowOnError>(\n        () =>\n          mapi.deleteSpaceSharedAsset({\n            client,\n            path: { space_id: getSpaceId(path), id: assetId },\n            signal,\n            ...maybeThrow(throwOnError),\n            ...kyOpts(fetchOptions),\n          }),\n        throwOnError,\n      );\n    },\n  };\n}\n"],"mappings":"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"}