{"version":3,"file":"assets.cjs","names":["ClientError","resolveSpaceId"],"sources":["../../src/resources/assets.ts"],"sourcesContent":["import * as mapi from '../generated/mapi/sdk.gen';\nimport type {\n  BulkDestroyAssetsData,\n  BulkDestroyAssetsResponses,\n  BulkRestoreAssetsData,\n  BulkRestoreAssetsResponses,\n  BulkUpdateAssetsData,\n  BulkUpdateAssetsResponses,\n  ConvertAssetToSharedAssetData,\n  CreateAssetData,\n  CreateAssetResponses,\n  DeleteAssetResponses,\n  FinishAssetUploadResponses,\n  GetAssetResponses,\n  ListAssetsData,\n  ListAssetsResponses,\n  UpdateAssetData,\n  UpdateAssetResponses,\n} from '../generated/mapi/types.gen';\nimport type { Asset } from '../generated/mapi/types-aliased.gen';\nimport type { ApiResponse, FetchOptions, MapiResourceDeps } from '../client';\nimport { ClientError } from '../error';\nimport { resolveSpaceId, type SpaceIdPathOverride } from './shared';\n\nexport type AssetListQuery = NonNullable<ListAssetsData['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 * `IndexAsset` omits `file` and `permanently_deleted`. We deliberately surface\n * list rows as `Asset` so consumers work against a single asset type. The lie:\n * `file`/`permanently_deleted` are absent on list rows at runtime — consumers\n * needing those must re-fetch via `get()`.\n */\nexport type ListAssetsResult = Omit<ListAssetsResponses[200], 'assets'> & { assets: Array<Asset> };\n\n/**\n * Fields for initiating an asset upload. Pass this to `upload()` or `create()`\n * alongside a file buffer.\n */\nexport type AssetUploadRequest = {\n  /** The desired filename for the asset (e.g. `\"hero.png\"`). */\n  short_filename: string;\n} & Partial<Omit<NonNullable<CreateAssetData['query']>, 'filename'>>;\n\n/**\n * Input for `create()`. Combines upload fields with writable metadata.\n */\nexport type AssetCreate = AssetUploadRequest & NonNullable<UpdateAssetData['body']['asset']>;\n\n/** Uploads the file to S3 using the signed fields from step 1. */\nexport async function uploadToS3(\n  signedResponse: { post_url?: string; fields?: Record<string, unknown> },\n  file: Blob | ArrayBuffer,\n  filename: string,\n): Promise<void> {\n  if (!signedResponse.post_url || !signedResponse.fields) {\n    throw new ClientError('Invalid signed response: missing post_url or fields', {\n      status: 0,\n      statusText: 'Invalid signed response',\n      data: signedResponse,\n    });\n  }\n  const formData = new FormData();\n  for (const [key, value] of Object.entries(signedResponse.fields)) {\n    formData.append(key, value as string);\n  }\n  const contentType = (signedResponse.fields['Content-Type'] as string | undefined) ?? 'application/octet-stream';\n  const blob = file instanceof Blob ? file : new Blob([file], { type: contentType });\n  formData.append('file', new File([blob], filename, { type: contentType }));\n  const response = await fetch(signedResponse.post_url, { method: 'POST', body: formData });\n  if (!response.ok) {\n    throw new ClientError(`Failed to upload asset to S3: ${response.statusText}`, {\n      status: response.status,\n      statusText: response.statusText,\n      data: undefined,\n    });\n  }\n}\n\nconst hasDefinedFields = (value: Record<string, unknown> | undefined): boolean =>\n  Object.values(value ?? {}).some(v => v !== undefined && v !== null);\n\nexport function createAssetsResource<DefaultThrowOnError extends boolean = false>(deps: MapiResourceDeps<DefaultThrowOnError>) {\n  const { client, spaceId, wrapRequest } = deps;\n  const getSpaceId = (path?: SpaceIdPathOverride['path']) => resolveSpaceId(spaceId, path);\n\n  return {\n    list<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query?: ListAssetsData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<ListAssetsResult, ThrowOnError>> {\n      const { query, signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      // `listAssets` returns `IndexAsset` rows; we present them as `Asset` (see `ListAssetsResult`).\n      return wrapRequest<ListAssetsResult, ThrowOnError>(() =>\n        mapi.listAssets({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    /**\n     * Step 1 of the upload flow: requests a signed S3 upload object from MAPI.\n     * Returns the S3 `post_url` and form `fields` needed for the actual upload.\n     *\n     * In most cases, prefer `upload()` or `create()` which handle all three\n     * steps automatically.\n     */\n    signResponseObject<ThrowOnError extends boolean = DefaultThrowOnError>(options: { query: CreateAssetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<CreateAssetResponses[200], ThrowOnError>> {\n      const { query, signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<CreateAssetResponses[200], ThrowOnError>(() =>\n        mapi.createAsset({ client, path: { space_id: resolvedSpaceId }, query, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    /**\n     * Uploads a file to Storyblok (sign → S3 upload → finish) and returns the\n     * resulting `Asset`.\n     */\n    async upload(options: { body: AssetUploadRequest; 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 kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n      const signResult = await wrapRequest<CreateAssetResponses[200], true>(() =>\n        mapi.createAsset({ client, path: { space_id: resolvedSpaceId }, query: { filename: short_filename, ...rest }, signal, throwOnError: true, ...kyOpts }), true);\n\n      if (!signResult.data.id) {\n        throw new Error('Invalid signed response: missing id');\n      }\n\n      await uploadToS3(signResult.data, file, short_filename);\n\n      await wrapRequest<FinishAssetUploadResponses[200], true>(() =>\n        mapi.finishAssetUpload({\n          client,\n          path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n          signal,\n          throwOnError: true,\n          ...kyOpts,\n        }), true);\n\n      const getResult = await wrapRequest<GetAssetResponses[200], true>(() =>\n        mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) }, signal, throwOnError: true, ...kyOpts }), true);\n\n      return getResult.data;\n    },\n    /**\n     * Creates a new asset with metadata. Performs the full upload flow then\n     * applies any provided metadata in a follow-up update call.\n     */\n    async create(options: { body: AssetCreate; 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 kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n      const { short_filename, asset_folder_id, is_private, size, validate_upload, ext_id, ...metadataOnly } = body;\n      const asset = await this.upload({\n        body: { short_filename, asset_folder_id, is_private, size, validate_upload, ext_id },\n        file,\n        signal,\n        path: { space_id: resolvedSpaceId },\n        fetchOptions,\n      });\n\n      const hasMetadata = Object.values(metadataOnly).some(v => v !== undefined && v !== null);\n      if (hasMetadata) {\n        await wrapRequest<UpdateAssetResponses[204], true>(() =>\n          mapi.updateAsset({\n            client,\n            path: { space_id: resolvedSpaceId, id: asset.id! },\n            body: { asset: metadataOnly },\n            signal,\n            throwOnError: true,\n            ...kyOpts,\n          }), true);\n        const updatedResult = await wrapRequest<GetAssetResponses[200], true>(() =>\n          mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: asset.id! }, signal, throwOnError: true, ...kyOpts }), true);\n        return updatedResult.data;\n      }\n\n      return asset;\n    },\n    get<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<GetAssetResponses[200], ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<GetAssetResponses[200], ThrowOnError>(() =>\n        mapi.getAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    /**\n     * Updates an asset's metadata. When `file` and `body.short_filename` are\n     * provided, the file is replaced first (sign → S3 → finish), then metadata\n     * is updated.\n     */\n    async update(\n      assetId: number,\n      options: (\n        | { body: UpdateAssetData['body']; file?: undefined }\n        | { body: UpdateAssetData['body'] & { 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 kyOpts = fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {};\n\n      if (file !== undefined) {\n        const { short_filename, ...assetBody } = body;\n        const signResult = await wrapRequest<CreateAssetResponses[200], true>(() =>\n          mapi.createAsset({\n            client,\n            path: { space_id: resolvedSpaceId },\n            query: { filename: short_filename },\n            signal,\n            throwOnError: true,\n            ...kyOpts,\n          }), true);\n\n        if (!signResult.data.id) {\n          throw new Error('Invalid signed response: missing id');\n        }\n\n        await uploadToS3(signResult.data, file, short_filename);\n\n        await wrapRequest<FinishAssetUploadResponses[200], true>(() =>\n          mapi.finishAssetUpload({\n            client,\n            path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n            signal,\n            throwOnError: true,\n            ...kyOpts,\n          }), true);\n\n        if (hasDefinedFields(assetBody.asset)) {\n          await wrapRequest<UpdateAssetResponses[204], true>(() =>\n            mapi.updateAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body: assetBody, signal, throwOnError: true, ...kyOpts }), true);\n        }\n      }\n      else {\n        await wrapRequest<UpdateAssetResponses[204], true>(() =>\n          mapi.updateAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, body, signal, throwOnError: true, ...kyOpts }), true);\n      }\n    },\n    delete<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<DeleteAssetResponses[200], ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<DeleteAssetResponses[200], ThrowOnError>(() =>\n        mapi.deleteAsset({ client, path: { space_id: resolvedSpaceId, id: assetId }, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    finalize<ThrowOnError extends boolean = DefaultThrowOnError>(assetId: number, options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride = {}): Promise<ApiResponse<FinishAssetUploadResponses[200], ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<FinishAssetUploadResponses[200], ThrowOnError>(() =>\n        mapi.finishAssetUpload({\n          client,\n          path: { space_id: resolvedSpaceId, id: assetId },\n          signal,\n          ...(throwOnError === undefined ? {} : { throwOnError }),\n          ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n        }), throwOnError);\n    },\n    /** POST /assets/bulk_destroy: hard-delete many assets in one call. */\n    deleteMany<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkDestroyAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkDestroyAssetsResponses[200], ThrowOnError>> {\n      const { body, signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<BulkDestroyAssetsResponses[200], ThrowOnError>(() =>\n        mapi.bulkDestroyAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    /** POST /assets/bulk_update: move many assets between folders in one call. */\n    bulkMove<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkUpdateAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkUpdateAssetsResponses[200], ThrowOnError>> {\n      const { body, signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<BulkUpdateAssetsResponses[200], ThrowOnError>(() =>\n        mapi.bulkUpdateAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    bulkRestore<ThrowOnError extends boolean = DefaultThrowOnError>(options: { body: BulkRestoreAssetsData['body']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride): Promise<ApiResponse<BulkRestoreAssetsResponses[200], ThrowOnError>> {\n      const { body, signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<BulkRestoreAssetsResponses[200], ThrowOnError>(() =>\n        mapi.bulkRestoreAssets({ client, path: { space_id: resolvedSpaceId }, body, signal, ...(throwOnError === undefined ? {} : { throwOnError }), ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}) }), throwOnError);\n    },\n    /**\n     * Converts a space-local asset into a shared (org-level) asset.\n     *\n     * Moves the asset into the shared asset folder given by the required\n     * `target_asset_folder_id` query param; takes no request body. One-way\n     * only: a shared asset cannot be converted back to a space-local one.\n     *\n     * Not idempotent. Converting clears the asset's `space_id`, so a second\n     * call for the same id fails with 404 — the asset is no longer reachable\n     * through this space-scoped endpoint. Use `sharedAssets.get()` afterwards.\n     *\n     * The result is typed as `Asset` — the same shape `get()` returns — so\n     * consumers work against a single asset type across this resource.\n     */\n    convertToShared<ThrowOnError extends boolean = false>(\n      assetId: number,\n      options: { query: ConvertAssetToSharedAssetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } & SpaceIdPathOverride,\n    ): Promise<ApiResponse<Asset, ThrowOnError>> {\n      const { query, signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<Asset, ThrowOnError>(() =>\n        mapi.convertAssetToSharedAsset({\n          client,\n          path: { space_id: resolvedSpaceId, id: assetId },\n          query,\n          signal,\n          ...(throwOnError === undefined ? {} : { throwOnError }),\n          ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n        }), throwOnError);\n    },\n  };\n}\n"],"mappings":"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"}