{"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 =\n    (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>(\n  deps: MapiResourceDeps<DefaultThrowOnError>,\n) {\n  const { client, spaceId, wrapRequest } = deps;\n  const getSpaceId = (path?: SpaceIdPathOverride[\"path\"]) => resolveSpaceId(spaceId, path);\n\n  return {\n    list<ThrowOnError extends boolean = DefaultThrowOnError>(\n      options: {\n        query?: ListAssetsData[\"query\"];\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): 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        () =>\n          mapi.listAssets({\n            client,\n            path: { space_id: resolvedSpaceId },\n            query,\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\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>(\n      options: {\n        query: CreateAssetData[\"query\"];\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride,\n    ): 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        () =>\n          mapi.createAsset({\n            client,\n            path: { space_id: resolvedSpaceId },\n            query,\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\n    },\n    /**\n     * Uploads a file to Storyblok (sign → S3 upload → finish) and returns the\n     * resulting `Asset`.\n     */\n    async upload(\n      options: {\n        body: AssetUploadRequest;\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 kyOpts = fetchOptions\n        ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n        : {};\n\n      const signResult = await wrapRequest<CreateAssetResponses[200], true>(\n        () =>\n          mapi.createAsset({\n            client,\n            path: { space_id: resolvedSpaceId },\n            query: { filename: short_filename, ...rest },\n            signal,\n            throwOnError: true,\n            ...kyOpts,\n          }),\n        true,\n      );\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        () =>\n          mapi.finishAssetUpload({\n            client,\n            path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n            signal,\n            throwOnError: true,\n            ...kyOpts,\n          }),\n        true,\n      );\n\n      const getResult = await wrapRequest<GetAssetResponses[200], true>(\n        () =>\n          mapi.getAsset({\n            client,\n            path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n            signal,\n            throwOnError: true,\n            ...kyOpts,\n          }),\n        true,\n      );\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(\n      options: {\n        body: AssetCreate;\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 kyOpts = fetchOptions\n        ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n        : {};\n\n      const {\n        short_filename,\n        asset_folder_id,\n        is_private,\n        size,\n        validate_upload,\n        ext_id,\n        ...metadataOnly\n      } = 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          () =>\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            }),\n          true,\n        );\n        const updatedResult = await wrapRequest<GetAssetResponses[200], true>(\n          () =>\n            mapi.getAsset({\n              client,\n              path: { space_id: resolvedSpaceId, id: asset.id! },\n              signal,\n              throwOnError: true,\n              ...kyOpts,\n            }),\n          true,\n        );\n        return updatedResult.data;\n      }\n\n      return asset;\n    },\n    get<ThrowOnError extends boolean = DefaultThrowOnError>(\n      assetId: number,\n      options: {\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): Promise<ApiResponse<GetAssetResponses[200], ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<GetAssetResponses[200], ThrowOnError>(\n        () =>\n          mapi.getAsset({\n            client,\n            path: { space_id: resolvedSpaceId, id: assetId },\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\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\n        ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n        : {};\n\n      if (file !== undefined) {\n        const { short_filename, ...assetBody } = body;\n        const signResult = await wrapRequest<CreateAssetResponses[200], true>(\n          () =>\n            mapi.createAsset({\n              client,\n              path: { space_id: resolvedSpaceId },\n              query: { filename: short_filename },\n              signal,\n              throwOnError: true,\n              ...kyOpts,\n            }),\n          true,\n        );\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          () =>\n            mapi.finishAssetUpload({\n              client,\n              path: { space_id: resolvedSpaceId, id: Number(signResult.data.id) },\n              signal,\n              throwOnError: true,\n              ...kyOpts,\n            }),\n          true,\n        );\n\n        if (hasDefinedFields(assetBody.asset)) {\n          await wrapRequest<UpdateAssetResponses[204], true>(\n            () =>\n              mapi.updateAsset({\n                client,\n                path: { space_id: resolvedSpaceId, id: assetId },\n                body: assetBody,\n                signal,\n                throwOnError: true,\n                ...kyOpts,\n              }),\n            true,\n          );\n        }\n      } else {\n        await wrapRequest<UpdateAssetResponses[204], true>(\n          () =>\n            mapi.updateAsset({\n              client,\n              path: { space_id: resolvedSpaceId, id: assetId },\n              body,\n              signal,\n              throwOnError: true,\n              ...kyOpts,\n            }),\n          true,\n        );\n      }\n    },\n    delete<ThrowOnError extends boolean = DefaultThrowOnError>(\n      assetId: number,\n      options: {\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): Promise<ApiResponse<DeleteAssetResponses[200], ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<DeleteAssetResponses[200], ThrowOnError>(\n        () =>\n          mapi.deleteAsset({\n            client,\n            path: { space_id: resolvedSpaceId, id: assetId },\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\n    },\n    finalize<ThrowOnError extends boolean = DefaultThrowOnError>(\n      assetId: number,\n      options: {\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride = {},\n    ): Promise<ApiResponse<FinishAssetUploadResponses[200], ThrowOnError>> {\n      const { signal, path, throwOnError, fetchOptions } = options;\n      const resolvedSpaceId = getSpaceId(path);\n      return wrapRequest<FinishAssetUploadResponses[200], ThrowOnError>(\n        () =>\n          mapi.finishAssetUpload({\n            client,\n            path: { space_id: resolvedSpaceId, id: assetId },\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\n    },\n    /** POST /assets/bulk_destroy: hard-delete many assets in one call. */\n    deleteMany<ThrowOnError extends boolean = DefaultThrowOnError>(\n      options: {\n        body: BulkDestroyAssetsData[\"body\"];\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride,\n    ): 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        () =>\n          mapi.bulkDestroyAssets({\n            client,\n            path: { space_id: resolvedSpaceId },\n            body,\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\n    },\n    /** POST /assets/bulk_update: move many assets between folders in one call. */\n    bulkMove<ThrowOnError extends boolean = DefaultThrowOnError>(\n      options: {\n        body: BulkUpdateAssetsData[\"body\"];\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride,\n    ): 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        () =>\n          mapi.bulkUpdateAssets({\n            client,\n            path: { space_id: resolvedSpaceId },\n            body,\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\n    },\n    bulkRestore<ThrowOnError extends boolean = DefaultThrowOnError>(\n      options: {\n        body: BulkRestoreAssetsData[\"body\"];\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & SpaceIdPathOverride,\n    ): 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        () =>\n          mapi.bulkRestoreAssets({\n            client,\n            path: { space_id: resolvedSpaceId },\n            body,\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\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: {\n        query: ConvertAssetToSharedAssetData[\"query\"];\n        signal?: AbortSignal;\n        throwOnError?: ThrowOnError;\n        fetchOptions?: FetchOptions;\n      } & 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        () =>\n          mapi.convertAssetToSharedAsset({\n            client,\n            path: { space_id: resolvedSpaceId, id: assetId },\n            query,\n            signal,\n            ...(throwOnError === undefined ? {} : { throwOnError }),\n            ...(fetchOptions\n              ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } }\n              : {}),\n          }),\n        throwOnError,\n      );\n    },\n  };\n}\n"],"mappings":"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"}