{"version":3,"file":"shared-assets.mjs","names":["mapi.listSpaceSharedAssets","mapi.getSpaceSharedAsset","mapi.createSpaceSharedAsset","mapi.finishSpaceSharedAssetUpload","mapi.updateSpaceSharedAsset","mapi.deleteSpaceSharedAsset"],"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'> & { assets: Array<Asset> };\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>(deps: MapiResourceDeps<DefaultThrowOnError>) {\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) => (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>(options: { query?: SharedAssetListQuery; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<SharedAssetListResponse, ThrowOnError>> {\n      const { query, signal, path, throwOnError, fetchOptions } = options;\n      return wrapRequest<SharedAssetListResponse, ThrowOnError>(() =>\n        mapi.listSpaceSharedAssets({ client, path: { space_id: getSpaceId(path) }, query: query && { ...query }, signal, ...maybeThrow(throwOnError), ...kyOpts(fetchOptions) }), throwOnError);\n    },\n    get<ThrowOnError extends boolean = false>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<Asset, ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      return wrapRequest<Asset, ThrowOnError>(() =>\n        mapi.getSpaceSharedAsset({ client, path: { space_id: getSpaceId(path), id: assetId }, signal, ...maybeThrow(throwOnError), ...kyOpts(fetchOptions) }), throwOnError);\n    },\n    /** Uploads a file to a shared library (sign → S3 → finish_upload → get). */\n    async upload(options: { body: SharedAssetUploadRequest; file: Blob | ArrayBuffer; signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): 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        mapi.createSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId }, query: signQuery({ filename: short_filename, ...rest }), signal, throwOnError: true, ...opts }), true);\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        mapi.finishSpaceSharedAssetUpload({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, throwOnError: true, ...opts }), true);\n\n      const getResult = await wrapRequest<Asset, true>(() =>\n        mapi.getSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, throwOnError: true, ...opts }), true);\n      return getResult.data;\n    },\n    /** Creates a shared asset (upload + metadata). Returns the resulting `Asset`. */\n    async create(options: { body: SharedAssetCreate; file: Blob | ArrayBuffer; signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): 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: { short_filename: body.short_filename, asset_folder_id: body.asset_folder_id, is_private: body.is_private },\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 } = body;\n      const hasMetadata = Object.values(metadata).some(v => v !== undefined && v !== null);\n      if (hasMetadata) {\n        await wrapRequest<void, true>(() =>\n          mapi.updateSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId, id: asset.id }, body: { asset: { ...metadata, asset_folder_id } }, signal, throwOnError: true, ...opts }), true);\n        const updated = await wrapRequest<Asset, true>(() =>\n          mapi.getSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId, id: asset.id }, signal, throwOnError: true, ...opts }), true);\n        return updated.data;\n      }\n      return asset;\n    },\n    /** Updates a shared asset's metadata, optionally replacing the file. */\n    async update(assetId: number, options: ({ body: { asset: AssetUpdate }; file?: undefined } | { body: { asset: AssetUpdate; short_filename: string }; file: Blob | ArrayBuffer }) & { signal?: AbortSignal; fetchOptions?: FetchOptions } & SpaceIdPathOverride): 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 { short_filename: string; asset: AssetUpdate };\n        const signResult = await wrapRequest<CreateSpaceSharedAssetResponses[200], true>(() =>\n          mapi.createSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId }, query: signQuery({ filename: short_filename, id: assetId }), signal, throwOnError: true, ...opts }), true);\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          mapi.finishSpaceSharedAssetUpload({ client, path: { space_id: resolvedSpaceId, id: signResult.data.id }, signal, throwOnError: true, ...opts }), true);\n        if (assetBody.asset && Object.keys(assetBody.asset).length > 0) {\n          await wrapRequest<void, true>(() =>\n            mapi.updateSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body: assetBody, signal, throwOnError: true, ...opts }), true);\n        }\n      }\n      else {\n        await wrapRequest<void, true>(() =>\n          mapi.updateSpaceSharedAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body, signal, throwOnError: true, ...opts }), true);\n      }\n    },\n    delete<ThrowOnError extends boolean = false>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<Asset, ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      return wrapRequest<Asset, ThrowOnError>(() =>\n        mapi.deleteSpaceSharedAsset({ client, path: { space_id: getSpaceId(path), id: assetId }, signal, ...maybeThrow(throwOnError), ...kyOpts(fetchOptions) }), throwOnError);\n    },\n  };\n}\n"],"mappings":"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"}